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
@@ -17,19 +17,24 @@
17
17
  * 服务器未起时自动降级为仅 A 部分。
18
18
  */
19
19
 
20
- const BASE = process.argv[2] ?? process.env.AW_BASE ?? "http://127.0.0.1:3021"
20
+ const BASE = process.argv[2] ?? process.env.AW_BASE ?? 'http://127.0.0.1:3021'
21
21
  let pass = 0
22
22
  let fail = 0
23
- const ok = (cond, label, detail = "") => {
24
- if (cond) { pass++; console.log(" [PASS] " + label + (detail ? " -- " + detail : "")) }
25
- else { fail++; console.log(" [FAIL] " + label + (detail ? " -- " + detail : "")) }
23
+ const ok = (cond, label, detail = '') => {
24
+ if (cond) {
25
+ pass++
26
+ console.log(' [PASS] ' + label + (detail ? ' -- ' + detail : ''))
27
+ return
28
+ }
29
+ fail++
30
+ console.log(' [FAIL] ' + label + (detail ? ' -- ' + detail : ''))
26
31
  }
27
- const section = t => console.log("\n=== " + t + " ===")
32
+ const section = t => console.log('\n=== ' + t + ' ===')
28
33
 
29
34
  // ---------------------------------------------------------
30
35
  // A. 函数级:复刻 daq-controller.ts 的映射逻辑
31
36
  // ---------------------------------------------------------
32
- section("A. 函数级:内存读穿透映射与 TSDB 形态一致性")
37
+ section('A. 函数级:内存读穿透映射与 TSDB 形态一致性')
33
38
 
34
39
  /** 复刻 DaqController.pointsFromMeta(与 tsdb adapter 同规则) */
35
40
  function pointsFromMeta(meta) {
@@ -46,7 +51,7 @@ function framesFromBuffer(frameBuffer, id, tsMs) {
46
51
  out.push({
47
52
  at: r.tsMs,
48
53
  kind: r.kind,
49
- points: r.kind === "vector" ? pointsFromMeta(r.meta) : undefined,
54
+ points: r.kind === 'vector' ? pointsFromMeta(r.meta) : undefined,
50
55
  metrics: r.metrics,
51
56
  meta: r.meta,
52
57
  deviceBindingId: r.deviceBindingId ?? null,
@@ -64,7 +69,7 @@ function queryFramesMapping(row) {
64
69
  return {
65
70
  at: row.tsMs,
66
71
  kind: row.kind,
67
- points: row.kind === "vector" ? pointsFromMeta(row.meta) : undefined,
72
+ points: row.kind === 'vector' ? pointsFromMeta(row.meta) : undefined,
68
73
  metrics: row.metrics,
69
74
  meta: row.meta,
70
75
  deviceBindingId: row.device_binding_id ?? null,
@@ -80,10 +85,29 @@ function legacyFrameContent(tsdbRows, id, tsMs) {
80
85
  const rows = tsdbRows.filter(r => r.nodeId === id && r.tsMs >= tsMs - 1 && r.tsMs <= tsMs + 1)
81
86
  .map(queryFramesMapping)
82
87
  const row = rows.find(r => r.at === tsMs)
83
- if (!row || row.kind !== "image") return { status: 404 }
88
+ if (!row || row.kind !== 'image') return { status: 404 }
84
89
  const key = row.meta.objectKey
85
90
  if (!key) return { status: 404 }
86
- return { status: 200, key, mime: typeof row.meta.mime === "string" ? row.meta.mime : "image/png" }
91
+ return { status: 200, key, mime: typeof row.meta.mime === 'string' ? row.meta.mime : 'image/png' }
92
+ }
93
+
94
+ /**
95
+ * 读 PNG IHDR 的像素宽度(非 PNG / 太短 / chunk 不合法 → null)。
96
+ * PNG:8 字节签名 + [4B 长度][4B "IHDR"][4B 宽度][4B 高度]...
97
+ */
98
+ function pngWidth(buf) {
99
+ if (!buf || buf.length < 24) return null
100
+ const sig = [0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a]
101
+ for (let i = 0; i < 8; i++) if (buf[i] !== sig[i]) return null
102
+ if (String.fromCharCode(buf[12], buf[13], buf[14], buf[15]) !== 'IHDR') return null
103
+ return ((buf[16] << 24) | (buf[17] << 16) | (buf[18] << 8) | buf[19]) >>> 0
104
+ }
105
+
106
+ /** 两份字节是否完全相同 */
107
+ function sameBytes(a, b) {
108
+ if (!a || !b || a.length !== b.length) return false
109
+ for (let i = 0; i < a.length; i++) if (a[i] !== b[i]) return false
110
+ return true
87
111
  }
88
112
 
89
113
  /** 复刻「修复后」语义:先 buffer,未命中再 TSDB */
@@ -93,23 +117,23 @@ function fixedFrameContent(frameBuffer, tsdbRows, id, tsMs, thumb) {
93
117
  rows.push(...tsdbRows.filter(r => r.nodeId === id && r.tsMs >= tsMs - 1 && r.tsMs <= tsMs + 1).map(queryFramesMapping))
94
118
  }
95
119
  const row = rows.find(r => r.at === tsMs)
96
- if (!row || row.kind !== "image") return { status: 404 }
120
+ if (!row || row.kind !== 'image') return { status: 404 }
97
121
  const key = thumb ? row.meta.thumbKey : row.meta.objectKey
98
122
  if (!key) return { status: 404 }
99
- return { status: 200, key, mime: typeof row.meta.mime === "string" ? row.meta.mime : "image/png" }
123
+ return { status: 200, key, mime: typeof row.meta.mime === 'string' ? row.meta.mime : 'image/png' }
100
124
  }
101
125
 
102
126
  const TS = 1760000000000
103
- const NODE = "dn-race01"
127
+ const NODE = 'dn-race01'
104
128
  const imageRow = {
105
- nodeId: NODE, tsMs: TS, kind: "image", templateKey: "ccd-image", deviceBindingId: null,
129
+ nodeId: NODE, tsMs: TS, kind: 'image', templateKey: 'ccd-image', deviceBindingId: null,
106
130
  lineId: null, productId: null, recipeId: null, runId: null, points: 0,
107
- meta: { objectKey: "daq/" + NODE + "/" + TS + ".png", thumbKey: "daq/" + NODE + "/" + TS + ".thumb.png", mime: "image/png", width: 640, height: 480 },
131
+ meta: { objectKey: 'daq/' + NODE + '/' + TS + '.png', thumbKey: 'daq/' + NODE + '/' + TS + '.thumb.png', mime: 'image/png', width: 640, height: 480 },
108
132
  metrics: { brightness: 128.5 },
109
133
  device_binding_id: null, line_id: null, product_id: null, recipe_id: null, run_id: null,
110
134
  }
111
135
  const vectorRow = {
112
- nodeId: NODE, tsMs: TS, kind: "vector", templateKey: "plug-matrix-profile", deviceBindingId: null,
136
+ nodeId: NODE, tsMs: TS, kind: 'vector', templateKey: 'plug-matrix-profile', deviceBindingId: null,
113
137
  lineId: null, productId: null, recipeId: null, runId: null, points: 3,
114
138
  meta: { points: [1.5, 2.5, 3.5] }, metrics: { avg: 2.5 },
115
139
  device_binding_id: null, line_id: null, product_id: null, recipe_id: null, run_id: null,
@@ -117,47 +141,50 @@ const vectorRow = {
117
141
  const EMPTY_TSDB = []
118
142
 
119
143
  // A1 竞态复现:修复前 404
120
- ok(legacyFrameContent(EMPTY_TSDB, NODE, TS).status === 404, "竞态复现:未刷盘时[仅查 TSDB]返回 404")
144
+ ok(legacyFrameContent(EMPTY_TSDB, NODE, TS).status === 404, '竞态复现:未刷盘时[仅查 TSDB]返回 404')
121
145
 
122
146
  // A2 修复后立刻可取
123
147
  const fixed = fixedFrameContent([imageRow], EMPTY_TSDB, NODE, TS, false)
124
- ok(fixed.status === 200, "修复生效:同刻[先查 buffer]返回 200", "status=" + fixed.status)
125
- ok(fixed.key === imageRow.meta.objectKey, "主图取 meta.objectKey", String(fixed.key))
126
- ok(fixed.mime === "image/png", "mime 透传自 meta.mime", String(fixed.mime))
127
- ok(fixedFrameContent([imageRow], EMPTY_TSDB, NODE, TS, true).key === imageRow.meta.thumbKey, "缩略图取 meta.thumbKey")
148
+ ok(fixed.status === 200, '修复生效:同刻[先查 buffer]返回 200', 'status=' + fixed.status)
149
+ ok(fixed.key === imageRow.meta.objectKey, '主图取 meta.objectKey', String(fixed.key))
150
+ ok(fixed.mime === 'image/png', 'mime 透传自 meta.mime', String(fixed.mime))
151
+ ok(fixedFrameContent([imageRow], EMPTY_TSDB, NODE, TS, true).key === imageRow.meta.thumbKey, '缩略图取 meta.thumbKey')
128
152
 
129
153
  // A3 形态一致性:buffer 路径 === TSDB 路径
130
154
  const fromBuffer = framesFromBuffer([imageRow], NODE, TS)[0]
131
155
  const fromTsdb = queryFramesMapping(imageRow)
132
156
  const keys = o => JSON.stringify(Object.keys(o).sort())
133
- ok(keys(fromBuffer) === keys(fromTsdb), "image:buffer 记录键集 === TSDB 记录键集", keys(fromBuffer))
134
- ok(JSON.stringify(fromBuffer) === JSON.stringify(fromTsdb), "image:buffer 记录值与 TSDB 逐一相等")
135
- ok(fromBuffer.points === undefined, "image:points 为 undefined(与 TSDB 一致)")
136
- ok(fromBuffer.meta === imageRow.meta, "image:meta 原样透传(objectKey/thumbKey/mime/width/height)")
157
+ ok(keys(fromBuffer) === keys(fromTsdb), 'image:buffer 记录键集 === TSDB 记录键集', keys(fromBuffer))
158
+ ok(JSON.stringify(fromBuffer) === JSON.stringify(fromTsdb), 'image:buffer 记录值与 TSDB 逐一相等')
159
+ ok(fromBuffer.points === undefined, 'image:points 为 undefined(与 TSDB 一致)')
160
+ ok(fromBuffer.meta === imageRow.meta, 'image:meta 原样透传(objectKey/thumbKey/mime/width/height)')
137
161
 
138
162
  const vecBuf = framesFromBuffer([vectorRow], NODE, TS)[0]
139
163
  const vecTsdb = queryFramesMapping(vectorRow)
140
- ok(JSON.stringify(vecBuf) === JSON.stringify(vecTsdb), "vector:buffer 记录与 TSDB 逐一相等(含 meta.points 还原)")
141
- ok(Array.isArray(vecBuf.points) && vecBuf.points.length === 3, "vector:points 从 meta.points 还原", JSON.stringify(vecBuf.points))
164
+ ok(JSON.stringify(vecBuf) === JSON.stringify(vecTsdb), 'vector:buffer 记录与 TSDB 逐一相等(含 meta.points 还原)')
165
+ ok(Array.isArray(vecBuf.points) && vecBuf.points.length === 3, 'vector:points 从 meta.points 还原', JSON.stringify(vecBuf.points))
142
166
 
143
167
  // A4 pointsFromMeta 防御规则
144
- ok(pointsFromMeta({ points: [] }) === undefined, "空点列 -> undefined")
145
- ok(pointsFromMeta({ points: "x" }) === undefined, "非数组 -> undefined")
146
- ok(pointsFromMeta({ points: [1, "a"] }) === undefined, "非数值成员 -> undefined")
147
- ok(pointsFromMeta({ points: new Array(4097).fill(1) }) === undefined, "超 4096 越界 -> undefined")
148
- ok(JSON.stringify(pointsFromMeta({ points: ["1", 2] })) === "[1,2]", "数值字符串归一为 number")
168
+ ok(pointsFromMeta({ points: [] }) === undefined, '空点列 -> undefined')
169
+ ok(pointsFromMeta({ points: 'x' }) === undefined, '非数组 -> undefined')
170
+ ok(pointsFromMeta({ points: [1, 'a'] }) === undefined, '非数值成员 -> undefined')
171
+ ok(pointsFromMeta({ points: new Array(4097).fill(1) }) === undefined, '超 4096 越界 -> undefined')
172
+ ok(JSON.stringify(pointsFromMeta({ points: ['1', 2] })) === '[1,2]', '数值字符串归一为 number')
149
173
 
150
174
  // A5 命中不查 TSDB
151
175
  let tsdbCalls = 0
152
- const spy = () => { tsdbCalls++; return [] }
176
+ const spy = () => {
177
+ tsdbCalls++
178
+ return []
179
+ }
153
180
  if (framesFromBuffer([imageRow], NODE, TS).length === 0) spy()
154
- ok(tsdbCalls === 0, "buffer 命中时不触发 TSDB 查询")
181
+ ok(tsdbCalls === 0, 'buffer 命中时不触发 TSDB 查询')
155
182
  if (framesFromBuffer([imageRow], NODE, TS + 1).length === 0) spy()
156
- ok(tsdbCalls === 1, "buffer 未命中时回退 TSDB 查询")
183
+ ok(tsdbCalls === 1, 'buffer 未命中时回退 TSDB 查询')
157
184
 
158
185
  // A6 刷盘后无回归
159
- ok(fixedFrameContent([], [imageRow], NODE, TS, false).status === 200, "刷盘后(buffer 空)仍由 TSDB 路径返回 200")
160
- ok(fixedFrameContent([], [], NODE, TS, false).status === 404, "真正不存在的帧仍 404(未放水)")
186
+ ok(fixedFrameContent([], [imageRow], NODE, TS, false).status === 200, '刷盘后(buffer 空)仍由 TSDB 路径返回 200')
187
+ ok(fixedFrameContent([], [], NODE, TS, false).status === 404, '真正不存在的帧仍 404(未放水)')
161
188
 
162
189
  // A7 frames() 列表合并语义
163
190
  function mergeFrames(tsdbRows, frameBuffer, id, opts) {
@@ -172,139 +199,160 @@ function mergeFrames(tsdbRows, frameBuffer, id, opts) {
172
199
  return [...rows, ...pending].slice(0, Math.min(Math.max(opts.limit ?? 100, 1), 1000))
173
200
  }
174
201
  const merged = mergeFrames([], [imageRow, vectorRow], NODE, { limit: 10 })
175
- ok(merged.length === 2, "frames():未刷盘帧补入列表", "n=" + merged.length)
176
- ok(merged[0].at >= merged[1].at, "frames():按 at 降序")
177
- ok(mergeFrames([], [imageRow], NODE, { limit: 10, kind: "vector" }).length === 0, "frames():kind 过滤生效")
178
- ok(mergeFrames([], [imageRow, vectorRow], NODE, { limit: 10 }).length === 2, "frames():无重复(按 at 去重)")
202
+ ok(merged.length === 2, 'frames():未刷盘帧补入列表', 'n=' + merged.length)
203
+ ok(merged[0].at >= merged[1].at, 'frames():按 at 降序')
204
+ ok(mergeFrames([], [imageRow], NODE, { limit: 10, kind: 'vector' }).length === 0, 'frames():kind 过滤生效')
205
+ ok(mergeFrames([], [imageRow, vectorRow], NODE, { limit: 10 }).length === 2, 'frames():无重复(按 at 去重)')
179
206
 
180
207
  // ---------------------------------------------------------
181
208
  // B. 端到端
182
209
  // ---------------------------------------------------------
183
- section("B. 端到端:运行中的服务器")
210
+ section('B. 端到端:运行中的服务器')
184
211
 
185
212
  // BASE 可能指向不可用端口;依次探测候选基址,取第一个能提供 DAQ API 的
186
- const candidates = [BASE, "http://127.0.0.1:3021", "http://127.0.0.1:3001"].filter((v, i, a) => a.indexOf(v) === i)
213
+ const candidates = [BASE, 'http://127.0.0.1:3021', 'http://127.0.0.1:3001'].filter((v, i, a) => a.indexOf(v) === i)
187
214
  let API = null
188
215
  for (const c of candidates) {
189
216
  try {
190
- const res = await fetch(c + "/api/workshop/daq/infra", { signal: AbortSignal.timeout(4000) })
217
+ const res = await fetch(c + '/api/workshop/daq/infra', { signal: AbortSignal.timeout(4000) })
191
218
  // 401 = 服务在,只是要鉴权;同样算可用
192
- if (res.status < 500) { API = c; break }
193
- } catch { /* 试下一个 */ }
219
+ if (res.status < 500) {
220
+ API = c
221
+ break
222
+ }
223
+ }
224
+ catch { /* 试下一个 */ }
194
225
  }
195
226
  const online = API != null
196
- if (online && API !== BASE) console.log(" " + BASE + " 不可用 -> 回退到 " + API)
227
+ if (online && API !== BASE) console.log(' ' + BASE + ' 不可用 -> 回退到 ' + API)
197
228
 
198
229
  const api = async (path, opts = {}) => {
199
- const res = await fetch(API + path, { ...opts, headers: { "content-type": "application/json", ...(opts.headers ?? {}) } })
200
- const ct = res.headers.get("content-type") ?? ""
201
- const body = ct.includes("application/json") ? await res.json().catch(() => null) : Buffer.from(await res.arrayBuffer())
230
+ const res = await fetch(API + path, { ...opts, headers: { 'content-type': 'application/json', ...(opts.headers ?? {}) } })
231
+ const ct = res.headers.get('content-type') ?? ''
232
+ const body = ct.includes('application/json') ? await res.json().catch(() => null) : Buffer.from(await res.arrayBuffer())
202
233
  return { status: res.status, ct, body }
203
234
  }
204
235
 
205
236
  if (!online) {
206
- console.log(" [SKIP] 候选基址 " + candidates.join(", ") + " 均不可用 -> 跳过端到端;A 部分已函数级证明修复逻辑。")
207
- console.log("\n结果:" + pass + " 通过 / " + fail + " 失败(E2E 跳过)")
237
+ console.log(' [SKIP] 候选基址 ' + candidates.join(', ') + ' 均不可用 -> 跳过端到端;A 部分已函数级证明修复逻辑。')
238
+ console.log('\n结果:' + pass + ' 通过 / ' + fail + ' 失败(E2E 跳过)')
208
239
  process.exit(fail === 0 ? 0 : 1)
209
240
  }
210
- console.log(" 服务器在线:" + API)
241
+ console.log(' 服务器在线:' + API)
211
242
 
212
243
  // B1 鉴权:admin 全量可见(普通用户受产线 grant 过滤,节点列表为空)
213
- const ADMIN_EMAIL = process.env.AW_ADMIN_EMAIL ?? "admin@awshop.local"
214
- const ADMIN_PASS = process.env.AW_ADMIN_PASS ?? "admin123"
215
- const login = await api("/api/users/login", {
216
- method: "POST",
244
+ const ADMIN_EMAIL = process.env.AW_ADMIN_EMAIL ?? 'admin@awshop.local'
245
+ const ADMIN_PASS = process.env.AW_ADMIN_PASS ?? 'admin123'
246
+ const login = await api('/api/users/login', {
247
+ method: 'POST',
217
248
  body: JSON.stringify({ email: ADMIN_EMAIL, password: ADMIN_PASS }),
218
249
  })
219
250
  const token = login.body?.data?.token
220
- ok(!!token, "登录取得 token", token ? ADMIN_EMAIL + " role=" + login.body?.data?.user?.role : "status=" + login.status)
221
- if (!token) { console.log("\n结果:" + pass + " 通过 / " + fail + " 失败(无法鉴权,E2E 中止)"); process.exit(1) }
222
- const auth = { authorization: "Bearer " + token }
251
+ ok(!!token, '登录取得 token', token ? ADMIN_EMAIL + ' role=' + login.body?.data?.user?.role : 'status=' + login.status)
252
+ if (!token) {
253
+ console.log('\n结果:' + pass + ' 通过 / ' + fail + ' 失败(无法鉴权,E2E 中止)')
254
+ process.exit(1)
255
+ }
256
+ const auth = { authorization: 'Bearer ' + token }
223
257
 
224
258
  // B2 找 live image 节点(节点视图暴露 templateRef,非 templateKey)
225
- const idx = await api("/api/workshop/daq", { headers: auth })
259
+ const idx = await api('/api/workshop/daq', { headers: auth })
226
260
  const d = idx.body?.data ?? {}
227
261
  const nodes = d.nodes ?? []
228
262
  const kindOf = {}
229
263
  for (const t of d.templates ?? []) kindOf[t.key] = t.signalKind
230
- const refOf = n => String(n.templateRef ?? "").replace(/^daq-/, "")
231
- const imgNodes = nodes.filter(n => kindOf[refOf(n)] === "image")
232
- console.log(" 节点总数=" + nodes.length + " image 节点=" + imgNodes.length
233
- + " framesStored=" + (d.controller?.framesStored ?? "?"))
264
+ const refOf = n => String(n.templateRef ?? '').replace(/^daq-/, '')
265
+ const imgNodes = nodes.filter(n => kindOf[refOf(n)] === 'image')
266
+ console.log(' 节点总数=' + nodes.length + ' image 节点=' + imgNodes.length
267
+ + ' framesStored=' + (d.controller?.framesStored ?? '?'))
234
268
 
235
269
  if (imgNodes.length === 0) {
236
- console.log(" [SKIP] 服务器上无 image 类型节点 -> E2E 未执行(需先建 ccd-image 节点并开线)")
237
- console.log("\n结果:" + pass + " 通过 / " + fail + " 失败(E2E 部分跳过)")
270
+ console.log(' [SKIP] 服务器上无 image 类型节点 -> E2E 未执行(需先建 ccd-image 节点并开线)')
271
+ console.log('\n结果:' + pass + ' 通过 / ' + fail + ' 失败(E2E 部分跳过)')
238
272
  process.exit(fail === 0 ? 0 : 1)
239
273
  }
240
274
 
241
275
  // B3 挑一个在采(enabled 且非 offline)的 image 节点
242
- const target = imgNodes.find(n => n.enabled && n.state !== "offline") ?? imgNodes.find(n => n.enabled) ?? imgNodes[0]
243
- console.log(" 目标节点:" + target.id + " tpl=" + refOf(target) + " line=" + (target.lineId ?? "-")
244
- + " enabled=" + target.enabled + " state=" + target.state)
276
+ const target = imgNodes.find(n => n.enabled && n.state !== 'offline') ?? imgNodes.find(n => n.enabled) ?? imgNodes[0]
277
+ console.log(' 目标节点:' + target.id + ' tpl=' + refOf(target) + ' line=' + (target.lineId ?? '-')
278
+ + ' enabled=' + target.enabled + ' state=' + target.state)
245
279
 
246
280
  // B4 关键断言:捕捉「帧列表刚出现的新帧」并立刻回查 content。
247
281
  // 帧列表自身也走读穿透(修复覆盖),所以新帧一经出现即证明它在 buffer 或 TSDB 中;
248
282
  // 真正要证的是 content 端点对这种「极新鲜」的帧不再 404。
249
- console.log("\n --- 轮询最新帧并立刻回查 content(关键断言) ---")
283
+ console.log('\n --- 轮询最新帧并立刻回查 content(关键断言) ---')
250
284
 
251
285
  const seen = new Set()
252
286
  let hit = null
253
287
  const probeLog = []
254
288
  const deadline = Date.now() + 90000
255
289
  while (Date.now() < deadline && !hit) {
256
- const fr = await api("/api/workshop/daq/" + target.id + "/frames?limit=10", { headers: auth })
290
+ const fr = await api('/api/workshop/daq/' + target.id + '/frames?limit=10', { headers: auth })
257
291
  const list = fr.body?.data?.frames ?? []
258
292
  for (const f of list) {
259
293
  if (seen.has(f.at)) continue
260
294
  seen.add(f.at)
261
- if (f.kind !== "image") continue
295
+ if (f.kind !== 'image') continue
262
296
  // 立刻回查(不等待,模拟前端收到 WS daq.frame 后的即时回查)
263
297
  const t0 = Date.now()
264
- const c = await api("/api/workshop/daq/" + target.id + "/frames/content?ts=" + f.at, { headers: auth })
298
+ const c = await api('/api/workshop/daq/' + target.id + '/frames/content?ts=' + f.at, { headers: auth })
265
299
  const dt = Date.now() - t0
266
- probeLog.push("ts=" + f.at + "->" + c.status)
267
- if (c.status === 200) { hit = { frame: f, content: c, dt }; break }
300
+ probeLog.push('ts=' + f.at + '->' + c.status)
301
+ if (c.status === 200) {
302
+ hit = { frame: f, content: c, dt }
303
+ break
304
+ }
268
305
  }
269
306
  if (!hit) await new Promise(r => setTimeout(r, 250))
270
307
  }
271
308
 
272
- if (probeLog.length) console.log(" 探测 " + probeLog.length + " 个新帧:" + probeLog.slice(0, 8).join(" | ") + (probeLog.length > 8 ? " ..." : ""))
309
+ if (probeLog.length) console.log(' 探测 ' + probeLog.length + ' 个新帧:' + probeLog.slice(0, 8).join(' | ') + (probeLog.length > 8 ? ' ...' : ''))
273
310
 
274
- ok(!!hit, "捕捉到新 ingest 的 image 帧并可立即取 content",
275
- hit ? "ts=" + hit.frame.at + " 回查耗时=" + hit.dt + "ms" : "轮询 " + seen.size + " 帧均未成功")
311
+ ok(!!hit, '捕捉到新 ingest 的 image 帧并可立即取 content',
312
+ hit ? 'ts=' + hit.frame.at + ' 回查耗时=' + hit.dt + 'ms' : '轮询 ' + seen.size + ' 帧均未成功')
276
313
 
277
314
  if (hit) {
278
315
  const c = hit.content
279
316
  const buf = c.body
280
- ok(c.status === 200, "刚 ingest 的帧 content 立即可取(200)", "status=" + c.status)
281
- ok(Buffer.isBuffer(buf) && buf.length > 0, "content 返回非空二进制", "bytes=" + (buf?.length ?? 0))
317
+ ok(c.status === 200, '刚 ingest 的帧 content 立即可取(200)', 'status=' + c.status)
318
+ ok(Buffer.isBuffer(buf) && buf.length > 0, 'content 返回非空二进制', 'bytes=' + (buf?.length ?? 0))
282
319
  const isPng = buf && buf[0] === 0x89 && buf[1] === 0x50 && buf[2] === 0x4e && buf[3] === 0x47
283
320
  const isJpg = buf && buf[0] === 0xff && buf[1] === 0xd8
284
- ok(isPng || isJpg, "content 是合法 PNG/JPEG 魔数", isPng ? "PNG" : isJpg ? "JPEG" : "ct=" + c.ct)
285
- ok(String(c.ct).startsWith("image/"), "content-type 为 image/*", c.ct)
321
+ ok(isPng || isJpg, 'content 是合法 PNG/JPEG 魔数', isPng ? 'PNG' : isJpg ? 'JPEG' : 'ct=' + c.ct)
322
+ ok(String(c.ct).startsWith('image/'), 'content-type 为 image/*', c.ct)
286
323
 
287
324
  // 主图 vs 缩略图应是不同字节(缩略图按模板 sink 缩到 256 宽)
288
- const hasThumb = hit.frame.meta && typeof hit.frame.meta.thumbKey === "string"
325
+ const hasThumb = hit.frame.meta && typeof hit.frame.meta.thumbKey === 'string'
289
326
  if (hasThumb) {
290
- const t = await api("/api/workshop/daq/" + target.id + "/frames/content?ts=" + hit.frame.at + "&thumb=1", { headers: auth })
291
- ok(t.status === 200 && t.body?.length > 0, "缩略图 content 可取", "status=" + t.status + " bytes=" + (t.body?.length ?? 0))
292
- ok(t.body?.length < buf.length, "缩略图小于主图(证明走 thumbKey 分支)",
293
- (t.body?.length ?? 0) + " < " + buf.length)
327
+ const t = await api('/api/workshop/daq/' + target.id + '/frames/content?ts=' + hit.frame.at + '&thumb=1', { headers: auth })
328
+ ok(t.status === 200 && t.body?.length > 0, '缩略图 content 可取', 'status=' + t.status + ' bytes=' + (t.body?.length ?? 0))
329
+ // 断言用**像素宽度**而不是字节大小:合成帧的主图往往是低熵图案(平坦/渐变),
330
+ // 其 PNG 可能比"降采样后反而引入高频"的缩略图更小 —— 按字节比大小会假阳性。
331
+ // 直接读 IHDR 宽高才是"确实走了 thumbKey 分支"的硬证据。
332
+ const mainW = pngWidth(buf)
333
+ const thumbW = pngWidth(t.body)
334
+ if (mainW != null && thumbW != null) {
335
+ ok(thumbW < mainW, '缩略图像素宽度小于主图(证明走 thumbKey 分支)',
336
+ 'thumb ' + thumbW + 'px < main ' + mainW + 'px')
337
+ }
338
+ else {
339
+ ok(!sameBytes(buf, t.body), '缩略图与主图字节不同(非 PNG 无法比尺寸)',
340
+ 'main=' + (buf?.length ?? 0) + 'B thumb=' + (t.body?.length ?? 0) + 'B')
341
+ }
294
342
  }
295
- else { console.log(" [INFO] 该帧无 thumbKey -> 跳过缩略图断言") }
343
+ else { console.log(' [INFO] 该帧无 thumbKey -> 跳过缩略图断言') }
296
344
 
297
345
  // 未放水:不存在的 ts 仍 404
298
- const miss = await api("/api/workshop/daq/" + target.id + "/frames/content?ts=1", { headers: auth })
299
- ok(miss.status === 404, "不存在的帧仍返回 404(未放水)", "status=" + miss.status)
346
+ const miss = await api('/api/workshop/daq/' + target.id + '/frames/content?ts=1', { headers: auth })
347
+ ok(miss.status === 404, '不存在的帧仍返回 404(未放水)', 'status=' + miss.status)
300
348
 
301
349
  // 刷盘后仍可取(TSDB 路径无回归):等待 > 500ms 防抖窗 + 写库时间
302
- console.log(" 等待 1500ms(越过 500ms 刷盘窗)后复测同一 ts ...")
350
+ console.log(' 等待 1500ms(越过 500ms 刷盘窗)后复测同一 ts ...')
303
351
  await new Promise(r => setTimeout(r, 1500))
304
- const again = await api("/api/workshop/daq/" + target.id + "/frames/content?ts=" + hit.frame.at, { headers: auth })
305
- ok(again.status === 200 && again.body?.length === buf.length, "刷盘后同一帧仍可取且字节一致(TSDB 路径无回归)",
306
- "status=" + again.status + " bytes=" + (again.body?.length ?? 0))
352
+ const again = await api('/api/workshop/daq/' + target.id + '/frames/content?ts=' + hit.frame.at, { headers: auth })
353
+ ok(again.status === 200 && again.body?.length === buf.length, '刷盘后同一帧仍可取且字节一致(TSDB 路径无回归)',
354
+ 'status=' + again.status + ' bytes=' + (again.body?.length ?? 0))
307
355
  }
308
356
 
309
- console.log("\n结果:" + pass + " 通过 / " + fail + " 失败")
357
+ console.log('\n结果:' + pass + ' 通过 / ' + fail + ' 失败')
310
358
  process.exit(fail === 0 ? 0 : 1)
@@ -0,0 +1,176 @@
1
+ /**
2
+ * 回归测试 —— 事件 ring 增量索引与增量时间线的**语义等价性**。
3
+ *
4
+ * 背景(为什么要测):events store 的两条热路径从"每帧全量过滤"改成了增量,
5
+ * 增量实现的危险在于**悄悄与全量语义分叉**(少一条、多一条、淘汰后残留),
6
+ * 而这类 bug 只在长会话里出现,人工测不出来。所以这里做**属性对照测试**:
7
+ * 用同一串随机操作(ingest / 淘汰 / 历史合并 / 过滤切换 / 聚焦切换)同时喂给
8
+ * 「真实 store」与「朴素全量参照实现」,逐拍比对结果必须完全一致。
9
+ *
10
+ * 运行:node scripts/test-events-index.mjs
11
+ */
12
+ import { register } from 'node:module'
13
+ import { createPinia, setActivePinia } from 'pinia'
14
+
15
+ register(new URL('./_audit/ts-resolve-hook.mjs', import.meta.url).href)
16
+
17
+ const { useEventsStore, matchesTimeline, FILTER_TYPES } = await import('../app/stores/workshop/events.ts')
18
+
19
+ let pass = 0
20
+ const fails = []
21
+ const check = (name, ok, detail = '') => {
22
+ if (ok) {
23
+ pass++
24
+ console.log(` ✔ ${name}${detail ? ` — ${detail}` : ''}`)
25
+ return
26
+ }
27
+ fails.push(name)
28
+ console.log(` ✘ ${name}${detail ? ` — ${detail}` : ''}`)
29
+ }
30
+
31
+ const RING_CAP = 5000
32
+
33
+ // ---------- 朴素参照实现 ----------
34
+ // 关键:谓词**复用产品导出的 matchesTimeline**。本测试要证明的是"增量维护状态
35
+ // (byAgent 桶 / upToIdx / headSeq / 淘汰同步)与全量重算等价",不是重新推导过滤语义。
36
+ // 自己再抄一份谓词只会引入假阳性(第一版就两次栽在这上面:key 档位的 tier 判定、
37
+ // 以及 key 档位提前返回而不受 focus 影响)。
38
+ const refFilter = (items, filter, focus) =>
39
+ items.filter(e => matchesTimeline(e, filter, FILTER_TYPES[filter], focus))
40
+
41
+ const refByAgent = (items, agentId) => items.filter(e => e.agentId === agentId)
42
+
43
+ // ---------- 随机操作序列 ----------
44
+ let seed = 0x2F6E2B1
45
+ const rnd = () => {
46
+ seed = (Math.imul(seed, 1664525) + 1013904223) >>> 0
47
+ return seed / 0x100000000
48
+ }
49
+ const pick = arr => arr[Math.floor(rnd() * arr.length)]
50
+
51
+ const AGENTS = ['a1', 'a2', 'a3', 'a4', 'a5']
52
+ const TYPES = ['agent.message', 'agent.delta', 'agent.status.message', 'a2a.message', 'task.status', 'task.progress', 'a2a.artifact', 'error', 'agent.member']
53
+
54
+ function mkEnvelope(seq) {
55
+ const type = pick(TYPES)
56
+ const agentId = type === 'error' ? undefined : pick(AGENTS)
57
+ // 覆盖各档位:task.status 的终态/等待态、require-reply 的 attention、普通过程帧
58
+ const status = type === 'task.status' ? pick(['WORKING', 'COMPLETED', 'FAILED', 'WAITING']) : undefined
59
+ return {
60
+ seq,
61
+ channelId: 'ch1',
62
+ type,
63
+ agentId,
64
+ taskId: type.startsWith('task.') ? `t${Math.floor(rnd() * 3)}` : undefined,
65
+ at: new Date(1700000000000 + seq * 10).toISOString(),
66
+ payload: type === 'agent.delta'
67
+ ? { delta: `d${seq}` }
68
+ : (status ? { state: status } : (rnd() < 0.2 ? { metadata: { 'x-aw-require-reply': 'true' } } : {})),
69
+ }
70
+ }
71
+
72
+ const FILTERS = ['all', 'messages', 'tasks', 'team', 'errors', 'key']
73
+
74
+ async function main() {
75
+ setActivePinia(createPinia())
76
+ const store = useEventsStore()
77
+ const CH = 'ch1'
78
+
79
+ // 初始快照(建立 ring)
80
+ store.ingest({ seq: 0, channelId: CH, type: 'channel.snapshot', payload: {} })
81
+
82
+ let seq = 0
83
+ let mismatches = 0
84
+ const STEPS = 6000
85
+ // 4000 步之后超过 RING_CAP 会开始淘汰 —— 专门覆盖"淘汰后索引残留"这一最易错的分支
86
+ const historyScript = []
87
+ for (let i = 0; i < 6; i++) {
88
+ const extra = []
89
+ for (let k = 0; k < 40; k++) extra.push(mkEnvelope(seq + 1 + k))
90
+ historyScript.push({ atStep: Math.floor(STEPS * (i + 1) / 7), items: extra })
91
+ }
92
+
93
+ for (let step = 0; step < STEPS; step++) {
94
+ // 1) 推进 seq 并 ingest 一帧
95
+ seq += 1
96
+ const e = mkEnvelope(seq)
97
+ store.ingest(e)
98
+
99
+ // 2) 偶发:切换过滤 / 聚焦
100
+ if (step % 250 === 0) store.setFilter(CH, pick(FILTERS))
101
+ if (step % 317 === 0) store.setFocusAgent(CH, rnd() < 0.6 ? pick(AGENTS) : null)
102
+
103
+ // 3) 偶发:历史批量合并(走 reindex 全量重建路径)
104
+ const script = historyScript.find(s => s.atStep === step)
105
+ if (script) {
106
+ for (const item of script.items) store.ingest(item)
107
+ seq += script.items.length
108
+ }
109
+
110
+ // 4) 对照:ring items 本身
111
+ const ring = store.rings[CH]
112
+ if (!ring) {
113
+ mismatches++
114
+ console.log(` ! step ${step}: ring 丢失`)
115
+ break
116
+ }
117
+
118
+ // 5) 对照:每个 agent 的子序列(索引)必须与全量过滤一致
119
+ for (const a of AGENTS) {
120
+ const got = store.agentEvents(CH, a)
121
+ const want = refByAgent(ring.items, a)
122
+ if (got.length !== want.length || got.some((x, i) => x !== want[i])) {
123
+ mismatches++
124
+ console.log(` ! step ${step} agent=${a} 索引漂移:got=${got.length} want=${want.length}`)
125
+ break
126
+ }
127
+ }
128
+ if (mismatches) break
129
+
130
+ // 6) 对照:时间线(增量)必须与全量过滤一致
131
+ const filter = store.filters[CH] ?? 'all'
132
+ const focus = store.focusAgents[CH] ?? null
133
+ const gotTl = store.timeline(CH)
134
+ const wantTl = refFilter(ring.items, filter, focus)
135
+ if (gotTl.length !== wantTl.length || gotTl.some((x, i) => x !== wantTl[i])) {
136
+ mismatches++
137
+ console.log(` ! step ${step} timeline(${filter},focus=${focus}) 漂移:got=${gotTl.length} want=${wantTl.length}`)
138
+ break
139
+ }
140
+ }
141
+
142
+ check(`${STEPS} 步随机操作后 ring 未丢失`, Boolean(store.rings[CH]))
143
+ check('agent 子序列索引与全量过滤逐拍一致', mismatches === 0, `mismatches=${mismatches}`)
144
+ check('增量时间线与全量过滤逐拍一致', mismatches === 0, `mismatches=${mismatches}`)
145
+ check('ring 已触发淘汰(覆盖淘汰分支)', store.rings[CH].items.length <= RING_CAP,
146
+ `items=${store.rings[CH].items.length} cap=${RING_CAP}`)
147
+ // 关键:总 seq 必须超过 cap,否则整段测试根本没走到"满环 + 头部淘汰"这条最易错的分支
148
+ check('总 seq 已越过 ring 容量(确认走过淘汰路径)', seq > RING_CAP, `seq=${seq} cap=${RING_CAP}`)
149
+
150
+ // 索引无悬挂引用:所有桶内元素必须仍在 items 中(否则是内存泄漏 + 查询命中幽灵条目)
151
+ const inRing = new Set(store.rings[CH].items)
152
+ let dangling = 0
153
+ for (const a of AGENTS) for (const e of store.agentEvents(CH, a)) if (!inRing.has(e)) dangling++
154
+ check('索引无悬挂引用(不持有已淘汰条目)', dangling === 0, `dangling=${dangling}`)
155
+
156
+ // 索引覆盖率:所有带 agentId 的 items 都能在其桶里找到
157
+ let uncovered = 0
158
+ for (const e of store.rings[CH].items) {
159
+ if (!e.agentId) continue
160
+ if (!store.agentEvents(CH, e.agentId).includes(e)) uncovered++
161
+ }
162
+ check('索引覆盖完整(每条带 agentId 的事件都在桶内)', uncovered === 0, `uncovered=${uncovered}`)
163
+
164
+ // 快照重建必须清空索引
165
+ store.ingest({ seq: seq + 100, channelId: CH, type: 'channel.snapshot', payload: {} })
166
+ const emptyOk = AGENTS.every(a => store.agentEvents(CH, a).length === 0) && store.timeline(CH).length === 0
167
+ check('channel.snapshot 重建后索引与时间线均为空', emptyOk)
168
+
169
+ console.log(`\n结果:${pass} 通过 / ${fails.length} 失败`)
170
+ process.exit(fails.length === 0 ? 0 : 1)
171
+ }
172
+
173
+ main().catch((err) => {
174
+ console.error(err)
175
+ process.exit(1)
176
+ })