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,592 @@
1
+ /**
2
+ * HostToolBridge —— workspace 工具桥(harness 无关)。
3
+ *
4
+ * 把 omp-agent 时代的 host tool 定义/角色装配/分发逻辑抽为共享模块:
5
+ * - omp:保持原生 host_tool_call → dispatch(经本桥);
6
+ * - codex/dsh/opencode:经 stdio MCP 桥(server/harness/aw-mcp-bridge.mjs)
7
+ * → HTTP agent-tools 面 → impl.dispatchHostTool → 同一本桥;
8
+ * - REST 直调(agent-tools/invoke)同样落本桥。
9
+ * 从而"工具注册一套逻辑、注入与分发全引擎一致"。
10
+ *
11
+ * 分发语义与原 omp 实现逐字节对齐:插件工具优先 → workspace 协作/任务/记忆面 →
12
+ * 工业工具族 → 插件兜底 → 未知工具报错。
13
+ */
14
+ import { randomUUID } from 'node:crypto'
15
+ import type {
16
+ AgentInfo,
17
+ AgentWorkspace,
18
+ } from './agent-interface'
19
+ import type { A2AArtifact, Part } from '../types/a2a'
20
+ import type { WorkspaceTask } from '../types/task'
21
+ import type { RpcHostToolDefinition } from './adapters/omp-rpc-client'
22
+ import { loadHostToolDefs } from '../prompts/loader'
23
+ import { toolDaqFrames, toolDaqQuery, toolDcwControl, toolDcwJudge, toolDcwJournal, toolDcwRead, toolDcwRollback, toolMyIndustrialNodes } from './industrial-tools'
24
+ import { listPluginTools } from './plugin-tools'
25
+ import { extractTaskMode } from '../runtime/execution-mode'
26
+
27
+ /** host tool 定义(外置 .AgentWorkShop/prompts/host-tools.json;加载器缓存) */
28
+ export const HOST_TOOLS: RpcHostToolDefinition[] = loadHostToolDefs()
29
+
30
+ /** 仅 lead 可见的工具名(dispatch/调度/团队管理面;worker 注册时剔除,压缩工具上下文) */
31
+ export const LEAD_ONLY_TOOL_NAMES = new Set([
32
+ 'dispatch_task',
33
+ 'get_queue_overview',
34
+ 'read_channel_mail',
35
+ 'reassign_task',
36
+ 'update_task',
37
+ 'create_team_agent',
38
+ 'update_team_agent',
39
+ 'remove_team_agent',
40
+ ])
41
+
42
+ /**
43
+ * 按角色装配 host tools:lead = 全量;worker = 剔除 lead 专属(执行面 + 通信面 + 记忆面);
44
+ * 尾部合并插件注册工具(roles 过滤,缺省双角色可用)。
45
+ * 全 harness 共用:omp 经 set_host_tools 下发;其余引擎经 MCP 桥 tools/list 拉取。
46
+ */
47
+ export function hostToolsForRole(role: 'lead' | 'worker'): RpcHostToolDefinition[] {
48
+ const base = role === 'lead'
49
+ ? HOST_TOOLS
50
+ : HOST_TOOLS.filter(t => !LEAD_ONLY_TOOL_NAMES.has(t.name))
51
+ const out = [...base]
52
+ for (const [name, tool] of listPluginTools()) {
53
+ if (out.some(t => t.name === name)) continue
54
+ if (tool.roles && !tool.roles.includes(role)) continue
55
+ out.push({ name, label: tool.label ?? name, description: tool.description, parameters: tool.parameters ?? {} })
56
+ }
57
+ return out
58
+ }
59
+
60
+ /** 工具调用请求(与引擎协议解耦的规范化形状) */
61
+ export interface HostToolCall {
62
+ toolName: string
63
+ arguments: Record<string, unknown>
64
+ }
65
+
66
+ export interface HostToolResult {
67
+ text: string
68
+ isError?: boolean
69
+ }
70
+
71
+ /** 会话态(impl 持有,桥读写):当前执行任务 + 待回执上下文 */
72
+ export interface HostToolSessionState {
73
+ currentTaskId: string | null
74
+ replyContext: { fromId: string, messageId: string } | null
75
+ }
76
+
77
+ export function createSessionState(): HostToolSessionState {
78
+ return { currentTaskId: null, replyContext: null }
79
+ }
80
+
81
+ /** 桥上下文:impl 注入身份与 workspace 取值器 */
82
+ export interface HostToolBridgeContext {
83
+ identity: { agentId: string, channelId: string, role: 'lead' | 'worker', name: string }
84
+ state: HostToolSessionState
85
+ getWorkspace(): AgentWorkspace | null
86
+ }
87
+
88
+ /** 从消息 parts 提取纯文本(多 harness 共用) */
89
+ export function partsToText(parts: Part[]): string {
90
+ return parts
91
+ .map((p) => {
92
+ if ('text' in p) return p.text
93
+ if ('data' in p) return JSON.stringify(p.data)
94
+ if ('url' in p) return p.url
95
+ if ('raw' in p) return p.raw
96
+ return ''
97
+ })
98
+ .join('\n')
99
+ }
100
+
101
+ /**
102
+ * 分发一次 host tool 调用(全引擎唯一入口):
103
+ * 插件工具优先 → workspace 面 → 工业工具族 → 插件兜底 → 未知工具。
104
+ */
105
+ export async function dispatchHostTool(ctx: HostToolBridgeContext, req: HostToolCall): Promise<HostToolResult> {
106
+ const identity = ctx.identity
107
+ // 插件工具分发(ctx.omp.registerTool 注册的自定义工具;不依赖 workspace,优先于内置面)
108
+ const pluginTool = listPluginTools().get(req.toolName)
109
+ if (pluginTool) {
110
+ try {
111
+ return await pluginTool.handler(req.arguments ?? {}, identity)
112
+ }
113
+ catch (err) {
114
+ return {
115
+ text: `工具执行异常(${req.toolName}): ${err instanceof Error ? err.message : String(err)}`,
116
+ isError: true,
117
+ }
118
+ }
119
+ }
120
+ const args = req.arguments ?? {}
121
+
122
+ // 工业工具族不依赖 workspace(只按 agentId 查绑定与节点),先于 workspace 门控执行 ——
123
+ // 否则 worker 首回合前的 REST/MCP 直调(my_industrial_nodes 等)会被误拒
124
+ switch (req.toolName) {
125
+ case 'my_industrial_nodes':
126
+ return toolMyIndustrialNodes(identity.agentId)
127
+ case 'dcw_control':
128
+ return toolDcwControl(identity.agentId, args as { node_id?: string, value?: number | string, hypothesis?: string, task_id?: string })
129
+ case 'dcw_read':
130
+ return toolDcwRead(identity.agentId, args as { node_id?: string })
131
+ case 'daq_query':
132
+ return toolDaqQuery(identity.agentId, args as Parameters<typeof toolDaqQuery>[1])
133
+ case 'daq_frames':
134
+ return toolDaqFrames(identity.agentId, args as Parameters<typeof toolDaqFrames>[1])
135
+ case 'dcw_judge':
136
+ return toolDcwJudge(identity.agentId, args as { record_id?: string, verdict?: string, reason?: string })
137
+ case 'dcw_rollback':
138
+ return toolDcwRollback(identity.agentId, args as { record_id?: string, node_id?: string, to?: string })
139
+ case 'dcw_journal':
140
+ return toolDcwJournal(identity.agentId, args as { node_id?: string, recipe_id?: string, limit?: number | string })
141
+ }
142
+
143
+ const ws = ctx.getWorkspace()
144
+ if (!ws) {
145
+ return { text: 'workspace 未就绪', isError: true }
146
+ }
147
+
148
+ try {
149
+ switch (req.toolName) {
150
+ case 'report_progress': {
151
+ const progress = args.progress as number
152
+ const message = args.message as string | undefined
153
+ const taskId = ctx.state.currentTaskId
154
+ if (!taskId) return { text: '无当前任务上下文', isError: true }
155
+ await ws.reportTask({ taskId, progress, message })
156
+ return { text: `进度已上报: ${progress}%${message ? ` (${message})` : ''}` }
157
+ }
158
+
159
+ case 'complete_task': {
160
+ const summary = args.summary as string
161
+ const deliverable = args.deliverable as string | undefined
162
+ const taskId = (args.task_id as string | undefined) ?? ctx.state.currentTaskId
163
+ if (!taskId) return { text: '无任务 ID', isError: true }
164
+ // 父任务保护:有未完成子任务时拒绝完成(lead 须等 worker 交付)
165
+ const allTasks = await ws.listTasks()
166
+ const incompleteChildren = allTasks.filter(t => t.parentId === taskId && t.state !== 'COMPLETED' && t.state !== 'CANCELED')
167
+ if (incompleteChildren.length > 0) {
168
+ return {
169
+ text: `任务 ${taskId} 有 ${incompleteChildren.length} 个未完成子任务,不能完成父任务。请等待子任务完成。`,
170
+ isError: true,
171
+ }
172
+ }
173
+ // 终态幂等:任务已被平台收口(看门狗取消/调度器完成)时不撞状态机 ——
174
+ // 给 Agent 明确的"无需再完成,继续下一项"信号,杜绝重复重试烧 token
175
+ const current = await ws.getTask(taskId)
176
+ if (current && current.state !== 'SUBMITTED' && current.state !== 'ASSIGNED' && current.state !== 'WORKING' && current.state !== 'WAITING') {
177
+ if (current.state === 'COMPLETED') {
178
+ return { text: `任务 ${taskId} 已是完成状态(可能已被平台收口),无需重复完成。` }
179
+ }
180
+ try {
181
+ const q = await ws.myQueue()
182
+ const next = q.queued[0]
183
+ return {
184
+ text: `任务 ${taskId} 已被平台${current.state === 'CANCELED' ? '取消(如停滞回收/上级作废)' : '判定失败'},不能再标记完成 —— 这不是你的错误,也无需重试。${next ? `队列还有 ${q.queued.length} 项,下一项「${next.title}」即将开始,请继续处理。` : '队列为空,保持待命。'}`,
185
+ isError: false,
186
+ }
187
+ }
188
+ catch {
189
+ return { text: `任务 ${taskId} 已被平台${current.state === 'CANCELED' ? '取消' : '判定失败'},无需再完成,请继续处理队列下一项。` }
190
+ }
191
+ }
192
+ const artifacts: A2AArtifact[] = []
193
+ if (deliverable || summary) {
194
+ artifacts.push({
195
+ artifactId: randomUUID(),
196
+ name: 'deliverable',
197
+ parts: [{ text: deliverable ?? summary }],
198
+ })
199
+ }
200
+ await ws.completeTask(taskId, artifacts)
201
+ ctx.state.currentTaskId = null
202
+ // 完成即衔接:报告队列余量与下一项(状态同步 + 驱动继续处理)
203
+ try {
204
+ const q = await ws.myQueue()
205
+ const next = q.queued[0]
206
+ if (next) {
207
+ return {
208
+ text: `任务 ${taskId} 已完成(状态已同步为 COMPLETED)。你的队列还有 ${q.queued.length} 项待处理,下一项:「${next.title}」(即将自动开始;收到任务指派消息后按工作流执行,完成后同样调用 complete_task)。`,
209
+ }
210
+ }
211
+ return { text: `任务 ${taskId} 已完成(状态已同步为 COMPLETED),队列为空。保持待命:新任务/实时消息会自动到达你的信箱。` }
212
+ }
213
+ catch {
214
+ return { text: `任务 ${taskId} 已完成(状态已同步为 COMPLETED)。` }
215
+ }
216
+ }
217
+
218
+ case 'dispatch_task': {
219
+ const assigneeId = args.assignee_id as string
220
+ const title = args.title as string
221
+ const description = args.description as string | undefined
222
+ const parentTaskId = args.parent_task_id as string | undefined
223
+ const routeReason = args.route_reason as string | undefined
224
+ // 重复派发守卫(真实场景实测:lead 模型可能对同一目标重复派发,引发协调风暴):
225
+ // 同父任务下已存在同标题非终态子任务 → 不再创建,直接指路既有任务
226
+ const dup = await ws.listTasks()
227
+ const existing = dup.find(t =>
228
+ t.parentId === parentTaskId
229
+ && t.title === title
230
+ && t.state !== 'COMPLETED' && t.state !== 'FAILED' && t.state !== 'CANCELED')
231
+ if (existing) {
232
+ return {
233
+ text: `未创建:同父任务下已存在同标题进行中子任务 ${existing.id}("${existing.title}",state=${existing.state},assignee=${existing.assigneeId})。请勿重复派发;若需跟进请对该任务 notify 或 reassign。`,
234
+ }
235
+ }
236
+ const task = await ws.dispatchTask({ assigneeId, title, description, parentTaskId, routeReason })
237
+ return { text: `子任务 ${task.id} 已创建并指派 → ${assigneeId}(父任务 ${parentTaskId ?? '无'},标题: ${title}${routeReason ? `,路由理由: ${routeReason}` : ''})` }
238
+ }
239
+
240
+ case 'send_message_to_agent': {
241
+ const toAgentId = args.to_agent_id as string
242
+ const message = args.message as string
243
+ // 回执自动实时:回复(in_reply_to)默认提升为 immediate——
244
+ // 接收方正等待该结果,realtime 路由会把回复直接注入其运行中的会话
245
+ let priority = (args.priority as string | undefined) ?? 'task'
246
+ const metadata: Record<string, unknown> = {}
247
+ if (args.require_reply === true) metadata['x-aw-require-reply'] = 'true'
248
+ let inReplyTo = args.in_reply_to as string | undefined
249
+ // 自动关联兜底:LLM 省略 in_reply_to 时,按待回执上下文盖章
250
+ const replyCtx = ctx.state.replyContext
251
+ ctx.state.replyContext = null
252
+ if (!inReplyTo && replyCtx && replyCtx.fromId === toAgentId) {
253
+ inReplyTo = replyCtx.messageId
254
+ }
255
+ if (inReplyTo) {
256
+ metadata['x-aw-in-reply-to'] = inReplyTo
257
+ if (priority === 'task') priority = 'immediate'
258
+ }
259
+ metadata['x-aw-msg-priority'] = priority
260
+ const sent = await ws.sendMessage({ toAgentId, parts: [{ text: message }], metadata })
261
+ const triggerNote = inReplyTo
262
+ ? `(回复 ${inReplyTo.slice(0, 8)}…,已实时推送给对方)`
263
+ : metadata['x-aw-require-reply'] === 'true' ? '(已要求对方回复)' : ''
264
+ return { text: `消息 ${sent.messageId.slice(0, 8)}… 已发送给 ${toAgentId}(priority=${priority})${triggerNote}` }
265
+ }
266
+
267
+ case 'send_cross_channel_message': {
268
+ const toChannelId = args.to_channel_id as string
269
+ const message = args.message as string
270
+ if (!toChannelId || !message) return { text: '缺少 to_channel_id 或 message', isError: true }
271
+ try {
272
+ const r = await ws.sendCrossChannelMessage({
273
+ toChannelId,
274
+ parts: [{ text: message }],
275
+ requireReply: args.require_reply === true,
276
+ inReplyTo: args.in_reply_to as string | undefined,
277
+ })
278
+ const note = args.require_reply === true ? '(已要求对方 Leader 回复)' : ''
279
+ return { text: `跨 Channel 消息 ${r.messageId.slice(0, 8)}… 已送达 channel「${r.toChannelName}」的 Leader(${r.toLeadAgentId.slice(0, 8)}…)${note}。对方将按你的信息需求处理;其回复会经 mailbox 到达你这里。` }
280
+ }
281
+ catch (err) {
282
+ return { text: `跨 Channel 发送失败: ${err instanceof Error ? err.message : String(err)}(仅 Leader 可跨 Channel 通信)`, isError: true }
283
+ }
284
+ }
285
+
286
+ case 'list_other_teams': {
287
+ const teams = await ws.listOtherTeams()
288
+ if (teams.length === 0) return { text: '当前没有其他团队(或均未启用)。' }
289
+ const text = teams.map((t) => {
290
+ const active = t.activeTasks.length > 0
291
+ ? t.activeTasks.map(x => `「${x.title}」(${x.state})`).join('、')
292
+ : '无进行中任务'
293
+ const done = t.recentCompleted.length > 0
294
+ ? t.recentCompleted.map(x => `「${x.title}」`).join('、')
295
+ : '无'
296
+ const mem = t.sharedMemories > 0 ? `共享记忆 ${t.sharedMemories} 条(可检索)` : '暂无共享记忆'
297
+ return `- ${t.name}${t.description ? `(${t.description})` : ''} · lead=${t.leadName ?? '?'} · ${mem}\n 进行中: ${active}\n 近期完成: ${done}\n channel_id: ${t.channelId}`
298
+ }).join('\n')
299
+ return { text: `其他团队概览:\n${text}\n(需要协作时用 send_cross_channel_message 向对应团队 Leader 发信;查具体知识用 search_other_teams_memory)` }
300
+ }
301
+
302
+ case 'search_other_teams_memory': {
303
+ const query = (args.query as string | undefined) ?? ''
304
+ if (!query) return { text: '缺少 query', isError: true }
305
+ const rows = await ws.searchOtherTeamsMemory({ query, limit: Number(args.limit ?? 5) })
306
+ if (rows.length === 0) return { text: `其他团队的共享记忆中没有命中「${query}」的内容。` }
307
+ const text = rows.map(r =>
308
+ `- [${r.channelName}] 「${r.title}」(${r.createdAt.slice(0, 10)}): ${r.content}`).join('\n')
309
+ return { text: `其他团队共享记忆命中 ${rows.length} 条:\n${text}` }
310
+ }
311
+
312
+ case 'refuse_task': {
313
+ const taskId = args.task_id as string
314
+ const reason = args.reason as string
315
+ if (!taskId || !reason) return { text: '缺少 task_id 或 reason', isError: true }
316
+ const r = await ws.refuseTask(taskId, reason)
317
+ const notified = r.notifiedTo ? `拒绝回执已送达 ${r.notifiedTo.slice(0, 8)}` : '无回执对象(创建者已不在 channel)'
318
+ return {
319
+ text: `任务 ${taskId.slice(0, 8)}("${r.task.title}") 已拒绝(state=${r.task.state});${notified}。调度器将改派他人,请勿再处理该任务。`,
320
+ }
321
+ }
322
+
323
+ case 'poll_messages': {
324
+ const limit = (args.limit as number | undefined) ?? 10
325
+ const waitSec = Math.min(180, Math.max(0, Number(args.wait_seconds ?? 0) || 0))
326
+ const msgs = await ws.waitMailbox(limit, waitSec * 1000)
327
+ if (msgs.length === 0) {
328
+ return {
329
+ text: waitSec > 0
330
+ ? `等待 ${waitSec}s 后收件箱仍为空。若此前已有"[实时消息 from X]"注入你的会话,那就是回复本身(无需再轮询);否则可继续处理其他工作,对方回复会以新回合送达。`
331
+ : '收件箱为空(无未消费消息)。等待回复请用 wait_seconds 参数阻塞等待,不要反复空轮询。',
332
+ }
333
+ }
334
+ // 读即取:协作消息(非任务投递)取出即确认;任务指派(assign)不确认
335
+ const ackIds = msgs
336
+ .filter(m => !m.metadata?.['x-aw-task-kind'])
337
+ .map(m => m.messageId)
338
+ if (ackIds.length > 0) await ws.ackMailbox(ackIds)
339
+ const trigger = msgs.find(m =>
340
+ m.metadata?.['x-aw-require-reply'] === 'true'
341
+ && typeof m.metadata?.['x-aw-from-agent'] === 'string')
342
+ if (trigger) {
343
+ ctx.state.replyContext = {
344
+ fromId: String(trigger.metadata!['x-aw-from-agent']),
345
+ messageId: trigger.messageId,
346
+ }
347
+ }
348
+ const text = msgs.map((m, i) => {
349
+ const from = m.metadata?.['x-aw-from-agent'] ?? '?'
350
+ const reply = m.metadata?.['x-aw-in-reply-to']
351
+ ? ` (回复 ${String(m.metadata['x-aw-in-reply-to']).slice(0, 8)}…)`
352
+ : ''
353
+ const needReply = m.metadata?.['x-aw-require-reply'] === 'true'
354
+ ? ` [需回复:用 send_message_to_agent 回 ${from},in_reply_to=${m.messageId}]`
355
+ : ''
356
+ const body = m.parts.map(p => 'text' in p ? p.text : '').join(' ')
357
+ return ` [${i + 1}/${msgs.length}] [from ${from}]${needReply}${reply} ${body.slice(0, 2000)}`
358
+ }).join('\n')
359
+ return {
360
+ text:
361
+ `未消费消息(${msgs.length},已读即取):\n${text}`
362
+ + (msgs.length > 1
363
+ ? '\n(收到多条:请按编号逐条处理并逐条回复,不要只回应最后一条或合并敷衍)'
364
+ : ''),
365
+ }
366
+ }
367
+
368
+ case 'read_channel_mail': {
369
+ const limit = (args.limit as number | undefined) ?? 50
370
+ const agentId = args.agent_id as string | undefined
371
+ const mails = await ws.listMail({ limit, agentId })
372
+ if (mails.length === 0) return { text: 'Channel 无邮件记录(或该成员无往来)' }
373
+ const text = mails.map((m) => {
374
+ const from = m.fromAgentId ?? '(系统)'
375
+ const to = m.toAgentId ?? '(广播)'
376
+ const body = partsToText(m.parts).trim().slice(0, 2000)
377
+ const reply = m.metadata?.['x-aw-in-reply-to']
378
+ ? ` [回复 ${String(m.metadata['x-aw-in-reply-to']).slice(0, 8)}…]`
379
+ : ''
380
+ const label = m.metadata?.['x-aw-task-kind'] === 'assign'
381
+ ? '[任务指派]'
382
+ : m.metadata?.['x-aw-msg-priority'] === 'immediate' ? '[实时]' : '[协作]'
383
+ const state = m.state === 'pending' ? '未读' : m.state === 'consuming' ? '处理中' : '已读'
384
+ return ` ${m.createdAt.slice(11, 19)} ${label} ${from} → ${to} (${state})${reply}: ${body || '(空)'}`
385
+ }).join('\n')
386
+ return { text: `Channel 邮件(${mails.length},倒序;可传 agent_id 查看指定成员信箱):\n${text}` }
387
+ }
388
+
389
+ case 'broadcast_message': {
390
+ const message = args.message as string
391
+ const priority = (args.priority as string | undefined) ?? 'task'
392
+ const agents = await ws.listAgents()
393
+ const others = agents.filter(a => a.id !== identity.agentId)
394
+ for (const agent of others) {
395
+ await ws.sendMessage({
396
+ toAgentId: agent.id,
397
+ parts: [{ text: message }],
398
+ metadata: { 'x-aw-msg-priority': priority },
399
+ })
400
+ }
401
+ return { text: `已广播给 ${others.length} 个 agent(priority=${priority})` }
402
+ }
403
+
404
+ case 'list_channel_tasks': {
405
+ const tasks = await ws.listTasks()
406
+ const text = tasks.map(t =>
407
+ ` ${t.id} [${t.state}] "${t.title}" assignee=${t.assigneeId} progress=${t.progress}%`,
408
+ ).join('\n')
409
+ return { text: `Channel 任务(${tasks.length}):\n${text || '(空)'}` }
410
+ }
411
+
412
+ case 'get_my_task_queue': {
413
+ const queue = await ws.myQueue()
414
+ const fmt = (t: WorkspaceTask): string =>
415
+ ` ${t.id} [${t.state}] "${t.title}" progress=${t.progress}%`
416
+ return {
417
+ text: [
418
+ `我的任务队列(${identity.role}):`,
419
+ `执行中: ${queue.current ? `${queue.current.id} "${queue.current.title}" (${queue.current.progress}%)` : '(无)'}`,
420
+ `待执行(${queue.queued.length},FIFO):`,
421
+ ...queue.queued.map(fmt),
422
+ `已完成(${queue.completed.length}):`,
423
+ ...queue.completed.map(fmt),
424
+ ].join('\n'),
425
+ }
426
+ }
427
+
428
+ case 'get_queue_overview': {
429
+ const overview = await ws.queueOverview()
430
+ const lines = overview.map(s =>
431
+ ` ${s.agentId} (${s.name}, role=${s.role}, state=${s.state}, current=${s.currentTaskId ?? '-'}${s.currentTaskTitle ? `「${s.currentTaskTitle}」` : ''}, progress=${s.currentTaskProgress ?? '-'}%, queued=${s.queuedCount}, completed=${s.completedCount})`,
432
+ )
433
+ return { text: `团队队列总览(${overview.length}):\n${lines.join('\n') || '(空)'}` }
434
+ }
435
+
436
+ case 'reassign_task': {
437
+ const taskId = args.task_id as string
438
+ const toAgentId = args.to_agent_id as string
439
+ const task = await ws.reassignTask(taskId, toAgentId)
440
+ return { text: `任务 ${taskId}("${task.title}")已调配 → ${toAgentId}(state=${task.state})` }
441
+ }
442
+
443
+ case 'update_task': {
444
+ const taskId = args.task_id as string
445
+ const title = args.title as string | undefined
446
+ const description = args.description as string | undefined
447
+ const task = await ws.updateTask(taskId, { title, description })
448
+ return { text: `任务 ${taskId} 已更新: "${task.title}"` }
449
+ }
450
+
451
+ case 'cancel_task': {
452
+ const taskId = args.task_id as string
453
+ // 守卫:goal/loop/pipeline 的 mode 父任务是用户的作业主任务,Agent 不得经工具取消
454
+ const target = await ws.getTask(taskId).catch(() => null)
455
+ if (target && extractTaskMode(target)) {
456
+ return {
457
+ text: `拒绝:任务 ${taskId} 是 mode 父任务(${target.title}),不能用 cancel_task 取消。若目标未达成 → dispatch_task 派发子任务补齐差距;若确认无法达成 → complete_task 并在交付中说明未达成原因。终止整个作业请由用户操作。`,
458
+ }
459
+ }
460
+ await ws.cancelTask(taskId)
461
+ return { text: `任务 ${taskId} 已取消并移出 assignee 队列` }
462
+ }
463
+
464
+ case 'list_team_agents': {
465
+ const agents = await ws.listAgents()
466
+ const text = agents.map(a =>
467
+ ` ${a.id} (${a.name}, role=${a.role}, harness=${a.harness})`,
468
+ ).join('\n')
469
+ return { text: `团队成员(${agents.length}):\n${text || '(空)'}` }
470
+ }
471
+
472
+ case 'get_task_details': {
473
+ const taskId = args.task_id as string
474
+ const task: WorkspaceTask = await ws.getTask(taskId)
475
+ const artifactText = task.artifacts.map(a =>
476
+ ` artifact ${a.artifactId}: ${a.parts.map(p => 'text' in p ? p.text.slice(0, 100) : '').join('; ')}`,
477
+ ).join('\n')
478
+ return {
479
+ text: `任务 ${task.id}\n 状态: ${task.state}\n 标题: ${task.title}\n 描述: ${task.description ?? '-'}\n 指派: ${task.assigneeId}\n 进度: ${task.progress}%\n 成果:\n${artifactText || ' (无)'}`,
480
+ }
481
+ }
482
+
483
+ case 'search_memory': {
484
+ const query = args.query as string
485
+ const scope = (args.scope as 'auto' | 'private' | 'shared' | undefined) ?? 'auto'
486
+ const snippets = await ws.recallMemory({ query, scope, limit: args.limit as number | undefined })
487
+ if (snippets.length === 0) {
488
+ return { text: `记忆检索无命中(query="${query}", scope=${scope})。可尝试更换关键词或放宽 scope。` }
489
+ }
490
+ const lines = snippets.map(s =>
491
+ ` [${s.source}·${s.kind}·score=${s.score}] ${s.title}\n ${s.content}`,
492
+ )
493
+ return { text: `记忆检索结果(${snippets.length} 条, scope=${scope}):\n${lines.join('\n')}` }
494
+ }
495
+
496
+ case 'save_memory': {
497
+ const title = args.title as string
498
+ const content = args.content as string
499
+ const scope = args.scope as 'private' | 'shared'
500
+ const saved = await ws.saveMemory({
501
+ title,
502
+ content,
503
+ importance: args.importance as number | undefined,
504
+ scope,
505
+ dedupKey: args.dedup_key as string | undefined,
506
+ })
507
+ const where = scope === 'shared' ? 'Channel 公共记忆(全员可检索)' : '本人私有记忆'
508
+ return { text: `已沉淀到${where}: "${title}"(dedupKey=${saved.dedupKey})` }
509
+ }
510
+
511
+ case 'create_team_agent': {
512
+ const name = args.name as string
513
+ const harness = args.harness as string | undefined
514
+ const systemPrompt = args.system_prompt as string | undefined
515
+ const reason = args.reason as string | undefined
516
+ const agent: AgentInfo = await ws.createTeamMember({
517
+ name,
518
+ harness,
519
+ config: systemPrompt ? { systemPromptPrefix: systemPrompt } : undefined,
520
+ reason,
521
+ })
522
+ return {
523
+ text: [
524
+ `团队成员已创建并加入 channel:`,
525
+ ` id: ${agent.id}`,
526
+ ` name: ${agent.name}(role=worker, harness=${agent.harness})`,
527
+ `新成员当前空闲,可立即 dispatch_task 指派任务;list_team_agents 可随时查看团队名册。`,
528
+ ].join('\n'),
529
+ }
530
+ }
531
+
532
+ case 'update_team_agent': {
533
+ const agentId = args.agent_id as string
534
+ const name = args.name as string | undefined
535
+ const systemPrompt = args.system_prompt as string | undefined
536
+ const enabled = args.enabled as boolean | undefined
537
+ const reason = args.reason as string | undefined
538
+ const agent = await ws.updateTeamMember(agentId, {
539
+ name,
540
+ config: systemPrompt !== undefined ? { systemPromptPrefix: systemPrompt } : undefined,
541
+ enabled: enabled === undefined ? undefined : (enabled ? 1 : 0),
542
+ reason,
543
+ })
544
+ return {
545
+ text: `团队成员 ${agentId} 已更新:name="${agent.name}"${enabled !== undefined ? `, enabled=${enabled ? 1 : 0}` : ''};运行时将按新配置重载(下次任务生效)。`,
546
+ }
547
+ }
548
+
549
+ case 'remove_team_agent': {
550
+ const agentId = args.agent_id as string
551
+ const reason = args.reason as string | undefined
552
+ const result = await ws.removeTeamMember(agentId, reason)
553
+ const recycleNote = result.recycledTasks.length > 0
554
+ ? `其 ${result.recycledTasks.length} 个在途任务已回收(排队任务重派给剩余最短队列成员;执行中任务转 FAILED 待调度重试)。`
555
+ : `该成员无在途任务。`
556
+ return { text: `团队成员 ${agentId} 已移除。${recycleNote}` }
557
+ }
558
+
559
+ case 'my_industrial_nodes': {
560
+ return toolMyIndustrialNodes(identity.agentId)
561
+ }
562
+ case 'dcw_control': {
563
+ return toolDcwControl(identity.agentId, args as { node_id?: string, value?: number | string, hypothesis?: string, task_id?: string })
564
+ }
565
+ case 'dcw_read': {
566
+ return toolDcwRead(identity.agentId, args as { node_id?: string })
567
+ }
568
+ case 'daq_query': {
569
+ return toolDaqQuery(identity.agentId, args as Parameters<typeof toolDaqQuery>[1])
570
+ }
571
+ case 'daq_frames': {
572
+ return toolDaqFrames(identity.agentId, args as Parameters<typeof toolDaqFrames>[1])
573
+ }
574
+ case 'dcw_judge': {
575
+ return toolDcwJudge(identity.agentId, args as { record_id?: string, verdict?: string, reason?: string })
576
+ }
577
+ case 'dcw_rollback': {
578
+ return toolDcwRollback(identity.agentId, args as { record_id?: string, node_id?: string, to?: string })
579
+ }
580
+ case 'dcw_journal': {
581
+ return toolDcwJournal(identity.agentId, args as { node_id?: string, recipe_id?: string, limit?: number | string })
582
+ }
583
+ }
584
+ return { text: `未知工具: ${req.toolName}`, isError: true }
585
+ }
586
+ catch (err) {
587
+ return {
588
+ text: `工具执行异常(${req.toolName}): ${err instanceof Error ? err.message : String(err)}`,
589
+ isError: true,
590
+ }
591
+ }
592
+ }
@@ -258,7 +258,11 @@ export async function toolDaqQuery(agentId: string, args: {
258
258
 
259
259
  const toMs = Number(args.to_ms) || Date.now()
260
260
  const fromMs = Number(args.from_ms) || toMs - (Number(args.last_minutes) || 30) * 60_000
261
- const bucketMs = Number(args.bucket_ms) || undefined
261
+ // 时间间隔参数(bucket_ms 降采样桶宽):缺省 15s;可调,下限 1s
262
+ const rawBucket = Number(args.bucket_ms)
263
+ const bucketMs = Number.isFinite(rawBucket) && rawBucket > 0
264
+ ? Math.max(1000, Math.min(3_600_000, Math.round(rawBucket)))
265
+ : 15_000
262
266
  const limit = Math.min(Number(args.limit) || 500, 2000)
263
267
  const { getTsdb, tsdbReady } = await import('../daq/storage')
264
268
  await tsdbReady
@@ -9,10 +9,10 @@
9
9
 
10
10
  import { createLogger } from '../logger'
11
11
  import { randomUUID } from 'node:crypto'
12
- import fs from 'node:fs'
13
- import { dirname, join } from 'node:path'
12
+ import { join } from 'node:path'
14
13
  import { ensureDataDir } from '@/shared/config/home.mjs'
15
14
  import { AppError, ErrorCodes } from '../../../utils/errors'
15
+ import { loadJsonFile, saveJsonFileAtomic } from '../json-store.mjs'
16
16
 
17
17
  const log = createLogger('workshop.node-bindings')
18
18
 
@@ -34,7 +34,7 @@ const DB_PATH = join(ensureDataDir(), 'agent-node-bindings.json')
34
34
 
35
35
  function load(): AgentNodeBinding[] {
36
36
  try {
37
- const parsed = JSON.parse(fs.readFileSync(DB_PATH, 'utf-8'))
37
+ const parsed = loadJsonFile(DB_PATH, null)
38
38
  return Array.isArray(parsed) ? parsed as AgentNodeBinding[] : []
39
39
  }
40
40
  catch {
@@ -148,8 +148,7 @@ export class AgentNodeBindingRepo {
148
148
 
149
149
  private flush(): void {
150
150
  try {
151
- fs.mkdirSync(dirname(DB_PATH), { recursive: true })
152
- fs.writeFileSync(DB_PATH, JSON.stringify(this.list, null, 2), 'utf-8')
151
+ saveJsonFileAtomic(DB_PATH, this.list)
153
152
  }
154
153
  catch (err) {
155
154
  log.error('[agent-node-bindings] 落盘失败:', err)