agentworkshop 0.7.34 → 0.7.38

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (985) hide show
  1. package/.output/.AgentWorkShop/aml-python/aml_eval.py +171 -0
  2. package/.output/.AgentWorkShop/aml-python/amlkit.py +120 -0
  3. package/.output/.AgentWorkShop/aml-python/requirements.txt +7 -0
  4. package/.output/.AgentWorkShop/aml-python/train-example.py +92 -0
  5. package/.output/.AgentWorkShop/schema.json +2 -1
  6. package/.output/nitro.json +1 -1
  7. package/.output/public/_nuxt/{DLljr7g0.js → 45zuyAso.js} +1 -1
  8. package/.output/public/_nuxt/4sIEbgcl.js +42 -0
  9. package/.output/public/_nuxt/8NMOXZOV.js +1 -0
  10. package/.output/public/_nuxt/BCGafdXT.js +2 -0
  11. package/.output/public/_nuxt/BDNMzG2s2.js +1 -0
  12. package/.output/public/_nuxt/{C-mDhyEd.js → BDmh31hl.js} +1 -1
  13. package/.output/public/_nuxt/BFkgkW8u.js +4 -0
  14. package/.output/public/_nuxt/BG8sCcwx.js +14 -0
  15. package/.output/public/_nuxt/{D8CqF0yy.js → BHA40aHa.js} +1 -1
  16. package/.output/public/_nuxt/BJHKLJJU.js +1 -0
  17. package/.output/public/_nuxt/{DoTdlVVe2.js → BN6iuJEg2.js} +1 -1
  18. package/.output/public/_nuxt/BNT8gYU92.js +4 -0
  19. package/.output/public/_nuxt/BU83-NnX.js +106 -0
  20. package/.output/public/_nuxt/BYhEUx8t.js +17 -0
  21. package/.output/public/_nuxt/BzHEilTt.js +1 -0
  22. package/.output/public/_nuxt/{Ct-WOVr4.js → C3J6FYKa.js} +1 -1
  23. package/.output/public/_nuxt/C3gwHTz0.js +1 -0
  24. package/.output/public/_nuxt/C4DWUZ6d2.js +1 -0
  25. package/.output/public/_nuxt/C5gUkRwn.js +1 -0
  26. package/.output/public/_nuxt/CClOy-Hz2.js +1 -0
  27. package/.output/public/_nuxt/{CUXCQXjG.js → CM12FuB42.js} +1 -1
  28. package/.output/public/_nuxt/{BSCpFtzG.js → CSkxz2NX.js} +1 -1
  29. package/.output/public/_nuxt/CWoJjWmZ.js +1 -0
  30. package/.output/public/_nuxt/CY9LbPCI.js +1 -0
  31. package/.output/public/_nuxt/CYWVXZTS.js +7 -0
  32. package/.output/public/_nuxt/CZiw7sEV.js +1 -0
  33. package/.output/public/_nuxt/C_OLzD09.js +1 -0
  34. package/.output/public/_nuxt/C__m4EhR.js +1 -0
  35. package/.output/public/_nuxt/Cbq-mryP.js +1 -0
  36. package/.output/public/_nuxt/{C4OAdbVK2.js → Cc_9VzD42.js} +1 -1
  37. package/.output/public/_nuxt/{BASN8nZ0.js → CdPzkOMV.js} +1 -1
  38. package/.output/public/_nuxt/Cec0Ua3F.js +1 -0
  39. package/.output/public/_nuxt/{DYKVPzN-.js → CoNpEq5X.js} +1 -1
  40. package/.output/public/_nuxt/CojCTLKD.js +1 -0
  41. package/.output/public/_nuxt/{B7wL3pDk.js → Crod5z2f.js} +1 -1
  42. package/.output/public/_nuxt/CzlMDL5H.js +13 -0
  43. package/.output/public/_nuxt/{G0qIw7Gq2.js → D0ZBQrN_2.js} +1 -1
  44. package/.output/public/_nuxt/{Lp7Ll94I.js → D1YDxZpZ.js} +1 -1
  45. package/.output/public/_nuxt/{Bc0AmjfT.js → D20Yamr4.js} +1 -1
  46. package/.output/public/_nuxt/D6uzXueg.js +2 -0
  47. package/.output/public/_nuxt/D9Oidm5I.js +1 -0
  48. package/.output/public/_nuxt/DAe0h2MB.js +1 -0
  49. package/.output/public/_nuxt/DBHNsT1Y.js +23 -0
  50. package/.output/public/_nuxt/DDShH71m.js +1 -0
  51. package/.output/public/_nuxt/DDgJcSET.js +19 -0
  52. package/.output/public/_nuxt/DHFrCUxA2.js +13 -0
  53. package/.output/public/_nuxt/{BcrN7QEl2.js → DIaZ2PTo2.js} +1 -1
  54. package/.output/public/_nuxt/DPnwL14Y.js +1 -0
  55. package/.output/public/_nuxt/DR12_WCA.js +3 -0
  56. package/.output/public/_nuxt/{B9nXmjSB.js → DUrecWPx.js} +4 -4
  57. package/.output/public/_nuxt/DVsjtsvZ2.js +1 -0
  58. package/.output/public/_nuxt/DYr1VMiQ.js +6 -0
  59. package/.output/public/_nuxt/DZtm4l-P2.js +1 -0
  60. package/.output/public/_nuxt/DdD9mCHM.js +1 -0
  61. package/.output/public/_nuxt/DeJykBFf.js +9 -0
  62. package/.output/public/_nuxt/{DoMxCWN52.js → DeyBFhKH2.js} +1 -1
  63. package/.output/public/_nuxt/DkGQ7lnb2.js +1 -0
  64. package/.output/public/_nuxt/DmqknNvV.js +18 -0
  65. package/.output/public/_nuxt/DnUuIR83.js +1 -0
  66. package/.output/public/_nuxt/DrYV5i68.js +1 -0
  67. package/.output/public/_nuxt/{B5S_UyaC.js → DtYHUi5Z.js} +1 -1
  68. package/.output/public/_nuxt/Dz_Q3Lpw2.js +1 -0
  69. package/.output/public/_nuxt/DzbFpZRk.js +3 -0
  70. package/.output/public/_nuxt/HBLJ-wei.js +1 -0
  71. package/.output/public/_nuxt/JCoYF4IJ.js +31 -0
  72. package/.output/public/_nuxt/JTLM-kqr2.js +1 -0
  73. package/.output/public/_nuxt/{BeIfu4N3.js → KZQX7xoM.js} +2 -2
  74. package/.output/public/_nuxt/S_fVQwJK.js +1 -0
  75. package/.output/public/_nuxt/TownView.0oLiQgTC.css +1 -0
  76. package/.output/public/_nuxt/YnQxK3eG.js +1 -0
  77. package/.output/public/_nuxt/_id_.D-SYuyZb.css +1 -0
  78. package/.output/public/_nuxt/_id_.hma_BU6T.css +1 -0
  79. package/.output/public/_nuxt/_wsId_.B12v3PhY.css +1 -0
  80. package/.output/public/_nuxt/aLLjF2K-2.js +1 -0
  81. package/.output/public/_nuxt/aWWIh8YL.js +24 -0
  82. package/.output/public/_nuxt/ahgEJu2R.js +1 -0
  83. package/.output/public/_nuxt/aml.COEKNNqK.css +1 -0
  84. package/.output/public/_nuxt/builds/latest.json +1 -1
  85. package/.output/public/_nuxt/builds/meta/44b66249-54d0-4c8a-9057-9755a32329e2.json +1 -0
  86. package/.output/public/_nuxt/daq.B3265ZDn.css +1 -0
  87. package/.output/public/_nuxt/dcw.DLYZqEhT.css +1 -0
  88. package/.output/public/_nuxt/default.DE_vT238.css +1 -0
  89. package/.output/public/_nuxt/entry.BB-Eeh-J.css +1 -0
  90. package/.output/public/_nuxt/jZsY8yYz.js +1 -0
  91. package/.output/public/_nuxt/logs.CqFyMrJw.css +1 -0
  92. package/.output/public/_nuxt/pages.ooEzrMm9.css +1 -0
  93. package/.output/public/_nuxt/pdk8jLGT.js +1 -0
  94. package/.output/public/_nuxt/plugins.5e5chZ67.css +1 -0
  95. package/.output/public/_nuxt/pz2JDAM7.js +2 -0
  96. package/.output/public/_nuxt/settings.Dm3M0RLy.css +1 -0
  97. package/.output/public/_nuxt/town.DKIAhKnx.css +1 -0
  98. package/.output/public/_nuxt/users.CXnP2E08.css +1 -0
  99. package/.output/public/_nuxt/vRTjoWqd.js +1 -0
  100. package/.output/public/_nuxt/workshop.Jk5HxWPE.css +1 -0
  101. package/.output/public/_nuxt/zIGh7R49.js +75 -0
  102. package/.output/public/_nuxt/zq5t1vyX.js +1 -0
  103. package/.output/server/chunks/_/character-asset.repo.mjs +1 -1
  104. package/.output/server/chunks/_/entity.mjs +174 -0
  105. package/.output/server/chunks/_/entity.mjs.map +1 -0
  106. package/.output/server/chunks/_/env-manager.mjs +162 -0
  107. package/.output/server/chunks/_/env-manager.mjs.map +1 -0
  108. package/.output/server/chunks/_/host-bindings.mjs +1 -1
  109. package/.output/server/chunks/_/nitro.mjs +1657 -1162
  110. package/.output/server/chunks/_/nitro.mjs.map +1 -1
  111. package/.output/server/chunks/_/scene-layout.repo.mjs +1 -1
  112. package/.output/server/chunks/build/{TownView-BdHnAilw.mjs → TownView-jVazYOjN.mjs} +141 -141
  113. package/.output/server/chunks/build/{TownView-BdHnAilw.mjs.map → TownView-jVazYOjN.mjs.map} +1 -1
  114. package/.output/server/chunks/build/{_id_-Cb845FHR.mjs → _id_-CfVosNg3.mjs} +136 -136
  115. package/.output/server/chunks/build/{_id_-Cb845FHR.mjs.map → _id_-CfVosNg3.mjs.map} +1 -1
  116. package/.output/server/chunks/build/{_id_-fadFPl2i.mjs → _id_-Hwr4rZpr.mjs} +32 -32
  117. package/.output/server/chunks/build/{_id_-fadFPl2i.mjs.map → _id_-Hwr4rZpr.mjs.map} +1 -1
  118. package/.output/server/chunks/build/{_wsId_-CTZswnm5.mjs → _wsId_-BVg3bB77.mjs} +175 -165
  119. package/.output/server/chunks/build/{_wsId_-CTZswnm5.mjs.map → _wsId_-BVg3bB77.mjs.map} +1 -1
  120. package/.output/server/chunks/build/aml-BCSJCdX7.mjs +588 -0
  121. package/.output/server/chunks/build/aml-BCSJCdX7.mjs.map +1 -0
  122. package/.output/server/chunks/build/{daq-BvihjQyW.mjs → daq-C03Uu5UE.mjs} +108 -106
  123. package/.output/server/chunks/build/daq-C03Uu5UE.mjs.map +1 -0
  124. package/.output/server/chunks/build/{dcw-Ks2vJ4PF.mjs → dcw-6vEYVeje.mjs} +44 -44
  125. package/.output/server/chunks/build/{dcw-Ks2vJ4PF.mjs.map → dcw-6vEYVeje.mjs.map} +1 -1
  126. package/.output/server/chunks/build/{default-GgHt4O2R.mjs → default-hseyOqBT.mjs} +30 -27
  127. package/.output/server/chunks/build/{default-GgHt4O2R.mjs.map → default-hseyOqBT.mjs.map} +1 -1
  128. package/.output/server/chunks/build/{logs-CYBhkQwh.mjs → logs-B-xhuqln.mjs} +35 -35
  129. package/.output/server/chunks/build/{logs-CYBhkQwh.mjs.map → logs-B-xhuqln.mjs.map} +1 -1
  130. package/.output/server/chunks/build/{pages-C-6BRtv8.mjs → pages-BO7yZsXA.mjs} +18 -27
  131. package/.output/server/chunks/build/pages-BO7yZsXA.mjs.map +1 -0
  132. package/.output/server/chunks/build/{plugins-dZRegC7m.mjs → plugins-CUWmMdyt.mjs} +17 -17
  133. package/.output/server/chunks/build/{plugins-dZRegC7m.mjs.map → plugins-CUWmMdyt.mjs.map} +1 -1
  134. package/.output/server/chunks/build/{settings-CgDLkP3s.mjs → settings-DoQ2Oq3P.mjs} +43 -43
  135. package/.output/server/chunks/build/{settings-CgDLkP3s.mjs.map → settings-DoQ2Oq3P.mjs.map} +1 -1
  136. package/.output/server/chunks/build/{town-DJ-V5G9U.mjs → town-BOl6hs9B.mjs} +7 -7
  137. package/.output/server/chunks/build/{town-DJ-V5G9U.mjs.map → town-BOl6hs9B.mjs.map} +1 -1
  138. package/.output/server/chunks/build/useDaqStream-CIBaiGAl.mjs +1 -1
  139. package/.output/server/chunks/build/useDcwStream-CBbiYnWe.mjs +1 -1
  140. package/.output/server/chunks/build/{useWorkshopWs-CprkZEdq.mjs → useWorkshopWs-C_I7q9As.mjs} +110 -32
  141. package/.output/server/chunks/build/{useWorkshopWs-CprkZEdq.mjs.map → useWorkshopWs-C_I7q9As.mjs.map} +1 -1
  142. package/.output/server/chunks/build/{users-4nzxTjFT.mjs → users-fohSmF-J.mjs} +6 -6
  143. package/.output/server/chunks/build/{users-4nzxTjFT.mjs.map → users-fohSmF-J.mjs.map} +1 -1
  144. package/.output/server/chunks/build/{workshop-81xhz368.mjs → workshop-DX5-ldc4.mjs} +15 -15
  145. package/.output/server/chunks/build/{workshop-81xhz368.mjs.map → workshop-DX5-ldc4.mjs.map} +1 -1
  146. package/.output/server/chunks/routes/api/workshop/agent-tools/index.post.mjs +21 -8
  147. package/.output/server/chunks/routes/api/workshop/agent-tools/index.post.mjs.map +1 -1
  148. package/.output/server/chunks/routes/api/workshop/aml/datasets/_id/preview.get.mjs +1 -1
  149. package/.output/server/chunks/routes/api/workshop/aml/datasets/_id_.delete.mjs +58 -0
  150. package/.output/server/chunks/routes/api/workshop/aml/datasets/_id_.delete.mjs.map +1 -0
  151. package/.output/server/chunks/routes/api/workshop/aml/datasets/_id_.get.mjs +27 -6
  152. package/.output/server/chunks/routes/api/workshop/aml/datasets/_id_.get.mjs.map +1 -1
  153. package/.output/server/chunks/routes/api/workshop/aml/datasets/_id_.patch.mjs +49 -0
  154. package/.output/server/chunks/routes/api/workshop/aml/datasets/_id_.patch.mjs.map +1 -0
  155. package/.output/server/chunks/routes/api/workshop/aml/entities/prune.post.mjs +45 -0
  156. package/.output/server/chunks/routes/api/workshop/aml/entities/prune.post.mjs.map +1 -0
  157. package/.output/server/chunks/routes/api/workshop/aml/env/recheck.post.mjs +30 -0
  158. package/.output/server/chunks/routes/api/workshop/aml/env/recheck.post.mjs.map +1 -0
  159. package/.output/server/chunks/routes/api/workshop/aml/env/uv.post.mjs +40 -0
  160. package/.output/server/chunks/routes/api/workshop/aml/env/uv.post.mjs.map +1 -0
  161. package/.output/server/chunks/routes/api/workshop/aml/env/venv.post.mjs +42 -0
  162. package/.output/server/chunks/routes/api/workshop/aml/env/venv.post.mjs.map +1 -0
  163. package/.output/server/chunks/routes/api/workshop/aml/index.get.mjs +1 -1
  164. package/.output/server/chunks/routes/api/workshop/aml/index.post.mjs +1 -1
  165. package/.output/server/chunks/routes/api/workshop/aml/index2.get.mjs +4 -22
  166. package/.output/server/chunks/routes/api/workshop/aml/index2.get.mjs.map +1 -1
  167. package/.output/server/chunks/routes/api/workshop/aml/index2.post.mjs +1 -1
  168. package/.output/server/chunks/routes/api/workshop/aml/index3.get.mjs +4 -16
  169. package/.output/server/chunks/routes/api/workshop/aml/index3.get.mjs.map +1 -1
  170. package/.output/server/chunks/routes/api/workshop/aml/index4.get.mjs +19 -34
  171. package/.output/server/chunks/routes/api/workshop/aml/index4.get.mjs.map +1 -1
  172. package/.output/server/chunks/routes/api/workshop/aml/index5.get.mjs +41 -0
  173. package/.output/server/chunks/routes/api/workshop/aml/index5.get.mjs.map +1 -0
  174. package/.output/server/chunks/routes/api/workshop/aml/index6.get.mjs +62 -0
  175. package/.output/server/chunks/routes/api/workshop/aml/index6.get.mjs.map +1 -0
  176. package/.output/server/chunks/routes/api/workshop/aml/jobs/_id/cancel.post.mjs +1 -1
  177. package/.output/server/chunks/routes/api/workshop/aml/jobs/_id/logs.get.mjs +1 -1
  178. package/.output/server/chunks/routes/api/workshop/aml/jobs/_id/retry.post.mjs +1 -1
  179. package/.output/server/chunks/routes/api/workshop/aml/jobs/_id_.delete.mjs +63 -0
  180. package/.output/server/chunks/routes/api/workshop/aml/jobs/_id_.delete.mjs.map +1 -0
  181. package/.output/server/chunks/routes/api/workshop/aml/models/_id/predict.post.mjs +1 -1
  182. package/.output/server/chunks/routes/api/workshop/aml/models/_id/promote.post.mjs +1 -1
  183. package/.output/server/chunks/routes/api/workshop/aml/models/_id_.delete.mjs +54 -0
  184. package/.output/server/chunks/routes/api/workshop/aml/models/_id_.delete.mjs.map +1 -0
  185. package/.output/server/chunks/routes/api/workshop/aml/models/_id_.patch.mjs +46 -0
  186. package/.output/server/chunks/routes/api/workshop/aml/models/_id_.patch.mjs.map +1 -0
  187. package/.output/server/chunks/routes/api/workshop/assets/index.post.mjs +1 -1
  188. package/.output/server/chunks/routes/api/workshop/assets/index2.post.mjs +1 -1
  189. package/.output/server/chunks/routes/api/workshop/channel-templates/_id/instantiate.post.mjs +2 -2
  190. package/.output/server/chunks/routes/api/workshop/channels/_id/activate.post.mjs +1 -1
  191. package/.output/server/chunks/routes/api/workshop/channels/_id/index.post.mjs +1 -1
  192. package/.output/server/chunks/routes/api/workshop/channels/_id/index.put.mjs +1 -1
  193. package/.output/server/chunks/routes/api/workshop/channels/_id/index4.get.mjs +1 -1
  194. package/.output/server/chunks/routes/api/workshop/channels/_id/terminals.get.mjs +1 -1
  195. package/.output/server/chunks/routes/api/workshop/channels/index.get.mjs +1 -1
  196. package/.output/server/chunks/routes/api/workshop/channels.post.mjs +4 -4
  197. package/.output/server/chunks/routes/api/workshop/daq/_id/bind.post.mjs +1 -1
  198. package/.output/server/chunks/routes/api/workshop/daq/_id/bindings.put.mjs +1 -1
  199. package/.output/server/chunks/routes/api/workshop/daq/_id/samples.get.mjs +1 -1
  200. package/.output/server/chunks/routes/api/workshop/daq/_id/test.post.mjs +1 -1
  201. package/.output/server/chunks/routes/api/workshop/daq/_id_.delete.mjs +1 -1
  202. package/.output/server/chunks/routes/api/workshop/daq/_id_.patch.mjs +1 -1
  203. package/.output/server/chunks/routes/api/workshop/daq/controller.post.mjs +1 -1
  204. package/.output/server/chunks/routes/api/workshop/daq/index.post.mjs +1 -1
  205. package/.output/server/chunks/routes/api/workshop/daq/infra/reconnect.post.mjs +1 -1
  206. package/.output/server/chunks/routes/api/workshop/daq/infra.get.mjs +1 -1
  207. package/.output/server/chunks/routes/api/workshop/daq/templates/_key_.delete.mjs +1 -1
  208. package/.output/server/chunks/routes/api/workshop/daq/templates/_key_.patch.mjs +1 -1
  209. package/.output/server/chunks/routes/api/workshop/daq/test-driver.post.mjs +1 -1
  210. package/.output/server/chunks/routes/api/workshop/dcw/_id/bind.post.mjs +1 -1
  211. package/.output/server/chunks/routes/api/workshop/dcw/_id/bindings.put.mjs +1 -1
  212. package/.output/server/chunks/routes/api/workshop/dcw/_id/param-ledger.get.mjs +1 -1
  213. package/.output/server/chunks/routes/api/workshop/dcw/_id/read.post.mjs +1 -1
  214. package/.output/server/chunks/routes/api/workshop/dcw/_id/test.post.mjs +1 -1
  215. package/.output/server/chunks/routes/api/workshop/dcw/_id/write.post.mjs +1 -1
  216. package/.output/server/chunks/routes/api/workshop/dcw/_id_.delete.mjs +1 -1
  217. package/.output/server/chunks/routes/api/workshop/dcw/_id_.patch.mjs +1 -1
  218. package/.output/server/chunks/routes/api/workshop/dcw/controller.post.mjs +1 -1
  219. package/.output/server/chunks/routes/api/workshop/dcw/index.get.mjs +1 -1
  220. package/.output/server/chunks/routes/api/workshop/dcw/index.post.mjs +1 -1
  221. package/.output/server/chunks/routes/api/workshop/dcw/index2.get.mjs +1 -1
  222. package/.output/server/chunks/routes/api/workshop/dcw/index2.post.mjs +1 -1
  223. package/.output/server/chunks/routes/api/workshop/dcw/index3.get.mjs +1 -1
  224. package/.output/server/chunks/routes/api/workshop/dcw/index3.post.mjs +1 -1
  225. package/.output/server/chunks/routes/api/workshop/dcw/index4.get.mjs +1 -1
  226. package/.output/server/chunks/routes/api/workshop/dcw/index4.post.mjs +1 -1
  227. package/.output/server/chunks/routes/api/workshop/dcw/index5.get.mjs +1 -1
  228. package/.output/server/chunks/routes/api/workshop/dcw/journal/node/_nodeId/rollback.post.mjs +1 -1
  229. package/.output/server/chunks/routes/api/workshop/dcw/line/query.get.mjs +1 -1
  230. package/.output/server/chunks/routes/api/workshop/dcw/lines/_id/start.post.mjs +1 -1
  231. package/.output/server/chunks/routes/api/workshop/dcw/lines/_id/stop.post.mjs +1 -1
  232. package/.output/server/chunks/routes/api/workshop/dcw/lines/_id_.delete.mjs +1 -1
  233. package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id/judge.post.mjs +1 -1
  234. package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id/rollback.post.mjs +1 -1
  235. package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id/series.get.mjs +1 -1
  236. package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id_.get.mjs +1 -1
  237. package/.output/server/chunks/routes/api/workshop/dcw/products/_id_.delete.mjs +1 -1
  238. package/.output/server/chunks/routes/api/workshop/dcw/products/_id_.patch.mjs +1 -1
  239. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/apply.post.mjs +1 -1
  240. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/mark-good.post.mjs +1 -1
  241. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/rollback-good.post.mjs +1 -1
  242. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id_.delete.mjs +1 -1
  243. package/.output/server/chunks/routes/api/workshop/dcw/runs/_id/close.post.mjs +1 -1
  244. package/.output/server/chunks/routes/api/workshop/dcw/runs/_id/data.get.mjs +1 -1
  245. package/.output/server/chunks/routes/api/workshop/dcw/runs/_id/rollback.post.mjs +1 -1
  246. package/.output/server/chunks/routes/api/workshop/dcw/templates/_key_.delete.mjs +1 -1
  247. package/.output/server/chunks/routes/api/workshop/dcw/templates/_key_.patch.mjs +1 -1
  248. package/.output/server/chunks/routes/api/workshop/dcw/test-driver.post.mjs +1 -1
  249. package/.output/server/chunks/routes/api/workshop/device-twins/_id_.delete.mjs +1 -1
  250. package/.output/server/chunks/routes/api/workshop/device-twins/_id_.patch.mjs +1 -1
  251. package/.output/server/chunks/routes/api/workshop/harnesses/_id/providers.get.mjs +1 -1
  252. package/.output/server/chunks/routes/api/workshop/harnesses.get.mjs +1 -1
  253. package/.output/server/chunks/routes/api/workshop/hitl/pending.get.mjs +1 -1
  254. package/.output/server/chunks/routes/api/workshop/hitl/respond.post.mjs +1 -1
  255. package/.output/server/chunks/routes/api/workshop/index.put.mjs +1 -1
  256. package/.output/server/chunks/routes/api/workshop/index2.get.mjs +12 -1
  257. package/.output/server/chunks/routes/api/workshop/index2.get.mjs.map +1 -1
  258. package/.output/server/chunks/routes/api/workshop/index3.post.mjs +1 -1
  259. package/.output/server/chunks/routes/api/workshop/index4.post.mjs +1 -1
  260. package/.output/server/chunks/routes/api/workshop/index5.get.mjs +1 -1
  261. package/.output/server/chunks/routes/api/workshop/index5.post.mjs +1 -1
  262. package/.output/server/chunks/routes/api/workshop/index6.get.mjs +1 -1
  263. package/.output/server/chunks/routes/api/workshop/index6.post.mjs +1 -1
  264. package/.output/server/chunks/routes/api/workshop/plugins/_name/disable.post.mjs +1 -1
  265. package/.output/server/chunks/routes/api/workshop/plugins/_name/enable.post.mjs +1 -1
  266. package/.output/server/chunks/routes/api/workshop/scene/layouts/_channelId_.delete.mjs +1 -1
  267. package/.output/server/chunks/routes/api/workshop/scene/layouts/_channelId_.put.mjs +1 -1
  268. package/.output/server/chunks/routes/api/workshop/teams/_id/deploy.post.mjs +1 -1
  269. package/.output/server/chunks/routes/api/workshop/teams/_id/index.put.mjs +1 -1
  270. package/.output/server/chunks/routes/api/workshop/teams/_id/index2.get.mjs +1 -1
  271. package/.output/server/chunks/routes/api/workshop/workspaces/_id/channel-templates/_tplId_.post.mjs +2 -2
  272. package/.output/server/chunks/routes/renderer.mjs +2 -2
  273. package/.output/server/chunks/virtual/entry.mjs +103 -17
  274. package/.output/server/chunks/virtual/precomputed.mjs +1 -1
  275. package/.output/server/package.json +1 -1
  276. package/README-zh.md +578 -507
  277. package/README.md +125 -51
  278. package/app/assets/css/main.css +329 -22
  279. package/app/components/AppHeader.vue +5 -4
  280. package/app/components/AppSidebar.vue +5 -4
  281. package/app/components/AwChart.vue +17 -0
  282. package/app/components/workshop/AgentLanesView.vue +2 -2
  283. package/app/components/workshop/ChannelSessionList.vue +3 -3
  284. package/app/components/workshop/CommandPalette.vue +1 -2
  285. package/app/components/workshop/Composer.vue +4 -4
  286. package/app/components/workshop/DaqNodeRow.vue +20 -1
  287. package/app/components/workshop/EventBlock.vue +3 -3
  288. package/app/components/workshop/MentionHoverCard.vue +1 -1
  289. package/app/components/workshop/MultiChannelView.vue +1 -1
  290. package/app/components/workshop/TaskBoardView.vue +5 -5
  291. package/app/components/workshop/TranscriptTimeline.vue +3 -3
  292. package/app/components/workshop/blocks/ClusterRoute.vue +3 -3
  293. package/app/components/workshop/blocks/ClusterStream.vue +1 -1
  294. package/app/components/workshop/blocks/ClusterTool.vue +1 -1
  295. package/app/components/workshop/lanes/LaneBlocks.vue +5 -2
  296. package/app/components/workshop/town/TownView.vue +0 -7
  297. package/app/composables/workshop/useClusteredBlocks.ts +22 -3
  298. package/app/composables/workshop/useEscClose.ts +44 -0
  299. package/app/config/index.ts +2 -1
  300. package/app/layouts/default.vue +25 -8
  301. package/app/pages/aml/index.vue +626 -4
  302. package/app/pages/daq/[id].vue +1 -1
  303. package/app/pages/daq/index.vue +10 -12
  304. package/app/pages/dcw/[id].vue +2 -2
  305. package/app/pages/dcw/index.vue +7 -11
  306. package/app/pages/index.vue +24 -6
  307. package/app/pages/logs/index.vue +2 -6
  308. package/app/pages/plugins/index.vue +1 -1
  309. package/app/pages/settings.vue +2 -2
  310. package/app/pages/town.vue +0 -2
  311. package/app/pages/users.vue +1 -1
  312. package/app/pages/workshop/index.vue +2 -2
  313. package/app/plugins/esc-close.client.ts +31 -0
  314. package/app/stores/workshop/events.ts +186 -36
  315. package/bin/aw.mjs +7 -2
  316. package/cli/aw.mjs +19 -34
  317. package/cli/commands/build.mjs +18 -1
  318. package/cli/commands/config.mjs +2 -0
  319. package/cli/commands/plugin.mjs +45 -18
  320. package/cli/commands/register.mjs +6 -2
  321. package/cli/commands/status.mjs +2 -1
  322. package/cli/commands/update.mjs +1 -1
  323. package/cli/commands/version.mjs +1 -1
  324. package/cli/core/args.mjs +76 -4
  325. package/cli/core/help.mjs +3 -1
  326. package/cli/core/meta.mjs +38 -0
  327. package/cli/core/post-build.mjs +96 -0
  328. package/cli/core/registry.mjs +6 -3
  329. package/config.yml +28 -26
  330. package/docs/aml.md +99 -0
  331. package/docs/cli.en.md +445 -0
  332. package/docs/cli.md +410 -220
  333. package/docs/full-test-plan.md +174 -0
  334. package/docs/multi-harness-architecture.md +248 -0
  335. package/docs/plugins.en.md +534 -0
  336. package/docs/plugins.md +531 -179
  337. package/docs/sdk.en.md +922 -0
  338. package/docs/sdk.md +725 -129
  339. package/i18n/dicts/aml.json +43 -1
  340. package/i18n/locales/en.ts +1928 -1885
  341. package/i18n/locales/zh-CN.ts +1928 -1885
  342. package/nuxt.config.ts +27 -2
  343. package/package.json +164 -153
  344. package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.continue.json +1 -0
  345. package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.json +1 -0
  346. package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/054bb4bc4e4217a2ab0b0c6b663747214a9af464f5568ea60e784704e340bb0f.source +153 -0
  347. package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/0554197c3d2bac203a1f5c48a5d52495d1336db1bd7aa4f4c19875810363e684.source +153 -0
  348. package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/05c203d12a954fffba942e1d626e3f5fec05b18a5aef2bac003b7884a4b77406.source +431 -0
  349. package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/145a6e6ba811af35aed31e0cc3211f53706a14980fa069ee9e3c1591139f96f0.source +180 -0
  350. package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/1ae0fb281f97899c025e368ca73f41349b01fb5f85b19e08d7ebccff49095ed5.source +112 -0
  351. package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/20ee9967aa0541c516db7575bdd4a1a745939bc7016bd10d7635903113edb8ec.source +227 -0
  352. package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/233751843aeba9d4c5263f275b8102de00443c06f286918cbd23e0b6729e01aa.source +131 -0
  353. package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/263c2e05b425e5c322e60c6475279f963bab3a873eb521b21df7fec935a46597.source +160 -0
  354. package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/2ac5eaac28eaaee2178c4b32014df8e732f9dd432a285a872f5b7f31c1395fa4.source +157 -0
  355. package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/33a0db0d2d95d2c11d0720090458e5fba1425376f5ceb5b422d1d3471be3226b.source +348 -0
  356. package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/359e474ae83db35e4615d3728de6bf694b64d4dce9b536730a3b6518f9c0494a.source +296 -0
  357. package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/37a4c3c31c4b70f6b719c53d1e9c4fcba603f31adfdd11bb6ef9f0d094923c56.source +285 -0
  358. package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/461feca1c14a695eb8b0f17a6f95fe97eeceabc0510faaea4ba6d25bde147d8d.source +217 -0
  359. package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/4cfadbda8591f29d5e1e230dc000e701b756e850441b3900fb596a4d2f6e98c2.source +301 -0
  360. package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/50ca2810cf0b248c96948994c0c404531bbad6e553166b6816b3b03bfa0f75d2.source +151 -0
  361. package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/52d9e8cb591a9ae86e238c3620a610cd386717bee222c0f37b25b2ac7e523dc4.source +135 -0
  362. package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/6c87daafa4c006560a954636a97333f6123153c9d34d96203f7ee3a14e556357.source +156 -0
  363. package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/77bc47854b577900621cacf1697f81fa2bc005af129d37614a97a3441c08f99f.source +72 -0
  364. package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/7bbb789d3a527817118cf8399ed1861d6a962ade10878fd07223435d333a7089.source +469 -0
  365. package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/86b7c1daafc8b60ba9982dde5bf1bcc74265709483c176e71f23ec6fc267451f.source +259 -0
  366. package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/8df66d62bd41984d0970e8236882080c5085ac937d07a29779463d6a03b37c76.source +97 -0
  367. package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/9962f2d1b3a85137bd40cc835725600b39f89ee02a27c06b2e0402e1eafde115.source +277 -0
  368. package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/a1090ea066b792cb201739f4994e37bf7c12f52e805239a1eab87f18a537f266.source +171 -0
  369. package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/a5241091650134d0919897e086a606a3846c8b2b54f8b4c84a8696c145ac3e9e.source +425 -0
  370. package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/af19fa4c6e34d5540028be4b17600161283af3a2a2dfc61a3fdc0834436a0c14.source +99 -0
  371. package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/b3713d78e2b2f93905ff6be8d58a8d0a2f42dea322eb67c987fda22ff6a084d5.source +325 -0
  372. package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/b3849943c3aff102d1af815631fc843a2a52c17646a4b04696ece323e483bbec.source +332 -0
  373. package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/bac735a3803a6650b7f1eb8f587e6dc5c68ea055000c3c99a11789438b78e837.source +43 -0
  374. package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/d32c24d61eb8b33c73e5a8fc7e4dc7ef437aed238ee4371c2b00617e6104090a.source +154 -0
  375. package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/d5170dc9a9879fda04fdf91d8a110d4efb6787ee38dda596d4da899883d36a72.source +531 -0
  376. package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/dc59bcd7bb397be63ba2f2c3fec23f3782dcb17d2d75a9981eeced761f33eb32.source +439 -0
  377. package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/eb5ff8cf66b92aec7bf6726781d8df74faa2b030c3aaac17d6b00c1fc04c9b32.source +323 -0
  378. package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/f10615a6fae18436e70d1201b2d44fdae3174a3aa7bb4db97dea1b3ed291d721.source +433 -0
  379. package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/f36d3e271668bc1260c2823542d22dbf1d0f7041ff16b1ac175bce2256e582ca.source +280 -0
  380. package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/f94449380af09f31ac352152007146a75cc80bae8d6411ffe57b2c56f933b0ff.source +117 -0
  381. package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/fe4dfd81178fd6b648335f6405d9ede71319aebde796008e50db21f8adf44c99.source +160 -0
  382. package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/ffb4e3aa548cfdadabaa44ab599f9b6a3ca6288176a2cc7a4b2fc2a12b5fb848.source +101 -0
  383. package/scripts/.mimosa/hook-status/sess_aeaecb58-8833-4b83-b93c-050467d21e03-d944d71bb3.json +14 -0
  384. package/scripts/_audit/aml-layout-diag.mjs +83 -0
  385. package/scripts/_audit/bump-version.mjs +51 -0
  386. package/scripts/_audit/channel-inspect.mjs +49 -0
  387. package/scripts/_audit/cleanup-apply.mjs +89 -0
  388. package/scripts/_audit/cleanup-plan.mjs +82 -0
  389. package/scripts/_audit/contrast-check.mjs +43 -0
  390. package/scripts/_audit/dcw-unrecorded-write.ts +1 -1
  391. package/scripts/_audit/design-shots.mjs +145 -0
  392. package/scripts/_audit/docs-font-probe.mjs +68 -0
  393. package/scripts/_audit/docs-probe.mjs +107 -0
  394. package/scripts/_audit/docs-shots.mjs +171 -0
  395. package/scripts/_audit/docs-v3-verify.mjs +255 -0
  396. package/scripts/_audit/docs-vue-lint.mjs +81 -0
  397. package/scripts/_audit/docs-vue-lint2.mjs +91 -0
  398. package/scripts/_audit/exp-cost-scaling.mjs +4 -1
  399. package/scripts/_audit/exp-envelope-and-png.mjs +2 -1
  400. package/scripts/_audit/exp-sweep-fairness.mjs +4 -2
  401. package/scripts/_audit/fix-settings-count.mjs +57 -0
  402. package/scripts/_audit/glass-verify.mjs +155 -0
  403. package/scripts/_audit/hydration-diff.mjs +104 -0
  404. package/scripts/_audit/hydration-head.mjs +36 -0
  405. package/scripts/_audit/hydration-probe.mjs +59 -0
  406. package/scripts/_audit/lead-matrix-test.mjs +172 -0
  407. package/scripts/_audit/plc-agent-task.mjs +74 -0
  408. package/scripts/_audit/plc-clean-scenario.mjs +434 -0
  409. package/scripts/_audit/plc-clean-shots.mjs +161 -0
  410. package/scripts/_audit/plc-fc10-probe.mjs +30 -0
  411. package/scripts/_audit/probe-binding.mjs +114 -103
  412. package/scripts/_audit/review-fix-verify.mjs +158 -0
  413. package/scripts/_audit/seed-demo.mjs +165 -0
  414. package/scripts/_audit/town-focus-shot.mjs +129 -0
  415. package/scripts/_audit/town-reposition.mjs +85 -0
  416. package/scripts/_audit/ts-resolve-hook.mjs +57 -22
  417. package/scripts/_audit/verify-cleanup.mjs +67 -0
  418. package/scripts/_audit/verify-release-pack.mjs +82 -0
  419. package/scripts/_audit/watchdog-recovery-test.mjs +127 -0
  420. package/scripts/_dbg-audit-all-pages.mjs +43 -43
  421. package/scripts/_dbg-configroot-audit.mjs +84 -84
  422. package/scripts/_dbg-daq-intervals-func.mjs +94 -94
  423. package/scripts/_dbg-daq-rowstyle-verify.mjs +112 -112
  424. package/scripts/_dbg-groups-ui-verify.mjs +122 -122
  425. package/scripts/_dbg-harness-e2e.mjs +92 -92
  426. package/scripts/_dbg-harness-ui-e2e.py +97 -97
  427. package/scripts/_dbg-hitl-timeout-e2e.mjs +93 -93
  428. package/scripts/_dbg-multiharness-live-e2e.mjs +254 -254
  429. package/scripts/_dbg-opslog-agent-e2e.mjs +194 -194
  430. package/scripts/_dbg-opt-team-e2e.mjs +133 -133
  431. package/scripts/_dbg-recipe-e2e.mjs +176 -176
  432. package/scripts/_dbg-recipe-stale-e2e.mjs +135 -135
  433. package/scripts/_dbg-render-perf.mjs +142 -142
  434. package/scripts/_dbg-render-regression.mjs +130 -130
  435. package/scripts/_dbg-town-smoke.mjs +54 -54
  436. package/scripts/aw-start-smoke.mjs +27 -8
  437. package/scripts/check-docs-sync.mjs +367 -0
  438. package/scripts/e2e-full-closedloop.mjs +36 -18
  439. package/scripts/production-closed-loop-e2e.mjs +300 -303
  440. package/scripts/test-cli-exit.mjs +129 -21
  441. package/scripts/test-daq-frame-race.mjs +144 -96
  442. package/scripts/test-events-index.mjs +176 -0
  443. package/scripts/test-lru.mjs +34 -11
  444. package/scripts/test-memory-month-query.mjs +11 -3
  445. package/scripts/test-plugin-hardening.mjs +39 -2
  446. package/scripts/test-plugin-lifecycle.mjs +173 -0
  447. package/scripts/test-rollback-index.mjs +76 -18
  448. package/scripts/test-sdk-surface.mjs +6 -3
  449. package/sdk/client.mjs +16 -7
  450. package/sdk/context.mjs +21 -9
  451. package/sdk/examples/line-sentinel/client.mjs +13 -6
  452. package/sdk/examples/line-sentinel/index.mjs +5 -2
  453. package/sdk/examples/ops-notifier/client.mjs +3 -1
  454. package/sdk/examples/sample-insight/client.mjs +4 -2
  455. package/sdk/index.d.mts +133 -16
  456. package/sdk/index.mjs +3 -2
  457. package/sdk/lifecycle.mjs +8 -3
  458. package/server/api/workshop/agent-tools/bindings/index.post.ts +22 -7
  459. package/server/api/workshop/aml/datasets/[id].delete.ts +39 -0
  460. package/server/api/workshop/aml/datasets/[id].get.ts +31 -9
  461. package/server/api/workshop/aml/datasets/[id].patch.ts +30 -0
  462. package/server/api/workshop/aml/entities/index.get.ts +13 -0
  463. package/server/api/workshop/aml/entities/prune.post.ts +28 -0
  464. package/server/api/workshop/aml/env/index.get.ts +13 -0
  465. package/server/api/workshop/aml/env/recheck.post.ts +14 -0
  466. package/server/api/workshop/aml/env/uv.post.ts +21 -0
  467. package/server/api/workshop/aml/env/venv.post.ts +24 -0
  468. package/server/api/workshop/aml/index.get.ts +14 -1
  469. package/server/api/workshop/aml/jobs/[id].delete.ts +44 -0
  470. package/server/api/workshop/aml/models/[id].delete.ts +35 -0
  471. package/server/api/workshop/aml/models/[id].patch.ts +30 -0
  472. package/server/plugins/dev-stability-guard.ts +40 -63
  473. package/server/services/workshop/agents/agent-interface.ts +3 -0
  474. package/server/services/workshop/agents/codex-agent.ts +4 -7
  475. package/server/services/workshop/agents/dsh-agent.ts +4 -7
  476. package/server/services/workshop/agents/opencode-agent.ts +5 -7
  477. package/server/services/workshop/aml/aml.repo.ts +18 -0
  478. package/server/services/workshop/aml/dataset-builder.ts +4 -0
  479. package/server/services/workshop/aml/entity.ts +365 -0
  480. package/server/services/workshop/aml/env-manager.ts +242 -0
  481. package/server/services/workshop/aml/job-orchestrator.ts +4 -15
  482. package/server/services/workshop/aml/model-registry.ts +6 -0
  483. package/server/services/workshop/aml/python-runtime.ts +396 -62
  484. package/server/services/workshop/aml/runtime.ts +95 -4
  485. package/server/services/workshop/daq/bus/mqtt.adapter.ts +3 -1
  486. package/server/services/workshop/daq/daq-controller.ts +95 -47
  487. package/server/services/workshop/daq/daq-node.repo.ts +0 -10
  488. package/server/services/workshop/daq/daq-runtime.ts +0 -5
  489. package/server/services/workshop/json-store.mjs +35 -2
  490. package/server/services/workshop/plugins/host.mjs +14 -5
  491. package/server/services/workshop/runtime/manager.ts +28 -1
  492. package/server/services/workshop/runtime/scheduler-loop.ts +10 -1
  493. package/server/services/workshop/settings.ts +2 -0
  494. package/server/utils/stability-severity.ts +66 -0
  495. package/shared/config/home.mjs +58 -0
  496. package/shared/config/schema.json +2 -1
  497. package/shared/lru.mjs +4 -1
  498. package/.output/public/_nuxt/-6OnbLFb.js +0 -1
  499. package/.output/public/_nuxt/-nb2uqVg.js +0 -1
  500. package/.output/public/_nuxt/4bHdIqEg.js +0 -18
  501. package/.output/public/_nuxt/6PZPfFcO.js +0 -17
  502. package/.output/public/_nuxt/BBBtwOpo.js +0 -9
  503. package/.output/public/_nuxt/BBwMH_hG.js +0 -7
  504. package/.output/public/_nuxt/BDUjyaF4.js +0 -42
  505. package/.output/public/_nuxt/BNXfwXpE.js +0 -1
  506. package/.output/public/_nuxt/BN_PdN3J.js +0 -24
  507. package/.output/public/_nuxt/BSSUlJnx2.js +0 -1
  508. package/.output/public/_nuxt/BWSE6hR6.js +0 -1
  509. package/.output/public/_nuxt/BZGNTgTQ2.js +0 -1
  510. package/.output/public/_nuxt/BZv4RFYN.js +0 -1
  511. package/.output/public/_nuxt/BcmbLh2z2.js +0 -1
  512. package/.output/public/_nuxt/BfGc7TJp.js +0 -1
  513. package/.output/public/_nuxt/BgTB6h_q.js +0 -2
  514. package/.output/public/_nuxt/BkLJA9J5.js +0 -1
  515. package/.output/public/_nuxt/Bp5luxkg2.js +0 -1
  516. package/.output/public/_nuxt/BuCHayqN.js +0 -1
  517. package/.output/public/_nuxt/BuvcLKh1.js +0 -19
  518. package/.output/public/_nuxt/C3tCneTM.js +0 -1
  519. package/.output/public/_nuxt/C77oC8yC2.js +0 -7
  520. package/.output/public/_nuxt/C9f8QMp12.js +0 -1
  521. package/.output/public/_nuxt/CKfhtOt7.js +0 -13
  522. package/.output/public/_nuxt/CQvmN-Mi.js +0 -1
  523. package/.output/public/_nuxt/CUDrOuW7.js +0 -1
  524. package/.output/public/_nuxt/CZcC-gpk.js +0 -1
  525. package/.output/public/_nuxt/CbzsPO5H.js +0 -1
  526. package/.output/public/_nuxt/CdSOrh2c.js +0 -1
  527. package/.output/public/_nuxt/Cgx818r-.js +0 -1
  528. package/.output/public/_nuxt/Cjm7VogC.js +0 -1
  529. package/.output/public/_nuxt/Cm5mDxzH.js +0 -1
  530. package/.output/public/_nuxt/CmHzfVc5.js +0 -3
  531. package/.output/public/_nuxt/Cn3J3NXR.js +0 -23
  532. package/.output/public/_nuxt/Cno6kYiO2.js +0 -1
  533. package/.output/public/_nuxt/Cp6z0RN7.js +0 -1
  534. package/.output/public/_nuxt/CwqIxJGj.js +0 -2
  535. package/.output/public/_nuxt/D-Ca4BGY.js +0 -70
  536. package/.output/public/_nuxt/D0fhp-Ga.js +0 -75
  537. package/.output/public/_nuxt/D1z7i2UP.js +0 -31
  538. package/.output/public/_nuxt/DIaTPH1M.js +0 -1
  539. package/.output/public/_nuxt/DTYBfjRY.js +0 -1
  540. package/.output/public/_nuxt/DXRZPxGs.js +0 -1
  541. package/.output/public/_nuxt/DZzGarBE2.js +0 -13
  542. package/.output/public/_nuxt/DaMCzQhv.js +0 -1
  543. package/.output/public/_nuxt/DoLasgPj2.js +0 -1
  544. package/.output/public/_nuxt/DpojD719.js +0 -1
  545. package/.output/public/_nuxt/DsVcWfyR.js +0 -1
  546. package/.output/public/_nuxt/DtBu71ev.js +0 -32
  547. package/.output/public/_nuxt/Dy-mxvXY2.js +0 -1
  548. package/.output/public/_nuxt/DzuC31-i.js +0 -2
  549. package/.output/public/_nuxt/FQri3dV3.js +0 -1
  550. package/.output/public/_nuxt/ORt9oDIy2.js +0 -1
  551. package/.output/public/_nuxt/TownView.CtskuMXS.css +0 -1
  552. package/.output/public/_nuxt/VLI2Zy4t.js +0 -5
  553. package/.output/public/_nuxt/_id_.MbzdFygI.css +0 -1
  554. package/.output/public/_nuxt/_id_.hRYo-EAB.css +0 -1
  555. package/.output/public/_nuxt/_wsId_.gXMEOYgX.css +0 -1
  556. package/.output/public/_nuxt/aml.WU_bh87J.css +0 -1
  557. package/.output/public/_nuxt/arUY5dyq2.js +0 -4
  558. package/.output/public/_nuxt/builds/meta/adc365b6-f636-4a2b-9527-79819c1e874b.json +0 -1
  559. package/.output/public/_nuxt/daq.Bb6l44-O.css +0 -1
  560. package/.output/public/_nuxt/dcw.rXH2fc2Z.css +0 -1
  561. package/.output/public/_nuxt/default.jNT73_hq.css +0 -1
  562. package/.output/public/_nuxt/ekuGmQ7R.js +0 -1
  563. package/.output/public/_nuxt/entry.jFrFAWuA.css +0 -1
  564. package/.output/public/_nuxt/logs.DMOM-iHe.css +0 -1
  565. package/.output/public/_nuxt/niDwBOZW.js +0 -3
  566. package/.output/public/_nuxt/pMoIO6rr.js +0 -14
  567. package/.output/public/_nuxt/pages.Cc8GX9T1.css +0 -1
  568. package/.output/public/_nuxt/plugins.wIPyfPn-.css +0 -1
  569. package/.output/public/_nuxt/rqZ-1SoP.js +0 -2
  570. package/.output/public/_nuxt/settings.BCm4NZIc.css +0 -1
  571. package/.output/public/_nuxt/town.C_DsNW0J.css +0 -1
  572. package/.output/public/_nuxt/users.DuAt_Zwf.css +0 -1
  573. package/.output/public/_nuxt/vJ4FPb-_.js +0 -1
  574. package/.output/public/_nuxt/workshop.BJg84pOK.css +0 -1
  575. package/.output/server/chunks/build/aml-uBNIppIf.mjs +0 -508
  576. package/.output/server/chunks/build/aml-uBNIppIf.mjs.map +0 -1
  577. package/.output/server/chunks/build/daq-BvihjQyW.mjs.map +0 -1
  578. package/.output/server/chunks/build/pages-C-6BRtv8.mjs.map +0 -1
  579. package/scripts/_audit/.tmp/audit-data/dcws.json +0 -28
  580. package/scripts/_audit/.tmp/dcw-writes.json +0 -15650
  581. package/scripts/_audit/.tmp/dcws.json +0 -9033
  582. package/scripts/_audit/.tmp/pollution-backup/dcw-rollback.polluted.json +0 -470006
  583. package/scripts/_audit/.tmp/pollution-backup/dcws.polluted.json +0 -9085
  584. package/scripts/_audit/.tmp/probe-cwd.txt +0 -1
  585. package/scripts/_audit/awhome/commands/README.md +0 -3
  586. package/scripts/_audit/awhome/commands/hello.mjs +0 -12
  587. package/scripts/_audit/diag-cwd.ts +0 -20
  588. package/scripts/_audit/diag-cwd2.ts +0 -19
  589. package/scripts/_audit/hello.mjs +0 -12
  590. package/scripts/_audit/ndjson-partial-line-repro.mjs +0 -77
  591. package/scripts/_audit/opencode-await-ternary-repro.mjs +0 -20
  592. package/scripts/_audit/part-frag.txt +0 -84
  593. package/scripts/_audit/part-head.txt +0 -45
  594. package/scripts/_audit/probe-child.mjs +0 -17
  595. package/scripts/_audit/probe-envelope.mjs +0 -49
  596. package/scripts/_audit/probe-packlist.mjs +0 -67
  597. package/scripts/_audit/probe-routes.mjs +0 -47
  598. package/scripts/_audit/probe-routes2.mjs +0 -38
  599. package/scripts/_audit/probe.ts +0 -9
  600. package/scripts/_audit/probe2.ts +0 -6
  601. package/scripts/_audit/probe3.ts +0 -3
  602. package/scripts/_audit/probe4.ts +0 -3
  603. package/scripts/_audit/proj/.AgentWorkShop/commands/echoargs.mjs +0 -13
  604. package/scripts/_audit/proj/config.yml +0 -1
  605. package/scripts/_audit/run.mjs +0 -30
  606. package/scripts/_audit/tsconfig.probe.json +0 -24
  607. package/scripts/_audit/typecheck-out.txt +0 -466
  608. package/scripts/_daq-realtime-probe.mjs +0 -68
  609. package/scripts/_daq-warn-probe.mjs +0 -50
  610. package/scripts/_dbg-acc-1-setup.mjs +0 -57
  611. package/scripts/_dbg-acc-2-diag.mjs +0 -14
  612. package/scripts/_dbg-acc-2-intervals.mjs +0 -81
  613. package/scripts/_dbg-acc-3-daq.mjs +0 -48
  614. package/scripts/_dbg-acc-4-team.mjs +0 -92
  615. package/scripts/_dbg-acc-5-visual.mjs +0 -63
  616. package/scripts/_dbg-acc-5b-ws-town.mjs +0 -18
  617. package/scripts/_dbg-acc-5c-town.mjs +0 -12
  618. package/scripts/_dbg-acc-6-i18n.mjs +0 -19
  619. package/scripts/_dbg-agent-tools-audit.mjs +0 -154
  620. package/scripts/_dbg-agent-workflow-audit.mjs +0 -177
  621. package/scripts/_dbg-agents-dropdown-shot.py +0 -33
  622. package/scripts/_dbg-anim-verify.mjs +0 -81
  623. package/scripts/_dbg-app-shot.mjs +0 -48
  624. package/scripts/_dbg-autoframe.mjs +0 -103
  625. package/scripts/_dbg-availability-probe.ts +0 -11
  626. package/scripts/_dbg-beacon-final.mjs +0 -181
  627. package/scripts/_dbg-bind-bidi-e2e.mjs +0 -239
  628. package/scripts/_dbg-callout-near.mjs +0 -108
  629. package/scripts/_dbg-catalog-smoke.ts +0 -20
  630. package/scripts/_dbg-cf-line-shot.mjs +0 -18
  631. package/scripts/_dbg-chan-focus.mjs +0 -49
  632. package/scripts/_dbg-channel-plugin-ui.mjs +0 -94
  633. package/scripts/_dbg-cleanup.mjs +0 -31
  634. package/scripts/_dbg-closedloop-ui-shot.mjs +0 -61
  635. package/scripts/_dbg-codex-handshake.ts +0 -30
  636. package/scripts/_dbg-codex-probe.mjs +0 -58
  637. package/scripts/_dbg-codex-sandbox.ts +0 -58
  638. package/scripts/_dbg-codex-turn.ts +0 -65
  639. package/scripts/_dbg-collab-scenario-e2e.mjs +0 -185
  640. package/scripts/_dbg-config-smoke.ts +0 -28
  641. package/scripts/_dbg-console-audit.mjs +0 -61
  642. package/scripts/_dbg-console-probe.mjs +0 -23
  643. package/scripts/_dbg-context-inject-audit.mjs +0 -231
  644. package/scripts/_dbg-cpu-profile.mjs +0 -53
  645. package/scripts/_dbg-crash-recovery.mjs +0 -143
  646. package/scripts/_dbg-crop-shot.mjs +0 -16
  647. package/scripts/_dbg-cross-channel-e2e.mjs +0 -157
  648. package/scripts/_dbg-cross-team-visibility-e2e.mjs +0 -129
  649. package/scripts/_dbg-crush-probe.sh +0 -21
  650. package/scripts/_dbg-crush-spawn-probe.ts +0 -22
  651. package/scripts/_dbg-daq-acc-probe.mjs +0 -24
  652. package/scripts/_dbg-daq-attrib.mjs +0 -34
  653. package/scripts/_dbg-daq-bind-audit.mjs +0 -119
  654. package/scripts/_dbg-daq-cadence.mjs +0 -104
  655. package/scripts/_dbg-daq-debug.mjs +0 -22
  656. package/scripts/_dbg-daq-diag.mjs +0 -33
  657. package/scripts/_dbg-daq-e2e.mjs +0 -171
  658. package/scripts/_dbg-daq-film.mjs +0 -136
  659. package/scripts/_dbg-daq-filter-e2e.mjs +0 -109
  660. package/scripts/_dbg-daq-filter-e2e2.mjs +0 -62
  661. package/scripts/_dbg-daq-final-regression.mjs +0 -78
  662. package/scripts/_dbg-daq-frame-alarm.mjs +0 -49
  663. package/scripts/_dbg-daq-frame-ui.mjs +0 -62
  664. package/scripts/_dbg-daq-frame-ws.mjs +0 -72
  665. package/scripts/_dbg-daq-full-check.mjs +0 -179
  666. package/scripts/_dbg-daq-line-note-verify.mjs +0 -61
  667. package/scripts/_dbg-daq-linebanner-audit.mjs +0 -107
  668. package/scripts/_dbg-daq-pages-shot.mjs +0 -37
  669. package/scripts/_dbg-daq-perf.mjs +0 -61
  670. package/scripts/_dbg-daq-probe.mjs +0 -27
  671. package/scripts/_dbg-daq-recipe-e2e.mjs +0 -30
  672. package/scripts/_dbg-daq-redesign-shot.mjs +0 -88
  673. package/scripts/_dbg-daq-rows-probe.mjs +0 -26
  674. package/scripts/_dbg-daq-rowstate-e2e.mjs +0 -152
  675. package/scripts/_dbg-daq-rowstate-shot.mjs +0 -45
  676. package/scripts/_dbg-daq-rowstate-shot2.mjs +0 -38
  677. package/scripts/_dbg-daq-tpl.mjs +0 -144
  678. package/scripts/_dbg-dash-console-check.mjs +0 -49
  679. package/scripts/_dbg-dash-deep-probe.mjs +0 -61
  680. package/scripts/_dbg-dash-hitpoint.mjs +0 -44
  681. package/scripts/_dbg-dash-live-shot.mjs +0 -36
  682. package/scripts/_dbg-dash-shot.mjs +0 -21
  683. package/scripts/_dbg-dashboard-shot.mjs +0 -35
  684. package/scripts/_dbg-dcw-audit.mjs +0 -126
  685. package/scripts/_dbg-dcw-card-e2e.mjs +0 -108
  686. package/scripts/_dbg-dcw-channel-ui.mjs +0 -144
  687. package/scripts/_dbg-dcw-examples.mjs +0 -81
  688. package/scripts/_dbg-dcw-light-shot.mjs +0 -19
  689. package/scripts/_dbg-dcw-line-audit.mjs +0 -107
  690. package/scripts/_dbg-dcw-pause-tpl-audit.mjs +0 -161
  691. package/scripts/_dbg-dcw-pause-ui.mjs +0 -175
  692. package/scripts/_dbg-dcw-read-toolface.ts +0 -13
  693. package/scripts/_dbg-dcw-read-ui.mjs +0 -74
  694. package/scripts/_dbg-dcw-scene.mjs +0 -72
  695. package/scripts/_dbg-dcw-shot2.mjs +0 -14
  696. package/scripts/_dbg-dcw-twin-e2e.mjs +0 -192
  697. package/scripts/_dbg-diag-mock-loop.mjs +0 -89
  698. package/scripts/_dbg-diag-watch.mjs +0 -95
  699. package/scripts/_dbg-docs-site-shot.mjs +0 -32
  700. package/scripts/_dbg-dsh-probe.mjs +0 -31
  701. package/scripts/_dbg-dt-interact.mjs +0 -193
  702. package/scripts/_dbg-error-probe.mjs +0 -54
  703. package/scripts/_dbg-filter-light-verify.mjs +0 -54
  704. package/scripts/_dbg-final-acceptance-2.mjs +0 -72
  705. package/scripts/_dbg-final-acceptance.mjs +0 -192
  706. package/scripts/_dbg-final-agent-e2e.mjs +0 -151
  707. package/scripts/_dbg-final-features.mjs +0 -155
  708. package/scripts/_dbg-final-fixups.mjs +0 -62
  709. package/scripts/_dbg-final-full-e2e.mjs +0 -218
  710. package/scripts/_dbg-final-line-e2e.mjs +0 -173
  711. package/scripts/_dbg-final-shots.mjs +0 -32
  712. package/scripts/_dbg-final-t6-hitl.mjs +0 -38
  713. package/scripts/_dbg-final-visual.mjs +0 -29
  714. package/scripts/_dbg-fix-unused-imports.py +0 -41
  715. package/scripts/_dbg-focus-range.mjs +0 -115
  716. package/scripts/_dbg-fresh-scene-e2e.mjs +0 -125
  717. package/scripts/_dbg-fullchain-e2e.mjs +0 -178
  718. package/scripts/_dbg-gate-debug.mjs +0 -37
  719. package/scripts/_dbg-gif-encode.mjs +0 -111
  720. package/scripts/_dbg-gizmo.mjs +0 -95
  721. package/scripts/_dbg-glass-probe.mjs +0 -57
  722. package/scripts/_dbg-glass-shot.mjs +0 -50
  723. package/scripts/_dbg-glass-sweep.mjs +0 -25
  724. package/scripts/_dbg-glb-probe.mjs +0 -43
  725. package/scripts/_dbg-goose-probe.mjs +0 -33
  726. package/scripts/_dbg-goose-probe.sh +0 -10
  727. package/scripts/_dbg-hardening-probe.mjs +0 -90
  728. package/scripts/_dbg-harness-cancel-repro.mjs +0 -81
  729. package/scripts/_dbg-harness-ui-dbg.py +0 -49
  730. package/scripts/_dbg-harness-ui-shot.py +0 -109
  731. package/scripts/_dbg-hero-btn-probe.mjs +0 -21
  732. package/scripts/_dbg-hidden-check.mjs +0 -21
  733. package/scripts/_dbg-hmi-audit.mjs +0 -164
  734. package/scripts/_dbg-home-repro.mjs +0 -24
  735. package/scripts/_dbg-home-stack.mjs +0 -13
  736. package/scripts/_dbg-host.mjs +0 -16
  737. package/scripts/_dbg-huashu-survey.mjs +0 -31
  738. package/scripts/_dbg-huashu-survey2.mjs +0 -35
  739. package/scripts/_dbg-huashu-verify.mjs +0 -25
  740. package/scripts/_dbg-huashu-verify2.mjs +0 -26
  741. package/scripts/_dbg-hydration-detail.mjs +0 -18
  742. package/scripts/_dbg-i18n-debug.mjs +0 -27
  743. package/scripts/_dbg-i18n-debug2.mjs +0 -26
  744. package/scripts/_dbg-i18n-final.mjs +0 -42
  745. package/scripts/_dbg-i18n-scan.mjs +0 -38
  746. package/scripts/_dbg-infra-lifecycle.mjs +0 -44
  747. package/scripts/_dbg-interval-config.mjs +0 -156
  748. package/scripts/_dbg-interval-scenario.mjs +0 -126
  749. package/scripts/_dbg-kicker-check.mjs +0 -11
  750. package/scripts/_dbg-line-aura-shots.mjs +0 -54
  751. package/scripts/_dbg-line-control-e2e.mjs +0 -120
  752. package/scripts/_dbg-line-gate-audit.mjs +0 -108
  753. package/scripts/_dbg-line-live-e2e.mjs +0 -144
  754. package/scripts/_dbg-line-repo-test.ts +0 -10
  755. package/scripts/_dbg-line-scenario-e2e.mjs +0 -256
  756. package/scripts/_dbg-line-spawn.ts +0 -31
  757. package/scripts/_dbg-live-engine-probe.mjs +0 -80
  758. package/scripts/_dbg-login-debug.py +0 -23
  759. package/scripts/_dbg-login-e2e.mjs +0 -26
  760. package/scripts/_dbg-logs-ui-e2e.py +0 -126
  761. package/scripts/_dbg-mcp-bridge-probe.mjs +0 -147
  762. package/scripts/_dbg-modbus-latency.mjs +0 -22
  763. package/scripts/_dbg-mqtt-chain-e2e.mjs +0 -90
  764. package/scripts/_dbg-mqtt-publisher.mjs +0 -17
  765. package/scripts/_dbg-nav-rpg.mjs +0 -84
  766. package/scripts/_dbg-nav-shot.mjs +0 -28
  767. package/scripts/_dbg-nav.mjs +0 -27
  768. package/scripts/_dbg-oneshot-impl-probe.ts +0 -67
  769. package/scripts/_dbg-opencode-sse.mjs +0 -101
  770. package/scripts/_dbg-opencode-start.ts +0 -57
  771. package/scripts/_dbg-opslog-e2e.mjs +0 -121
  772. package/scripts/_dbg-opslog-shots.mjs +0 -62
  773. package/scripts/_dbg-optimization-e2e.mjs +0 -94
  774. package/scripts/_dbg-orbit.mjs +0 -58
  775. package/scripts/_dbg-overview-probe.sh +0 -31
  776. package/scripts/_dbg-panesplitter-fix-check.mjs +0 -62
  777. package/scripts/_dbg-perms-visual.mjs +0 -36
  778. package/scripts/_dbg-pg-tcp-probe.cjs +0 -27
  779. package/scripts/_dbg-phase-e3-monitor.mjs +0 -25
  780. package/scripts/_dbg-pi-spawn-probe.ts +0 -33
  781. package/scripts/_dbg-plc-agent-loop.ts +0 -102
  782. package/scripts/_dbg-plc-e2e.mjs +0 -171
  783. package/scripts/_dbg-plugin-agent-read.ts +0 -56
  784. package/scripts/_dbg-plugin-config-ui.mjs +0 -111
  785. package/scripts/_dbg-plugin-matrix.mjs +0 -212
  786. package/scripts/_dbg-plugin-panels-ui.mjs +0 -54
  787. package/scripts/_dbg-plugin-sink-rest.mjs +0 -70
  788. package/scripts/_dbg-plugin-sink-ui.mjs +0 -81
  789. package/scripts/_dbg-plugin-tools-inject.ts +0 -80
  790. package/scripts/_dbg-plugin-ui-wizard.mjs +0 -125
  791. package/scripts/_dbg-plugin-verify-e2e.mjs +0 -123
  792. package/scripts/_dbg-plugins-e2e.mjs +0 -101
  793. package/scripts/_dbg-pop-clamp-verify.mjs +0 -77
  794. package/scripts/_dbg-preset-e2e.mjs +0 -116
  795. package/scripts/_dbg-preview-console.mjs +0 -28
  796. package/scripts/_dbg-preview-minrepro.mjs +0 -156
  797. package/scripts/_dbg-preview-pixels.mjs +0 -93
  798. package/scripts/_dbg-prompts-hotreload-test.ts +0 -76
  799. package/scripts/_dbg-prompts-resolve-test.ts +0 -39
  800. package/scripts/_dbg-quality-pages-e2e.mjs +0 -84
  801. package/scripts/_dbg-query-cancel.ts +0 -12
  802. package/scripts/_dbg-qwen-acp-probe.mjs +0 -30
  803. package/scripts/_dbg-qwen-capture.mjs +0 -21
  804. package/scripts/_dbg-rail-tree-e2e.mjs +0 -183
  805. package/scripts/_dbg-real-driver-e2e.mjs +0 -55
  806. package/scripts/_dbg-redesign-shots.mjs +0 -34
  807. package/scripts/_dbg-registry-smoke.ts +0 -14
  808. package/scripts/_dbg-release-smoke.mjs +0 -104
  809. package/scripts/_dbg-repo-setup-verify.mjs +0 -31
  810. package/scripts/_dbg-resolve-probe.ts +0 -6
  811. package/scripts/_dbg-restart-persist.mjs +0 -41
  812. package/scripts/_dbg-retention-test.ts +0 -25
  813. package/scripts/_dbg-rollback-mgr-audit.mjs +0 -169
  814. package/scripts/_dbg-rpg.mjs +0 -71
  815. package/scripts/_dbg-sc001-dispatch.mjs +0 -63
  816. package/scripts/_dbg-scenario-final-shot.mjs +0 -24
  817. package/scripts/_dbg-scenario-phase-e2.mjs +0 -75
  818. package/scripts/_dbg-scenario-phase-e3.mjs +0 -96
  819. package/scripts/_dbg-scenario-phase1.mjs +0 -90
  820. package/scripts/_dbg-scenario-phase2.mjs +0 -105
  821. package/scripts/_dbg-scenario-phase3-monitor.mjs +0 -48
  822. package/scripts/_dbg-scenario-phase3.mjs +0 -111
  823. package/scripts/_dbg-scene-polish-shot.mjs +0 -118
  824. package/scripts/_dbg-selring-probe.mjs +0 -47
  825. package/scripts/_dbg-settings-draft-probe.mjs +0 -39
  826. package/scripts/_dbg-settings-probe.mjs +0 -33
  827. package/scripts/_dbg-setup-e2e.mjs +0 -88
  828. package/scripts/_dbg-sideinfo.mjs +0 -101
  829. package/scripts/_dbg-sim-keeper.mjs +0 -100
  830. package/scripts/_dbg-splitter.mjs +0 -88
  831. package/scripts/_dbg-swatch-check.mjs +0 -10
  832. package/scripts/_dbg-task-cancel-probe.mjs +0 -66
  833. package/scripts/_dbg-team-drill.mjs +0 -173
  834. package/scripts/_dbg-town-alarm-e2e.mjs +0 -40
  835. package/scripts/_dbg-town-beauty-shots.mjs +0 -54
  836. package/scripts/_dbg-town-daq-shot.mjs +0 -26
  837. package/scripts/_dbg-town-full-e2e.mjs +0 -104
  838. package/scripts/_dbg-town-gate.mjs +0 -44
  839. package/scripts/_dbg-town-ins-probe.mjs +0 -37
  840. package/scripts/_dbg-town-perf.mjs +0 -50
  841. package/scripts/_dbg-town-polish-shots.mjs +0 -82
  842. package/scripts/_dbg-town-realtime.mjs +0 -42
  843. package/scripts/_dbg-town-shot.py +0 -25
  844. package/scripts/_dbg-town-shot3.mjs +0 -17
  845. package/scripts/_dbg-town-truth.mjs +0 -37
  846. package/scripts/_dbg-town-truth2.mjs +0 -27
  847. package/scripts/_dbg-transform-audit.mjs +0 -98
  848. package/scripts/_dbg-trend-expand-test.mjs +0 -38
  849. package/scripts/_dbg-twindaq-focus.mjs +0 -81
  850. package/scripts/_dbg-ui-polish-shot.mjs +0 -43
  851. package/scripts/_dbg-ui-polish-verify1.mjs +0 -92
  852. package/scripts/_dbg-ui-polish-verify2.mjs +0 -50
  853. package/scripts/_dbg-ui-polish-verify3.mjs +0 -51
  854. package/scripts/_dbg-ui-polish-verify4.mjs +0 -50
  855. package/scripts/_dbg-ui-shot.mjs +0 -26
  856. package/scripts/_dbg-ui-shots.mjs +0 -28
  857. package/scripts/_dbg-ui-survey.py +0 -52
  858. package/scripts/_dbg-unify-shot.mjs +0 -43
  859. package/scripts/_dbg-uplink-probe.mjs +0 -36
  860. package/scripts/_dbg-wizard-preview-shot.mjs +0 -58
  861. package/scripts/_dbg-wizard-ui-e2e.mjs +0 -93
  862. package/scripts/_dbg-ws-probe.mjs +0 -86
  863. package/scripts/_dbg-ws-shot2.mjs +0 -23
  864. package/scripts/_dbg-wsdot-sanity.mjs +0 -25
  865. package/scripts/_dev-stack.mjs +0 -46
  866. package/scripts/_http-driver-probe.mjs +0 -30
  867. package/scripts/_mqtt-driver-probe.mjs +0 -30
  868. package/scripts/_newdriver-rest-probe.mjs +0 -100
  869. package/scripts/_node-state-probe.mjs +0 -5
  870. package/scripts/_opcua-driver-probe.mjs +0 -31
  871. package/scripts/_rtu-debug.mjs +0 -41
  872. package/scripts/_rtu-direct.mjs +0 -6
  873. package/scripts/_rtu-driver-probe.mjs +0 -53
  874. package/scripts/_spike-pitui.mjs +0 -116
  875. package/scripts/_tmp-args-probe.mjs +0 -20
  876. package/scripts/_tmp-cyc-entry.mjs +0 -8
  877. package/scripts/_tmp-cyc-main.mjs +0 -5
  878. package/scripts/_tmp-cyc-mod.mjs +0 -2
  879. package/scripts/_tmp-cycle-a.mjs +0 -6
  880. package/scripts/_tmp-cycle-b.mjs +0 -2
  881. package/scripts/_tmp-cycle-probe.mjs +0 -4
  882. package/scripts/_tmp-entry-variant.mjs +0 -2
  883. package/scripts/_tmp-help-probe.mjs +0 -19
  884. package/scripts/_tmp-help-probe2.mjs +0 -2
  885. package/scripts/_tmp-trace-preload.mjs +0 -1
  886. package/scripts/_wizard-shots.mjs +0 -90
  887. package/scripts/acceptance-suite.py +0 -207
  888. package/scripts/aml-agent-bridge.ts +0 -230
  889. package/scripts/aml-industrial-loop.ts +0 -232
  890. package/scripts/build-film-devices.mjs +0 -227
  891. package/scripts/collab-live-test.py +0 -177
  892. package/scripts/debug-mcp-http.ts +0 -64
  893. package/scripts/demo-lead-worker.ts +0 -256
  894. package/scripts/demo-modes.ts +0 -415
  895. package/scripts/demo-omp-channel.ts +0 -135
  896. package/scripts/design-preflight.mjs +0 -223
  897. package/scripts/design-verify-templates.mjs +0 -110
  898. package/scripts/design-verify.mjs +0 -170
  899. package/scripts/dev-window.cmd +0 -6
  900. package/scripts/device-line-restore.mjs +0 -34
  901. package/scripts/diag-lead-status.ts +0 -101
  902. package/scripts/e2e-a2a-steer-live.mjs +0 -193
  903. package/scripts/e2e-dual-drive-comm.ts +0 -259
  904. package/scripts/e2e-full-scenario.ts +0 -321
  905. package/scripts/e2e-harness-consistency.ts +0 -204
  906. package/scripts/e2e-harness-provider-task.mjs +0 -126
  907. package/scripts/e2e-line-live.mjs +0 -144
  908. package/scripts/e2e-memory-persistence.ts +0 -320
  909. package/scripts/e2e-omp-modes.ts +0 -274
  910. package/scripts/e2e-omp-realtime.ts +0 -258
  911. package/scripts/e2e-plc-scenario.mjs +0 -292
  912. package/scripts/e2e-real-scenario.mjs +0 -466
  913. package/scripts/e2e-tab-close.mjs +0 -136
  914. package/scripts/e2e-token-ui.mjs +0 -149
  915. package/scripts/final-soup-run.py +0 -192
  916. package/scripts/final-soup-watch.py +0 -83
  917. package/scripts/i18n-codemod.mjs +0 -173
  918. package/scripts/i18n-fix-en.py +0 -28
  919. package/scripts/i18n-fix-en2.py +0 -31
  920. package/scripts/i18n-merge.mjs +0 -191
  921. package/scripts/migrate-local-time.mjs +0 -123
  922. package/scripts/omp-real-test.py +0 -328
  923. package/scripts/team-plugins-api-smoke.mjs +0 -149
  924. package/scripts/test-a2a-relay.mjs +0 -222
  925. package/scripts/test-aml-integration.ts +0 -159
  926. package/scripts/test-aml-job.ts +0 -174
  927. package/scripts/test-aml-unit.ts +0 -184
  928. package/scripts/test-api-client.ts +0 -108
  929. package/scripts/test-api-suite.mjs +0 -271
  930. package/scripts/test-block-consumption.mjs +0 -194
  931. package/scripts/test-cmd-render.mjs +0 -218
  932. package/scripts/test-collab-omp.mjs +0 -192
  933. package/scripts/test-config-precedence.ts +0 -124
  934. package/scripts/test-context-governor.ts +0 -176
  935. package/scripts/test-daq-frames.ts +0 -180
  936. package/scripts/test-daq-minio.ts +0 -77
  937. package/scripts/test-dedup-logic.ts +0 -132
  938. package/scripts/test-e2e-collaboration.ts +0 -262
  939. package/scripts/test-e2e-monitor.ts +0 -192
  940. package/scripts/test-event-history.ts +0 -112
  941. package/scripts/test-exec-modes.ts +0 -316
  942. package/scripts/test-fifo-realtime.mjs +0 -193
  943. package/scripts/test-final-e2e.mjs +0 -290
  944. package/scripts/test-goal-summary.ts +0 -202
  945. package/scripts/test-harness-liveness.ts +0 -109
  946. package/scripts/test-harness-terminal.ts +0 -164
  947. package/scripts/test-header-trail.mjs +0 -95
  948. package/scripts/test-hitl.ts +0 -360
  949. package/scripts/test-koda-restyle.mjs +0 -105
  950. package/scripts/test-lane-raw.ts +0 -67
  951. package/scripts/test-lanes-history-render.mjs +0 -138
  952. package/scripts/test-loop-omp.mjs +0 -154
  953. package/scripts/test-mdlite.ts +0 -53
  954. package/scripts/test-memory-brief-chronicle.ts +0 -180
  955. package/scripts/test-memory-rrf-mmr.ts +0 -114
  956. package/scripts/test-mock-collab.mjs +0 -226
  957. package/scripts/test-modern-render.mjs +0 -174
  958. package/scripts/test-omp-terminal.mjs +0 -187
  959. package/scripts/test-plugin-ext.ts +0 -173
  960. package/scripts/test-prompts-loader.ts +0 -56
  961. package/scripts/test-real-scenario.mjs +0 -290
  962. package/scripts/test-stream-render.ts +0 -37
  963. package/scripts/test-task-drawer.mjs +0 -204
  964. package/scripts/test-task-invariants.mjs +0 -169
  965. package/scripts/test-town-3d.mjs +0 -121
  966. package/scripts/test-town-layout.mjs +0 -200
  967. package/scripts/test-town-page.mjs +0 -136
  968. package/scripts/test-town-scene-math.ts +0 -169
  969. package/scripts/test-town-twin.mjs +0 -121
  970. package/scripts/test-town-upload.mjs +0 -89
  971. package/scripts/test-town-user-flow.mjs +0 -619
  972. package/scripts/test-town-world.mjs +0 -76
  973. package/scripts/test-town-wuwa.mjs +0 -198
  974. package/scripts/test-user-isolation.mjs +0 -193
  975. package/scripts/test-workshop-entries.ts +0 -370
  976. package/scripts/test-workspace-api.ts +0 -329
  977. package/scripts/test-ws-aep.mjs +0 -187
  978. package/scripts/test-ws-protocol.ts +0 -134
  979. package/scripts/town-demo-seed.mjs +0 -75
  980. package/scripts/town-scene-clear.mjs +0 -56
  981. package/scripts/verify-exec-modes-report.ts +0 -248
  982. package/scripts/verify-lead-mail.ts +0 -188
  983. package/scripts/verify-page-smoke.mjs +0 -87
  984. package/scripts/ws-test.mjs +0 -176
  985. package/scripts/ws-test.py +0 -4
@@ -1,154 +0,0 @@
1
- /** Agent 工业工具审计:绑定鉴权/物理语义/联锁校验/手动审批/数据查询/孪生绑定 UI */
2
- import puppeteer from 'puppeteer-core'
3
-
4
- const TOKEN = 'ut-ffc1dfbbc0c1444c87c1ec69a9e8208c'
5
- const ROOT = 'http://127.0.0.1:3000'
6
- const H = { authorization: `Bearer ${TOKEN}`, 'content-type': 'application/json' }
7
- const sleep = (ms) => new Promise(r => setTimeout(r, ms))
8
- const fail = (m) => { console.error('FAIL:', m); process.exitCode = 1 }
9
- const jpost = (u, b) => fetch(ROOT + u, { method: 'POST', headers: H, body: JSON.stringify(b ?? {}) }).then(r => r.json())
10
- const jget = (u) => fetch(ROOT + u, { headers: H }).then(r => r.json())
11
- const jdel = (u) => fetch(ROOT + u, { method: 'DELETE', headers: H }).then(r => r.json())
12
-
13
- // 工具调用经 HTTP 桥(与 omp host tools 同一服务层函数:industrial-tools.ts)
14
- const invoke = async (tool, args, agentId = AGENT) =>
15
- (await jpost('/api/workshop/agent-tools/invoke', { agentId, tool, args })).data.result
16
-
17
- // ===== 1. 产线/节点/配方夹具 =====
18
- const line = (await jpost('/api/workshop/dcw/lines', { name: '工具审计线' })).data.line
19
- const twins = (await jget('/api/workshop/device-twins')).data.twins.filter(t => t.kind !== 'daq')
20
- const dev = twins[0]
21
- const dq = (await jpost('/api/workshop/daq', { templateRef: 'daq-temp-tc', name: '工具审计-温度采集', lineId: line.id, intervalMs: 500 })).data.node
22
- const dw = (await jpost('/api/workshop/dcw', { templateRef: 'dcw-temp-sp', name: '工具审计-温度设定', lineId: line.id })).data.node
23
- const prod = (await jpost('/api/workshop/dcw/products', { name: '工具审计产品', lineId: line.id })).data.product
24
- const rc = (await jpost('/api/workshop/dcw/recipes', {
25
- productId: prod.id, name: '工具审计配方',
26
- params: [{ templateRef: 'dcw-temp-sp', nodeId: dw.id, value: 180, min: 176, max: 188 }],
27
- daqWindows: [{ nodeId: dq.id, min: 100, max: 260 }],
28
- })).data.recipe
29
- const AGENT = 'agt-audit-1'
30
- // 清理历史运行残留绑定(固定 agentId 跨轮复用)
31
- for (const b of (await jget(`/api/workshop/agent-tools/bindings?agentId=${AGENT}`)).data.bindings) {
32
- await jdel(`/api/workshop/agent-tools/bindings/${b.id}`)
33
- }
34
- await jpost(`/api/workshop/dcw/lines/${line.id}/start`, { recipeId: rc.id })
35
- await sleep(2500)
36
- console.log('fixture ready:', line.name, '| daq', dq.id, '| dcw', dw.id)
37
-
38
- // ===== 2. REST 绑定 CRUD =====
39
- const bDcw = (await jpost('/api/workshop/agent-tools/bindings', { agentId: AGENT, nodeId: dw.id, kind: 'dcw', mode: 'manual' })).data.binding
40
- const bDaq = (await jpost('/api/workshop/agent-tools/bindings', { agentId: AGENT, nodeId: dq.id, kind: 'daq', mode: 'auto' })).data.binding
41
- const list = (await jget(`/api/workshop/agent-tools/bindings?agentId=${AGENT}`)).data.bindings
42
- if (list.length === 2 && bDcw.mode === 'manual') console.log('PASS 绑定 CRUD:数控(manual)+ 数采(auto)')
43
- else fail(`绑定 CRUD 异常: ${JSON.stringify(list)}`)
44
-
45
- // ===== 3. 工具语义(HTTP 桥 = omp host tool 同路径) =====
46
- {
47
- // 3.1 未绑定节点 → 鉴权拒绝
48
- const denied = await invoke('dcw_control', { node_id: 'dw-nonexist', value: 180 })
49
- if (denied.isError && denied.text.includes('无权')) console.log('PASS dcw_control 鉴权:未绑定节点拒绝')
50
- else fail(`鉴权失效: ${denied.text.slice(0, 60)}`)
51
-
52
- // 3.2 my_industrial_nodes:物理语义 + 窗口 + 模式
53
- const mine = await invoke('my_industrial_nodes', {})
54
- const okMine = mine.text.includes('数控') && mine.text.includes('数采') && mine.text.includes('[176, 188]') && mine.text.includes('手动确认')
55
- if (okMine) console.log('PASS my_industrial_nodes:物理含义/配方窗口/控制模式齐备')
56
- else fail(`节点语义缺失: ${mine.text.slice(0, 200)}`)
57
-
58
- // 3.3 manual 模式:挂起审批 → 批准 → 执行成功
59
- const pendingP = invoke('dcw_control', { node_id: dw.id, value: 182 })
60
- await sleep(600)
61
- const pending = (await jget(`/api/workshop/agent-tools/approvals?agentId=${AGENT}`)).data.approvals
62
- if (pending.length !== 1) fail(`审批未挂起: ${pending.length}`)
63
- else console.log('PASS manual 模式:下发挂起待审批(', pending[0].detail.slice(0, 40), ')')
64
- const dec = await jpost(`/api/workshop/agent-tools/approvals/${pending[0].id}/decide`, { approved: true, comment: '同意,按工艺执行' })
65
- const result = await pendingP
66
- if (dec.data?.approval?.status === 'approved' && result.text.includes('下发成功') && result.text.includes('182')) console.log('PASS 批准后执行成功,回读语义齐备')
67
- else fail(`批准执行异常: ${result.text.slice(0, 120)}`)
68
-
69
- // 3.4 拒绝 + 备注 → 返回 tool result
70
- const pendingP2 = invoke('dcw_control', { node_id: dw.id, value: 185 })
71
- await sleep(600)
72
- const pending2 = (await jget(`/api/workshop/agent-tools/approvals?agentId=${AGENT}`)).data.approvals
73
- await jpost(`/api/workshop/agent-tools/approvals/${pending2[0].id}/decide`, { approved: false, comment: '窗口上沿太近,不要动' })
74
- const result2 = await pendingP2
75
- if (!result2.text.includes('下发成功') && result2.text.includes('窗口上沿太近')) console.log('PASS 拒绝 + 用户备注回给 tool result')
76
- else fail(`拒绝备注缺失: ${result2.text.slice(0, 120)}`)
77
-
78
- // 3.5 模式切 auto → 直接执行;越窗 195 联锁拒绝
79
- await jpatchWrap(bDcw.id)
80
- async function jpatchWrap(id) {
81
- await fetch(`${ROOT}/api/workshop/agent-tools/bindings/${id}`, { method: 'PATCH', headers: H, body: JSON.stringify({ mode: 'auto' }) })
82
- }
83
- const auto = await invoke('dcw_control', { node_id: dw.id, value: 182 })
84
- if (auto.text.includes('下发成功')) console.log('PASS auto 模式直接执行(无需批准)')
85
- else fail(`auto 模式异常: ${auto.text.slice(0, 100)}`)
86
- const over = await invoke('dcw_control', { node_id: dw.id, value: 195 })
87
- if (over.isError && over.text.includes('195')) console.log('PASS 工具联锁:越配方窗口 195 被拒(物理语义回给 AI)')
88
- else fail(`联锁失效: ${over.text.slice(0, 100)}`)
89
-
90
- // 3.6 daq_query:最近数据 + 物理语义
91
- const q = await invoke('daq_query', { last_minutes: 5 })
92
- const okQ = q.text.includes('熔体/箱体温度') && q.text.includes('最新') && q.text.includes('工具审计-温度采集')
93
- if (okQ) console.log('PASS daq_query:物理语义 + 统计 + 序列')
94
- else fail(`daq_query 异常: ${q.text.slice(0, 200)}`)
95
- const qForb = await invoke('daq_query', { node_id: 'dn-nonexist' })
96
- if (qForb.isError) console.log('PASS daq_query 鉴权:未绑定节点拒绝')
97
- else fail('daq_query 鉴权失效')
98
- }
99
-
100
- // ===== 4. 孪生 UI:Agent 检查器绑定面板 =====
101
- // 取一个真实 Channel agent id
102
- const chans = (await jget('/api/workshop/channels')).data
103
- const firstCh = (chans ?? [])[0]
104
- const chanAgents = firstCh ? (await jget(`/api/workshop/channels/${firstCh.id}/agents`)).data : []
105
- const agentId = chanAgents[0]?.id ?? ''
106
- if (agentId) {
107
- const browser = await puppeteer.launch({
108
- executablePath: 'C:/Program Files/Google/Chrome/Application/chrome.exe',
109
- headless: 'new',
110
- args: ['--no-sandbox', '--disable-gpu', '--window-size=1600,1200'],
111
- })
112
- const page = await browser.newPage()
113
- await page.setViewport({ width: 1600, height: 1200 })
114
- await page.setCookie({ name: 'token', value: TOKEN, domain: '127.0.0.1', path: '/' })
115
- await page.goto(`${ROOT}/town`, { waitUntil: 'domcontentloaded', timeout: 90000 })
116
- for (let i = 0; i < 40; i++) {
117
- if (await page.evaluate(() => (window.__town?.scene?.deviceNodes?.size ?? 0) > 0)) break
118
- await sleep(1000)
119
- }
120
- for (let i = 0; i < 30; i++) {
121
- if (await page.evaluate(() => typeof window.__town?.scene?.setSelected === 'function')) break
122
- await sleep(1000)
123
- }
124
- await page.evaluate(() => {
125
- const btns = [...document.querySelectorAll('button')]
126
- btns.find(b => b.textContent.trim() === '编辑')?.click()
127
- })
128
- await sleep(400)
129
- await page.evaluate((id) => { window.__town.scene.setSelected({ kind: 'agent', id }) }, agentId)
130
- await sleep(900)
131
- const ui = await page.evaluate(() => ({
132
- hasSect: document.body.textContent.includes('工业节点绑定'),
133
- hasEmpty: document.body.textContent.includes('未绑定工业节点'),
134
- hasBindBar: document.body.textContent.includes('选择节点…'),
135
- }))
136
- console.log('agent inspector:', JSON.stringify(ui))
137
- if (ui.hasSect && ui.hasBindBar) console.log('PASS 孪生侧栏 Agent 绑定面板渲染')
138
- else fail(`绑定面板缺失: ${JSON.stringify(ui)}`)
139
- await page.screenshot({ path: 'docs/audit/screenshots/agent-bind-panel.png' })
140
- await browser.close()
141
- }
142
- else {
143
- console.log('[warn] 无运行时 Agent,跳过 UI 段(REST/工具段已覆盖)')
144
- }
145
-
146
- // ===== 清理 =====
147
- await jpost(`/api/workshop/dcw/lines/${line.id}/stop`, {})
148
- await jdel(`/api/workshop/daq/${dq.id}`)
149
- await jdel(`/api/workshop/dcw/${dw.id}`)
150
- await jdel(`/api/workshop/dcw/recipes/${rc.id}`)
151
- await jdel(`/api/workshop/dcw/products/${prod.id}`)
152
- await jdel(`/api/workshop/dcw/lines/${line.id}`)
153
- console.log(process.exitCode ? 'AUDIT FAILED' : 'AUDIT ALL PASS')
154
- process.exit(process.exitCode ?? 0)
@@ -1,177 +0,0 @@
1
- /** mock 真实作业流审计:多 Agent × 多节点绑定/读写/越权矩阵/HITL 并发/解绑失效/级联清理 */
2
- const TOKEN = 'ut-ffc1dfbbc0c1444c87c1ec69a9e8208c'
3
- const ROOT = 'http://127.0.0.1:3000'
4
- const H = { authorization: `Bearer ${TOKEN}`, 'content-type': 'application/json' }
5
- const sleep = (ms) => new Promise(r => setTimeout(r, ms))
6
- const fail = (m) => { console.error('FAIL:', m); process.exitCode = 1 }
7
- const jpost = (u, b) => fetch(ROOT + u, { method: 'POST', headers: H, body: JSON.stringify(b ?? {}) }).then(r => r.json())
8
- const jget = (u) => fetch(ROOT + u, { headers: H }).then(r => r.json())
9
- const jdel = (u) => fetch(ROOT + u, { method: 'DELETE', headers: H }).then(r => r.json())
10
- const invoke = (agentId, tool, args) => jpost('/api/workshop/agent-tools/invoke', { agentId, tool, args }).then(r => r.data.result)
11
- const bindings = (agentId) => jget(`/api/workshop/agent-tools/bindings?agentId=${agentId}`).then(d => d.data.bindings)
12
- const bind = (agentId, nodeId, kind, mode) => jpost('/api/workshop/agent-tools/bindings', { agentId, nodeId, kind, mode })
13
- const daqNodes = () => jget('/api/workshop/daq').then(d => d.data.nodes)
14
-
15
- const cleanup = []
16
- async function main() {
17
- // ===== 场景搭建:一条产线,两个工艺位(温度 + 压力),两个 Agent 分工 =====
18
- const line = (await jpost('/api/workshop/dcw/lines', { name: '作业流审计线' })).data.line
19
- cleanup.push(['line', line.id])
20
- const prod = (await jpost('/api/workshop/dcw/products', { name: '作业流审计产品', lineId: line.id })).data.product
21
- cleanup.push(['prod', prod.id])
22
- // 3 个数控 + 2 个数采(多节点绑定场景)
23
- const dw1 = (await jpost('/api/workshop/dcw', { templateRef: 'dcw-temp-sp', name: '作业-温度设定', lineId: line.id })).data.node
24
- const dw2 = (await jpost('/api/workshop/dcw', { templateRef: 'dcw-pressure-sp', name: '作业-压力设定', lineId: line.id })).data.node
25
- const dw3 = (await jpost('/api/workshop/dcw', { templateRef: 'dcw-speed-sp', name: '作业-速度设定', lineId: line.id })).data.node
26
- const dq1 = (await jpost('/api/workshop/daq', { templateRef: 'daq-temp-tc', name: '作业-温度采集', lineId: line.id, intervalMs: 500 })).data.node
27
- const dq2 = (await jpost('/api/workshop/daq', { templateRef: 'daq-pressure-tx', name: '作业-压力采集', lineId: line.id, intervalMs: 500 })).data.node
28
- for (const id of [dw1.id, dw2.id, dw3.id]) cleanup.push(['dcw', id])
29
- for (const id of [dq1.id, dq2.id]) cleanup.push(['daq', id])
30
-
31
- // Agent-1(操作员):数控 temp(manual) + 数控 pressure(auto) + 数采 temp
32
- // Agent-2(质检员):仅数采 temp + 数采 pressure(只读角色)
33
- const A1 = 'agt-op-1'
34
- const A2 = 'agt-qc-1'
35
- for (const b of [...await bindings(A1), ...await bindings(A2)]) await jdel(`/api/workshop/agent-tools/bindings/${b.id}`)
36
- await bind(A1, dw1.id, 'dcw', 'manual')
37
- await bind(A1, dw2.id, 'dcw', 'auto')
38
- await bind(A1, dq1.id, 'daq', 'auto')
39
- await bind(A2, dq1.id, 'daq', 'auto')
40
- await bind(A2, dq2.id, 'daq', 'auto')
41
- console.log('scenario: A1=dw1(manual)+dw2(auto)+dq1 | A2=dq1+dq2(只读)')
42
-
43
- // 配方:控制参数只含温度;数采窗口含两个采集节点
44
- const rc = (await jpost('/api/workshop/dcw/recipes', {
45
- productId: prod.id, name: '作业流审计配方',
46
- params: [{ templateRef: 'dcw-temp-sp', nodeId: dw1.id, value: 180, min: 176, max: 188 }],
47
- daqWindows: [{ nodeId: dq1.id, min: 100, max: 260 }, { nodeId: dq2.id, min: 0.5, max: 1.2 }],
48
- })).data.recipe
49
- cleanup.push(['recipe', rc.id])
50
- const st = await jpost(`/api/workshop/dcw/lines/${line.id}/start`, { recipeId: rc.id })
51
- if (!st.data?.line?.active) { fail('line start'); process.exit(1) }
52
- await sleep(2500)
53
-
54
- // ===== 1. my_industrial_nodes:A1 多节点清单 =====
55
- const mine1 = await invoke(A1, 'my_industrial_nodes', {})
56
- const ok1 = mine1.text.includes('温度设定') && mine1.text.includes('压力设定') && mine1.text.includes('温度采集')
57
- && mine1.text.includes('176') && mine1.text.includes('188') && mine1.text.includes('手动确认') && mine1.text.includes('自动')
58
- if (ok1) console.log('PASS A1 多节点清单:3 绑定(2 数控 + 1 数采),窗口/模式齐备')
59
- else fail(`A1 清单异常: ${mine1.text.slice(0, 200)}`)
60
- const mine2 = await invoke(A2, 'my_industrial_nodes', {})
61
- if (mine2.text.includes('数采') && !mine2.text.includes('[数控]')) console.log('PASS A2 只读清单:仅数采')
62
- else fail(`A2 清单异常: ${mine2.text.slice(0, 120)}`)
63
-
64
- // ===== 2. 读写作业流:A1 manual 批准下发 + auto 直接下发 =====
65
- const p1 = invoke(A1, 'dcw_control', { node_id: dw1.id, value: 182 })
66
- await sleep(600)
67
- let pend = (await jget(`/api/workshop/agent-tools/approvals?agentId=${A1}`)).data.approvals
68
- // 并发场景:同一节点重复下发 → 去重拒绝
69
- const dup = await invoke(A1, 'dcw_control', { node_id: dw1.id, value: 183 })
70
- if (dup.isError && dup.text.includes('待审批')) console.log('PASS HITL 并发去重:同节点 pending 期间拒绝新下发')
71
- else fail(`并发去重失效: ${dup.text.slice(0, 80)}`)
72
- // 用户批准第一条
73
- await jpost(`/api/workshop/agent-tools/approvals/${pend[0].id}/decide`, { approved: true, comment: '按配方执行' })
74
- const r1 = await p1
75
- if (r1.text.includes('下发成功') && r1.text.includes('182')) console.log('PASS A1 dw1(manual) 批准后下发成功')
76
- else fail(`manual 下发异常: ${r1.text.slice(0, 120)}`)
77
-
78
- const r2 = await invoke(A1, 'dcw_control', { node_id: dw2.id, value: 0.92 })
79
- if (r2.text.includes('下发成功')) console.log('PASS A1 dw2(auto) 直接下发成功')
80
- else fail(`auto 下发异常: ${r2.text.slice(0, 120)}`)
81
-
82
- // ===== 3. 越权矩阵 =====
83
- // 3.1 A2 试图数控下发(只读角色,无 dcw 绑定)
84
- const x1 = await invoke(A2, 'dcw_control', { node_id: dw1.id, value: 185 })
85
- if (x1.isError && x1.text.includes('尚未绑定')) console.log('PASS 越权①:A2(只读)数控下发被拒')
86
- else fail(`越权①失效: ${x1.text.slice(0, 80)}`)
87
- // 3.2 A1 试图操控未绑定的 dw3(同产线但未授权)
88
- const x2 = await invoke(A1, 'dcw_control', { node_id: dw3.id, value: 300 })
89
- if (x2.isError && x2.text.includes('无权操作') && x2.text.includes(dw3.id)) console.log('PASS 越权②:A1 操控未绑定节点 dw3 被拒')
90
- else fail(`越权②失效: ${x2.text.slice(0, 80)}`)
91
- // 3.3 A2 试图查询未绑定的节点(不存在节点)
92
- const x3 = await invoke(A2, 'daq_query', { node_id: 'dn-xxx' })
93
- if (x3.isError && x3.text.includes('无权查询')) console.log('PASS 越权③:A2 查询陌生节点被拒')
94
- else fail(`越权③失效: ${x3.text.slice(0, 80)}`)
95
- // 3.4 A1 用 A2 的数采视角?不适用——A1 有 dq1;验证 A1 不可查 dq2(未绑定)
96
- const x4 = await invoke(A1, 'daq_query', { node_id: dq2.id })
97
- if (x4.isError && x4.text.includes('无权查询')) console.log('PASS 越权④:A1 查询未绑定 dq2 被拒')
98
- else fail(`越权④失效: ${x4.text.slice(0, 80)}`)
99
-
100
- // ===== 4. 数据读取:A1 不传 node_id = 全部自己的数采节点;A2 全部(2 个) =====
101
- const q1 = await invoke(A1, 'daq_query', { last_minutes: 5 })
102
- const q2 = await invoke(A2, 'daq_query', { last_minutes: 5 })
103
- if (q1.text.includes('作业-温度采集') && q1.text.includes('1 个节点') && !q1.text.includes('作业-压力采集'))
104
- console.log('PASS 数据读取:A1 仅见自己绑定的 dq1')
105
- else fail(`A1 读取范围异常: ${q1.text.slice(0, 150)}`)
106
- if (q2.text.includes('作业-温度采集') && q2.text.includes('作业-压力采集') && q2.text.includes('2 个节点'))
107
- console.log('PASS 数据读取:A2 见绑定的 dq1+dq2')
108
- else fail(`A2 读取范围异常: ${q2.text.slice(0, 150)}`)
109
- // 数值确实来自产线运行(mock 波动数据)
110
- const live = (await daqNodes()).find(n => n.id === dq1.id)
111
- if (q1.text.includes(`最新 ${live?.value}`) || q1.text.match(/最新 \d/)) console.log('PASS 读取数据来自真实采集流(数值随产线波动)')
112
- else console.log(' [info] 数值比对:' + (live?.value ?? '?'))
113
-
114
- // ===== 5. HITL 拒绝路径 + 解绑失效 =====
115
- const p5 = invoke(A1, 'dcw_control', { node_id: dw1.id, value: 186 })
116
- await sleep(600)
117
- pend = (await jget(`/api/workshop/agent-tools/approvals?agentId=${A1}`)).data.approvals
118
- await jpost(`/api/workshop/agent-tools/approvals/${pend[0].id}/decide`, { approved: false, comment: '温度稳定期,不要动' })
119
- const r5 = await p5
120
- if (r5.text.includes('拒绝了') && r5.text.includes('温度稳定期')) console.log('PASS HITL 拒绝:备注回传 tool result')
121
- else fail(`拒绝路径异常: ${r5.text.slice(0, 100)}`)
122
-
123
- // 解绑 dw1 → 挂起中的审批取消 + 后续下发无权
124
- const p6 = invoke(A1, 'dcw_control', { node_id: dw1.id, value: 184 })
125
- await sleep(600)
126
- pend = (await jget(`/api/workshop/agent-tools/approvals?agentId=${A1}`)).data.approvals
127
- if (pend.length > 0) {
128
- const bList = await bindings(A1)
129
- const dw1b = bList.find(b => b.nodeId === dw1.id && b.kind === 'dcw')
130
- await jdel(`/api/workshop/agent-tools/bindings/${dw1b.id}`)
131
- const r6 = await p6
132
- if (r6.text.includes('绑定已解除')) console.log('PASS 解绑失效:挂起审批被取消(备注注明原因)')
133
- else fail(`解绑失效异常: ${r6.text.slice(0, 100)}`)
134
- }
135
- else {
136
- console.log(' [info] dw1 无挂起(可能已决),直接验证解绑后无权')
137
- const bList = await bindings(A1)
138
- const dw1b = bList.find(b => b.nodeId === dw1.id && b.kind === 'dcw')
139
- await jdel(`/api/workshop/agent-tools/bindings/${dw1b.id}`)
140
- }
141
- const x5 = await invoke(A1, 'dcw_control', { node_id: dw1.id, value: 180 })
142
- if (x5.isError && x5.text.includes('无权操作')) console.log('PASS 解绑后:A1 对 dw1 无权下发')
143
- else fail(`解绑后仍可操作: ${x5.text.slice(0, 80)}`)
144
-
145
- // ===== 6. 节点删除级联:删 dw3 → 任何残留绑定自动消失 =====
146
- const ghost = (await jpost('/api/workshop/dcw', { templateRef: 'dcw-tension-sp', name: '作业-幽灵设定', lineId: line.id })).data.node
147
- cleanup.push(['dcw', ghost.id])
148
- await bind(A2, ghost.id, 'dcw', 'auto')
149
- await jdel(`/api/workshop/dcw/${ghost.id}`)
150
- await sleep(400)
151
- const afterGhost = (await invoke(A2, 'my_industrial_nodes', {})).text
152
- if (!afterGhost.includes('幽灵')) console.log('PASS 节点删除级联:绑定随删除自动清理')
153
- else fail(`级联清理失效: ${afterGhost.slice(0, 100)}`)
154
-
155
- // ===== 7. 停线:写入仍受全局量程约束(工具语义提示无活动配方) =====
156
- await jpost(`/api/workshop/dcw/lines/${line.id}/stop`, {})
157
- await sleep(500)
158
- const r7 = await invoke(A1, 'dcw_control', { node_id: dw2.id, value: 0.7 })
159
- if (r7.text.includes('下发成功') && r7.text.includes('无活动配方')) console.log('PASS 停线后下发:全局量程约束 + 语义提示')
160
- else fail(`停线下发异常: ${r7.text.slice(0, 100)}`)
161
- }
162
-
163
- main()
164
- .then(async () => {
165
- // cleanup(LIFO)
166
- for (const [kind, id] of [...cleanup].reverse()) {
167
- if (kind === 'line') await jpost(`/api/workshop/dcw/lines/${id}/stop`, {}).catch(() => {})
168
- const base = kind === 'daq' ? '/api/workshop/daq' : kind === 'dcw' ? '/api/workshop/dcw' : `/api/workshop/dcw/${kind === 'prod' ? 'products' : kind === 'recipe' ? 'recipes' : 'lines'}`
169
- await jdel(`${base}/${id}`).catch(() => {})
170
- }
171
- console.log(process.exitCode ? 'AUDIT FAILED' : 'AUDIT ALL PASS')
172
- process.exit(process.exitCode ?? 0)
173
- })
174
- .catch((err) => {
175
- console.error('FATAL:', err.message)
176
- process.exit(1)
177
- })
@@ -1,33 +0,0 @@
1
- import asyncio, os
2
- from playwright.async_api import async_playwright
3
-
4
- BASE = os.environ.get('AW_BASE', 'http://127.0.0.1:3000')
5
- SHOT = '.e2e-shots'
6
-
7
- async def main():
8
- async with async_playwright() as p:
9
- browser = await p.chromium.launch()
10
- page = await browser.new_page(viewport={'width': 1500, 'height': 950})
11
- await page.goto(BASE + '/workshop', wait_until='domcontentloaded', timeout=120000)
12
- await page.wait_for_selector('input[placeholder="邮箱 / 用户名"]', timeout=90000)
13
- await page.wait_for_timeout(4000)
14
- await page.get_by_placeholder('邮箱 / 用户名').click(timeout=8000)
15
- await page.get_by_placeholder('邮箱 / 用户名').fill('admin', timeout=8000)
16
- await page.locator('input[type="password"]').first.click(timeout=8000)
17
- await page.locator('input[type="password"]').first.fill('admin123', timeout=8000)
18
- await page.get_by_role('button', name='登 录').click(timeout=8000)
19
- await page.wait_for_timeout(3500)
20
- await page.goto(BASE + '/workshop/agents', wait_until='domcontentloaded', timeout=120000)
21
- await page.wait_for_timeout(4000)
22
- await page.get_by_role('button', name='新建模板').first.click(timeout=8000)
23
- await page.wait_for_timeout(2500)
24
- sel = page.locator('.ant-select').nth(1) # 表单内第 2 个 select(第 1 个是可见性)
25
- await sel.scroll_into_view_if_needed()
26
- await sel.click()
27
- await page.wait_for_timeout(1800)
28
- dots = await page.locator('.h-opt-dot').count()
29
- print(f'[agents] dropdown option dots = {dots}')
30
- await page.screenshot(path=f'{SHOT}/harness-agents-dropdown.png', full_page=False)
31
- await browser.close()
32
-
33
- asyncio.run(main())
@@ -1,81 +0,0 @@
1
- /** 三处动画/空态验证:/daq 手风琴、/dcw 弹窗、/town Inspector + 右轨空态。 */
2
- import puppeteer from 'puppeteer-core'
3
-
4
- const ROOT = 'http://127.0.0.1:3000'
5
- const sleep = ms => new Promise(r => setTimeout(r, ms))
6
-
7
- const login = await fetch(`${ROOT}/api/users/login`, {
8
- method: 'POST',
9
- headers: { 'content-type': 'application/json' },
10
- body: JSON.stringify({ email: process.env.E2E_USER ?? 'zhangwei@awshop.io', password: process.env.E2E_PASS ?? 'Awshop@123' }),
11
- }).then(r => r.json())
12
-
13
- const browser = await puppeteer.launch({
14
- executablePath: 'C:/Program Files/Google/Chrome/Application/chrome.exe',
15
- headless: 'new',
16
- args: ['--no-sandbox', '--disable-gpu', '--window-size=1600,1000'],
17
- })
18
-
19
- // ---- A. /daq 手风琴 ----
20
- const p1 = await browser.newPage()
21
- await p1.setViewport({ width: 1600, height: 1000, deviceScaleFactor: 1.25 })
22
- await p1.setCookie({ name: 'token', value: login.data.token, domain: '127.0.0.1', path: '/' })
23
- await p1.goto(`${ROOT}/daq`, { waitUntil: 'domcontentloaded', timeout: 45000 })
24
- await sleep(6000)
25
- const bodyBox0 = await p1.evaluate(() => document.querySelector('.opt-body')?.getBoundingClientRect().height)
26
- await p1.click('.opt-head')
27
- await sleep(500)
28
- const bodyBox1 = await p1.evaluate(() => document.querySelector('.opt-body')?.getBoundingClientRect().height)
29
- console.log('[daq] opt-body 高度 收起→展开:', bodyBox0, '→', bodyBox1, bodyBox1 > 100 ? 'PASS' : 'FAIL')
30
- await p1.click('.opt-head')
31
- await sleep(500)
32
- const bodyBox2 = await p1.evaluate(() => document.querySelector('.opt-body')?.getBoundingClientRect().height)
33
- console.log('[daq] 再收起:', bodyBox2, bodyBox2 < 5 ? 'PASS(对称收合)' : 'FAIL')
34
-
35
- // ---- B. /dcw 弹窗 ----
36
- const p2 = await browser.newPage()
37
- await p2.setViewport({ width: 1600, height: 1000, deviceScaleFactor: 1.25 })
38
- await p2.setCookie({ name: 'token', value: login.data.token, domain: '127.0.0.1', path: '/' })
39
- await p2.goto(`${ROOT}/dcw`, { waitUntil: 'domcontentloaded', timeout: 45000 })
40
- await sleep(6000)
41
- await p2.evaluate(() => {
42
- const btn = [...document.querySelectorAll('.aw-page-head button, .page button')].find(b => b.textContent.includes('新建产线') || b.textContent.includes('New'))
43
- btn?.click()
44
- })
45
- await sleep(400)
46
- const modalOn = await p2.evaluate(() => {
47
- const m = document.querySelector('.modal')
48
- if (!m) return null
49
- const cs = getComputedStyle(m)
50
- return { opacity: cs.opacity, transform: cs.transform, visible: m.getBoundingClientRect().height > 100 }
51
- })
52
- console.log('[dcw] 弹窗展开后:', JSON.stringify(modalOn), modalOn?.visible && modalOn.opacity === '1' ? 'PASS(终态正确)' : 'FAIL')
53
- await p2.screenshot({ path: 'docs/audit/screenshots/redesign0831/dcw-modal-anim.png' })
54
-
55
- // ---- C. /town Inspector + 空态 ----
56
- const p3 = await browser.newPage()
57
- await p3.setViewport({ width: 1600, height: 1000, deviceScaleFactor: 1.25 })
58
- await p3.setCookie({ name: 'token', value: login.data.token, domain: '127.0.0.1', path: '/' })
59
- await p3.goto(`${ROOT}/town`, { waitUntil: 'domcontentloaded', timeout: 60000 })
60
- await sleep(20000)
61
- const emptyIco = await p3.evaluate(() => document.querySelectorAll('.rail-empty .re-ico').length)
62
- console.log('[town] 右轨空态徽记数:', emptyIco, emptyIco >= 1 ? 'PASS' : '(有告警/事件时为 0,不判失败)')
63
- // 点选场景中一台设备(在左轨数采树里点一个已落位节点 → Inspector 出现)
64
- const clicked = await p3.evaluate(() => {
65
- const node = [...document.querySelectorAll('.daq-node.placed')][0]
66
- if (!node) return false
67
- node.click()
68
- return true
69
- })
70
- await sleep(600)
71
- const insVisible = await p3.evaluate(() => {
72
- const el = document.querySelector('.panel.inspector')
73
- if (!el) return null
74
- const cs = getComputedStyle(el)
75
- return { opacity: cs.opacity, transform: cs.transform, h: el.getBoundingClientRect().height }
76
- })
77
- console.log('[town] Inspector:', clicked ? '已点击落位节点' : '无落位节点可点', JSON.stringify(insVisible), insVisible?.h > 100 ? 'PASS' : 'SKIP(需场景内落位实体)')
78
- await p3.screenshot({ path: 'docs/audit/screenshots/redesign0831/town-inspector.png' })
79
-
80
- await browser.close()
81
- console.log('DONE')
@@ -1,48 +0,0 @@
1
- /**
2
- * 应用 UI 截图走查 — dev server(127.0.0.1:3000)+ Edge + puppeteer-core。
3
- * 注册临时用户 → 会话 cookie → 截图指定页面。
4
- * 用法:node scripts/_dbg-app-shot.mjs [输出目录] [path1 path2 ...]
5
- */
6
- import puppeteer from 'puppeteer-core'
7
- import fs from 'node:fs'
8
-
9
- const EDGE = 'C:\\Program Files (x86)\\Microsoft\\Edge\\Application\\msedge.exe'
10
- const BASE = 'http://127.0.0.1:3000'
11
- const OUT = process.argv[2] ?? 'gui-test-screenshots/app-v1'
12
- const PAGES = process.argv.slice(3).length ? process.argv.slice(3) : ['/']
13
-
14
- const main = async () => {
15
- fs.mkdirSync(OUT, { recursive: true })
16
- const browser = await puppeteer.launch({ executablePath: EDGE, headless: 'new' })
17
- const page = await browser.newPage()
18
- await page.setViewport({ width: 1600, height: 900, deviceScaleFactor: 1 })
19
-
20
- // 在页面上下文里注册临时用户(自动携带同源 cookie)
21
- await page.goto(`${BASE}/`, { waitUntil: 'domcontentloaded' })
22
- const reg = await page.evaluate(async () => {
23
- const id = Math.random().toString(36).slice(2, 8)
24
- const res = await fetch('/api/users/register', {
25
- method: 'POST',
26
- headers: { 'content-type': 'application/json' },
27
- body: JSON.stringify({ name: `shot-${id}`, email: `shot-${id}@test.local`, password: 'Passw0rd!123' }),
28
- })
29
- return res.json()
30
- })
31
- const token = reg?.data?.token ?? reg?.data?.session?.token
32
- if (token) {
33
- await page.evaluate((t) => {
34
- document.cookie = `token=${t}; path=/`
35
- }, token)
36
- }
37
- console.log('registered:', !!token)
38
-
39
- for (const p of PAGES) {
40
- await page.goto(`${BASE}${p}`, { waitUntil: 'networkidle2', timeout: 60000 })
41
- await new Promise(r => setTimeout(r, 2500))
42
- await page.screenshot({ path: `${OUT}/${p.replace(/\//g, '_') || 'root'}.png`, fullPage: true })
43
- console.log('shot', p)
44
- }
45
- await browser.close()
46
- }
47
-
48
- main().catch(e => { console.error(e); process.exit(1) })
@@ -1,103 +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/Google/Chrome/Application/chrome.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, 2500))
20
- await page.evaluate(() => {
21
- const s = window.__town.scene
22
- s.setMode('edit')
23
- const b = [...s.blocks.values()][0]
24
- window.__cid = b.channelId
25
- s.selectChannel(b.channelId)
26
- s.focusTo(b.x, b.z)
27
- })
28
- await new Promise(r => setTimeout(r, 1000))
29
-
30
- // API 直驱:模拟 channelEdge 拖拽 3.2 倍等比放大(走真实 movePointerDrag 路径)
31
- const r1 = await page.evaluate(() => {
32
- const s = window.__town.scene
33
- const b = s.blocks.get(window.__cid)
34
- const before = { rx: b.radiusX, rz: b.radiusZ, dolly: s.dolly }
35
- const rect0 = s.canvas.getBoundingClientRect()
36
- s.tryStartPointerDrag(rect0.left + rect0.width / 2, rect0.top + rect0.height / 2)
37
- const kind = s.pointerDrag?.kind
38
- // 若命中的是 channel/beacon 而非 channelEdge,直接驱动内部序列等价验证:
39
- return { kind, before, cx: b.x, cz: b.z }
40
- })
41
- console.log('start:', JSON.stringify(r1))
42
- if (r1.kind !== 'channelEdge') {
43
- // 未抓到边界线(屏幕中心是领地中心):退化为直接等价 API 序列(与真实拖拽同一函数链)
44
- await page.evaluate(() => {
45
- window.__town.scene.endPointerDrag()
46
- })
47
- }
48
- // 逐帧放大:直接调用内部等价序列(applyResize 所走路径) via updateChannelLayout + autoFrameTo 由拖拽分支触发…
49
- // 为走完整 autoFrame 路径,用 channelEdge 的 pointerDrag 结构驱动:
50
- // 构造 channelEdge 拖拽:镜头对准 边界45°点,使该点位于屏幕中心(精确)
51
- await page.evaluate(() => {
52
- const s = window.__town.scene
53
- const b = s.blocks.get(window.__cid)
54
- const k = 0.707
55
- s.focusTo(b.x + b.radiusX * k, b.z + b.radiusZ * k)
56
- })
57
- await new Promise(r => setTimeout(r, 1000))
58
- const r3 = await page.evaluate(() => {
59
- const s = window.__town.scene
60
- const rect = s.canvas.getBoundingClientRect()
61
- const cx = rect.left + rect.width / 2, cy = rect.top + rect.height / 2
62
- // 屏幕中心 = 边界45°点(精确) → tryStartPointerDrag 应命中 channelEdge
63
- const started = s.tryStartPointerDrag(cx, cy)
64
- const kind = s.pointerDrag?.kind
65
- if (!started) return { started, kind }
66
- // 逐帧向外拖:每步沿 45° 外推(屏幕上向右下拉 —— 45° 世界方向在此视角下近似右下)
67
- for (let i = 1; i <= 12; i++) {
68
- s.movePointerDrag(cx + 42 * i, cy + 30 * i)
69
- }
70
- s.endPointerDrag()
71
- const b = s.blocks.get(window.__cid)
72
- return { started, kind, after: { rx: Math.round(b.radiusX), rz: Math.round(b.radiusZ) }, dollyAfter: +s.dolly.toFixed(2) }
73
- })
74
- console.log('edge drag:', JSON.stringify(r3))
75
- await new Promise(r => setTimeout(r, 1500))
76
- // 视口适配检查:领地 8 个极值点 + 中心投影都在 canvas 视口内
77
- const fit = await page.evaluate(() => {
78
- const s = window.__town.scene
79
- const b = s.blocks.get(window.__cid)
80
- const rect = s.canvas.getBoundingClientRect()
81
- const pts = []
82
- if (b.shape === 'rect') {
83
- for (const [sx, sz] of [[1, 1], [-1, 1], [-1, -1], [1, -1]]) pts.push([b.x + sx * b.radiusX, b.z + sz * b.radiusZ])
84
- }
85
- else {
86
- for (const [sx, sz] of [[1, 0], [-1, 0], [0, 1], [0, -1]]) pts.push([b.x + sx * b.radiusX, b.z + sz * b.radiusZ])
87
- }
88
- void pts
89
- // 可靠估计:读相机 dolly 推可视跨度,与领地尺寸对比
90
- const aspect = rect.width / rect.height
91
- const spanX = 2 * 613 * aspect * s.dolly * 0.82
92
- const spanZ = 2 * 950 * s.dolly * 0.82
93
- return {
94
- dolly: +s.dolly.toFixed(2),
95
- rx: Math.round(b.radiusX), rz: Math.round(b.radiusZ),
96
- spanX: Math.round(spanX), spanZ: Math.round(spanZ),
97
- fitsX: spanX > b.radiusX * 2.15, fitsZ: spanZ > b.radiusZ * 2.15,
98
- }
99
- })
100
- console.log('viewport fit:', JSON.stringify(fit))
101
- console.log('errors:', errors.slice(0, 5))
102
- await page.screenshot({ path: 'docs/audit/screenshots/autoframe.png' })
103
- await browser.close()
@@ -1,11 +0,0 @@
1
- /** 可用性探测全览:模拟 GET /api/workshop/harnesses 的核心输出 */
2
- import { checkHarnessAvailability } from '../server/services/workshop/agents/harness-availability'
3
- import { harnessMetas } from '../server/services/workshop/agents/registry'
4
-
5
- async function main(): Promise<void> {
6
- for (const m of harnessMetas()) {
7
- const a = await checkHarnessAvailability(m.id)
8
- console.log(`${a.id.padEnd(10)} available=${String(a.available).padEnd(5)} inprocess=${String(a.inprocess).padEnd(5)} path=${a.resolvedPath ?? a.error ?? '-'}`)
9
- }
10
- }
11
- void main()