agentworkshop 0.7.33 → 0.7.37

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (945) hide show
  1. package/.output/.AgentWorkShop/aml-python/aml_eval.py +171 -0
  2. package/.output/.AgentWorkShop/aml-python/amlkit.py +120 -0
  3. package/.output/.AgentWorkShop/aml-python/requirements.txt +7 -0
  4. package/.output/.AgentWorkShop/aml-python/train-example.py +92 -0
  5. package/.output/.AgentWorkShop/schema.json +2 -1
  6. package/.output/nitro.json +1 -1
  7. package/.output/public/_nuxt/{DLljr7g0.js → 45zuyAso.js} +1 -1
  8. package/.output/public/_nuxt/4sIEbgcl.js +42 -0
  9. package/.output/public/_nuxt/8NMOXZOV.js +1 -0
  10. package/.output/public/_nuxt/BCGafdXT.js +2 -0
  11. package/.output/public/_nuxt/BDNMzG2s2.js +1 -0
  12. package/.output/public/_nuxt/{C-mDhyEd.js → BDmh31hl.js} +1 -1
  13. package/.output/public/_nuxt/BFkgkW8u.js +4 -0
  14. package/.output/public/_nuxt/BG8sCcwx.js +14 -0
  15. package/.output/public/_nuxt/{D8CqF0yy.js → BHA40aHa.js} +1 -1
  16. package/.output/public/_nuxt/BJHKLJJU.js +1 -0
  17. package/.output/public/_nuxt/{DoTdlVVe2.js → BN6iuJEg2.js} +1 -1
  18. package/.output/public/_nuxt/BNT8gYU92.js +4 -0
  19. package/.output/public/_nuxt/BU83-NnX.js +106 -0
  20. package/.output/public/_nuxt/BYhEUx8t.js +17 -0
  21. package/.output/public/_nuxt/BzHEilTt.js +1 -0
  22. package/.output/public/_nuxt/{Ct-WOVr4.js → C3J6FYKa.js} +1 -1
  23. package/.output/public/_nuxt/C3gwHTz0.js +1 -0
  24. package/.output/public/_nuxt/C4DWUZ6d2.js +1 -0
  25. package/.output/public/_nuxt/C5gUkRwn.js +1 -0
  26. package/.output/public/_nuxt/CClOy-Hz2.js +1 -0
  27. package/.output/public/_nuxt/{CUXCQXjG.js → CM12FuB42.js} +1 -1
  28. package/.output/public/_nuxt/{BSCpFtzG.js → CSkxz2NX.js} +1 -1
  29. package/.output/public/_nuxt/CWoJjWmZ.js +1 -0
  30. package/.output/public/_nuxt/CY9LbPCI.js +1 -0
  31. package/.output/public/_nuxt/CYWVXZTS.js +7 -0
  32. package/.output/public/_nuxt/CZiw7sEV.js +1 -0
  33. package/.output/public/_nuxt/C_OLzD09.js +1 -0
  34. package/.output/public/_nuxt/C__m4EhR.js +1 -0
  35. package/.output/public/_nuxt/Cbq-mryP.js +1 -0
  36. package/.output/public/_nuxt/{C4OAdbVK2.js → Cc_9VzD42.js} +1 -1
  37. package/.output/public/_nuxt/{BASN8nZ0.js → CdPzkOMV.js} +1 -1
  38. package/.output/public/_nuxt/Cec0Ua3F.js +1 -0
  39. package/.output/public/_nuxt/{DYKVPzN-.js → CoNpEq5X.js} +1 -1
  40. package/.output/public/_nuxt/CojCTLKD.js +1 -0
  41. package/.output/public/_nuxt/{B7wL3pDk.js → Crod5z2f.js} +1 -1
  42. package/.output/public/_nuxt/CzlMDL5H.js +13 -0
  43. package/.output/public/_nuxt/{G0qIw7Gq2.js → D0ZBQrN_2.js} +1 -1
  44. package/.output/public/_nuxt/{Lp7Ll94I.js → D1YDxZpZ.js} +1 -1
  45. package/.output/public/_nuxt/{Bc0AmjfT.js → D20Yamr4.js} +1 -1
  46. package/.output/public/_nuxt/D6uzXueg.js +2 -0
  47. package/.output/public/_nuxt/D9Oidm5I.js +1 -0
  48. package/.output/public/_nuxt/DAe0h2MB.js +1 -0
  49. package/.output/public/_nuxt/DBHNsT1Y.js +23 -0
  50. package/.output/public/_nuxt/DDShH71m.js +1 -0
  51. package/.output/public/_nuxt/DDgJcSET.js +19 -0
  52. package/.output/public/_nuxt/DHFrCUxA2.js +13 -0
  53. package/.output/public/_nuxt/{BcrN7QEl2.js → DIaZ2PTo2.js} +1 -1
  54. package/.output/public/_nuxt/DPnwL14Y.js +1 -0
  55. package/.output/public/_nuxt/DR12_WCA.js +3 -0
  56. package/.output/public/_nuxt/{B9nXmjSB.js → DUrecWPx.js} +4 -4
  57. package/.output/public/_nuxt/DVsjtsvZ2.js +1 -0
  58. package/.output/public/_nuxt/DYr1VMiQ.js +6 -0
  59. package/.output/public/_nuxt/DZtm4l-P2.js +1 -0
  60. package/.output/public/_nuxt/DdD9mCHM.js +1 -0
  61. package/.output/public/_nuxt/DeJykBFf.js +9 -0
  62. package/.output/public/_nuxt/{DoMxCWN52.js → DeyBFhKH2.js} +1 -1
  63. package/.output/public/_nuxt/DkGQ7lnb2.js +1 -0
  64. package/.output/public/_nuxt/DmqknNvV.js +18 -0
  65. package/.output/public/_nuxt/DnUuIR83.js +1 -0
  66. package/.output/public/_nuxt/DrYV5i68.js +1 -0
  67. package/.output/public/_nuxt/{B5S_UyaC.js → DtYHUi5Z.js} +1 -1
  68. package/.output/public/_nuxt/Dz_Q3Lpw2.js +1 -0
  69. package/.output/public/_nuxt/DzbFpZRk.js +3 -0
  70. package/.output/public/_nuxt/HBLJ-wei.js +1 -0
  71. package/.output/public/_nuxt/JCoYF4IJ.js +31 -0
  72. package/.output/public/_nuxt/JTLM-kqr2.js +1 -0
  73. package/.output/public/_nuxt/{BeIfu4N3.js → KZQX7xoM.js} +2 -2
  74. package/.output/public/_nuxt/S_fVQwJK.js +1 -0
  75. package/.output/public/_nuxt/TownView.0oLiQgTC.css +1 -0
  76. package/.output/public/_nuxt/YnQxK3eG.js +1 -0
  77. package/.output/public/_nuxt/_id_.D-SYuyZb.css +1 -0
  78. package/.output/public/_nuxt/_id_.hma_BU6T.css +1 -0
  79. package/.output/public/_nuxt/_wsId_.B12v3PhY.css +1 -0
  80. package/.output/public/_nuxt/aLLjF2K-2.js +1 -0
  81. package/.output/public/_nuxt/aWWIh8YL.js +24 -0
  82. package/.output/public/_nuxt/ahgEJu2R.js +1 -0
  83. package/.output/public/_nuxt/aml.COEKNNqK.css +1 -0
  84. package/.output/public/_nuxt/builds/latest.json +1 -1
  85. package/.output/public/_nuxt/builds/meta/a66fdef7-dcfd-453b-b1f6-543c7dfd98d5.json +1 -0
  86. package/.output/public/_nuxt/daq.B3265ZDn.css +1 -0
  87. package/.output/public/_nuxt/dcw.DLYZqEhT.css +1 -0
  88. package/.output/public/_nuxt/default.DE_vT238.css +1 -0
  89. package/.output/public/_nuxt/entry.BB-Eeh-J.css +1 -0
  90. package/.output/public/_nuxt/jZsY8yYz.js +1 -0
  91. package/.output/public/_nuxt/logs.CqFyMrJw.css +1 -0
  92. package/.output/public/_nuxt/pages.ooEzrMm9.css +1 -0
  93. package/.output/public/_nuxt/pdk8jLGT.js +1 -0
  94. package/.output/public/_nuxt/plugins.5e5chZ67.css +1 -0
  95. package/.output/public/_nuxt/pz2JDAM7.js +2 -0
  96. package/.output/public/_nuxt/settings.Dm3M0RLy.css +1 -0
  97. package/.output/public/_nuxt/town.DKIAhKnx.css +1 -0
  98. package/.output/public/_nuxt/users.CXnP2E08.css +1 -0
  99. package/.output/public/_nuxt/vRTjoWqd.js +1 -0
  100. package/.output/public/_nuxt/workshop.Jk5HxWPE.css +1 -0
  101. package/.output/public/_nuxt/zIGh7R49.js +75 -0
  102. package/.output/public/_nuxt/zq5t1vyX.js +1 -0
  103. package/.output/server/chunks/_/character-asset.repo.mjs +1 -1
  104. package/.output/server/chunks/_/entity.mjs +174 -0
  105. package/.output/server/chunks/_/entity.mjs.map +1 -0
  106. package/.output/server/chunks/_/env-manager.mjs +162 -0
  107. package/.output/server/chunks/_/env-manager.mjs.map +1 -0
  108. package/.output/server/chunks/_/host-bindings.mjs +1 -1
  109. package/.output/server/chunks/_/nitro.mjs +1568 -1043
  110. package/.output/server/chunks/_/nitro.mjs.map +1 -1
  111. package/.output/server/chunks/_/scene-layout.repo.mjs +1 -1
  112. package/.output/server/chunks/build/{TownView-BdHnAilw.mjs → TownView-jVazYOjN.mjs} +141 -141
  113. package/.output/server/chunks/build/{TownView-BdHnAilw.mjs.map → TownView-jVazYOjN.mjs.map} +1 -1
  114. package/.output/server/chunks/build/{_id_-Cb845FHR.mjs → _id_-CfVosNg3.mjs} +136 -136
  115. package/.output/server/chunks/build/{_id_-Cb845FHR.mjs.map → _id_-CfVosNg3.mjs.map} +1 -1
  116. package/.output/server/chunks/build/{_id_-fadFPl2i.mjs → _id_-Hwr4rZpr.mjs} +32 -32
  117. package/.output/server/chunks/build/{_id_-fadFPl2i.mjs.map → _id_-Hwr4rZpr.mjs.map} +1 -1
  118. package/.output/server/chunks/build/{_wsId_-CTZswnm5.mjs → _wsId_-BVg3bB77.mjs} +175 -165
  119. package/.output/server/chunks/build/{_wsId_-CTZswnm5.mjs.map → _wsId_-BVg3bB77.mjs.map} +1 -1
  120. package/.output/server/chunks/build/aml-BCSJCdX7.mjs +588 -0
  121. package/.output/server/chunks/build/aml-BCSJCdX7.mjs.map +1 -0
  122. package/.output/server/chunks/build/{daq-BvihjQyW.mjs → daq-C03Uu5UE.mjs} +108 -106
  123. package/.output/server/chunks/build/daq-C03Uu5UE.mjs.map +1 -0
  124. package/.output/server/chunks/build/{dcw-Ks2vJ4PF.mjs → dcw-6vEYVeje.mjs} +44 -44
  125. package/.output/server/chunks/build/{dcw-Ks2vJ4PF.mjs.map → dcw-6vEYVeje.mjs.map} +1 -1
  126. package/.output/server/chunks/build/{default-GgHt4O2R.mjs → default-hseyOqBT.mjs} +30 -27
  127. package/.output/server/chunks/build/{default-GgHt4O2R.mjs.map → default-hseyOqBT.mjs.map} +1 -1
  128. package/.output/server/chunks/build/{logs-CYBhkQwh.mjs → logs-B-xhuqln.mjs} +35 -35
  129. package/.output/server/chunks/build/{logs-CYBhkQwh.mjs.map → logs-B-xhuqln.mjs.map} +1 -1
  130. package/.output/server/chunks/build/{pages-C-6BRtv8.mjs → pages-BO7yZsXA.mjs} +18 -27
  131. package/.output/server/chunks/build/pages-BO7yZsXA.mjs.map +1 -0
  132. package/.output/server/chunks/build/{plugins-dZRegC7m.mjs → plugins-CUWmMdyt.mjs} +17 -17
  133. package/.output/server/chunks/build/{plugins-dZRegC7m.mjs.map → plugins-CUWmMdyt.mjs.map} +1 -1
  134. package/.output/server/chunks/build/{settings-CgDLkP3s.mjs → settings-DoQ2Oq3P.mjs} +43 -43
  135. package/.output/server/chunks/build/{settings-CgDLkP3s.mjs.map → settings-DoQ2Oq3P.mjs.map} +1 -1
  136. package/.output/server/chunks/build/{town-DJ-V5G9U.mjs → town-BOl6hs9B.mjs} +7 -7
  137. package/.output/server/chunks/build/{town-DJ-V5G9U.mjs.map → town-BOl6hs9B.mjs.map} +1 -1
  138. package/.output/server/chunks/build/useDaqStream-CIBaiGAl.mjs +1 -1
  139. package/.output/server/chunks/build/useDcwStream-CBbiYnWe.mjs +1 -1
  140. package/.output/server/chunks/build/{useWorkshopWs-CprkZEdq.mjs → useWorkshopWs-C_I7q9As.mjs} +110 -32
  141. package/.output/server/chunks/build/{useWorkshopWs-CprkZEdq.mjs.map → useWorkshopWs-C_I7q9As.mjs.map} +1 -1
  142. package/.output/server/chunks/build/{users-4nzxTjFT.mjs → users-fohSmF-J.mjs} +6 -6
  143. package/.output/server/chunks/build/{users-4nzxTjFT.mjs.map → users-fohSmF-J.mjs.map} +1 -1
  144. package/.output/server/chunks/build/{workshop-81xhz368.mjs → workshop-DX5-ldc4.mjs} +15 -15
  145. package/.output/server/chunks/build/{workshop-81xhz368.mjs.map → workshop-DX5-ldc4.mjs.map} +1 -1
  146. package/.output/server/chunks/routes/api/workshop/agent-tools/index.post.mjs +21 -8
  147. package/.output/server/chunks/routes/api/workshop/agent-tools/index.post.mjs.map +1 -1
  148. package/.output/server/chunks/routes/api/workshop/aml/datasets/_id/preview.get.mjs +1 -1
  149. package/.output/server/chunks/routes/api/workshop/aml/datasets/_id_.delete.mjs +58 -0
  150. package/.output/server/chunks/routes/api/workshop/aml/datasets/_id_.delete.mjs.map +1 -0
  151. package/.output/server/chunks/routes/api/workshop/aml/datasets/_id_.get.mjs +27 -6
  152. package/.output/server/chunks/routes/api/workshop/aml/datasets/_id_.get.mjs.map +1 -1
  153. package/.output/server/chunks/routes/api/workshop/aml/datasets/_id_.patch.mjs +49 -0
  154. package/.output/server/chunks/routes/api/workshop/aml/datasets/_id_.patch.mjs.map +1 -0
  155. package/.output/server/chunks/routes/api/workshop/aml/entities/prune.post.mjs +45 -0
  156. package/.output/server/chunks/routes/api/workshop/aml/entities/prune.post.mjs.map +1 -0
  157. package/.output/server/chunks/routes/api/workshop/aml/env/recheck.post.mjs +30 -0
  158. package/.output/server/chunks/routes/api/workshop/aml/env/recheck.post.mjs.map +1 -0
  159. package/.output/server/chunks/routes/api/workshop/aml/env/uv.post.mjs +40 -0
  160. package/.output/server/chunks/routes/api/workshop/aml/env/uv.post.mjs.map +1 -0
  161. package/.output/server/chunks/routes/api/workshop/aml/env/venv.post.mjs +42 -0
  162. package/.output/server/chunks/routes/api/workshop/aml/env/venv.post.mjs.map +1 -0
  163. package/.output/server/chunks/routes/api/workshop/aml/index.get.mjs +1 -1
  164. package/.output/server/chunks/routes/api/workshop/aml/index.post.mjs +1 -1
  165. package/.output/server/chunks/routes/api/workshop/aml/index2.get.mjs +4 -22
  166. package/.output/server/chunks/routes/api/workshop/aml/index2.get.mjs.map +1 -1
  167. package/.output/server/chunks/routes/api/workshop/aml/index2.post.mjs +1 -1
  168. package/.output/server/chunks/routes/api/workshop/aml/index3.get.mjs +4 -16
  169. package/.output/server/chunks/routes/api/workshop/aml/index3.get.mjs.map +1 -1
  170. package/.output/server/chunks/routes/api/workshop/aml/index4.get.mjs +19 -34
  171. package/.output/server/chunks/routes/api/workshop/aml/index4.get.mjs.map +1 -1
  172. package/.output/server/chunks/routes/api/workshop/aml/index5.get.mjs +41 -0
  173. package/.output/server/chunks/routes/api/workshop/aml/index5.get.mjs.map +1 -0
  174. package/.output/server/chunks/routes/api/workshop/aml/index6.get.mjs +62 -0
  175. package/.output/server/chunks/routes/api/workshop/aml/index6.get.mjs.map +1 -0
  176. package/.output/server/chunks/routes/api/workshop/aml/jobs/_id/cancel.post.mjs +1 -1
  177. package/.output/server/chunks/routes/api/workshop/aml/jobs/_id/logs.get.mjs +1 -1
  178. package/.output/server/chunks/routes/api/workshop/aml/jobs/_id/retry.post.mjs +1 -1
  179. package/.output/server/chunks/routes/api/workshop/aml/jobs/_id_.delete.mjs +63 -0
  180. package/.output/server/chunks/routes/api/workshop/aml/jobs/_id_.delete.mjs.map +1 -0
  181. package/.output/server/chunks/routes/api/workshop/aml/models/_id/predict.post.mjs +1 -1
  182. package/.output/server/chunks/routes/api/workshop/aml/models/_id/promote.post.mjs +1 -1
  183. package/.output/server/chunks/routes/api/workshop/aml/models/_id_.delete.mjs +54 -0
  184. package/.output/server/chunks/routes/api/workshop/aml/models/_id_.delete.mjs.map +1 -0
  185. package/.output/server/chunks/routes/api/workshop/aml/models/_id_.patch.mjs +46 -0
  186. package/.output/server/chunks/routes/api/workshop/aml/models/_id_.patch.mjs.map +1 -0
  187. package/.output/server/chunks/routes/api/workshop/assets/index.post.mjs +1 -1
  188. package/.output/server/chunks/routes/api/workshop/assets/index2.post.mjs +1 -1
  189. package/.output/server/chunks/routes/api/workshop/channel-templates/_id/instantiate.post.mjs +2 -2
  190. package/.output/server/chunks/routes/api/workshop/channels/_id/activate.post.mjs +1 -1
  191. package/.output/server/chunks/routes/api/workshop/channels/_id/index.post.mjs +1 -1
  192. package/.output/server/chunks/routes/api/workshop/channels/_id/index.put.mjs +1 -1
  193. package/.output/server/chunks/routes/api/workshop/channels/_id/index4.get.mjs +1 -1
  194. package/.output/server/chunks/routes/api/workshop/channels/_id/terminals.get.mjs +1 -1
  195. package/.output/server/chunks/routes/api/workshop/channels/index.get.mjs +1 -1
  196. package/.output/server/chunks/routes/api/workshop/channels.post.mjs +4 -4
  197. package/.output/server/chunks/routes/api/workshop/daq/_id/bind.post.mjs +1 -1
  198. package/.output/server/chunks/routes/api/workshop/daq/_id/bindings.put.mjs +1 -1
  199. package/.output/server/chunks/routes/api/workshop/daq/_id/samples.get.mjs +1 -1
  200. package/.output/server/chunks/routes/api/workshop/daq/_id/test.post.mjs +1 -1
  201. package/.output/server/chunks/routes/api/workshop/daq/_id_.delete.mjs +1 -1
  202. package/.output/server/chunks/routes/api/workshop/daq/_id_.patch.mjs +1 -1
  203. package/.output/server/chunks/routes/api/workshop/daq/controller.post.mjs +1 -1
  204. package/.output/server/chunks/routes/api/workshop/daq/index.post.mjs +1 -1
  205. package/.output/server/chunks/routes/api/workshop/daq/infra/reconnect.post.mjs +1 -1
  206. package/.output/server/chunks/routes/api/workshop/daq/infra.get.mjs +1 -1
  207. package/.output/server/chunks/routes/api/workshop/daq/templates/_key_.delete.mjs +1 -1
  208. package/.output/server/chunks/routes/api/workshop/daq/templates/_key_.patch.mjs +1 -1
  209. package/.output/server/chunks/routes/api/workshop/daq/test-driver.post.mjs +1 -1
  210. package/.output/server/chunks/routes/api/workshop/dcw/_id/bind.post.mjs +1 -1
  211. package/.output/server/chunks/routes/api/workshop/dcw/_id/bindings.put.mjs +1 -1
  212. package/.output/server/chunks/routes/api/workshop/dcw/_id/param-ledger.get.mjs +1 -1
  213. package/.output/server/chunks/routes/api/workshop/dcw/_id/read.post.mjs +1 -1
  214. package/.output/server/chunks/routes/api/workshop/dcw/_id/test.post.mjs +1 -1
  215. package/.output/server/chunks/routes/api/workshop/dcw/_id/write.post.mjs +1 -1
  216. package/.output/server/chunks/routes/api/workshop/dcw/_id_.delete.mjs +1 -1
  217. package/.output/server/chunks/routes/api/workshop/dcw/_id_.patch.mjs +1 -1
  218. package/.output/server/chunks/routes/api/workshop/dcw/controller.post.mjs +1 -1
  219. package/.output/server/chunks/routes/api/workshop/dcw/index.get.mjs +1 -1
  220. package/.output/server/chunks/routes/api/workshop/dcw/index.post.mjs +1 -1
  221. package/.output/server/chunks/routes/api/workshop/dcw/index2.get.mjs +1 -1
  222. package/.output/server/chunks/routes/api/workshop/dcw/index2.post.mjs +1 -1
  223. package/.output/server/chunks/routes/api/workshop/dcw/index3.get.mjs +1 -1
  224. package/.output/server/chunks/routes/api/workshop/dcw/index3.post.mjs +1 -1
  225. package/.output/server/chunks/routes/api/workshop/dcw/index4.get.mjs +1 -1
  226. package/.output/server/chunks/routes/api/workshop/dcw/index4.post.mjs +1 -1
  227. package/.output/server/chunks/routes/api/workshop/dcw/index5.get.mjs +1 -1
  228. package/.output/server/chunks/routes/api/workshop/dcw/journal/node/_nodeId/rollback.post.mjs +1 -1
  229. package/.output/server/chunks/routes/api/workshop/dcw/line/query.get.mjs +1 -1
  230. package/.output/server/chunks/routes/api/workshop/dcw/lines/_id/start.post.mjs +1 -1
  231. package/.output/server/chunks/routes/api/workshop/dcw/lines/_id/stop.post.mjs +1 -1
  232. package/.output/server/chunks/routes/api/workshop/dcw/lines/_id_.delete.mjs +1 -1
  233. package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id/judge.post.mjs +1 -1
  234. package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id/rollback.post.mjs +1 -1
  235. package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id/series.get.mjs +1 -1
  236. package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id_.get.mjs +1 -1
  237. package/.output/server/chunks/routes/api/workshop/dcw/products/_id_.delete.mjs +1 -1
  238. package/.output/server/chunks/routes/api/workshop/dcw/products/_id_.patch.mjs +1 -1
  239. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/apply.post.mjs +1 -1
  240. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/mark-good.post.mjs +1 -1
  241. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/rollback-good.post.mjs +1 -1
  242. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id_.delete.mjs +1 -1
  243. package/.output/server/chunks/routes/api/workshop/dcw/runs/_id/close.post.mjs +1 -1
  244. package/.output/server/chunks/routes/api/workshop/dcw/runs/_id/data.get.mjs +1 -1
  245. package/.output/server/chunks/routes/api/workshop/dcw/runs/_id/rollback.post.mjs +1 -1
  246. package/.output/server/chunks/routes/api/workshop/dcw/templates/_key_.delete.mjs +1 -1
  247. package/.output/server/chunks/routes/api/workshop/dcw/templates/_key_.patch.mjs +1 -1
  248. package/.output/server/chunks/routes/api/workshop/dcw/test-driver.post.mjs +1 -1
  249. package/.output/server/chunks/routes/api/workshop/device-twins/_id_.delete.mjs +1 -1
  250. package/.output/server/chunks/routes/api/workshop/device-twins/_id_.patch.mjs +1 -1
  251. package/.output/server/chunks/routes/api/workshop/harnesses/_id/providers.get.mjs +1 -1
  252. package/.output/server/chunks/routes/api/workshop/harnesses.get.mjs +1 -1
  253. package/.output/server/chunks/routes/api/workshop/hitl/pending.get.mjs +1 -1
  254. package/.output/server/chunks/routes/api/workshop/hitl/respond.post.mjs +1 -1
  255. package/.output/server/chunks/routes/api/workshop/index.put.mjs +1 -1
  256. package/.output/server/chunks/routes/api/workshop/index2.get.mjs +12 -1
  257. package/.output/server/chunks/routes/api/workshop/index2.get.mjs.map +1 -1
  258. package/.output/server/chunks/routes/api/workshop/index3.post.mjs +1 -1
  259. package/.output/server/chunks/routes/api/workshop/index4.post.mjs +1 -1
  260. package/.output/server/chunks/routes/api/workshop/index5.get.mjs +1 -1
  261. package/.output/server/chunks/routes/api/workshop/index5.post.mjs +1 -1
  262. package/.output/server/chunks/routes/api/workshop/index6.get.mjs +1 -1
  263. package/.output/server/chunks/routes/api/workshop/index6.post.mjs +1 -1
  264. package/.output/server/chunks/routes/api/workshop/plugins/_name/disable.post.mjs +1 -1
  265. package/.output/server/chunks/routes/api/workshop/plugins/_name/enable.post.mjs +1 -1
  266. package/.output/server/chunks/routes/api/workshop/scene/layouts/_channelId_.delete.mjs +1 -1
  267. package/.output/server/chunks/routes/api/workshop/scene/layouts/_channelId_.put.mjs +1 -1
  268. package/.output/server/chunks/routes/api/workshop/teams/_id/deploy.post.mjs +1 -1
  269. package/.output/server/chunks/routes/api/workshop/teams/_id/index.put.mjs +1 -1
  270. package/.output/server/chunks/routes/api/workshop/teams/_id/index2.get.mjs +1 -1
  271. package/.output/server/chunks/routes/api/workshop/workspaces/_id/channel-templates/_tplId_.post.mjs +2 -2
  272. package/.output/server/chunks/routes/renderer.mjs +2 -2
  273. package/.output/server/chunks/virtual/entry.mjs +103 -17
  274. package/.output/server/chunks/virtual/precomputed.mjs +1 -1
  275. package/.output/server/package.json +1 -1
  276. package/README-zh.md +578 -507
  277. package/README.md +125 -51
  278. package/app/assets/css/main.css +329 -22
  279. package/app/components/AppHeader.vue +5 -4
  280. package/app/components/AppSidebar.vue +5 -4
  281. package/app/components/AwChart.vue +17 -0
  282. package/app/components/workshop/AgentLanesView.vue +2 -2
  283. package/app/components/workshop/ChannelSessionList.vue +3 -3
  284. package/app/components/workshop/CommandPalette.vue +1 -2
  285. package/app/components/workshop/Composer.vue +4 -4
  286. package/app/components/workshop/DaqNodeRow.vue +20 -1
  287. package/app/components/workshop/EventBlock.vue +3 -3
  288. package/app/components/workshop/MentionHoverCard.vue +1 -1
  289. package/app/components/workshop/MultiChannelView.vue +1 -1
  290. package/app/components/workshop/TaskBoardView.vue +5 -5
  291. package/app/components/workshop/TranscriptTimeline.vue +3 -3
  292. package/app/components/workshop/blocks/ClusterRoute.vue +3 -3
  293. package/app/components/workshop/blocks/ClusterStream.vue +1 -1
  294. package/app/components/workshop/blocks/ClusterTool.vue +1 -1
  295. package/app/components/workshop/lanes/LaneBlocks.vue +5 -2
  296. package/app/components/workshop/town/TownView.vue +0 -7
  297. package/app/composables/workshop/useClusteredBlocks.ts +22 -3
  298. package/app/composables/workshop/useEscClose.ts +44 -0
  299. package/app/config/index.ts +2 -1
  300. package/app/layouts/default.vue +25 -8
  301. package/app/pages/aml/index.vue +626 -4
  302. package/app/pages/daq/[id].vue +1 -1
  303. package/app/pages/daq/index.vue +10 -12
  304. package/app/pages/dcw/[id].vue +2 -2
  305. package/app/pages/dcw/index.vue +7 -11
  306. package/app/pages/index.vue +24 -6
  307. package/app/pages/logs/index.vue +2 -6
  308. package/app/pages/plugins/index.vue +1 -1
  309. package/app/pages/settings.vue +2 -2
  310. package/app/pages/town.vue +0 -2
  311. package/app/pages/users.vue +1 -1
  312. package/app/pages/workshop/index.vue +2 -2
  313. package/app/plugins/esc-close.client.ts +31 -0
  314. package/app/stores/workshop/events.ts +186 -36
  315. package/bin/aw.mjs +7 -2
  316. package/cli/aw.mjs +19 -34
  317. package/cli/commands/build.mjs +18 -1
  318. package/cli/commands/config.mjs +2 -0
  319. package/cli/commands/plugin.mjs +45 -18
  320. package/cli/commands/register.mjs +6 -2
  321. package/cli/commands/status.mjs +2 -1
  322. package/cli/commands/update.mjs +1 -1
  323. package/cli/commands/version.mjs +1 -1
  324. package/cli/core/args.mjs +76 -4
  325. package/cli/core/help.mjs +3 -1
  326. package/cli/core/meta.mjs +38 -0
  327. package/cli/core/post-build.mjs +96 -0
  328. package/cli/core/registry.mjs +6 -3
  329. package/config.yml +28 -26
  330. package/docs/aml.md +99 -0
  331. package/docs/cli.en.md +445 -0
  332. package/docs/cli.md +410 -220
  333. package/docs/full-test-plan.md +174 -0
  334. package/docs/multi-harness-architecture.md +248 -0
  335. package/docs/plugins.en.md +534 -0
  336. package/docs/plugins.md +531 -179
  337. package/docs/sdk.en.md +922 -0
  338. package/docs/sdk.md +725 -129
  339. package/i18n/dicts/aml.json +43 -1
  340. package/i18n/locales/en.ts +1928 -1885
  341. package/i18n/locales/zh-CN.ts +1928 -1885
  342. package/nuxt.config.ts +27 -2
  343. package/package.json +164 -153
  344. package/scripts/.mimosa/hook-status/sess_aeaecb58-8833-4b83-b93c-050467d21e03-d944d71bb3.json +14 -0
  345. package/scripts/_audit/aml-layout-diag.mjs +83 -0
  346. package/scripts/_audit/bump-version.mjs +51 -0
  347. package/scripts/_audit/channel-inspect.mjs +49 -0
  348. package/scripts/_audit/cleanup-apply.mjs +89 -0
  349. package/scripts/_audit/cleanup-plan.mjs +82 -0
  350. package/scripts/_audit/contrast-check.mjs +43 -0
  351. package/scripts/_audit/dcw-unrecorded-write.ts +1 -1
  352. package/scripts/_audit/design-shots.mjs +145 -0
  353. package/scripts/_audit/docs-font-probe.mjs +68 -0
  354. package/scripts/_audit/docs-probe.mjs +107 -0
  355. package/scripts/_audit/docs-shots.mjs +171 -0
  356. package/scripts/_audit/docs-v3-verify.mjs +255 -0
  357. package/scripts/_audit/docs-vue-lint.mjs +81 -0
  358. package/scripts/_audit/docs-vue-lint2.mjs +91 -0
  359. package/scripts/_audit/exp-cost-scaling.mjs +4 -1
  360. package/scripts/_audit/exp-envelope-and-png.mjs +2 -1
  361. package/scripts/_audit/exp-sweep-fairness.mjs +4 -2
  362. package/scripts/_audit/fix-settings-count.mjs +57 -0
  363. package/scripts/_audit/glass-verify.mjs +155 -0
  364. package/scripts/_audit/hydration-diff.mjs +104 -0
  365. package/scripts/_audit/hydration-head.mjs +36 -0
  366. package/scripts/_audit/hydration-probe.mjs +59 -0
  367. package/scripts/_audit/lead-matrix-test.mjs +172 -0
  368. package/scripts/_audit/plc-agent-task.mjs +74 -0
  369. package/scripts/_audit/plc-clean-scenario.mjs +434 -0
  370. package/scripts/_audit/plc-clean-shots.mjs +161 -0
  371. package/scripts/_audit/plc-fc10-probe.mjs +30 -0
  372. package/scripts/_audit/probe-binding.mjs +114 -103
  373. package/scripts/_audit/review-fix-verify.mjs +158 -0
  374. package/scripts/_audit/seed-demo.mjs +165 -0
  375. package/scripts/_audit/town-focus-shot.mjs +129 -0
  376. package/scripts/_audit/town-reposition.mjs +85 -0
  377. package/scripts/_audit/ts-resolve-hook.mjs +57 -22
  378. package/scripts/_audit/verify-cleanup.mjs +67 -0
  379. package/scripts/_audit/verify-release-pack.mjs +82 -0
  380. package/scripts/_audit/watchdog-recovery-test.mjs +127 -0
  381. package/scripts/_dbg-audit-all-pages.mjs +43 -43
  382. package/scripts/_dbg-configroot-audit.mjs +84 -84
  383. package/scripts/_dbg-daq-intervals-func.mjs +94 -94
  384. package/scripts/_dbg-daq-rowstyle-verify.mjs +112 -112
  385. package/scripts/_dbg-groups-ui-verify.mjs +122 -122
  386. package/scripts/_dbg-harness-e2e.mjs +92 -92
  387. package/scripts/_dbg-harness-ui-e2e.py +97 -97
  388. package/scripts/_dbg-hitl-timeout-e2e.mjs +93 -93
  389. package/scripts/_dbg-multiharness-live-e2e.mjs +254 -254
  390. package/scripts/_dbg-opslog-agent-e2e.mjs +194 -191
  391. package/scripts/_dbg-opt-team-e2e.mjs +133 -133
  392. package/scripts/_dbg-recipe-e2e.mjs +176 -176
  393. package/scripts/_dbg-recipe-stale-e2e.mjs +135 -135
  394. package/scripts/_dbg-render-perf.mjs +142 -142
  395. package/scripts/_dbg-render-regression.mjs +130 -130
  396. package/scripts/_dbg-town-smoke.mjs +54 -54
  397. package/scripts/aw-start-smoke.mjs +27 -8
  398. package/scripts/check-docs-sync.mjs +367 -0
  399. package/scripts/e2e-full-closedloop.mjs +36 -18
  400. package/scripts/production-closed-loop-e2e.mjs +300 -300
  401. package/scripts/test-cli-exit.mjs +129 -21
  402. package/scripts/test-daq-frame-race.mjs +144 -96
  403. package/scripts/test-events-index.mjs +176 -0
  404. package/scripts/test-lru.mjs +34 -11
  405. package/scripts/test-memory-month-query.mjs +11 -3
  406. package/scripts/test-plugin-hardening.mjs +7 -2
  407. package/scripts/test-plugin-lifecycle.mjs +173 -0
  408. package/scripts/test-rollback-index.mjs +76 -18
  409. package/scripts/test-sdk-surface.mjs +6 -3
  410. package/sdk/client.mjs +16 -7
  411. package/sdk/context.mjs +21 -9
  412. package/sdk/examples/line-sentinel/client.mjs +13 -6
  413. package/sdk/examples/line-sentinel/index.mjs +5 -2
  414. package/sdk/examples/ops-notifier/client.mjs +3 -1
  415. package/sdk/examples/sample-insight/client.mjs +4 -2
  416. package/sdk/index.d.mts +133 -16
  417. package/sdk/index.mjs +3 -2
  418. package/sdk/lifecycle.mjs +8 -3
  419. package/server/api/workshop/agent-tools/bindings/index.post.ts +22 -7
  420. package/server/api/workshop/aml/datasets/[id].delete.ts +39 -0
  421. package/server/api/workshop/aml/datasets/[id].get.ts +31 -9
  422. package/server/api/workshop/aml/datasets/[id].patch.ts +30 -0
  423. package/server/api/workshop/aml/entities/index.get.ts +13 -0
  424. package/server/api/workshop/aml/entities/prune.post.ts +28 -0
  425. package/server/api/workshop/aml/env/index.get.ts +13 -0
  426. package/server/api/workshop/aml/env/recheck.post.ts +14 -0
  427. package/server/api/workshop/aml/env/uv.post.ts +21 -0
  428. package/server/api/workshop/aml/env/venv.post.ts +24 -0
  429. package/server/api/workshop/aml/index.get.ts +14 -1
  430. package/server/api/workshop/aml/jobs/[id].delete.ts +44 -0
  431. package/server/api/workshop/aml/models/[id].delete.ts +35 -0
  432. package/server/api/workshop/aml/models/[id].patch.ts +30 -0
  433. package/server/services/workshop/agents/agent-interface.ts +3 -0
  434. package/server/services/workshop/agents/base-agent.ts +9 -0
  435. package/server/services/workshop/agents/codex-agent.ts +743 -729
  436. package/server/services/workshop/agents/dsh-agent.ts +4 -7
  437. package/server/services/workshop/agents/opencode-agent.ts +5 -7
  438. package/server/services/workshop/aml/aml.repo.ts +18 -0
  439. package/server/services/workshop/aml/dataset-builder.ts +4 -0
  440. package/server/services/workshop/aml/entity.ts +365 -0
  441. package/server/services/workshop/aml/env-manager.ts +242 -0
  442. package/server/services/workshop/aml/job-orchestrator.ts +4 -15
  443. package/server/services/workshop/aml/model-registry.ts +6 -0
  444. package/server/services/workshop/aml/python-runtime.ts +396 -62
  445. package/server/services/workshop/aml/runtime.ts +95 -4
  446. package/server/services/workshop/daq/bus/mqtt.adapter.ts +3 -1
  447. package/server/services/workshop/daq/daq-controller.ts +95 -47
  448. package/server/services/workshop/daq/daq-node.repo.ts +0 -10
  449. package/server/services/workshop/daq/daq-runtime.ts +0 -5
  450. package/server/services/workshop/json-store.mjs +35 -2
  451. package/server/services/workshop/plugins/host.mjs +18 -12
  452. package/server/services/workshop/runtime/agent-runtime.ts +32 -3
  453. package/server/services/workshop/runtime/manager.ts +28 -1
  454. package/server/services/workshop/runtime/scheduler-loop.ts +10 -1
  455. package/server/services/workshop/settings.ts +2 -0
  456. package/shared/config/home.mjs +58 -0
  457. package/shared/config/schema.json +2 -1
  458. package/shared/lru.mjs +4 -1
  459. package/.output/public/_nuxt/-6OnbLFb.js +0 -1
  460. package/.output/public/_nuxt/-nb2uqVg.js +0 -1
  461. package/.output/public/_nuxt/4bHdIqEg.js +0 -18
  462. package/.output/public/_nuxt/6PZPfFcO.js +0 -17
  463. package/.output/public/_nuxt/BBBtwOpo.js +0 -9
  464. package/.output/public/_nuxt/BBwMH_hG.js +0 -7
  465. package/.output/public/_nuxt/BDUjyaF4.js +0 -42
  466. package/.output/public/_nuxt/BNXfwXpE.js +0 -1
  467. package/.output/public/_nuxt/BN_PdN3J.js +0 -24
  468. package/.output/public/_nuxt/BSSUlJnx2.js +0 -1
  469. package/.output/public/_nuxt/BWSE6hR6.js +0 -1
  470. package/.output/public/_nuxt/BZGNTgTQ2.js +0 -1
  471. package/.output/public/_nuxt/BZv4RFYN.js +0 -1
  472. package/.output/public/_nuxt/BcmbLh2z2.js +0 -1
  473. package/.output/public/_nuxt/BfGc7TJp.js +0 -1
  474. package/.output/public/_nuxt/BgTB6h_q.js +0 -2
  475. package/.output/public/_nuxt/BkLJA9J5.js +0 -1
  476. package/.output/public/_nuxt/Bp5luxkg2.js +0 -1
  477. package/.output/public/_nuxt/BuCHayqN.js +0 -1
  478. package/.output/public/_nuxt/BuvcLKh1.js +0 -19
  479. package/.output/public/_nuxt/C3tCneTM.js +0 -1
  480. package/.output/public/_nuxt/C77oC8yC2.js +0 -7
  481. package/.output/public/_nuxt/C9f8QMp12.js +0 -1
  482. package/.output/public/_nuxt/CKfhtOt7.js +0 -13
  483. package/.output/public/_nuxt/CQvmN-Mi.js +0 -1
  484. package/.output/public/_nuxt/CUDrOuW7.js +0 -1
  485. package/.output/public/_nuxt/CZcC-gpk.js +0 -1
  486. package/.output/public/_nuxt/CbzsPO5H.js +0 -1
  487. package/.output/public/_nuxt/CdSOrh2c.js +0 -1
  488. package/.output/public/_nuxt/Cgx818r-.js +0 -1
  489. package/.output/public/_nuxt/Cjm7VogC.js +0 -1
  490. package/.output/public/_nuxt/Cm5mDxzH.js +0 -1
  491. package/.output/public/_nuxt/CmHzfVc5.js +0 -3
  492. package/.output/public/_nuxt/Cn3J3NXR.js +0 -23
  493. package/.output/public/_nuxt/Cno6kYiO2.js +0 -1
  494. package/.output/public/_nuxt/Cp6z0RN7.js +0 -1
  495. package/.output/public/_nuxt/CwqIxJGj.js +0 -2
  496. package/.output/public/_nuxt/D-Ca4BGY.js +0 -70
  497. package/.output/public/_nuxt/D0fhp-Ga.js +0 -75
  498. package/.output/public/_nuxt/D1z7i2UP.js +0 -31
  499. package/.output/public/_nuxt/DIaTPH1M.js +0 -1
  500. package/.output/public/_nuxt/DTYBfjRY.js +0 -1
  501. package/.output/public/_nuxt/DXRZPxGs.js +0 -1
  502. package/.output/public/_nuxt/DZzGarBE2.js +0 -13
  503. package/.output/public/_nuxt/DaMCzQhv.js +0 -1
  504. package/.output/public/_nuxt/DoLasgPj2.js +0 -1
  505. package/.output/public/_nuxt/DpojD719.js +0 -1
  506. package/.output/public/_nuxt/DsVcWfyR.js +0 -1
  507. package/.output/public/_nuxt/DtBu71ev.js +0 -32
  508. package/.output/public/_nuxt/Dy-mxvXY2.js +0 -1
  509. package/.output/public/_nuxt/DzuC31-i.js +0 -2
  510. package/.output/public/_nuxt/FQri3dV3.js +0 -1
  511. package/.output/public/_nuxt/ORt9oDIy2.js +0 -1
  512. package/.output/public/_nuxt/TownView.CtskuMXS.css +0 -1
  513. package/.output/public/_nuxt/VLI2Zy4t.js +0 -5
  514. package/.output/public/_nuxt/_id_.MbzdFygI.css +0 -1
  515. package/.output/public/_nuxt/_id_.hRYo-EAB.css +0 -1
  516. package/.output/public/_nuxt/_wsId_.gXMEOYgX.css +0 -1
  517. package/.output/public/_nuxt/aml.WU_bh87J.css +0 -1
  518. package/.output/public/_nuxt/arUY5dyq2.js +0 -4
  519. package/.output/public/_nuxt/builds/meta/291ef3e6-fa6a-4dee-8f46-05da1aeab815.json +0 -1
  520. package/.output/public/_nuxt/daq.Bb6l44-O.css +0 -1
  521. package/.output/public/_nuxt/dcw.rXH2fc2Z.css +0 -1
  522. package/.output/public/_nuxt/default.jNT73_hq.css +0 -1
  523. package/.output/public/_nuxt/ekuGmQ7R.js +0 -1
  524. package/.output/public/_nuxt/entry.jFrFAWuA.css +0 -1
  525. package/.output/public/_nuxt/logs.DMOM-iHe.css +0 -1
  526. package/.output/public/_nuxt/niDwBOZW.js +0 -3
  527. package/.output/public/_nuxt/pMoIO6rr.js +0 -14
  528. package/.output/public/_nuxt/pages.Cc8GX9T1.css +0 -1
  529. package/.output/public/_nuxt/plugins.wIPyfPn-.css +0 -1
  530. package/.output/public/_nuxt/rqZ-1SoP.js +0 -2
  531. package/.output/public/_nuxt/settings.BCm4NZIc.css +0 -1
  532. package/.output/public/_nuxt/town.C_DsNW0J.css +0 -1
  533. package/.output/public/_nuxt/users.DuAt_Zwf.css +0 -1
  534. package/.output/public/_nuxt/vJ4FPb-_.js +0 -1
  535. package/.output/public/_nuxt/workshop.BJg84pOK.css +0 -1
  536. package/.output/server/chunks/build/aml-uBNIppIf.mjs +0 -508
  537. package/.output/server/chunks/build/aml-uBNIppIf.mjs.map +0 -1
  538. package/.output/server/chunks/build/daq-BvihjQyW.mjs.map +0 -1
  539. package/.output/server/chunks/build/pages-C-6BRtv8.mjs.map +0 -1
  540. package/scripts/_audit/.tmp/audit-data/dcws.json +0 -28
  541. package/scripts/_audit/.tmp/dcw-writes.json +0 -15650
  542. package/scripts/_audit/.tmp/dcws.json +0 -9033
  543. package/scripts/_audit/.tmp/pollution-backup/dcw-rollback.polluted.json +0 -470006
  544. package/scripts/_audit/.tmp/pollution-backup/dcws.polluted.json +0 -9085
  545. package/scripts/_audit/.tmp/probe-cwd.txt +0 -1
  546. package/scripts/_audit/awhome/commands/README.md +0 -3
  547. package/scripts/_audit/awhome/commands/hello.mjs +0 -12
  548. package/scripts/_audit/diag-cwd.ts +0 -20
  549. package/scripts/_audit/diag-cwd2.ts +0 -19
  550. package/scripts/_audit/hello.mjs +0 -12
  551. package/scripts/_audit/ndjson-partial-line-repro.mjs +0 -77
  552. package/scripts/_audit/opencode-await-ternary-repro.mjs +0 -20
  553. package/scripts/_audit/part-frag.txt +0 -84
  554. package/scripts/_audit/part-head.txt +0 -45
  555. package/scripts/_audit/probe-child.mjs +0 -17
  556. package/scripts/_audit/probe-envelope.mjs +0 -49
  557. package/scripts/_audit/probe-packlist.mjs +0 -67
  558. package/scripts/_audit/probe-routes.mjs +0 -47
  559. package/scripts/_audit/probe-routes2.mjs +0 -38
  560. package/scripts/_audit/probe.ts +0 -9
  561. package/scripts/_audit/probe2.ts +0 -6
  562. package/scripts/_audit/probe3.ts +0 -3
  563. package/scripts/_audit/probe4.ts +0 -3
  564. package/scripts/_audit/proj/.AgentWorkShop/commands/echoargs.mjs +0 -13
  565. package/scripts/_audit/proj/config.yml +0 -1
  566. package/scripts/_audit/run.mjs +0 -30
  567. package/scripts/_audit/tsconfig.probe.json +0 -24
  568. package/scripts/_audit/typecheck-out.txt +0 -466
  569. package/scripts/_daq-realtime-probe.mjs +0 -68
  570. package/scripts/_daq-warn-probe.mjs +0 -50
  571. package/scripts/_dbg-acc-1-setup.mjs +0 -57
  572. package/scripts/_dbg-acc-2-diag.mjs +0 -14
  573. package/scripts/_dbg-acc-2-intervals.mjs +0 -81
  574. package/scripts/_dbg-acc-3-daq.mjs +0 -48
  575. package/scripts/_dbg-acc-4-team.mjs +0 -92
  576. package/scripts/_dbg-acc-5-visual.mjs +0 -63
  577. package/scripts/_dbg-acc-5b-ws-town.mjs +0 -18
  578. package/scripts/_dbg-acc-5c-town.mjs +0 -12
  579. package/scripts/_dbg-acc-6-i18n.mjs +0 -19
  580. package/scripts/_dbg-agent-tools-audit.mjs +0 -154
  581. package/scripts/_dbg-agent-workflow-audit.mjs +0 -177
  582. package/scripts/_dbg-agents-dropdown-shot.py +0 -33
  583. package/scripts/_dbg-anim-verify.mjs +0 -81
  584. package/scripts/_dbg-app-shot.mjs +0 -48
  585. package/scripts/_dbg-autoframe.mjs +0 -103
  586. package/scripts/_dbg-availability-probe.ts +0 -11
  587. package/scripts/_dbg-beacon-final.mjs +0 -181
  588. package/scripts/_dbg-bind-bidi-e2e.mjs +0 -239
  589. package/scripts/_dbg-callout-near.mjs +0 -108
  590. package/scripts/_dbg-catalog-smoke.ts +0 -20
  591. package/scripts/_dbg-cf-line-shot.mjs +0 -18
  592. package/scripts/_dbg-chan-focus.mjs +0 -49
  593. package/scripts/_dbg-channel-plugin-ui.mjs +0 -94
  594. package/scripts/_dbg-cleanup.mjs +0 -31
  595. package/scripts/_dbg-closedloop-ui-shot.mjs +0 -61
  596. package/scripts/_dbg-codex-handshake.ts +0 -30
  597. package/scripts/_dbg-codex-probe.mjs +0 -58
  598. package/scripts/_dbg-codex-sandbox.ts +0 -58
  599. package/scripts/_dbg-codex-turn.ts +0 -65
  600. package/scripts/_dbg-collab-scenario-e2e.mjs +0 -185
  601. package/scripts/_dbg-config-smoke.ts +0 -28
  602. package/scripts/_dbg-console-audit.mjs +0 -61
  603. package/scripts/_dbg-console-probe.mjs +0 -23
  604. package/scripts/_dbg-context-inject-audit.mjs +0 -231
  605. package/scripts/_dbg-cpu-profile.mjs +0 -53
  606. package/scripts/_dbg-crash-recovery.mjs +0 -143
  607. package/scripts/_dbg-crop-shot.mjs +0 -16
  608. package/scripts/_dbg-cross-channel-e2e.mjs +0 -157
  609. package/scripts/_dbg-cross-team-visibility-e2e.mjs +0 -129
  610. package/scripts/_dbg-crush-probe.sh +0 -21
  611. package/scripts/_dbg-crush-spawn-probe.ts +0 -22
  612. package/scripts/_dbg-daq-acc-probe.mjs +0 -24
  613. package/scripts/_dbg-daq-attrib.mjs +0 -34
  614. package/scripts/_dbg-daq-bind-audit.mjs +0 -119
  615. package/scripts/_dbg-daq-cadence.mjs +0 -104
  616. package/scripts/_dbg-daq-debug.mjs +0 -22
  617. package/scripts/_dbg-daq-diag.mjs +0 -33
  618. package/scripts/_dbg-daq-e2e.mjs +0 -171
  619. package/scripts/_dbg-daq-film.mjs +0 -136
  620. package/scripts/_dbg-daq-filter-e2e.mjs +0 -109
  621. package/scripts/_dbg-daq-filter-e2e2.mjs +0 -62
  622. package/scripts/_dbg-daq-final-regression.mjs +0 -78
  623. package/scripts/_dbg-daq-frame-alarm.mjs +0 -49
  624. package/scripts/_dbg-daq-frame-ui.mjs +0 -62
  625. package/scripts/_dbg-daq-frame-ws.mjs +0 -72
  626. package/scripts/_dbg-daq-full-check.mjs +0 -179
  627. package/scripts/_dbg-daq-line-note-verify.mjs +0 -61
  628. package/scripts/_dbg-daq-linebanner-audit.mjs +0 -107
  629. package/scripts/_dbg-daq-pages-shot.mjs +0 -37
  630. package/scripts/_dbg-daq-perf.mjs +0 -61
  631. package/scripts/_dbg-daq-probe.mjs +0 -27
  632. package/scripts/_dbg-daq-recipe-e2e.mjs +0 -30
  633. package/scripts/_dbg-daq-redesign-shot.mjs +0 -88
  634. package/scripts/_dbg-daq-rows-probe.mjs +0 -26
  635. package/scripts/_dbg-daq-rowstate-e2e.mjs +0 -152
  636. package/scripts/_dbg-daq-rowstate-shot.mjs +0 -45
  637. package/scripts/_dbg-daq-rowstate-shot2.mjs +0 -38
  638. package/scripts/_dbg-daq-tpl.mjs +0 -144
  639. package/scripts/_dbg-dash-console-check.mjs +0 -49
  640. package/scripts/_dbg-dash-deep-probe.mjs +0 -61
  641. package/scripts/_dbg-dash-hitpoint.mjs +0 -44
  642. package/scripts/_dbg-dash-live-shot.mjs +0 -36
  643. package/scripts/_dbg-dash-shot.mjs +0 -21
  644. package/scripts/_dbg-dashboard-shot.mjs +0 -35
  645. package/scripts/_dbg-dcw-audit.mjs +0 -126
  646. package/scripts/_dbg-dcw-card-e2e.mjs +0 -108
  647. package/scripts/_dbg-dcw-channel-ui.mjs +0 -144
  648. package/scripts/_dbg-dcw-examples.mjs +0 -81
  649. package/scripts/_dbg-dcw-light-shot.mjs +0 -19
  650. package/scripts/_dbg-dcw-line-audit.mjs +0 -107
  651. package/scripts/_dbg-dcw-pause-tpl-audit.mjs +0 -161
  652. package/scripts/_dbg-dcw-pause-ui.mjs +0 -175
  653. package/scripts/_dbg-dcw-read-toolface.ts +0 -13
  654. package/scripts/_dbg-dcw-read-ui.mjs +0 -74
  655. package/scripts/_dbg-dcw-scene.mjs +0 -72
  656. package/scripts/_dbg-dcw-shot2.mjs +0 -14
  657. package/scripts/_dbg-dcw-twin-e2e.mjs +0 -192
  658. package/scripts/_dbg-diag-mock-loop.mjs +0 -89
  659. package/scripts/_dbg-diag-watch.mjs +0 -95
  660. package/scripts/_dbg-docs-site-shot.mjs +0 -32
  661. package/scripts/_dbg-dsh-probe.mjs +0 -31
  662. package/scripts/_dbg-dt-interact.mjs +0 -193
  663. package/scripts/_dbg-error-probe.mjs +0 -54
  664. package/scripts/_dbg-filter-light-verify.mjs +0 -54
  665. package/scripts/_dbg-final-acceptance-2.mjs +0 -72
  666. package/scripts/_dbg-final-acceptance.mjs +0 -192
  667. package/scripts/_dbg-final-agent-e2e.mjs +0 -151
  668. package/scripts/_dbg-final-features.mjs +0 -155
  669. package/scripts/_dbg-final-fixups.mjs +0 -62
  670. package/scripts/_dbg-final-full-e2e.mjs +0 -218
  671. package/scripts/_dbg-final-line-e2e.mjs +0 -173
  672. package/scripts/_dbg-final-shots.mjs +0 -32
  673. package/scripts/_dbg-final-t6-hitl.mjs +0 -38
  674. package/scripts/_dbg-final-visual.mjs +0 -29
  675. package/scripts/_dbg-fix-unused-imports.py +0 -41
  676. package/scripts/_dbg-focus-range.mjs +0 -115
  677. package/scripts/_dbg-fresh-scene-e2e.mjs +0 -125
  678. package/scripts/_dbg-fullchain-e2e.mjs +0 -178
  679. package/scripts/_dbg-gate-debug.mjs +0 -37
  680. package/scripts/_dbg-gif-encode.mjs +0 -111
  681. package/scripts/_dbg-gizmo.mjs +0 -95
  682. package/scripts/_dbg-glass-probe.mjs +0 -57
  683. package/scripts/_dbg-glass-shot.mjs +0 -50
  684. package/scripts/_dbg-glass-sweep.mjs +0 -25
  685. package/scripts/_dbg-glb-probe.mjs +0 -43
  686. package/scripts/_dbg-goose-probe.mjs +0 -33
  687. package/scripts/_dbg-goose-probe.sh +0 -10
  688. package/scripts/_dbg-hardening-probe.mjs +0 -90
  689. package/scripts/_dbg-harness-ui-dbg.py +0 -49
  690. package/scripts/_dbg-harness-ui-shot.py +0 -109
  691. package/scripts/_dbg-hero-btn-probe.mjs +0 -21
  692. package/scripts/_dbg-hidden-check.mjs +0 -21
  693. package/scripts/_dbg-hmi-audit.mjs +0 -164
  694. package/scripts/_dbg-home-repro.mjs +0 -24
  695. package/scripts/_dbg-home-stack.mjs +0 -13
  696. package/scripts/_dbg-host.mjs +0 -16
  697. package/scripts/_dbg-huashu-survey.mjs +0 -31
  698. package/scripts/_dbg-huashu-survey2.mjs +0 -35
  699. package/scripts/_dbg-huashu-verify.mjs +0 -25
  700. package/scripts/_dbg-huashu-verify2.mjs +0 -26
  701. package/scripts/_dbg-hydration-detail.mjs +0 -18
  702. package/scripts/_dbg-i18n-debug.mjs +0 -27
  703. package/scripts/_dbg-i18n-debug2.mjs +0 -26
  704. package/scripts/_dbg-i18n-final.mjs +0 -42
  705. package/scripts/_dbg-i18n-scan.mjs +0 -38
  706. package/scripts/_dbg-infra-lifecycle.mjs +0 -44
  707. package/scripts/_dbg-interval-config.mjs +0 -156
  708. package/scripts/_dbg-interval-scenario.mjs +0 -126
  709. package/scripts/_dbg-kicker-check.mjs +0 -11
  710. package/scripts/_dbg-line-aura-shots.mjs +0 -54
  711. package/scripts/_dbg-line-control-e2e.mjs +0 -120
  712. package/scripts/_dbg-line-gate-audit.mjs +0 -108
  713. package/scripts/_dbg-line-live-e2e.mjs +0 -144
  714. package/scripts/_dbg-line-repo-test.ts +0 -10
  715. package/scripts/_dbg-line-scenario-e2e.mjs +0 -256
  716. package/scripts/_dbg-line-spawn.ts +0 -31
  717. package/scripts/_dbg-live-engine-probe.mjs +0 -80
  718. package/scripts/_dbg-login-debug.py +0 -23
  719. package/scripts/_dbg-login-e2e.mjs +0 -26
  720. package/scripts/_dbg-logs-ui-e2e.py +0 -126
  721. package/scripts/_dbg-mcp-bridge-probe.mjs +0 -147
  722. package/scripts/_dbg-modbus-latency.mjs +0 -22
  723. package/scripts/_dbg-mqtt-chain-e2e.mjs +0 -90
  724. package/scripts/_dbg-mqtt-publisher.mjs +0 -17
  725. package/scripts/_dbg-nav-rpg.mjs +0 -84
  726. package/scripts/_dbg-nav-shot.mjs +0 -28
  727. package/scripts/_dbg-nav.mjs +0 -27
  728. package/scripts/_dbg-oneshot-impl-probe.ts +0 -67
  729. package/scripts/_dbg-opencode-sse.mjs +0 -101
  730. package/scripts/_dbg-opencode-start.ts +0 -57
  731. package/scripts/_dbg-opslog-e2e.mjs +0 -121
  732. package/scripts/_dbg-opslog-shots.mjs +0 -62
  733. package/scripts/_dbg-optimization-e2e.mjs +0 -94
  734. package/scripts/_dbg-orbit.mjs +0 -58
  735. package/scripts/_dbg-overview-probe.sh +0 -31
  736. package/scripts/_dbg-panesplitter-fix-check.mjs +0 -62
  737. package/scripts/_dbg-perms-visual.mjs +0 -36
  738. package/scripts/_dbg-pg-tcp-probe.cjs +0 -27
  739. package/scripts/_dbg-phase-e3-monitor.mjs +0 -25
  740. package/scripts/_dbg-pi-spawn-probe.ts +0 -33
  741. package/scripts/_dbg-plc-agent-loop.ts +0 -102
  742. package/scripts/_dbg-plc-e2e.mjs +0 -171
  743. package/scripts/_dbg-plugin-agent-read.ts +0 -56
  744. package/scripts/_dbg-plugin-config-ui.mjs +0 -111
  745. package/scripts/_dbg-plugin-matrix.mjs +0 -212
  746. package/scripts/_dbg-plugin-panels-ui.mjs +0 -54
  747. package/scripts/_dbg-plugin-sink-rest.mjs +0 -70
  748. package/scripts/_dbg-plugin-sink-ui.mjs +0 -81
  749. package/scripts/_dbg-plugin-tools-inject.ts +0 -80
  750. package/scripts/_dbg-plugin-ui-wizard.mjs +0 -125
  751. package/scripts/_dbg-plugin-verify-e2e.mjs +0 -123
  752. package/scripts/_dbg-plugins-e2e.mjs +0 -101
  753. package/scripts/_dbg-pop-clamp-verify.mjs +0 -77
  754. package/scripts/_dbg-preset-e2e.mjs +0 -116
  755. package/scripts/_dbg-preview-console.mjs +0 -28
  756. package/scripts/_dbg-preview-minrepro.mjs +0 -156
  757. package/scripts/_dbg-preview-pixels.mjs +0 -93
  758. package/scripts/_dbg-prompts-hotreload-test.ts +0 -76
  759. package/scripts/_dbg-prompts-resolve-test.ts +0 -39
  760. package/scripts/_dbg-quality-pages-e2e.mjs +0 -84
  761. package/scripts/_dbg-query-cancel.ts +0 -12
  762. package/scripts/_dbg-qwen-acp-probe.mjs +0 -30
  763. package/scripts/_dbg-qwen-capture.mjs +0 -21
  764. package/scripts/_dbg-rail-tree-e2e.mjs +0 -183
  765. package/scripts/_dbg-real-driver-e2e.mjs +0 -55
  766. package/scripts/_dbg-redesign-shots.mjs +0 -34
  767. package/scripts/_dbg-registry-smoke.ts +0 -14
  768. package/scripts/_dbg-release-smoke.mjs +0 -104
  769. package/scripts/_dbg-repo-setup-verify.mjs +0 -31
  770. package/scripts/_dbg-resolve-probe.ts +0 -6
  771. package/scripts/_dbg-restart-persist.mjs +0 -41
  772. package/scripts/_dbg-retention-test.ts +0 -25
  773. package/scripts/_dbg-rollback-mgr-audit.mjs +0 -169
  774. package/scripts/_dbg-rpg.mjs +0 -71
  775. package/scripts/_dbg-sc001-dispatch.mjs +0 -63
  776. package/scripts/_dbg-scenario-final-shot.mjs +0 -24
  777. package/scripts/_dbg-scenario-phase-e2.mjs +0 -75
  778. package/scripts/_dbg-scenario-phase-e3.mjs +0 -96
  779. package/scripts/_dbg-scenario-phase1.mjs +0 -90
  780. package/scripts/_dbg-scenario-phase2.mjs +0 -105
  781. package/scripts/_dbg-scenario-phase3-monitor.mjs +0 -48
  782. package/scripts/_dbg-scenario-phase3.mjs +0 -111
  783. package/scripts/_dbg-scene-polish-shot.mjs +0 -118
  784. package/scripts/_dbg-selring-probe.mjs +0 -47
  785. package/scripts/_dbg-settings-draft-probe.mjs +0 -39
  786. package/scripts/_dbg-settings-probe.mjs +0 -33
  787. package/scripts/_dbg-setup-e2e.mjs +0 -88
  788. package/scripts/_dbg-sideinfo.mjs +0 -101
  789. package/scripts/_dbg-sim-keeper.mjs +0 -100
  790. package/scripts/_dbg-splitter.mjs +0 -88
  791. package/scripts/_dbg-swatch-check.mjs +0 -10
  792. package/scripts/_dbg-task-cancel-probe.mjs +0 -66
  793. package/scripts/_dbg-team-drill.mjs +0 -173
  794. package/scripts/_dbg-town-alarm-e2e.mjs +0 -40
  795. package/scripts/_dbg-town-beauty-shots.mjs +0 -54
  796. package/scripts/_dbg-town-daq-shot.mjs +0 -26
  797. package/scripts/_dbg-town-full-e2e.mjs +0 -104
  798. package/scripts/_dbg-town-gate.mjs +0 -44
  799. package/scripts/_dbg-town-ins-probe.mjs +0 -37
  800. package/scripts/_dbg-town-perf.mjs +0 -50
  801. package/scripts/_dbg-town-polish-shots.mjs +0 -82
  802. package/scripts/_dbg-town-realtime.mjs +0 -42
  803. package/scripts/_dbg-town-shot.py +0 -25
  804. package/scripts/_dbg-town-shot3.mjs +0 -17
  805. package/scripts/_dbg-town-truth.mjs +0 -37
  806. package/scripts/_dbg-town-truth2.mjs +0 -27
  807. package/scripts/_dbg-transform-audit.mjs +0 -98
  808. package/scripts/_dbg-trend-expand-test.mjs +0 -38
  809. package/scripts/_dbg-twindaq-focus.mjs +0 -81
  810. package/scripts/_dbg-ui-polish-shot.mjs +0 -43
  811. package/scripts/_dbg-ui-polish-verify1.mjs +0 -92
  812. package/scripts/_dbg-ui-polish-verify2.mjs +0 -50
  813. package/scripts/_dbg-ui-polish-verify3.mjs +0 -51
  814. package/scripts/_dbg-ui-polish-verify4.mjs +0 -50
  815. package/scripts/_dbg-ui-shot.mjs +0 -26
  816. package/scripts/_dbg-ui-shots.mjs +0 -28
  817. package/scripts/_dbg-ui-survey.py +0 -52
  818. package/scripts/_dbg-unify-shot.mjs +0 -43
  819. package/scripts/_dbg-uplink-probe.mjs +0 -36
  820. package/scripts/_dbg-wizard-preview-shot.mjs +0 -58
  821. package/scripts/_dbg-wizard-ui-e2e.mjs +0 -93
  822. package/scripts/_dbg-ws-probe.mjs +0 -86
  823. package/scripts/_dbg-ws-shot2.mjs +0 -23
  824. package/scripts/_dbg-wsdot-sanity.mjs +0 -25
  825. package/scripts/_dev-stack.mjs +0 -46
  826. package/scripts/_http-driver-probe.mjs +0 -30
  827. package/scripts/_mqtt-driver-probe.mjs +0 -30
  828. package/scripts/_newdriver-rest-probe.mjs +0 -100
  829. package/scripts/_node-state-probe.mjs +0 -5
  830. package/scripts/_opcua-driver-probe.mjs +0 -31
  831. package/scripts/_rtu-debug.mjs +0 -41
  832. package/scripts/_rtu-direct.mjs +0 -6
  833. package/scripts/_rtu-driver-probe.mjs +0 -53
  834. package/scripts/_spike-pitui.mjs +0 -116
  835. package/scripts/_tmp-args-probe.mjs +0 -20
  836. package/scripts/_tmp-cyc-entry.mjs +0 -8
  837. package/scripts/_tmp-cyc-main.mjs +0 -5
  838. package/scripts/_tmp-cyc-mod.mjs +0 -2
  839. package/scripts/_tmp-cycle-a.mjs +0 -6
  840. package/scripts/_tmp-cycle-b.mjs +0 -2
  841. package/scripts/_tmp-cycle-probe.mjs +0 -4
  842. package/scripts/_tmp-entry-variant.mjs +0 -2
  843. package/scripts/_tmp-help-probe.mjs +0 -19
  844. package/scripts/_tmp-help-probe2.mjs +0 -2
  845. package/scripts/_tmp-trace-preload.mjs +0 -1
  846. package/scripts/_wizard-shots.mjs +0 -90
  847. package/scripts/acceptance-suite.py +0 -207
  848. package/scripts/aml-agent-bridge.ts +0 -230
  849. package/scripts/aml-industrial-loop.ts +0 -232
  850. package/scripts/build-film-devices.mjs +0 -227
  851. package/scripts/collab-live-test.py +0 -177
  852. package/scripts/debug-mcp-http.ts +0 -64
  853. package/scripts/demo-lead-worker.ts +0 -256
  854. package/scripts/demo-modes.ts +0 -415
  855. package/scripts/demo-omp-channel.ts +0 -135
  856. package/scripts/design-preflight.mjs +0 -223
  857. package/scripts/design-verify-templates.mjs +0 -110
  858. package/scripts/design-verify.mjs +0 -170
  859. package/scripts/dev-window.cmd +0 -6
  860. package/scripts/device-line-restore.mjs +0 -34
  861. package/scripts/diag-lead-status.ts +0 -101
  862. package/scripts/e2e-a2a-steer-live.mjs +0 -193
  863. package/scripts/e2e-dual-drive-comm.ts +0 -259
  864. package/scripts/e2e-full-scenario.ts +0 -321
  865. package/scripts/e2e-harness-consistency.ts +0 -204
  866. package/scripts/e2e-harness-provider-task.mjs +0 -126
  867. package/scripts/e2e-line-live.mjs +0 -144
  868. package/scripts/e2e-memory-persistence.ts +0 -320
  869. package/scripts/e2e-omp-modes.ts +0 -274
  870. package/scripts/e2e-omp-realtime.ts +0 -258
  871. package/scripts/e2e-plc-scenario.mjs +0 -292
  872. package/scripts/e2e-real-scenario.mjs +0 -466
  873. package/scripts/e2e-tab-close.mjs +0 -136
  874. package/scripts/e2e-token-ui.mjs +0 -149
  875. package/scripts/final-soup-run.py +0 -192
  876. package/scripts/final-soup-watch.py +0 -83
  877. package/scripts/i18n-codemod.mjs +0 -173
  878. package/scripts/i18n-fix-en.py +0 -28
  879. package/scripts/i18n-fix-en2.py +0 -31
  880. package/scripts/i18n-merge.mjs +0 -191
  881. package/scripts/migrate-local-time.mjs +0 -123
  882. package/scripts/omp-real-test.py +0 -328
  883. package/scripts/team-plugins-api-smoke.mjs +0 -149
  884. package/scripts/test-a2a-relay.mjs +0 -222
  885. package/scripts/test-aml-integration.ts +0 -159
  886. package/scripts/test-aml-job.ts +0 -174
  887. package/scripts/test-aml-unit.ts +0 -184
  888. package/scripts/test-api-client.ts +0 -108
  889. package/scripts/test-api-suite.mjs +0 -271
  890. package/scripts/test-block-consumption.mjs +0 -194
  891. package/scripts/test-cmd-render.mjs +0 -218
  892. package/scripts/test-collab-omp.mjs +0 -192
  893. package/scripts/test-config-precedence.ts +0 -124
  894. package/scripts/test-context-governor.ts +0 -176
  895. package/scripts/test-daq-frames.ts +0 -180
  896. package/scripts/test-daq-minio.ts +0 -77
  897. package/scripts/test-dedup-logic.ts +0 -132
  898. package/scripts/test-e2e-collaboration.ts +0 -262
  899. package/scripts/test-e2e-monitor.ts +0 -192
  900. package/scripts/test-event-history.ts +0 -112
  901. package/scripts/test-exec-modes.ts +0 -316
  902. package/scripts/test-fifo-realtime.mjs +0 -193
  903. package/scripts/test-final-e2e.mjs +0 -290
  904. package/scripts/test-goal-summary.ts +0 -202
  905. package/scripts/test-harness-liveness.ts +0 -109
  906. package/scripts/test-harness-terminal.ts +0 -164
  907. package/scripts/test-header-trail.mjs +0 -95
  908. package/scripts/test-hitl.ts +0 -360
  909. package/scripts/test-koda-restyle.mjs +0 -105
  910. package/scripts/test-lane-raw.ts +0 -67
  911. package/scripts/test-lanes-history-render.mjs +0 -138
  912. package/scripts/test-loop-omp.mjs +0 -154
  913. package/scripts/test-mdlite.ts +0 -53
  914. package/scripts/test-memory-brief-chronicle.ts +0 -180
  915. package/scripts/test-memory-rrf-mmr.ts +0 -114
  916. package/scripts/test-mock-collab.mjs +0 -226
  917. package/scripts/test-modern-render.mjs +0 -174
  918. package/scripts/test-omp-terminal.mjs +0 -187
  919. package/scripts/test-plugin-ext.ts +0 -173
  920. package/scripts/test-prompts-loader.ts +0 -56
  921. package/scripts/test-real-scenario.mjs +0 -290
  922. package/scripts/test-stream-render.ts +0 -37
  923. package/scripts/test-task-drawer.mjs +0 -204
  924. package/scripts/test-task-invariants.mjs +0 -169
  925. package/scripts/test-town-3d.mjs +0 -121
  926. package/scripts/test-town-layout.mjs +0 -200
  927. package/scripts/test-town-page.mjs +0 -136
  928. package/scripts/test-town-scene-math.ts +0 -169
  929. package/scripts/test-town-twin.mjs +0 -121
  930. package/scripts/test-town-upload.mjs +0 -89
  931. package/scripts/test-town-user-flow.mjs +0 -619
  932. package/scripts/test-town-world.mjs +0 -76
  933. package/scripts/test-town-wuwa.mjs +0 -198
  934. package/scripts/test-user-isolation.mjs +0 -193
  935. package/scripts/test-workshop-entries.ts +0 -370
  936. package/scripts/test-workspace-api.ts +0 -329
  937. package/scripts/test-ws-aep.mjs +0 -187
  938. package/scripts/test-ws-protocol.ts +0 -134
  939. package/scripts/town-demo-seed.mjs +0 -75
  940. package/scripts/town-scene-clear.mjs +0 -56
  941. package/scripts/verify-exec-modes-report.ts +0 -248
  942. package/scripts/verify-lead-mail.ts +0 -188
  943. package/scripts/verify-page-smoke.mjs +0 -87
  944. package/scripts/ws-test.mjs +0 -176
  945. package/scripts/ws-test.py +0 -4
@@ -1,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) })