agentworkshop 0.7.34 → 0.7.37

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (944) hide show
  1. package/.output/.AgentWorkShop/aml-python/aml_eval.py +171 -0
  2. package/.output/.AgentWorkShop/aml-python/amlkit.py +120 -0
  3. package/.output/.AgentWorkShop/aml-python/requirements.txt +7 -0
  4. package/.output/.AgentWorkShop/aml-python/train-example.py +92 -0
  5. package/.output/.AgentWorkShop/schema.json +2 -1
  6. package/.output/nitro.json +1 -1
  7. package/.output/public/_nuxt/{DLljr7g0.js → 45zuyAso.js} +1 -1
  8. package/.output/public/_nuxt/4sIEbgcl.js +42 -0
  9. package/.output/public/_nuxt/8NMOXZOV.js +1 -0
  10. package/.output/public/_nuxt/BCGafdXT.js +2 -0
  11. package/.output/public/_nuxt/BDNMzG2s2.js +1 -0
  12. package/.output/public/_nuxt/{C-mDhyEd.js → BDmh31hl.js} +1 -1
  13. package/.output/public/_nuxt/BFkgkW8u.js +4 -0
  14. package/.output/public/_nuxt/BG8sCcwx.js +14 -0
  15. package/.output/public/_nuxt/{D8CqF0yy.js → BHA40aHa.js} +1 -1
  16. package/.output/public/_nuxt/BJHKLJJU.js +1 -0
  17. package/.output/public/_nuxt/{DoTdlVVe2.js → BN6iuJEg2.js} +1 -1
  18. package/.output/public/_nuxt/BNT8gYU92.js +4 -0
  19. package/.output/public/_nuxt/BU83-NnX.js +106 -0
  20. package/.output/public/_nuxt/BYhEUx8t.js +17 -0
  21. package/.output/public/_nuxt/BzHEilTt.js +1 -0
  22. package/.output/public/_nuxt/{Ct-WOVr4.js → C3J6FYKa.js} +1 -1
  23. package/.output/public/_nuxt/C3gwHTz0.js +1 -0
  24. package/.output/public/_nuxt/C4DWUZ6d2.js +1 -0
  25. package/.output/public/_nuxt/C5gUkRwn.js +1 -0
  26. package/.output/public/_nuxt/CClOy-Hz2.js +1 -0
  27. package/.output/public/_nuxt/{CUXCQXjG.js → CM12FuB42.js} +1 -1
  28. package/.output/public/_nuxt/{BSCpFtzG.js → CSkxz2NX.js} +1 -1
  29. package/.output/public/_nuxt/CWoJjWmZ.js +1 -0
  30. package/.output/public/_nuxt/CY9LbPCI.js +1 -0
  31. package/.output/public/_nuxt/CYWVXZTS.js +7 -0
  32. package/.output/public/_nuxt/CZiw7sEV.js +1 -0
  33. package/.output/public/_nuxt/C_OLzD09.js +1 -0
  34. package/.output/public/_nuxt/C__m4EhR.js +1 -0
  35. package/.output/public/_nuxt/Cbq-mryP.js +1 -0
  36. package/.output/public/_nuxt/{C4OAdbVK2.js → Cc_9VzD42.js} +1 -1
  37. package/.output/public/_nuxt/{BASN8nZ0.js → CdPzkOMV.js} +1 -1
  38. package/.output/public/_nuxt/Cec0Ua3F.js +1 -0
  39. package/.output/public/_nuxt/{DYKVPzN-.js → CoNpEq5X.js} +1 -1
  40. package/.output/public/_nuxt/CojCTLKD.js +1 -0
  41. package/.output/public/_nuxt/{B7wL3pDk.js → Crod5z2f.js} +1 -1
  42. package/.output/public/_nuxt/CzlMDL5H.js +13 -0
  43. package/.output/public/_nuxt/{G0qIw7Gq2.js → D0ZBQrN_2.js} +1 -1
  44. package/.output/public/_nuxt/{Lp7Ll94I.js → D1YDxZpZ.js} +1 -1
  45. package/.output/public/_nuxt/{Bc0AmjfT.js → D20Yamr4.js} +1 -1
  46. package/.output/public/_nuxt/D6uzXueg.js +2 -0
  47. package/.output/public/_nuxt/D9Oidm5I.js +1 -0
  48. package/.output/public/_nuxt/DAe0h2MB.js +1 -0
  49. package/.output/public/_nuxt/DBHNsT1Y.js +23 -0
  50. package/.output/public/_nuxt/DDShH71m.js +1 -0
  51. package/.output/public/_nuxt/DDgJcSET.js +19 -0
  52. package/.output/public/_nuxt/DHFrCUxA2.js +13 -0
  53. package/.output/public/_nuxt/{BcrN7QEl2.js → DIaZ2PTo2.js} +1 -1
  54. package/.output/public/_nuxt/DPnwL14Y.js +1 -0
  55. package/.output/public/_nuxt/DR12_WCA.js +3 -0
  56. package/.output/public/_nuxt/{B9nXmjSB.js → DUrecWPx.js} +4 -4
  57. package/.output/public/_nuxt/DVsjtsvZ2.js +1 -0
  58. package/.output/public/_nuxt/DYr1VMiQ.js +6 -0
  59. package/.output/public/_nuxt/DZtm4l-P2.js +1 -0
  60. package/.output/public/_nuxt/DdD9mCHM.js +1 -0
  61. package/.output/public/_nuxt/DeJykBFf.js +9 -0
  62. package/.output/public/_nuxt/{DoMxCWN52.js → DeyBFhKH2.js} +1 -1
  63. package/.output/public/_nuxt/DkGQ7lnb2.js +1 -0
  64. package/.output/public/_nuxt/DmqknNvV.js +18 -0
  65. package/.output/public/_nuxt/DnUuIR83.js +1 -0
  66. package/.output/public/_nuxt/DrYV5i68.js +1 -0
  67. package/.output/public/_nuxt/{B5S_UyaC.js → DtYHUi5Z.js} +1 -1
  68. package/.output/public/_nuxt/Dz_Q3Lpw2.js +1 -0
  69. package/.output/public/_nuxt/DzbFpZRk.js +3 -0
  70. package/.output/public/_nuxt/HBLJ-wei.js +1 -0
  71. package/.output/public/_nuxt/JCoYF4IJ.js +31 -0
  72. package/.output/public/_nuxt/JTLM-kqr2.js +1 -0
  73. package/.output/public/_nuxt/{BeIfu4N3.js → KZQX7xoM.js} +2 -2
  74. package/.output/public/_nuxt/S_fVQwJK.js +1 -0
  75. package/.output/public/_nuxt/TownView.0oLiQgTC.css +1 -0
  76. package/.output/public/_nuxt/YnQxK3eG.js +1 -0
  77. package/.output/public/_nuxt/_id_.D-SYuyZb.css +1 -0
  78. package/.output/public/_nuxt/_id_.hma_BU6T.css +1 -0
  79. package/.output/public/_nuxt/_wsId_.B12v3PhY.css +1 -0
  80. package/.output/public/_nuxt/aLLjF2K-2.js +1 -0
  81. package/.output/public/_nuxt/aWWIh8YL.js +24 -0
  82. package/.output/public/_nuxt/ahgEJu2R.js +1 -0
  83. package/.output/public/_nuxt/aml.COEKNNqK.css +1 -0
  84. package/.output/public/_nuxt/builds/latest.json +1 -1
  85. package/.output/public/_nuxt/builds/meta/a66fdef7-dcfd-453b-b1f6-543c7dfd98d5.json +1 -0
  86. package/.output/public/_nuxt/daq.B3265ZDn.css +1 -0
  87. package/.output/public/_nuxt/dcw.DLYZqEhT.css +1 -0
  88. package/.output/public/_nuxt/default.DE_vT238.css +1 -0
  89. package/.output/public/_nuxt/entry.BB-Eeh-J.css +1 -0
  90. package/.output/public/_nuxt/jZsY8yYz.js +1 -0
  91. package/.output/public/_nuxt/logs.CqFyMrJw.css +1 -0
  92. package/.output/public/_nuxt/pages.ooEzrMm9.css +1 -0
  93. package/.output/public/_nuxt/pdk8jLGT.js +1 -0
  94. package/.output/public/_nuxt/plugins.5e5chZ67.css +1 -0
  95. package/.output/public/_nuxt/pz2JDAM7.js +2 -0
  96. package/.output/public/_nuxt/settings.Dm3M0RLy.css +1 -0
  97. package/.output/public/_nuxt/town.DKIAhKnx.css +1 -0
  98. package/.output/public/_nuxt/users.CXnP2E08.css +1 -0
  99. package/.output/public/_nuxt/vRTjoWqd.js +1 -0
  100. package/.output/public/_nuxt/workshop.Jk5HxWPE.css +1 -0
  101. package/.output/public/_nuxt/zIGh7R49.js +75 -0
  102. package/.output/public/_nuxt/zq5t1vyX.js +1 -0
  103. package/.output/server/chunks/_/character-asset.repo.mjs +1 -1
  104. package/.output/server/chunks/_/entity.mjs +174 -0
  105. package/.output/server/chunks/_/entity.mjs.map +1 -0
  106. package/.output/server/chunks/_/env-manager.mjs +162 -0
  107. package/.output/server/chunks/_/env-manager.mjs.map +1 -0
  108. package/.output/server/chunks/_/host-bindings.mjs +1 -1
  109. package/.output/server/chunks/_/nitro.mjs +1523 -1027
  110. package/.output/server/chunks/_/nitro.mjs.map +1 -1
  111. package/.output/server/chunks/_/scene-layout.repo.mjs +1 -1
  112. package/.output/server/chunks/build/{TownView-BdHnAilw.mjs → TownView-jVazYOjN.mjs} +141 -141
  113. package/.output/server/chunks/build/{TownView-BdHnAilw.mjs.map → TownView-jVazYOjN.mjs.map} +1 -1
  114. package/.output/server/chunks/build/{_id_-Cb845FHR.mjs → _id_-CfVosNg3.mjs} +136 -136
  115. package/.output/server/chunks/build/{_id_-Cb845FHR.mjs.map → _id_-CfVosNg3.mjs.map} +1 -1
  116. package/.output/server/chunks/build/{_id_-fadFPl2i.mjs → _id_-Hwr4rZpr.mjs} +32 -32
  117. package/.output/server/chunks/build/{_id_-fadFPl2i.mjs.map → _id_-Hwr4rZpr.mjs.map} +1 -1
  118. package/.output/server/chunks/build/{_wsId_-CTZswnm5.mjs → _wsId_-BVg3bB77.mjs} +175 -165
  119. package/.output/server/chunks/build/{_wsId_-CTZswnm5.mjs.map → _wsId_-BVg3bB77.mjs.map} +1 -1
  120. package/.output/server/chunks/build/aml-BCSJCdX7.mjs +588 -0
  121. package/.output/server/chunks/build/aml-BCSJCdX7.mjs.map +1 -0
  122. package/.output/server/chunks/build/{daq-BvihjQyW.mjs → daq-C03Uu5UE.mjs} +108 -106
  123. package/.output/server/chunks/build/daq-C03Uu5UE.mjs.map +1 -0
  124. package/.output/server/chunks/build/{dcw-Ks2vJ4PF.mjs → dcw-6vEYVeje.mjs} +44 -44
  125. package/.output/server/chunks/build/{dcw-Ks2vJ4PF.mjs.map → dcw-6vEYVeje.mjs.map} +1 -1
  126. package/.output/server/chunks/build/{default-GgHt4O2R.mjs → default-hseyOqBT.mjs} +30 -27
  127. package/.output/server/chunks/build/{default-GgHt4O2R.mjs.map → default-hseyOqBT.mjs.map} +1 -1
  128. package/.output/server/chunks/build/{logs-CYBhkQwh.mjs → logs-B-xhuqln.mjs} +35 -35
  129. package/.output/server/chunks/build/{logs-CYBhkQwh.mjs.map → logs-B-xhuqln.mjs.map} +1 -1
  130. package/.output/server/chunks/build/{pages-C-6BRtv8.mjs → pages-BO7yZsXA.mjs} +18 -27
  131. package/.output/server/chunks/build/pages-BO7yZsXA.mjs.map +1 -0
  132. package/.output/server/chunks/build/{plugins-dZRegC7m.mjs → plugins-CUWmMdyt.mjs} +17 -17
  133. package/.output/server/chunks/build/{plugins-dZRegC7m.mjs.map → plugins-CUWmMdyt.mjs.map} +1 -1
  134. package/.output/server/chunks/build/{settings-CgDLkP3s.mjs → settings-DoQ2Oq3P.mjs} +43 -43
  135. package/.output/server/chunks/build/{settings-CgDLkP3s.mjs.map → settings-DoQ2Oq3P.mjs.map} +1 -1
  136. package/.output/server/chunks/build/{town-DJ-V5G9U.mjs → town-BOl6hs9B.mjs} +7 -7
  137. package/.output/server/chunks/build/{town-DJ-V5G9U.mjs.map → town-BOl6hs9B.mjs.map} +1 -1
  138. package/.output/server/chunks/build/useDaqStream-CIBaiGAl.mjs +1 -1
  139. package/.output/server/chunks/build/useDcwStream-CBbiYnWe.mjs +1 -1
  140. package/.output/server/chunks/build/{useWorkshopWs-CprkZEdq.mjs → useWorkshopWs-C_I7q9As.mjs} +110 -32
  141. package/.output/server/chunks/build/{useWorkshopWs-CprkZEdq.mjs.map → useWorkshopWs-C_I7q9As.mjs.map} +1 -1
  142. package/.output/server/chunks/build/{users-4nzxTjFT.mjs → users-fohSmF-J.mjs} +6 -6
  143. package/.output/server/chunks/build/{users-4nzxTjFT.mjs.map → users-fohSmF-J.mjs.map} +1 -1
  144. package/.output/server/chunks/build/{workshop-81xhz368.mjs → workshop-DX5-ldc4.mjs} +15 -15
  145. package/.output/server/chunks/build/{workshop-81xhz368.mjs.map → workshop-DX5-ldc4.mjs.map} +1 -1
  146. package/.output/server/chunks/routes/api/workshop/agent-tools/index.post.mjs +21 -8
  147. package/.output/server/chunks/routes/api/workshop/agent-tools/index.post.mjs.map +1 -1
  148. package/.output/server/chunks/routes/api/workshop/aml/datasets/_id/preview.get.mjs +1 -1
  149. package/.output/server/chunks/routes/api/workshop/aml/datasets/_id_.delete.mjs +58 -0
  150. package/.output/server/chunks/routes/api/workshop/aml/datasets/_id_.delete.mjs.map +1 -0
  151. package/.output/server/chunks/routes/api/workshop/aml/datasets/_id_.get.mjs +27 -6
  152. package/.output/server/chunks/routes/api/workshop/aml/datasets/_id_.get.mjs.map +1 -1
  153. package/.output/server/chunks/routes/api/workshop/aml/datasets/_id_.patch.mjs +49 -0
  154. package/.output/server/chunks/routes/api/workshop/aml/datasets/_id_.patch.mjs.map +1 -0
  155. package/.output/server/chunks/routes/api/workshop/aml/entities/prune.post.mjs +45 -0
  156. package/.output/server/chunks/routes/api/workshop/aml/entities/prune.post.mjs.map +1 -0
  157. package/.output/server/chunks/routes/api/workshop/aml/env/recheck.post.mjs +30 -0
  158. package/.output/server/chunks/routes/api/workshop/aml/env/recheck.post.mjs.map +1 -0
  159. package/.output/server/chunks/routes/api/workshop/aml/env/uv.post.mjs +40 -0
  160. package/.output/server/chunks/routes/api/workshop/aml/env/uv.post.mjs.map +1 -0
  161. package/.output/server/chunks/routes/api/workshop/aml/env/venv.post.mjs +42 -0
  162. package/.output/server/chunks/routes/api/workshop/aml/env/venv.post.mjs.map +1 -0
  163. package/.output/server/chunks/routes/api/workshop/aml/index.get.mjs +1 -1
  164. package/.output/server/chunks/routes/api/workshop/aml/index.post.mjs +1 -1
  165. package/.output/server/chunks/routes/api/workshop/aml/index2.get.mjs +4 -22
  166. package/.output/server/chunks/routes/api/workshop/aml/index2.get.mjs.map +1 -1
  167. package/.output/server/chunks/routes/api/workshop/aml/index2.post.mjs +1 -1
  168. package/.output/server/chunks/routes/api/workshop/aml/index3.get.mjs +4 -16
  169. package/.output/server/chunks/routes/api/workshop/aml/index3.get.mjs.map +1 -1
  170. package/.output/server/chunks/routes/api/workshop/aml/index4.get.mjs +19 -34
  171. package/.output/server/chunks/routes/api/workshop/aml/index4.get.mjs.map +1 -1
  172. package/.output/server/chunks/routes/api/workshop/aml/index5.get.mjs +41 -0
  173. package/.output/server/chunks/routes/api/workshop/aml/index5.get.mjs.map +1 -0
  174. package/.output/server/chunks/routes/api/workshop/aml/index6.get.mjs +62 -0
  175. package/.output/server/chunks/routes/api/workshop/aml/index6.get.mjs.map +1 -0
  176. package/.output/server/chunks/routes/api/workshop/aml/jobs/_id/cancel.post.mjs +1 -1
  177. package/.output/server/chunks/routes/api/workshop/aml/jobs/_id/logs.get.mjs +1 -1
  178. package/.output/server/chunks/routes/api/workshop/aml/jobs/_id/retry.post.mjs +1 -1
  179. package/.output/server/chunks/routes/api/workshop/aml/jobs/_id_.delete.mjs +63 -0
  180. package/.output/server/chunks/routes/api/workshop/aml/jobs/_id_.delete.mjs.map +1 -0
  181. package/.output/server/chunks/routes/api/workshop/aml/models/_id/predict.post.mjs +1 -1
  182. package/.output/server/chunks/routes/api/workshop/aml/models/_id/promote.post.mjs +1 -1
  183. package/.output/server/chunks/routes/api/workshop/aml/models/_id_.delete.mjs +54 -0
  184. package/.output/server/chunks/routes/api/workshop/aml/models/_id_.delete.mjs.map +1 -0
  185. package/.output/server/chunks/routes/api/workshop/aml/models/_id_.patch.mjs +46 -0
  186. package/.output/server/chunks/routes/api/workshop/aml/models/_id_.patch.mjs.map +1 -0
  187. package/.output/server/chunks/routes/api/workshop/assets/index.post.mjs +1 -1
  188. package/.output/server/chunks/routes/api/workshop/assets/index2.post.mjs +1 -1
  189. package/.output/server/chunks/routes/api/workshop/channel-templates/_id/instantiate.post.mjs +2 -2
  190. package/.output/server/chunks/routes/api/workshop/channels/_id/activate.post.mjs +1 -1
  191. package/.output/server/chunks/routes/api/workshop/channels/_id/index.post.mjs +1 -1
  192. package/.output/server/chunks/routes/api/workshop/channels/_id/index.put.mjs +1 -1
  193. package/.output/server/chunks/routes/api/workshop/channels/_id/index4.get.mjs +1 -1
  194. package/.output/server/chunks/routes/api/workshop/channels/_id/terminals.get.mjs +1 -1
  195. package/.output/server/chunks/routes/api/workshop/channels/index.get.mjs +1 -1
  196. package/.output/server/chunks/routes/api/workshop/channels.post.mjs +4 -4
  197. package/.output/server/chunks/routes/api/workshop/daq/_id/bind.post.mjs +1 -1
  198. package/.output/server/chunks/routes/api/workshop/daq/_id/bindings.put.mjs +1 -1
  199. package/.output/server/chunks/routes/api/workshop/daq/_id/samples.get.mjs +1 -1
  200. package/.output/server/chunks/routes/api/workshop/daq/_id/test.post.mjs +1 -1
  201. package/.output/server/chunks/routes/api/workshop/daq/_id_.delete.mjs +1 -1
  202. package/.output/server/chunks/routes/api/workshop/daq/_id_.patch.mjs +1 -1
  203. package/.output/server/chunks/routes/api/workshop/daq/controller.post.mjs +1 -1
  204. package/.output/server/chunks/routes/api/workshop/daq/index.post.mjs +1 -1
  205. package/.output/server/chunks/routes/api/workshop/daq/infra/reconnect.post.mjs +1 -1
  206. package/.output/server/chunks/routes/api/workshop/daq/infra.get.mjs +1 -1
  207. package/.output/server/chunks/routes/api/workshop/daq/templates/_key_.delete.mjs +1 -1
  208. package/.output/server/chunks/routes/api/workshop/daq/templates/_key_.patch.mjs +1 -1
  209. package/.output/server/chunks/routes/api/workshop/daq/test-driver.post.mjs +1 -1
  210. package/.output/server/chunks/routes/api/workshop/dcw/_id/bind.post.mjs +1 -1
  211. package/.output/server/chunks/routes/api/workshop/dcw/_id/bindings.put.mjs +1 -1
  212. package/.output/server/chunks/routes/api/workshop/dcw/_id/param-ledger.get.mjs +1 -1
  213. package/.output/server/chunks/routes/api/workshop/dcw/_id/read.post.mjs +1 -1
  214. package/.output/server/chunks/routes/api/workshop/dcw/_id/test.post.mjs +1 -1
  215. package/.output/server/chunks/routes/api/workshop/dcw/_id/write.post.mjs +1 -1
  216. package/.output/server/chunks/routes/api/workshop/dcw/_id_.delete.mjs +1 -1
  217. package/.output/server/chunks/routes/api/workshop/dcw/_id_.patch.mjs +1 -1
  218. package/.output/server/chunks/routes/api/workshop/dcw/controller.post.mjs +1 -1
  219. package/.output/server/chunks/routes/api/workshop/dcw/index.get.mjs +1 -1
  220. package/.output/server/chunks/routes/api/workshop/dcw/index.post.mjs +1 -1
  221. package/.output/server/chunks/routes/api/workshop/dcw/index2.get.mjs +1 -1
  222. package/.output/server/chunks/routes/api/workshop/dcw/index2.post.mjs +1 -1
  223. package/.output/server/chunks/routes/api/workshop/dcw/index3.get.mjs +1 -1
  224. package/.output/server/chunks/routes/api/workshop/dcw/index3.post.mjs +1 -1
  225. package/.output/server/chunks/routes/api/workshop/dcw/index4.get.mjs +1 -1
  226. package/.output/server/chunks/routes/api/workshop/dcw/index4.post.mjs +1 -1
  227. package/.output/server/chunks/routes/api/workshop/dcw/index5.get.mjs +1 -1
  228. package/.output/server/chunks/routes/api/workshop/dcw/journal/node/_nodeId/rollback.post.mjs +1 -1
  229. package/.output/server/chunks/routes/api/workshop/dcw/line/query.get.mjs +1 -1
  230. package/.output/server/chunks/routes/api/workshop/dcw/lines/_id/start.post.mjs +1 -1
  231. package/.output/server/chunks/routes/api/workshop/dcw/lines/_id/stop.post.mjs +1 -1
  232. package/.output/server/chunks/routes/api/workshop/dcw/lines/_id_.delete.mjs +1 -1
  233. package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id/judge.post.mjs +1 -1
  234. package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id/rollback.post.mjs +1 -1
  235. package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id/series.get.mjs +1 -1
  236. package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id_.get.mjs +1 -1
  237. package/.output/server/chunks/routes/api/workshop/dcw/products/_id_.delete.mjs +1 -1
  238. package/.output/server/chunks/routes/api/workshop/dcw/products/_id_.patch.mjs +1 -1
  239. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/apply.post.mjs +1 -1
  240. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/mark-good.post.mjs +1 -1
  241. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/rollback-good.post.mjs +1 -1
  242. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id_.delete.mjs +1 -1
  243. package/.output/server/chunks/routes/api/workshop/dcw/runs/_id/close.post.mjs +1 -1
  244. package/.output/server/chunks/routes/api/workshop/dcw/runs/_id/data.get.mjs +1 -1
  245. package/.output/server/chunks/routes/api/workshop/dcw/runs/_id/rollback.post.mjs +1 -1
  246. package/.output/server/chunks/routes/api/workshop/dcw/templates/_key_.delete.mjs +1 -1
  247. package/.output/server/chunks/routes/api/workshop/dcw/templates/_key_.patch.mjs +1 -1
  248. package/.output/server/chunks/routes/api/workshop/dcw/test-driver.post.mjs +1 -1
  249. package/.output/server/chunks/routes/api/workshop/device-twins/_id_.delete.mjs +1 -1
  250. package/.output/server/chunks/routes/api/workshop/device-twins/_id_.patch.mjs +1 -1
  251. package/.output/server/chunks/routes/api/workshop/harnesses/_id/providers.get.mjs +1 -1
  252. package/.output/server/chunks/routes/api/workshop/harnesses.get.mjs +1 -1
  253. package/.output/server/chunks/routes/api/workshop/hitl/pending.get.mjs +1 -1
  254. package/.output/server/chunks/routes/api/workshop/hitl/respond.post.mjs +1 -1
  255. package/.output/server/chunks/routes/api/workshop/index.put.mjs +1 -1
  256. package/.output/server/chunks/routes/api/workshop/index2.get.mjs +12 -1
  257. package/.output/server/chunks/routes/api/workshop/index2.get.mjs.map +1 -1
  258. package/.output/server/chunks/routes/api/workshop/index3.post.mjs +1 -1
  259. package/.output/server/chunks/routes/api/workshop/index4.post.mjs +1 -1
  260. package/.output/server/chunks/routes/api/workshop/index5.get.mjs +1 -1
  261. package/.output/server/chunks/routes/api/workshop/index5.post.mjs +1 -1
  262. package/.output/server/chunks/routes/api/workshop/index6.get.mjs +1 -1
  263. package/.output/server/chunks/routes/api/workshop/index6.post.mjs +1 -1
  264. package/.output/server/chunks/routes/api/workshop/plugins/_name/disable.post.mjs +1 -1
  265. package/.output/server/chunks/routes/api/workshop/plugins/_name/enable.post.mjs +1 -1
  266. package/.output/server/chunks/routes/api/workshop/scene/layouts/_channelId_.delete.mjs +1 -1
  267. package/.output/server/chunks/routes/api/workshop/scene/layouts/_channelId_.put.mjs +1 -1
  268. package/.output/server/chunks/routes/api/workshop/teams/_id/deploy.post.mjs +1 -1
  269. package/.output/server/chunks/routes/api/workshop/teams/_id/index.put.mjs +1 -1
  270. package/.output/server/chunks/routes/api/workshop/teams/_id/index2.get.mjs +1 -1
  271. package/.output/server/chunks/routes/api/workshop/workspaces/_id/channel-templates/_tplId_.post.mjs +2 -2
  272. package/.output/server/chunks/routes/renderer.mjs +2 -2
  273. package/.output/server/chunks/virtual/entry.mjs +103 -17
  274. package/.output/server/chunks/virtual/precomputed.mjs +1 -1
  275. package/.output/server/package.json +1 -1
  276. package/README-zh.md +578 -507
  277. package/README.md +125 -51
  278. package/app/assets/css/main.css +329 -22
  279. package/app/components/AppHeader.vue +5 -4
  280. package/app/components/AppSidebar.vue +5 -4
  281. package/app/components/AwChart.vue +17 -0
  282. package/app/components/workshop/AgentLanesView.vue +2 -2
  283. package/app/components/workshop/ChannelSessionList.vue +3 -3
  284. package/app/components/workshop/CommandPalette.vue +1 -2
  285. package/app/components/workshop/Composer.vue +4 -4
  286. package/app/components/workshop/DaqNodeRow.vue +20 -1
  287. package/app/components/workshop/EventBlock.vue +3 -3
  288. package/app/components/workshop/MentionHoverCard.vue +1 -1
  289. package/app/components/workshop/MultiChannelView.vue +1 -1
  290. package/app/components/workshop/TaskBoardView.vue +5 -5
  291. package/app/components/workshop/TranscriptTimeline.vue +3 -3
  292. package/app/components/workshop/blocks/ClusterRoute.vue +3 -3
  293. package/app/components/workshop/blocks/ClusterStream.vue +1 -1
  294. package/app/components/workshop/blocks/ClusterTool.vue +1 -1
  295. package/app/components/workshop/lanes/LaneBlocks.vue +5 -2
  296. package/app/components/workshop/town/TownView.vue +0 -7
  297. package/app/composables/workshop/useClusteredBlocks.ts +22 -3
  298. package/app/composables/workshop/useEscClose.ts +44 -0
  299. package/app/config/index.ts +2 -1
  300. package/app/layouts/default.vue +25 -8
  301. package/app/pages/aml/index.vue +626 -4
  302. package/app/pages/daq/[id].vue +1 -1
  303. package/app/pages/daq/index.vue +10 -12
  304. package/app/pages/dcw/[id].vue +2 -2
  305. package/app/pages/dcw/index.vue +7 -11
  306. package/app/pages/index.vue +24 -6
  307. package/app/pages/logs/index.vue +2 -6
  308. package/app/pages/plugins/index.vue +1 -1
  309. package/app/pages/settings.vue +2 -2
  310. package/app/pages/town.vue +0 -2
  311. package/app/pages/users.vue +1 -1
  312. package/app/pages/workshop/index.vue +2 -2
  313. package/app/plugins/esc-close.client.ts +31 -0
  314. package/app/stores/workshop/events.ts +186 -36
  315. package/bin/aw.mjs +7 -2
  316. package/cli/aw.mjs +19 -34
  317. package/cli/commands/build.mjs +18 -1
  318. package/cli/commands/config.mjs +2 -0
  319. package/cli/commands/plugin.mjs +45 -18
  320. package/cli/commands/register.mjs +6 -2
  321. package/cli/commands/status.mjs +2 -1
  322. package/cli/commands/update.mjs +1 -1
  323. package/cli/commands/version.mjs +1 -1
  324. package/cli/core/args.mjs +76 -4
  325. package/cli/core/help.mjs +3 -1
  326. package/cli/core/meta.mjs +38 -0
  327. package/cli/core/post-build.mjs +96 -0
  328. package/cli/core/registry.mjs +6 -3
  329. package/config.yml +28 -26
  330. package/docs/aml.md +99 -0
  331. package/docs/cli.en.md +445 -0
  332. package/docs/cli.md +410 -220
  333. package/docs/full-test-plan.md +174 -0
  334. package/docs/multi-harness-architecture.md +248 -0
  335. package/docs/plugins.en.md +534 -0
  336. package/docs/plugins.md +531 -179
  337. package/docs/sdk.en.md +922 -0
  338. package/docs/sdk.md +725 -129
  339. package/i18n/dicts/aml.json +43 -1
  340. package/i18n/locales/en.ts +1928 -1885
  341. package/i18n/locales/zh-CN.ts +1928 -1885
  342. package/nuxt.config.ts +27 -2
  343. package/package.json +164 -153
  344. package/scripts/.mimosa/hook-status/sess_aeaecb58-8833-4b83-b93c-050467d21e03-d944d71bb3.json +14 -0
  345. package/scripts/_audit/aml-layout-diag.mjs +83 -0
  346. package/scripts/_audit/bump-version.mjs +51 -0
  347. package/scripts/_audit/channel-inspect.mjs +49 -0
  348. package/scripts/_audit/cleanup-apply.mjs +89 -0
  349. package/scripts/_audit/cleanup-plan.mjs +82 -0
  350. package/scripts/_audit/contrast-check.mjs +43 -0
  351. package/scripts/_audit/dcw-unrecorded-write.ts +1 -1
  352. package/scripts/_audit/design-shots.mjs +145 -0
  353. package/scripts/_audit/docs-font-probe.mjs +68 -0
  354. package/scripts/_audit/docs-probe.mjs +107 -0
  355. package/scripts/_audit/docs-shots.mjs +171 -0
  356. package/scripts/_audit/docs-v3-verify.mjs +255 -0
  357. package/scripts/_audit/docs-vue-lint.mjs +81 -0
  358. package/scripts/_audit/docs-vue-lint2.mjs +91 -0
  359. package/scripts/_audit/exp-cost-scaling.mjs +4 -1
  360. package/scripts/_audit/exp-envelope-and-png.mjs +2 -1
  361. package/scripts/_audit/exp-sweep-fairness.mjs +4 -2
  362. package/scripts/_audit/fix-settings-count.mjs +57 -0
  363. package/scripts/_audit/glass-verify.mjs +155 -0
  364. package/scripts/_audit/hydration-diff.mjs +104 -0
  365. package/scripts/_audit/hydration-head.mjs +36 -0
  366. package/scripts/_audit/hydration-probe.mjs +59 -0
  367. package/scripts/_audit/lead-matrix-test.mjs +172 -0
  368. package/scripts/_audit/plc-agent-task.mjs +74 -0
  369. package/scripts/_audit/plc-clean-scenario.mjs +434 -0
  370. package/scripts/_audit/plc-clean-shots.mjs +161 -0
  371. package/scripts/_audit/plc-fc10-probe.mjs +30 -0
  372. package/scripts/_audit/probe-binding.mjs +114 -103
  373. package/scripts/_audit/review-fix-verify.mjs +158 -0
  374. package/scripts/_audit/seed-demo.mjs +165 -0
  375. package/scripts/_audit/town-focus-shot.mjs +129 -0
  376. package/scripts/_audit/town-reposition.mjs +85 -0
  377. package/scripts/_audit/ts-resolve-hook.mjs +57 -22
  378. package/scripts/_audit/verify-cleanup.mjs +67 -0
  379. package/scripts/_audit/verify-release-pack.mjs +82 -0
  380. package/scripts/_audit/watchdog-recovery-test.mjs +127 -0
  381. package/scripts/_dbg-audit-all-pages.mjs +43 -43
  382. package/scripts/_dbg-configroot-audit.mjs +84 -84
  383. package/scripts/_dbg-daq-intervals-func.mjs +94 -94
  384. package/scripts/_dbg-daq-rowstyle-verify.mjs +112 -112
  385. package/scripts/_dbg-groups-ui-verify.mjs +122 -122
  386. package/scripts/_dbg-harness-e2e.mjs +92 -92
  387. package/scripts/_dbg-harness-ui-e2e.py +97 -97
  388. package/scripts/_dbg-hitl-timeout-e2e.mjs +93 -93
  389. package/scripts/_dbg-multiharness-live-e2e.mjs +254 -254
  390. package/scripts/_dbg-opslog-agent-e2e.mjs +194 -194
  391. package/scripts/_dbg-opt-team-e2e.mjs +133 -133
  392. package/scripts/_dbg-recipe-e2e.mjs +176 -176
  393. package/scripts/_dbg-recipe-stale-e2e.mjs +135 -135
  394. package/scripts/_dbg-render-perf.mjs +142 -142
  395. package/scripts/_dbg-render-regression.mjs +130 -130
  396. package/scripts/_dbg-town-smoke.mjs +54 -54
  397. package/scripts/aw-start-smoke.mjs +27 -8
  398. package/scripts/check-docs-sync.mjs +367 -0
  399. package/scripts/e2e-full-closedloop.mjs +36 -18
  400. package/scripts/production-closed-loop-e2e.mjs +300 -303
  401. package/scripts/test-cli-exit.mjs +129 -21
  402. package/scripts/test-daq-frame-race.mjs +144 -96
  403. package/scripts/test-events-index.mjs +176 -0
  404. package/scripts/test-lru.mjs +34 -11
  405. package/scripts/test-memory-month-query.mjs +11 -3
  406. package/scripts/test-plugin-hardening.mjs +7 -2
  407. package/scripts/test-plugin-lifecycle.mjs +173 -0
  408. package/scripts/test-rollback-index.mjs +76 -18
  409. package/scripts/test-sdk-surface.mjs +6 -3
  410. package/sdk/client.mjs +16 -7
  411. package/sdk/context.mjs +21 -9
  412. package/sdk/examples/line-sentinel/client.mjs +13 -6
  413. package/sdk/examples/line-sentinel/index.mjs +5 -2
  414. package/sdk/examples/ops-notifier/client.mjs +3 -1
  415. package/sdk/examples/sample-insight/client.mjs +4 -2
  416. package/sdk/index.d.mts +133 -16
  417. package/sdk/index.mjs +3 -2
  418. package/sdk/lifecycle.mjs +8 -3
  419. package/server/api/workshop/agent-tools/bindings/index.post.ts +22 -7
  420. package/server/api/workshop/aml/datasets/[id].delete.ts +39 -0
  421. package/server/api/workshop/aml/datasets/[id].get.ts +31 -9
  422. package/server/api/workshop/aml/datasets/[id].patch.ts +30 -0
  423. package/server/api/workshop/aml/entities/index.get.ts +13 -0
  424. package/server/api/workshop/aml/entities/prune.post.ts +28 -0
  425. package/server/api/workshop/aml/env/index.get.ts +13 -0
  426. package/server/api/workshop/aml/env/recheck.post.ts +14 -0
  427. package/server/api/workshop/aml/env/uv.post.ts +21 -0
  428. package/server/api/workshop/aml/env/venv.post.ts +24 -0
  429. package/server/api/workshop/aml/index.get.ts +14 -1
  430. package/server/api/workshop/aml/jobs/[id].delete.ts +44 -0
  431. package/server/api/workshop/aml/models/[id].delete.ts +35 -0
  432. package/server/api/workshop/aml/models/[id].patch.ts +30 -0
  433. package/server/services/workshop/agents/agent-interface.ts +3 -0
  434. package/server/services/workshop/agents/codex-agent.ts +4 -7
  435. package/server/services/workshop/agents/dsh-agent.ts +4 -7
  436. package/server/services/workshop/agents/opencode-agent.ts +5 -7
  437. package/server/services/workshop/aml/aml.repo.ts +18 -0
  438. package/server/services/workshop/aml/dataset-builder.ts +4 -0
  439. package/server/services/workshop/aml/entity.ts +365 -0
  440. package/server/services/workshop/aml/env-manager.ts +242 -0
  441. package/server/services/workshop/aml/job-orchestrator.ts +4 -15
  442. package/server/services/workshop/aml/model-registry.ts +6 -0
  443. package/server/services/workshop/aml/python-runtime.ts +396 -62
  444. package/server/services/workshop/aml/runtime.ts +95 -4
  445. package/server/services/workshop/daq/bus/mqtt.adapter.ts +3 -1
  446. package/server/services/workshop/daq/daq-controller.ts +95 -47
  447. package/server/services/workshop/daq/daq-node.repo.ts +0 -10
  448. package/server/services/workshop/daq/daq-runtime.ts +0 -5
  449. package/server/services/workshop/json-store.mjs +35 -2
  450. package/server/services/workshop/plugins/host.mjs +14 -5
  451. package/server/services/workshop/runtime/manager.ts +28 -1
  452. package/server/services/workshop/runtime/scheduler-loop.ts +10 -1
  453. package/server/services/workshop/settings.ts +2 -0
  454. package/shared/config/home.mjs +58 -0
  455. package/shared/config/schema.json +2 -1
  456. package/shared/lru.mjs +4 -1
  457. package/.output/public/_nuxt/-6OnbLFb.js +0 -1
  458. package/.output/public/_nuxt/-nb2uqVg.js +0 -1
  459. package/.output/public/_nuxt/4bHdIqEg.js +0 -18
  460. package/.output/public/_nuxt/6PZPfFcO.js +0 -17
  461. package/.output/public/_nuxt/BBBtwOpo.js +0 -9
  462. package/.output/public/_nuxt/BBwMH_hG.js +0 -7
  463. package/.output/public/_nuxt/BDUjyaF4.js +0 -42
  464. package/.output/public/_nuxt/BNXfwXpE.js +0 -1
  465. package/.output/public/_nuxt/BN_PdN3J.js +0 -24
  466. package/.output/public/_nuxt/BSSUlJnx2.js +0 -1
  467. package/.output/public/_nuxt/BWSE6hR6.js +0 -1
  468. package/.output/public/_nuxt/BZGNTgTQ2.js +0 -1
  469. package/.output/public/_nuxt/BZv4RFYN.js +0 -1
  470. package/.output/public/_nuxt/BcmbLh2z2.js +0 -1
  471. package/.output/public/_nuxt/BfGc7TJp.js +0 -1
  472. package/.output/public/_nuxt/BgTB6h_q.js +0 -2
  473. package/.output/public/_nuxt/BkLJA9J5.js +0 -1
  474. package/.output/public/_nuxt/Bp5luxkg2.js +0 -1
  475. package/.output/public/_nuxt/BuCHayqN.js +0 -1
  476. package/.output/public/_nuxt/BuvcLKh1.js +0 -19
  477. package/.output/public/_nuxt/C3tCneTM.js +0 -1
  478. package/.output/public/_nuxt/C77oC8yC2.js +0 -7
  479. package/.output/public/_nuxt/C9f8QMp12.js +0 -1
  480. package/.output/public/_nuxt/CKfhtOt7.js +0 -13
  481. package/.output/public/_nuxt/CQvmN-Mi.js +0 -1
  482. package/.output/public/_nuxt/CUDrOuW7.js +0 -1
  483. package/.output/public/_nuxt/CZcC-gpk.js +0 -1
  484. package/.output/public/_nuxt/CbzsPO5H.js +0 -1
  485. package/.output/public/_nuxt/CdSOrh2c.js +0 -1
  486. package/.output/public/_nuxt/Cgx818r-.js +0 -1
  487. package/.output/public/_nuxt/Cjm7VogC.js +0 -1
  488. package/.output/public/_nuxt/Cm5mDxzH.js +0 -1
  489. package/.output/public/_nuxt/CmHzfVc5.js +0 -3
  490. package/.output/public/_nuxt/Cn3J3NXR.js +0 -23
  491. package/.output/public/_nuxt/Cno6kYiO2.js +0 -1
  492. package/.output/public/_nuxt/Cp6z0RN7.js +0 -1
  493. package/.output/public/_nuxt/CwqIxJGj.js +0 -2
  494. package/.output/public/_nuxt/D-Ca4BGY.js +0 -70
  495. package/.output/public/_nuxt/D0fhp-Ga.js +0 -75
  496. package/.output/public/_nuxt/D1z7i2UP.js +0 -31
  497. package/.output/public/_nuxt/DIaTPH1M.js +0 -1
  498. package/.output/public/_nuxt/DTYBfjRY.js +0 -1
  499. package/.output/public/_nuxt/DXRZPxGs.js +0 -1
  500. package/.output/public/_nuxt/DZzGarBE2.js +0 -13
  501. package/.output/public/_nuxt/DaMCzQhv.js +0 -1
  502. package/.output/public/_nuxt/DoLasgPj2.js +0 -1
  503. package/.output/public/_nuxt/DpojD719.js +0 -1
  504. package/.output/public/_nuxt/DsVcWfyR.js +0 -1
  505. package/.output/public/_nuxt/DtBu71ev.js +0 -32
  506. package/.output/public/_nuxt/Dy-mxvXY2.js +0 -1
  507. package/.output/public/_nuxt/DzuC31-i.js +0 -2
  508. package/.output/public/_nuxt/FQri3dV3.js +0 -1
  509. package/.output/public/_nuxt/ORt9oDIy2.js +0 -1
  510. package/.output/public/_nuxt/TownView.CtskuMXS.css +0 -1
  511. package/.output/public/_nuxt/VLI2Zy4t.js +0 -5
  512. package/.output/public/_nuxt/_id_.MbzdFygI.css +0 -1
  513. package/.output/public/_nuxt/_id_.hRYo-EAB.css +0 -1
  514. package/.output/public/_nuxt/_wsId_.gXMEOYgX.css +0 -1
  515. package/.output/public/_nuxt/aml.WU_bh87J.css +0 -1
  516. package/.output/public/_nuxt/arUY5dyq2.js +0 -4
  517. package/.output/public/_nuxt/builds/meta/adc365b6-f636-4a2b-9527-79819c1e874b.json +0 -1
  518. package/.output/public/_nuxt/daq.Bb6l44-O.css +0 -1
  519. package/.output/public/_nuxt/dcw.rXH2fc2Z.css +0 -1
  520. package/.output/public/_nuxt/default.jNT73_hq.css +0 -1
  521. package/.output/public/_nuxt/ekuGmQ7R.js +0 -1
  522. package/.output/public/_nuxt/entry.jFrFAWuA.css +0 -1
  523. package/.output/public/_nuxt/logs.DMOM-iHe.css +0 -1
  524. package/.output/public/_nuxt/niDwBOZW.js +0 -3
  525. package/.output/public/_nuxt/pMoIO6rr.js +0 -14
  526. package/.output/public/_nuxt/pages.Cc8GX9T1.css +0 -1
  527. package/.output/public/_nuxt/plugins.wIPyfPn-.css +0 -1
  528. package/.output/public/_nuxt/rqZ-1SoP.js +0 -2
  529. package/.output/public/_nuxt/settings.BCm4NZIc.css +0 -1
  530. package/.output/public/_nuxt/town.C_DsNW0J.css +0 -1
  531. package/.output/public/_nuxt/users.DuAt_Zwf.css +0 -1
  532. package/.output/public/_nuxt/vJ4FPb-_.js +0 -1
  533. package/.output/public/_nuxt/workshop.BJg84pOK.css +0 -1
  534. package/.output/server/chunks/build/aml-uBNIppIf.mjs +0 -508
  535. package/.output/server/chunks/build/aml-uBNIppIf.mjs.map +0 -1
  536. package/.output/server/chunks/build/daq-BvihjQyW.mjs.map +0 -1
  537. package/.output/server/chunks/build/pages-C-6BRtv8.mjs.map +0 -1
  538. package/scripts/_audit/.tmp/audit-data/dcws.json +0 -28
  539. package/scripts/_audit/.tmp/dcw-writes.json +0 -15650
  540. package/scripts/_audit/.tmp/dcws.json +0 -9033
  541. package/scripts/_audit/.tmp/pollution-backup/dcw-rollback.polluted.json +0 -470006
  542. package/scripts/_audit/.tmp/pollution-backup/dcws.polluted.json +0 -9085
  543. package/scripts/_audit/.tmp/probe-cwd.txt +0 -1
  544. package/scripts/_audit/awhome/commands/README.md +0 -3
  545. package/scripts/_audit/awhome/commands/hello.mjs +0 -12
  546. package/scripts/_audit/diag-cwd.ts +0 -20
  547. package/scripts/_audit/diag-cwd2.ts +0 -19
  548. package/scripts/_audit/hello.mjs +0 -12
  549. package/scripts/_audit/ndjson-partial-line-repro.mjs +0 -77
  550. package/scripts/_audit/opencode-await-ternary-repro.mjs +0 -20
  551. package/scripts/_audit/part-frag.txt +0 -84
  552. package/scripts/_audit/part-head.txt +0 -45
  553. package/scripts/_audit/probe-child.mjs +0 -17
  554. package/scripts/_audit/probe-envelope.mjs +0 -49
  555. package/scripts/_audit/probe-packlist.mjs +0 -67
  556. package/scripts/_audit/probe-routes.mjs +0 -47
  557. package/scripts/_audit/probe-routes2.mjs +0 -38
  558. package/scripts/_audit/probe.ts +0 -9
  559. package/scripts/_audit/probe2.ts +0 -6
  560. package/scripts/_audit/probe3.ts +0 -3
  561. package/scripts/_audit/probe4.ts +0 -3
  562. package/scripts/_audit/proj/.AgentWorkShop/commands/echoargs.mjs +0 -13
  563. package/scripts/_audit/proj/config.yml +0 -1
  564. package/scripts/_audit/run.mjs +0 -30
  565. package/scripts/_audit/tsconfig.probe.json +0 -24
  566. package/scripts/_audit/typecheck-out.txt +0 -466
  567. package/scripts/_daq-realtime-probe.mjs +0 -68
  568. package/scripts/_daq-warn-probe.mjs +0 -50
  569. package/scripts/_dbg-acc-1-setup.mjs +0 -57
  570. package/scripts/_dbg-acc-2-diag.mjs +0 -14
  571. package/scripts/_dbg-acc-2-intervals.mjs +0 -81
  572. package/scripts/_dbg-acc-3-daq.mjs +0 -48
  573. package/scripts/_dbg-acc-4-team.mjs +0 -92
  574. package/scripts/_dbg-acc-5-visual.mjs +0 -63
  575. package/scripts/_dbg-acc-5b-ws-town.mjs +0 -18
  576. package/scripts/_dbg-acc-5c-town.mjs +0 -12
  577. package/scripts/_dbg-acc-6-i18n.mjs +0 -19
  578. package/scripts/_dbg-agent-tools-audit.mjs +0 -154
  579. package/scripts/_dbg-agent-workflow-audit.mjs +0 -177
  580. package/scripts/_dbg-agents-dropdown-shot.py +0 -33
  581. package/scripts/_dbg-anim-verify.mjs +0 -81
  582. package/scripts/_dbg-app-shot.mjs +0 -48
  583. package/scripts/_dbg-autoframe.mjs +0 -103
  584. package/scripts/_dbg-availability-probe.ts +0 -11
  585. package/scripts/_dbg-beacon-final.mjs +0 -181
  586. package/scripts/_dbg-bind-bidi-e2e.mjs +0 -239
  587. package/scripts/_dbg-callout-near.mjs +0 -108
  588. package/scripts/_dbg-catalog-smoke.ts +0 -20
  589. package/scripts/_dbg-cf-line-shot.mjs +0 -18
  590. package/scripts/_dbg-chan-focus.mjs +0 -49
  591. package/scripts/_dbg-channel-plugin-ui.mjs +0 -94
  592. package/scripts/_dbg-cleanup.mjs +0 -31
  593. package/scripts/_dbg-closedloop-ui-shot.mjs +0 -61
  594. package/scripts/_dbg-codex-handshake.ts +0 -30
  595. package/scripts/_dbg-codex-probe.mjs +0 -58
  596. package/scripts/_dbg-codex-sandbox.ts +0 -58
  597. package/scripts/_dbg-codex-turn.ts +0 -65
  598. package/scripts/_dbg-collab-scenario-e2e.mjs +0 -185
  599. package/scripts/_dbg-config-smoke.ts +0 -28
  600. package/scripts/_dbg-console-audit.mjs +0 -61
  601. package/scripts/_dbg-console-probe.mjs +0 -23
  602. package/scripts/_dbg-context-inject-audit.mjs +0 -231
  603. package/scripts/_dbg-cpu-profile.mjs +0 -53
  604. package/scripts/_dbg-crash-recovery.mjs +0 -143
  605. package/scripts/_dbg-crop-shot.mjs +0 -16
  606. package/scripts/_dbg-cross-channel-e2e.mjs +0 -157
  607. package/scripts/_dbg-cross-team-visibility-e2e.mjs +0 -129
  608. package/scripts/_dbg-crush-probe.sh +0 -21
  609. package/scripts/_dbg-crush-spawn-probe.ts +0 -22
  610. package/scripts/_dbg-daq-acc-probe.mjs +0 -24
  611. package/scripts/_dbg-daq-attrib.mjs +0 -34
  612. package/scripts/_dbg-daq-bind-audit.mjs +0 -119
  613. package/scripts/_dbg-daq-cadence.mjs +0 -104
  614. package/scripts/_dbg-daq-debug.mjs +0 -22
  615. package/scripts/_dbg-daq-diag.mjs +0 -33
  616. package/scripts/_dbg-daq-e2e.mjs +0 -171
  617. package/scripts/_dbg-daq-film.mjs +0 -136
  618. package/scripts/_dbg-daq-filter-e2e.mjs +0 -109
  619. package/scripts/_dbg-daq-filter-e2e2.mjs +0 -62
  620. package/scripts/_dbg-daq-final-regression.mjs +0 -78
  621. package/scripts/_dbg-daq-frame-alarm.mjs +0 -49
  622. package/scripts/_dbg-daq-frame-ui.mjs +0 -62
  623. package/scripts/_dbg-daq-frame-ws.mjs +0 -72
  624. package/scripts/_dbg-daq-full-check.mjs +0 -179
  625. package/scripts/_dbg-daq-line-note-verify.mjs +0 -61
  626. package/scripts/_dbg-daq-linebanner-audit.mjs +0 -107
  627. package/scripts/_dbg-daq-pages-shot.mjs +0 -37
  628. package/scripts/_dbg-daq-perf.mjs +0 -61
  629. package/scripts/_dbg-daq-probe.mjs +0 -27
  630. package/scripts/_dbg-daq-recipe-e2e.mjs +0 -30
  631. package/scripts/_dbg-daq-redesign-shot.mjs +0 -88
  632. package/scripts/_dbg-daq-rows-probe.mjs +0 -26
  633. package/scripts/_dbg-daq-rowstate-e2e.mjs +0 -152
  634. package/scripts/_dbg-daq-rowstate-shot.mjs +0 -45
  635. package/scripts/_dbg-daq-rowstate-shot2.mjs +0 -38
  636. package/scripts/_dbg-daq-tpl.mjs +0 -144
  637. package/scripts/_dbg-dash-console-check.mjs +0 -49
  638. package/scripts/_dbg-dash-deep-probe.mjs +0 -61
  639. package/scripts/_dbg-dash-hitpoint.mjs +0 -44
  640. package/scripts/_dbg-dash-live-shot.mjs +0 -36
  641. package/scripts/_dbg-dash-shot.mjs +0 -21
  642. package/scripts/_dbg-dashboard-shot.mjs +0 -35
  643. package/scripts/_dbg-dcw-audit.mjs +0 -126
  644. package/scripts/_dbg-dcw-card-e2e.mjs +0 -108
  645. package/scripts/_dbg-dcw-channel-ui.mjs +0 -144
  646. package/scripts/_dbg-dcw-examples.mjs +0 -81
  647. package/scripts/_dbg-dcw-light-shot.mjs +0 -19
  648. package/scripts/_dbg-dcw-line-audit.mjs +0 -107
  649. package/scripts/_dbg-dcw-pause-tpl-audit.mjs +0 -161
  650. package/scripts/_dbg-dcw-pause-ui.mjs +0 -175
  651. package/scripts/_dbg-dcw-read-toolface.ts +0 -13
  652. package/scripts/_dbg-dcw-read-ui.mjs +0 -74
  653. package/scripts/_dbg-dcw-scene.mjs +0 -72
  654. package/scripts/_dbg-dcw-shot2.mjs +0 -14
  655. package/scripts/_dbg-dcw-twin-e2e.mjs +0 -192
  656. package/scripts/_dbg-diag-mock-loop.mjs +0 -89
  657. package/scripts/_dbg-diag-watch.mjs +0 -95
  658. package/scripts/_dbg-docs-site-shot.mjs +0 -32
  659. package/scripts/_dbg-dsh-probe.mjs +0 -31
  660. package/scripts/_dbg-dt-interact.mjs +0 -193
  661. package/scripts/_dbg-error-probe.mjs +0 -54
  662. package/scripts/_dbg-filter-light-verify.mjs +0 -54
  663. package/scripts/_dbg-final-acceptance-2.mjs +0 -72
  664. package/scripts/_dbg-final-acceptance.mjs +0 -192
  665. package/scripts/_dbg-final-agent-e2e.mjs +0 -151
  666. package/scripts/_dbg-final-features.mjs +0 -155
  667. package/scripts/_dbg-final-fixups.mjs +0 -62
  668. package/scripts/_dbg-final-full-e2e.mjs +0 -218
  669. package/scripts/_dbg-final-line-e2e.mjs +0 -173
  670. package/scripts/_dbg-final-shots.mjs +0 -32
  671. package/scripts/_dbg-final-t6-hitl.mjs +0 -38
  672. package/scripts/_dbg-final-visual.mjs +0 -29
  673. package/scripts/_dbg-fix-unused-imports.py +0 -41
  674. package/scripts/_dbg-focus-range.mjs +0 -115
  675. package/scripts/_dbg-fresh-scene-e2e.mjs +0 -125
  676. package/scripts/_dbg-fullchain-e2e.mjs +0 -178
  677. package/scripts/_dbg-gate-debug.mjs +0 -37
  678. package/scripts/_dbg-gif-encode.mjs +0 -111
  679. package/scripts/_dbg-gizmo.mjs +0 -95
  680. package/scripts/_dbg-glass-probe.mjs +0 -57
  681. package/scripts/_dbg-glass-shot.mjs +0 -50
  682. package/scripts/_dbg-glass-sweep.mjs +0 -25
  683. package/scripts/_dbg-glb-probe.mjs +0 -43
  684. package/scripts/_dbg-goose-probe.mjs +0 -33
  685. package/scripts/_dbg-goose-probe.sh +0 -10
  686. package/scripts/_dbg-hardening-probe.mjs +0 -90
  687. package/scripts/_dbg-harness-cancel-repro.mjs +0 -81
  688. package/scripts/_dbg-harness-ui-dbg.py +0 -49
  689. package/scripts/_dbg-harness-ui-shot.py +0 -109
  690. package/scripts/_dbg-hero-btn-probe.mjs +0 -21
  691. package/scripts/_dbg-hidden-check.mjs +0 -21
  692. package/scripts/_dbg-hmi-audit.mjs +0 -164
  693. package/scripts/_dbg-home-repro.mjs +0 -24
  694. package/scripts/_dbg-home-stack.mjs +0 -13
  695. package/scripts/_dbg-host.mjs +0 -16
  696. package/scripts/_dbg-huashu-survey.mjs +0 -31
  697. package/scripts/_dbg-huashu-survey2.mjs +0 -35
  698. package/scripts/_dbg-huashu-verify.mjs +0 -25
  699. package/scripts/_dbg-huashu-verify2.mjs +0 -26
  700. package/scripts/_dbg-hydration-detail.mjs +0 -18
  701. package/scripts/_dbg-i18n-debug.mjs +0 -27
  702. package/scripts/_dbg-i18n-debug2.mjs +0 -26
  703. package/scripts/_dbg-i18n-final.mjs +0 -42
  704. package/scripts/_dbg-i18n-scan.mjs +0 -38
  705. package/scripts/_dbg-infra-lifecycle.mjs +0 -44
  706. package/scripts/_dbg-interval-config.mjs +0 -156
  707. package/scripts/_dbg-interval-scenario.mjs +0 -126
  708. package/scripts/_dbg-kicker-check.mjs +0 -11
  709. package/scripts/_dbg-line-aura-shots.mjs +0 -54
  710. package/scripts/_dbg-line-control-e2e.mjs +0 -120
  711. package/scripts/_dbg-line-gate-audit.mjs +0 -108
  712. package/scripts/_dbg-line-live-e2e.mjs +0 -144
  713. package/scripts/_dbg-line-repo-test.ts +0 -10
  714. package/scripts/_dbg-line-scenario-e2e.mjs +0 -256
  715. package/scripts/_dbg-line-spawn.ts +0 -31
  716. package/scripts/_dbg-live-engine-probe.mjs +0 -80
  717. package/scripts/_dbg-login-debug.py +0 -23
  718. package/scripts/_dbg-login-e2e.mjs +0 -26
  719. package/scripts/_dbg-logs-ui-e2e.py +0 -126
  720. package/scripts/_dbg-mcp-bridge-probe.mjs +0 -147
  721. package/scripts/_dbg-modbus-latency.mjs +0 -22
  722. package/scripts/_dbg-mqtt-chain-e2e.mjs +0 -90
  723. package/scripts/_dbg-mqtt-publisher.mjs +0 -17
  724. package/scripts/_dbg-nav-rpg.mjs +0 -84
  725. package/scripts/_dbg-nav-shot.mjs +0 -28
  726. package/scripts/_dbg-nav.mjs +0 -27
  727. package/scripts/_dbg-oneshot-impl-probe.ts +0 -67
  728. package/scripts/_dbg-opencode-sse.mjs +0 -101
  729. package/scripts/_dbg-opencode-start.ts +0 -57
  730. package/scripts/_dbg-opslog-e2e.mjs +0 -121
  731. package/scripts/_dbg-opslog-shots.mjs +0 -62
  732. package/scripts/_dbg-optimization-e2e.mjs +0 -94
  733. package/scripts/_dbg-orbit.mjs +0 -58
  734. package/scripts/_dbg-overview-probe.sh +0 -31
  735. package/scripts/_dbg-panesplitter-fix-check.mjs +0 -62
  736. package/scripts/_dbg-perms-visual.mjs +0 -36
  737. package/scripts/_dbg-pg-tcp-probe.cjs +0 -27
  738. package/scripts/_dbg-phase-e3-monitor.mjs +0 -25
  739. package/scripts/_dbg-pi-spawn-probe.ts +0 -33
  740. package/scripts/_dbg-plc-agent-loop.ts +0 -102
  741. package/scripts/_dbg-plc-e2e.mjs +0 -171
  742. package/scripts/_dbg-plugin-agent-read.ts +0 -56
  743. package/scripts/_dbg-plugin-config-ui.mjs +0 -111
  744. package/scripts/_dbg-plugin-matrix.mjs +0 -212
  745. package/scripts/_dbg-plugin-panels-ui.mjs +0 -54
  746. package/scripts/_dbg-plugin-sink-rest.mjs +0 -70
  747. package/scripts/_dbg-plugin-sink-ui.mjs +0 -81
  748. package/scripts/_dbg-plugin-tools-inject.ts +0 -80
  749. package/scripts/_dbg-plugin-ui-wizard.mjs +0 -125
  750. package/scripts/_dbg-plugin-verify-e2e.mjs +0 -123
  751. package/scripts/_dbg-plugins-e2e.mjs +0 -101
  752. package/scripts/_dbg-pop-clamp-verify.mjs +0 -77
  753. package/scripts/_dbg-preset-e2e.mjs +0 -116
  754. package/scripts/_dbg-preview-console.mjs +0 -28
  755. package/scripts/_dbg-preview-minrepro.mjs +0 -156
  756. package/scripts/_dbg-preview-pixels.mjs +0 -93
  757. package/scripts/_dbg-prompts-hotreload-test.ts +0 -76
  758. package/scripts/_dbg-prompts-resolve-test.ts +0 -39
  759. package/scripts/_dbg-quality-pages-e2e.mjs +0 -84
  760. package/scripts/_dbg-query-cancel.ts +0 -12
  761. package/scripts/_dbg-qwen-acp-probe.mjs +0 -30
  762. package/scripts/_dbg-qwen-capture.mjs +0 -21
  763. package/scripts/_dbg-rail-tree-e2e.mjs +0 -183
  764. package/scripts/_dbg-real-driver-e2e.mjs +0 -55
  765. package/scripts/_dbg-redesign-shots.mjs +0 -34
  766. package/scripts/_dbg-registry-smoke.ts +0 -14
  767. package/scripts/_dbg-release-smoke.mjs +0 -104
  768. package/scripts/_dbg-repo-setup-verify.mjs +0 -31
  769. package/scripts/_dbg-resolve-probe.ts +0 -6
  770. package/scripts/_dbg-restart-persist.mjs +0 -41
  771. package/scripts/_dbg-retention-test.ts +0 -25
  772. package/scripts/_dbg-rollback-mgr-audit.mjs +0 -169
  773. package/scripts/_dbg-rpg.mjs +0 -71
  774. package/scripts/_dbg-sc001-dispatch.mjs +0 -63
  775. package/scripts/_dbg-scenario-final-shot.mjs +0 -24
  776. package/scripts/_dbg-scenario-phase-e2.mjs +0 -75
  777. package/scripts/_dbg-scenario-phase-e3.mjs +0 -96
  778. package/scripts/_dbg-scenario-phase1.mjs +0 -90
  779. package/scripts/_dbg-scenario-phase2.mjs +0 -105
  780. package/scripts/_dbg-scenario-phase3-monitor.mjs +0 -48
  781. package/scripts/_dbg-scenario-phase3.mjs +0 -111
  782. package/scripts/_dbg-scene-polish-shot.mjs +0 -118
  783. package/scripts/_dbg-selring-probe.mjs +0 -47
  784. package/scripts/_dbg-settings-draft-probe.mjs +0 -39
  785. package/scripts/_dbg-settings-probe.mjs +0 -33
  786. package/scripts/_dbg-setup-e2e.mjs +0 -88
  787. package/scripts/_dbg-sideinfo.mjs +0 -101
  788. package/scripts/_dbg-sim-keeper.mjs +0 -100
  789. package/scripts/_dbg-splitter.mjs +0 -88
  790. package/scripts/_dbg-swatch-check.mjs +0 -10
  791. package/scripts/_dbg-task-cancel-probe.mjs +0 -66
  792. package/scripts/_dbg-team-drill.mjs +0 -173
  793. package/scripts/_dbg-town-alarm-e2e.mjs +0 -40
  794. package/scripts/_dbg-town-beauty-shots.mjs +0 -54
  795. package/scripts/_dbg-town-daq-shot.mjs +0 -26
  796. package/scripts/_dbg-town-full-e2e.mjs +0 -104
  797. package/scripts/_dbg-town-gate.mjs +0 -44
  798. package/scripts/_dbg-town-ins-probe.mjs +0 -37
  799. package/scripts/_dbg-town-perf.mjs +0 -50
  800. package/scripts/_dbg-town-polish-shots.mjs +0 -82
  801. package/scripts/_dbg-town-realtime.mjs +0 -42
  802. package/scripts/_dbg-town-shot.py +0 -25
  803. package/scripts/_dbg-town-shot3.mjs +0 -17
  804. package/scripts/_dbg-town-truth.mjs +0 -37
  805. package/scripts/_dbg-town-truth2.mjs +0 -27
  806. package/scripts/_dbg-transform-audit.mjs +0 -98
  807. package/scripts/_dbg-trend-expand-test.mjs +0 -38
  808. package/scripts/_dbg-twindaq-focus.mjs +0 -81
  809. package/scripts/_dbg-ui-polish-shot.mjs +0 -43
  810. package/scripts/_dbg-ui-polish-verify1.mjs +0 -92
  811. package/scripts/_dbg-ui-polish-verify2.mjs +0 -50
  812. package/scripts/_dbg-ui-polish-verify3.mjs +0 -51
  813. package/scripts/_dbg-ui-polish-verify4.mjs +0 -50
  814. package/scripts/_dbg-ui-shot.mjs +0 -26
  815. package/scripts/_dbg-ui-shots.mjs +0 -28
  816. package/scripts/_dbg-ui-survey.py +0 -52
  817. package/scripts/_dbg-unify-shot.mjs +0 -43
  818. package/scripts/_dbg-uplink-probe.mjs +0 -36
  819. package/scripts/_dbg-wizard-preview-shot.mjs +0 -58
  820. package/scripts/_dbg-wizard-ui-e2e.mjs +0 -93
  821. package/scripts/_dbg-ws-probe.mjs +0 -86
  822. package/scripts/_dbg-ws-shot2.mjs +0 -23
  823. package/scripts/_dbg-wsdot-sanity.mjs +0 -25
  824. package/scripts/_dev-stack.mjs +0 -46
  825. package/scripts/_http-driver-probe.mjs +0 -30
  826. package/scripts/_mqtt-driver-probe.mjs +0 -30
  827. package/scripts/_newdriver-rest-probe.mjs +0 -100
  828. package/scripts/_node-state-probe.mjs +0 -5
  829. package/scripts/_opcua-driver-probe.mjs +0 -31
  830. package/scripts/_rtu-debug.mjs +0 -41
  831. package/scripts/_rtu-direct.mjs +0 -6
  832. package/scripts/_rtu-driver-probe.mjs +0 -53
  833. package/scripts/_spike-pitui.mjs +0 -116
  834. package/scripts/_tmp-args-probe.mjs +0 -20
  835. package/scripts/_tmp-cyc-entry.mjs +0 -8
  836. package/scripts/_tmp-cyc-main.mjs +0 -5
  837. package/scripts/_tmp-cyc-mod.mjs +0 -2
  838. package/scripts/_tmp-cycle-a.mjs +0 -6
  839. package/scripts/_tmp-cycle-b.mjs +0 -2
  840. package/scripts/_tmp-cycle-probe.mjs +0 -4
  841. package/scripts/_tmp-entry-variant.mjs +0 -2
  842. package/scripts/_tmp-help-probe.mjs +0 -19
  843. package/scripts/_tmp-help-probe2.mjs +0 -2
  844. package/scripts/_tmp-trace-preload.mjs +0 -1
  845. package/scripts/_wizard-shots.mjs +0 -90
  846. package/scripts/acceptance-suite.py +0 -207
  847. package/scripts/aml-agent-bridge.ts +0 -230
  848. package/scripts/aml-industrial-loop.ts +0 -232
  849. package/scripts/build-film-devices.mjs +0 -227
  850. package/scripts/collab-live-test.py +0 -177
  851. package/scripts/debug-mcp-http.ts +0 -64
  852. package/scripts/demo-lead-worker.ts +0 -256
  853. package/scripts/demo-modes.ts +0 -415
  854. package/scripts/demo-omp-channel.ts +0 -135
  855. package/scripts/design-preflight.mjs +0 -223
  856. package/scripts/design-verify-templates.mjs +0 -110
  857. package/scripts/design-verify.mjs +0 -170
  858. package/scripts/dev-window.cmd +0 -6
  859. package/scripts/device-line-restore.mjs +0 -34
  860. package/scripts/diag-lead-status.ts +0 -101
  861. package/scripts/e2e-a2a-steer-live.mjs +0 -193
  862. package/scripts/e2e-dual-drive-comm.ts +0 -259
  863. package/scripts/e2e-full-scenario.ts +0 -321
  864. package/scripts/e2e-harness-consistency.ts +0 -204
  865. package/scripts/e2e-harness-provider-task.mjs +0 -126
  866. package/scripts/e2e-line-live.mjs +0 -144
  867. package/scripts/e2e-memory-persistence.ts +0 -320
  868. package/scripts/e2e-omp-modes.ts +0 -274
  869. package/scripts/e2e-omp-realtime.ts +0 -258
  870. package/scripts/e2e-plc-scenario.mjs +0 -292
  871. package/scripts/e2e-real-scenario.mjs +0 -466
  872. package/scripts/e2e-tab-close.mjs +0 -136
  873. package/scripts/e2e-token-ui.mjs +0 -149
  874. package/scripts/final-soup-run.py +0 -192
  875. package/scripts/final-soup-watch.py +0 -83
  876. package/scripts/i18n-codemod.mjs +0 -173
  877. package/scripts/i18n-fix-en.py +0 -28
  878. package/scripts/i18n-fix-en2.py +0 -31
  879. package/scripts/i18n-merge.mjs +0 -191
  880. package/scripts/migrate-local-time.mjs +0 -123
  881. package/scripts/omp-real-test.py +0 -328
  882. package/scripts/team-plugins-api-smoke.mjs +0 -149
  883. package/scripts/test-a2a-relay.mjs +0 -222
  884. package/scripts/test-aml-integration.ts +0 -159
  885. package/scripts/test-aml-job.ts +0 -174
  886. package/scripts/test-aml-unit.ts +0 -184
  887. package/scripts/test-api-client.ts +0 -108
  888. package/scripts/test-api-suite.mjs +0 -271
  889. package/scripts/test-block-consumption.mjs +0 -194
  890. package/scripts/test-cmd-render.mjs +0 -218
  891. package/scripts/test-collab-omp.mjs +0 -192
  892. package/scripts/test-config-precedence.ts +0 -124
  893. package/scripts/test-context-governor.ts +0 -176
  894. package/scripts/test-daq-frames.ts +0 -180
  895. package/scripts/test-daq-minio.ts +0 -77
  896. package/scripts/test-dedup-logic.ts +0 -132
  897. package/scripts/test-e2e-collaboration.ts +0 -262
  898. package/scripts/test-e2e-monitor.ts +0 -192
  899. package/scripts/test-event-history.ts +0 -112
  900. package/scripts/test-exec-modes.ts +0 -316
  901. package/scripts/test-fifo-realtime.mjs +0 -193
  902. package/scripts/test-final-e2e.mjs +0 -290
  903. package/scripts/test-goal-summary.ts +0 -202
  904. package/scripts/test-harness-liveness.ts +0 -109
  905. package/scripts/test-harness-terminal.ts +0 -164
  906. package/scripts/test-header-trail.mjs +0 -95
  907. package/scripts/test-hitl.ts +0 -360
  908. package/scripts/test-koda-restyle.mjs +0 -105
  909. package/scripts/test-lane-raw.ts +0 -67
  910. package/scripts/test-lanes-history-render.mjs +0 -138
  911. package/scripts/test-loop-omp.mjs +0 -154
  912. package/scripts/test-mdlite.ts +0 -53
  913. package/scripts/test-memory-brief-chronicle.ts +0 -180
  914. package/scripts/test-memory-rrf-mmr.ts +0 -114
  915. package/scripts/test-mock-collab.mjs +0 -226
  916. package/scripts/test-modern-render.mjs +0 -174
  917. package/scripts/test-omp-terminal.mjs +0 -187
  918. package/scripts/test-plugin-ext.ts +0 -173
  919. package/scripts/test-prompts-loader.ts +0 -56
  920. package/scripts/test-real-scenario.mjs +0 -290
  921. package/scripts/test-stream-render.ts +0 -37
  922. package/scripts/test-task-drawer.mjs +0 -204
  923. package/scripts/test-task-invariants.mjs +0 -169
  924. package/scripts/test-town-3d.mjs +0 -121
  925. package/scripts/test-town-layout.mjs +0 -200
  926. package/scripts/test-town-page.mjs +0 -136
  927. package/scripts/test-town-scene-math.ts +0 -169
  928. package/scripts/test-town-twin.mjs +0 -121
  929. package/scripts/test-town-upload.mjs +0 -89
  930. package/scripts/test-town-user-flow.mjs +0 -619
  931. package/scripts/test-town-world.mjs +0 -76
  932. package/scripts/test-town-wuwa.mjs +0 -198
  933. package/scripts/test-user-isolation.mjs +0 -193
  934. package/scripts/test-workshop-entries.ts +0 -370
  935. package/scripts/test-workspace-api.ts +0 -329
  936. package/scripts/test-ws-aep.mjs +0 -187
  937. package/scripts/test-ws-protocol.ts +0 -134
  938. package/scripts/town-demo-seed.mjs +0 -75
  939. package/scripts/town-scene-clear.mjs +0 -56
  940. package/scripts/verify-exec-modes-report.ts +0 -248
  941. package/scripts/verify-lead-mail.ts +0 -188
  942. package/scripts/verify-page-smoke.mjs +0 -87
  943. package/scripts/ws-test.mjs +0 -176
  944. package/scripts/ws-test.py +0 -4
@@ -1,619 +0,0 @@
1
- /* eslint-disable -- 浏览器 E2E 脚本:一次性验证,允许紧凑断言 */
2
- /**
3
- * 小镇·用户自定义拖拽建模全流程验证(E2E via puppeteer)。
4
- *
5
- * 覆盖需求(对照用户原始意图):
6
- * 1. 小镇画面占据满 page(满屏)
7
- * 2. 侧边模型库仅加载 device 模型(character 模型不出现在模型库)
8
- * 3. 拖拽设备模型 → 场景实例化(数字孪生落库)
9
- * 4. 点击场景中设备 → 对象属性面板:改名/换模型/缩放/旋转
10
- * 5. 移除场景设备实例(孪生 + 节点 + 广播)
11
- * 6. Channel 通过真正拖拽放置;相同 Channel 只能放置一个
12
- * 7. Channel 管理:自定义范围(形状/半径/朝向)编辑 → 落库持久化
13
- * 8. Channel 管理:成员 tab 为成员自定义绑定 character 角色模型
14
- * 依赖:dev server(127.0.0.1:3000)+ Edge + puppeteer-core。
15
- */
16
- import puppeteer from 'puppeteer-core'
17
- import fs from 'node:fs'
18
- import path from 'node:path'
19
-
20
- const EDGE = 'C:\\Program Files (x86)\\Microsoft\\Edge\\Application\\msedge.exe'
21
- const BASE = 'http://127.0.0.1:3000'
22
- const OUT = 'gui-test-screenshots/town-user-flow'
23
- const sleep = ms => new Promise(r => setTimeout(r, ms))
24
-
25
- const api = async (method, ep, { body, token } = {}) => {
26
- const headers = { 'content-type': 'application/json' }
27
- if (token) headers.authorization = `Bearer ${token}`
28
- const res = await fetch(`${BASE}${ep}`, { method, headers, body: body ? JSON.stringify(body) : undefined })
29
- return res.json()
30
- }
31
-
32
- let pass = 0
33
- let fail = 0
34
- function check(name, ok, detail = '') {
35
- console.log(` ${ok ? 'PASS' : 'FAIL'} ${name}${detail ? ` — ${detail}` : ''}`)
36
- if (ok) pass++; else fail++
37
- }
38
-
39
- async function main() {
40
- fs.mkdirSync(OUT, { recursive: true })
41
- const ts = Date.now().toString(36)
42
- const regEmail = `flow-${ts}@test.local`
43
- const reg = await api('POST', '/api/users/register', {
44
- body: { name: `flow-${ts}`, email: regEmail, password: 'Passw0rd!123' },
45
- })
46
- const { token } = reg.data
47
-
48
- // 建频道:1 lead + 2 worker,挂载进 workspace
49
- const ch = await api('POST', '/api/workshop/channels', {
50
- body: { name: 'E2E共鸣领地', scenarioPrompt: 'test', leadAgent: { name: 'lead', harness: 'mock' } }, token,
51
- })
52
- const cid = ch.data.channelId
53
- await api('POST', `/api/workshop/channels/${cid}/agents`, { body: { name: 'worker-a', harness: 'mock', role: 'worker' }, token })
54
- await api('POST', `/api/workshop/channels/${cid}/agents`, { body: { name: 'worker-b', harness: 'mock', role: 'worker' }, token })
55
- const ws = await api('POST', '/api/workshop/workspaces', { body: { name: `flow-ws-${ts}` }, token })
56
- await api('POST', `/api/workshop/workspaces/${ws.data.id}/channels/${cid}`, { token })
57
-
58
- // 隔离:清空历史遗留设备孪生(保证设备断言从干净状态开始)
59
- const stale = await api('GET', '/api/workshop/device-twins', { token })
60
- for (const t of (stale?.data?.twins ?? [])) {
61
- await api('DELETE', `/api/workshop/device-twins/${t.id}`, { token })
62
- }
63
-
64
- // 测试角色模型:复制 hero-3d.glb → hunter.glb(供成员 tab 选择/绑定;最终清理)
65
- const hunterDst = path.resolve('public/assets/game/character/hunter.glb')
66
- fs.copyFileSync(path.resolve('public/assets/game/character/hero-3d.glb'), hunterDst)
67
-
68
- try {
69
- const result = await runTest({ token, cid, ts })
70
- console.log(`\n结果: ${result.pass} 通过 / ${result.fail} 失败`)
71
- fs.rmSync(hunterDst, { force: true })
72
- process.exit(result.fail > 0 ? 1 : 0)
73
- }
74
- catch (e) {
75
- fs.rmSync(hunterDst, { force: true })
76
- throw e
77
- }
78
- }
79
-
80
- async function runTest({ token, cid, ts }) {
81
- const browser = await puppeteer.launch({
82
- executablePath: EDGE, headless: 'new', args: ['--no-sandbox'],
83
- defaultViewport: { width: 1400, height: 900 },
84
- })
85
- const page = await browser.newPage()
86
- page.on('pageerror', e => console.log(' [pageerror]', e.message.slice(0, 160)))
87
-
88
- // ---- 登录:注入真实登录 token cookie(经 session-restore 插件恢复会话;绕开 antd 表单的脆弱性) ----
89
- await page.goto(`${BASE}/workshop`, { waitUntil: 'domcontentloaded', timeout: 60000 })
90
- await page.setCookie({ name: 'token', value: token, url: BASE })
91
- await page.reload({ waitUntil: 'domcontentloaded', timeout: 60000 })
92
- let logged = false
93
- for (let i = 0; i < 50 && !logged; i++) {
94
- logged = await page.evaluate(() => !document.querySelector('.auth-gate') && !!document.cookie.match(/(?:^|;\s*)token=/))
95
- if (!logged) await sleep(500)
96
- }
97
- if (!logged) throw new Error('会话未通过 token cookie 恢复')
98
-
99
- // ---- 进入 /town 满屏小镇页 ----
100
- await page.goto(`${BASE}/town`, { waitUntil: 'domcontentloaded' })
101
- let ready = false
102
- for (let i = 0; i < 50 && !ready; i++) {
103
- ready = await page.evaluate(() => !!window.__town?.scene)
104
- if (!ready) await sleep(500)
105
- }
106
- if (!ready) throw new Error('小镇场景未 ready')
107
- await sleep(2000)
108
-
109
- // 等模型库加载(含 hunter 角色模型 + dev 设备模型)
110
- let modelsReady = false
111
- for (let i = 0; i < 30 && !modelsReady; i++) {
112
- modelsReady = await page.evaluate(() => (window.__town?.characterAssets?.models?.length ?? 0) > 0)
113
- if (!modelsReady) await sleep(400)
114
- }
115
- const modelIds = await page.evaluate(() => window.__town.characterAssets.models.map(m => m.id))
116
-
117
- console.log('\n== 1. 满屏页 ==')
118
- const frame = await page.evaluate(() => {
119
- const r = document.querySelector('.town-frame').getBoundingClientRect()
120
- return { w: r.width, h: r.height, iw: window.innerWidth, ih: window.innerHeight }
121
- })
122
- console.log(` frame ${Math.round(frame.w)}x${Math.round(frame.h)} vs viewport ${frame.iw}x${frame.ih}`)
123
- await page.screenshot({ path: `${OUT}/01-fullpage.png` })
124
- check('小镇画面占满页宽', Math.abs(frame.w - frame.iw) <= 2, `w=${Math.round(frame.w)} iw=${frame.iw}`)
125
- check('小镇画面占用主体高度', frame.h > frame.ih - 140, `h=${Math.round(frame.h)} ih=${frame.ih}`)
126
-
127
- console.log('\n== 2. 模型库仅设备模型 ==')
128
- const libIds = await page.evaluate(() => [...document.querySelectorAll('.model-card[data-model-id]')].map(e => e.getAttribute('data-model-id')))
129
- console.log(' 模型库卡片:', JSON.stringify(libIds))
130
- check('模型库只含 dev 设备模型', libIds.length > 0 && libIds.every(i => i.startsWith('dev-folder')), JSON.stringify(libIds))
131
- check('character 模型不出现在模型库', !libIds.includes('hunter') && !libIds.includes('hero-3d') && !libIds.includes('knight'), '无角色卡片')
132
- const charInModels = modelIds.filter(id => /^ch-folder-/.test(id) || id === 'hero-3d')
133
- console.log(' 注册表角色模型(供成员绑定):', JSON.stringify(charInModels))
134
- check('角色模型在注册表(供成员管理)', modelIds.includes('ch-folder-hunter'), JSON.stringify(modelIds))
135
-
136
- console.log('\n== 3. Channel 真实拖拽放置 ==')
137
- const dropPx = { x: 700, y: 430 }
138
- await html5Drag(page, `.dock-card[data-channel-id="${cid}"]`, '.town-host canvas', 'application/x-aw-channel', cid, dropPx)
139
- await sleep(1500)
140
- let layoutRes = await api('GET', '/api/workshop/scene/layouts', { token })
141
- const placedLayout = layoutRes?.data?.layouts?.find(l => l.channelId === cid)
142
- const blocksAfter = await page.evaluate(() => window.__town.scene.getDebugState().blocks)
143
- console.log(' 落库 layout:', JSON.stringify(placedLayout))
144
- check('频道经拖拽放置(领地出现)', blocksAfter >= 1, `blocks=${blocksAfter}`)
145
- check('频道放置已落库', !!placedLayout && typeof placedLayout.x === 'number', JSON.stringify(placedLayout))
146
- await page.screenshot({ path: `${OUT}/02-channel-placed.png` })
147
-
148
- console.log('\n== 4. 相同 Channel 只能放置一个 ==')
149
- const cardState = await page.evaluate(({ cid }) => {
150
- const c = document.querySelector(`.dock-card[data-channel-id="${cid}"]`)
151
- return { draggable: c.getAttribute('draggable'), cls: c.className }
152
- }, { cid })
153
- console.log(' 已放置卡片 draggable:', cardState.draggable, 'class:', cardState.cls)
154
- check('已放置频道卡片不可再拖拽', cardState.draggable === 'false' && cardState.cls.includes('placed'), JSON.stringify(cardState))
155
- const blocksAgain = await page.evaluate(({ cid }) => {
156
- window.__town.scene.dropChannelOnWorld(800, 800, cid, 'E2E共鸣领地', 3)
157
- return window.__town.scene.getDebugState().blocks
158
- }, { cid })
159
- check('再次放置不产生重复领地', blocksAgain === 1, `blocks=${blocksAgain}`)
160
-
161
- console.log('\n== 5. 拖拽设备模型 → 场景实例化 ==')
162
- const beforeTwins = await api('GET', '/api/workshop/device-twins', { token })
163
- const beforeIds = new Set((beforeTwins?.data?.twins ?? []).map(t => t.id))
164
- await html5Drag(page, '.model-card[data-model-id="dev-folder-pump"]', '.town-host canvas', 'application/x-aw-model', 'dev-folder-pump', dropPx)
165
- await sleep(1800)
166
- const twins = await api('GET', '/api/workshop/device-twins', { token })
167
- const newTwin = (twins?.data?.twins ?? []).find(t => !beforeIds.has(t.id) && t.modelRef === 'dev-folder-pump')
168
- const devNodes = await page.evaluate(() => window.__town.scene.getDeviceNodes())
169
- console.log(' 新孪生:', JSON.stringify({ id: newTwin?.id, modelRef: newTwin?.modelRef, posX: newTwin?.posX, posZ: newTwin?.posZ }))
170
- console.log(' 场景节点:', JSON.stringify(devNodes.map(d => ({ id: d.twinId, x: d.x, z: d.z }))))
171
- check('设备模型拖入 → 生成数字孪生实例', !!newTwin, JSON.stringify(newTwin))
172
- check('孪生含落点 transform', !!newTwin && typeof newTwin.posX === 'number', `posX=${newTwin?.posX}`)
173
- check('场景出现设备节点', devNodes.length >= 1, `nodes=${devNodes.length}`)
174
- await page.screenshot({ path: `${OUT}/03-device-instantiated.png` })
175
-
176
- console.log('\n== 6. 点击场景设备 → 对象属性面板 ==')
177
- const devId = newTwin.id
178
- await page.evaluate(() => {
179
- const c = document.querySelector('.town-host canvas')
180
- c.dispatchEvent(new PointerEvent('pointerup', { bubbles: true, button: 0, clientX: 700, clientY: 430 }))
181
- })
182
- await sleep(400)
183
- const panel1 = await page.evaluate(() => {
184
- const p = document.querySelector('.object-panel')
185
- if (!p) return null
186
- return { kind: p.querySelector('.scale-kind')?.textContent, nameInput: !!p.querySelector('.obj-input'), delBtn: !!p.querySelector('.obj-del') }
187
- })
188
- console.log(' 点击后面板:', JSON.stringify(panel1))
189
- check('点击设备弹出管理面板', !!panel1, '无 .object-panel')
190
- check('面板含 名称/模型/缩放/删除', !!panel1?.nameInput && !!panel1?.delBtn, JSON.stringify(panel1))
191
- await page.screenshot({ path: `${OUT}/04-device-panel.png` })
192
-
193
- console.log('\n== 7. 设备改名(独立管理) ==')
194
- const newName = `e2e-泵机-${ts}`
195
- await page.evaluate(({ newName }) => {
196
- const el = document.querySelector('.obj-input')
197
- const proto = HTMLInputElement.prototype
198
- Object.getOwnPropertyDescriptor(proto, 'value').set.call(el, newName)
199
- el.dispatchEvent(new Event('input', { bubbles: true }))
200
- el.dispatchEvent(new Event('change', { bubbles: true }))
201
- }, { newName })
202
- await sleep(1200)
203
- const twinsAfterRename = await api('GET', '/api/workshop/device-twins', { token })
204
- const renamed = (twinsAfterRename?.data?.twins ?? []).find(t => t.id === devId)
205
- const nodeName = await page.evaluate(({ devId }) => window.__town.scene.getDeviceName(devId), { devId })
206
- check('设备改名落库', renamed?.name === newName, `name=${renamed?.name}`)
207
- check('场景节点名牌同步', nodeName === newName, `node=${nodeName}`)
208
-
209
- console.log('\n== 8. 移除设备实例 ==')
210
- await page.evaluate(() => { window.confirm = () => true })
211
- await page.evaluate(() => document.querySelector('.obj-del').click())
212
- await sleep(1500)
213
- const twinsAfterDel = await api('GET', '/api/workshop/device-twins', { token })
214
- const still = (twinsAfterDel?.data?.twins ?? []).find(t => t.id === devId)
215
- const nodesAfterDel = await page.evaluate(() => window.__town.scene.getDeviceNodes().length)
216
- const panelGone = await page.evaluate(() => !!document.querySelector('.object-panel'))
217
- check('设备孪生被删除', !still, `still=${!!still}`)
218
- check('场景节点已移除', nodesAfterDel === 0, `nodes=${nodesAfterDel}`)
219
- check('管理面板关闭', !panelGone)
220
-
221
- console.log('\n== 9. Channel 管理:自定义范围(边界) ==')
222
- await page.evaluate(({ cid }) => {
223
- document.querySelector(`.dock-card[data-channel-id="${cid}"]`).click()
224
- }, { cid })
225
- await sleep(500)
226
- const bp1 = await page.evaluate(() => {
227
- const p = document.querySelector('.boundary-panel')
228
- return { open: !!p, tabs: [...(p?.querySelectorAll('.bp-tab') || [])].map(t => (t.textContent || '').trim()) }
229
- })
230
- console.log(' 频道管理面板:', JSON.stringify(bp1))
231
- check('点击已放置频道 → 频道管理面板', bp1.open && bp1.tabs.includes('边界') && bp1.tabs.some(t => t.includes('成员')), JSON.stringify(bp1))
232
- await page.evaluate(() => {
233
- const sliders = [...document.querySelectorAll('.bp-range')]
234
- const rx = sliders[0] // 横轴半径(step=8 → 用步进对齐值 512)
235
- const proto = HTMLInputElement.prototype
236
- Object.getOwnPropertyDescriptor(proto, 'value').set.call(rx, '512')
237
- rx.dispatchEvent(new Event('input', { bubbles: true }))
238
- rx.dispatchEvent(new Event('change', { bubbles: true }))
239
- })
240
- await sleep(300)
241
- await page.evaluate(() => {
242
- const btns = [...document.querySelectorAll('.bp-btn')]
243
- const save = btns.find(b => b.textContent.includes('保存边界'))
244
- save.click()
245
- })
246
- await sleep(1200)
247
- layoutRes = await api('GET', '/api/workshop/scene/layouts', { token })
248
- const savedLayout = layoutRes?.data?.layouts?.find(l => l.channelId === cid)
249
- console.log(' 保存后 layout:', JSON.stringify(savedLayout))
250
- check('边界编辑(radiusX=512)落库', savedLayout?.radiusX === 512, `radiusX=${savedLayout?.radiusX}`)
251
- await page.screenshot({ path: `${OUT}/05-boundary.png` })
252
-
253
- console.log('\n== 10. Channel 管理:成员自定义绑定角色模型 ==')
254
- await page.evaluate(() => {
255
- const tabs = [...document.querySelectorAll('.bp-tab')]
256
- tabs.find(t => t.textContent.includes('成员')).click()
257
- })
258
- await sleep(400)
259
- const memberCount = await page.evaluate(() => document.querySelectorAll('.member-row').length)
260
- const memberSelectCount = await page.evaluate(() => document.querySelectorAll('.member-select option').length)
261
- console.log(` 成员行数: ${memberCount}, 角色模型选项数: ${memberSelectCount}`)
262
- check('成员 tab 列出全部成员', memberCount === 3, `rows=${memberCount}`)
263
- check('成员模型下拉含 character 模型', memberSelectCount >= 2 && memberSelectCount >= 2, `options=${memberSelectCount}`)
264
- // 为 lead(第一行)绑定 hunter 角色模型
265
- await page.evaluate(() => {
266
- const sel = document.querySelector('.member-row .member-select')
267
- const proto = HTMLSelectElement.prototype
268
- Object.getOwnPropertyDescriptor(proto, 'value').set.call(sel, 'ch-folder-hunter')
269
- sel.dispatchEvent(new Event('change', { bubbles: true }))
270
- })
271
- await sleep(1500)
272
- const agentsRes = await api('GET', `/api/workshop/channels/${cid}/agents`, { token })
273
- const lead = (agentsRes?.data ?? agentsRes ?? []).find(a => a.role === 'lead')
274
- const cfgModel = (lead?.config ?? {}).modelRef
275
- const sceneLead = await page.evaluate(() => {
276
- const a = window.__town.scene.getDebugState().agents.find(x => x.role === 'lead' && x.name === 'lead')
277
- return a ? { modelRef: a.modelRef, textureKey: a.textureKey } : null
278
- })
279
- console.log(` 成员绑定 → 服务端 config.modelRef: ${cfgModel} | 场景 modelRef: ${JSON.stringify(sceneLead)}`)
280
- check('成员角色模型绑定落库(config)', cfgModel === 'ch-folder-hunter', `cfg=${cfgModel}`)
281
- check('场景角色即时换装', sceneLead?.modelRef === 'ch-folder-hunter', JSON.stringify(sceneLead))
282
- await page.screenshot({ path: `${OUT}/06-members.png` })
283
-
284
- // ================= 统计场景几何(世界→屏幕投影,与 TownScene3D 相机同构) =================
285
- const sceneGeo = () => page.evaluate(() => ({ w: window.innerWidth, h: window.innerHeight }))
286
- const camState = () => page.evaluate(() => window.__town.scene.getCameraTarget())
287
- const cam = await camState()
288
- const geo = await sceneGeo()
289
-
290
- console.log('\n== 11. Agent 独立活动范围:框选绘制 ==')
291
- await page.evaluate(() => window.__town.scene.setMode('edit'))
292
- await sleep(400)
293
- // 点击 lead 角色选中它(用其 debug 位置反算屏幕坐标;pointerup 触发场景点选)
294
- const leadPos = await page.evaluate(({ cid }) => {
295
- const a = window.__town.scene.getDebugState().agents.find(x => x.role === 'lead' && x.channelId === cid)
296
- return { x: a.x, y: a.y }
297
- }, { cid })
298
- const leadC = worldToClient(await camState(), geo, leadPos.x, leadPos.y)
299
- await page.evaluate(({ x, y }) => {
300
- const c = document.querySelector('.town-host canvas')
301
- c.dispatchEvent(new PointerEvent('pointerup', { bubbles: true, button: 0, clientX: x, clientY: y }))
302
- }, { x: leadC.x, y: leadC.y })
303
- await sleep(400)
304
- const rp1 = await page.evaluate(() => {
305
- const p = document.querySelector('.object-panel')
306
- return { open: !!p, hasRange: !!p?.querySelector('.obj-mini'), status: p?.querySelector('.range-status')?.textContent ?? '' }
307
- })
308
- console.log(' 角色属性面板:', JSON.stringify(rp1))
309
- check('点击角色 → 对象面板含活动范围区块', rp1.open && rp1.hasRange, JSON.stringify(rp1))
310
- // 点「框选绘制」进入绘制模式
311
- await page.evaluate(() => {
312
- const btns = [...document.querySelectorAll('.obj-mini')]
313
- const draw = btns.find(b => (b.textContent || '').includes('框选绘制'))
314
- if (draw) draw.click()
315
- })
316
- await sleep(300)
317
- const drawing = await page.evaluate(() => {
318
- const b = [...document.querySelectorAll('.obj-mini')].find(x => (x.textContent || '').includes('绘制中'))
319
- return b ? b.className : ''
320
- })
321
- check('框选绘制模式激活(按钮高亮)', drawing.includes('on'), `cls=${drawing}`)
322
- // 在 lead 周围拉一个框:范围半径 ≈ 120×80(居中,避免贴近频道边界导致被钳制收缩)
323
- const rFrom = worldToClient(await camState(), geo, leadPos.x - 120, leadPos.y - 80)
324
- const rTo = worldToClient(await camState(), geo, leadPos.x + 120, leadPos.y + 80)
325
- await canvasDrag(page, rFrom, rTo)
326
- await sleep(1300)
327
- const agentsResR = await api('GET', `/api/workshop/channels/${cid}/agents`, { token })
328
- const leadR = (agentsResR?.data ?? agentsResR ?? []).find(a => a.role === 'lead')
329
- const cfgRange = leadR?.config?.range
330
- const sceneRange = await page.evaluate(() => {
331
- const a = window.__town.scene.getDebugState().agents.find(x => x.role === 'lead')
332
- return a?.range ?? null
333
- })
334
- console.log(` 框选后 config.range: ${JSON.stringify(cfgRange)} | scene.range: ${JSON.stringify(sceneRange)}`)
335
- check('框选绘制生成 Agent 活动范围(场景)', !!sceneRange && sceneRange.shape === 'rect', JSON.stringify(sceneRange))
336
- check('范围配置落库(config.range)', !!cfgRange && typeof cfgRange.radiusX === 'number' && cfgRange.shape === 'rect', JSON.stringify(cfgRange))
337
- check('范围中心围绕角色落点', !!cfgRange && Math.abs(cfgRange.x - leadPos.x) < 200 && Math.abs(cfgRange.z - leadPos.y) < 200, JSON.stringify({ cfgRange, leadPos }))
338
- await page.screenshot({ path: `${OUT}/07-agent-range-drawn.png` })
339
-
340
- console.log('\n== 12. Agent 活动范围:滑杆扩张 + 落库 ==')
341
- // 对象面板横轴滑杆(第一个 .obj-range)调到 320;input 实时、change 提交落库
342
- await page.evaluate(() => {
343
- const sliders = [...document.querySelectorAll('.obj-range')]
344
- const rx = sliders[0]
345
- const proto = HTMLInputElement.prototype
346
- Object.getOwnPropertyDescriptor(proto, 'value').set.call(rx, '320')
347
- rx.dispatchEvent(new Event('input', { bubbles: true }))
348
- rx.dispatchEvent(new Event('change', { bubbles: true }))
349
- })
350
- await sleep(1200)
351
- const agentsResR2 = await api('GET', `/api/workshop/channels/${cid}/agents`, { token })
352
- const leadR2 = (agentsResR2?.data ?? agentsResR2 ?? []).find(a => a.role === 'lead')
353
- const cfgRange2 = leadR2?.config?.range
354
- console.log(` 滑杆扩张后 config.range: ${JSON.stringify(cfgRange2)}(扩张前 radiusX=${cfgRange?.radiusX})`)
355
- check('滑杆扩张范围后落库(radiusX 增大)', (cfgRange2?.radiusX ?? 0) >= ((cfgRange?.radiusX ?? 0) + 40), `rx ${cfgRange?.radiusX} → ${cfgRange2?.radiusX}`)
356
-
357
- console.log('\n== 13. Agent 活动范围:清除回退频道 ==')
358
- await page.evaluate(() => {
359
- const btns = [...document.querySelectorAll('.obj-mini')]
360
- const clear = btns.find(b => (b.textContent || '').includes('清除范围'))
361
- if (clear) clear.click()
362
- })
363
- await sleep(1200)
364
- const agentsResR3 = await api('GET', `/api/workshop/channels/${cid}/agents`, { token })
365
- const leadR3 = (agentsResR3?.data ?? agentsResR3 ?? []).find(a => a.role === 'lead')
366
- const sceneRange3 = await page.evaluate(() => {
367
- const a = window.__town.scene.getDebugState().agents.find(x => x.role === 'lead')
368
- return a?.range ?? null
369
- })
370
- console.log(' 清除后 config.range:', JSON.stringify(leadR3?.config?.range), 'scene.range:', JSON.stringify(sceneRange3))
371
- check('清除后 config.range 归空(回退频道边界)', !leadR3?.config?.range, JSON.stringify(leadR3?.config?.range))
372
- check('清除后场景范围移除', sceneRange3 === null, JSON.stringify(sceneRange3))
373
- await page.screenshot({ path: `${OUT}/08-agent-range-cleared.png` })
374
-
375
- console.log('\n== 14. 频道整体拖拽移动 ==')
376
- await page.evaluate(() => window.__town.scene.setMode('edit'))
377
- await sleep(400)
378
- const layBefore = await page.evaluate(({ cid }) => {
379
- const l = window.__town.scene.getChannelLayout(cid)
380
- return { x: l.x, z: l.z, radiusX: l.radiusX, radiusZ: l.radiusZ }
381
- }, { cid })
382
- // 起点选在领地内部、远离成员角色与边界手柄的内点(避免 pickAt 命中角色 / 手柄);
383
- // 拖拽位移 = 终点 − 起点,与起点在领地内的相对偏移无关
384
- const sx = layBefore.x + 120
385
- const sz = layBefore.z + 60
386
- const fromC = worldToClient(cam, geo, sx, sz)
387
- const toC = worldToClient(cam, geo, sx + 260, sz + 180)
388
- await canvasDrag(page, fromC, toC)
389
- await sleep(1400)
390
- const layMoved = await page.evaluate(({ cid }) => {
391
- const l = window.__town.scene.getChannelLayout(cid)
392
- return { x: l.x, z: l.z }
393
- }, { cid })
394
- const movedOk = Math.abs(layMoved.x - (layBefore.x + 260)) <= 32 && Math.abs(layMoved.z - (layBefore.z + 180)) <= 32
395
- console.log(` 移动: (${layBefore.x},${layBefore.z}) → (${layMoved.x},${layMoved.z})`)
396
- check('频道整体拖拽移动到自定义点位', movedOk, JSON.stringify(layMoved))
397
- const layServer1 = (await api('GET', '/api/workshop/scene/layouts', { token })).data.layouts.find(l => l.channelId === cid)
398
- check('频道移动已落库', Math.abs(layServer1.x - layMoved.x) <= 2 && Math.abs(layServer1.z - layMoved.z) <= 2, `server=(${layServer1.x},${layServer1.z})`)
399
-
400
- console.log('\n== 15. 边界手柄拖拽缩放 ==')
401
- // 重新聚焦频道 + 重取相机(拖拽移动时不聚焦,相机仍停在原位,手柄可能在取景外)
402
- await page.evaluate(({ cid }) => window.__town.scene.selectChannel(cid), { cid })
403
- await sleep(1000)
404
- const cam12 = await camState()
405
- const layB = await page.evaluate(({ cid }) => {
406
- const l = window.__town.scene.getChannelLayout(cid)
407
- return { x: l.x, z: l.z, radiusX: l.radiusX, radiusZ: l.radiusZ, rotationY: l.rotationY }
408
- }, { cid })
409
- const rot12 = (layB.rotationY || 0) * Math.PI / 180
410
- const hx = layB.x + layB.radiusX * Math.cos(rot12)
411
- const hz = layB.z + layB.radiusX * Math.sin(rot12)
412
- const hC = worldToClient(cam12, geo, hx, hz)
413
- const hTo = worldToClient(cam12, geo, hx + 160, hz)
414
- await canvasDrag(page, hC, hTo)
415
- await sleep(1300)
416
- const layR = await page.evaluate(({ cid }) => {
417
- const l = window.__town.scene.getChannelLayout(cid)
418
- return { radiusX: l.radiusX, radiusZ: l.radiusZ }
419
- }, { cid })
420
- console.log(` 缩放手柄: radiusX ${layB.radiusX} → ${layR.radiusX}`)
421
- check('边界手柄拖拽调整范围(radiusX 增大)', layR.radiusX > layB.radiusX + 30, `${layB.radiusX}→${layR.radiusX}`)
422
- const layServer2 = (await api('GET', '/api/workshop/scene/layouts', { token })).data.layouts.find(l => l.channelId === cid)
423
- check('边界缩放已落库', Math.abs(layServer2.radiusX - layR.radiusX) <= 2, `server rx=${layServer2.radiusX}`)
424
- await page.screenshot({ path: `${OUT}/07-handle-resize.png` })
425
-
426
- console.log('\n== 13. 移除频道 → 重新放置(同频道最多一个实例) ==')
427
- await page.evaluate(() => {
428
- const btns = [...document.querySelectorAll('.bp-btn')]
429
- const rm = btns.find(b => b.textContent.includes('移除频道'))
430
- if (rm) rm.click()
431
- })
432
- await sleep(1600)
433
- const layGone = (await api('GET', '/api/workshop/scene/layouts', { token })).data.layouts.find(l => l.channelId === cid)
434
- const blocks0 = await page.evaluate(() => window.__town.scene.getDebugState().blocks)
435
- const cardAfter = await page.evaluate(({ cid }) => {
436
- const c = document.querySelector(`.dock-card[data-channel-id="${cid}"]`)
437
- return { draggable: c.getAttribute('draggable'), placed: c.className.includes('placed') }
438
- }, { cid })
439
- console.log(' 移除后: layout=', !!layGone, ' blocks=', blocks0, ' 卡片=', JSON.stringify(cardAfter))
440
- check('频道移除后布局删除', !layGone && blocks0 === 0, `blocks=${blocks0}`)
441
- check('移除后卡片恢复可拖拽(可重新放置)', cardAfter.draggable === 'true' && !cardAfter.placed, JSON.stringify(cardAfter))
442
- await page.evaluate(() => window.__town.scene.setMode('browse'))
443
- await html5Drag(page, `.dock-card[data-channel-id="${cid}"]`, '.town-host canvas', 'application/x-aw-channel', cid, { x: 520, y: 520 })
444
- await sleep(1600)
445
- const layBack = (await api('GET', '/api/workshop/scene/layouts', { token })).data.layouts.find(l => l.channelId === cid)
446
- const blocks1 = await page.evaluate(() => window.__town.scene.getDebugState().blocks)
447
- console.log(' 重新放置后: layout=', !!layBack, ' blocks=', blocks1)
448
- check('移除后重新拖拽放置成功', !!layBack && blocks1 === 1, `layout=${!!layBack} blocks=${blocks1}`)
449
- const blocksAgain2 = await page.evaluate(({ cid }) => {
450
- window.__town.scene.dropChannelOnWorld(900, 700, cid, 'E2E', 3)
451
- return window.__town.scene.getDebugState().blocks
452
- }, { cid })
453
- check('重新放置后同频道仍只一个实例(去重)', blocksAgain2 === 1, `blocks=${blocksAgain2}`)
454
- await page.screenshot({ path: `${OUT}/08-replaced.png` })
455
-
456
- console.log('\n== 14. 刷新后放置与边界恢复(持久化) ==')
457
- await page.reload({ waitUntil: 'domcontentloaded', timeout: 60000 })
458
- let reReady = false
459
- for (let i = 0; i < 50 && !reReady; i++) {
460
- reReady = await page.evaluate(() => !!window.__town?.scene)
461
- if (!reReady) await sleep(500)
462
- }
463
- // 布局加载先于 WS 快照:rebuild 依赖实体基线,轮询等待快照重建领地
464
- let restored = { blocks: 0, chAgents: 0, hasLayout: false, radiusX: null }
465
- for (let i = 0; i < 30; i++) {
466
- restored = await page.evaluate(({ cid }) => {
467
- const s = window.__town.scene.getDebugState()
468
- const l = window.__town.scene.getChannelLayout(cid)
469
- const chAgents = s.agents.filter(a => a.channelId === cid).length
470
- return { blocks: s.blocks, chAgents, hasLayout: !!l, radiusX: l?.radiusX ?? null }
471
- }, { cid })
472
- if (restored.blocks >= 1 && restored.hasLayout) break
473
- await sleep(500)
474
- }
475
- console.log(' 刷新后:', JSON.stringify(restored))
476
- check('刷新后频道领地恢复', restored.blocks >= 1 && restored.hasLayout, JSON.stringify(restored))
477
- check('刷新后边界设置保留(radiusX>默认)', (restored.radiusX ?? 0) >= 80, `radiusX=${restored.radiusX}`)
478
- check('刷新后频道成员落地', restored.chAgents === 3, `agents=${restored.chAgents}`)
479
- await page.screenshot({ path: `${OUT}/09-restored.png` })
480
-
481
- console.log('\n== 18. 实时信息接收器:FIFO 聊天气泡 ==')
482
- // 经 handleTownEvent 注入 3 条同频道短消息(顺序: lead → worker-a → worker-b),
483
- // 断言接收器按 FIFO 逐条消费:瞬时只显示第 1 条;随后用 debugAdvanceReceiver
484
- // 确定性推进,逐步验证 2、3 条按序渲染、各自挂在对应 Agent 头顶
485
- const bubbleIds = await page.evaluate(({ cid }) => {
486
- const s = window.__town.scene.getDebugState().agents.filter(a => a.channelId === cid)
487
- return {
488
- lead: s.find(a => a.role === 'lead')?.agentId,
489
- w1: s.find(a => a.name === 'worker-a')?.agentId,
490
- w2: s.find(a => a.name === 'worker-b')?.agentId,
491
- }
492
- }, { cid })
493
- await page.evaluate(({ cid, bubbleIds }) => {
494
- const scene = window.__town.scene
495
- const mk = (agentId, text) => ({
496
- v: 1, type: 'agent.message', seq: Math.floor(Math.random() * 1e6) + 1,
497
- at: new Date().toISOString(), channelId: cid, agentId,
498
- payload: { parts: [{ text }] },
499
- })
500
- scene.handleTownEvent(mk(bubbleIds.lead, '大家好,我们要开工了'))
501
- scene.handleTownEvent(mk(bubbleIds.w1, '收到,领队!'))
502
- scene.handleTownEvent(mk(bubbleIds.w2, '我这就去办。'))
503
- }, { cid, bubbleIds })
504
- const bubbleState = () => page.evaluate(({ cid }) => {
505
- return window.__town.scene.getDebugState().agents
506
- .filter(a => a.channelId === cid)
507
- .map(a => ({ name: a.name, bubble: a.bubbleText }))
508
- }, { cid })
509
- const advance = (cid) => page.evaluate(({ cid }) => window.__town.scene.debugAdvanceReceiver(cid), { cid })
510
- await sleep(500)
511
- const b1 = await bubbleState()
512
- console.log(' T+0.5s 当前气泡(应只有第 1 条):', JSON.stringify(b1))
513
- check('FIFO:注入后瞬时只渲染第 1 条', b1.some(a => a.bubble === '大家好,我们要开工了') && !b1.some(a => a.bubble === '收到,领队!') && !b1.some(a => a.bubble === '我这就去办。'), JSON.stringify(b1))
514
- await page.screenshot({ path: `${OUT}/10-bubble-1.png` })
515
- await advance(cid)
516
- await sleep(350)
517
- const b2 = await bubbleState()
518
- console.log(' 推进一次后当前气泡(应为第 2 条):', JSON.stringify(b2))
519
- check('FIFO:推进后按序渲染第 2 条(worker-a)', b2.some(a => a.name === 'worker-a' && a.bubble === '收到,领队!') && !b2.some(a => a.bubble === '大家好,我们要开工了') && !b2.some(a => a.bubble === '我这就去办。'), JSON.stringify(b2))
520
- await advance(cid)
521
- await sleep(350)
522
- const b3 = await bubbleState()
523
- console.log(' 再推进一次后当前气泡(应为第 3 条):', JSON.stringify(b3))
524
- check('FIFO:再次推进后按序渲染第 3 条(worker-b)', b3.some(a => a.name === 'worker-b' && a.bubble === '我这就去办。') && !b3.some(a => a.bubble === '收到,领队!'), JSON.stringify(b3))
525
- await advance(cid)
526
- await sleep(350)
527
- const b4 = await bubbleState()
528
- check('FIFO:队列消费完毕后气泡清空', b4.every(a => a.bubble === null), JSON.stringify(b4))
529
- await page.screenshot({ path: `${OUT}/11-bubble-drained.png` })
530
-
531
- console.log('\n== 19. 数据驱动模型:动画监听(motion)+ debug.anim ==')
532
- // motion 事件可订阅:场景内 Agent 走走停停漫游 → 动画状态在 idle/walk 间切换并广播
533
- const motionEvents = await page.evaluate(() => new Promise((resolve) => {
534
- const s = window.__town.scene
535
- const out = []
536
- let off = null
537
- off = s.on('motion', (e) => {
538
- if (e) out.push({ agentName: e.agentName, anim: e.anim })
539
- if (out.length >= 3 && off) { off(); resolve(out) }
540
- })
541
- setTimeout(() => { if (off) off(); resolve(out) }, 3500)
542
- }))
543
- console.log(' motion 事件:', JSON.stringify(motionEvents.slice(0, 3)))
544
- check('motion 事件可订阅(动画数据驱动)', (motionEvents?.length ?? 0) >= 1 && motionEvents.every(e => e.anim === 'idle' || e.anim === 'walk'), JSON.stringify(motionEvents.slice(0, 3)))
545
- const anims = await page.evaluate(({ cid }) => {
546
- return window.__town.scene.getDebugState().agents.filter(a => a.channelId === cid).map(a => a.anim)
547
- }, { cid })
548
- console.log(' debug.anim:', JSON.stringify(anims))
549
- check('debug.anim 随移动输出(idle/walk)', anims.length === 3 && anims.every(a => a === 'idle' || a === 'walk'), JSON.stringify(anims))
550
- await page.screenshot({ path: `${OUT}/12-data-driven.png` })
551
-
552
- await browser.close()
553
- return { pass, fail }
554
- }
555
-
556
- /** 世界坐标 → 屏幕坐标(与 TownScene3D 相机投影同构:dolly=1, fov=50, 高 620, 距 940) */
557
- function worldToClient(cam, { w, h }, wx, wz) {
558
- const tx = cam.x
559
- const tz = cam.z
560
- const px = tx
561
- const py = 620
562
- const pz = tz + 940 * 0.76
563
- // forward = normalize(target - pos)
564
- let fx = tx - px
565
- let fy = 20 - py
566
- let fz = tz - pz
567
- const fl = Math.hypot(fx, fy, fz) || 1
568
- fx /= fl; fy /= fl; fz /= fl
569
- // right = normalize(cross(forward, up=(0,1,0))) = (-fz, 0, fx)
570
- const rl = Math.hypot(fz, fx) || 1
571
- const rx = -fz / rl
572
- const rz = fx / rl
573
- // up = cross(right, forward)
574
- const ux = -rz * fy
575
- const uy = rz * fx - rx * fz
576
- const uz = rx * fy
577
- const vx = wx - px
578
- const vy = 0 - py
579
- const vz = wz - pz
580
- const xc = vx * rx + vz * rz
581
- const yc = vx * ux + vy * uy + vz * uz
582
- const zc = vx * fx + vy * fy + vz * fz
583
- const fov = (50 * Math.PI) / 180
584
- const aspect = w / h
585
- const zSafe = Math.max(1, zc)
586
- const ndcx = xc / (zSafe * Math.tan(fov / 2) * aspect)
587
- const ndcy = yc / (zSafe * Math.tan(fov / 2))
588
- return { x: Math.round((ndcx * 0.5 + 0.5) * w), y: Math.round((-ndcy * 0.5 + 0.5) * h) }
589
- }
590
-
591
- /** 场景指针拖拽:canvas pointerdown → window pointermove → window pointerup */
592
- async function canvasDrag(page, from, to) {
593
- await page.evaluate(({ from, to }) => {
594
- const c = document.querySelector('.town-host canvas')
595
- if (!c) throw new Error('canvas 缺失')
596
- c.dispatchEvent(new PointerEvent('pointerdown', { bubbles: true, button: 0, clientX: from.x, clientY: from.y }))
597
- window.dispatchEvent(new PointerEvent('pointermove', { bubbles: true, clientX: to.x, clientY: to.y }))
598
- window.dispatchEvent(new PointerEvent('pointerup', { bubbles: true, clientX: to.x, clientY: to.y }))
599
- }, { from, to })
600
- }
601
-
602
- /** 真实 HTML5 DnD 模拟:源卡 dragstart → 目标 dragover/drop(带 dataTransfer) */
603
- async function html5Drag(page, sourceSel, targetSel, mime, data, { x, y }) {
604
- await page.evaluate(({ sourceSel, targetSel, mime, data, x, y }) => {
605
- const dt = new DataTransfer()
606
- dt.setData(mime, data)
607
- dt.setData('text/plain', data)
608
- dt.effectAllowed = 'copy'
609
- const src = document.querySelector(sourceSel)
610
- const tgt = document.querySelector(targetSel)
611
- if (!src || !tgt) throw new Error(`DnD 目标缺失: ${sourceSel} / ${targetSel}`)
612
- src.dispatchEvent(new DragEvent('dragstart', { bubbles: true, cancelable: true, dataTransfer: dt }))
613
- tgt.dispatchEvent(new DragEvent('dragover', { bubbles: true, cancelable: true, dataTransfer: dt, clientX: x, clientY: y }))
614
- tgt.dispatchEvent(new DragEvent('drop', { bubbles: true, cancelable: true, dataTransfer: dt, clientX: x, clientY: y }))
615
- src.dispatchEvent(new DragEvent('dragend', { bubbles: true, dataTransfer: dt }))
616
- }, { sourceSel, targetSel, mime, data, x, y })
617
- }
618
-
619
- main().catch((e) => { console.error(e); process.exit(2) })