agentworkshop 0.7.27 → 0.7.34

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 (1033) hide show
  1. package/.AgentWorkShop/prompts/aml-mission-default.md +20 -0
  2. package/.AgentWorkShop/prompts/aml-playbook.md +49 -0
  3. package/.AgentWorkShop/prompts/host-tools.json +314 -0
  4. package/.output/.AgentWorkShop/prompts/aml-mission-default.md +20 -0
  5. package/.output/.AgentWorkShop/prompts/aml-playbook.md +49 -0
  6. package/.output/.AgentWorkShop/prompts/host-tools.json +314 -0
  7. package/.output/.AgentWorkShop/schema.json +120 -0
  8. package/.output/nitro.json +1 -1
  9. package/.output/public/_nuxt/{BTLEvDxM.js → 4bHdIqEg.js} +8 -8
  10. package/.output/public/_nuxt/B9nXmjSB.js +19 -0
  11. package/.output/public/_nuxt/BASN8nZ0.js +1 -0
  12. package/.output/public/_nuxt/{DNQF_TXX.js → BBBtwOpo.js} +1 -1
  13. package/.output/public/_nuxt/{DoAlYsiF.js → BBwMH_hG.js} +1 -1
  14. package/.output/public/_nuxt/BWSE6hR6.js +1 -0
  15. package/.output/public/_nuxt/BZv4RFYN.js +1 -0
  16. package/.output/public/_nuxt/{BgCrZKv_2.js → Bc0AmjfT.js} +1 -1
  17. package/.output/public/_nuxt/BcmbLh2z2.js +1 -0
  18. package/.output/public/_nuxt/BgTB6h_q.js +2 -0
  19. package/.output/public/_nuxt/BkLJA9J5.js +1 -0
  20. package/.output/public/_nuxt/{XY2z78rj.js → BuCHayqN.js} +1 -1
  21. package/.output/public/_nuxt/{0jKrzLuM.js → BuvcLKh1.js} +1 -1
  22. package/.output/public/_nuxt/C-mDhyEd.js +1 -0
  23. package/.output/public/_nuxt/{DosOJEmZ2.js → C77oC8yC2.js} +1 -1
  24. package/.output/public/_nuxt/CQvmN-Mi.js +1 -0
  25. package/.output/public/_nuxt/CUDrOuW7.js +1 -0
  26. package/.output/public/_nuxt/{DjU9Dx5Y.js → CZcC-gpk.js} +1 -1
  27. package/.output/public/_nuxt/{Cz9gD2Yo.js → CbzsPO5H.js} +1 -1
  28. package/.output/public/_nuxt/CdSOrh2c.js +1 -0
  29. package/.output/public/_nuxt/Cgx818r-.js +1 -0
  30. package/.output/public/_nuxt/Cjm7VogC.js +1 -0
  31. package/.output/public/_nuxt/Cm5mDxzH.js +1 -0
  32. package/.output/public/_nuxt/Cp6z0RN7.js +1 -0
  33. package/.output/public/_nuxt/Ct-WOVr4.js +1 -0
  34. package/.output/public/_nuxt/CwqIxJGj.js +2 -0
  35. package/.output/public/_nuxt/{BGhOrgle.js → D0fhp-Ga.js} +2 -2
  36. package/.output/public/_nuxt/DIaTPH1M.js +1 -0
  37. package/.output/public/_nuxt/DLljr7g0.js +1 -0
  38. package/.output/public/_nuxt/DTYBfjRY.js +1 -0
  39. package/.output/public/_nuxt/DYKVPzN-.js +1 -0
  40. package/.output/public/_nuxt/DZzGarBE2.js +13 -0
  41. package/.output/public/_nuxt/DaMCzQhv.js +1 -0
  42. package/.output/public/_nuxt/DoMxCWN52.js +4 -0
  43. package/.output/public/_nuxt/{CucID8qg2.js → DoTdlVVe2.js} +1 -1
  44. package/.output/public/_nuxt/DsVcWfyR.js +1 -0
  45. package/.output/public/_nuxt/{BCJFMBQ6.js → DzuC31-i.js} +2 -2
  46. package/.output/public/_nuxt/FQri3dV3.js +1 -0
  47. package/.output/public/_nuxt/Lp7Ll94I.js +1 -0
  48. package/.output/public/_nuxt/PluginSlot.DmjNbrcX.css +1 -0
  49. package/.output/public/_nuxt/_id_.hRYo-EAB.css +1 -0
  50. package/.output/public/_nuxt/_wsId_.gXMEOYgX.css +1 -0
  51. package/.output/public/_nuxt/agents.BV70ioCv.css +1 -0
  52. package/.output/public/_nuxt/aml.WU_bh87J.css +1 -0
  53. package/.output/public/_nuxt/builds/latest.json +1 -1
  54. package/.output/public/_nuxt/builds/meta/adc365b6-f636-4a2b-9527-79819c1e874b.json +1 -0
  55. package/.output/public/_nuxt/daq.Bb6l44-O.css +1 -0
  56. package/.output/public/_nuxt/default.jNT73_hq.css +1 -0
  57. package/.output/public/_nuxt/ekuGmQ7R.js +1 -0
  58. package/.output/public/_nuxt/entry.jFrFAWuA.css +1 -0
  59. package/.output/public/_nuxt/pMoIO6rr.js +14 -0
  60. package/.output/public/_nuxt/pages.Cc8GX9T1.css +1 -0
  61. package/.output/public/_nuxt/plugins.wIPyfPn-.css +1 -0
  62. package/.output/public/_nuxt/settings.BCm4NZIc.css +1 -0
  63. package/.output/public/_nuxt/teams.BC75EGnR.css +1 -0
  64. package/.output/server/chunks/_/binding-authz.mjs +23 -0
  65. package/.output/server/chunks/_/binding-authz.mjs.map +1 -0
  66. package/.output/server/chunks/_/character-asset.repo.mjs +1 -1
  67. package/.output/server/chunks/_/host-bindings.mjs +1 -1
  68. package/.output/server/chunks/_/nitro.mjs +15929 -9198
  69. package/.output/server/chunks/_/nitro.mjs.map +1 -1
  70. package/.output/server/chunks/_/scene-layout.repo.mjs +3 -3
  71. package/.output/server/chunks/_/scene-layout.repo.mjs.map +1 -1
  72. package/.output/server/chunks/build/Checkbox-eax2M3o-.mjs +207 -0
  73. package/.output/server/chunks/build/Checkbox-eax2M3o-.mjs.map +1 -0
  74. package/.output/server/chunks/build/{OmpTerminalPanel-Cw_Vw9oO.mjs → OmpTerminalPanel-Cu_s4i0A.mjs} +2 -2
  75. package/.output/server/chunks/build/{OmpTerminalPanel-Cw_Vw9oO.mjs.map → OmpTerminalPanel-Cu_s4i0A.mjs.map} +1 -1
  76. package/.output/server/chunks/build/{alert-qJnjyRcP.mjs → PluginSlot-CcR4Ys3T.mjs} +140 -4
  77. package/.output/server/chunks/build/PluginSlot-CcR4Ys3T.mjs.map +1 -0
  78. package/.output/server/chunks/build/{TownView-ftIylqiD.mjs → TownView-BdHnAilw.mjs} +5 -5
  79. package/.output/server/chunks/build/{TownView-ftIylqiD.mjs.map → TownView-BdHnAilw.mjs.map} +1 -1
  80. package/.output/server/chunks/build/{_id_-CahfkmEt.mjs → _id_-Cb845FHR.mjs} +7 -5
  81. package/.output/server/chunks/build/_id_-Cb845FHR.mjs.map +1 -0
  82. package/.output/server/chunks/build/{_id_-3Axz2-gV.mjs → _id_-fadFPl2i.mjs} +50 -35
  83. package/.output/server/chunks/build/_id_-fadFPl2i.mjs.map +1 -0
  84. package/.output/server/chunks/build/{_wsId_-BymlQhzS.mjs → _wsId_-CTZswnm5.mjs} +181 -22
  85. package/.output/server/chunks/build/{_wsId_-BymlQhzS.mjs.map → _wsId_-CTZswnm5.mjs.map} +1 -1
  86. package/.output/server/chunks/build/{agents-DuMiSWKp.mjs → agents-Bvin73QY.mjs} +82 -32
  87. package/.output/server/chunks/build/agents-Bvin73QY.mjs.map +1 -0
  88. package/.output/server/chunks/build/aml-uBNIppIf.mjs +508 -0
  89. package/.output/server/chunks/build/aml-uBNIppIf.mjs.map +1 -0
  90. package/.output/server/chunks/build/apiClient-BwnfOQU8.mjs +81 -0
  91. package/.output/server/chunks/build/apiClient-BwnfOQU8.mjs.map +1 -0
  92. package/.output/server/chunks/build/{channel-templates-BStqJ-of.mjs → channel-templates-BTq8570n.mjs} +6 -5
  93. package/.output/server/chunks/build/channel-templates-BTq8570n.mjs.map +1 -0
  94. package/.output/server/chunks/build/{checkbox-C1gABOca.mjs → checkbox-8fB-wI-T.mjs} +2 -2
  95. package/.output/server/chunks/build/{checkbox-C1gABOca.mjs.map → checkbox-8fB-wI-T.mjs.map} +1 -1
  96. package/.output/server/chunks/build/{daq-ChYCABz1.mjs → daq-BvihjQyW.mjs} +111 -109
  97. package/.output/server/chunks/build/daq-BvihjQyW.mjs.map +1 -0
  98. package/.output/server/chunks/build/{dcw-CcQNGggh.mjs → dcw-Ks2vJ4PF.mjs} +5 -3
  99. package/.output/server/chunks/build/dcw-Ks2vJ4PF.mjs.map +1 -0
  100. package/.output/server/chunks/build/{default-95-zOTPt.mjs → default-GgHt4O2R.mjs} +164 -101
  101. package/.output/server/chunks/build/{default-95-zOTPt.mjs.map → default-GgHt4O2R.mjs.map} +1 -1
  102. package/.output/server/chunks/build/{input-number-Bd55elNN.mjs → input-number-DzpyYB99.mjs} +2 -2
  103. package/.output/server/chunks/build/{input-number-Bd55elNN.mjs.map → input-number-DzpyYB99.mjs.map} +1 -1
  104. package/.output/server/chunks/build/{logs-D-2UyGtE.mjs → logs-CYBhkQwh.mjs} +5 -3
  105. package/.output/server/chunks/build/logs-CYBhkQwh.mjs.map +1 -0
  106. package/.output/server/chunks/build/{monitor-mfG5jBtz.mjs → monitor-CyfDt4nR.mjs} +7 -6
  107. package/.output/server/chunks/build/{monitor-mfG5jBtz.mjs.map → monitor-CyfDt4nR.mjs.map} +1 -1
  108. package/.output/server/chunks/build/{pages-Dfosfchr.mjs → pages-C-6BRtv8.mjs} +57 -47
  109. package/.output/server/chunks/build/pages-C-6BRtv8.mjs.map +1 -0
  110. package/.output/server/chunks/build/{permissions-B-hhZuzm.mjs → permissions-B52oOmaO.mjs} +6 -5
  111. package/.output/server/chunks/build/permissions-B52oOmaO.mjs.map +1 -0
  112. package/.output/server/chunks/build/{plugins-DZR0T4Mh.mjs → plugins-dZRegC7m.mjs} +22 -18
  113. package/.output/server/chunks/build/plugins-dZRegC7m.mjs.map +1 -0
  114. package/.output/server/chunks/build/{segmented-LPPREMtZ.mjs → segmented-3TrWo0lS.mjs} +3 -3
  115. package/.output/server/chunks/build/{segmented-LPPREMtZ.mjs.map → segmented-3TrWo0lS.mjs.map} +1 -1
  116. package/.output/server/chunks/build/{settings-BajN9TQW.mjs → settings-CgDLkP3s.mjs} +437 -62
  117. package/.output/server/chunks/build/settings-CgDLkP3s.mjs.map +1 -0
  118. package/.output/server/chunks/build/{table-Bf1r2JjE.mjs → table-BjSWwmic.mjs} +4 -4
  119. package/.output/server/chunks/build/{table-Bf1r2JjE.mjs.map → table-BjSWwmic.mjs.map} +1 -1
  120. package/.output/server/chunks/build/{tag-NO9jEqKy.mjs → tag-DNE9vXc0.mjs} +3 -131
  121. package/.output/server/chunks/build/tag-DNE9vXc0.mjs.map +1 -0
  122. package/.output/server/chunks/build/{teams-t2SkRlJP.mjs → teams-2kz3CusY.mjs} +31 -30
  123. package/.output/server/chunks/build/teams-2kz3CusY.mjs.map +1 -0
  124. package/.output/server/chunks/build/{tokens-DiCojbN8.mjs → tokens-BbWLqtVz.mjs} +6 -5
  125. package/.output/server/chunks/build/tokens-BbWLqtVz.mjs.map +1 -0
  126. package/.output/server/chunks/build/town-BUqRobze.mjs +1 -0
  127. package/.output/server/chunks/build/town-BUqRobze.mjs.map +1 -1
  128. package/.output/server/chunks/build/{town-C7QM8DYK.mjs → town-DJ-V5G9U.mjs} +7 -5
  129. package/.output/server/chunks/build/town-DJ-V5G9U.mjs.map +1 -0
  130. package/.output/server/chunks/build/{useDaqStream-BeA2X8KR.mjs → useDaqStream-CIBaiGAl.mjs} +4 -3
  131. package/.output/server/chunks/build/useDaqStream-CIBaiGAl.mjs.map +1 -0
  132. package/.output/server/chunks/build/{useDcwStream-BJW_MitY.mjs → useDcwStream-CBbiYnWe.mjs} +4 -80
  133. package/.output/server/chunks/build/useDcwStream-CBbiYnWe.mjs.map +1 -0
  134. package/.output/server/chunks/build/{useDeviceTwins-Dwz_EY_i.mjs → useDeviceTwins-Yko6nNPF.mjs} +2 -2
  135. package/.output/server/chunks/build/{useDeviceTwins-Dwz_EY_i.mjs.map → useDeviceTwins-Yko6nNPF.mjs.map} +1 -1
  136. package/.output/server/chunks/build/{useOpsLog-Dm8QEb1I.mjs → useOpsLog-CO_VWh7t.mjs} +2 -2
  137. package/.output/server/chunks/build/{useOpsLog-Dm8QEb1I.mjs.map → useOpsLog-CO_VWh7t.mjs.map} +1 -1
  138. package/.output/server/chunks/build/{useWorkshopApi-B-L3MmIX.mjs → useWorkshopApi-NyjL0L3j.mjs} +4 -2
  139. package/.output/server/chunks/build/{useWorkshopApi-B-L3MmIX.mjs.map → useWorkshopApi-NyjL0L3j.mjs.map} +1 -1
  140. package/.output/server/chunks/build/{users-B9SAdEtH.mjs → users-4nzxTjFT.mjs} +6 -5
  141. package/.output/server/chunks/build/users-4nzxTjFT.mjs.map +1 -0
  142. package/.output/server/chunks/build/workshop-81xhz368.mjs +1 -0
  143. package/.output/server/chunks/build/workshop-81xhz368.mjs.map +1 -1
  144. package/.output/server/chunks/routes/api/health.get.mjs +1 -0
  145. package/.output/server/chunks/routes/api/health.get.mjs.map +1 -1
  146. package/.output/server/chunks/routes/api/index.get.mjs +1 -1
  147. package/.output/server/chunks/routes/api/index.post.mjs +1 -1
  148. package/.output/server/chunks/routes/api/metrics.mjs +1 -0
  149. package/.output/server/chunks/routes/api/metrics.mjs.map +1 -1
  150. package/.output/server/chunks/routes/api/plugins/_name/_...path_.mjs +1 -0
  151. package/.output/server/chunks/routes/api/plugins/_name/_...path_.mjs.map +1 -1
  152. package/.output/server/chunks/routes/api/plugins/client/_name_.get.mjs +1 -0
  153. package/.output/server/chunks/routes/api/plugins/client/_name_.get.mjs.map +1 -1
  154. package/.output/server/chunks/routes/api/plugins/i18n.get.mjs +26 -0
  155. package/.output/server/chunks/routes/api/plugins/i18n.get.mjs.map +1 -0
  156. package/.output/server/chunks/routes/api/plugins/manifest.get.mjs +2 -1
  157. package/.output/server/chunks/routes/api/plugins/manifest.get.mjs.map +1 -1
  158. package/.output/server/chunks/routes/api/system/config-groups/_id_.delete.mjs +32 -0
  159. package/.output/server/chunks/routes/api/system/config-groups/_id_.delete.mjs.map +1 -0
  160. package/.output/server/chunks/routes/api/system/config-groups/_id_.patch.mjs +36 -0
  161. package/.output/server/chunks/routes/api/system/config-groups/_id_.patch.mjs.map +1 -0
  162. package/.output/server/chunks/routes/api/system/config.get.mjs +1 -0
  163. package/.output/server/chunks/routes/api/system/config.get.mjs.map +1 -1
  164. package/.output/server/chunks/routes/api/system/index.get.mjs +7 -2
  165. package/.output/server/chunks/routes/api/system/index.get.mjs.map +1 -1
  166. package/.output/server/chunks/routes/api/system/index.patch.mjs +2 -1
  167. package/.output/server/chunks/routes/api/system/index.patch.mjs.map +1 -1
  168. package/.output/server/chunks/routes/api/system/index.post.mjs +36 -0
  169. package/.output/server/chunks/routes/api/system/index.post.mjs.map +1 -0
  170. package/.output/server/chunks/routes/api/system/index2.get.mjs +28 -0
  171. package/.output/server/chunks/routes/api/system/index2.get.mjs.map +1 -0
  172. package/.output/server/chunks/routes/api/system/monitor/terminal/ws.mjs +2 -1
  173. package/.output/server/chunks/routes/api/system/monitor/terminal/ws.mjs.map +1 -1
  174. package/.output/server/chunks/routes/api/system/monitor/terminate.post.mjs +2 -1
  175. package/.output/server/chunks/routes/api/system/monitor/terminate.post.mjs.map +1 -1
  176. package/.output/server/chunks/routes/api/system/monitor.get.mjs +1 -0
  177. package/.output/server/chunks/routes/api/system/monitor.get.mjs.map +1 -1
  178. package/.output/server/chunks/routes/api/system/settings/events.get.mjs +8 -5
  179. package/.output/server/chunks/routes/api/system/settings/events.get.mjs.map +1 -1
  180. package/.output/server/chunks/routes/api/system/settings/reset.post.mjs +2 -1
  181. package/.output/server/chunks/routes/api/system/settings/reset.post.mjs.map +1 -1
  182. package/.output/server/chunks/routes/api/users/_id_.delete.mjs +2 -1
  183. package/.output/server/chunks/routes/api/users/_id_.delete.mjs.map +1 -1
  184. package/.output/server/chunks/routes/api/users/_id_.get.mjs +2 -1
  185. package/.output/server/chunks/routes/api/users/_id_.get.mjs.map +1 -1
  186. package/.output/server/chunks/routes/api/users/_id_.put.mjs +1 -1
  187. package/.output/server/chunks/routes/api/users/index.get.mjs +2 -1
  188. package/.output/server/chunks/routes/api/users/index.get.mjs.map +1 -1
  189. package/.output/server/chunks/routes/api/users/index.post.mjs +1 -1
  190. package/.output/server/chunks/routes/api/users/login.post.mjs +1 -1
  191. package/.output/server/chunks/routes/api/users/logout.post.mjs +2 -1
  192. package/.output/server/chunks/routes/api/users/logout.post.mjs.map +1 -1
  193. package/.output/server/chunks/routes/api/users/me.get.mjs +2 -1
  194. package/.output/server/chunks/routes/api/users/me.get.mjs.map +1 -1
  195. package/.output/server/chunks/routes/api/users/register.post.mjs +1 -1
  196. package/.output/server/chunks/routes/api/users/setup-status.get.mjs +2 -1
  197. package/.output/server/chunks/routes/api/users/setup-status.get.mjs.map +1 -1
  198. package/.output/server/chunks/routes/api/users/tokens/_id/token.get.mjs +2 -1
  199. package/.output/server/chunks/routes/api/users/tokens/_id/token.get.mjs.map +1 -1
  200. package/.output/server/chunks/routes/api/users/tokens/_id_.delete.mjs +2 -1
  201. package/.output/server/chunks/routes/api/users/tokens/_id_.delete.mjs.map +1 -1
  202. package/.output/server/chunks/routes/api/users/tokens/_id_.patch.mjs +1 -1
  203. package/.output/server/chunks/routes/api/workshop/_...path_.mjs +2 -1
  204. package/.output/server/chunks/routes/api/workshop/_...path_.mjs.map +1 -1
  205. package/.output/server/chunks/routes/api/workshop/a2a/_agentId/index.get.mjs +2 -1
  206. package/.output/server/chunks/routes/api/workshop/a2a/_agentId/index.get.mjs.map +1 -1
  207. package/.output/server/chunks/routes/api/workshop/a2a/_agentId/index.post.mjs +1 -1
  208. package/.output/server/chunks/routes/api/workshop/a2a/send.post.mjs +1 -1
  209. package/.output/server/chunks/routes/api/workshop/agent-tools/approvals/_id/decide.post.mjs +2 -1
  210. package/.output/server/chunks/routes/api/workshop/agent-tools/approvals/_id/decide.post.mjs.map +1 -1
  211. package/.output/server/chunks/routes/api/workshop/agent-tools/bindings/_id_.delete.mjs +5 -2
  212. package/.output/server/chunks/routes/api/workshop/agent-tools/bindings/_id_.delete.mjs.map +1 -1
  213. package/.output/server/chunks/routes/api/workshop/agent-tools/bindings/_id_.patch.mjs +9 -3
  214. package/.output/server/chunks/routes/api/workshop/agent-tools/bindings/_id_.patch.mjs.map +1 -1
  215. package/.output/server/chunks/routes/api/workshop/agent-tools/index.get.mjs +2 -1
  216. package/.output/server/chunks/routes/api/workshop/agent-tools/index.get.mjs.map +1 -1
  217. package/.output/server/chunks/routes/api/workshop/agent-tools/index.post.mjs +2 -1
  218. package/.output/server/chunks/routes/api/workshop/agent-tools/index.post.mjs.map +1 -1
  219. package/.output/server/chunks/routes/api/workshop/agent-tools/index2.get.mjs +23 -3
  220. package/.output/server/chunks/routes/api/workshop/agent-tools/index2.get.mjs.map +1 -1
  221. package/.output/server/chunks/routes/api/workshop/agent-tools/invoke.post.mjs +21 -3
  222. package/.output/server/chunks/routes/api/workshop/agent-tools/invoke.post.mjs.map +1 -1
  223. package/.output/server/chunks/routes/api/workshop/agent-tools/list.get.mjs +2 -1
  224. package/.output/server/chunks/routes/api/workshop/agent-tools/list.get.mjs.map +1 -1
  225. package/.output/server/chunks/routes/api/workshop/agents/_id_.delete.mjs +2 -1
  226. package/.output/server/chunks/routes/api/workshop/agents/_id_.delete.mjs.map +1 -1
  227. package/.output/server/chunks/routes/api/workshop/agents/_id_.get.mjs +2 -1
  228. package/.output/server/chunks/routes/api/workshop/agents/_id_.get.mjs.map +1 -1
  229. package/.output/server/chunks/routes/api/workshop/agents/_id_.patch.mjs +1 -1
  230. package/.output/server/chunks/routes/api/workshop/agents/subscribe.post.mjs +1 -1
  231. package/.output/server/chunks/routes/api/workshop/aml/datasets/_id/preview.get.mjs +75 -0
  232. package/.output/server/chunks/routes/api/workshop/aml/datasets/_id/preview.get.mjs.map +1 -0
  233. package/.output/server/chunks/routes/api/workshop/aml/datasets/_id_.get.mjs +35 -0
  234. package/.output/server/chunks/routes/api/workshop/aml/datasets/_id_.get.mjs.map +1 -0
  235. package/.output/server/chunks/routes/api/workshop/aml/index.get.mjs +35 -0
  236. package/.output/server/chunks/routes/api/workshop/aml/index.get.mjs.map +1 -0
  237. package/.output/server/chunks/routes/api/workshop/aml/index.post.mjs +46 -0
  238. package/.output/server/chunks/routes/api/workshop/aml/index.post.mjs.map +1 -0
  239. package/.output/server/chunks/routes/api/workshop/aml/index2.get.mjs +47 -0
  240. package/.output/server/chunks/routes/api/workshop/aml/index2.get.mjs.map +1 -0
  241. package/.output/server/chunks/routes/api/workshop/aml/index2.post.mjs +48 -0
  242. package/.output/server/chunks/routes/api/workshop/aml/index2.post.mjs.map +1 -0
  243. package/.output/server/chunks/routes/api/workshop/aml/index3.get.mjs +41 -0
  244. package/.output/server/chunks/routes/api/workshop/aml/index3.get.mjs.map +1 -0
  245. package/.output/server/chunks/routes/api/workshop/aml/index4.get.mjs +62 -0
  246. package/.output/server/chunks/routes/api/workshop/aml/index4.get.mjs.map +1 -0
  247. package/.output/server/chunks/routes/api/workshop/aml/jobs/_id/cancel.post.mjs +35 -0
  248. package/.output/server/chunks/routes/api/workshop/aml/jobs/_id/cancel.post.mjs.map +1 -0
  249. package/.output/server/chunks/routes/api/workshop/aml/jobs/_id/logs.get.mjs +36 -0
  250. package/.output/server/chunks/routes/api/workshop/aml/jobs/_id/logs.get.mjs.map +1 -0
  251. package/.output/server/chunks/routes/api/workshop/aml/jobs/_id/retry.post.mjs +34 -0
  252. package/.output/server/chunks/routes/api/workshop/aml/jobs/_id/retry.post.mjs.map +1 -0
  253. package/.output/server/chunks/routes/api/workshop/aml/jobs/_id_.get.mjs +38 -0
  254. package/.output/server/chunks/routes/api/workshop/aml/jobs/_id_.get.mjs.map +1 -0
  255. package/.output/server/chunks/routes/api/workshop/aml/models/_id/predict.post.mjs +37 -0
  256. package/.output/server/chunks/routes/api/workshop/aml/models/_id/predict.post.mjs.map +1 -0
  257. package/.output/server/chunks/routes/api/workshop/aml/models/_id/promote.post.mjs +42 -0
  258. package/.output/server/chunks/routes/api/workshop/aml/models/_id/promote.post.mjs.map +1 -0
  259. package/.output/server/chunks/routes/api/workshop/approvals/_id/decide.post.mjs +2 -1
  260. package/.output/server/chunks/routes/api/workshop/approvals/_id/decide.post.mjs.map +1 -1
  261. package/.output/server/chunks/routes/api/workshop/assets/character/_id_.delete.mjs +2 -1
  262. package/.output/server/chunks/routes/api/workshop/assets/character/_id_.delete.mjs.map +1 -1
  263. package/.output/server/chunks/routes/api/workshop/assets/devices/_id_.delete.mjs +2 -1
  264. package/.output/server/chunks/routes/api/workshop/assets/devices/_id_.delete.mjs.map +1 -1
  265. package/.output/server/chunks/routes/api/workshop/assets/index.get.mjs +2 -1
  266. package/.output/server/chunks/routes/api/workshop/assets/index.get.mjs.map +1 -1
  267. package/.output/server/chunks/routes/api/workshop/assets/index.post.mjs +2 -1
  268. package/.output/server/chunks/routes/api/workshop/assets/index.post.mjs.map +1 -1
  269. package/.output/server/chunks/routes/api/workshop/assets/index2.get.mjs +1 -0
  270. package/.output/server/chunks/routes/api/workshop/assets/index2.get.mjs.map +1 -1
  271. package/.output/server/chunks/routes/api/workshop/assets/index2.post.mjs +2 -1
  272. package/.output/server/chunks/routes/api/workshop/assets/index2.post.mjs.map +1 -1
  273. package/.output/server/chunks/routes/api/workshop/audit.get.mjs +2 -1
  274. package/.output/server/chunks/routes/api/workshop/audit.get.mjs.map +1 -1
  275. package/.output/server/chunks/routes/api/workshop/caller.mjs +2 -1
  276. package/.output/server/chunks/routes/api/workshop/caller.mjs.map +1 -1
  277. package/.output/server/chunks/routes/api/workshop/channel-templates/_id/instantiate.post.mjs +2 -2
  278. package/.output/server/chunks/routes/api/workshop/channel-templates/_id_.delete.mjs +2 -1
  279. package/.output/server/chunks/routes/api/workshop/channel-templates/_id_.delete.mjs.map +1 -1
  280. package/.output/server/chunks/routes/api/workshop/channel-templates/_id_.get.mjs +2 -1
  281. package/.output/server/chunks/routes/api/workshop/channel-templates/_id_.get.mjs.map +1 -1
  282. package/.output/server/chunks/routes/api/workshop/channel-templates/_id_.patch.mjs +1 -1
  283. package/.output/server/chunks/routes/api/workshop/channel-templates/from-channel.post.mjs +1 -1
  284. package/.output/server/chunks/routes/api/workshop/channels/_id/activate.post.mjs +2 -1
  285. package/.output/server/chunks/routes/api/workshop/channels/_id/activate.post.mjs.map +1 -1
  286. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/index.get.mjs +2 -1
  287. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/index.get.mjs.map +1 -1
  288. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/index.post.mjs +1 -1
  289. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/memories/_memoryId_.delete.mjs +2 -1
  290. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/memories/_memoryId_.delete.mjs.map +1 -1
  291. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/memories/search.post.mjs +1 -1
  292. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/model.patch.mjs +2 -1
  293. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/model.patch.mjs.map +1 -1
  294. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/position.patch.mjs +2 -1
  295. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/position.patch.mjs.map +1 -1
  296. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/range.patch.mjs +2 -1
  297. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/range.patch.mjs.map +1 -1
  298. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/stop.post.mjs +2 -1
  299. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/stop.post.mjs.map +1 -1
  300. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId_.delete.mjs +2 -1
  301. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId_.delete.mjs.map +1 -1
  302. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId_.patch.mjs +2 -1
  303. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId_.patch.mjs.map +1 -1
  304. package/.output/server/chunks/routes/api/workshop/channels/_id/events.get.mjs +1 -1
  305. package/.output/server/chunks/routes/api/workshop/channels/_id/index.get.mjs +2 -1
  306. package/.output/server/chunks/routes/api/workshop/channels/_id/index.get.mjs.map +1 -1
  307. package/.output/server/chunks/routes/api/workshop/channels/_id/index.post.mjs +1 -1
  308. package/.output/server/chunks/routes/api/workshop/channels/_id/index.put.mjs +2 -1
  309. package/.output/server/chunks/routes/api/workshop/channels/_id/index.put.mjs.map +1 -1
  310. package/.output/server/chunks/routes/api/workshop/channels/_id/index2.get.mjs +2 -1
  311. package/.output/server/chunks/routes/api/workshop/channels/_id/index2.get.mjs.map +1 -1
  312. package/.output/server/chunks/routes/api/workshop/channels/_id/index2.post.mjs +1 -1
  313. package/.output/server/chunks/routes/api/workshop/channels/_id/index3.get.mjs +1 -1
  314. package/.output/server/chunks/routes/api/workshop/channels/_id/index3.post.mjs +1 -1
  315. package/.output/server/chunks/routes/api/workshop/channels/_id/index4.get.mjs +2 -1
  316. package/.output/server/chunks/routes/api/workshop/channels/_id/index4.get.mjs.map +1 -1
  317. package/.output/server/chunks/routes/api/workshop/channels/_id/index4.post.mjs +1 -1
  318. package/.output/server/chunks/routes/api/workshop/channels/_id/index5.get.mjs +1 -0
  319. package/.output/server/chunks/routes/api/workshop/channels/_id/index5.get.mjs.map +1 -1
  320. package/.output/server/chunks/routes/api/workshop/channels/_id/memories/_memoryId_.delete.mjs +2 -1
  321. package/.output/server/chunks/routes/api/workshop/channels/_id/memories/_memoryId_.delete.mjs.map +1 -1
  322. package/.output/server/chunks/routes/api/workshop/channels/_id/queue.get.mjs +2 -1
  323. package/.output/server/chunks/routes/api/workshop/channels/_id/queue.get.mjs.map +1 -1
  324. package/.output/server/chunks/routes/api/workshop/channels/_id/terminals.get.mjs +2 -1
  325. package/.output/server/chunks/routes/api/workshop/channels/_id/terminals.get.mjs.map +1 -1
  326. package/.output/server/chunks/routes/api/workshop/channels/_id_.delete.mjs +1 -0
  327. package/.output/server/chunks/routes/api/workshop/channels/_id_.delete.mjs.map +1 -1
  328. package/.output/server/chunks/routes/api/workshop/channels/index.get.mjs +2 -1
  329. package/.output/server/chunks/routes/api/workshop/channels/index.get.mjs.map +1 -1
  330. package/.output/server/chunks/routes/api/workshop/channels/index.patch.mjs +1 -1
  331. package/.output/server/chunks/routes/api/workshop/channels.get.mjs +1 -0
  332. package/.output/server/chunks/routes/api/workshop/channels.get.mjs.map +1 -1
  333. package/.output/server/chunks/routes/api/workshop/channels.post.mjs +4 -4
  334. package/.output/server/chunks/routes/api/workshop/daq/_id/bind.post.mjs +2 -1
  335. package/.output/server/chunks/routes/api/workshop/daq/_id/bind.post.mjs.map +1 -1
  336. package/.output/server/chunks/routes/api/workshop/daq/_id/bindings.put.mjs +2 -1
  337. package/.output/server/chunks/routes/api/workshop/daq/_id/bindings.put.mjs.map +1 -1
  338. package/.output/server/chunks/routes/api/workshop/daq/_id/frames/content.get.mjs +2 -1
  339. package/.output/server/chunks/routes/api/workshop/daq/_id/frames/content.get.mjs.map +1 -1
  340. package/.output/server/chunks/routes/api/workshop/daq/_id/frames.get.mjs +2 -1
  341. package/.output/server/chunks/routes/api/workshop/daq/_id/frames.get.mjs.map +1 -1
  342. package/.output/server/chunks/routes/api/workshop/daq/_id/samples.get.mjs +2 -1
  343. package/.output/server/chunks/routes/api/workshop/daq/_id/samples.get.mjs.map +1 -1
  344. package/.output/server/chunks/routes/api/workshop/daq/_id/test.post.mjs +2 -1
  345. package/.output/server/chunks/routes/api/workshop/daq/_id/test.post.mjs.map +1 -1
  346. package/.output/server/chunks/routes/api/workshop/daq/_id_.delete.mjs +3 -1
  347. package/.output/server/chunks/routes/api/workshop/daq/_id_.delete.mjs.map +1 -1
  348. package/.output/server/chunks/routes/api/workshop/daq/_id_.patch.mjs +2 -1
  349. package/.output/server/chunks/routes/api/workshop/daq/_id_.patch.mjs.map +1 -1
  350. package/.output/server/chunks/routes/api/workshop/daq/alarms/_id/ack.post.mjs +2 -1
  351. package/.output/server/chunks/routes/api/workshop/daq/alarms/_id/ack.post.mjs.map +1 -1
  352. package/.output/server/chunks/routes/api/workshop/daq/alarms.get.mjs +2 -1
  353. package/.output/server/chunks/routes/api/workshop/daq/alarms.get.mjs.map +1 -1
  354. package/.output/server/chunks/routes/api/workshop/daq/controller.post.mjs +2 -1
  355. package/.output/server/chunks/routes/api/workshop/daq/controller.post.mjs.map +1 -1
  356. package/.output/server/chunks/routes/api/workshop/daq/index.post.mjs +2 -1
  357. package/.output/server/chunks/routes/api/workshop/daq/index.post.mjs.map +1 -1
  358. package/.output/server/chunks/routes/api/workshop/daq/infra/reconnect.post.mjs +2 -1
  359. package/.output/server/chunks/routes/api/workshop/daq/infra/reconnect.post.mjs.map +1 -1
  360. package/.output/server/chunks/routes/api/workshop/daq/infra.get.mjs +2 -1
  361. package/.output/server/chunks/routes/api/workshop/daq/infra.get.mjs.map +1 -1
  362. package/.output/server/chunks/routes/api/workshop/daq/templates/_key_.delete.mjs +2 -1
  363. package/.output/server/chunks/routes/api/workshop/daq/templates/_key_.delete.mjs.map +1 -1
  364. package/.output/server/chunks/routes/api/workshop/daq/templates/_key_.patch.mjs +2 -1
  365. package/.output/server/chunks/routes/api/workshop/daq/templates/_key_.patch.mjs.map +1 -1
  366. package/.output/server/chunks/routes/api/workshop/daq/test-driver.post.mjs +2 -1
  367. package/.output/server/chunks/routes/api/workshop/daq/test-driver.post.mjs.map +1 -1
  368. package/.output/server/chunks/routes/api/workshop/dcw/_id/bind.post.mjs +2 -1
  369. package/.output/server/chunks/routes/api/workshop/dcw/_id/bind.post.mjs.map +1 -1
  370. package/.output/server/chunks/routes/api/workshop/dcw/_id/bindings.put.mjs +2 -1
  371. package/.output/server/chunks/routes/api/workshop/dcw/_id/bindings.put.mjs.map +1 -1
  372. package/.output/server/chunks/routes/api/workshop/dcw/_id/param-ledger.get.mjs +2 -1
  373. package/.output/server/chunks/routes/api/workshop/dcw/_id/param-ledger.get.mjs.map +1 -1
  374. package/.output/server/chunks/routes/api/workshop/dcw/_id/read.post.mjs +2 -1
  375. package/.output/server/chunks/routes/api/workshop/dcw/_id/read.post.mjs.map +1 -1
  376. package/.output/server/chunks/routes/api/workshop/dcw/_id/test.post.mjs +2 -1
  377. package/.output/server/chunks/routes/api/workshop/dcw/_id/test.post.mjs.map +1 -1
  378. package/.output/server/chunks/routes/api/workshop/dcw/_id/write.post.mjs +2 -1
  379. package/.output/server/chunks/routes/api/workshop/dcw/_id/write.post.mjs.map +1 -1
  380. package/.output/server/chunks/routes/api/workshop/dcw/_id_.delete.mjs +2 -1
  381. package/.output/server/chunks/routes/api/workshop/dcw/_id_.delete.mjs.map +1 -1
  382. package/.output/server/chunks/routes/api/workshop/dcw/_id_.patch.mjs +7 -2
  383. package/.output/server/chunks/routes/api/workshop/dcw/_id_.patch.mjs.map +1 -1
  384. package/.output/server/chunks/routes/api/workshop/dcw/controller.post.mjs +2 -1
  385. package/.output/server/chunks/routes/api/workshop/dcw/controller.post.mjs.map +1 -1
  386. package/.output/server/chunks/routes/api/workshop/dcw/index.get.mjs +2 -1
  387. package/.output/server/chunks/routes/api/workshop/dcw/index.get.mjs.map +1 -1
  388. package/.output/server/chunks/routes/api/workshop/dcw/index.post.mjs +2 -1
  389. package/.output/server/chunks/routes/api/workshop/dcw/index.post.mjs.map +1 -1
  390. package/.output/server/chunks/routes/api/workshop/dcw/index2.get.mjs +2 -1
  391. package/.output/server/chunks/routes/api/workshop/dcw/index2.get.mjs.map +1 -1
  392. package/.output/server/chunks/routes/api/workshop/dcw/index2.post.mjs +2 -1
  393. package/.output/server/chunks/routes/api/workshop/dcw/index2.post.mjs.map +1 -1
  394. package/.output/server/chunks/routes/api/workshop/dcw/index3.get.mjs +2 -1
  395. package/.output/server/chunks/routes/api/workshop/dcw/index3.get.mjs.map +1 -1
  396. package/.output/server/chunks/routes/api/workshop/dcw/index3.post.mjs +2 -1
  397. package/.output/server/chunks/routes/api/workshop/dcw/index3.post.mjs.map +1 -1
  398. package/.output/server/chunks/routes/api/workshop/dcw/index4.get.mjs +2 -1
  399. package/.output/server/chunks/routes/api/workshop/dcw/index4.get.mjs.map +1 -1
  400. package/.output/server/chunks/routes/api/workshop/dcw/index4.post.mjs +2 -1
  401. package/.output/server/chunks/routes/api/workshop/dcw/index4.post.mjs.map +1 -1
  402. package/.output/server/chunks/routes/api/workshop/dcw/index5.get.mjs +2 -1
  403. package/.output/server/chunks/routes/api/workshop/dcw/index5.get.mjs.map +1 -1
  404. package/.output/server/chunks/routes/api/workshop/dcw/journal/node/_nodeId/rollback.post.mjs +2 -1
  405. package/.output/server/chunks/routes/api/workshop/dcw/journal/node/_nodeId/rollback.post.mjs.map +1 -1
  406. package/.output/server/chunks/routes/api/workshop/dcw/line/query.get.mjs +2 -1
  407. package/.output/server/chunks/routes/api/workshop/dcw/line/query.get.mjs.map +1 -1
  408. package/.output/server/chunks/routes/api/workshop/dcw/lines/_id/start.post.mjs +2 -1
  409. package/.output/server/chunks/routes/api/workshop/dcw/lines/_id/start.post.mjs.map +1 -1
  410. package/.output/server/chunks/routes/api/workshop/dcw/lines/_id/stop.post.mjs +2 -1
  411. package/.output/server/chunks/routes/api/workshop/dcw/lines/_id/stop.post.mjs.map +1 -1
  412. package/.output/server/chunks/routes/api/workshop/dcw/lines/_id_.delete.mjs +2 -1
  413. package/.output/server/chunks/routes/api/workshop/dcw/lines/_id_.delete.mjs.map +1 -1
  414. package/.output/server/chunks/routes/api/workshop/dcw/lines/_id_.patch.mjs +2 -1
  415. package/.output/server/chunks/routes/api/workshop/dcw/lines/_id_.patch.mjs.map +1 -1
  416. package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id/judge.post.mjs +2 -1
  417. package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id/judge.post.mjs.map +1 -1
  418. package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id/rollback.post.mjs +2 -1
  419. package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id/rollback.post.mjs.map +1 -1
  420. package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id/series.get.mjs +2 -1
  421. package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id/series.get.mjs.map +1 -1
  422. package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id_.get.mjs +2 -1
  423. package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id_.get.mjs.map +1 -1
  424. package/.output/server/chunks/routes/api/workshop/dcw/products/_id_.delete.mjs +2 -1
  425. package/.output/server/chunks/routes/api/workshop/dcw/products/_id_.delete.mjs.map +1 -1
  426. package/.output/server/chunks/routes/api/workshop/dcw/products/_id_.patch.mjs +2 -1
  427. package/.output/server/chunks/routes/api/workshop/dcw/products/_id_.patch.mjs.map +1 -1
  428. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/apply.post.mjs +2 -1
  429. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/apply.post.mjs.map +1 -1
  430. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/mark-good.post.mjs +2 -1
  431. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/mark-good.post.mjs.map +1 -1
  432. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/revert.post.mjs +2 -1
  433. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/revert.post.mjs.map +1 -1
  434. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/rollback-good.post.mjs +2 -1
  435. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/rollback-good.post.mjs.map +1 -1
  436. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/versions.get.mjs +2 -1
  437. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/versions.get.mjs.map +1 -1
  438. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id_.delete.mjs +2 -1
  439. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id_.delete.mjs.map +1 -1
  440. package/.output/server/chunks/routes/api/workshop/dcw/recipes/index.patch.mjs +2 -1
  441. package/.output/server/chunks/routes/api/workshop/dcw/recipes/index.patch.mjs.map +1 -1
  442. package/.output/server/chunks/routes/api/workshop/dcw/runs/_id/close.post.mjs +2 -1
  443. package/.output/server/chunks/routes/api/workshop/dcw/runs/_id/close.post.mjs.map +1 -1
  444. package/.output/server/chunks/routes/api/workshop/dcw/runs/_id/data.get.mjs +2 -1
  445. package/.output/server/chunks/routes/api/workshop/dcw/runs/_id/data.get.mjs.map +1 -1
  446. package/.output/server/chunks/routes/api/workshop/dcw/runs/_id/rollback.post.mjs +2 -1
  447. package/.output/server/chunks/routes/api/workshop/dcw/runs/_id/rollback.post.mjs.map +1 -1
  448. package/.output/server/chunks/routes/api/workshop/dcw/templates/_key_.delete.mjs +2 -1
  449. package/.output/server/chunks/routes/api/workshop/dcw/templates/_key_.delete.mjs.map +1 -1
  450. package/.output/server/chunks/routes/api/workshop/dcw/templates/_key_.patch.mjs +2 -1
  451. package/.output/server/chunks/routes/api/workshop/dcw/templates/_key_.patch.mjs.map +1 -1
  452. package/.output/server/chunks/routes/api/workshop/dcw/test-driver.post.mjs +2 -1
  453. package/.output/server/chunks/routes/api/workshop/dcw/test-driver.post.mjs.map +1 -1
  454. package/.output/server/chunks/routes/api/workshop/device-twins/_id/control.post.mjs +2 -1
  455. package/.output/server/chunks/routes/api/workshop/device-twins/_id/control.post.mjs.map +1 -1
  456. package/.output/server/chunks/routes/api/workshop/device-twins/_id/telemetry.post.mjs +2 -1
  457. package/.output/server/chunks/routes/api/workshop/device-twins/_id/telemetry.post.mjs.map +1 -1
  458. package/.output/server/chunks/routes/api/workshop/device-twins/_id_.delete.mjs +2 -1
  459. package/.output/server/chunks/routes/api/workshop/device-twins/_id_.delete.mjs.map +1 -1
  460. package/.output/server/chunks/routes/api/workshop/device-twins/_id_.patch.mjs +2 -1
  461. package/.output/server/chunks/routes/api/workshop/device-twins/_id_.patch.mjs.map +1 -1
  462. package/.output/server/chunks/routes/api/workshop/fs/dirs.get.mjs +2 -1
  463. package/.output/server/chunks/routes/api/workshop/fs/dirs.get.mjs.map +1 -1
  464. package/.output/server/chunks/routes/api/workshop/harnesses/_id/providers.get.mjs +32 -1
  465. package/.output/server/chunks/routes/api/workshop/harnesses/_id/providers.get.mjs.map +1 -1
  466. package/.output/server/chunks/routes/api/workshop/harnesses.get.mjs +2 -1
  467. package/.output/server/chunks/routes/api/workshop/harnesses.get.mjs.map +1 -1
  468. package/.output/server/chunks/routes/api/workshop/hitl/pending.get.mjs +2 -1
  469. package/.output/server/chunks/routes/api/workshop/hitl/pending.get.mjs.map +1 -1
  470. package/.output/server/chunks/routes/api/workshop/hitl/respond.post.mjs +3 -2
  471. package/.output/server/chunks/routes/api/workshop/hitl/respond.post.mjs.map +1 -1
  472. package/.output/server/chunks/routes/api/workshop/index.get.mjs +1 -0
  473. package/.output/server/chunks/routes/api/workshop/index.get.mjs.map +1 -1
  474. package/.output/server/chunks/routes/api/workshop/index.post.mjs +1 -1
  475. package/.output/server/chunks/routes/api/workshop/index.put.mjs +2 -1
  476. package/.output/server/chunks/routes/api/workshop/index.put.mjs.map +1 -1
  477. package/.output/server/chunks/routes/api/workshop/index10.get.mjs +12 -6
  478. package/.output/server/chunks/routes/api/workshop/index10.get.mjs.map +1 -1
  479. package/.output/server/chunks/routes/api/workshop/index11.get.mjs +4 -2
  480. package/.output/server/chunks/routes/api/workshop/index11.get.mjs.map +1 -1
  481. package/.output/server/chunks/routes/api/workshop/index12.get.mjs +28 -0
  482. package/.output/server/chunks/routes/api/workshop/index12.get.mjs.map +1 -0
  483. package/.output/server/chunks/routes/api/workshop/index2.get.mjs +17 -11
  484. package/.output/server/chunks/routes/api/workshop/index2.get.mjs.map +1 -1
  485. package/.output/server/chunks/routes/api/workshop/index2.post.mjs +1 -1
  486. package/.output/server/chunks/routes/api/workshop/index3.get.mjs +11 -4
  487. package/.output/server/chunks/routes/api/workshop/index3.get.mjs.map +1 -1
  488. package/.output/server/chunks/routes/api/workshop/index3.post.mjs +2 -1
  489. package/.output/server/chunks/routes/api/workshop/index3.post.mjs.map +1 -1
  490. package/.output/server/chunks/routes/api/workshop/index4.get.mjs +5 -27
  491. package/.output/server/chunks/routes/api/workshop/index4.get.mjs.map +1 -1
  492. package/.output/server/chunks/routes/api/workshop/index4.post.mjs +2 -1
  493. package/.output/server/chunks/routes/api/workshop/index4.post.mjs.map +1 -1
  494. package/.output/server/chunks/routes/api/workshop/index5.get.mjs +24 -18
  495. package/.output/server/chunks/routes/api/workshop/index5.get.mjs.map +1 -1
  496. package/.output/server/chunks/routes/api/workshop/index5.post.mjs +2 -1
  497. package/.output/server/chunks/routes/api/workshop/index5.post.mjs.map +1 -1
  498. package/.output/server/chunks/routes/api/workshop/index6.get.mjs +23 -5
  499. package/.output/server/chunks/routes/api/workshop/index6.get.mjs.map +1 -1
  500. package/.output/server/chunks/routes/api/workshop/index6.post.mjs +2 -1
  501. package/.output/server/chunks/routes/api/workshop/index6.post.mjs.map +1 -1
  502. package/.output/server/chunks/routes/api/workshop/index7.get.mjs +4 -17
  503. package/.output/server/chunks/routes/api/workshop/index7.get.mjs.map +1 -1
  504. package/.output/server/chunks/routes/api/workshop/index7.post.mjs +8 -3
  505. package/.output/server/chunks/routes/api/workshop/index7.post.mjs.map +1 -1
  506. package/.output/server/chunks/routes/api/workshop/index8.get.mjs +20 -21
  507. package/.output/server/chunks/routes/api/workshop/index8.get.mjs.map +1 -1
  508. package/.output/server/chunks/routes/api/workshop/index8.post.mjs +1 -1
  509. package/.output/server/chunks/routes/api/workshop/index9.get.mjs +24 -11
  510. package/.output/server/chunks/routes/api/workshop/index9.get.mjs.map +1 -1
  511. package/.output/server/chunks/routes/api/workshop/mailbox/all.get.mjs +1 -0
  512. package/.output/server/chunks/routes/api/workshop/mailbox/all.get.mjs.map +1 -1
  513. package/.output/server/chunks/routes/api/workshop/mailbox.get.mjs +1 -0
  514. package/.output/server/chunks/routes/api/workshop/mailbox.get.mjs.map +1 -1
  515. package/.output/server/chunks/routes/api/workshop/memories/maintenance.post.mjs +2 -1
  516. package/.output/server/chunks/routes/api/workshop/memories/maintenance.post.mjs.map +1 -1
  517. package/.output/server/chunks/routes/api/workshop/plugins/_name/disable.post.mjs +2 -1
  518. package/.output/server/chunks/routes/api/workshop/plugins/_name/disable.post.mjs.map +1 -1
  519. package/.output/server/chunks/routes/api/workshop/plugins/_name/enable.post.mjs +2 -1
  520. package/.output/server/chunks/routes/api/workshop/plugins/_name/enable.post.mjs.map +1 -1
  521. package/.output/server/chunks/routes/api/workshop/plugins/index.get.mjs +2 -1
  522. package/.output/server/chunks/routes/api/workshop/plugins/index.get.mjs.map +1 -1
  523. package/.output/server/chunks/routes/api/workshop/runtime.get.mjs +1 -0
  524. package/.output/server/chunks/routes/api/workshop/runtime.get.mjs.map +1 -1
  525. package/.output/server/chunks/routes/api/workshop/scene/layouts/_channelId_.delete.mjs +2 -1
  526. package/.output/server/chunks/routes/api/workshop/scene/layouts/_channelId_.delete.mjs.map +1 -1
  527. package/.output/server/chunks/routes/api/workshop/scene/layouts/_channelId_.put.mjs +2 -1
  528. package/.output/server/chunks/routes/api/workshop/scene/layouts/_channelId_.put.mjs.map +1 -1
  529. package/.output/server/chunks/routes/api/workshop/scene/layouts.get.mjs +1 -0
  530. package/.output/server/chunks/routes/api/workshop/scene/layouts.get.mjs.map +1 -1
  531. package/.output/server/chunks/routes/api/workshop/tasks/_id/complete.post.mjs +1 -1
  532. package/.output/server/chunks/routes/api/workshop/tasks/_id/dispatch.post.mjs +1 -1
  533. package/.output/server/chunks/routes/api/workshop/tasks/_id/index.post.mjs +2 -1
  534. package/.output/server/chunks/routes/api/workshop/tasks/_id/index.post.mjs.map +1 -1
  535. package/.output/server/chunks/routes/api/workshop/tasks/_id/report.post.mjs +1 -1
  536. package/.output/server/chunks/routes/api/workshop/tasks/_id/retry.post.mjs +2 -1
  537. package/.output/server/chunks/routes/api/workshop/tasks/_id/retry.post.mjs.map +1 -1
  538. package/.output/server/chunks/routes/api/workshop/tasks/_id_.get.mjs +2 -1
  539. package/.output/server/chunks/routes/api/workshop/tasks/_id_.get.mjs.map +1 -1
  540. package/.output/server/chunks/routes/api/workshop/tasks.get.mjs +1 -0
  541. package/.output/server/chunks/routes/api/workshop/tasks.get.mjs.map +1 -1
  542. package/.output/server/chunks/routes/api/workshop/teams/_id/deploy.post.mjs +1 -1
  543. package/.output/server/chunks/routes/api/workshop/teams/_id/index.get.mjs +2 -1
  544. package/.output/server/chunks/routes/api/workshop/teams/_id/index.get.mjs.map +1 -1
  545. package/.output/server/chunks/routes/api/workshop/teams/_id/index.post.mjs +1 -1
  546. package/.output/server/chunks/routes/api/workshop/teams/_id/index.put.mjs +44 -0
  547. package/.output/server/chunks/routes/api/workshop/teams/_id/index.put.mjs.map +1 -0
  548. package/.output/server/chunks/routes/api/workshop/teams/_id/index2.get.mjs +47 -0
  549. package/.output/server/chunks/routes/api/workshop/teams/_id/index2.get.mjs.map +1 -0
  550. package/.output/server/chunks/routes/api/workshop/teams/_id/members/_agentId_.delete.mjs +2 -1
  551. package/.output/server/chunks/routes/api/workshop/teams/_id/members/_agentId_.delete.mjs.map +1 -1
  552. package/.output/server/chunks/routes/api/workshop/teams/_id_.delete.mjs +2 -1
  553. package/.output/server/chunks/routes/api/workshop/teams/_id_.delete.mjs.map +1 -1
  554. package/.output/server/chunks/routes/api/workshop/teams/_id_.get.mjs +2 -1
  555. package/.output/server/chunks/routes/api/workshop/teams/_id_.get.mjs.map +1 -1
  556. package/.output/server/chunks/routes/api/workshop/teams/_id_.patch.mjs +1 -1
  557. package/.output/server/chunks/routes/api/workshop/users/me.get.mjs +2 -0
  558. package/.output/server/chunks/routes/api/workshop/users/me.get.mjs.map +1 -1
  559. package/.output/server/chunks/routes/api/workshop/users/register.post.mjs +1 -1
  560. package/.output/server/chunks/routes/api/workshop/workspaces/_id/channel-templates/_tplId_.post.mjs +2 -2
  561. package/.output/server/chunks/routes/api/workshop/workspaces/_id/channels/_channelId_.delete.mjs +1 -0
  562. package/.output/server/chunks/routes/api/workshop/workspaces/_id/channels/_channelId_.delete.mjs.map +1 -1
  563. package/.output/server/chunks/routes/api/workshop/workspaces/_id/channels/_channelId_.post.mjs +1 -0
  564. package/.output/server/chunks/routes/api/workshop/workspaces/_id/channels/_channelId_.post.mjs.map +1 -1
  565. package/.output/server/chunks/routes/api/workshop/workspaces/index.delete.mjs +1 -0
  566. package/.output/server/chunks/routes/api/workshop/workspaces/index.delete.mjs.map +1 -1
  567. package/.output/server/chunks/routes/renderer.mjs +2 -2
  568. package/.output/server/chunks/virtual/entry.mjs +601 -36
  569. package/.output/server/chunks/virtual/entry.mjs.map +1 -1
  570. package/.output/server/chunks/virtual/precomputed.mjs +1 -1
  571. package/.output/server/index.mjs +1 -0
  572. package/.output/server/node_modules/@anthropic-ai/claude-agent-sdk/package.json +84 -0
  573. package/.output/server/node_modules/@anthropic-ai/claude-agent-sdk/sdk.mjs +225 -0
  574. package/.output/server/package.json +2 -1
  575. package/README-zh.md +507 -478
  576. package/README.md +517 -486
  577. package/app/app.vue +17 -2
  578. package/app/assets/css/main.css +421 -30
  579. package/app/components/AppHeader.vue +17 -0
  580. package/app/components/AppSidebar.vue +162 -63
  581. package/app/components/AwChart.vue +57 -54
  582. package/app/components/workshop/ChannelSessionList.vue +802 -703
  583. package/app/components/workshop/DaqNodeRow.vue +156 -0
  584. package/app/components/workshop/PluginSlot.vue +120 -0
  585. package/app/composables/workshop/useAmlStream.ts +136 -0
  586. package/app/composables/workshop/useDaqStream.ts +8 -1
  587. package/app/composables/workshop/usePluginPanels.ts +72 -0
  588. package/app/composables/workshop/useWorkshopApi.ts +7 -0
  589. package/app/pages/aml/index.vue +1949 -0
  590. package/app/pages/daq/[id].vue +60 -2
  591. package/app/pages/daq/index.vue +7 -148
  592. package/app/pages/index.vue +235 -213
  593. package/app/pages/plugins/index.vue +280 -274
  594. package/app/pages/settings.vue +555 -78
  595. package/app/pages/workshop/agents.vue +23 -1
  596. package/app/pages/workshop/teams.vue +2 -2
  597. package/app/plugins/aw-plugins.client.ts +95 -6
  598. package/app/plugins/runtime-config.client.ts +4 -14
  599. package/app/plugins/theme.client.ts +13 -3
  600. package/app/stores/app.ts +9 -2
  601. package/app/stores/runtime-config.ts +113 -7
  602. package/cli/aw.mjs +16 -3
  603. package/cli/commands/build.mjs +8 -8
  604. package/cli/commands/dev.mjs +5 -13
  605. package/cli/commands/init.mjs +1 -1
  606. package/cli/commands/start.mjs +10 -17
  607. package/cli/core/args.mjs +85 -4
  608. package/cli/core/child-lifecycle.mjs +136 -0
  609. package/config.yml +24 -0
  610. package/docs/plugins.md +128 -220
  611. package/docs/sdk.md +1 -1
  612. package/i18n/dicts/_en.json +43 -2
  613. package/i18n/dicts/aml.json +163 -0
  614. package/i18n/dicts/channelSessionList.json +4 -1
  615. package/i18n/dicts/daqDetail.json +1 -0
  616. package/i18n/dicts/settings.json +33 -1
  617. package/i18n/dicts/teams.json +9 -1
  618. package/i18n/locales/en.ts +364 -132
  619. package/i18n/locales/zh-CN.ts +433 -201
  620. package/nuxt.config.ts +18 -3
  621. package/package.json +153 -149
  622. package/scripts/_audit/.tmp/audit-data/dcws.json +28 -0
  623. package/scripts/_audit/.tmp/dcw-writes.json +15650 -0
  624. package/scripts/_audit/.tmp/dcws.json +9033 -0
  625. package/scripts/_audit/.tmp/pollution-backup/dcw-rollback.polluted.json +470006 -0
  626. package/scripts/_audit/.tmp/pollution-backup/dcws.polluted.json +9085 -0
  627. package/scripts/_audit/.tmp/probe-cwd.txt +1 -0
  628. package/scripts/_audit/audit-harness-adapters.md +664 -0
  629. package/scripts/_audit/awhome/commands/README.md +3 -0
  630. package/scripts/_audit/awhome/commands/hello.mjs +12 -0
  631. package/scripts/_audit/dcw-controller-e2e.ts +99 -0
  632. package/scripts/_audit/dcw-flush-cost.ts +43 -0
  633. package/scripts/_audit/dcw-rollback-ledger.ts +153 -0
  634. package/scripts/_audit/dcw-unrecorded-write.ts +171 -0
  635. package/scripts/_audit/dcw-write-mutex.ts +157 -0
  636. package/scripts/_audit/diag-cwd.ts +20 -0
  637. package/scripts/_audit/diag-cwd2.ts +19 -0
  638. package/scripts/_audit/exp-cost-scaling.mjs +54 -0
  639. package/scripts/_audit/exp-envelope-and-png.mjs +77 -0
  640. package/scripts/_audit/exp-png-decode.mjs +67 -0
  641. package/scripts/_audit/exp-retention-plan.mjs +61 -0
  642. package/scripts/_audit/exp-retention-rescan.mjs +42 -0
  643. package/scripts/_audit/exp-sweep-fairness.mjs +48 -0
  644. package/scripts/_audit/hello.mjs +12 -0
  645. package/scripts/_audit/http-api-authz-audit.md +657 -0
  646. package/scripts/_audit/ndjson-partial-line-repro.mjs +77 -0
  647. package/scripts/_audit/opencode-await-ternary-repro.mjs +20 -0
  648. package/scripts/_audit/part-frag.txt +84 -0
  649. package/scripts/_audit/part-head.txt +45 -0
  650. package/scripts/_audit/probe-binding.mjs +103 -0
  651. package/scripts/_audit/probe-child.mjs +17 -0
  652. package/scripts/_audit/probe-envelope.mjs +49 -0
  653. package/scripts/_audit/probe-packlist.mjs +67 -0
  654. package/scripts/_audit/probe-routes.mjs +47 -0
  655. package/scripts/_audit/probe-routes2.mjs +38 -0
  656. package/scripts/_audit/probe.ts +9 -0
  657. package/scripts/_audit/probe2.ts +6 -0
  658. package/scripts/_audit/probe3.ts +3 -0
  659. package/scripts/_audit/probe4.ts +3 -0
  660. package/scripts/_audit/proj/.AgentWorkShop/commands/echoargs.mjs +13 -0
  661. package/scripts/_audit/proj/config.yml +1 -0
  662. package/scripts/_audit/run.mjs +30 -0
  663. package/scripts/_audit/runtime-audit.md +716 -0
  664. package/scripts/_audit/ts-resolve-hook.mjs +41 -0
  665. package/scripts/_audit/tsconfig.probe.json +24 -0
  666. package/scripts/_audit/typecheck-out.txt +466 -0
  667. package/scripts/_audit/verify-data-integrity.mjs +112 -0
  668. package/scripts/_dbg-agents-dropdown-shot.py +33 -0
  669. package/scripts/_dbg-anim-verify.mjs +1 -1
  670. package/scripts/_dbg-audit-all-pages.mjs +1 -1
  671. package/scripts/_dbg-availability-probe.ts +11 -0
  672. package/scripts/_dbg-bind-bidi-e2e.mjs +1 -1
  673. package/scripts/_dbg-cf-line-shot.mjs +18 -0
  674. package/scripts/_dbg-channel-plugin-ui.mjs +94 -0
  675. package/scripts/_dbg-configroot-audit.mjs +84 -0
  676. package/scripts/_dbg-crash-recovery.mjs +1 -1
  677. package/scripts/_dbg-crush-probe.sh +21 -0
  678. package/scripts/_dbg-crush-spawn-probe.ts +22 -0
  679. package/scripts/_dbg-daq-acc-probe.mjs +1 -1
  680. package/scripts/_dbg-daq-attrib.mjs +1 -1
  681. package/scripts/_dbg-daq-debug.mjs +1 -1
  682. package/scripts/_dbg-daq-diag.mjs +1 -1
  683. package/scripts/_dbg-daq-e2e.mjs +1 -1
  684. package/scripts/_dbg-daq-filter-e2e.mjs +1 -1
  685. package/scripts/_dbg-daq-filter-e2e2.mjs +1 -1
  686. package/scripts/_dbg-daq-final-regression.mjs +1 -1
  687. package/scripts/_dbg-daq-frame-alarm.mjs +1 -1
  688. package/scripts/_dbg-daq-frame-ui.mjs +1 -1
  689. package/scripts/_dbg-daq-frame-ws.mjs +1 -1
  690. package/scripts/_dbg-daq-frames-e2e.mjs +1 -1
  691. package/scripts/_dbg-daq-full-check.mjs +1 -1
  692. package/scripts/_dbg-daq-intervals-func.mjs +94 -0
  693. package/scripts/_dbg-daq-pages-shot.mjs +1 -1
  694. package/scripts/_dbg-daq-perf.mjs +1 -1
  695. package/scripts/_dbg-daq-probe.mjs +1 -1
  696. package/scripts/_dbg-daq-recipe-e2e.mjs +1 -1
  697. package/scripts/_dbg-daq-rows-probe.mjs +1 -1
  698. package/scripts/_dbg-daq-rowstate-e2e.mjs +1 -1
  699. package/scripts/_dbg-daq-rowstate-shot.mjs +1 -1
  700. package/scripts/_dbg-daq-rowstate-shot2.mjs +1 -1
  701. package/scripts/_dbg-daq-rowstyle-verify.mjs +112 -0
  702. package/scripts/_dbg-dash-console-check.mjs +1 -1
  703. package/scripts/_dbg-dash-deep-probe.mjs +1 -1
  704. package/scripts/_dbg-dash-hitpoint.mjs +1 -1
  705. package/scripts/_dbg-dcw-read-rest.mjs +1 -1
  706. package/scripts/_dbg-dcw-read-ui.mjs +1 -1
  707. package/scripts/_dbg-dcw-shot2.mjs +1 -1
  708. package/scripts/_dbg-diag-mock-loop.mjs +89 -0
  709. package/scripts/_dbg-diag-watch.mjs +95 -0
  710. package/scripts/_dbg-error-probe.mjs +2 -2
  711. package/scripts/_dbg-filter-light-verify.mjs +1 -1
  712. package/scripts/_dbg-final-acceptance-2.mjs +1 -1
  713. package/scripts/_dbg-final-acceptance.mjs +1 -1
  714. package/scripts/_dbg-final-full-e2e.mjs +1 -1
  715. package/scripts/_dbg-final-shots.mjs +32 -0
  716. package/scripts/_dbg-final-t6-hitl.mjs +1 -1
  717. package/scripts/_dbg-fix-unused-imports.py +41 -0
  718. package/scripts/_dbg-fresh-scene-e2e.mjs +1 -1
  719. package/scripts/_dbg-goose-probe.mjs +33 -0
  720. package/scripts/_dbg-goose-probe.sh +10 -0
  721. package/scripts/_dbg-groups-ui-verify.mjs +122 -0
  722. package/scripts/_dbg-harness-cancel-repro.mjs +81 -0
  723. package/scripts/_dbg-harness-ui-shot.py +109 -0
  724. package/scripts/_dbg-hidden-check.mjs +1 -1
  725. package/scripts/_dbg-home-repro.mjs +1 -1
  726. package/scripts/_dbg-home-stack.mjs +1 -1
  727. package/scripts/_dbg-hydration-detail.mjs +1 -1
  728. package/scripts/_dbg-infra-lifecycle.mjs +1 -1
  729. package/scripts/_dbg-line-live-e2e.mjs +1 -1
  730. package/scripts/_dbg-line-repo-test.ts +10 -0
  731. package/scripts/_dbg-login-debug.py +23 -0
  732. package/scripts/_dbg-modbus-latency.mjs +22 -0
  733. package/scripts/_dbg-mqtt-chain-e2e.mjs +1 -1
  734. package/scripts/_dbg-oneshot-impl-probe.ts +67 -0
  735. package/scripts/_dbg-opslog-agent-e2e.mjs +5 -2
  736. package/scripts/_dbg-opt-team-e2e.mjs +1 -1
  737. package/scripts/_dbg-panesplitter-fix-check.mjs +1 -1
  738. package/scripts/_dbg-phase-e3-monitor.mjs +1 -1
  739. package/scripts/_dbg-pi-spawn-probe.ts +33 -0
  740. package/scripts/_dbg-plc-e2e.mjs +1 -1
  741. package/scripts/_dbg-plugin-config-ui.mjs +111 -0
  742. package/scripts/_dbg-plugin-panels-ui.mjs +54 -0
  743. package/scripts/_dbg-plugin-sink-rest.mjs +1 -1
  744. package/scripts/_dbg-plugin-sink-ui.mjs +1 -1
  745. package/scripts/_dbg-plugin-ui-wizard.mjs +1 -1
  746. package/scripts/_dbg-plugin-verify-e2e.mjs +1 -1
  747. package/scripts/_dbg-pop-clamp-verify.mjs +1 -1
  748. package/scripts/_dbg-preview-console.mjs +1 -1
  749. package/scripts/_dbg-preview-minrepro.mjs +1 -1
  750. package/scripts/_dbg-preview-pixels.mjs +1 -1
  751. package/scripts/_dbg-quality-pages-e2e.mjs +1 -1
  752. package/scripts/_dbg-qwen-acp-probe.mjs +30 -0
  753. package/scripts/_dbg-qwen-capture.mjs +21 -0
  754. package/scripts/_dbg-rail-tree-e2e.mjs +1 -1
  755. package/scripts/_dbg-real-driver-e2e.mjs +1 -1
  756. package/scripts/_dbg-real-scenario-timeline.log +55 -123
  757. package/scripts/_dbg-redesign-shots.mjs +1 -1
  758. package/scripts/_dbg-release-smoke.mjs +1 -1
  759. package/scripts/_dbg-resolve-probe.ts +6 -0
  760. package/scripts/_dbg-restart-persist.mjs +1 -1
  761. package/scripts/_dbg-sc001-dispatch.mjs +1 -1
  762. package/scripts/_dbg-scenario-final-shot.mjs +1 -1
  763. package/scripts/_dbg-scenario-phase-e2.mjs +1 -1
  764. package/scripts/_dbg-scenario-phase-e3.mjs +1 -1
  765. package/scripts/_dbg-scenario-phase1.mjs +1 -1
  766. package/scripts/_dbg-scenario-phase2.mjs +1 -1
  767. package/scripts/_dbg-scenario-phase3-monitor.mjs +1 -1
  768. package/scripts/_dbg-scenario-phase3.mjs +1 -1
  769. package/scripts/_dbg-settings-draft-probe.mjs +39 -0
  770. package/scripts/_dbg-settings-probe.mjs +33 -0
  771. package/scripts/_dbg-task-cancel-probe.mjs +66 -0
  772. package/scripts/_dbg-town-alarm-e2e.mjs +1 -1
  773. package/scripts/_dbg-town-daq-shot.mjs +1 -1
  774. package/scripts/_dbg-town-full-e2e.mjs +1 -1
  775. package/scripts/_dbg-town-gate.mjs +1 -1
  776. package/scripts/_dbg-town-ins-probe.mjs +1 -1
  777. package/scripts/_dbg-town-perf.mjs +1 -1
  778. package/scripts/_dbg-town-realtime.mjs +1 -1
  779. package/scripts/_dbg-town-shot.py +25 -0
  780. package/scripts/_dbg-town-shot3.mjs +1 -1
  781. package/scripts/_dbg-town-smoke.mjs +54 -0
  782. package/scripts/_dbg-town-truth.mjs +1 -1
  783. package/scripts/_dbg-town-truth2.mjs +1 -1
  784. package/scripts/_dbg-trend-expand-test.mjs +1 -1
  785. package/scripts/_dbg-twindaq-focus.mjs +1 -1
  786. package/scripts/_dbg-ui-polish-shot.mjs +1 -1
  787. package/scripts/_dbg-ui-polish-verify1.mjs +1 -1
  788. package/scripts/_dbg-ui-polish-verify2.mjs +1 -1
  789. package/scripts/_dbg-ui-polish-verify3.mjs +1 -1
  790. package/scripts/_dbg-ui-polish-verify4.mjs +1 -1
  791. package/scripts/_dbg-unify-shot.mjs +1 -1
  792. package/scripts/_dbg-uplink-probe.mjs +1 -1
  793. package/scripts/_dbg-wizard-preview-shot.mjs +1 -1
  794. package/scripts/_dbg-wizard-ui-e2e.mjs +1 -1
  795. package/scripts/_dbg-ws-probe.mjs +1 -1
  796. package/scripts/_dbg-wsdot-sanity.mjs +1 -1
  797. package/scripts/_node-state-probe.mjs +1 -1
  798. package/scripts/_tmp-args-probe.mjs +20 -0
  799. package/scripts/_tmp-cyc-entry.mjs +8 -0
  800. package/scripts/_tmp-cyc-main.mjs +5 -0
  801. package/scripts/_tmp-cyc-mod.mjs +2 -0
  802. package/scripts/_tmp-cycle-a.mjs +6 -0
  803. package/scripts/_tmp-cycle-b.mjs +2 -0
  804. package/scripts/_tmp-cycle-probe.mjs +4 -0
  805. package/scripts/_tmp-entry-variant.mjs +2 -0
  806. package/scripts/_tmp-help-probe.mjs +19 -0
  807. package/scripts/_tmp-help-probe2.mjs +2 -0
  808. package/scripts/_tmp-trace-preload.mjs +1 -0
  809. package/scripts/aml-agent-bridge.ts +230 -0
  810. package/scripts/aml-industrial-loop.ts +232 -0
  811. package/scripts/aml-ui-smoke.mjs +67 -0
  812. package/scripts/aw-start-smoke.mjs +194 -0
  813. package/scripts/design-verify-templates.mjs +1 -1
  814. package/scripts/device-line-restore.mjs +1 -1
  815. package/scripts/e2e-aml.ts +259 -0
  816. package/scripts/e2e-config-groups.mjs +238 -0
  817. package/scripts/e2e-full-closedloop.mjs +911 -0
  818. package/scripts/e2e-full-scenario.ts +321 -0
  819. package/scripts/e2e-harness-consistency.ts +204 -0
  820. package/scripts/e2e-multi-harness.ts +233 -76
  821. package/scripts/e2e-plc-plugin-closedloop.mjs +518 -0
  822. package/scripts/e2e-real-scenario.mjs +466 -452
  823. package/scripts/e2e-template-isolation.mjs +2 -2
  824. package/scripts/experiment-castfilm-closedloop.mjs +423 -0
  825. package/scripts/experiment-castfilm-finish.mjs +194 -0
  826. package/scripts/experiment-castfilm-ui-shot.mjs +52 -0
  827. package/scripts/experiment-castfilm-viz.mjs +172 -0
  828. package/scripts/production-closed-loop-e2e.mjs +78 -29
  829. package/scripts/test-aml-integration.ts +159 -0
  830. package/scripts/test-aml-job.ts +174 -0
  831. package/scripts/test-aml-unit.ts +184 -0
  832. package/scripts/test-cli-exit.mjs +235 -0
  833. package/scripts/test-daq-frame-race.mjs +310 -0
  834. package/scripts/test-data-root.mjs +208 -0
  835. package/scripts/test-log-flooding.mjs +160 -0
  836. package/scripts/test-lru.mjs +78 -0
  837. package/scripts/test-memory-month-query.mjs +62 -0
  838. package/scripts/test-plugin-hardening.mjs +45 -0
  839. package/scripts/test-rollback-index.mjs +79 -0
  840. package/scripts/test-sdk-surface.mjs +155 -0
  841. package/scripts/three-system-e2e.mjs +662 -448
  842. package/scripts/town-scene-clear.mjs +1 -1
  843. package/sdk/client.d.mts +110 -0
  844. package/sdk/client.mjs +144 -124
  845. package/sdk/context.mjs +161 -1
  846. package/sdk/index.d.mts +37 -5
  847. package/sdk/index.mjs +44 -41
  848. package/sdk/lifecycle.mjs +4 -1
  849. package/server/api/plugins/i18n.get.ts +12 -0
  850. package/server/api/system/config-groups/[id].delete.ts +21 -0
  851. package/server/api/system/config-groups/[id].patch.ts +26 -0
  852. package/server/api/system/config-groups/index.get.ts +21 -0
  853. package/server/api/system/config-groups/index.post.ts +33 -0
  854. package/server/api/system/settings/events.get.ts +8 -4
  855. package/server/api/workshop/agent-tools/bindings/[id].delete.ts +6 -1
  856. package/server/api/workshop/agent-tools/bindings/[id].patch.ts +12 -3
  857. package/server/api/workshop/agent-tools/bindings/index.get.ts +29 -2
  858. package/server/api/workshop/agent-tools/invoke.post.ts +30 -5
  859. package/server/api/workshop/aml/datasets/[id]/preview.get.ts +68 -0
  860. package/server/api/workshop/aml/datasets/[id].get.ts +24 -0
  861. package/server/api/workshop/aml/datasets/index.get.ts +20 -0
  862. package/server/api/workshop/aml/datasets/index.post.ts +27 -0
  863. package/server/api/workshop/aml/experiments/index.get.ts +35 -0
  864. package/server/api/workshop/aml/index.get.ts +24 -0
  865. package/server/api/workshop/aml/jobs/[id]/cancel.post.ts +21 -0
  866. package/server/api/workshop/aml/jobs/[id]/logs.get.ts +23 -0
  867. package/server/api/workshop/aml/jobs/[id]/retry.post.ts +20 -0
  868. package/server/api/workshop/aml/jobs/[id].get.ts +23 -0
  869. package/server/api/workshop/aml/jobs/index.get.ts +26 -0
  870. package/server/api/workshop/aml/jobs/index.post.ts +44 -0
  871. package/server/api/workshop/aml/models/[id]/predict.post.ts +24 -0
  872. package/server/api/workshop/aml/models/[id]/promote.post.ts +30 -0
  873. package/server/api/workshop/aml/models/index.get.ts +48 -0
  874. package/server/api/workshop/daq/[id].delete.ts +6 -0
  875. package/server/api/workshop/dcw/[id].patch.ts +14 -2
  876. package/server/api/workshop/hitl/respond.post.ts +3 -1
  877. package/server/api/workshop/teams/[id]/plugins/index.get.ts +36 -0
  878. package/server/api/workshop/teams/[id]/plugins/index.put.ts +42 -0
  879. package/server/api/workshop/teams/index.post.ts +13 -0
  880. package/server/api/workshop/users/me.get.ts +5 -0
  881. package/server/api/workshop/ws.ts +14 -2
  882. package/server/data/daqs.json +1648 -123
  883. package/server/data/dcw-lines.json +301 -0
  884. package/server/data/dcw-products.json +140 -0
  885. package/server/data/dcw-recipes.json +890 -0
  886. package/server/data/dcw-rollback.json +11591 -5740
  887. package/server/data/dcw-runs.json +3745 -3559
  888. package/server/data/dcw-templates.json +120 -0
  889. package/server/data/dcw-writes.json +1800 -0
  890. package/server/data/dcws.json +1576 -287
  891. package/server/data/line-runs.json +137 -27
  892. package/server/harness/pi-aw-tools.mjs +51 -0
  893. package/server/plugins/dev-stability-guard.ts +63 -63
  894. package/server/plugins/system-config.ts +10 -11
  895. package/server/plugins/workshop.ts +10 -0
  896. package/server/plugins-builtin/diag-bridge/client.mjs +84 -0
  897. package/server/plugins-builtin/diag-bridge/i18n.json +72 -0
  898. package/server/plugins-builtin/diag-bridge/index.mjs +127 -22
  899. package/server/plugins-builtin/rag-bridge/client.mjs +108 -0
  900. package/server/plugins-builtin/rag-bridge/i18n.json +60 -0
  901. package/server/plugins-builtin/rag-bridge/index.mjs +67 -20
  902. package/server/services/system-config.ts +610 -396
  903. package/server/services/workshop/agents/adapters/line-spawn.ts +15 -6
  904. package/server/services/workshop/agents/adapters/one-shot-cli-agent.ts +530 -0
  905. package/server/services/workshop/agents/base-agent.ts +219 -0
  906. package/server/services/workshop/agents/binding-authz.ts +57 -0
  907. package/server/services/workshop/agents/claude-agent.ts +546 -30
  908. package/server/services/workshop/agents/codex-agent.ts +40 -116
  909. package/server/services/workshop/agents/copilot-agent.ts +136 -0
  910. package/server/services/workshop/agents/crush-agent.ts +107 -0
  911. package/server/services/workshop/agents/cursor-agent.ts +102 -0
  912. package/server/services/workshop/agents/dsh-agent.ts +578 -670
  913. package/server/services/workshop/agents/gemini-agent.ts +121 -0
  914. package/server/services/workshop/agents/goose-agent.ts +98 -0
  915. package/server/services/workshop/agents/harness-models.ts +305 -270
  916. package/server/services/workshop/agents/hermes-agent.ts +528 -0
  917. package/server/services/workshop/agents/host-tool-bridge.ts +53 -2
  918. package/server/services/workshop/agents/industrial-tools.ts +659 -7
  919. package/server/services/workshop/agents/omp-agent.ts +74 -59
  920. package/server/services/workshop/agents/opencode-agent.ts +936 -987
  921. package/server/services/workshop/agents/pi-agent.ts +108 -0
  922. package/server/services/workshop/agents/qwen-agent.ts +540 -0
  923. package/server/services/workshop/agents/registry.ts +117 -5
  924. package/server/services/workshop/agents/tool-approvals.ts +3 -3
  925. package/server/services/workshop/aml/aml.repo.ts +368 -0
  926. package/server/services/workshop/aml/clean.ts +120 -0
  927. package/server/services/workshop/aml/dataset-builder.ts +491 -0
  928. package/server/services/workshop/aml/gates.ts +121 -0
  929. package/server/services/workshop/aml/job-orchestrator.ts +650 -0
  930. package/server/services/workshop/aml/model-registry.ts +169 -0
  931. package/server/services/workshop/aml/predictor.ts +262 -0
  932. package/server/services/workshop/aml/python/aml_eval.py +171 -0
  933. package/server/services/workshop/aml/python/amlkit.py +120 -0
  934. package/server/services/workshop/aml/python/requirements.txt +7 -0
  935. package/server/services/workshop/aml/python/train-example.py +92 -0
  936. package/server/services/workshop/aml/python-runtime.ts +217 -0
  937. package/server/services/workshop/aml/retention.ts +98 -0
  938. package/server/services/workshop/aml/runtime.ts +45 -0
  939. package/server/services/workshop/aml/spec.ts +63 -0
  940. package/server/services/workshop/aml/stats.ts +140 -0
  941. package/server/services/workshop/daq/bus/mqtt.adapter.ts +8 -1
  942. package/server/services/workshop/daq/daq-controller.ts +147 -19
  943. package/server/services/workshop/daq/daq-node.repo.ts +13 -11
  944. package/server/services/workshop/daq/daq-runtime.ts +11 -0
  945. package/server/services/workshop/daq/drivers.ts +89 -8
  946. package/server/services/workshop/db/aml-team-seeds.ts +118 -0
  947. package/server/services/workshop/db/channel-plugins.repo.ts +27 -1
  948. package/server/services/workshop/db/database.ts +89 -1
  949. package/server/services/workshop/db/memory.repo.ts +31 -0
  950. package/server/services/workshop/db/user.repo.ts +9 -0
  951. package/server/services/workshop/dcw/dcw-controller.ts +33 -7
  952. package/server/services/workshop/dcw/dcw-line.repo.ts +5 -3
  953. package/server/services/workshop/dcw/dcw-node.repo.ts +4 -4
  954. package/server/services/workshop/dcw/dcw-product.repo.ts +8 -8
  955. package/server/services/workshop/dcw/dcw-recipe.repo.ts +6 -7
  956. package/server/services/workshop/dcw/dcw-runtime.ts +16 -2
  957. package/server/services/workshop/dcw/dcw-templates.ts +4 -4
  958. package/server/services/workshop/dcw/line-run.ts +5 -5
  959. package/server/services/workshop/dcw/recipe-rollback-manager.ts +3 -1
  960. package/server/services/workshop/dcw/recipe-rollback.repo.ts +155 -52
  961. package/server/services/workshop/logger.ts +145 -3
  962. package/server/services/workshop/plugins/host.mjs +854 -566
  963. package/server/services/workshop/prompts/loader.ts +32 -6
  964. package/server/services/workshop/runtime/agent-runtime.ts +32 -3
  965. package/server/services/workshop/runtime/manager.ts +53 -13
  966. package/server/services/workshop/runtime/scheduler-loop.ts +18 -1
  967. package/server/services/workshop/scene/scene-layout.repo.ts +5 -5
  968. package/server/services/workshop/settings.ts +64 -0
  969. package/shared/config/engine.mjs +5 -0
  970. package/shared/config/groups.mjs +220 -0
  971. package/shared/config/home.mjs +11 -2
  972. package/shared/config/schema.json +31 -6
  973. package/shared/daq-protocol.ts +6 -0
  974. package/shared/lru.mjs +94 -0
  975. package/shared/workshop-protocol.ts +2 -2
  976. package/.output/public/_nuxt/2jaJHWIJ.js +0 -1
  977. package/.output/public/_nuxt/B8kt898d.js +0 -1
  978. package/.output/public/_nuxt/BFGpEo8S.js +0 -1
  979. package/.output/public/_nuxt/BG4zduPf.js +0 -14
  980. package/.output/public/_nuxt/BHcpzI2n.js +0 -19
  981. package/.output/public/_nuxt/BWyR3awA.js +0 -1
  982. package/.output/public/_nuxt/Bc89zKq2.js +0 -1
  983. package/.output/public/_nuxt/BetmGSO4.js +0 -1
  984. package/.output/public/_nuxt/BowTbasd.js +0 -1
  985. package/.output/public/_nuxt/BvtknqSC2.js +0 -1
  986. package/.output/public/_nuxt/BytVi9VX2.js +0 -4
  987. package/.output/public/_nuxt/CJviSvm-.js +0 -1
  988. package/.output/public/_nuxt/CTfqWGdy.js +0 -1
  989. package/.output/public/_nuxt/Cb3SnTM8.js +0 -1
  990. package/.output/public/_nuxt/Chc5pfAA.js +0 -1
  991. package/.output/public/_nuxt/CobSUzQv.js +0 -2
  992. package/.output/public/_nuxt/D95h62Jn.js +0 -1
  993. package/.output/public/_nuxt/DGAOugLt.js +0 -1
  994. package/.output/public/_nuxt/DHbTyoAV.js +0 -1
  995. package/.output/public/_nuxt/DfLUN8kY.js +0 -1
  996. package/.output/public/_nuxt/DnziMlcX.js +0 -1
  997. package/.output/public/_nuxt/DvgKXPgu2.js +0 -13
  998. package/.output/public/_nuxt/Q_SJDSgx.js +0 -1
  999. package/.output/public/_nuxt/_id_.DdbYeLqn.css +0 -1
  1000. package/.output/public/_nuxt/_wsId_.BqWBlY7X.css +0 -1
  1001. package/.output/public/_nuxt/agents.CB9Ck7VQ.css +0 -1
  1002. package/.output/public/_nuxt/bFnZa2yd.js +0 -1
  1003. package/.output/public/_nuxt/builds/meta/f7a8e33d-5422-45ac-895d-27168f97e3ad.json +0 -1
  1004. package/.output/public/_nuxt/daq.DGV9QS8d.css +0 -1
  1005. package/.output/public/_nuxt/default.BbgdTDCk.css +0 -1
  1006. package/.output/public/_nuxt/entry.BN02X8iR.css +0 -1
  1007. package/.output/public/_nuxt/pages.CG8UJ2TK.css +0 -1
  1008. package/.output/public/_nuxt/plugins.DpCuwaJt.css +0 -1
  1009. package/.output/public/_nuxt/rkVgzg62.js +0 -1
  1010. package/.output/public/_nuxt/settings.W6qrYAui.css +0 -1
  1011. package/.output/public/_nuxt/teams.BBXVkyKq.css +0 -1
  1012. package/.output/server/chunks/build/_id_-3Axz2-gV.mjs.map +0 -1
  1013. package/.output/server/chunks/build/_id_-CahfkmEt.mjs.map +0 -1
  1014. package/.output/server/chunks/build/agents-DuMiSWKp.mjs.map +0 -1
  1015. package/.output/server/chunks/build/alert-qJnjyRcP.mjs.map +0 -1
  1016. package/.output/server/chunks/build/channel-templates-BStqJ-of.mjs.map +0 -1
  1017. package/.output/server/chunks/build/daq-ChYCABz1.mjs.map +0 -1
  1018. package/.output/server/chunks/build/dcw-CcQNGggh.mjs.map +0 -1
  1019. package/.output/server/chunks/build/logs-D-2UyGtE.mjs.map +0 -1
  1020. package/.output/server/chunks/build/pages-Dfosfchr.mjs.map +0 -1
  1021. package/.output/server/chunks/build/permissions-B-hhZuzm.mjs.map +0 -1
  1022. package/.output/server/chunks/build/plugins-DZR0T4Mh.mjs.map +0 -1
  1023. package/.output/server/chunks/build/responsiveObserve-CS0UB6wQ.mjs +0 -78
  1024. package/.output/server/chunks/build/responsiveObserve-CS0UB6wQ.mjs.map +0 -1
  1025. package/.output/server/chunks/build/settings-BajN9TQW.mjs.map +0 -1
  1026. package/.output/server/chunks/build/tag-NO9jEqKy.mjs.map +0 -1
  1027. package/.output/server/chunks/build/teams-t2SkRlJP.mjs.map +0 -1
  1028. package/.output/server/chunks/build/tokens-DiCojbN8.mjs.map +0 -1
  1029. package/.output/server/chunks/build/town-C7QM8DYK.mjs.map +0 -1
  1030. package/.output/server/chunks/build/useDaqStream-BeA2X8KR.mjs.map +0 -1
  1031. package/.output/server/chunks/build/useDcwStream-BJW_MitY.mjs.map +0 -1
  1032. package/.output/server/chunks/build/users-B9SAdEtH.mjs.map +0 -1
  1033. /package/.output/public/_nuxt/{ORt9oDIy.js → ORt9oDIy2.js} +0 -0
@@ -1,452 +1,466 @@
1
- /**
2
- * 多 Harness 真实场景端到端(针对真实运行中的 AgentWorkShop 服务)。
3
- *
4
- * 前置:服务已启动(pnpm dev / npm start),且服务进程 PATH 上有 omp/codex/dsh。
5
- * 运行:node scripts/e2e-real-scenario.mjs [--base http://127.0.0.1:3000]
6
- *
7
- * 场景:
8
- * 0. 注册测试用户 + WS 事件监控(全程录制 AEP 帧)+ REST 事件历史轮询(权威记录)
9
- * 1. 产线:新建产线 + DCW 温控节点(mock)+ DAQ 温度采集节点(mock)
10
- * 2. 班组:AgentChannel(lead=omp)+ worker-codex + worker-dsh,绑定工业节点
11
- * (dsh↔DCW manual / dsh↔DAQ auto / codex↔DCW manual)
12
- * 3. 兼容性对话:人类→codex、人类→dsh(要求回执);codex 经工具跨引擎发信 dsh
13
- * 4. 团队作业:goal 任务 → lead 派发 → dsh 数采(daq_query)→ 数控写入(dcw_control
14
- * 触发 dcw-approval HITL)→ 测试员批准 → 写入生效 → 复读确认 → 任务闭环
15
- * 5. HITL 超时:再次写入,故意不批准 → 等满 security.hitl_timeout_ms →
16
- * 自动按拒绝收敛(expired)→ worker 收到拒绝结果并汇报
17
- */
18
- const BASE = process.env.AW_BASE ?? 'http://127.0.0.1:3000'
19
- const WS_BASE = BASE.replace(/^http/, 'ws')
20
-
21
- let failures = 0
22
- let passed = 0
23
- const timeline = []
24
-
25
- const ts = () => new Date().toISOString().slice(11, 23)
26
- const log = (line) => {
27
- console.log(`[${ts()}] ${line}`)
28
- timeline.push(`[${ts()}] ${line}`)
29
- }
30
- const check = (name, ok, detail = '') => {
31
- const tag = ok ? 'PASS' : 'FAIL'
32
- log(` ${tag} ${name}${detail ? ` — ${detail}` : ''}`)
33
- if (ok) {
34
- passed += 1
35
- }
36
- else {
37
- failures += 1
38
- }
39
- return ok
40
- }
41
- const sleep = ms => new Promise(r => setTimeout(r, ms))
42
-
43
- // ---------- 用户与 API ----------
44
- const reg = await fetch(`${BASE}/api/workshop/users/register`, {
45
- method: 'POST', headers: { 'content-type': 'application/json' },
46
- body: JSON.stringify({ name: 'live-scen-' + Math.random().toString(36).slice(2, 8) }),
47
- }).then(r => r.json()).catch(() => null)
48
- const TOKEN = reg?.data?.token
49
- if (!TOKEN) {
50
- console.error('用户注册失败 — 服务未启动或接口不可用:', JSON.stringify(reg))
51
- process.exit(1)
52
- }
53
- log(`测试用户已注册(token=${TOKEN.slice(0, 8)}…)BASE=${BASE}`)
54
-
55
- async function api(method, path, body) {
56
- const res = await fetch(`${BASE}${path}`, {
57
- method,
58
- headers: { 'content-type': 'application/json', 'authorization': `Bearer ${TOKEN}` },
59
- body: body !== undefined ? JSON.stringify(body) : undefined,
60
- })
61
- const json = await res.json().catch(() => ({}))
62
- return { status: res.status, ...json }
63
- }
64
-
65
- /** 回执判定:平台代投/模型回执(in_reply_to 帧)或时间线产物含预期文本(兜底) */
66
- function matchReply(frames, from, mid, textPattern) {
67
- return frames.find(f => f.type === 'a2a.message' && f.payload?.metadata?.['x-aw-in-reply-to'] === mid)
68
- ?? frames.find(f => (f.type === 'a2a.artifact' || f.type === 'agent.status.message')
69
- && textPattern.test(JSON.stringify(f.payload ?? ''))) ?? null
70
- }
71
-
72
- async function waitUntil(name, cond, timeoutMs, intervalMs = 1000) {
73
- const deadline = Date.now() + timeoutMs
74
- let last = null
75
- while (Date.now() < deadline) {
76
- try {
77
- last = await cond()
78
- }
79
- catch (e) {
80
- last = e
81
- }
82
- if (last) return last
83
- await sleep(intervalMs)
84
- }
85
- return last ?? null
86
- }
87
-
88
- // ---------- 事件监控:REST 历史轮询(权威)+ WS 实时 ----------
89
- const eventFrames = []
90
- let lastSeq = 0
91
- let wsSeen = 0
92
-
93
- async function pollEvents(channelId) {
94
- const res = await api('GET', `/api/workshop/channels/${channelId}/events?limit=500`)
95
- const list = res?.data?.items ?? []
96
- for (const f of list) {
97
- const seq = Number(f.seq ?? 0)
98
- if (seq > lastSeq) {
99
- lastSeq = seq
100
- eventFrames.push(f)
101
- const t = f.type
102
- if (['hitl.request', 'hitl.resolved', 'task.status', 'a2a.message', 'a2a.artifact', 'error'].includes(t)) {
103
- const p = f.payload ?? {}
104
- const brief = t === 'a2a.message'
105
- ? `${p.fromAgentId ?? p.from ?? '?'}→${p.toAgentId ?? p.to ?? '?'}: ${(p.parts ?? []).map(x => x.text ?? '').join(' ').slice(0, 110)}`
106
- : t === 'hitl.request'
107
- ? `${p.kind}:${p.title ?? ''}`
108
- : t === 'hitl.resolved'
109
- ? `${p.kind} outcome=${p.outcome}`
110
- : t === 'task.status'
111
- ? `${(p.title ?? '').slice(0, 40)} → ${p.state}`
112
- : t === 'a2a.artifact'
113
- ? `artifact(${p.artifact?.name ?? '?'})`
114
- : JSON.stringify(p).slice(0, 120)
115
- log(` [事件] #${seq} ${t} ${brief}`)
116
- }
117
- }
118
- }
119
- }
120
-
121
- function startPolling(channelId) {
122
- const timer = setInterval(() => {
123
- void pollEvents(channelId).catch(() => {})
124
- }, 2000)
125
- return () => clearInterval(timer)
126
- }
127
-
128
- async function startWs(channelId) {
129
- try {
130
- const { createRequire } = await import('node:module')
131
- const req = createRequire(import.meta.url)
132
- let WebSocket = null
133
- try {
134
- WebSocket = req('D:/codes/ABO/AgentWorkShop/node_modules/.pnpm/ws@8.21.3/node_modules/ws')
135
- }
136
- catch (e) {
137
- log(`ws 模块加载失败: ${e.message}`)
138
- }
139
- if (!WebSocket) {
140
- log('WS 客户端不可用,仅用 REST 轮询监控')
141
- return () => {}
142
- }
143
- const ws = new WebSocket(`${WS_BASE}/api/workshop/ws`)
144
- ws.on('open', () => {
145
- ws.send(JSON.stringify({ type: 'sub', channelId, token: TOKEN }))
146
- log('WS 监控已接入(AEP 实时帧)')
147
- })
148
- ws.on('message', (raw) => {
149
- wsSeen++
150
- try {
151
- const f = JSON.parse(String(raw))
152
- if (f.type === 'hitl.request') log(` [WS/hitl.request] ${f.payload?.kind}: ${f.payload?.title ?? ''}`)
153
- if (f.type === 'hitl.resolved') log(` [WS/hitl.resolved] ${f.payload?.kind} outcome=${f.payload?.outcome}`)
154
- }
155
- catch { /* 忽略 */ }
156
- })
157
- ws.on('error', e => log(`WS 错误(不影响 REST 权威记录): ${e.message}`))
158
- return () => {
159
- try {
160
- ws.close()
161
- }
162
- catch { /* ignore */ }
163
- }
164
- }
165
- catch (e) {
166
- log(`WS 初始化失败(仅 REST 轮询): ${e.message}`)
167
- return () => {}
168
- }
169
- }
170
-
171
- // ---------- 工具调用(REST 直调,用于验证/准备;worker 侧走 MCP 桥) ----------
172
- async function invokeTool(agentId, tool, args) {
173
- return await api('POST', '/api/workshop/agent-tools/invoke', { agentId, tool, args })
174
- }
175
-
176
- /**
177
- * 确保 worker-dsh 在组(lead 可能自主移除成员——实测发生过):不在则重建并重绑工业节点。
178
- * 返回当前可用的 dsh 实例 id。
179
- */
180
- async function ensureDshWorker() {
181
- const members = await api('GET', `/api/workshop/channels/${channelId}/agents`)
182
- const live = (members?.data ?? []).find(m => m.name === 'worker-dsh' && m.enabled !== 0)
183
- if (live) return live.id
184
- log(' [自愈] worker-dsh 已不在组(被 lead 移除?)→ 重建并重绑工业节点')
185
- const w = await createWorker('worker-dsh', 'dsh', { promptTimeoutMs: 600_000 })
186
- if (!w.agentId) throw new Error(`重建 worker-dsh 失败: ${w.err}`)
187
- await api('POST', '/api/workshop/agent-tools/bindings', { agentId: w.agentId, nodeId: dcwNodeId, kind: 'dcw', mode: 'manual' })
188
- await api('POST', '/api/workshop/agent-tools/bindings', { agentId: w.agentId, nodeId: daqNodeId, kind: 'daq', mode: 'auto' })
189
- await sleep(1500)
190
- return w.agentId
191
- }
192
-
193
- // ============================================================
194
- console.log('\n━━━ 0. 服务连通性 ━━━')
195
- const harnesses = await api('GET', '/api/workshop/harnesses')
196
- const hIds = (harnesses?.data?.harnesses ?? []).map(h => h.id)
197
- check('服务可达且为多引擎版本(注册表含 codex/dsh/opencode)', hIds.includes('codex') && hIds.includes('dsh') && hIds.includes('opencode'), `harnesses=${hIds.join(',')}`)
198
-
199
- // ============================================================
200
- console.log('\n━━━ 1. 产线与工业节点 ━━━')
201
- const line = await api('POST', '/api/workshop/dcw/lines', { name: '多引擎联调线' })
202
- const lineId = line?.data?.line?.id
203
- check('新建产线', !!lineId, `line=${line?.data?.line?.name ?? JSON.stringify(line).slice(0, 80)}`)
204
-
205
- const dcwNode = await api('POST', '/api/workshop/dcw', {
206
- templateRef: 'dcw-temp-sp', name: '联调温度设定器', driver: 'mock', lineId,
207
- readIntervalMs: 2000, unit: '℃', min: 150, max: 200,
208
- })
209
- const dcwNodeId = dcwNode?.data?.node?.id
210
- check('新建 DCW 数控节点(mock 温控)', !!dcwNodeId, `id=${dcwNodeId}`)
211
-
212
- const daqNode = await api('POST', '/api/workshop/daq', {
213
- templateRef: 'daq-temp-tc', name: '联调温度采集', driver: 'mock', lineId,
214
- intervalMs: 1000,
215
- })
216
- const daqNodeId = daqNode?.data?.node?.id
217
- check('新建 DAQ 数采节点(mock 温度)', !!daqNodeId, `id=${daqNodeId} driver=${daqNode?.data?.node?.driver}`)
218
-
219
- // ============================================================
220
- console.log('\n━━━ 2. 班组(多引擎 AgentChannel)━━━')
221
- const ch = await api('POST', '/api/workshop/channels', {
222
- name: '多引擎联调-产线班组',
223
- scenarioPrompt: '多引擎兼容性联调班组:成员来自不同 Agent Harness(omp/codex/dsh),协作完成产线数采与数控写入。所有写入必须走审批流程,如实汇报执行结果。',
224
- leadAgent: { name: 'lead-omp', harness: 'omp', config: { provider: 'zhipu-coding-plan', model: 'glm-5.2' } },
225
- })
226
- const channelId = ch?.data?.channelId
227
- check('创建 AgentChannel(lead=omp)', !!channelId, `channelId=${channelId}`)
228
-
229
- async function createWorker(name, harness, config) {
230
- // 一步创建(新建模板并克隆):响应即 channel 内实例(独立 id,后续绑定/调用一律用实例 id)
231
- const add = await api('POST', `/api/workshop/channels/${channelId}/agents`, { name, harness, role: 'worker', config })
232
- const agentId = add?.data?.id
233
- if (!agentId) return { agentId: null, err: JSON.stringify(add).slice(0, 200) }
234
- return { agentId, err: null }
235
- }
236
-
237
- const codex = await createWorker('worker-codex', 'codex', {
238
- approvalPolicy: 'on-request', sandbox: 'workspace-write', promptTimeoutMs: 600_000,
239
- systemPromptPrefix: '执行要直接:按任务指令调用平台工具并汇报,不探索文件系统。',
240
- })
241
- check('创建 worker-codex 并入组(harness=codex)', !!codex.agentId, codex.err ?? codex.agentId)
242
- const dsh = await createWorker('worker-dsh', 'dsh', { promptTimeoutMs: 600_000 })
243
- check('创建 worker-dsh 并入组(harness=dsh)', !!dsh.agentId, dsh.err ?? dsh.agentId)
244
-
245
- if (!channelId || !codex.agentId || !dsh.agentId || !dcwNodeId || !daqNodeId) {
246
- log('前置实体创建失败,中止场景')
247
- console.log(`FAILURES=${failures} PASSED=${passed}`)
248
- process.exit(1)
249
- }
250
-
251
- const stopPoll = startPolling(channelId)
252
- const stopWs = await startWs(channelId)
253
- await sleep(2500)
254
- await pollEvents(channelId)
255
-
256
- // ---------- 绑定工业节点 ----------
257
- const b1 = await api('POST', '/api/workshop/agent-tools/bindings', { agentId: dsh.agentId, nodeId: dcwNodeId, kind: 'dcw', mode: 'manual' })
258
- check('绑定 dsh↔DCW(manual,HITL 模式)', !!b1?.data?.binding?.id, `mode=${b1?.data?.binding?.mode}`)
259
- const b2 = await api('POST', '/api/workshop/agent-tools/bindings', { agentId: dsh.agentId, nodeId: daqNodeId, kind: 'daq', mode: 'auto' })
260
- check('绑定 dsh↔DAQ(auto,数采)', !!b2?.data?.binding?.id)
261
- const b3 = await api('POST', '/api/workshop/agent-tools/bindings', { agentId: codex.agentId, nodeId: dcwNodeId, kind: 'dcw', mode: 'manual' })
262
- check('绑定 codex↔DCW(manual)', !!b3?.data?.binding?.id)
263
-
264
- // dsh 引擎侧工具可见性验证(my_industrial_nodes 直调;worker 实际经 MCP 桥)
265
- const mine = await invokeTool(dsh.agentId, 'my_industrial_nodes', {})
266
- check('dsh 工具面可见绑定节点(my_industrial_nodes)', /温度设定器|联调温度/.test(String(mine?.data?.result?.text ?? '')), String(mine?.data?.result?.text ?? '').replace(/\n/g, ' ').slice(0, 120))
267
-
268
- // ============================================================
269
- console.log('\n━━━ 3. 兼容性对话(三通道)━━━')
270
- const seq0 = lastSeq
271
-
272
- // 3a. 人类 → codex(要求回执)
273
- const m1 = await api('POST', `/api/workshop/channels/${channelId}/messages`, {
274
- toAgentId: codex.agentId, fromLabel: '测试员', requireReply: true, priority: 'task',
275
- text: '兼容性检查:请用一句话汇报你正在运行的引擎类型(如 codex),然后调用 report_progress 工具上报 10% 进度(无任务上下文则忽略报错),最后原样回复"codex 在线"。',
276
- })
277
- check('人类→codex 消息已投递', m1.status === 200 || !!m1?.data?.messageId, `status=${m1.status}`)
278
-
279
- const codexReply = await waitUntil('codex 回执', async () => {
280
- await pollEvents(channelId)
281
- return matchReply(eventFrames.slice(seq0), codex.agentId, m1?.data?.messageId ?? m1?.messageId, /codex 在线/)
282
- }, 240_000)
283
- check('codex 回执到达(真实引擎回合)', !!codexReply,
284
- codexReply ? `内容=${(codexReply.payload?.parts ?? []).map(x => x.text ?? '').join('').slice(0, 80)}` : '240s 未回')
285
-
286
- // 3b. 人类 → dsh(要求回执)
287
- const seqA = lastSeq
288
- const m2 = await api('POST', `/api/workshop/channels/${channelId}/messages`, {
289
- toAgentId: dsh.agentId, fromLabel: '测试员', requireReply: true, priority: 'task',
290
- text: '兼容性检查:请用一句话汇报你正在运行的引擎类型(如 dsh/ACP),然后原样回复"dsh 在线"。',
291
- })
292
- check('人类→dsh 消息已投递', m2.status === 200 || !!m2?.data?.messageId, `status=${m2.status}`)
293
- const dshReply = await waitUntil('dsh 回执', async () => {
294
- await pollEvents(channelId)
295
- return matchReply(eventFrames.slice(seqA), dsh.agentId, m2?.data?.messageId ?? m2?.messageId, /dsh 在线/)
296
- }, 240_000)
297
- check('dsh 回执到达(真实引擎回合)', !!dshReply,
298
- dshReply ? `内容=${(dshReply.payload?.parts ?? []).map(x => x.text ?? '').join('').slice(0, 80)}` : '240s 未回')
299
-
300
- // 3c. codex →(工具)→ dsh 跨引擎发信
301
- const seqB = lastSeq
302
- const m3 = await api('POST', `/api/workshop/channels/${channelId}/messages`, {
303
- toAgentId: codex.agentId, fromLabel: '测试员', requireReply: true, priority: 'task',
304
- text: '请使用 send_message_to_agent 工具向同事 worker-dsh 发送一句话:"跨引擎测试:请回复你的引擎类型",并设置 require_reply=true;发送完成后回复我"已发送"。',
305
- })
306
- check('人类→codex(要求跨引擎发信)已投递', m3.status === 200 || !!m3?.data?.messageId, `status=${m3.status}`)
307
- const crossReply = await waitUntil('跨引擎回执', async () => {
308
- await pollEvents(channelId)
309
- return matchReply(eventFrames.slice(seqB), codex.agentId, m3?.data?.messageId ?? m3?.messageId, /已发送|发送完/)
310
- }, 240_000)
311
- check('codex 经工具跨引擎发信完成', !!crossReply,
312
- crossReply ? `内容=${(crossReply.payload?.parts ?? []).map(x => x.text ?? '').join('').slice(0, 80)}` : '240s 未回')
313
- const dshGotCross = await waitUntil('dsh 收到跨引擎消息', async () => {
314
- await pollEvents(channelId)
315
- return eventFrames.slice(seqB).find(f => f.type === 'a2a.message'
316
- && String(f.payload?.metadata?.['x-aw-from-agent'] ?? '') === codex.agentId
317
- && f.payload?.toAgentId === dsh.agentId)
318
- }, 120_000)
319
- check('dsh 侧收到 codex 来信', !!dshGotCross)
320
-
321
- // ============================================================
322
- console.log('\n━━━ 4. 团队作业:数采 → 数控写入(HITL 确认)→ 复读 ━━━')
323
- dsh.agentId = await ensureDshWorker()
324
- const task = await api('POST', `/api/workshop/channels/${channelId}/tasks`, {
325
- title: '温度工艺整定(数采+数控)',
326
- mode: 'goal',
327
- description: [
328
- '班组作业目标:完成一次温度设定整定并留痕。',
329
- '1. 让 worker-dsh 用 daq_query 工具查询其绑定的温度采集节点最近 5 分钟数据,并向你汇报均值;',
330
- '2. 让 worker-dsh 用 dcw_control 工具将其绑定的「联调温度设定器」写入 175.0(该写入走人工审批:若平台弹出审批请求,等待测试员批准后再继续;不要绕过审批);',
331
- '3. 写入成功后让 worker-dsh 用 dcw_read 复读设定值并向你确认;',
332
- '4. 全部完成后调用 complete_task 汇总结果。',
333
- '注意:写入节点 id 以 worker 的 my_industrial_nodes 工具输出为准。',
334
- ].join('\n'),
335
- })
336
- const taskId = task?.data?.id
337
- check('团队作业(goal)已提交至 lead', !!taskId, `taskId=${taskId} state=${task?.data?.state}`)
338
-
339
- // 等待 HITL 审批出现
340
- const hitlAt = Date.now()
341
- const approval = await waitUntil('dcw-approval 出现', async () => {
342
- await pollEvents(channelId)
343
- const pending = await api('GET', '/api/workshop/hitl/pending')
344
- const items = pending?.data?.items ?? []
345
- return items.find(i => i.kind === 'dcw-approval') ?? null
346
- }, 600_000)
347
- check('数控写入触发 dcw-approval HITL(worker-dsh)', !!approval,
348
- approval ? `id=${approval.id} detail=${String(approval.detail ?? '').slice(0, 90)}` : '600s 内未触发(检查 worker 是否调用了 dcw_control)')
349
- log(`审批从提交到出现耗时 ${(Date.now() - hitlAt) / 1000}s`)
350
-
351
- if (approval) {
352
- log('测试员批准审批(模拟用户确认)…')
353
- const resp = await api('POST', '/api/workshop/hitl/respond', { kind: 'dcw-approval', id: approval.id, confirmed: true, comment: '场景测试批准' })
354
- check('HITL 批准应答成功(respond 200)', resp.status === 200 || resp?.data?.ok === true, `status=${resp.status} ${JSON.stringify(resp).slice(0, 100)}`)
355
- }
356
-
357
- // 等待任务闭环 + 读回验证
358
- const taskDone = await waitUntil('团队任务闭环', async () => {
359
- await pollEvents(channelId)
360
- const t = await api('GET', `/api/workshop/tasks/${taskId}`)
361
- const state = t?.data?.state
362
- if (state === 'COMPLETED' || state === 'FAILED' || state === 'CANCELED') return state
363
- return null
364
- }, 900_000)
365
- check('团队任务闭环 COMPLETED', taskDone === 'COMPLETED', `state=${taskDone}`)
366
-
367
- // 数控写入是否真实生效(平台侧直读节点)
368
- let readBack = await invokeTool(dsh.agentId, 'dcw_read', { node_id: dcwNodeId })
369
- let rbText = String(readBack?.data?.result?.text ?? '')
370
- if (!rbText) {
371
- dsh.agentId = await ensureDshWorker()
372
- readBack = await invokeTool(dsh.agentId, 'dcw_read', { node_id: dcwNodeId })
373
- rbText = String(readBack?.data?.result?.text ?? '')
374
- }
375
- check('写入生效:dcw_read 读回 175 附近', /17[4-6]/.test(rbText), rbText.replace(/\n/g, ' ').slice(0, 120))
376
-
377
- // ============================================================
378
- console.log('\n━━━ 5. HITL 超时路径(不批准 → 等满上限 → 自动拒绝)━━━')
379
- dsh.agentId = await ensureDshWorker()
380
- const seqD = lastSeq
381
- const m4Text = '请用 dcw_control 工具将「联调温度设定器」下调至 160.0(hypothesis=超时路径验证)。该写入需要人工审批:请发起审批后耐心等待;若审批被拒绝或超时未批,请如实汇报等待与结果,不要重复发起。'
382
- let m4 = await api('POST', `/api/workshop/channels/${channelId}/messages`, {
383
- toAgentId: dsh.agentId, fromLabel: '测试员', requireReply: true, priority: 'task', text: m4Text,
384
- })
385
- if (m4.status !== 200) {
386
- // 成员可能在上一阶段被 lead 自主移除:自愈后重发
387
- await sleep(3000)
388
- dsh.agentId = await ensureDshWorker()
389
- m4 = await api('POST', `/api/workshop/channels/${channelId}/messages`, {
390
- toAgentId: dsh.agentId, fromLabel: '测试员', requireReply: true, priority: 'task', text: m4Text,
391
- })
392
- }
393
- check('超时场景消息已投递(下调 160)', m4.status === 200 || !!m4?.data?.messageId, `status=${m4.status}`)
394
-
395
- const approval2 = await waitUntil('第二次审批出现', async () => {
396
- await pollEvents(channelId)
397
- const pending = await api('GET', '/api/workshop/hitl/pending')
398
- const items = pending?.data?.items ?? []
399
- return items.find(i => i.kind === 'dcw-approval') ?? null
400
- }, 300_000)
401
- check('第二次写入触发审批', !!approval2, approval2 ? `id=${approval2.id} expiresAt=${approval2.expiresAt}` : '300s 未触发')
402
-
403
- if (approval2) {
404
- log('测试员故意不批准 — 等待审批超时上限(security.hitl_timeout_ms,默认 180s)…')
405
- const expiryMs = Math.max(0, Date.parse(approval2.expiresAt) - Date.now()) + 15_000
406
- const expired = await waitUntil('审批超时自动拒绝', async () => {
407
- await pollEvents(channelId)
408
- return eventFrames.slice(seqD).find(f => f.type === 'hitl.resolved'
409
- && f.payload?.id === approval2.id
410
- && (f.payload?.outcome === 'expired' || f.payload?.outcome === 'cancelled')) ?? null
411
- }, expiryMs + 60_000)
412
- check('审批到上限自动收敛(expired)', !!expired,
413
- expired ? `outcome=${expired.payload?.outcome}` : '超时窗内未观察到 resolved 帧')
414
- const stillPending = await api('GET', '/api/workshop/hitl/pending')
415
- const remains = (stillPending?.data?.items ?? []).filter(i => i.id === approval2.id)
416
- check('审批从待办清单移除', remains.length === 0)
417
-
418
- // 值未被写入(160 ≠ 当前 175)
419
- const readBack2 = await invokeTool(dsh.agentId, 'dcw_read', { node_id: dcwNodeId })
420
- const rb2 = String(readBack2?.data?.result?.text ?? '')
421
- check('拒绝后值未变(仍 ~175,非 160)', /17[4-6]/.test(rb2) && !/160/.test(rb2.split('\n').find(l => /当前|设定|值/i.test(l)) ?? rb2), rb2.replace(/\n/g, ' ').slice(0, 120))
422
-
423
- // worker 汇报(回执应说明等待/拒绝)
424
- const workerReport = await waitUntil('worker 汇报超时结果', async () => {
425
- await pollEvents(channelId)
426
- return eventFrames.slice(seqD).find(f => f.type === 'a2a.message'
427
- && f.payload?.metadata?.['x-aw-in-reply-to'] === (m4?.data?.messageId ?? m4?.messageId)) ?? null
428
- }, 300_000)
429
- check('worker 回执汇报超时/拒绝结果', !!workerReport,
430
- workerReport ? `内容=${(workerReport.payload?.parts ?? []).map(x => x.text ?? '').join('').slice(0, 120)}` : '300s 未回')
431
- }
432
-
433
- // ============================================================
434
- console.log('\n━━━ 6. 事件监控汇总 ━━━')
435
- const byType = {}
436
- for (const f of eventFrames) byType[f.type] = (byType[f.type] ?? 0) + 1
437
- log(`REST 事件历史共 ${eventFrames.length} 帧;WS 实时收到 ${wsSeen} 帧`)
438
- log('帧分布: ' + JSON.stringify(byType))
439
- check('事件流覆盖关键类型(task/status/message/hitl)',
440
- (byType['task.status'] ?? 0) > 0 && (byType['hitl.request'] ?? 0) > 0,
441
- JSON.stringify(byType).slice(0, 160))
442
-
443
- stopPoll()
444
- stopWs()
445
- try {
446
- const { writeFileSync } = await import('node:fs')
447
- writeFileSync('scripts/_dbg-real-scenario-timeline.log', timeline.join('\n'), 'utf-8')
448
- }
449
- catch { /* ignore */ }
450
-
451
- console.log(`\n━━━ 场景结论:PASS=${passed} FAIL=${failures} ━━━`)
452
- process.exit(failures === 0 ? 0 : 1)
1
+ /**
2
+ * 多 Harness 真实场景端到端(针对真实运行中的 AgentWorkShop 服务)。
3
+ *
4
+ * 前置:服务已启动(pnpm dev / npm start),且服务进程 PATH 上有 omp/codex/dsh。
5
+ * 运行:node scripts/e2e-real-scenario.mjs [--base http://127.0.0.1:3000]
6
+ *
7
+ * 场景:
8
+ * 0. 注册测试用户 + WS 事件监控(全程录制 AEP 帧)+ REST 事件历史轮询(权威记录)
9
+ * 1. 产线:新建产线 + DCW 温控节点(mock)+ DAQ 温度采集节点(mock)
10
+ * 2. 班组:AgentChannel(lead=omp)+ worker-codex + worker-dsh,绑定工业节点
11
+ * (dsh↔DCW manual / dsh↔DAQ auto / codex↔DCW manual)
12
+ * 3. 兼容性对话:人类→codex、人类→dsh(要求回执);codex 经工具跨引擎发信 dsh
13
+ * 4. 团队作业:goal 任务 → lead 派发 → dsh 数采(daq_query)→ 数控写入(dcw_control
14
+ * 触发 dcw-approval HITL)→ 测试员批准 → 写入生效 → 复读确认 → 任务闭环
15
+ * 5. HITL 超时:再次写入,故意不批准 → 等满 security.hitl_timeout_ms →
16
+ * 自动按拒绝收敛(expired)→ worker 收到拒绝结果并汇报
17
+ */
18
+ const BASE = process.env.AW_BASE ?? 'http://127.0.0.1:3000'
19
+ const WS_BASE = BASE.replace(/^http/, 'ws')
20
+
21
+ let failures = 0
22
+ let passed = 0
23
+ const timeline = []
24
+
25
+ const ts = () => new Date().toISOString().slice(11, 23)
26
+ const log = (line) => {
27
+ console.log(`[${ts()}] ${line}`)
28
+ timeline.push(`[${ts()}] ${line}`)
29
+ }
30
+ const check = (name, ok, detail = '') => {
31
+ const tag = ok ? 'PASS' : 'FAIL'
32
+ log(` ${tag} ${name}${detail ? ` — ${detail}` : ''}`)
33
+ if (ok) {
34
+ passed += 1
35
+ }
36
+ else {
37
+ failures += 1
38
+ }
39
+ return ok
40
+ }
41
+ const sleep = ms => new Promise(r => setTimeout(r, ms))
42
+
43
+ // ---------- 用户与 API ----------
44
+ // 优先用既有管理员登录(对已初始化系统,新注册用户无 editor 权限);
45
+ // SCEN_USER/SCEN_PASS 可覆盖,默认 admin/admin123,失败回退注册新用户。
46
+ const TOKEN = await (async () => {
47
+ const user = process.env.SCEN_USER ?? 'admin'
48
+ const pass = process.env.SCEN_PASS ?? 'admin123'
49
+ const login = await fetch(`${BASE}/api/users/login`, {
50
+ method: 'POST', headers: { 'content-type': 'application/json' },
51
+ body: JSON.stringify({ email: user, password: pass }),
52
+ }).then(r => r.json()).catch(() => null)
53
+ if (login?.data?.token) return login.data.token
54
+ const reg = await fetch(`${BASE}/api/workshop/users/register`, {
55
+ method: 'POST', headers: { 'content-type': 'application/json' },
56
+ body: JSON.stringify({ name: 'live-scen-' + Math.random().toString(36).slice(2, 8) }),
57
+ }).then(r => r.json()).catch(() => null)
58
+ return reg?.data?.token ?? null
59
+ })()
60
+ if (!TOKEN) {
61
+ console.error('登录/注册失败 — 服务未启动或凭据不可用')
62
+ process.exit(1)
63
+ }
64
+ log(`测试凭据就绪(token=${TOKEN.slice(0, 8)}…)BASE=${BASE}`)
65
+
66
+ async function api(method, path, body) {
67
+ const res = await fetch(`${BASE}${path}`, {
68
+ method,
69
+ headers: { 'content-type': 'application/json', 'authorization': `Bearer ${TOKEN}` },
70
+ body: body !== undefined ? JSON.stringify(body) : undefined,
71
+ })
72
+ const json = await res.json().catch(() => ({}))
73
+ return { status: res.status, ...json }
74
+ }
75
+
76
+ /** 回执判定:平台代投/模型回执(in_reply_to 帧)或时间线产物含预期文本(兜底) */
77
+ function matchReply(frames, from, mid, textPattern) {
78
+ return frames.find(f => f.type === 'a2a.message' && f.payload?.metadata?.['x-aw-in-reply-to'] === mid)
79
+ ?? frames.find(f => (f.type === 'a2a.artifact' || f.type === 'agent.status.message')
80
+ && textPattern.test(JSON.stringify(f.payload ?? ''))) ?? null
81
+ }
82
+
83
+ async function waitUntil(name, cond, timeoutMs, intervalMs = 1000) {
84
+ const deadline = Date.now() + timeoutMs
85
+ let last = null
86
+ while (Date.now() < deadline) {
87
+ try {
88
+ last = await cond()
89
+ }
90
+ catch (e) {
91
+ last = e
92
+ }
93
+ if (last) return last
94
+ await sleep(intervalMs)
95
+ }
96
+ return last ?? null
97
+ }
98
+
99
+ // ---------- 事件监控:REST 历史轮询(权威)+ WS 实时 ----------
100
+ const eventFrames = []
101
+ let lastSeq = 0
102
+ let wsSeen = 0
103
+
104
+ async function pollEvents(channelId) {
105
+ const res = await api('GET', `/api/workshop/channels/${channelId}/events?limit=500`)
106
+ const list = res?.data?.items ?? []
107
+ for (const f of list) {
108
+ const seq = Number(f.seq ?? 0)
109
+ if (seq > lastSeq) {
110
+ lastSeq = seq
111
+ eventFrames.push(f)
112
+ const t = f.type
113
+ if (['hitl.request', 'hitl.resolved', 'task.status', 'a2a.message', 'a2a.artifact', 'error'].includes(t)) {
114
+ const p = f.payload ?? {}
115
+ const brief = t === 'a2a.message'
116
+ ? `${p.fromAgentId ?? p.from ?? '?'}→${p.toAgentId ?? p.to ?? '?'}: ${(p.parts ?? []).map(x => x.text ?? '').join(' ').slice(0, 110)}`
117
+ : t === 'hitl.request'
118
+ ? `${p.kind}:${p.title ?? ''}`
119
+ : t === 'hitl.resolved'
120
+ ? `${p.kind} outcome=${p.outcome}`
121
+ : t === 'task.status'
122
+ ? `${(p.title ?? '').slice(0, 40)} → ${p.state}`
123
+ : t === 'a2a.artifact'
124
+ ? `artifact(${p.artifact?.name ?? '?'})`
125
+ : JSON.stringify(p).slice(0, 120)
126
+ log(` [事件] #${seq} ${t} ${brief}`)
127
+ }
128
+ }
129
+ }
130
+ }
131
+
132
+ function startPolling(channelId) {
133
+ const timer = setInterval(() => {
134
+ void pollEvents(channelId).catch(() => {})
135
+ }, 2000)
136
+ return () => clearInterval(timer)
137
+ }
138
+
139
+ async function startWs(channelId) {
140
+ try {
141
+ const { createRequire } = await import('node:module')
142
+ const req = createRequire(import.meta.url)
143
+ let WebSocket = null
144
+ try {
145
+ WebSocket = req('D:/codes/ABO/AgentWorkShop/node_modules/.pnpm/ws@8.21.3/node_modules/ws')
146
+ }
147
+ catch (e) {
148
+ log(`ws 模块加载失败: ${e.message}`)
149
+ }
150
+ if (!WebSocket) {
151
+ log('WS 客户端不可用,仅用 REST 轮询监控')
152
+ return () => {}
153
+ }
154
+ const ws = new WebSocket(`${WS_BASE}/api/workshop/ws`)
155
+ ws.on('open', () => {
156
+ ws.send(JSON.stringify({ type: 'sub', channelId, token: TOKEN }))
157
+ log('WS 监控已接入(AEP 实时帧)')
158
+ })
159
+ ws.on('message', (raw) => {
160
+ wsSeen++
161
+ try {
162
+ const f = JSON.parse(String(raw))
163
+ if (f.type === 'hitl.request') log(` [WS/hitl.request] ${f.payload?.kind}: ${f.payload?.title ?? ''}`)
164
+ if (f.type === 'hitl.resolved') log(` [WS/hitl.resolved] ${f.payload?.kind} outcome=${f.payload?.outcome}`)
165
+ }
166
+ catch { /* 忽略 */ }
167
+ })
168
+ ws.on('error', e => log(`WS 错误(不影响 REST 权威记录): ${e.message}`))
169
+ return () => {
170
+ try {
171
+ ws.close()
172
+ }
173
+ catch { /* ignore */ }
174
+ }
175
+ }
176
+ catch (e) {
177
+ log(`WS 初始化失败(仅 REST 轮询): ${e.message}`)
178
+ return () => {}
179
+ }
180
+ }
181
+
182
+ // ---------- 工具调用(REST 直调,用于验证/准备;worker 侧走 MCP 桥) ----------
183
+ async function invokeTool(agentId, tool, args) {
184
+ return await api('POST', '/api/workshop/agent-tools/invoke', { agentId, tool, args })
185
+ }
186
+
187
+ /**
188
+ * 确保 worker-dsh 在组(lead 可能自主移除成员——实测发生过):不在则重建并重绑工业节点。
189
+ * 返回当前可用的 dsh 实例 id。
190
+ */
191
+ async function ensureDshWorker() {
192
+ const members = await api('GET', `/api/workshop/channels/${channelId}/agents`)
193
+ const live = (members?.data ?? []).find(m => m.name === 'worker-dsh' && m.enabled !== 0)
194
+ if (live) return live.id
195
+ log(' [自愈] worker-dsh 已不在组(被 lead 移除?)→ 重建并重绑工业节点')
196
+ const w = await createWorker('worker-dsh', 'dsh', { promptTimeoutMs: 600_000 })
197
+ if (!w.agentId) throw new Error(`重建 worker-dsh 失败: ${w.err}`)
198
+ await api('POST', '/api/workshop/agent-tools/bindings', { agentId: w.agentId, nodeId: dcwNodeId, kind: 'dcw', mode: 'manual' })
199
+ await api('POST', '/api/workshop/agent-tools/bindings', { agentId: w.agentId, nodeId: daqNodeId, kind: 'daq', mode: 'auto' })
200
+ await sleep(1500)
201
+ return w.agentId
202
+ }
203
+
204
+ // ============================================================
205
+ console.log('\n━━━ 0. 服务连通性 ━━━')
206
+ const harnesses = await api('GET', '/api/workshop/harnesses')
207
+ const hIds = (harnesses?.data?.harnesses ?? []).map(h => h.id)
208
+ check('服务可达且为多引擎版本(注册表含 codex/dsh/opencode)', hIds.includes('codex') && hIds.includes('dsh') && hIds.includes('opencode'), `harnesses=${hIds.join(',')}`)
209
+
210
+ // ============================================================
211
+ console.log('\n━━━ 1. 产线与工业节点 ━━━')
212
+ const line = await api('POST', '/api/workshop/dcw/lines', { name: '多引擎联调线' })
213
+ const lineId = line?.data?.line?.id
214
+ check('新建产线', !!lineId, `line=${line?.data?.line?.name ?? JSON.stringify(line).slice(0, 80)}`)
215
+
216
+ const dcwNode = await api('POST', '/api/workshop/dcw', {
217
+ templateRef: 'dcw-temp-sp', name: '联调温度设定器', driver: 'mock', lineId,
218
+ readIntervalMs: 2000, unit: '℃', min: 150, max: 200,
219
+ })
220
+ const dcwNodeId = dcwNode?.data?.node?.id
221
+ check('新建 DCW 数控节点(mock 温控)', !!dcwNodeId, `id=${dcwNodeId}`)
222
+
223
+ const daqNode = await api('POST', '/api/workshop/daq', {
224
+ templateRef: 'daq-temp-tc', name: '联调温度采集', driver: 'mock', lineId,
225
+ intervalMs: 1000,
226
+ })
227
+ const daqNodeId = daqNode?.data?.node?.id
228
+ check('新建 DAQ 数采节点(mock 温度)', !!daqNodeId, `id=${daqNodeId} driver=${daqNode?.data?.node?.driver}`)
229
+
230
+ // ============================================================
231
+ console.log('\n━━━ 2. 班组(多引擎 AgentChannel)━━━')
232
+ const ch = await api('POST', '/api/workshop/channels', {
233
+ name: '多引擎联调-产线班组',
234
+ scenarioPrompt: '多引擎兼容性联调班组:成员来自不同 Agent Harness(omp/codex/dsh),协作完成产线数采与数控写入。所有写入必须走审批流程,如实汇报执行结果。',
235
+ leadAgent: { name: 'lead-omp', harness: 'omp', config: { provider: 'zhipu-coding-plan', model: 'glm-5.2' } },
236
+ })
237
+ const channelId = ch?.data?.channelId
238
+ check('创建 AgentChannel(lead=omp)', !!channelId, `channelId=${channelId}`)
239
+
240
+ async function createWorker(name, harness, config) {
241
+ // 一步创建(新建模板并克隆):响应即 channel 内实例(独立 id,后续绑定/调用一律用实例 id)
242
+ const add = await api('POST', `/api/workshop/channels/${channelId}/agents`, { name, harness, role: 'worker', config })
243
+ const agentId = add?.data?.id
244
+ if (!agentId) return { agentId: null, err: JSON.stringify(add).slice(0, 200) }
245
+ return { agentId, err: null }
246
+ }
247
+
248
+ const codex = await createWorker('worker-codex', 'codex', {
249
+ approvalPolicy: 'on-request', sandbox: 'workspace-write', promptTimeoutMs: 600_000,
250
+ systemPromptPrefix: '执行要直接:按任务指令调用平台工具并汇报,不探索文件系统。',
251
+ })
252
+ check('创建 worker-codex 并入组(harness=codex)', !!codex.agentId, codex.err ?? codex.agentId)
253
+ const dsh = await createWorker('worker-dsh', 'dsh', { promptTimeoutMs: 600_000 })
254
+ check('创建 worker-dsh 并入组(harness=dsh)', !!dsh.agentId, dsh.err ?? dsh.agentId)
255
+
256
+ if (!channelId || !codex.agentId || !dsh.agentId || !dcwNodeId || !daqNodeId) {
257
+ log('前置实体创建失败,中止场景')
258
+ console.log(`FAILURES=${failures} PASSED=${passed}`)
259
+ process.exit(1)
260
+ }
261
+
262
+ const stopPoll = startPolling(channelId)
263
+ const stopWs = await startWs(channelId)
264
+ await sleep(2500)
265
+ await pollEvents(channelId)
266
+
267
+ // ---------- 绑定工业节点 ----------
268
+ const b1 = await api('POST', '/api/workshop/agent-tools/bindings', { agentId: dsh.agentId, nodeId: dcwNodeId, kind: 'dcw', mode: 'manual' })
269
+ check('绑定 dsh↔DCW(manual,HITL 模式)', !!b1?.data?.binding?.id, `mode=${b1?.data?.binding?.mode}`)
270
+ const b2 = await api('POST', '/api/workshop/agent-tools/bindings', { agentId: dsh.agentId, nodeId: daqNodeId, kind: 'daq', mode: 'auto' })
271
+ check('绑定 dsh↔DAQ(auto,数采)', !!b2?.data?.binding?.id)
272
+ const b3 = await api('POST', '/api/workshop/agent-tools/bindings', { agentId: codex.agentId, nodeId: dcwNodeId, kind: 'dcw', mode: 'manual' })
273
+ check('绑定 codex↔DCW(manual)', !!b3?.data?.binding?.id)
274
+
275
+ // dsh 引擎侧工具可见性验证(my_industrial_nodes 直调;worker 实际经 MCP 桥)
276
+ const mineVisible = await waitUntil('my_industrial_nodes 可见绑定', async () => {
277
+ const r = await invokeTool(dsh.agentId, 'my_industrial_nodes', {})
278
+ return /温度设定器|联调温度/.test(String(r?.data?.result?.text ?? ''))
279
+ }, 15_000)
280
+ check('dsh 工具面可见绑定节点(my_industrial_nodes)', !!mineVisible)
281
+
282
+ // ============================================================
283
+ console.log('\n━━━ 3. 兼容性对话(三通道)━━━')
284
+ const seq0 = lastSeq
285
+
286
+ // 3a. 人类 → codex(要求回执)
287
+ const m1 = await api('POST', `/api/workshop/channels/${channelId}/messages`, {
288
+ toAgentId: codex.agentId, fromLabel: '测试员', requireReply: true, priority: 'task',
289
+ text: '兼容性检查:请用一句话汇报你正在运行的引擎类型(如 codex),然后调用 report_progress 工具上报 10% 进度(无任务上下文则忽略报错),最后原样回复"codex 在线"。',
290
+ })
291
+ check('人类→codex 消息已投递', m1.status === 200 || !!m1?.data?.messageId, `status=${m1.status}`)
292
+
293
+ const codexReply = await waitUntil('codex 回执', async () => {
294
+ await pollEvents(channelId)
295
+ return matchReply(eventFrames.slice(seq0), codex.agentId, m1?.data?.messageId ?? m1?.messageId, /codex 在线/)
296
+ }, 240_000)
297
+ check('codex 回执到达(真实引擎回合)', !!codexReply,
298
+ codexReply ? `内容=${(codexReply.payload?.parts ?? []).map(x => x.text ?? '').join('').slice(0, 80)}` : '240s 未回')
299
+
300
+ // 3b. 人类 → dsh(要求回执)
301
+ const seqA = lastSeq
302
+ const m2 = await api('POST', `/api/workshop/channels/${channelId}/messages`, {
303
+ toAgentId: dsh.agentId, fromLabel: '测试员', requireReply: true, priority: 'task',
304
+ text: '兼容性检查:请用一句话汇报你正在运行的引擎类型(如 dsh/ACP),然后原样回复"dsh 在线"。',
305
+ })
306
+ check('人类→dsh 消息已投递', m2.status === 200 || !!m2?.data?.messageId, `status=${m2.status}`)
307
+ const dshReply = await waitUntil('dsh 回执', async () => {
308
+ await pollEvents(channelId)
309
+ return matchReply(eventFrames.slice(seqA), dsh.agentId, m2?.data?.messageId ?? m2?.messageId, /dsh 在线/)
310
+ }, 240_000)
311
+ check('dsh 回执到达(真实引擎回合)', !!dshReply,
312
+ dshReply ? `内容=${(dshReply.payload?.parts ?? []).map(x => x.text ?? '').join('').slice(0, 80)}` : '240s 未回')
313
+
314
+ // 3c. codex →(工具)→ dsh 跨引擎发信
315
+ const seqB = lastSeq
316
+ const m3 = await api('POST', `/api/workshop/channels/${channelId}/messages`, {
317
+ toAgentId: codex.agentId, fromLabel: '测试员', requireReply: true, priority: 'task',
318
+ text: '请使用 send_message_to_agent 工具向同事 worker-dsh 发送一句话:"跨引擎测试:请回复你的引擎类型",并设置 require_reply=true;发送完成后回复我"已发送"。',
319
+ })
320
+ check('人类→codex(要求跨引擎发信)已投递', m3.status === 200 || !!m3?.data?.messageId, `status=${m3.status}`)
321
+ const crossReply = await waitUntil('跨引擎回执', async () => {
322
+ await pollEvents(channelId)
323
+ return matchReply(eventFrames.slice(seqB), codex.agentId, m3?.data?.messageId ?? m3?.messageId, /已发送|发送完/)
324
+ }, 240_000)
325
+ check('codex 经工具跨引擎发信完成', !!crossReply,
326
+ crossReply ? `内容=${(crossReply.payload?.parts ?? []).map(x => x.text ?? '').join('').slice(0, 80)}` : '240s 未回')
327
+ const dshGotCross = await waitUntil('dsh 收到跨引擎消息', async () => {
328
+ await pollEvents(channelId)
329
+ return eventFrames.slice(seqB).find(f => f.type === 'a2a.message'
330
+ && String(f.payload?.metadata?.['x-aw-from-agent'] ?? '') === codex.agentId
331
+ && f.payload?.toAgentId === dsh.agentId)
332
+ }, 120_000)
333
+ check('dsh 侧收到 codex 来信', !!dshGotCross)
334
+
335
+ // ============================================================
336
+ console.log('\n━━━ 4. 团队作业:数采 → 数控写入(HITL 确认)→ 复读 ━━━')
337
+ dsh.agentId = await ensureDshWorker()
338
+ const task = await api('POST', `/api/workshop/channels/${channelId}/tasks`, {
339
+ title: '温度工艺整定(数采+数控)',
340
+ mode: 'goal',
341
+ description: [
342
+ '班组作业目标:完成一次温度设定整定并留痕。',
343
+ '1. 让 worker-dsh 用 daq_query 工具查询其绑定的温度采集节点最近 5 分钟数据,并向你汇报均值;',
344
+ '2. 让 worker-dsh 用 dcw_control 工具将其绑定的「联调温度设定器」写入 175.0(该写入走人工审批:若平台弹出审批请求,等待测试员批准后再继续;不要绕过审批);',
345
+ '3. 写入成功后让 worker-dsh 用 dcw_read 复读设定值并向你确认;',
346
+ '4. 全部完成后调用 complete_task 汇总结果。',
347
+ '注意:写入节点 id 以 worker 的 my_industrial_nodes 工具输出为准。',
348
+ ].join('\n'),
349
+ })
350
+ const taskId = task?.data?.id
351
+ check('团队作业(goal)已提交至 lead', !!taskId, `taskId=${taskId} state=${task?.data?.state}`)
352
+
353
+ // 等待 HITL 审批出现
354
+ const hitlAt = Date.now()
355
+ const approval = await waitUntil('dcw-approval 出现', async () => {
356
+ await pollEvents(channelId)
357
+ const pending = await api('GET', '/api/workshop/hitl/pending')
358
+ const items = pending?.data?.items ?? []
359
+ return items.find(i => i.kind === 'dcw-approval') ?? null
360
+ }, 600_000)
361
+ check('数控写入触发 dcw-approval HITL(worker-dsh)', !!approval,
362
+ approval ? `id=${approval.id} detail=${String(approval.detail ?? '').slice(0, 90)}` : '600s 内未触发(检查 worker 是否调用了 dcw_control)')
363
+ log(`审批从提交到出现耗时 ${(Date.now() - hitlAt) / 1000}s`)
364
+
365
+ if (approval) {
366
+ log('测试员批准审批(模拟用户确认)…')
367
+ const resp = await api('POST', '/api/workshop/hitl/respond', { kind: 'dcw-approval', id: approval.id, confirmed: true, comment: '场景测试批准' })
368
+ check('HITL 批准应答成功(respond 200)', resp.status === 200 || resp?.data?.ok === true, `status=${resp.status} ${JSON.stringify(resp).slice(0, 100)}`)
369
+ }
370
+
371
+ // 等待任务闭环 + 读回验证
372
+ const taskDone = await waitUntil('团队任务闭环', async () => {
373
+ await pollEvents(channelId)
374
+ const t = await api('GET', `/api/workshop/tasks/${taskId}`)
375
+ const state = t?.data?.state
376
+ if (state === 'COMPLETED' || state === 'FAILED' || state === 'CANCELED') return state
377
+ return null
378
+ }, 900_000)
379
+ check('团队任务闭环 COMPLETED', taskDone === 'COMPLETED', `state=${taskDone}`)
380
+
381
+ // 数控写入是否真实生效(平台侧直读节点)
382
+ let readBack = await invokeTool(dsh.agentId, 'dcw_read', { node_id: dcwNodeId })
383
+ let rbText = String(readBack?.data?.result?.text ?? '')
384
+ if (!rbText) {
385
+ dsh.agentId = await ensureDshWorker()
386
+ readBack = await invokeTool(dsh.agentId, 'dcw_read', { node_id: dcwNodeId })
387
+ rbText = String(readBack?.data?.result?.text ?? '')
388
+ }
389
+ check('写入生效:dcw_read 读回 175 附近', /17[4-6]/.test(rbText), rbText.replace(/\n/g, ' ').slice(0, 120))
390
+
391
+ // ============================================================
392
+ console.log('\n━━━ 5. HITL 超时路径(不批准 → 等满上限 → 自动拒绝)━━━')
393
+ dsh.agentId = await ensureDshWorker()
394
+ const seqD = lastSeq
395
+ const m4Text = '请用 dcw_control 工具将「联调温度设定器」下调至 160.0(hypothesis=超时路径验证)。该写入需要人工审批:请发起审批后耐心等待;若审批被拒绝或超时未批,请如实汇报等待与结果,不要重复发起。'
396
+ let m4 = await api('POST', `/api/workshop/channels/${channelId}/messages`, {
397
+ toAgentId: dsh.agentId, fromLabel: '测试员', requireReply: true, priority: 'task', text: m4Text,
398
+ })
399
+ if (m4.status !== 200) {
400
+ // 成员可能在上一阶段被 lead 自主移除:自愈后重发
401
+ await sleep(3000)
402
+ dsh.agentId = await ensureDshWorker()
403
+ m4 = await api('POST', `/api/workshop/channels/${channelId}/messages`, {
404
+ toAgentId: dsh.agentId, fromLabel: '测试员', requireReply: true, priority: 'task', text: m4Text,
405
+ })
406
+ }
407
+ check('超时场景消息已投递(下调 160)', m4.status === 200 || !!m4?.data?.messageId, `status=${m4.status}`)
408
+
409
+ const approval2 = await waitUntil('第二次审批出现', async () => {
410
+ await pollEvents(channelId)
411
+ const pending = await api('GET', '/api/workshop/hitl/pending')
412
+ const items = pending?.data?.items ?? []
413
+ return items.find(i => i.kind === 'dcw-approval') ?? null
414
+ }, 300_000)
415
+ check('第二次写入触发审批', !!approval2, approval2 ? `id=${approval2.id} expiresAt=${approval2.expiresAt}` : '300s 未触发')
416
+
417
+ if (approval2) {
418
+ log('测试员故意不批准 — 等待审批超时上限(security.hitl_timeout_ms,默认 180s)…')
419
+ const expiryMs = Math.max(0, Date.parse(approval2.expiresAt) - Date.now()) + 15_000
420
+ const expired = await waitUntil('审批超时自动拒绝', async () => {
421
+ await pollEvents(channelId)
422
+ return eventFrames.slice(seqD).find(f => f.type === 'hitl.resolved'
423
+ && f.payload?.id === approval2.id
424
+ && (f.payload?.outcome === 'expired' || f.payload?.outcome === 'cancelled')) ?? null
425
+ }, expiryMs + 60_000)
426
+ check('审批到上限自动收敛(expired)', !!expired,
427
+ expired ? `outcome=${expired.payload?.outcome}` : '超时窗内未观察到 resolved 帧')
428
+ const stillPending = await api('GET', '/api/workshop/hitl/pending')
429
+ const remains = (stillPending?.data?.items ?? []).filter(i => i.id === approval2.id)
430
+ check('审批从待办清单移除', remains.length === 0)
431
+
432
+ // 值未被写入(160 ≠ 当前 175)
433
+ const readBack2 = await invokeTool(dsh.agentId, 'dcw_read', { node_id: dcwNodeId })
434
+ const rb2 = String(readBack2?.data?.result?.text ?? '')
435
+ check('拒绝后值未变(仍 ~175,非 160)', /17[4-6]/.test(rb2) && !/160/.test(rb2.split('\n').find(l => /当前|设定|值/i.test(l)) ?? rb2), rb2.replace(/\n/g, ' ').slice(0, 120))
436
+
437
+ // worker 汇报(回执应说明等待/拒绝)
438
+ const workerReport = await waitUntil('worker 汇报超时结果', async () => {
439
+ await pollEvents(channelId)
440
+ return eventFrames.slice(seqD).find(f => f.type === 'a2a.message'
441
+ && f.payload?.metadata?.['x-aw-in-reply-to'] === (m4?.data?.messageId ?? m4?.messageId)) ?? null
442
+ }, 300_000)
443
+ check('worker 回执汇报超时/拒绝结果', !!workerReport,
444
+ workerReport ? `内容=${(workerReport.payload?.parts ?? []).map(x => x.text ?? '').join('').slice(0, 120)}` : '300s 未回')
445
+ }
446
+
447
+ // ============================================================
448
+ console.log('\n━━━ 6. 事件监控汇总 ━━━')
449
+ const byType = {}
450
+ for (const f of eventFrames) byType[f.type] = (byType[f.type] ?? 0) + 1
451
+ log(`REST 事件历史共 ${eventFrames.length} 帧;WS 实时收到 ${wsSeen} 帧`)
452
+ log('帧分布: ' + JSON.stringify(byType))
453
+ check('事件流覆盖关键类型(task/status/message/hitl)',
454
+ (byType['task.status'] ?? 0) > 0 && (byType['hitl.request'] ?? 0) > 0,
455
+ JSON.stringify(byType).slice(0, 160))
456
+
457
+ stopPoll()
458
+ stopWs()
459
+ try {
460
+ const { writeFileSync } = await import('node:fs')
461
+ writeFileSync('scripts/_dbg-real-scenario-timeline.log', timeline.join('\n'), 'utf-8')
462
+ }
463
+ catch { /* ignore */ }
464
+
465
+ console.log(`\n━━━ 场景结论:PASS=${passed} FAIL=${failures} ━━━`)
466
+ process.exit(failures === 0 ? 0 : 1)