agentworkshop 0.7.5 → 0.7.7

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 (519) hide show
  1. package/.AgentWorkShop/prompts/host-tools.json +1 -1
  2. package/.output/.AgentWorkShop/prompts/host-tools.json +1 -1
  3. package/.output/nitro.json +1 -1
  4. package/.output/public/_nuxt/{rzGB_ojX.js → 3612gD2V.js} +2 -2
  5. package/.output/public/_nuxt/8eIQAVlb.js +1 -0
  6. package/.output/public/_nuxt/Ah9qOv1m.js +1 -0
  7. package/.output/public/_nuxt/{DdPeifHR.js → B4Fia4FB.js} +1 -1
  8. package/.output/public/_nuxt/B7aqqzkY.js +1 -0
  9. package/.output/public/_nuxt/BJ-fxrSw.js +1 -0
  10. package/.output/public/_nuxt/{DPDqAD1e.js → BSXx2vqR.js} +1 -1
  11. package/.output/public/_nuxt/{CdSgfcYR.js → BVZjSVs2.js} +1 -1
  12. package/.output/public/_nuxt/{DP6bdyIp.js → BVzDoF8t.js} +1 -1
  13. package/.output/public/_nuxt/BYL0Rjqj.js +7 -0
  14. package/.output/public/_nuxt/{CXmkVXS5.js → BjVLsC3M.js} +1 -1
  15. package/.output/public/_nuxt/{7ZABjMRh2.js → BkfchkK62.js} +1 -1
  16. package/.output/public/_nuxt/BnVoQ74r.js +1 -0
  17. package/.output/public/_nuxt/Bnp4vIAf.js +1 -0
  18. package/.output/public/_nuxt/BsMpJf7S.js +70 -0
  19. package/.output/public/_nuxt/{Z8k0uMSI.js → Bt_HDizI.js} +1 -1
  20. package/.output/public/_nuxt/Bu-P92Pe.js +18 -0
  21. package/.output/public/_nuxt/ButLXkjo.js +2 -0
  22. package/.output/public/_nuxt/C-GarxYC.js +1 -0
  23. package/.output/public/_nuxt/{D8DDDzV62.js → C2iWjzEC2.js} +1 -1
  24. package/.output/public/_nuxt/{HWXLx5Hz.js → C8dxXc6K.js} +5 -5
  25. package/.output/public/_nuxt/CGdPdJPP.js +1 -0
  26. package/.output/public/_nuxt/{CyygA0q4.js → CQiKcuoG.js} +4 -4
  27. package/.output/public/_nuxt/{CN7Zh8GQ.js → CRGlf1Gb.js} +1 -1
  28. package/.output/public/_nuxt/{DSBfvCi5.js → CblLEiCZ.js} +7 -7
  29. package/.output/public/_nuxt/Cd15nPnG2.js +1 -0
  30. package/.output/public/_nuxt/{OwJ1LJkF.js → CsCpu2Zh.js} +1 -1
  31. package/.output/public/_nuxt/CvbHIGQY2.js +1 -0
  32. package/.output/public/_nuxt/Cyk3du4K2.js +1 -0
  33. package/.output/public/_nuxt/{DVQAz9WI.js → D4qXvjuV.js} +2 -2
  34. package/.output/public/_nuxt/{CfIXY-ET.js → DCEyMaN-.js} +1 -1
  35. package/.output/public/_nuxt/{BFYNhG9S.js → DCXIGxzT.js} +1 -1
  36. package/.output/public/_nuxt/{B9aPoQvt.js → DM8DS9MA.js} +1 -1
  37. package/.output/public/_nuxt/{ChnfyQHz.js → DNzaswei.js} +1 -1
  38. package/.output/public/_nuxt/{CrFGZYVB2.js → DYZBdSSg2.js} +1 -1
  39. package/.output/public/_nuxt/{dObsRdSQ.js → DZk24ego.js} +1 -1
  40. package/.output/public/_nuxt/DeYsUzhr.js +1 -0
  41. package/.output/public/_nuxt/Dk6pq9JB2.js +1 -0
  42. package/.output/public/_nuxt/{ByGNWgAr.js → Do88WZG2.js} +3 -3
  43. package/.output/public/_nuxt/{R_WxTozV2.js → Du-eSpo2.js} +1 -1
  44. package/.output/public/_nuxt/OmpTerminalPanel.B_Pl5Ynm.css +1 -0
  45. package/.output/public/_nuxt/{Bsc69G4x.js → VnIWJ0ts.js} +3 -3
  46. package/.output/public/_nuxt/_id_.BzKMZnLe.css +1 -0
  47. package/.output/public/_nuxt/_id_.CbpDAWRh.css +1 -0
  48. package/.output/public/_nuxt/{_wsId_.DET_GinP.css → _wsId_.COUzMXpP.css} +1 -1
  49. package/.output/public/_nuxt/agents.BlejnOOC.css +1 -0
  50. package/.output/public/_nuxt/builds/latest.json +1 -1
  51. package/.output/public/_nuxt/builds/meta/14df171d-89cb-43ec-ad6f-9df72d6da7f5.json +1 -0
  52. package/.output/public/_nuxt/daq.zZ8GR433.css +1 -0
  53. package/.output/public/_nuxt/{default.D17kXlD6.css → default.V3_hUJq1.css} +1 -1
  54. package/.output/public/_nuxt/{B4GHHF6d2.js → fQUs58kX2.js} +1 -1
  55. package/.output/public/_nuxt/p7wSGMtc.js +1 -0
  56. package/.output/public/_nuxt/tRBT-plo.js +1 -0
  57. package/.output/server/chunks/_/SearchOutlined.mjs +4 -4
  58. package/.output/server/chunks/_/SearchOutlined.mjs.map +1 -1
  59. package/.output/server/chunks/_/character-asset.repo.mjs +3 -6
  60. package/.output/server/chunks/_/character-asset.repo.mjs.map +1 -1
  61. package/.output/server/chunks/_/host-bindings.mjs +1 -1
  62. package/.output/server/chunks/_/nitro.mjs +4967 -2035
  63. package/.output/server/chunks/_/nitro.mjs.map +1 -1
  64. package/.output/server/chunks/_/scene-layout.repo.mjs +4 -10
  65. package/.output/server/chunks/_/scene-layout.repo.mjs.map +1 -1
  66. package/.output/server/chunks/build/{Col-D7fjGDF6.mjs → Col-biaNnEPf.mjs} +2 -2
  67. package/.output/server/chunks/build/{Col-D7fjGDF6.mjs.map → Col-biaNnEPf.mjs.map} +1 -1
  68. package/.output/server/chunks/build/{OmpTerminalPanel-B_SYhmgb.mjs → OmpTerminalPanel-COphA1br.mjs} +20 -19
  69. package/.output/server/chunks/build/OmpTerminalPanel-COphA1br.mjs.map +1 -0
  70. package/.output/server/chunks/build/{TownView-Bl8Gkcxi.mjs → TownView-B5KifIaT.mjs} +4 -4
  71. package/.output/server/chunks/build/{TownView-Bl8Gkcxi.mjs.map → TownView-B5KifIaT.mjs.map} +1 -1
  72. package/.output/server/chunks/build/{_id_-GnRJPykX.mjs → _id_-C-ewLgfl.mjs} +119 -119
  73. package/.output/server/chunks/build/{_id_-GnRJPykX.mjs.map → _id_-C-ewLgfl.mjs.map} +1 -1
  74. package/.output/server/chunks/build/{_id_-CWLFGZjV.mjs → _id_-Ct4Jhvl1.mjs} +42 -38
  75. package/.output/server/chunks/build/_id_-Ct4Jhvl1.mjs.map +1 -0
  76. package/.output/server/chunks/build/{_wsId_-BhQMjyHG.mjs → _wsId_-CanI_6Su.mjs} +591 -53
  77. package/.output/server/chunks/build/{_wsId_-BhQMjyHG.mjs.map → _wsId_-CanI_6Su.mjs.map} +1 -1
  78. package/.output/server/chunks/build/{agents-D4l1icvn.mjs → agents-DSOptxXA.mjs} +146 -91
  79. package/.output/server/chunks/build/agents-DSOptxXA.mjs.map +1 -0
  80. package/.output/server/chunks/build/{alert-gH-s7yIh.mjs → alert-qJnjyRcP.mjs} +3 -3
  81. package/.output/server/chunks/build/{alert-gH-s7yIh.mjs.map → alert-qJnjyRcP.mjs.map} +1 -1
  82. package/.output/server/chunks/build/{button-BhbX5ACI.mjs → button-DEcZFcqN.mjs} +3 -3
  83. package/.output/server/chunks/build/{button-BhbX5ACI.mjs.map → button-DEcZFcqN.mjs.map} +1 -1
  84. package/.output/server/chunks/build/{card-l4BbX67w.mjs → card-Dipvaykh.mjs} +5 -5
  85. package/.output/server/chunks/build/{card-l4BbX67w.mjs.map → card-Dipvaykh.mjs.map} +1 -1
  86. package/.output/server/chunks/build/{channel-templates-DqjtC-R0.mjs → channel-templates-BK0KuPOd.mjs} +13 -12
  87. package/.output/server/chunks/build/channel-templates-BK0KuPOd.mjs.map +1 -0
  88. package/.output/server/chunks/build/{checkbox-BF11p3dH.mjs → checkbox-dzcpU_Cd.mjs} +4 -4
  89. package/.output/server/chunks/build/{checkbox-BF11p3dH.mjs.map → checkbox-dzcpU_Cd.mjs.map} +1 -1
  90. package/.output/server/chunks/build/{daq-BOgpn9sl.mjs → daq-D9RA_uze.mjs} +102 -102
  91. package/.output/server/chunks/build/{daq-BOgpn9sl.mjs.map → daq-D9RA_uze.mjs.map} +1 -1
  92. package/.output/server/chunks/build/dcw-BTM5YU-B.mjs +1 -1
  93. package/.output/server/chunks/build/{default-CKJWhkot.mjs → default-BfWGTlbj.mjs} +81 -23
  94. package/.output/server/chunks/build/{default-CKJWhkot.mjs.map → default-BfWGTlbj.mjs.map} +1 -1
  95. package/.output/server/chunks/build/{drawer-CVValqoh.mjs → drawer-Cmh90erI.mjs} +3 -3
  96. package/.output/server/chunks/build/{drawer-CVValqoh.mjs.map → drawer-Cmh90erI.mjs.map} +1 -1
  97. package/.output/server/chunks/build/{dropdown-ByCsEWlQ.mjs → dropdown-CGQ0KAzA.mjs} +2 -2
  98. package/.output/server/chunks/build/{dropdown-ByCsEWlQ.mjs.map → dropdown-CGQ0KAzA.mjs.map} +1 -1
  99. package/.output/server/chunks/build/{dropdown-Dex8PXu6.mjs → dropdown-vhn1NPFs.mjs} +4 -4
  100. package/.output/server/chunks/build/{dropdown-Dex8PXu6.mjs.map → dropdown-vhn1NPFs.mjs.map} +1 -1
  101. package/.output/server/chunks/build/{input-number-BBlRoAJ7.mjs → input-number-Bd55elNN.mjs} +5 -5
  102. package/.output/server/chunks/build/{input-number-BBlRoAJ7.mjs.map → input-number-Bd55elNN.mjs.map} +1 -1
  103. package/.output/server/chunks/build/{input--KMeLYqZ.mjs → input-sf_BT6o6.mjs} +3 -3
  104. package/.output/server/chunks/build/{input--KMeLYqZ.mjs.map → input-sf_BT6o6.mjs.map} +1 -1
  105. package/.output/server/chunks/build/logs-Dyk0I2I9.mjs +1 -1
  106. package/.output/server/chunks/build/{menu-xN-SXb9Q.mjs → menu-WCrlpYVh.mjs} +3 -3
  107. package/.output/server/chunks/build/{menu-xN-SXb9Q.mjs.map → menu-WCrlpYVh.mjs.map} +1 -1
  108. package/.output/server/chunks/build/{modal-DrCOcjrl.mjs → modal-yvUquPj5.mjs} +4 -4
  109. package/.output/server/chunks/build/{modal-DrCOcjrl.mjs.map → modal-yvUquPj5.mjs.map} +1 -1
  110. package/.output/server/chunks/build/{monitor-KW8WLOJd.mjs → monitor-MIOvsyLa.mjs} +21 -21
  111. package/.output/server/chunks/build/{monitor-KW8WLOJd.mjs.map → monitor-MIOvsyLa.mjs.map} +1 -1
  112. package/.output/server/chunks/build/pages-DR2bzczM.mjs +1 -1
  113. package/.output/server/chunks/build/{plugins-B-ZNey0Z.mjs → plugins-DnOBIWGg.mjs} +7 -7
  114. package/.output/server/chunks/build/{plugins-B-ZNey0Z.mjs.map → plugins-DnOBIWGg.mjs.map} +1 -1
  115. package/.output/server/chunks/build/{popconfirm-C5H1Qoh3.mjs → popconfirm-CRaHcz5O.mjs} +4 -4
  116. package/.output/server/chunks/build/{popconfirm-C5H1Qoh3.mjs.map → popconfirm-CRaHcz5O.mjs.map} +1 -1
  117. package/.output/server/chunks/build/{useWorkshopApi-Bh5VUHWu.mjs → segmented-DPe9ZzLO.mjs} +7 -78
  118. package/.output/server/chunks/build/segmented-DPe9ZzLO.mjs.map +1 -0
  119. package/.output/server/chunks/build/{select-D7H2ysgT.mjs → select-D-CeE5vY.mjs} +3 -3
  120. package/.output/server/chunks/build/{select-D7H2ysgT.mjs.map → select-D-CeE5vY.mjs.map} +1 -1
  121. package/.output/server/chunks/build/{settings-Cr06lbRy.mjs → settings-DA8IkGLo.mjs} +11 -11
  122. package/.output/server/chunks/build/{settings-Cr06lbRy.mjs.map → settings-DA8IkGLo.mjs.map} +1 -1
  123. package/.output/server/chunks/build/{space-DCwIlnkI.mjs → space-CCBYAkXt.mjs} +2 -2
  124. package/.output/server/chunks/build/{space-DCwIlnkI.mjs.map → space-CCBYAkXt.mjs.map} +1 -1
  125. package/.output/server/chunks/build/{switch-VC0m9ede.mjs → switch-CelRXpcy.mjs} +3 -3
  126. package/.output/server/chunks/build/{switch-VC0m9ede.mjs.map → switch-CelRXpcy.mjs.map} +1 -1
  127. package/.output/server/chunks/build/{table-BksLg3Q_.mjs → table-Cswq-l2r.mjs} +10 -10
  128. package/.output/server/chunks/build/{table-BksLg3Q_.mjs.map → table-Cswq-l2r.mjs.map} +1 -1
  129. package/.output/server/chunks/build/{tabs-CzUfD3iX.mjs → tabs-BM3tAh_J.mjs} +5 -5
  130. package/.output/server/chunks/build/{tabs-CzUfD3iX.mjs.map → tabs-BM3tAh_J.mjs.map} +1 -1
  131. package/.output/server/chunks/build/{tag-oQI3VtqM.mjs → tag-NO9jEqKy.mjs} +4 -4
  132. package/.output/server/chunks/build/{tag-oQI3VtqM.mjs.map → tag-NO9jEqKy.mjs.map} +1 -1
  133. package/.output/server/chunks/build/{teams-QR3BBF7A.mjs → teams-BhSKBBBM.mjs} +15 -14
  134. package/.output/server/chunks/build/teams-BhSKBBBM.mjs.map +1 -0
  135. package/.output/server/chunks/build/{tokens-DFvr_TLj.mjs → tokens-D_eyxmcv.mjs} +16 -16
  136. package/.output/server/chunks/build/{tokens-DFvr_TLj.mjs.map → tokens-D_eyxmcv.mjs.map} +1 -1
  137. package/.output/server/chunks/build/town-BUqRobze.mjs +1 -1
  138. package/.output/server/chunks/build/{town-_4tEEEVW.mjs → town-DPtOPRRO.mjs} +4 -4
  139. package/.output/server/chunks/build/{town-_4tEEEVW.mjs.map → town-DPtOPRRO.mjs.map} +1 -1
  140. package/.output/server/chunks/build/useLocalTime-9a4B-aHv.mjs +42 -0
  141. package/.output/server/chunks/build/useLocalTime-9a4B-aHv.mjs.map +1 -0
  142. package/.output/server/chunks/build/useWorkshopApi-D2gq06N2.mjs +81 -0
  143. package/.output/server/chunks/build/useWorkshopApi-D2gq06N2.mjs.map +1 -0
  144. package/.output/server/chunks/build/useWorkshopWs-B3j5wIAK.mjs +1 -1
  145. package/.output/server/chunks/build/user-Dk-ytEUV.mjs +1 -1
  146. package/.output/server/chunks/build/{users-4FZ0yFUO.mjs → users-CmVvb1oq.mjs} +16 -16
  147. package/.output/server/chunks/build/{users-4FZ0yFUO.mjs.map → users-CmVvb1oq.mjs.map} +1 -1
  148. package/.output/server/chunks/build/{workshop-k0XZTFKg.mjs → workshop-iCzNRifn.mjs} +9 -9
  149. package/.output/server/chunks/build/{workshop-k0XZTFKg.mjs.map → workshop-iCzNRifn.mjs.map} +1 -1
  150. package/.output/server/chunks/build/workspaces-IfORCDJE.mjs +1 -1
  151. package/.output/server/chunks/routes/api/health.get.mjs +1 -1
  152. package/.output/server/chunks/routes/api/index.get.mjs +1 -1
  153. package/.output/server/chunks/routes/api/index.post.mjs +1 -1
  154. package/.output/server/chunks/routes/api/mcp/workshop.mjs +1 -1
  155. package/.output/server/chunks/routes/api/metrics.mjs +1 -1
  156. package/.output/server/chunks/routes/api/plugins/_name/_...path_.mjs +1 -1
  157. package/.output/server/chunks/routes/api/plugins/client/_name_.get.mjs +1 -1
  158. package/.output/server/chunks/routes/api/plugins/manifest.get.mjs +1 -1
  159. package/.output/server/chunks/routes/api/system/config.get.mjs +1 -1
  160. package/.output/server/chunks/routes/api/system/index.get.mjs +3 -3
  161. package/.output/server/chunks/routes/api/system/index.get.mjs.map +1 -1
  162. package/.output/server/chunks/routes/api/system/index.patch.mjs +1 -1
  163. package/.output/server/chunks/routes/api/system/monitor/terminal/ws.mjs +1 -1
  164. package/.output/server/chunks/routes/api/system/monitor/terminate.post.mjs +1 -1
  165. package/.output/server/chunks/routes/api/system/monitor.get.mjs +1 -1
  166. package/.output/server/chunks/routes/api/system/settings/events.get.mjs +1 -1
  167. package/.output/server/chunks/routes/api/system/settings/reset.post.mjs +1 -1
  168. package/.output/server/chunks/routes/api/users/_id_.delete.mjs +1 -1
  169. package/.output/server/chunks/routes/api/users/_id_.get.mjs +1 -1
  170. package/.output/server/chunks/routes/api/users/_id_.put.mjs +1 -1
  171. package/.output/server/chunks/routes/api/users/index.get.mjs +1 -1
  172. package/.output/server/chunks/routes/api/users/index.post.mjs +1 -1
  173. package/.output/server/chunks/routes/api/users/login.post.mjs +1 -1
  174. package/.output/server/chunks/routes/api/users/logout.post.mjs +1 -1
  175. package/.output/server/chunks/routes/api/users/me.get.mjs +1 -1
  176. package/.output/server/chunks/routes/api/users/register.post.mjs +1 -1
  177. package/.output/server/chunks/routes/api/users/tokens/_id/token.get.mjs +1 -1
  178. package/.output/server/chunks/routes/api/users/tokens/_id_.delete.mjs +1 -1
  179. package/.output/server/chunks/routes/api/users/tokens/_id_.patch.mjs +1 -1
  180. package/.output/server/chunks/routes/api/workshop/_...path_.mjs +1 -1
  181. package/.output/server/chunks/routes/api/workshop/a2a/_agentId/index.get.mjs +1 -1
  182. package/.output/server/chunks/routes/api/workshop/a2a/_agentId/index.post.mjs +1 -1
  183. package/.output/server/chunks/routes/api/workshop/a2a/send.post.mjs +1 -1
  184. package/.output/server/chunks/routes/api/workshop/agent-tools/approvals/_id/decide.post.mjs +1 -1
  185. package/.output/server/chunks/routes/api/workshop/agent-tools/bindings/_id_.delete.mjs +1 -1
  186. package/.output/server/chunks/routes/api/workshop/agent-tools/bindings/_id_.patch.mjs +1 -1
  187. package/.output/server/chunks/routes/api/workshop/agent-tools/index.get.mjs +1 -1
  188. package/.output/server/chunks/routes/api/workshop/agent-tools/index.post.mjs +1 -1
  189. package/.output/server/chunks/routes/api/workshop/agent-tools/index2.get.mjs +1 -1
  190. package/.output/server/chunks/routes/api/workshop/agent-tools/invoke.post.mjs +6 -14
  191. package/.output/server/chunks/routes/api/workshop/agent-tools/invoke.post.mjs.map +1 -1
  192. package/.output/server/chunks/routes/api/workshop/agent-tools/list.get.mjs +39 -0
  193. package/.output/server/chunks/routes/api/workshop/agent-tools/list.get.mjs.map +1 -0
  194. package/.output/server/chunks/routes/api/workshop/agents/_id_.delete.mjs +1 -1
  195. package/.output/server/chunks/routes/api/workshop/agents/_id_.get.mjs +1 -1
  196. package/.output/server/chunks/routes/api/workshop/agents/_id_.patch.mjs +1 -1
  197. package/.output/server/chunks/routes/api/workshop/agents/subscribe.post.mjs +1 -1
  198. package/.output/server/chunks/routes/api/workshop/approvals/_id/decide.post.mjs +1 -1
  199. package/.output/server/chunks/routes/api/workshop/assets/character/_id_.delete.mjs +1 -1
  200. package/.output/server/chunks/routes/api/workshop/assets/devices/_id_.delete.mjs +1 -1
  201. package/.output/server/chunks/routes/api/workshop/assets/index.get.mjs +1 -1
  202. package/.output/server/chunks/routes/api/workshop/assets/index.post.mjs +2 -2
  203. package/.output/server/chunks/routes/api/workshop/assets/index2.get.mjs +1 -1
  204. package/.output/server/chunks/routes/api/workshop/assets/index2.post.mjs +2 -2
  205. package/.output/server/chunks/routes/api/workshop/audit.get.mjs +1 -1
  206. package/.output/server/chunks/routes/api/workshop/caller.mjs +1 -1
  207. package/.output/server/chunks/routes/api/workshop/channel-templates/_id/instantiate.post.mjs +2 -2
  208. package/.output/server/chunks/routes/api/workshop/channel-templates/_id_.delete.mjs +1 -1
  209. package/.output/server/chunks/routes/api/workshop/channel-templates/_id_.get.mjs +1 -1
  210. package/.output/server/chunks/routes/api/workshop/channel-templates/_id_.patch.mjs +1 -1
  211. package/.output/server/chunks/routes/api/workshop/channel-templates/from-channel.post.mjs +1 -1
  212. package/.output/server/chunks/routes/api/workshop/channels/_id/activate.post.mjs +2 -2
  213. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/index.get.mjs +1 -1
  214. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/index.post.mjs +1 -1
  215. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/memories/_memoryId_.delete.mjs +1 -1
  216. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/memories/search.post.mjs +1 -1
  217. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/model.patch.mjs +1 -1
  218. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/position.patch.mjs +1 -1
  219. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/range.patch.mjs +1 -1
  220. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/stop.post.mjs +1 -1
  221. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId_.delete.mjs +1 -1
  222. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId_.patch.mjs +1 -1
  223. package/.output/server/chunks/routes/api/workshop/channels/_id/events.get.mjs +1 -1
  224. package/.output/server/chunks/routes/api/workshop/channels/_id/index.get.mjs +1 -1
  225. package/.output/server/chunks/routes/api/workshop/channels/_id/index.post.mjs +2 -2
  226. package/.output/server/chunks/routes/api/workshop/channels/_id/index2.get.mjs +1 -1
  227. package/.output/server/chunks/routes/api/workshop/channels/_id/index2.post.mjs +1 -1
  228. package/.output/server/chunks/routes/api/workshop/channels/_id/index3.get.mjs +1 -1
  229. package/.output/server/chunks/routes/api/workshop/channels/_id/index3.post.mjs +1 -1
  230. package/.output/server/chunks/routes/api/workshop/channels/_id/index4.get.mjs +1 -1
  231. package/.output/server/chunks/routes/api/workshop/channels/_id/index4.post.mjs +1 -1
  232. package/.output/server/chunks/routes/api/workshop/channels/_id/memories/_memoryId_.delete.mjs +1 -1
  233. package/.output/server/chunks/routes/api/workshop/channels/_id/queue.get.mjs +1 -1
  234. package/.output/server/chunks/routes/api/workshop/channels/_id/terminals.get.mjs +2 -2
  235. package/.output/server/chunks/routes/api/workshop/channels/_id_.delete.mjs +1 -1
  236. package/.output/server/chunks/routes/api/workshop/channels/index.get.mjs +2 -2
  237. package/.output/server/chunks/routes/api/workshop/channels/index.patch.mjs +9 -2
  238. package/.output/server/chunks/routes/api/workshop/channels/index.patch.mjs.map +1 -1
  239. package/.output/server/chunks/routes/api/workshop/channels.get.mjs +1 -1
  240. package/.output/server/chunks/routes/api/workshop/channels.post.mjs +2 -2
  241. package/.output/server/chunks/routes/api/workshop/daq/_id/bind.post.mjs +2 -2
  242. package/.output/server/chunks/routes/api/workshop/daq/_id/frames/content.get.mjs +2 -2
  243. package/.output/server/chunks/routes/api/workshop/daq/_id/frames.get.mjs +2 -2
  244. package/.output/server/chunks/routes/api/workshop/daq/_id/samples.get.mjs +6 -4
  245. package/.output/server/chunks/routes/api/workshop/daq/_id/samples.get.mjs.map +1 -1
  246. package/.output/server/chunks/routes/api/workshop/daq/_id/test.post.mjs +2 -2
  247. package/.output/server/chunks/routes/api/workshop/daq/_id_.delete.mjs +2 -2
  248. package/.output/server/chunks/routes/api/workshop/daq/_id_.patch.mjs +2 -2
  249. package/.output/server/chunks/routes/api/workshop/daq/alarms/_id/ack.post.mjs +2 -2
  250. package/.output/server/chunks/routes/api/workshop/daq/alarms.get.mjs +2 -2
  251. package/.output/server/chunks/routes/api/workshop/daq/controller.post.mjs +2 -2
  252. package/.output/server/chunks/routes/api/workshop/daq/index.post.mjs +2 -2
  253. package/.output/server/chunks/routes/api/workshop/daq/infra/reconnect.post.mjs +2 -2
  254. package/.output/server/chunks/routes/api/workshop/daq/infra.get.mjs +2 -2
  255. package/.output/server/chunks/routes/api/workshop/daq/templates/_key_.delete.mjs +2 -2
  256. package/.output/server/chunks/routes/api/workshop/daq/templates/_key_.patch.mjs +2 -2
  257. package/.output/server/chunks/routes/api/workshop/daq/test-driver.post.mjs +2 -2
  258. package/.output/server/chunks/routes/api/workshop/dcw/_id/bind.post.mjs +2 -2
  259. package/.output/server/chunks/routes/api/workshop/dcw/_id/param-ledger.get.mjs +2 -2
  260. package/.output/server/chunks/routes/api/workshop/dcw/_id/read.post.mjs +2 -2
  261. package/.output/server/chunks/routes/api/workshop/dcw/_id/test.post.mjs +2 -2
  262. package/.output/server/chunks/routes/api/workshop/dcw/_id/write.post.mjs +2 -2
  263. package/.output/server/chunks/routes/api/workshop/dcw/_id_.delete.mjs +2 -2
  264. package/.output/server/chunks/routes/api/workshop/dcw/_id_.patch.mjs +2 -2
  265. package/.output/server/chunks/routes/api/workshop/dcw/controller.post.mjs +2 -2
  266. package/.output/server/chunks/routes/api/workshop/dcw/index.get.mjs +2 -2
  267. package/.output/server/chunks/routes/api/workshop/dcw/index.post.mjs +2 -2
  268. package/.output/server/chunks/routes/api/workshop/dcw/index2.get.mjs +2 -2
  269. package/.output/server/chunks/routes/api/workshop/dcw/index2.post.mjs +2 -2
  270. package/.output/server/chunks/routes/api/workshop/dcw/index3.get.mjs +2 -2
  271. package/.output/server/chunks/routes/api/workshop/dcw/index3.post.mjs +2 -2
  272. package/.output/server/chunks/routes/api/workshop/dcw/index4.get.mjs +2 -2
  273. package/.output/server/chunks/routes/api/workshop/dcw/index4.post.mjs +2 -2
  274. package/.output/server/chunks/routes/api/workshop/dcw/index5.get.mjs +2 -2
  275. package/.output/server/chunks/routes/api/workshop/dcw/journal/node/_nodeId/rollback.post.mjs +2 -2
  276. package/.output/server/chunks/routes/api/workshop/dcw/line/query.get.mjs +2 -2
  277. package/.output/server/chunks/routes/api/workshop/dcw/lines/_id/start.post.mjs +2 -2
  278. package/.output/server/chunks/routes/api/workshop/dcw/lines/_id/stop.post.mjs +2 -2
  279. package/.output/server/chunks/routes/api/workshop/dcw/lines/_id_.delete.mjs +2 -2
  280. package/.output/server/chunks/routes/api/workshop/dcw/lines/_id_.patch.mjs +2 -2
  281. package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id/judge.post.mjs +2 -2
  282. package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id/rollback.post.mjs +2 -2
  283. package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id/series.get.mjs +2 -2
  284. package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id_.get.mjs +2 -2
  285. package/.output/server/chunks/routes/api/workshop/dcw/products/_id_.delete.mjs +2 -2
  286. package/.output/server/chunks/routes/api/workshop/dcw/products/_id_.patch.mjs +2 -2
  287. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/apply.post.mjs +2 -2
  288. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/mark-good.post.mjs +2 -2
  289. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/rollback-good.post.mjs +2 -2
  290. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id_.delete.mjs +2 -2
  291. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id_.patch.mjs +2 -2
  292. package/.output/server/chunks/routes/api/workshop/dcw/runs/_id/close.post.mjs +2 -2
  293. package/.output/server/chunks/routes/api/workshop/dcw/runs/_id/data.get.mjs +2 -2
  294. package/.output/server/chunks/routes/api/workshop/dcw/runs/_id/rollback.post.mjs +2 -2
  295. package/.output/server/chunks/routes/api/workshop/dcw/templates/_key_.delete.mjs +2 -2
  296. package/.output/server/chunks/routes/api/workshop/dcw/templates/_key_.patch.mjs +2 -2
  297. package/.output/server/chunks/routes/api/workshop/dcw/test-driver.post.mjs +2 -2
  298. package/.output/server/chunks/routes/api/workshop/device-twins/_id/control.post.mjs +1 -1
  299. package/.output/server/chunks/routes/api/workshop/device-twins/_id/telemetry.post.mjs +1 -1
  300. package/.output/server/chunks/routes/api/workshop/device-twins/_id_.delete.mjs +2 -2
  301. package/.output/server/chunks/routes/api/workshop/device-twins/_id_.patch.mjs +2 -2
  302. package/.output/server/chunks/routes/api/workshop/fs/dirs.get.mjs +1 -1
  303. package/.output/server/chunks/routes/api/workshop/harnesses/_id/providers.get.mjs +247 -0
  304. package/.output/server/chunks/routes/api/workshop/harnesses/_id/providers.get.mjs.map +1 -0
  305. package/.output/server/chunks/routes/api/workshop/harnesses.get.mjs +27 -0
  306. package/.output/server/chunks/routes/api/workshop/harnesses.get.mjs.map +1 -0
  307. package/.output/server/chunks/routes/api/workshop/hitl/pending.get.mjs +1 -1
  308. package/.output/server/chunks/routes/api/workshop/hitl/respond.post.mjs +19 -7
  309. package/.output/server/chunks/routes/api/workshop/hitl/respond.post.mjs.map +1 -1
  310. package/.output/server/chunks/routes/api/workshop/index.get.mjs +1 -1
  311. package/.output/server/chunks/routes/api/workshop/index.post.mjs +1 -1
  312. package/.output/server/chunks/routes/api/workshop/index10.get.mjs +1 -1
  313. package/.output/server/chunks/routes/api/workshop/index2.get.mjs +1 -1
  314. package/.output/server/chunks/routes/api/workshop/index2.post.mjs +1 -1
  315. package/.output/server/chunks/routes/api/workshop/index3.get.mjs +1 -1
  316. package/.output/server/chunks/routes/api/workshop/index3.post.mjs +2 -2
  317. package/.output/server/chunks/routes/api/workshop/index4.get.mjs +2 -2
  318. package/.output/server/chunks/routes/api/workshop/index4.post.mjs +2 -2
  319. package/.output/server/chunks/routes/api/workshop/index5.get.mjs +2 -2
  320. package/.output/server/chunks/routes/api/workshop/index5.post.mjs +2 -2
  321. package/.output/server/chunks/routes/api/workshop/index6.get.mjs +1 -1
  322. package/.output/server/chunks/routes/api/workshop/index6.post.mjs +2 -2
  323. package/.output/server/chunks/routes/api/workshop/index7.get.mjs +1 -1
  324. package/.output/server/chunks/routes/api/workshop/index7.post.mjs +1 -1
  325. package/.output/server/chunks/routes/api/workshop/index8.get.mjs +1 -1
  326. package/.output/server/chunks/routes/api/workshop/index8.post.mjs +1 -1
  327. package/.output/server/chunks/routes/api/workshop/index9.get.mjs +1 -1
  328. package/.output/server/chunks/routes/api/workshop/mailbox/all.get.mjs +1 -1
  329. package/.output/server/chunks/routes/api/workshop/mailbox.get.mjs +1 -1
  330. package/.output/server/chunks/routes/api/workshop/memories/maintenance.post.mjs +1 -1
  331. package/.output/server/chunks/routes/api/workshop/plugins/_name/disable.post.mjs +1 -1
  332. package/.output/server/chunks/routes/api/workshop/plugins/_name/enable.post.mjs +1 -1
  333. package/.output/server/chunks/routes/api/workshop/plugins/index.get.mjs +1 -1
  334. package/.output/server/chunks/routes/api/workshop/runtime.get.mjs +1 -1
  335. package/.output/server/chunks/routes/api/workshop/scene/layouts/_channelId_.delete.mjs +1 -1
  336. package/.output/server/chunks/routes/api/workshop/scene/layouts/_channelId_.put.mjs +1 -1
  337. package/.output/server/chunks/routes/api/workshop/scene/layouts.get.mjs +1 -1
  338. package/.output/server/chunks/routes/api/workshop/tasks/_id/complete.post.mjs +1 -1
  339. package/.output/server/chunks/routes/api/workshop/tasks/_id/dispatch.post.mjs +1 -1
  340. package/.output/server/chunks/routes/api/workshop/tasks/_id/index.post.mjs +1 -1
  341. package/.output/server/chunks/routes/api/workshop/tasks/_id/report.post.mjs +1 -1
  342. package/.output/server/chunks/routes/api/workshop/tasks/_id/retry.post.mjs +1 -1
  343. package/.output/server/chunks/routes/api/workshop/tasks/_id_.get.mjs +1 -1
  344. package/.output/server/chunks/routes/api/workshop/tasks.get.mjs +1 -1
  345. package/.output/server/chunks/routes/api/workshop/teams/_id/deploy.post.mjs +2 -2
  346. package/.output/server/chunks/routes/api/workshop/teams/_id/index.get.mjs +1 -1
  347. package/.output/server/chunks/routes/api/workshop/teams/_id/index.post.mjs +1 -1
  348. package/.output/server/chunks/routes/api/workshop/teams/_id/members/_agentId_.delete.mjs +1 -1
  349. package/.output/server/chunks/routes/api/workshop/teams/_id_.delete.mjs +1 -1
  350. package/.output/server/chunks/routes/api/workshop/teams/_id_.get.mjs +1 -1
  351. package/.output/server/chunks/routes/api/workshop/teams/_id_.patch.mjs +1 -1
  352. package/.output/server/chunks/routes/api/workshop/users/me.get.mjs +1 -1
  353. package/.output/server/chunks/routes/api/workshop/users/register.post.mjs +1 -1
  354. package/.output/server/chunks/routes/api/workshop/workspaces/_id/channel-templates/_tplId_.post.mjs +2 -2
  355. package/.output/server/chunks/routes/api/workshop/workspaces/_id/channels/_channelId_.delete.mjs +1 -1
  356. package/.output/server/chunks/routes/api/workshop/workspaces/_id/channels/_channelId_.post.mjs +1 -1
  357. package/.output/server/chunks/routes/api/workshop/workspaces/index.delete.mjs +1 -1
  358. package/.output/server/chunks/routes/renderer.mjs +1 -1
  359. package/.output/server/chunks/virtual/entry.mjs +123 -113
  360. package/.output/server/chunks/virtual/entry.mjs.map +1 -1
  361. package/.output/server/chunks/virtual/precomputed.mjs +1 -1
  362. package/.output/server/index.mjs +1 -1
  363. package/.output/server/package.json +1 -1
  364. package/app/components/AppHeader.vue +56 -2
  365. package/app/components/workshop/ChannelSessionList.vue +703 -593
  366. package/app/components/workshop/terminal/OmpTerminalPanel.vue +2 -1
  367. package/app/composables/workshop/useLocalTime.ts +16 -0
  368. package/app/composables/workshop/useSceneLayouts.ts +2 -1
  369. package/app/composables/workshop/useWorkshopApi.ts +249 -224
  370. package/app/pages/daq/[id].vue +7 -6
  371. package/app/pages/daq/index.vue +2 -2
  372. package/app/pages/dcw/[id].vue +3 -3
  373. package/app/pages/workshop/agents.vue +432 -382
  374. package/bin/aw.mjs +0 -0
  375. package/cli/aw.mjs +8 -1
  376. package/cli/commands/stop.mjs +111 -108
  377. package/cli/commands/tui.mjs +10 -1
  378. package/cli/core/registry.mjs +5 -3
  379. package/cli/infra.mjs +108 -109
  380. package/config.yml +134 -134
  381. package/docs/tui.md +1 -1
  382. package/i18n/locales/en.ts +5 -0
  383. package/i18n/locales/zh-CN.ts +5 -0
  384. package/package.json +148 -140
  385. package/scripts/_dbg-catalog-smoke.ts +20 -0
  386. package/scripts/_dbg-codex-probe.mjs +58 -0
  387. package/scripts/_dbg-dsh-probe.mjs +31 -0
  388. package/scripts/_dbg-interval-scenario.mjs +126 -0
  389. package/scripts/_dbg-line-spawn.ts +31 -0
  390. package/scripts/_dbg-live-engine-probe.mjs +80 -0
  391. package/scripts/_dbg-mcp-bridge-probe.mjs +147 -0
  392. package/scripts/_dbg-opencode-sse.mjs +101 -0
  393. package/scripts/_dbg-opencode-start.ts +57 -0
  394. package/scripts/_dbg-plugin-matrix.mjs +212 -0
  395. package/scripts/_dbg-protocol-matrix.mjs +425 -0
  396. package/scripts/_dbg-real-scenario-timeline.log +123 -0
  397. package/scripts/_dbg-registry-smoke.ts +14 -0
  398. package/scripts/_dbg-sim-keeper.mjs +100 -0
  399. package/scripts/_dbg-team-drill.mjs +173 -0
  400. package/scripts/dev-guard.mjs +11 -3
  401. package/scripts/dev-protocol-simulators.mjs +28 -1
  402. package/scripts/e2e-multi-harness.ts +374 -0
  403. package/scripts/e2e-multiharness-team.mjs +319 -0
  404. package/scripts/e2e-plc-scenario.mjs +292 -0
  405. package/scripts/e2e-real-scenario.mjs +452 -0
  406. package/scripts/migrate-local-time.mjs +123 -0
  407. package/scripts/start.mjs +60 -9
  408. package/server/api/system/settings/index.get.ts +3 -3
  409. package/server/api/workshop/agent-tools/invoke.post.ts +27 -41
  410. package/server/api/workshop/agent-tools/list.get.ts +25 -0
  411. package/server/api/workshop/channels/[id]/index.patch.ts +38 -30
  412. package/server/api/workshop/daq/[id]/samples.get.ts +6 -3
  413. package/server/api/workshop/harnesses/[id]/providers.get.ts +16 -0
  414. package/server/api/workshop/harnesses.get.ts +12 -0
  415. package/server/api/workshop/hitl/respond.post.ts +87 -67
  416. package/server/api/workshop/ws.ts +13 -0
  417. package/server/data/daqs.json +1366 -16
  418. package/server/data/dcw-lines.json +266 -0
  419. package/server/data/dcw-products.json +203 -0
  420. package/server/data/dcw-recipes.json +784 -0
  421. package/server/data/dcw-rollback.json +1144 -1
  422. package/server/data/dcw-runs.json +983 -791
  423. package/server/data/dcw-writes.json +1080 -0
  424. package/server/data/dcws.json +3278 -203
  425. package/server/data/line-runs.json +52 -2
  426. package/server/harness/aw-mcp-bridge.mjs +153 -0
  427. package/server/plugins/00-local-time.ts +10 -0
  428. package/server/plugins/aw-plugins.ts +3 -0
  429. package/server/plugins/backup.ts +116 -97
  430. package/server/plugins/dev-stability-guard.ts +24 -15
  431. package/server/plugins/retention.ts +1 -0
  432. package/server/plugins/security.ts +24 -3
  433. package/server/plugins/workshop.ts +156 -153
  434. package/server/repositories/user.repository.ts +414 -391
  435. package/server/services/system-config.ts +30 -6
  436. package/server/services/workshop/.mimosa/hook-state/sess_fed429fb-c8b7-4a50-bbd6-45afc580893f.json +1 -0
  437. package/server/services/workshop/.mimosa/hook-status/sess_fed429fb-c8b7-4a50-bbd6-45afc580893f-e6b75bbfe6.json +14 -0
  438. package/server/services/workshop/agents/adapters/line-spawn.ts +108 -0
  439. package/server/services/workshop/agents/adapters/stdio-jsonrpc.ts +316 -0
  440. package/server/services/workshop/agents/agent-interface.ts +17 -0
  441. package/server/services/workshop/agents/codex-agent.ts +822 -0
  442. package/server/services/workshop/agents/dsh-agent.ts +670 -0
  443. package/server/services/workshop/agents/factory.ts +4 -16
  444. package/server/services/workshop/agents/harness-env.ts +54 -0
  445. package/server/services/workshop/agents/harness-models.ts +270 -0
  446. package/server/services/workshop/agents/host-tool-bridge.ts +592 -0
  447. package/server/services/workshop/agents/industrial-tools.ts +5 -1
  448. package/server/services/workshop/agents/node-bindings.repo.ts +4 -5
  449. package/server/services/workshop/agents/omp-agent.ts +1178 -1957
  450. package/server/services/workshop/agents/opencode-agent.ts +987 -0
  451. package/server/services/workshop/agents/prompt-builder.ts +393 -0
  452. package/server/services/workshop/agents/registry.ts +125 -0
  453. package/server/services/workshop/assets/character-asset.repo.ts +3 -5
  454. package/server/services/workshop/assets/device-twin.repo.ts +3 -5
  455. package/server/services/workshop/daq/daq-controller.ts +8 -4
  456. package/server/services/workshop/daq/daq-node.repo.ts +3 -5
  457. package/server/services/workshop/daq/daq-node.ts +2 -2
  458. package/server/services/workshop/daq/daq-templates.ts +3 -5
  459. package/server/services/workshop/daq/drivers.ts +41 -12
  460. package/server/services/workshop/daq/storage/sqlite.adapter.ts +313 -309
  461. package/server/services/workshop/db/backup-registry.ts +33 -0
  462. package/server/services/workshop/db/channel.repo.ts +104 -101
  463. package/server/services/workshop/db/database.ts +956 -949
  464. package/server/services/workshop/dcw/dcw-controller.ts +3 -1
  465. package/server/services/workshop/dcw/dcw-line.repo.ts +4 -11
  466. package/server/services/workshop/dcw/dcw-node.repo.ts +3 -5
  467. package/server/services/workshop/dcw/dcw-node.ts +13 -1
  468. package/server/services/workshop/dcw/dcw-product.repo.ts +3 -4
  469. package/server/services/workshop/dcw/dcw-recipe.repo.ts +3 -19
  470. package/server/services/workshop/dcw/dcw-templates.ts +3 -5
  471. package/server/services/workshop/dcw/drivers.ts +37 -13
  472. package/server/services/workshop/dcw/line-run.ts +3 -5
  473. package/server/services/workshop/dcw/recipe-rollback.repo.ts +4 -10
  474. package/server/services/workshop/json-store.mjs +72 -0
  475. package/server/services/workshop/plugins/host.mjs +2 -1
  476. package/server/services/workshop/runtime/agent-runtime.ts +44 -0
  477. package/server/services/workshop/runtime/manager.ts +2953 -2868
  478. package/server/services/workshop/scene/scene-layout.repo.ts +4 -11
  479. package/server/services/workshop/settings.ts +7 -0
  480. package/shared/config/schema.json +5 -0
  481. package/shared/config/single-instance.mjs +133 -86
  482. package/shared/local-time.mjs +36 -0
  483. package/shared/workshop-protocol.ts +11 -5
  484. package/tui/aw-tui.mjs +28 -10
  485. package/tui/components/hitl-card.mjs +47 -36
  486. package/tui/lib/config.mjs +62 -58
  487. package/tui/lib/ws.mjs +2 -1
  488. package/.output/public/_nuxt/9X0fVBD7.js +0 -57
  489. package/.output/public/_nuxt/B6M2WJWm2.js +0 -1
  490. package/.output/public/_nuxt/B9Yie5HN.js +0 -2
  491. package/.output/public/_nuxt/BF9XPEuw.js +0 -1
  492. package/.output/public/_nuxt/BbQornXa.js +0 -1
  493. package/.output/public/_nuxt/Bxgaym6j.js +0 -1
  494. package/.output/public/_nuxt/Bxh5nf8j.js +0 -1
  495. package/.output/public/_nuxt/CXLI50Sq.js +0 -1
  496. package/.output/public/_nuxt/CdfAP_IH2.js +0 -1
  497. package/.output/public/_nuxt/Ce1zyNYu.js +0 -1
  498. package/.output/public/_nuxt/D-Ne4C9a.js +0 -1
  499. package/.output/public/_nuxt/DEHNjlTq2.js +0 -1
  500. package/.output/public/_nuxt/DFnGFEav.js +0 -18
  501. package/.output/public/_nuxt/DYWgGHNo.js +0 -7
  502. package/.output/public/_nuxt/OmpTerminalPanel.Bc9GjNU5.css +0 -1
  503. package/.output/public/_nuxt/W1E3-5ML.js +0 -14
  504. package/.output/public/_nuxt/XVB9_zwP.js +0 -1
  505. package/.output/public/_nuxt/Xaf_HIR3.js +0 -1
  506. package/.output/public/_nuxt/_id_.BeqSLvl_.css +0 -1
  507. package/.output/public/_nuxt/_id_.DN3U6EF9.css +0 -1
  508. package/.output/public/_nuxt/agents.BJwgTLFZ.css +0 -1
  509. package/.output/public/_nuxt/builds/meta/55c10854-ee0e-4be4-924b-a1b0e100fe11.json +0 -1
  510. package/.output/public/_nuxt/daq.BXsnevQv.css +0 -1
  511. package/.output/public/_nuxt/yIKY_V1P.js +0 -1
  512. package/.output/server/chunks/build/OmpTerminalPanel-B_SYhmgb.mjs.map +0 -1
  513. package/.output/server/chunks/build/_id_-CWLFGZjV.mjs.map +0 -1
  514. package/.output/server/chunks/build/agents-D4l1icvn.mjs.map +0 -1
  515. package/.output/server/chunks/build/channel-templates-DqjtC-R0.mjs.map +0 -1
  516. package/.output/server/chunks/build/interval-WlxgjTzO.mjs +0 -9
  517. package/.output/server/chunks/build/interval-WlxgjTzO.mjs.map +0 -1
  518. package/.output/server/chunks/build/teams-QR3BBF7A.mjs.map +0 -1
  519. package/.output/server/chunks/build/useWorkshopApi-Bh5VUHWu.mjs.map +0 -1
@@ -0,0 +1,123 @@
1
+ [03:22:04.847] 测试用户已注册(token=ut-b725d…)BASE=http://127.0.0.1:3000
2
+ [03:22:04.968] PASS 服务可达且为多引擎版本(注册表含 codex/dsh/opencode) — harnesses=mock,omp,opencode,codex,dsh,claude
3
+ [03:22:05.003] PASS 新建产线 — line=多引擎联调线
4
+ [03:22:05.042] PASS 新建 DCW 数控节点(mock 温控) — id=dw-c5cc2e42
5
+ [03:22:05.050] PASS 新建 DAQ 数采节点(mock 温度) — id=dn-960ca8da driver=mock
6
+ [03:22:05.056] PASS 创建 AgentChannel(lead=omp) — channelId=7decac99-c3f6-45d7-820d-a571976c0381
7
+ [03:22:05.065] PASS 创建 worker-codex 并入组(harness=codex) — 051d24dc-2b2f-4f2e-94a5-0711b187866e
8
+ [03:22:05.078] PASS 创建 worker-dsh 并入组(harness=dsh) — 4eb98cb2-fcc9-4781-88c9-ca7cbc135d3d
9
+ [03:22:05.096] WS 监控已接入(AEP 实时帧)
10
+ [03:22:07.640] PASS 绑定 dsh↔DCW(manual,HITL 模式) — mode=manual
11
+ [03:22:07.646] PASS 绑定 dsh↔DAQ(auto,数采)
12
+ [03:22:07.652] PASS 绑定 codex↔DCW(manual)
13
+ [03:22:07.659] PASS dsh 工具面可见绑定节点(my_industrial_nodes) — #### ◆ 联调温度设定器 [id=dw-c5cc2e42] - 物理量: 烘箱温度设定,单位 ℃,精度 1 位小数 - 工艺语义: 烘箱/熔体温度设定:升高使热塑温度上升(成膜更均匀但能耗高、过热降解风险),降低则偏冷易厚度不均。调整后
14
+ [03:22:07.711] PASS 人类→codex 消息已投递 — status=200
15
+ [03:22:08.767] [事件] #3 a2a.message ?→?: 兼容性检查:请用一句话汇报你正在运行的引擎类型(如 codex),然后调用 report_progress 工具上报 10% 进度(无任务上下文则忽略报错),最后原样回复"codex 在线"。
16
+ [03:25:29.004] [事件] #32 a2a.artifact artifact(output)
17
+ [03:25:29.004] PASS codex 回执到达(真实引擎回合) — 内容=
18
+ [03:25:29.032] PASS 人类→dsh 消息已投递 — status=200
19
+ [03:25:29.891] [事件] #35 a2a.message ?→?: 兼容性检查:请用一句话汇报你正在运行的引擎类型(如 dsh/ACP),然后原样回复"dsh 在线"。
20
+ [03:25:39.365] [事件] #38 a2a.artifact artifact(output)
21
+ [03:25:39.365] PASS dsh 回执到达(真实引擎回合) — 内容=
22
+ [03:25:39.372] PASS 人类→codex(要求跨引擎发信)已投递 — status=200
23
+ [03:25:39.937] [事件] #41 a2a.message ?→?: 请使用 send_message_to_agent 工具向同事 worker-dsh 发送一句话:"跨引擎测试:请回复你的引擎类型",并设置 require_reply=true;发送完成后回复我"已发送"。
24
+ [03:27:03.462] [事件] #77 a2a.artifact artifact(output)
25
+ [03:27:03.462] PASS codex 经工具跨引擎发信完成 — 内容=
26
+ [03:29:03.828] FAIL dsh 侧收到 codex 来信
27
+ [03:29:03.878] PASS 团队作业(goal)已提交至 lead — taskId=2d2d0a82-1efd-4d8e-afb7-86fd4049e2ee state=SUBMITTED
28
+ [03:29:04.736] [事件] #81 task.status 温度工艺整定(数采+数控) → SUBMITTED
29
+ [03:29:04.736] [事件] #82 a2a.message ?→?:
30
+ [03:30:18.590] [事件] #84 task.status 温度工艺整定(数采+数控) → WORKING
31
+ [03:30:18.590] [事件] #85 task.status 温度工艺整定(数采+数控) → WAITING
32
+ [03:30:18.590] [事件] #86 task.status 温度工艺整定(数采+数控) → ASSIGNED
33
+ [03:30:18.590] [事件] #88 task.status 温度工艺整定(数采+数控) → WORKING
34
+ [03:31:50.861] [事件] #91 a2a.message ?→?: 【去重协调】你的任务 b1b6ba41「温度工艺整定(数采+数控)」与我的父任务 2d2d0a82 是同一作业目标(我已于 03:29:49 将正式执行子任务 0396b351 派给 worker-dsh:daq_que
35
+ [03:31:57.360] [事件] #92 a2a.message ?→?: 【单一执行路径声明】你队列中的子任务 0396b351「温度整定执行:数采均值查询+审批写入175.0+复读确认」是本次温度整定的唯一正式执行任务,按其步骤执行即可。
36
+ 注意:worker-codex 名下有一个同目标任务
37
+ [03:31:57.360] [事件] #94 task.status 温度整定执行:数采均值查询+审批写入175.0+复读确认 → WORKING
38
+ [03:32:31.864] [WS/hitl.request] dcw-approval: DCW 下发审批
39
+ [03:32:31.864] [WS/hitl.request] dcw-approval: DCW 下发审批
40
+ [03:32:31.864] [WS/hitl.request] dcw-approval: DCW 下发审批
41
+ [03:32:31.868] PASS 数控写入触发 dcw-approval HITL(worker-dsh) — id=ap-8c34b592 detail=联调温度设定器(烘箱温度设定)设定 175℃,安全量程 150~200℃
42
+ [03:32:31.869] 审批从提交到出现耗时 207.99s
43
+ [03:32:31.869] 测试员批准审批(模拟用户确认)…
44
+ [03:32:31.880] [WS/hitl.resolved] dcw-approval outcome=answered
45
+ [03:32:31.881] PASS HITL 批准应答成功(respond 200) — status=200 {"status":200,"code":0,"message":"ok","data":{"ok":true,"kind":"dcw-approval","id":"ap-8c34b592","ap
46
+ [03:32:31.881] [WS/hitl.resolved] dcw-approval outcome=answered
47
+ [03:32:31.881] [WS/hitl.resolved] dcw-approval outcome=answered
48
+ [03:32:32.959] [事件] #101 hitl.request dcw-approval:DCW 下发审批
49
+ [03:32:32.959] [事件] #102 hitl.resolved dcw-approval outcome=answered
50
+ [03:32:43.503] [事件] #105 a2a.message ?→?: 【温度整定执行汇报】任务 0396b351(三步:数采均值→审批写入175.0→复读确认)已完成,四项结果如下(数值均经标定、带时间,可复核):
51
+
52
+ ① 数采均值:最近5分钟窗口(2026-09-05T03:27~03:3
53
+ [03:32:46.626] [事件] #106 task.status 温度整定执行:数采均值查询+审批写入175.0+复读确认 → COMPLETED
54
+ [03:32:55.013] [事件] #112 a2a.artifact artifact(output)
55
+ [03:32:59.279] [事件] #115 a2a.message ?→?: 【收到,确认对齐】明白:0396b351 是本次温度整定的唯一正式执行任务。该任务我已按步骤完成并上报(COMPLETED,队列已空):审批写入 175.0℃ 一次成功,dcw_read 复读 ACT=SET=175℃
56
+ [03:33:01.388] [事件] #120 a2a.artifact artifact(output)
57
+ [03:33:18.184] [事件] #150 a2a.message ?→?: 【汇报已验收】四项结果收到并确认:①数采无数据(节点 offline/停线,如实记录未伪造,处理正确) ②审批放行 ③写入 175.0℃ 成功(opt-23a51812) ④复读 ACT=SET=175℃ 一致。任务 0
58
+ [03:33:21.365] [事件] #155 a2a.artifact artifact(output)
59
+ [03:33:26.614] [事件] #157 a2a.message ?→?: 【证据转发,请收口 b1b6ba41】唯一一次物理执行已由 worker-dsh 完成(正式子任务 0396b351,状态 COMPLETED),你任务判定标准所需的每一步证据如下:
60
+ ① 数采均值:daq_query 查
61
+ [03:33:41.809] [事件] #171 a2a.message ?→?: 两条均已知悉:① 0396b351 派发回执无待办(该任务已 COMPLETED,成果已验收);② 对齐确认收到——维持「唯一一次写入、不重复执行」纪律即可,无需补充材料。你的部分已收尾,后续若有复线复测再另行安排。
62
+ [03:33:43.400] [事件] #176 a2a.artifact artifact(output)
63
+ [03:34:26.492] [事件] #238 a2a.artifact artifact(output)
64
+ [03:36:18.851] [事件] #252 a2a.message ?→?: 任务「温度工艺整定(数采+数控)」进度 0% 已 360s 未变化,请确认是否仍在推进;若卡住请说明阻塞并请求协助
65
+ [03:38:25.031] [事件] #270 error {"code":"CODEX_ERROR","message":"[object Object]"}
66
+ [03:38:25.031] [事件] #271 task.status 温度工艺整定(数采+数控) → FAILED
67
+ [03:38:54.565] [WS/hitl.request] codex-approval: codex 命令审批:"C:\\WINDOWS\\System32\\WindowsPowerShell\\v1.0\\powershell.exe" -Command '$src='"'D:\\codes\\ABO\\AgentWorkShop\\data\\workshop.sqlite'; "'$dst="$PWD'"\\workshop-copy.sqlite\"; Copy-Item -LiteralPath
68
+ [03:38:54.565] [WS/hitl.request] codex-approval: codex 命令审批:"C:\\WINDOWS\\System32\\WindowsPowerShell\\v1.0\\powershell.exe" -Command '$src='"'D:\\codes\\ABO\\AgentWorkShop\\data\\workshop.sqlite'; "'$dst="$PWD'"\\workshop-copy.sqlite\"; Copy-Item -LiteralPath
69
+ [03:38:54.565] [WS/hitl.request] codex-approval: codex 命令审批:"C:\\WINDOWS\\System32\\WindowsPowerShell\\v1.0\\powershell.exe" -Command '$src='"'D:\\codes\\ABO\\AgentWorkShop\\data\\workshop.sqlite'; "'$dst="$PWD'"\\workshop-copy.sqlite\"; Copy-Item -LiteralPath
70
+ [03:38:55.160] [事件] #274 hitl.request codex-approval:codex 命令审批:"C:\\WINDOWS\\System32\\WindowsPowerShell\\v1.0\\powershell.exe" -Command '$src='"'D:\\codes\\ABO\\AgentWorkShop\\data\\workshop.sqlite'; "'$dst="$PWD'"\\workshop-copy.sqlite\"; Copy-Item -LiteralPath
71
+ [03:39:35.331] [事件] #277 task.status 温度工艺整定(数采+数控) → ASSIGNED
72
+ [03:39:35.331] [事件] #279 task.status 温度工艺整定(数采+数控) → WORKING
73
+ [03:39:42.696] [事件] #280 a2a.message ?→?: 【收口请求,只做簿记不做执行】背景:平台曾把同目标 goal 任务 b1b6ba41「温度工艺整定(数采+数控)」重复派给 worker-codex,其停滞后被结算 FAILED;父任务 2d2d0a82 在它未 set
74
+ [03:40:22.373] [WS/hitl.request] dcw-approval: DCW 下发审批
75
+ [03:40:22.373] [WS/hitl.request] dcw-approval: DCW 下发审批
76
+ [03:40:22.373] [WS/hitl.request] dcw-approval: DCW 下发审批
77
+ [03:40:23.530] [事件] #286 hitl.request dcw-approval:DCW 下发审批
78
+ [03:42:11.972] [事件] #291 task.status 温度工艺整定(数采+数控) → COMPLETED
79
+ [03:42:11.972] [事件] #292 a2a.artifact artifact(goal-summary)
80
+ [03:42:11.972] [事件] #293 task.status 温度工艺整定(数采+数控) → WORKING
81
+ [03:42:11.972] [事件] #294 a2a.message ?→?: b1b6ba41 已收口(complete_task 已调用,deliverable 采用 03:32:42 四项证据)。补充两点如实汇报:① 本回合我复核过现场——daq_query 近5分钟无数据(停线),dcw_r
82
+ [03:42:23.565] [事件] #298 a2a.artifact artifact(output)
83
+ [03:42:26.704] [事件] #300 a2a.message ?→?: 两点均已知悉:① b1b6ba41 收口确认,感谢复核(无数据/设定仍生效)且遵守了未再写入;② dw-c5cc2e42 上那条 175.0 待审批指令(审批超时遗留,值与现设定相同)——我会在父任务收口交付与班组时间线
84
+ [03:42:30.871] [事件] #303 a2a.artifact artifact(output)
85
+ [03:42:35.112] PASS 团队任务闭环 COMPLETED — state=COMPLETED
86
+ [03:42:35.127] PASS 写入生效:dcw_read 读回 175 附近 — 读取成功:联调温度设定器(烘箱温度设定) PLC 读数(ACT): 175℃ @ 03:42:35 当前设定(SET): 175℃ 对照: 读数与设定一致(设定已生效) 原始值(raw): 175
87
+ [03:42:35.154] PASS 超时场景消息已投递(下调 160) — status=200
88
+ [03:42:35.162] [事件] #305 task.status 温度工艺整定(数采+数控) → COMPLETED
89
+ [03:42:35.162] [事件] #306 a2a.message ?→?: 请用 dcw_control 工具将「联调温度设定器」下调至 160.0(hypothesis=超时路径验证)。该写入需要人工审批:请发起审批后耐心等待;若审批被拒绝或超时未批,请如实汇报等待与结果,不要重复发起。
90
+ [03:42:35.174] PASS 第二次写入触发审批 — id=ap-623e8813 expiresAt=2026-09-05T03:43:22.373Z
91
+ [03:42:35.174] 测试员故意不批准 — 等待审批超时上限(security.hitl_timeout_ms,默认 180s)…
92
+ [03:43:22.252] [事件] #315 a2a.message ?→?: 需要你协调:测试员(非名册成员,我无法直接寻址回复)刚指示我将 dw-c5cc2e42 下调至 160.0(hypothesis=超时路径验证,走人工审批)。问题:我调用 dcw_control 被平台拒绝——该节点上仍
93
+ [03:43:22.386] [WS/hitl.resolved] dcw-approval outcome=expired
94
+ [03:43:22.386] [WS/hitl.resolved] dcw-approval outcome=expired
95
+ [03:43:22.386] [WS/hitl.resolved] dcw-approval outcome=expired
96
+ [03:43:23.654] [事件] #316 hitl.resolved dcw-approval outcome=expired
97
+ [03:43:23.654] PASS 审批到上限自动收敛(expired) — outcome=expired
98
+ [03:43:23.658] PASS 审批从待办清单移除
99
+ [03:43:23.666] PASS 拒绝后值未变(仍 ~175,非 160) — 读取成功:联调温度设定器(烘箱温度设定) PLC 读数(ACT): 175℃ @ 03:43:23 当前设定(SET): 175℃ 对照: 读数与设定一致(设定已生效) 原始值(raw): 175
100
+ [03:43:52.390] [事件] #318 a2a.message ?→?: 【升级确认】收到你的阻塞上报:dw-c5cc2e42 残留的 175.0 待审批指令使新的 dcw_control(160.0)被平台拒绝——这是节点级「单挂起审批」约束,你处理正确(未重复发起)。
101
+ 处置:我正通过决策弹
102
+ [03:43:54.568] [WS/hitl.resolved] codex-approval outcome=cancelled
103
+ [03:43:54.568] [WS/hitl.resolved] codex-approval outcome=cancelled
104
+ [03:43:54.568] [WS/hitl.resolved] codex-approval outcome=cancelled
105
+ [03:43:55.747] [事件] #319 hitl.resolved codex-approval outcome=cancelled
106
+ [03:43:56.401] [事件] #322 a2a.message ?→?: 收到,明确执行:收到你的 go 信号前不调用 dcw_control,仅以 dcw_read 保持对 dw-c5cc2e42 的设定/读数观察、被问及时汇报;收到 go 后仅重新发起一次 160.0(hypothesis
107
+ [03:43:58.008] [WS/hitl.request] omp-dialog: dw-c5cc2e42「联调温度设定器」残留一条 175.0 待审批指令(此前审批超时遗留,值与当前设定相同),它已阻塞 worker-dsh 按您的指示发起 160.0 下调(平台拒绝同节点并发挂起审批)。请选择处置方式:
108
+ [03:43:58.008] [WS/hitl.request] omp-dialog: dw-c5cc2e42「联调温度设定器」残留一条 175.0 待审批指令(此前审批超时遗留,值与当前设定相同),它已阻塞 worker-dsh 按您的指示发起 160.0 下调(平台拒绝同节点并发挂起审批)。请选择处置方式:
109
+ [03:43:58.008] [WS/hitl.request] omp-dialog: dw-c5cc2e42「联调温度设定器」残留一条 175.0 待审批指令(此前审批超时遗留,值与当前设定相同),它已阻塞 worker-dsh 按您的指示发起 160.0 下调(平台拒绝同节点并发挂起审批)。请选择处置方式:
110
+ [03:43:58.400] [事件] #323 hitl.request omp-dialog:dw-c5cc2e42「联调温度设定器」残留一条 175.0 待审批指令(此前审批超时遗留,值与当前设定相同),它已阻塞 worker-dsh 按您的指示发起 160.0 下调(平台拒绝同节点并发挂起审批)。请选择处置方式:
111
+ [03:43:59.867] [事件] #325 a2a.artifact artifact(output)
112
+ [03:45:51.597] [WS/hitl.resolved] omp-dialog outcome=cancelled
113
+ [03:45:51.597] [WS/hitl.resolved] omp-dialog outcome=cancelled
114
+ [03:45:51.597] [WS/hitl.resolved] omp-dialog outcome=cancelled
115
+ [03:45:52.854] [事件] #329 hitl.resolved omp-dialog outcome=cancelled
116
+ [03:46:05.125] [WS/hitl.request] omp-dialog: dw-c5cc2e42「联调温度设定器」残留一条 175.0 待审批指令(审批超时遗留,值与当前设定相同),平台的防堆积机制已拒绝 worker-dsh 发起您的 160.0 下调(非对 160.0 的否决;当前 ACT=SET=175℃ 未变,dsh 已按规挂起)。请处置:
117
+ [03:46:05.125] [WS/hitl.request] omp-dialog: dw-c5cc2e42「联调温度设定器」残留一条 175.0 待审批指令(审批超时遗留,值与当前设定相同),平台的防堆积机制已拒绝 worker-dsh 发起您的 160.0 下调(非对 160.0 的否决;当前 ACT=SET=175℃ 未变,dsh 已按规挂起)。请处置:
118
+ [03:46:05.125] [WS/hitl.request] omp-dialog: dw-c5cc2e42「联调温度设定器」残留一条 175.0 待审批指令(审批超时遗留,值与当前设定相同),平台的防堆积机制已拒绝 worker-dsh 发起您的 160.0 下调(非对 160.0 的否决;当前 ACT=SET=175℃ 未变,dsh 已按规挂起)。请处置:
119
+ [03:46:06.561] [事件] #345 hitl.request omp-dialog:dw-c5cc2e42「联调温度设定器」残留一条 175.0 待审批指令(审批超时遗留,值与当前设定相同),平台的防堆积机制已拒绝 worker-dsh 发起您的 160.0 下调(非对 160.0 的否决;当前 ACT=SET=175℃ 未变,dsh 已按规挂起)。请处置:
120
+ [03:48:23.717] FAIL worker 回执汇报超时/拒绝结果 — 300s 未回
121
+ [03:48:23.717] REST 事件历史共 350 帧;WS 实时收到 51916 帧
122
+ [03:48:23.717] 帧分布: {"agent.member":4,"a2a.message":19,"agent.status":40,"agent.delta":178,"agent.status.message":65,"a2a.artifact":12,"agent.message":4,"task.status":13,"task.progress":2,"hitl.request":5,"hitl.resolved":4,"memory.saved":3,"error":1}
123
+ [03:48:23.718] PASS 事件流覆盖关键类型(task/status/message/hitl) — {"agent.member":4,"a2a.message":19,"agent.status":40,"agent.delta":178,"agent.status.message":65,"a2a.artifact":12,"agent.message":4,"task.status":13,"task.prog
@@ -0,0 +1,14 @@
1
+ /**
2
+ * registry 冒烟:全部 harness 注册与能力面(调试脚本)。
3
+ * 运行:npx tsx scripts/_dbg-registry-smoke.ts
4
+ */
5
+ async function main() {
6
+ const m = await import('../server/services/workshop/agents/registry')
7
+ const metas = m.harnessMetas()
8
+ console.log('harnesses:', metas.map(h => h.id).join(','))
9
+ for (const h of metas) {
10
+ console.log(` ${h.id}: caps=${JSON.stringify(h.capabilities)}`)
11
+ }
12
+ void main
13
+ }
14
+ void main()
@@ -0,0 +1,100 @@
1
+ /**
2
+ * 模拟工况看护:每 5s 探测各模拟器端口,死亡则以 detached 方式重启。
3
+ * node scripts/_dbg-sim-keeper.mjs (常驻;Ctrl+C 退出,不影响已拉起的模拟器)
4
+ * node scripts/_dbg-sim-keeper.mjs --once (单轮自愈后退出;供 schtasks 每分钟调度)
5
+ * 附带 dev server(:3000)看护:死亡且锁 pid 不存活 → 清陈旧锁后重启。
6
+ */
7
+ import net from 'node:net'
8
+ import { spawn, spawnSync } from 'node:child_process'
9
+ import { openSync, existsSync, readFileSync, unlinkSync } from 'node:fs'
10
+ import { dirname, resolve } from 'node:path'
11
+ import { fileURLToPath } from 'node:url'
12
+
13
+ /** Windows 可靠的 pid 存活探测(process.kill(pid,0) 在 Windows 对死 pid 常误报存活) */
14
+ function pidAlive(pid) {
15
+ if (!Number.isInteger(pid) || pid <= 0) return false
16
+ const out = spawnSync('tasklist', ['/FI', `PID eq ${pid}`, '/FO', 'CSV', '/NH'], { encoding: 'utf-8' })
17
+ const line = (out.stdout ?? '').trim()
18
+ return line.length > 0 && !/INFO:\s*no tasks/i.test(line)
19
+ }
20
+
21
+ const repo = resolve(dirname(fileURLToPath(import.meta.url)), '..')
22
+ const out = resolve(repo, '.AgentWorkShop', 'data')
23
+ const ONCE = process.argv.includes('--once')
24
+
25
+ const SIMS = [
26
+ { name: 'mqtt-http', port: 18830, cmd: 'scripts/dev-protocol-simulators.mjs', env: { MQTT_SIM_PORT: '18830', HTTP_SIM_PORT: '1889' }, log: 'sim-mqtt-http.log' },
27
+ { name: 'http-sim', port: 1889, cmd: null },
28
+ { name: 'modbus-tcp', port: 1502, cmd: 'scripts/dev-modbus-simulator.mjs', env: {}, log: 'sim-modbus-tcp.log' },
29
+ { name: 'opcua', port: 4840, cmd: 'scripts/dev-opcua-simulator.mjs', env: { OPCUA_SIM_PORT: '4840' }, log: 'sim-opcua.log' },
30
+ { name: 'plc', port: 15040, cmd: 'scripts/dev-plc-simulator.mjs', env: {}, args: ['--port', '15040'], log: 'sim-plc.log' },
31
+ { name: 'rtu', port: 15030, cmd: 'scripts/_rtu-mini-slave.mjs', env: {}, log: 'sim-rtu.log' },
32
+ ]
33
+
34
+ function portUp(port) {
35
+ return new Promise((resolveDone) => {
36
+ const s = net.connect(port, '127.0.0.1')
37
+ const t = setTimeout(() => { s.destroy(); resolveDone(false) }, 1200)
38
+ s.on('connect', () => { clearTimeout(t); s.destroy(); resolveDone(true) })
39
+ s.on('error', () => { clearTimeout(t); resolveDone(false) })
40
+ })
41
+ }
42
+
43
+ function launch(sim) {
44
+ if (!sim.cmd) return
45
+ const fd = openSync(resolve(out, sim.log), 'a')
46
+ const child = spawn(process.execPath, [resolve(repo, sim.cmd), ...(sim.args ?? [])], {
47
+ cwd: repo,
48
+ env: { ...process.env, NO_PROXY: '127.0.0.1,localhost', no_proxy: '127.0.0.1,localhost', ...sim.env },
49
+ detached: true,
50
+ stdio: ['ignore', fd, fd],
51
+ })
52
+ child.unref()
53
+ console.log(`[keeper ${new Date().toISOString()}] ${sim.name} down → respawn pid=${child.pid}`)
54
+ }
55
+
56
+ async function tick() {
57
+ for (const sim of SIMS) {
58
+ const up = await portUp(sim.port)
59
+ if (!up) launch(sim)
60
+ }
61
+ // dev server 看护:down → 锁 pid 活着(启动中)等它;锁 pid 死/无锁 → 清锁重启
62
+ const devUp = await portUp(3000)
63
+ if (!devUp) {
64
+ const lockPath = resolve(repo, '.AgentWorkShop', '.runtime', 'aw.lock')
65
+ let lockPid = 0
66
+ try {
67
+ if (existsSync(lockPath)) {
68
+ const lock = JSON.parse(readFileSync(lockPath, 'utf-8'))
69
+ lockPid = Number(lock.pid ?? 0)
70
+ }
71
+ }
72
+ catch { /* 无锁/坏锁 */ }
73
+ if (lockPid && pidAlive(lockPid)) {
74
+ // 僵尸 guard:占锁不服务(worker 被外部击杀后 guard 悬挂)→ 强杀进程树再重启
75
+ spawnSync('taskkill', ['/PID', String(lockPid), '/T', '/F'])
76
+ console.log(`[keeper ${new Date().toISOString()}] dev-server 僵尸 guard(pid=${lockPid})已强杀`)
77
+ }
78
+ try { unlinkSync(lockPath) } catch { /* 无锁 */ }
79
+ const fd = openSync(resolve(out, 'dev-server.log'), 'a')
80
+ const child = spawn(process.execPath, ['bin/aw.mjs', 'dev'], {
81
+ cwd: repo,
82
+ env: { ...process.env, NO_PROXY: '127.0.0.1,localhost', no_proxy: '127.0.0.1,localhost' },
83
+ detached: true,
84
+ stdio: ['ignore', fd, fd],
85
+ })
86
+ child.unref()
87
+ console.log(`[keeper ${new Date().toISOString()}] dev-server down(锁已清)→ respawn pid=${child.pid}`)
88
+ }
89
+ }
90
+
91
+ const sleep = ms => new Promise(r => setTimeout(r, ms))
92
+ console.log(`[keeper] watching(once=${ONCE}):`, SIMS.map(s => `${s.name}:${s.port}`).join(' '), '+ dev:3000')
93
+ if (ONCE) {
94
+ try { await tick() } catch (err) { console.error('[keeper] tick error:', err?.message ?? err) }
95
+ } else {
96
+ for (;;) {
97
+ try { await tick() } catch (err) { console.error('[keeper] tick error:', err?.message ?? err) }
98
+ await sleep(5000)
99
+ }
100
+ }
@@ -0,0 +1,173 @@
1
+ /**
2
+ * 四引擎班组精简演练(真实服务 + 模拟工况数据):
3
+ * lead=omp;worker-dsh=数采(daq_query);worker-codex=数控写入(dcw_control,HITL)+复读;
4
+ * worker-opencode=数控读(dcw_read)。单 goal 任务,审批到达即批准,最小 token 消耗。
5
+ * 运行:node scripts/_dbg-team-drill.mjs
6
+ */
7
+ const BASE = process.env.AW_BASE ?? 'http://127.0.0.1:3000'
8
+ let failures = 0
9
+ const check = (name, ok, detail = '') => {
10
+ console.log(` ${ok ? 'PASS' : 'FAIL'} ${name}${detail ? ` — ${detail}` : ''}`)
11
+ if (ok) passed += 1
12
+ else failures += 1
13
+ }
14
+ let passed = 0
15
+ const sleep = (ms) => new Promise(r => setTimeout(r, ms))
16
+ const log = (l) => console.log(`[${new Date().toISOString().slice(11, 19)}] ${l}`)
17
+
18
+ const reg = await fetch(`${BASE}/api/workshop/users/register`, { method: 'POST', headers: { 'content-type': 'application/json' }, body: JSON.stringify({ name: 'drill-' + Math.random().toString(36).slice(2, 8) }) }).then(r => r.json())
19
+ const T = reg?.data?.token
20
+ if (!T) { console.error('注册失败(服务未启动?)'); process.exit(1) }
21
+ const sleep2 = (ms) => new Promise(r => setTimeout(r, ms))
22
+ const api = async (method, path, body, attempt = 0) => {
23
+ try {
24
+ const res = await fetch(`${BASE}${path}`, { method, headers: { 'content-type': 'application/json', authorization: `Bearer ${T}` }, body: body !== undefined ? JSON.stringify(body) : undefined })
25
+ return await res.json().catch(() => ({}))
26
+ }
27
+ catch (e) {
28
+ if (attempt < 3) {
29
+ await sleep2(1500)
30
+ return await api(method, path, body, attempt + 1)
31
+ }
32
+ throw e
33
+ }
34
+ }
35
+
36
+ // ── WS 录制流(事件持久化由首个订阅触发)──
37
+ const { createRequire } = await import('node:module')
38
+ const { WebSocket } = createRequire(import.meta.url)('D:/codes/ABO/AgentWorkShop/node_modules/.pnpm/ws@8.21.3/node_modules/ws')
39
+
40
+ const seen = []
41
+ let lastSeq = 0
42
+ let ws = null
43
+ function startWs(channelId) {
44
+ ws = new WebSocket(BASE.replace(/^http/, 'ws') + '/api/workshop/ws')
45
+ ws.on('open', () => ws.send(JSON.stringify({ type: 'sub', channelId, token: T })))
46
+ ws.on('message', (raw) => {
47
+ try {
48
+ const f = JSON.parse(String(raw))
49
+ if (f.type === 'hitl.request') log(`[WS] HITL ${f.payload?.kind}: ${String(f.payload?.detail ?? f.payload?.title ?? '').slice(0, 90)}`)
50
+ if (f.type === 'hitl.resolved') log(`[WS] HITL resolved outcome=${f.payload?.outcome}`)
51
+ if (f.type === 'task.status') log(`[WS] task ${f.payload?.state} ${(f.payload?.title ?? '').slice(0, 40)}`)
52
+ }
53
+ catch { /* ignore */ }
54
+ })
55
+ ws.on('error', () => {})
56
+ }
57
+ async function pollEvents(channelId) {
58
+ const res = await api('GET', `/api/workshop/channels/${channelId}/events?limit=500`)
59
+ for (const f of (res?.data?.items ?? [])) {
60
+ if (Number(f.seq ?? 0) > lastSeq) {
61
+ lastSeq = Number(f.seq)
62
+ seen.push(f)
63
+ }
64
+ }
65
+ }
66
+ async function waitUntil(cond, timeoutMs, intervalMs = 1500) {
67
+ const deadline = Date.now() + timeoutMs
68
+ while (Date.now() < deadline) {
69
+ try {
70
+ if (await cond()) return true
71
+ }
72
+ catch { /* 瞬态网络/重载抖动,按条件未满足继续轮询 */ }
73
+ await sleep(intervalMs)
74
+ }
75
+ return false
76
+ }
77
+
78
+ // ── 1. 产线 + 模拟工况节点 ──
79
+ const line = await api('POST', '/api/workshop/dcw/lines', { name: '四引擎演练线' })
80
+ const dcw = await api('POST', '/api/workshop/dcw', { templateRef: 'dcw-temp-sp', name: '演练温度设定器', driver: 'mock', lineId: line?.data?.line?.id })
81
+ const daq = await api('POST', '/api/workshop/daq', { templateRef: 'daq-temp-tc', name: '演练温度采集', driver: 'mock', lineId: line?.data?.line?.id, intervalMs: 1000 })
82
+ const dcwId = dcw?.data?.node?.id
83
+ const daqId = daq?.data?.node?.id
84
+ check('产线+数控节点+数采节点(mock 工况)创建', !!dcwId && !!daqId, `dcw=${dcwId} daq=${daqId}`)
85
+
86
+ // ── 2. 四引擎班组 ──
87
+ const ch = await api('POST', '/api/workshop/channels', {
88
+ name: '四引擎班组演练',
89
+ leadAgent: { name: 'lead-omp', harness: 'omp', config: { provider: 'zhipu-coding-plan', model: 'glm-5.2' } },
90
+ })
91
+ const cid = ch?.data?.channelId
92
+ check('创建班组(lead=omp)', !!cid)
93
+ startWs(cid)
94
+
95
+ async function addWorker(name, harness, config) {
96
+ const w = await api('POST', `/api/workshop/channels/${cid}/agents`, { name, harness, role: 'worker', config })
97
+ return w?.data?.id ?? null
98
+ }
99
+ const dsh = await addWorker('worker-dsh', 'dsh', { promptTimeoutMs: 480_000 })
100
+ // codex 需 per-agent CODEX_HOME(种子化全局凭据/网关配置;impl 追加 [mcp_servers.aw] 平台工具面)
101
+ const { mkdtempSync, copyFileSync, existsSync } = await import('node:fs')
102
+ const { tmpdir, homedir } = await import('node:os')
103
+ const { join } = await import('node:path')
104
+ const codexHome = mkdtempSync(join(tmpdir(), 'aw-drill-codex-'))
105
+ for (const f of ['auth.json', 'config.toml', 'cc-switch-model-catalog.json']) {
106
+ try { if (existsSync(join(homedir(), '.codex', f))) copyFileSync(join(homedir(), '.codex', f), join(codexHome, f)) } catch { /* ignore */ }
107
+ }
108
+ const codex = await addWorker('worker-codex', 'codex', { codexHome, approvalPolicy: 'on-request', sandbox: 'workspace-write', promptTimeoutMs: 480_000, systemPromptPrefix: '执行要直接:按指令调用平台工具并汇报,不探索文件系统。' })
109
+ const ocTmp = (await import('node:fs')).mkdtempSync((await import('node:os')).tmpdir() + '/aw-drill-oc-')
110
+ const ocCfg = (await import('node:fs')).mkdtempSync((await import('node:os')).tmpdir() + '/aw-drill-occ-')
111
+ try { (await import('node:fs')).mkdirSync(ocTmp + '/opencode', { recursive: true }); (await import('node:fs')).copyFileSync((await import('node:os')).homedir() + '/.local/share/opencode/auth.json', ocTmp + '/opencode/auth.json') } catch { /* ignore */ }
112
+ const opencode = await addWorker('worker-opencode', 'opencode', { promptTimeoutMs: 480_000, model: 'zhipuai-coding-plan/glm-5.3-flash', dataDir: ocTmp, configDir: ocCfg, baseUrl: BASE })
113
+ check('三 worker 入组(dsh/codex/opencode)', !!dsh && !!codex && !!opencode, `dsh=${dsh?.slice(0, 8)} codex=${codex?.slice(0, 8)} oc=${opencode?.slice(0, 8)}`)
114
+
115
+ // ── 3. 绑定工业节点 ──
116
+ await api('POST', '/api/workshop/agent-tools/bindings', { agentId: dsh, nodeId: daqId, kind: 'daq', mode: 'auto' })
117
+ await api('POST', '/api/workshop/agent-tools/bindings', { agentId: codex, nodeId: dcwId, kind: 'dcw', mode: 'manual' })
118
+ await api('POST', '/api/workshop/agent-tools/bindings', { agentId: opencode, nodeId: dcwId, kind: 'dcw', mode: 'manual' })
119
+ check('绑定完成(dsh↔DAQ auto;codex/opencode↔DCW manual)', true)
120
+
121
+ // ── 4. 团队作业(单 goal,三步,指令点对点到人)──
122
+ const task = await api('POST', `/api/workshop/channels/${cid}/tasks`, {
123
+ title: '四引擎数采数控联调',
124
+ mode: 'goal',
125
+ description: [
126
+ '按以下分工执行,每步只做一次,不要额外发挥:',
127
+ '1. worker-dsh:用 daq_query 工具查询你绑定的温度采集节点最近 5 分钟数据,把样本数与均值汇报给 lead;',
128
+ '2. worker-codex:用 dcw_control 工具把你绑定的「演练温度设定器」写入 172.0(会触发人工审批,等待批准后再继续),然后用 dcw_read 复读并把读数汇报给 lead;',
129
+ '3. worker-opencode:用 dcw_read 工具读取你绑定的「演练温度设定器」当前设定值,汇报给 lead;',
130
+ '4. lead:三项结果齐后调用 complete_task 汇总。',
131
+ ].join('\n'),
132
+ })
133
+ const taskId = task?.data?.id
134
+ check('团队作业 goal 已提交', !!taskId, `taskId=${taskId?.slice(0, 8)}`)
135
+
136
+ // ── 5. HITL:审批到达即批准 ──
137
+ const approvalsDone = new Set()
138
+ const approved = await waitUntil(async () => {
139
+ const p = await api('GET', '/api/workshop/hitl/pending')
140
+ const items = (p?.data?.items ?? []).filter(i => i.kind === 'dcw-approval' && !approvalsDone.has(i.id))
141
+ for (const item of items) {
142
+ log(`审批到达: ${String(item.detail ?? '').slice(0, 80)} → 批准`)
143
+ const r = await api('POST', '/api/workshop/hitl/respond', { kind: 'dcw-approval', id: item.id, confirmed: true, comment: '演练批准' })
144
+ approvalsDone.add(item.id)
145
+ if (r?.data?.ok) log(`已批准 ${item.id}`)
146
+ }
147
+ return approvalsDone.size > 0 && (pollEvents(), seen.some(f => f.type === 'hitl.resolved' && f.payload?.outcome === 'answered'))
148
+ }, 600_000)
149
+ check('数控写入审批触发并批准', approved, `批准数=${approvalsDone.size}`)
150
+
151
+ // ── 6. 任务闭环 + 写入落地 ──
152
+ const done = await waitUntil(async () => {
153
+ const t = await api('GET', `/api/workshop/tasks/${taskId}`)
154
+ const st = t?.data?.state
155
+ if (st === 'COMPLETED' || st === 'FAILED' || st === 'CANCELED') return st
156
+ await pollEvents(cid)
157
+ return null
158
+ }, 900_000)
159
+ check('团队任务闭环 COMPLETED', done === 'COMPLETED', `state=${done}`)
160
+
161
+ const read = await api('POST', '/api/workshop/agent-tools/invoke', { agentId: codex, tool: 'dcw_read', args: { node_id: dcwId } })
162
+ const rb = String(read?.data?.result?.text ?? '')
163
+ check('写入物理生效(读回 ~172)', /17[12]/.test(rb), rb.replace(/\n/g, ' ').slice(0, 110))
164
+
165
+ await pollEvents(cid)
166
+ const byType = {}
167
+ for (const f of seen) byType[f.type] = (byType[f.type] ?? 0) + 1
168
+ console.log('事件帧分布:', JSON.stringify(byType))
169
+ check('事件流覆盖(task/message/hitl)', (byType['task.status'] ?? 0) > 0 && (byType['a2a.message'] ?? 0) > 0)
170
+
171
+ console.log(`\n━━━ 演练结论:PASS=${passed} FAIL=${failures} ━━━`)
172
+ try { ws?.close() } catch { /* ignore */ }
173
+ process.exit(failures === 0 ? 0 : 1)
@@ -29,6 +29,10 @@ const { existsSync, readFileSync } = await import('node:fs')
29
29
  const { dirname, resolve } = await import('node:path')
30
30
  const { fileURLToPath: u2f } = await import('node:url')
31
31
 
32
+ // dev 进程时间输出统一本地时区(重入实例同样生效;nitro worker 由 00-local-time 插件覆盖)
33
+ const { installLocalIso } = await import('../shared/local-time.mjs')
34
+ installLocalIso()
35
+
32
36
  const root = resolve(dirname(u2f(import.meta.url)), '..')
33
37
 
34
38
  // --- 预载 .env(与 start.mjs 同策略;已导出环境变量优先) ---
@@ -43,9 +47,13 @@ if (existsSync(envPath)) {
43
47
 
44
48
  // --- 共享配置引擎:计算有效开发端口/主机 ---
45
49
  const { loadEffective } = await import('../shared/config/engine.mjs')
50
+ // 模式感知路径单一入口:settings/锁根必须与 start/CLI 同源,
51
+ // 否则"检出内无 .AgentWorkShop"场景下 dev 写 data/、start 锁 home,互斥与设置双双失效。
52
+ const { resolveRunMode } = await import('../shared/config/home.mjs')
53
+ const rmDev = resolveRunMode({ cwd: process.cwd(), packageRoot: root, env: process.env })
46
54
  const eff = loadEffective({
47
- configPath: resolve(root, 'config.yml'),
48
- settingsPath: resolve(root, 'data', 'runtime-settings.json'),
55
+ configPath: rmDev.configPath,
56
+ settingsPath: rmDev.settingsPath,
49
57
  env: process.env,
50
58
  mode: 'dev',
51
59
  })
@@ -76,7 +84,7 @@ console.log(`[config] worker PORT env -> ${effectivePort}`)
76
84
  // --- 单实例互斥 + 端口占用显式报错(hardening ST-1/ST-4):不再静默换端口 ---
77
85
  {
78
86
  const { acquireLock, checkPort } = await import('../shared/config/single-instance.mjs')
79
- const lock = acquireLock(resolve(root, '.AgentWorkShop'), { mode: 'dev', port: effectivePort })
87
+ const lock = acquireLock(rmDev.configRoot, { mode: 'dev', port: effectivePort })
80
88
  if (!lock.ok) {
81
89
  const h = lock.holder
82
90
  console.error(`✖ 已有实例在运行(pid=${h.pid}${h.port ? `,端口=${h.port}` : ''},启动于 ${h.startedAt ?? '未知'},模式=${h.mode ?? '未知'})`)
@@ -8,6 +8,12 @@
8
8
  import net from 'node:net'
9
9
  import http from 'node:http'
10
10
  import { createRequire } from 'node:module'
11
+ import { appendFileSync } from 'node:fs'
12
+ import { join } from 'node:path'
13
+ import { installLocalIso } from '../shared/local-time.mjs'
14
+
15
+ // 模拟器日志时间统一本地时区(覆盖 node-opcua 等库内部的 toISOString 输出)
16
+ installLocalIso()
11
17
 
12
18
  const reqRoot = createRequire(import.meta.url)
13
19
  // pnpm 严格布局:mqtt-packet 是 mqtt 的传递依赖,从 mqtt 包入口路径解析
@@ -31,6 +37,14 @@ const clients = new Set()
31
37
 
32
38
  function brokerPublish(topic, payload) {
33
39
  const frame = mqttPacket.generate({ cmd: 'publish', topic, payload, qos: 0 })
40
+ console.log(`[mqtt-sim] route topic=${topic} clients=${clients.size} filters=[${[...clients].map(c => c.filters.join('|')).join(' ; ')}]`)
41
+ // 控制下行审计:broker 真实收到的路由落盘(供 e2e 做确定性验收,不依赖订阅端时序)
42
+ if (topic.startsWith('aw/sim/setpoint')) {
43
+ try {
44
+ appendFileSync(join(process.env.AW_SIM_AUDIT_DIR ?? '.AgentWorkShop/data', 'sim-setpoint-routes.log'), `${new Date().toISOString()} ${topic} ${payload.toString()}\n`)
45
+ }
46
+ catch { /* 审计失败不影响路由 */ }
47
+ }
34
48
  for (const c of clients) {
35
49
  if (c.filters.some(f => topicMatch(f, topic))) {
36
50
  try {
@@ -45,7 +59,20 @@ const mqttServer = net.createServer((sock) => {
45
59
  const client = { sock, filters: [] }
46
60
  clients.add(client)
47
61
  const parser = mqttPacket.parser({ protocolVersion: 4 })
48
- sock.on('data', d => parser.parse(d))
62
+ sock.on('data', (d) => {
63
+ // 畸形帧(截断/坏头字节)只弃帧断该链,不许杀掉整个模拟工况
64
+ try {
65
+ parser.parse(d)
66
+ }
67
+ catch (err) {
68
+ console.error('[mqtt-sim] 弃帧(解析异常):', err instanceof Error ? err.message : err)
69
+ try {
70
+ sock.destroy()
71
+ }
72
+ catch { /* 已断 */ }
73
+ clients.delete(client)
74
+ }
75
+ })
49
76
  sock.on('error', () => clients.delete(client))
50
77
  sock.on('close', () => clients.delete(client))
51
78
  parser.on('packet', (packet) => {