agentworkshop 0.7.24 → 0.7.33

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 (1057) hide show
  1. package/.AgentWorkShop/prompts/aml-mission-default.md +20 -0
  2. package/.AgentWorkShop/prompts/aml-playbook.md +49 -0
  3. package/.AgentWorkShop/prompts/host-tools.json +314 -0
  4. package/.output/.AgentWorkShop/prompts/aml-mission-default.md +20 -0
  5. package/.output/.AgentWorkShop/prompts/aml-playbook.md +49 -0
  6. package/.output/.AgentWorkShop/prompts/host-tools.json +314 -0
  7. package/.output/.AgentWorkShop/schema.json +120 -0
  8. package/.output/nitro.json +1 -1
  9. package/.output/public/_nuxt/{Djir5rSD.js → 4bHdIqEg.js} +8 -8
  10. package/.output/public/_nuxt/B7gZokg82.js +209 -0
  11. package/.output/public/_nuxt/B9nXmjSB.js +19 -0
  12. package/.output/public/_nuxt/BASN8nZ0.js +1 -0
  13. package/.output/public/_nuxt/{DNQF_TXX.js → BBBtwOpo.js} +1 -1
  14. package/.output/public/_nuxt/{DoAlYsiF.js → BBwMH_hG.js} +1 -1
  15. package/.output/public/_nuxt/BWSE6hR6.js +1 -0
  16. package/.output/public/_nuxt/BZv4RFYN.js +1 -0
  17. package/.output/public/_nuxt/Bc0AmjfT.js +1 -0
  18. package/.output/public/_nuxt/BcmbLh2z2.js +1 -0
  19. package/.output/public/_nuxt/BgTB6h_q.js +2 -0
  20. package/.output/public/_nuxt/BkLJA9J5.js +1 -0
  21. package/.output/public/_nuxt/{CuVGPuP1.js → BuCHayqN.js} +1 -1
  22. package/.output/public/_nuxt/{0jKrzLuM.js → BuvcLKh1.js} +1 -1
  23. package/.output/public/_nuxt/C-mDhyEd.js +1 -0
  24. package/.output/public/_nuxt/{Ct68Z0232.js → C77oC8yC2.js} +2 -2
  25. package/.output/public/_nuxt/CQvmN-Mi.js +1 -0
  26. package/.output/public/_nuxt/CUDrOuW7.js +1 -0
  27. package/.output/public/_nuxt/{Coik560n.js → CZcC-gpk.js} +1 -1
  28. package/.output/public/_nuxt/{Cz9gD2Yo.js → CbzsPO5H.js} +1 -1
  29. package/.output/public/_nuxt/CdSOrh2c.js +1 -0
  30. package/.output/public/_nuxt/Cgx818r-.js +1 -0
  31. package/.output/public/_nuxt/Cjm7VogC.js +1 -0
  32. package/.output/public/_nuxt/Cm5mDxzH.js +1 -0
  33. package/.output/public/_nuxt/Cp6z0RN7.js +1 -0
  34. package/.output/public/_nuxt/Ct-WOVr4.js +1 -0
  35. package/.output/public/_nuxt/CwqIxJGj.js +2 -0
  36. package/.output/public/_nuxt/{BMb80_tm.js → D0fhp-Ga.js} +2 -2
  37. package/.output/public/_nuxt/DIaTPH1M.js +1 -0
  38. package/.output/public/_nuxt/DLljr7g0.js +1 -0
  39. package/.output/public/_nuxt/DTYBfjRY.js +1 -0
  40. package/.output/public/_nuxt/DYKVPzN-.js +1 -0
  41. package/.output/public/_nuxt/DZzGarBE2.js +13 -0
  42. package/.output/public/_nuxt/DaMCzQhv.js +1 -0
  43. package/.output/public/_nuxt/DoMxCWN52.js +4 -0
  44. package/.output/public/_nuxt/{kZV5TQvh2.js → DoTdlVVe2.js} +1 -1
  45. package/.output/public/_nuxt/DsVcWfyR.js +1 -0
  46. package/.output/public/_nuxt/{BCJFMBQ6.js → DzuC31-i.js} +2 -2
  47. package/.output/public/_nuxt/FQri3dV3.js +1 -0
  48. package/.output/public/_nuxt/Lp7Ll94I.js +1 -0
  49. package/.output/public/_nuxt/PluginSlot.DmjNbrcX.css +1 -0
  50. package/.output/public/_nuxt/{TownView.zu2rU5nS.css → TownView.CtskuMXS.css} +1 -1
  51. package/.output/public/_nuxt/_id_.hRYo-EAB.css +1 -0
  52. package/.output/public/_nuxt/_wsId_.gXMEOYgX.css +1 -0
  53. package/.output/public/_nuxt/agents.BV70ioCv.css +1 -0
  54. package/.output/public/_nuxt/aml.WU_bh87J.css +1 -0
  55. package/.output/public/_nuxt/builds/latest.json +1 -1
  56. package/.output/public/_nuxt/builds/meta/291ef3e6-fa6a-4dee-8f46-05da1aeab815.json +1 -0
  57. package/.output/public/_nuxt/daq.Bb6l44-O.css +1 -0
  58. package/.output/public/_nuxt/default.jNT73_hq.css +1 -0
  59. package/.output/public/_nuxt/ekuGmQ7R.js +1 -0
  60. package/.output/public/_nuxt/entry.jFrFAWuA.css +1 -0
  61. package/.output/public/_nuxt/pMoIO6rr.js +14 -0
  62. package/.output/public/_nuxt/pages.Cc8GX9T1.css +1 -0
  63. package/.output/public/_nuxt/plugins.wIPyfPn-.css +1 -0
  64. package/.output/public/_nuxt/settings.BCm4NZIc.css +1 -0
  65. package/.output/public/_nuxt/teams.BC75EGnR.css +1 -0
  66. package/.output/public/assets/game/character/yangyang-walk.glb +0 -0
  67. package/.output/server/chunks/_/binding-authz.mjs +23 -0
  68. package/.output/server/chunks/_/binding-authz.mjs.map +1 -0
  69. package/.output/server/chunks/_/character-asset.repo.mjs +1 -1
  70. package/.output/server/chunks/_/host-bindings.mjs +1 -1
  71. package/.output/server/chunks/_/nitro.mjs +14422 -7551
  72. package/.output/server/chunks/_/nitro.mjs.map +1 -1
  73. package/.output/server/chunks/_/scene-layout.repo.mjs +3 -3
  74. package/.output/server/chunks/_/scene-layout.repo.mjs.map +1 -1
  75. package/.output/server/chunks/build/Checkbox-eax2M3o-.mjs +207 -0
  76. package/.output/server/chunks/build/Checkbox-eax2M3o-.mjs.map +1 -0
  77. package/.output/server/chunks/build/{OmpTerminalPanel-Cw_Vw9oO.mjs → OmpTerminalPanel-Cu_s4i0A.mjs} +2 -2
  78. package/.output/server/chunks/build/{OmpTerminalPanel-Cw_Vw9oO.mjs.map → OmpTerminalPanel-Cu_s4i0A.mjs.map} +1 -1
  79. package/.output/server/chunks/build/{alert-qJnjyRcP.mjs → PluginSlot-CcR4Ys3T.mjs} +140 -4
  80. package/.output/server/chunks/build/PluginSlot-CcR4Ys3T.mjs.map +1 -0
  81. package/.output/server/chunks/build/{TownView-DxeQe1Bl.mjs → TownView-BdHnAilw.mjs} +178 -151
  82. package/.output/server/chunks/build/{TownView-DxeQe1Bl.mjs.map → TownView-BdHnAilw.mjs.map} +1 -1
  83. package/.output/server/chunks/build/{_id_-DY6v6sqB.mjs → _id_-Cb845FHR.mjs} +7 -5
  84. package/.output/server/chunks/build/_id_-Cb845FHR.mjs.map +1 -0
  85. package/.output/server/chunks/build/{_id_-DQDqj-cZ.mjs → _id_-fadFPl2i.mjs} +50 -35
  86. package/.output/server/chunks/build/_id_-fadFPl2i.mjs.map +1 -0
  87. package/.output/server/chunks/build/{_wsId_-D38Vx6Ky.mjs → _wsId_-CTZswnm5.mjs} +181 -22
  88. package/.output/server/chunks/build/{_wsId_-D38Vx6Ky.mjs.map → _wsId_-CTZswnm5.mjs.map} +1 -1
  89. package/.output/server/chunks/build/{agents-GnmUGZir.mjs → agents-Bvin73QY.mjs} +82 -32
  90. package/.output/server/chunks/build/agents-Bvin73QY.mjs.map +1 -0
  91. package/.output/server/chunks/build/aml-uBNIppIf.mjs +508 -0
  92. package/.output/server/chunks/build/aml-uBNIppIf.mjs.map +1 -0
  93. package/.output/server/chunks/build/apiClient-BwnfOQU8.mjs +81 -0
  94. package/.output/server/chunks/build/apiClient-BwnfOQU8.mjs.map +1 -0
  95. package/.output/server/chunks/build/{channel-templates-B4z6v8Z5.mjs → channel-templates-BTq8570n.mjs} +6 -5
  96. package/.output/server/chunks/build/channel-templates-BTq8570n.mjs.map +1 -0
  97. package/.output/server/chunks/build/{checkbox-dzcpU_Cd.mjs → checkbox-8fB-wI-T.mjs} +5 -5
  98. package/.output/server/chunks/build/{checkbox-dzcpU_Cd.mjs.map → checkbox-8fB-wI-T.mjs.map} +1 -1
  99. package/.output/server/chunks/build/{daq-B-3xCp_2.mjs → daq-BvihjQyW.mjs} +314 -426
  100. package/.output/server/chunks/build/daq-BvihjQyW.mjs.map +1 -0
  101. package/.output/server/chunks/build/{dcw-BL2dhuz7.mjs → dcw-Ks2vJ4PF.mjs} +5 -3
  102. package/.output/server/chunks/build/dcw-Ks2vJ4PF.mjs.map +1 -0
  103. package/.output/server/chunks/build/{default-CLf5m0NE.mjs → default-GgHt4O2R.mjs} +164 -101
  104. package/.output/server/chunks/build/{default-CLf5m0NE.mjs.map → default-GgHt4O2R.mjs.map} +1 -1
  105. package/.output/server/chunks/build/{input-number-Bd55elNN.mjs → input-number-DzpyYB99.mjs} +2 -2
  106. package/.output/server/chunks/build/{input-number-Bd55elNN.mjs.map → input-number-DzpyYB99.mjs.map} +1 -1
  107. package/.output/server/chunks/build/{logs-Dto_umFY.mjs → logs-CYBhkQwh.mjs} +5 -3
  108. package/.output/server/chunks/build/logs-CYBhkQwh.mjs.map +1 -0
  109. package/.output/server/chunks/build/{monitor-Cp4V-H2n.mjs → monitor-CyfDt4nR.mjs} +7 -6
  110. package/.output/server/chunks/build/{monitor-Cp4V-H2n.mjs.map → monitor-CyfDt4nR.mjs.map} +1 -1
  111. package/.output/server/chunks/build/{pages-Dc2H1QFu.mjs → pages-C-6BRtv8.mjs} +57 -47
  112. package/.output/server/chunks/build/pages-C-6BRtv8.mjs.map +1 -0
  113. package/.output/server/chunks/build/{permissions-BTRW2CVd.mjs → permissions-B52oOmaO.mjs} +6 -5
  114. package/.output/server/chunks/build/permissions-B52oOmaO.mjs.map +1 -0
  115. package/.output/server/chunks/build/{plugins-DZR0T4Mh.mjs → plugins-dZRegC7m.mjs} +22 -18
  116. package/.output/server/chunks/build/plugins-dZRegC7m.mjs.map +1 -0
  117. package/.output/server/chunks/build/{segmented-LPPREMtZ.mjs → segmented-3TrWo0lS.mjs} +3 -3
  118. package/.output/server/chunks/build/{segmented-LPPREMtZ.mjs.map → segmented-3TrWo0lS.mjs.map} +1 -1
  119. package/.output/server/chunks/build/settings-CgDLkP3s.mjs +1171 -0
  120. package/.output/server/chunks/build/settings-CgDLkP3s.mjs.map +1 -0
  121. package/.output/server/chunks/build/{table-Cswq-l2r.mjs → table-BjSWwmic.mjs} +4 -4
  122. package/.output/server/chunks/build/{table-Cswq-l2r.mjs.map → table-BjSWwmic.mjs.map} +1 -1
  123. package/.output/server/chunks/build/{tag-NO9jEqKy.mjs → tag-DNE9vXc0.mjs} +3 -131
  124. package/.output/server/chunks/build/tag-DNE9vXc0.mjs.map +1 -0
  125. package/.output/server/chunks/build/{teams-Cbg27MWW.mjs → teams-2kz3CusY.mjs} +350 -49
  126. package/.output/server/chunks/build/teams-2kz3CusY.mjs.map +1 -0
  127. package/.output/server/chunks/build/{tokens-Bmm6rDfj.mjs → tokens-BbWLqtVz.mjs} +6 -5
  128. package/.output/server/chunks/build/tokens-BbWLqtVz.mjs.map +1 -0
  129. package/.output/server/chunks/build/town-BUqRobze.mjs +1 -0
  130. package/.output/server/chunks/build/town-BUqRobze.mjs.map +1 -1
  131. package/.output/server/chunks/build/{town-Dsh0jlwZ.mjs → town-DJ-V5G9U.mjs} +7 -5
  132. package/.output/server/chunks/build/town-DJ-V5G9U.mjs.map +1 -0
  133. package/.output/server/chunks/build/{useDaqStream-DkRL3tEW.mjs → useDaqStream-CIBaiGAl.mjs} +27 -11
  134. package/.output/server/chunks/build/useDaqStream-CIBaiGAl.mjs.map +1 -0
  135. package/.output/server/chunks/build/{useDcwStream-DyB2ufQI.mjs → useDcwStream-CBbiYnWe.mjs} +16 -84
  136. package/.output/server/chunks/build/useDcwStream-CBbiYnWe.mjs.map +1 -0
  137. package/.output/server/chunks/build/{useDeviceTwins-ZbT86L9O.mjs → useDeviceTwins-Yko6nNPF.mjs} +2 -2
  138. package/.output/server/chunks/build/{useDeviceTwins-ZbT86L9O.mjs.map → useDeviceTwins-Yko6nNPF.mjs.map} +1 -1
  139. package/.output/server/chunks/build/{useOpsLog-8HCYFb6n.mjs → useOpsLog-CO_VWh7t.mjs} +2 -2
  140. package/.output/server/chunks/build/{useOpsLog-8HCYFb6n.mjs.map → useOpsLog-CO_VWh7t.mjs.map} +1 -1
  141. package/.output/server/chunks/build/{useWorkshopApi-D2gq06N2.mjs → useWorkshopApi-NyjL0L3j.mjs} +11 -2
  142. package/.output/server/chunks/build/{useWorkshopApi-D2gq06N2.mjs.map → useWorkshopApi-NyjL0L3j.mjs.map} +1 -1
  143. package/.output/server/chunks/build/{users-B50HHrfi.mjs → users-4nzxTjFT.mjs} +6 -5
  144. package/.output/server/chunks/build/users-4nzxTjFT.mjs.map +1 -0
  145. package/.output/server/chunks/build/workshop-81xhz368.mjs +1 -0
  146. package/.output/server/chunks/build/workshop-81xhz368.mjs.map +1 -1
  147. package/.output/server/chunks/routes/api/health.get.mjs +1 -0
  148. package/.output/server/chunks/routes/api/health.get.mjs.map +1 -1
  149. package/.output/server/chunks/routes/api/index.get.mjs +1 -1
  150. package/.output/server/chunks/routes/api/index.post.mjs +1 -1
  151. package/.output/server/chunks/routes/api/metrics.mjs +1 -0
  152. package/.output/server/chunks/routes/api/metrics.mjs.map +1 -1
  153. package/.output/server/chunks/routes/api/plugins/_name/_...path_.mjs +15 -2
  154. package/.output/server/chunks/routes/api/plugins/_name/_...path_.mjs.map +1 -1
  155. package/.output/server/chunks/routes/api/plugins/client/_name_.get.mjs +1 -0
  156. package/.output/server/chunks/routes/api/plugins/client/_name_.get.mjs.map +1 -1
  157. package/.output/server/chunks/routes/api/plugins/i18n.get.mjs +26 -0
  158. package/.output/server/chunks/routes/api/plugins/i18n.get.mjs.map +1 -0
  159. package/.output/server/chunks/routes/api/plugins/manifest.get.mjs +2 -1
  160. package/.output/server/chunks/routes/api/plugins/manifest.get.mjs.map +1 -1
  161. package/.output/server/chunks/routes/api/system/config-groups/_id_.delete.mjs +32 -0
  162. package/.output/server/chunks/routes/api/system/config-groups/_id_.delete.mjs.map +1 -0
  163. package/.output/server/chunks/routes/api/system/config-groups/_id_.patch.mjs +36 -0
  164. package/.output/server/chunks/routes/api/system/config-groups/_id_.patch.mjs.map +1 -0
  165. package/.output/server/chunks/routes/api/system/config.get.mjs +1 -0
  166. package/.output/server/chunks/routes/api/system/config.get.mjs.map +1 -1
  167. package/.output/server/chunks/routes/api/system/index.get.mjs +7 -2
  168. package/.output/server/chunks/routes/api/system/index.get.mjs.map +1 -1
  169. package/.output/server/chunks/routes/api/system/index.patch.mjs +2 -1
  170. package/.output/server/chunks/routes/api/system/index.patch.mjs.map +1 -1
  171. package/.output/server/chunks/routes/api/system/index.post.mjs +36 -0
  172. package/.output/server/chunks/routes/api/system/index.post.mjs.map +1 -0
  173. package/.output/server/chunks/routes/api/system/index2.get.mjs +28 -0
  174. package/.output/server/chunks/routes/api/system/index2.get.mjs.map +1 -0
  175. package/.output/server/chunks/routes/api/system/monitor/terminal/ws.mjs +2 -1
  176. package/.output/server/chunks/routes/api/system/monitor/terminal/ws.mjs.map +1 -1
  177. package/.output/server/chunks/routes/api/system/monitor/terminate.post.mjs +2 -1
  178. package/.output/server/chunks/routes/api/system/monitor/terminate.post.mjs.map +1 -1
  179. package/.output/server/chunks/routes/api/system/monitor.get.mjs +1 -0
  180. package/.output/server/chunks/routes/api/system/monitor.get.mjs.map +1 -1
  181. package/.output/server/chunks/routes/api/system/settings/events.get.mjs +8 -5
  182. package/.output/server/chunks/routes/api/system/settings/events.get.mjs.map +1 -1
  183. package/.output/server/chunks/routes/api/system/settings/reset.post.mjs +2 -1
  184. package/.output/server/chunks/routes/api/system/settings/reset.post.mjs.map +1 -1
  185. package/.output/server/chunks/routes/api/users/_id_.delete.mjs +2 -1
  186. package/.output/server/chunks/routes/api/users/_id_.delete.mjs.map +1 -1
  187. package/.output/server/chunks/routes/api/users/_id_.get.mjs +2 -1
  188. package/.output/server/chunks/routes/api/users/_id_.get.mjs.map +1 -1
  189. package/.output/server/chunks/routes/api/users/_id_.put.mjs +1 -1
  190. package/.output/server/chunks/routes/api/users/index.get.mjs +2 -1
  191. package/.output/server/chunks/routes/api/users/index.get.mjs.map +1 -1
  192. package/.output/server/chunks/routes/api/users/index.post.mjs +1 -1
  193. package/.output/server/chunks/routes/api/users/login.post.mjs +1 -1
  194. package/.output/server/chunks/routes/api/users/logout.post.mjs +2 -1
  195. package/.output/server/chunks/routes/api/users/logout.post.mjs.map +1 -1
  196. package/.output/server/chunks/routes/api/users/me.get.mjs +2 -1
  197. package/.output/server/chunks/routes/api/users/me.get.mjs.map +1 -1
  198. package/.output/server/chunks/routes/api/users/register.post.mjs +1 -1
  199. package/.output/server/chunks/routes/api/users/setup-status.get.mjs +2 -1
  200. package/.output/server/chunks/routes/api/users/setup-status.get.mjs.map +1 -1
  201. package/.output/server/chunks/routes/api/users/tokens/_id/token.get.mjs +2 -1
  202. package/.output/server/chunks/routes/api/users/tokens/_id/token.get.mjs.map +1 -1
  203. package/.output/server/chunks/routes/api/users/tokens/_id_.delete.mjs +2 -1
  204. package/.output/server/chunks/routes/api/users/tokens/_id_.delete.mjs.map +1 -1
  205. package/.output/server/chunks/routes/api/users/tokens/_id_.patch.mjs +1 -1
  206. package/.output/server/chunks/routes/api/workshop/_...path_.mjs +2 -1
  207. package/.output/server/chunks/routes/api/workshop/_...path_.mjs.map +1 -1
  208. package/.output/server/chunks/routes/api/workshop/a2a/_agentId/index.get.mjs +2 -1
  209. package/.output/server/chunks/routes/api/workshop/a2a/_agentId/index.get.mjs.map +1 -1
  210. package/.output/server/chunks/routes/api/workshop/a2a/_agentId/index.post.mjs +1 -1
  211. package/.output/server/chunks/routes/api/workshop/a2a/send.post.mjs +1 -1
  212. package/.output/server/chunks/routes/api/workshop/agent-tools/approvals/_id/decide.post.mjs +2 -1
  213. package/.output/server/chunks/routes/api/workshop/agent-tools/approvals/_id/decide.post.mjs.map +1 -1
  214. package/.output/server/chunks/routes/api/workshop/agent-tools/bindings/_id_.delete.mjs +5 -2
  215. package/.output/server/chunks/routes/api/workshop/agent-tools/bindings/_id_.delete.mjs.map +1 -1
  216. package/.output/server/chunks/routes/api/workshop/agent-tools/bindings/_id_.patch.mjs +9 -3
  217. package/.output/server/chunks/routes/api/workshop/agent-tools/bindings/_id_.patch.mjs.map +1 -1
  218. package/.output/server/chunks/routes/api/workshop/agent-tools/index.get.mjs +2 -1
  219. package/.output/server/chunks/routes/api/workshop/agent-tools/index.get.mjs.map +1 -1
  220. package/.output/server/chunks/routes/api/workshop/agent-tools/index.post.mjs +2 -1
  221. package/.output/server/chunks/routes/api/workshop/agent-tools/index.post.mjs.map +1 -1
  222. package/.output/server/chunks/routes/api/workshop/agent-tools/index2.get.mjs +23 -3
  223. package/.output/server/chunks/routes/api/workshop/agent-tools/index2.get.mjs.map +1 -1
  224. package/.output/server/chunks/routes/api/workshop/agent-tools/invoke.post.mjs +21 -3
  225. package/.output/server/chunks/routes/api/workshop/agent-tools/invoke.post.mjs.map +1 -1
  226. package/.output/server/chunks/routes/api/workshop/agent-tools/list.get.mjs +2 -1
  227. package/.output/server/chunks/routes/api/workshop/agent-tools/list.get.mjs.map +1 -1
  228. package/.output/server/chunks/routes/api/workshop/agents/_id_.delete.mjs +2 -1
  229. package/.output/server/chunks/routes/api/workshop/agents/_id_.delete.mjs.map +1 -1
  230. package/.output/server/chunks/routes/api/workshop/agents/_id_.get.mjs +2 -1
  231. package/.output/server/chunks/routes/api/workshop/agents/_id_.get.mjs.map +1 -1
  232. package/.output/server/chunks/routes/api/workshop/agents/_id_.patch.mjs +1 -1
  233. package/.output/server/chunks/routes/api/workshop/agents/subscribe.post.mjs +1 -1
  234. package/.output/server/chunks/routes/api/workshop/aml/datasets/_id/preview.get.mjs +75 -0
  235. package/.output/server/chunks/routes/api/workshop/aml/datasets/_id/preview.get.mjs.map +1 -0
  236. package/.output/server/chunks/routes/api/workshop/aml/datasets/_id_.get.mjs +35 -0
  237. package/.output/server/chunks/routes/api/workshop/aml/datasets/_id_.get.mjs.map +1 -0
  238. package/.output/server/chunks/routes/api/workshop/aml/index.get.mjs +35 -0
  239. package/.output/server/chunks/routes/api/workshop/aml/index.get.mjs.map +1 -0
  240. package/.output/server/chunks/routes/api/workshop/aml/index.post.mjs +46 -0
  241. package/.output/server/chunks/routes/api/workshop/aml/index.post.mjs.map +1 -0
  242. package/.output/server/chunks/routes/api/workshop/aml/index2.get.mjs +47 -0
  243. package/.output/server/chunks/routes/api/workshop/aml/index2.get.mjs.map +1 -0
  244. package/.output/server/chunks/routes/api/workshop/aml/index2.post.mjs +48 -0
  245. package/.output/server/chunks/routes/api/workshop/aml/index2.post.mjs.map +1 -0
  246. package/.output/server/chunks/routes/api/workshop/aml/index3.get.mjs +41 -0
  247. package/.output/server/chunks/routes/api/workshop/aml/index3.get.mjs.map +1 -0
  248. package/.output/server/chunks/routes/api/workshop/aml/index4.get.mjs +62 -0
  249. package/.output/server/chunks/routes/api/workshop/aml/index4.get.mjs.map +1 -0
  250. package/.output/server/chunks/routes/api/workshop/aml/jobs/_id/cancel.post.mjs +35 -0
  251. package/.output/server/chunks/routes/api/workshop/aml/jobs/_id/cancel.post.mjs.map +1 -0
  252. package/.output/server/chunks/routes/api/workshop/aml/jobs/_id/logs.get.mjs +36 -0
  253. package/.output/server/chunks/routes/api/workshop/aml/jobs/_id/logs.get.mjs.map +1 -0
  254. package/.output/server/chunks/routes/api/workshop/aml/jobs/_id/retry.post.mjs +34 -0
  255. package/.output/server/chunks/routes/api/workshop/aml/jobs/_id/retry.post.mjs.map +1 -0
  256. package/.output/server/chunks/routes/api/workshop/aml/jobs/_id_.get.mjs +38 -0
  257. package/.output/server/chunks/routes/api/workshop/aml/jobs/_id_.get.mjs.map +1 -0
  258. package/.output/server/chunks/routes/api/workshop/aml/models/_id/predict.post.mjs +37 -0
  259. package/.output/server/chunks/routes/api/workshop/aml/models/_id/predict.post.mjs.map +1 -0
  260. package/.output/server/chunks/routes/api/workshop/aml/models/_id/promote.post.mjs +42 -0
  261. package/.output/server/chunks/routes/api/workshop/aml/models/_id/promote.post.mjs.map +1 -0
  262. package/.output/server/chunks/routes/api/workshop/approvals/_id/decide.post.mjs +2 -1
  263. package/.output/server/chunks/routes/api/workshop/approvals/_id/decide.post.mjs.map +1 -1
  264. package/.output/server/chunks/routes/api/workshop/assets/character/_id_.delete.mjs +2 -1
  265. package/.output/server/chunks/routes/api/workshop/assets/character/_id_.delete.mjs.map +1 -1
  266. package/.output/server/chunks/routes/api/workshop/assets/devices/_id_.delete.mjs +2 -1
  267. package/.output/server/chunks/routes/api/workshop/assets/devices/_id_.delete.mjs.map +1 -1
  268. package/.output/server/chunks/routes/api/workshop/assets/index.get.mjs +2 -1
  269. package/.output/server/chunks/routes/api/workshop/assets/index.get.mjs.map +1 -1
  270. package/.output/server/chunks/routes/api/workshop/assets/index.post.mjs +2 -1
  271. package/.output/server/chunks/routes/api/workshop/assets/index.post.mjs.map +1 -1
  272. package/.output/server/chunks/routes/api/workshop/assets/index2.get.mjs +1 -0
  273. package/.output/server/chunks/routes/api/workshop/assets/index2.get.mjs.map +1 -1
  274. package/.output/server/chunks/routes/api/workshop/assets/index2.post.mjs +2 -1
  275. package/.output/server/chunks/routes/api/workshop/assets/index2.post.mjs.map +1 -1
  276. package/.output/server/chunks/routes/api/workshop/audit.get.mjs +2 -1
  277. package/.output/server/chunks/routes/api/workshop/audit.get.mjs.map +1 -1
  278. package/.output/server/chunks/routes/api/workshop/caller.mjs +2 -1
  279. package/.output/server/chunks/routes/api/workshop/caller.mjs.map +1 -1
  280. package/.output/server/chunks/routes/api/workshop/channel-templates/_id/instantiate.post.mjs +2 -2
  281. package/.output/server/chunks/routes/api/workshop/channel-templates/_id_.delete.mjs +2 -1
  282. package/.output/server/chunks/routes/api/workshop/channel-templates/_id_.delete.mjs.map +1 -1
  283. package/.output/server/chunks/routes/api/workshop/channel-templates/_id_.get.mjs +2 -1
  284. package/.output/server/chunks/routes/api/workshop/channel-templates/_id_.get.mjs.map +1 -1
  285. package/.output/server/chunks/routes/api/workshop/channel-templates/_id_.patch.mjs +1 -1
  286. package/.output/server/chunks/routes/api/workshop/channel-templates/from-channel.post.mjs +1 -1
  287. package/.output/server/chunks/routes/api/workshop/channels/_id/activate.post.mjs +2 -1
  288. package/.output/server/chunks/routes/api/workshop/channels/_id/activate.post.mjs.map +1 -1
  289. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/index.get.mjs +2 -1
  290. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/index.get.mjs.map +1 -1
  291. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/index.post.mjs +1 -1
  292. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/memories/_memoryId_.delete.mjs +2 -1
  293. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/memories/_memoryId_.delete.mjs.map +1 -1
  294. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/memories/search.post.mjs +1 -1
  295. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/model.patch.mjs +2 -1
  296. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/model.patch.mjs.map +1 -1
  297. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/position.patch.mjs +2 -1
  298. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/position.patch.mjs.map +1 -1
  299. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/range.patch.mjs +2 -1
  300. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/range.patch.mjs.map +1 -1
  301. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/stop.post.mjs +2 -1
  302. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/stop.post.mjs.map +1 -1
  303. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId_.delete.mjs +2 -1
  304. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId_.delete.mjs.map +1 -1
  305. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId_.patch.mjs +2 -1
  306. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId_.patch.mjs.map +1 -1
  307. package/.output/server/chunks/routes/api/workshop/channels/_id/events.get.mjs +1 -1
  308. package/.output/server/chunks/routes/api/workshop/channels/_id/index.get.mjs +2 -1
  309. package/.output/server/chunks/routes/api/workshop/channels/_id/index.get.mjs.map +1 -1
  310. package/.output/server/chunks/routes/api/workshop/channels/_id/index.post.mjs +1 -1
  311. package/.output/server/chunks/routes/api/workshop/channels/_id/index.put.mjs +41 -0
  312. package/.output/server/chunks/routes/api/workshop/channels/_id/index.put.mjs.map +1 -0
  313. package/.output/server/chunks/routes/api/workshop/channels/_id/index2.get.mjs +2 -1
  314. package/.output/server/chunks/routes/api/workshop/channels/_id/index2.get.mjs.map +1 -1
  315. package/.output/server/chunks/routes/api/workshop/channels/_id/index2.post.mjs +1 -1
  316. package/.output/server/chunks/routes/api/workshop/channels/_id/index3.get.mjs +1 -1
  317. package/.output/server/chunks/routes/api/workshop/channels/_id/index3.post.mjs +1 -1
  318. package/.output/server/chunks/routes/api/workshop/channels/_id/index4.get.mjs +22 -9
  319. package/.output/server/chunks/routes/api/workshop/channels/_id/index4.get.mjs.map +1 -1
  320. package/.output/server/chunks/routes/api/workshop/channels/_id/index4.post.mjs +1 -1
  321. package/.output/server/chunks/routes/api/workshop/channels/_id/index5.get.mjs +34 -0
  322. package/.output/server/chunks/routes/api/workshop/channels/_id/index5.get.mjs.map +1 -0
  323. package/.output/server/chunks/routes/api/workshop/channels/_id/memories/_memoryId_.delete.mjs +2 -1
  324. package/.output/server/chunks/routes/api/workshop/channels/_id/memories/_memoryId_.delete.mjs.map +1 -1
  325. package/.output/server/chunks/routes/api/workshop/channels/_id/queue.get.mjs +2 -1
  326. package/.output/server/chunks/routes/api/workshop/channels/_id/queue.get.mjs.map +1 -1
  327. package/.output/server/chunks/routes/api/workshop/channels/_id/terminals.get.mjs +2 -1
  328. package/.output/server/chunks/routes/api/workshop/channels/_id/terminals.get.mjs.map +1 -1
  329. package/.output/server/chunks/routes/api/workshop/channels/_id_.delete.mjs +1 -0
  330. package/.output/server/chunks/routes/api/workshop/channels/_id_.delete.mjs.map +1 -1
  331. package/.output/server/chunks/routes/api/workshop/channels/index.get.mjs +2 -1
  332. package/.output/server/chunks/routes/api/workshop/channels/index.get.mjs.map +1 -1
  333. package/.output/server/chunks/routes/api/workshop/channels/index.patch.mjs +1 -1
  334. package/.output/server/chunks/routes/api/workshop/channels.get.mjs +1 -0
  335. package/.output/server/chunks/routes/api/workshop/channels.get.mjs.map +1 -1
  336. package/.output/server/chunks/routes/api/workshop/channels.post.mjs +16 -2
  337. package/.output/server/chunks/routes/api/workshop/channels.post.mjs.map +1 -1
  338. package/.output/server/chunks/routes/api/workshop/daq/_id/bind.post.mjs +2 -1
  339. package/.output/server/chunks/routes/api/workshop/daq/_id/bind.post.mjs.map +1 -1
  340. package/.output/server/chunks/routes/api/workshop/daq/_id/bindings.put.mjs +2 -1
  341. package/.output/server/chunks/routes/api/workshop/daq/_id/bindings.put.mjs.map +1 -1
  342. package/.output/server/chunks/routes/api/workshop/daq/_id/frames/content.get.mjs +2 -1
  343. package/.output/server/chunks/routes/api/workshop/daq/_id/frames/content.get.mjs.map +1 -1
  344. package/.output/server/chunks/routes/api/workshop/daq/_id/frames.get.mjs +2 -1
  345. package/.output/server/chunks/routes/api/workshop/daq/_id/frames.get.mjs.map +1 -1
  346. package/.output/server/chunks/routes/api/workshop/daq/_id/samples.get.mjs +2 -1
  347. package/.output/server/chunks/routes/api/workshop/daq/_id/samples.get.mjs.map +1 -1
  348. package/.output/server/chunks/routes/api/workshop/daq/_id/test.post.mjs +2 -1
  349. package/.output/server/chunks/routes/api/workshop/daq/_id/test.post.mjs.map +1 -1
  350. package/.output/server/chunks/routes/api/workshop/daq/_id_.delete.mjs +3 -1
  351. package/.output/server/chunks/routes/api/workshop/daq/_id_.delete.mjs.map +1 -1
  352. package/.output/server/chunks/routes/api/workshop/daq/_id_.patch.mjs +2 -1
  353. package/.output/server/chunks/routes/api/workshop/daq/_id_.patch.mjs.map +1 -1
  354. package/.output/server/chunks/routes/api/workshop/daq/alarms/_id/ack.post.mjs +2 -1
  355. package/.output/server/chunks/routes/api/workshop/daq/alarms/_id/ack.post.mjs.map +1 -1
  356. package/.output/server/chunks/routes/api/workshop/daq/alarms.get.mjs +2 -1
  357. package/.output/server/chunks/routes/api/workshop/daq/alarms.get.mjs.map +1 -1
  358. package/.output/server/chunks/routes/api/workshop/daq/controller.post.mjs +2 -1
  359. package/.output/server/chunks/routes/api/workshop/daq/controller.post.mjs.map +1 -1
  360. package/.output/server/chunks/routes/api/workshop/daq/index.post.mjs +2 -1
  361. package/.output/server/chunks/routes/api/workshop/daq/index.post.mjs.map +1 -1
  362. package/.output/server/chunks/routes/api/workshop/daq/infra/reconnect.post.mjs +2 -1
  363. package/.output/server/chunks/routes/api/workshop/daq/infra/reconnect.post.mjs.map +1 -1
  364. package/.output/server/chunks/routes/api/workshop/daq/infra.get.mjs +2 -1
  365. package/.output/server/chunks/routes/api/workshop/daq/infra.get.mjs.map +1 -1
  366. package/.output/server/chunks/routes/api/workshop/daq/templates/_key_.delete.mjs +2 -1
  367. package/.output/server/chunks/routes/api/workshop/daq/templates/_key_.delete.mjs.map +1 -1
  368. package/.output/server/chunks/routes/api/workshop/daq/templates/_key_.patch.mjs +2 -1
  369. package/.output/server/chunks/routes/api/workshop/daq/templates/_key_.patch.mjs.map +1 -1
  370. package/.output/server/chunks/routes/api/workshop/daq/test-driver.post.mjs +2 -1
  371. package/.output/server/chunks/routes/api/workshop/daq/test-driver.post.mjs.map +1 -1
  372. package/.output/server/chunks/routes/api/workshop/dcw/_id/bind.post.mjs +2 -1
  373. package/.output/server/chunks/routes/api/workshop/dcw/_id/bind.post.mjs.map +1 -1
  374. package/.output/server/chunks/routes/api/workshop/dcw/_id/bindings.put.mjs +2 -1
  375. package/.output/server/chunks/routes/api/workshop/dcw/_id/bindings.put.mjs.map +1 -1
  376. package/.output/server/chunks/routes/api/workshop/dcw/_id/param-ledger.get.mjs +2 -1
  377. package/.output/server/chunks/routes/api/workshop/dcw/_id/param-ledger.get.mjs.map +1 -1
  378. package/.output/server/chunks/routes/api/workshop/dcw/_id/read.post.mjs +2 -1
  379. package/.output/server/chunks/routes/api/workshop/dcw/_id/read.post.mjs.map +1 -1
  380. package/.output/server/chunks/routes/api/workshop/dcw/_id/test.post.mjs +2 -1
  381. package/.output/server/chunks/routes/api/workshop/dcw/_id/test.post.mjs.map +1 -1
  382. package/.output/server/chunks/routes/api/workshop/dcw/_id/write.post.mjs +2 -1
  383. package/.output/server/chunks/routes/api/workshop/dcw/_id/write.post.mjs.map +1 -1
  384. package/.output/server/chunks/routes/api/workshop/dcw/_id_.delete.mjs +2 -1
  385. package/.output/server/chunks/routes/api/workshop/dcw/_id_.delete.mjs.map +1 -1
  386. package/.output/server/chunks/routes/api/workshop/dcw/_id_.patch.mjs +7 -2
  387. package/.output/server/chunks/routes/api/workshop/dcw/_id_.patch.mjs.map +1 -1
  388. package/.output/server/chunks/routes/api/workshop/dcw/controller.post.mjs +2 -1
  389. package/.output/server/chunks/routes/api/workshop/dcw/controller.post.mjs.map +1 -1
  390. package/.output/server/chunks/routes/api/workshop/dcw/index.get.mjs +2 -1
  391. package/.output/server/chunks/routes/api/workshop/dcw/index.get.mjs.map +1 -1
  392. package/.output/server/chunks/routes/api/workshop/dcw/index.post.mjs +2 -1
  393. package/.output/server/chunks/routes/api/workshop/dcw/index.post.mjs.map +1 -1
  394. package/.output/server/chunks/routes/api/workshop/dcw/index2.get.mjs +2 -1
  395. package/.output/server/chunks/routes/api/workshop/dcw/index2.get.mjs.map +1 -1
  396. package/.output/server/chunks/routes/api/workshop/dcw/index2.post.mjs +2 -1
  397. package/.output/server/chunks/routes/api/workshop/dcw/index2.post.mjs.map +1 -1
  398. package/.output/server/chunks/routes/api/workshop/dcw/index3.get.mjs +2 -1
  399. package/.output/server/chunks/routes/api/workshop/dcw/index3.get.mjs.map +1 -1
  400. package/.output/server/chunks/routes/api/workshop/dcw/index3.post.mjs +2 -1
  401. package/.output/server/chunks/routes/api/workshop/dcw/index3.post.mjs.map +1 -1
  402. package/.output/server/chunks/routes/api/workshop/dcw/index4.get.mjs +2 -1
  403. package/.output/server/chunks/routes/api/workshop/dcw/index4.get.mjs.map +1 -1
  404. package/.output/server/chunks/routes/api/workshop/dcw/index4.post.mjs +2 -1
  405. package/.output/server/chunks/routes/api/workshop/dcw/index4.post.mjs.map +1 -1
  406. package/.output/server/chunks/routes/api/workshop/dcw/index5.get.mjs +2 -1
  407. package/.output/server/chunks/routes/api/workshop/dcw/index5.get.mjs.map +1 -1
  408. package/.output/server/chunks/routes/api/workshop/dcw/journal/node/_nodeId/rollback.post.mjs +2 -1
  409. package/.output/server/chunks/routes/api/workshop/dcw/journal/node/_nodeId/rollback.post.mjs.map +1 -1
  410. package/.output/server/chunks/routes/api/workshop/dcw/line/query.get.mjs +2 -1
  411. package/.output/server/chunks/routes/api/workshop/dcw/line/query.get.mjs.map +1 -1
  412. package/.output/server/chunks/routes/api/workshop/dcw/lines/_id/start.post.mjs +2 -1
  413. package/.output/server/chunks/routes/api/workshop/dcw/lines/_id/start.post.mjs.map +1 -1
  414. package/.output/server/chunks/routes/api/workshop/dcw/lines/_id/stop.post.mjs +2 -1
  415. package/.output/server/chunks/routes/api/workshop/dcw/lines/_id/stop.post.mjs.map +1 -1
  416. package/.output/server/chunks/routes/api/workshop/dcw/lines/_id_.delete.mjs +2 -1
  417. package/.output/server/chunks/routes/api/workshop/dcw/lines/_id_.delete.mjs.map +1 -1
  418. package/.output/server/chunks/routes/api/workshop/dcw/lines/_id_.patch.mjs +2 -1
  419. package/.output/server/chunks/routes/api/workshop/dcw/lines/_id_.patch.mjs.map +1 -1
  420. package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id/judge.post.mjs +2 -1
  421. package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id/judge.post.mjs.map +1 -1
  422. package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id/rollback.post.mjs +2 -1
  423. package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id/rollback.post.mjs.map +1 -1
  424. package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id/series.get.mjs +2 -1
  425. package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id/series.get.mjs.map +1 -1
  426. package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id_.get.mjs +2 -1
  427. package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id_.get.mjs.map +1 -1
  428. package/.output/server/chunks/routes/api/workshop/dcw/products/_id_.delete.mjs +2 -1
  429. package/.output/server/chunks/routes/api/workshop/dcw/products/_id_.delete.mjs.map +1 -1
  430. package/.output/server/chunks/routes/api/workshop/dcw/products/_id_.patch.mjs +2 -1
  431. package/.output/server/chunks/routes/api/workshop/dcw/products/_id_.patch.mjs.map +1 -1
  432. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/apply.post.mjs +2 -1
  433. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/apply.post.mjs.map +1 -1
  434. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/mark-good.post.mjs +2 -1
  435. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/mark-good.post.mjs.map +1 -1
  436. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/revert.post.mjs +2 -1
  437. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/revert.post.mjs.map +1 -1
  438. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/rollback-good.post.mjs +2 -1
  439. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/rollback-good.post.mjs.map +1 -1
  440. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/versions.get.mjs +2 -1
  441. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/versions.get.mjs.map +1 -1
  442. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id_.delete.mjs +2 -1
  443. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id_.delete.mjs.map +1 -1
  444. package/.output/server/chunks/routes/api/workshop/dcw/recipes/index.patch.mjs +2 -1
  445. package/.output/server/chunks/routes/api/workshop/dcw/recipes/index.patch.mjs.map +1 -1
  446. package/.output/server/chunks/routes/api/workshop/dcw/runs/_id/close.post.mjs +2 -1
  447. package/.output/server/chunks/routes/api/workshop/dcw/runs/_id/close.post.mjs.map +1 -1
  448. package/.output/server/chunks/routes/api/workshop/dcw/runs/_id/data.get.mjs +2 -1
  449. package/.output/server/chunks/routes/api/workshop/dcw/runs/_id/data.get.mjs.map +1 -1
  450. package/.output/server/chunks/routes/api/workshop/dcw/runs/_id/rollback.post.mjs +2 -1
  451. package/.output/server/chunks/routes/api/workshop/dcw/runs/_id/rollback.post.mjs.map +1 -1
  452. package/.output/server/chunks/routes/api/workshop/dcw/templates/_key_.delete.mjs +2 -1
  453. package/.output/server/chunks/routes/api/workshop/dcw/templates/_key_.delete.mjs.map +1 -1
  454. package/.output/server/chunks/routes/api/workshop/dcw/templates/_key_.patch.mjs +2 -1
  455. package/.output/server/chunks/routes/api/workshop/dcw/templates/_key_.patch.mjs.map +1 -1
  456. package/.output/server/chunks/routes/api/workshop/dcw/test-driver.post.mjs +2 -1
  457. package/.output/server/chunks/routes/api/workshop/dcw/test-driver.post.mjs.map +1 -1
  458. package/.output/server/chunks/routes/api/workshop/device-twins/_id/control.post.mjs +2 -1
  459. package/.output/server/chunks/routes/api/workshop/device-twins/_id/control.post.mjs.map +1 -1
  460. package/.output/server/chunks/routes/api/workshop/device-twins/_id/telemetry.post.mjs +2 -1
  461. package/.output/server/chunks/routes/api/workshop/device-twins/_id/telemetry.post.mjs.map +1 -1
  462. package/.output/server/chunks/routes/api/workshop/device-twins/_id_.delete.mjs +2 -1
  463. package/.output/server/chunks/routes/api/workshop/device-twins/_id_.delete.mjs.map +1 -1
  464. package/.output/server/chunks/routes/api/workshop/device-twins/_id_.patch.mjs +2 -1
  465. package/.output/server/chunks/routes/api/workshop/device-twins/_id_.patch.mjs.map +1 -1
  466. package/.output/server/chunks/routes/api/workshop/fs/dirs.get.mjs +2 -1
  467. package/.output/server/chunks/routes/api/workshop/fs/dirs.get.mjs.map +1 -1
  468. package/.output/server/chunks/routes/api/workshop/harnesses/_id/providers.get.mjs +32 -1
  469. package/.output/server/chunks/routes/api/workshop/harnesses/_id/providers.get.mjs.map +1 -1
  470. package/.output/server/chunks/routes/api/workshop/harnesses.get.mjs +2 -1
  471. package/.output/server/chunks/routes/api/workshop/harnesses.get.mjs.map +1 -1
  472. package/.output/server/chunks/routes/api/workshop/hitl/pending.get.mjs +2 -1
  473. package/.output/server/chunks/routes/api/workshop/hitl/pending.get.mjs.map +1 -1
  474. package/.output/server/chunks/routes/api/workshop/hitl/respond.post.mjs +3 -2
  475. package/.output/server/chunks/routes/api/workshop/hitl/respond.post.mjs.map +1 -1
  476. package/.output/server/chunks/routes/api/workshop/index.get.mjs +1 -0
  477. package/.output/server/chunks/routes/api/workshop/index.get.mjs.map +1 -1
  478. package/.output/server/chunks/routes/api/workshop/index.post.mjs +1 -1
  479. package/.output/server/chunks/routes/api/workshop/index.put.mjs +2 -1
  480. package/.output/server/chunks/routes/api/workshop/index.put.mjs.map +1 -1
  481. package/.output/server/chunks/routes/api/workshop/index10.get.mjs +12 -6
  482. package/.output/server/chunks/routes/api/workshop/index10.get.mjs.map +1 -1
  483. package/.output/server/chunks/routes/api/workshop/index11.get.mjs +4 -2
  484. package/.output/server/chunks/routes/api/workshop/index11.get.mjs.map +1 -1
  485. package/.output/server/chunks/routes/api/workshop/index12.get.mjs +28 -0
  486. package/.output/server/chunks/routes/api/workshop/index12.get.mjs.map +1 -0
  487. package/.output/server/chunks/routes/api/workshop/index2.get.mjs +17 -11
  488. package/.output/server/chunks/routes/api/workshop/index2.get.mjs.map +1 -1
  489. package/.output/server/chunks/routes/api/workshop/index2.post.mjs +1 -1
  490. package/.output/server/chunks/routes/api/workshop/index3.get.mjs +11 -4
  491. package/.output/server/chunks/routes/api/workshop/index3.get.mjs.map +1 -1
  492. package/.output/server/chunks/routes/api/workshop/index3.post.mjs +2 -1
  493. package/.output/server/chunks/routes/api/workshop/index3.post.mjs.map +1 -1
  494. package/.output/server/chunks/routes/api/workshop/index4.get.mjs +5 -27
  495. package/.output/server/chunks/routes/api/workshop/index4.get.mjs.map +1 -1
  496. package/.output/server/chunks/routes/api/workshop/index4.post.mjs +2 -1
  497. package/.output/server/chunks/routes/api/workshop/index4.post.mjs.map +1 -1
  498. package/.output/server/chunks/routes/api/workshop/index5.get.mjs +24 -18
  499. package/.output/server/chunks/routes/api/workshop/index5.get.mjs.map +1 -1
  500. package/.output/server/chunks/routes/api/workshop/index5.post.mjs +2 -1
  501. package/.output/server/chunks/routes/api/workshop/index5.post.mjs.map +1 -1
  502. package/.output/server/chunks/routes/api/workshop/index6.get.mjs +23 -5
  503. package/.output/server/chunks/routes/api/workshop/index6.get.mjs.map +1 -1
  504. package/.output/server/chunks/routes/api/workshop/index6.post.mjs +2 -1
  505. package/.output/server/chunks/routes/api/workshop/index6.post.mjs.map +1 -1
  506. package/.output/server/chunks/routes/api/workshop/index7.get.mjs +4 -17
  507. package/.output/server/chunks/routes/api/workshop/index7.get.mjs.map +1 -1
  508. package/.output/server/chunks/routes/api/workshop/index7.post.mjs +8 -3
  509. package/.output/server/chunks/routes/api/workshop/index7.post.mjs.map +1 -1
  510. package/.output/server/chunks/routes/api/workshop/index8.get.mjs +20 -21
  511. package/.output/server/chunks/routes/api/workshop/index8.get.mjs.map +1 -1
  512. package/.output/server/chunks/routes/api/workshop/index8.post.mjs +1 -1
  513. package/.output/server/chunks/routes/api/workshop/index9.get.mjs +24 -11
  514. package/.output/server/chunks/routes/api/workshop/index9.get.mjs.map +1 -1
  515. package/.output/server/chunks/routes/api/workshop/mailbox/all.get.mjs +1 -0
  516. package/.output/server/chunks/routes/api/workshop/mailbox/all.get.mjs.map +1 -1
  517. package/.output/server/chunks/routes/api/workshop/mailbox.get.mjs +1 -0
  518. package/.output/server/chunks/routes/api/workshop/mailbox.get.mjs.map +1 -1
  519. package/.output/server/chunks/routes/api/workshop/memories/maintenance.post.mjs +2 -1
  520. package/.output/server/chunks/routes/api/workshop/memories/maintenance.post.mjs.map +1 -1
  521. package/.output/server/chunks/routes/api/workshop/plugins/_name/disable.post.mjs +2 -1
  522. package/.output/server/chunks/routes/api/workshop/plugins/_name/disable.post.mjs.map +1 -1
  523. package/.output/server/chunks/routes/api/workshop/plugins/_name/enable.post.mjs +2 -1
  524. package/.output/server/chunks/routes/api/workshop/plugins/_name/enable.post.mjs.map +1 -1
  525. package/.output/server/chunks/routes/api/workshop/plugins/index.get.mjs +2 -1
  526. package/.output/server/chunks/routes/api/workshop/plugins/index.get.mjs.map +1 -1
  527. package/.output/server/chunks/routes/api/workshop/runtime.get.mjs +1 -0
  528. package/.output/server/chunks/routes/api/workshop/runtime.get.mjs.map +1 -1
  529. package/.output/server/chunks/routes/api/workshop/scene/layouts/_channelId_.delete.mjs +2 -1
  530. package/.output/server/chunks/routes/api/workshop/scene/layouts/_channelId_.delete.mjs.map +1 -1
  531. package/.output/server/chunks/routes/api/workshop/scene/layouts/_channelId_.put.mjs +2 -1
  532. package/.output/server/chunks/routes/api/workshop/scene/layouts/_channelId_.put.mjs.map +1 -1
  533. package/.output/server/chunks/routes/api/workshop/scene/layouts.get.mjs +1 -0
  534. package/.output/server/chunks/routes/api/workshop/scene/layouts.get.mjs.map +1 -1
  535. package/.output/server/chunks/routes/api/workshop/tasks/_id/complete.post.mjs +1 -1
  536. package/.output/server/chunks/routes/api/workshop/tasks/_id/dispatch.post.mjs +1 -1
  537. package/.output/server/chunks/routes/api/workshop/tasks/_id/index.post.mjs +2 -1
  538. package/.output/server/chunks/routes/api/workshop/tasks/_id/index.post.mjs.map +1 -1
  539. package/.output/server/chunks/routes/api/workshop/tasks/_id/report.post.mjs +1 -1
  540. package/.output/server/chunks/routes/api/workshop/tasks/_id/retry.post.mjs +2 -1
  541. package/.output/server/chunks/routes/api/workshop/tasks/_id/retry.post.mjs.map +1 -1
  542. package/.output/server/chunks/routes/api/workshop/tasks/_id_.get.mjs +2 -1
  543. package/.output/server/chunks/routes/api/workshop/tasks/_id_.get.mjs.map +1 -1
  544. package/.output/server/chunks/routes/api/workshop/tasks.get.mjs +1 -0
  545. package/.output/server/chunks/routes/api/workshop/tasks.get.mjs.map +1 -1
  546. package/.output/server/chunks/routes/api/workshop/teams/_id/deploy.post.mjs +1 -1
  547. package/.output/server/chunks/routes/api/workshop/teams/_id/index.get.mjs +2 -1
  548. package/.output/server/chunks/routes/api/workshop/teams/_id/index.get.mjs.map +1 -1
  549. package/.output/server/chunks/routes/api/workshop/teams/_id/index.post.mjs +1 -1
  550. package/.output/server/chunks/routes/api/workshop/teams/_id/index.put.mjs +44 -0
  551. package/.output/server/chunks/routes/api/workshop/teams/_id/index.put.mjs.map +1 -0
  552. package/.output/server/chunks/routes/api/workshop/teams/_id/index2.get.mjs +47 -0
  553. package/.output/server/chunks/routes/api/workshop/teams/_id/index2.get.mjs.map +1 -0
  554. package/.output/server/chunks/routes/api/workshop/teams/_id/members/_agentId_.delete.mjs +2 -1
  555. package/.output/server/chunks/routes/api/workshop/teams/_id/members/_agentId_.delete.mjs.map +1 -1
  556. package/.output/server/chunks/routes/api/workshop/teams/_id_.delete.mjs +2 -1
  557. package/.output/server/chunks/routes/api/workshop/teams/_id_.delete.mjs.map +1 -1
  558. package/.output/server/chunks/routes/api/workshop/teams/_id_.get.mjs +2 -1
  559. package/.output/server/chunks/routes/api/workshop/teams/_id_.get.mjs.map +1 -1
  560. package/.output/server/chunks/routes/api/workshop/teams/_id_.patch.mjs +1 -1
  561. package/.output/server/chunks/routes/api/workshop/users/me.get.mjs +2 -0
  562. package/.output/server/chunks/routes/api/workshop/users/me.get.mjs.map +1 -1
  563. package/.output/server/chunks/routes/api/workshop/users/register.post.mjs +1 -1
  564. package/.output/server/chunks/routes/api/workshop/workspaces/_id/channel-templates/_tplId_.post.mjs +2 -2
  565. package/.output/server/chunks/routes/api/workshop/workspaces/_id/channels/_channelId_.delete.mjs +1 -0
  566. package/.output/server/chunks/routes/api/workshop/workspaces/_id/channels/_channelId_.delete.mjs.map +1 -1
  567. package/.output/server/chunks/routes/api/workshop/workspaces/_id/channels/_channelId_.post.mjs +1 -0
  568. package/.output/server/chunks/routes/api/workshop/workspaces/_id/channels/_channelId_.post.mjs.map +1 -1
  569. package/.output/server/chunks/routes/api/workshop/workspaces/index.delete.mjs +1 -0
  570. package/.output/server/chunks/routes/api/workshop/workspaces/index.delete.mjs.map +1 -1
  571. package/.output/server/chunks/routes/renderer.mjs +2 -2
  572. package/.output/server/chunks/virtual/entry.mjs +933 -449
  573. package/.output/server/chunks/virtual/entry.mjs.map +1 -1
  574. package/.output/server/chunks/virtual/precomputed.mjs +1 -1
  575. package/.output/server/index.mjs +1 -0
  576. package/.output/server/node_modules/@anthropic-ai/claude-agent-sdk/package.json +84 -0
  577. package/.output/server/node_modules/@anthropic-ai/claude-agent-sdk/sdk.mjs +225 -0
  578. package/.output/server/package.json +2 -1
  579. package/README-zh.md +507 -478
  580. package/README.md +517 -486
  581. package/app/app.vue +17 -2
  582. package/app/assets/css/main.css +421 -30
  583. package/app/components/AppHeader.vue +17 -0
  584. package/app/components/AppSidebar.vue +162 -63
  585. package/app/components/AwChart.vue +57 -54
  586. package/app/components/workshop/ChannelSessionList.vue +802 -703
  587. package/app/components/workshop/DaqNodeRow.vue +554 -0
  588. package/app/components/workshop/PluginSlot.vue +120 -0
  589. package/app/components/workshop/town/ModelPreview3D.vue +26 -4
  590. package/app/components/workshop/town/TownScene3D.ts +60 -12
  591. package/app/components/workshop/town/TownView.vue +4 -3
  592. package/app/composables/workshop/useAmlStream.ts +136 -0
  593. package/app/composables/workshop/useCharacterAssets.ts +1 -0
  594. package/app/composables/workshop/useDaqStream.ts +32 -6
  595. package/app/composables/workshop/useDcwStream.ts +13 -4
  596. package/app/composables/workshop/usePluginPanels.ts +72 -0
  597. package/app/composables/workshop/useWorkshopApi.ts +301 -259
  598. package/app/pages/aml/index.vue +1949 -0
  599. package/app/pages/daq/[id].vue +86 -4
  600. package/app/pages/daq/index.vue +15 -503
  601. package/app/pages/index.vue +235 -213
  602. package/app/pages/plugins/index.vue +280 -274
  603. package/app/pages/settings.vue +807 -79
  604. package/app/pages/workshop/agents.vue +23 -1
  605. package/app/pages/workshop/teams.vue +212 -2
  606. package/app/plugins/aw-plugins.client.ts +95 -6
  607. package/app/plugins/runtime-config.client.ts +4 -14
  608. package/app/plugins/theme.client.ts +13 -3
  609. package/app/stores/app.ts +9 -2
  610. package/app/stores/runtime-config.ts +113 -7
  611. package/cli/aw.mjs +16 -3
  612. package/cli/commands/build.mjs +8 -8
  613. package/cli/commands/dev.mjs +5 -13
  614. package/cli/commands/init.mjs +1 -1
  615. package/cli/commands/start.mjs +10 -17
  616. package/cli/core/args.mjs +85 -4
  617. package/cli/core/child-lifecycle.mjs +136 -0
  618. package/config.yml +24 -0
  619. package/docs/plugins.md +128 -220
  620. package/docs/sdk.md +1 -1
  621. package/i18n/dicts/_en.json +403 -2
  622. package/i18n/dicts/aml.json +163 -0
  623. package/i18n/dicts/channelSessionList.json +4 -1
  624. package/i18n/dicts/daqDetail.json +1 -0
  625. package/i18n/dicts/plugins.json +10 -0
  626. package/i18n/dicts/settings.json +34 -1
  627. package/i18n/dicts/teamPlugins.json +10 -0
  628. package/i18n/dicts/teams.json +9 -1
  629. package/i18n/locales/en.ts +2059 -1867
  630. package/i18n/locales/zh-CN.ts +2059 -1868
  631. package/nuxt.config.ts +18 -3
  632. package/package.json +7 -2
  633. package/public/assets/game/character/yangyang-walk.glb +0 -0
  634. package/scripts/_audit/.tmp/audit-data/dcws.json +28 -0
  635. package/scripts/_audit/.tmp/dcw-writes.json +15650 -0
  636. package/scripts/_audit/.tmp/dcws.json +9033 -0
  637. package/scripts/_audit/.tmp/pollution-backup/dcw-rollback.polluted.json +470006 -0
  638. package/scripts/_audit/.tmp/pollution-backup/dcws.polluted.json +9085 -0
  639. package/scripts/_audit/.tmp/probe-cwd.txt +1 -0
  640. package/scripts/_audit/audit-harness-adapters.md +664 -0
  641. package/scripts/_audit/awhome/commands/README.md +3 -0
  642. package/scripts/_audit/awhome/commands/hello.mjs +12 -0
  643. package/scripts/_audit/dcw-controller-e2e.ts +99 -0
  644. package/scripts/_audit/dcw-flush-cost.ts +43 -0
  645. package/scripts/_audit/dcw-rollback-ledger.ts +153 -0
  646. package/scripts/_audit/dcw-unrecorded-write.ts +171 -0
  647. package/scripts/_audit/dcw-write-mutex.ts +157 -0
  648. package/scripts/_audit/diag-cwd.ts +20 -0
  649. package/scripts/_audit/diag-cwd2.ts +19 -0
  650. package/scripts/_audit/exp-cost-scaling.mjs +54 -0
  651. package/scripts/_audit/exp-envelope-and-png.mjs +77 -0
  652. package/scripts/_audit/exp-png-decode.mjs +67 -0
  653. package/scripts/_audit/exp-retention-plan.mjs +61 -0
  654. package/scripts/_audit/exp-retention-rescan.mjs +42 -0
  655. package/scripts/_audit/exp-sweep-fairness.mjs +48 -0
  656. package/scripts/_audit/hello.mjs +12 -0
  657. package/scripts/_audit/http-api-authz-audit.md +657 -0
  658. package/scripts/_audit/ndjson-partial-line-repro.mjs +77 -0
  659. package/scripts/_audit/opencode-await-ternary-repro.mjs +20 -0
  660. package/scripts/_audit/part-frag.txt +84 -0
  661. package/scripts/_audit/part-head.txt +45 -0
  662. package/scripts/_audit/probe-binding.mjs +103 -0
  663. package/scripts/_audit/probe-child.mjs +17 -0
  664. package/scripts/_audit/probe-envelope.mjs +49 -0
  665. package/scripts/_audit/probe-packlist.mjs +67 -0
  666. package/scripts/_audit/probe-routes.mjs +47 -0
  667. package/scripts/_audit/probe-routes2.mjs +38 -0
  668. package/scripts/_audit/probe.ts +9 -0
  669. package/scripts/_audit/probe2.ts +6 -0
  670. package/scripts/_audit/probe3.ts +3 -0
  671. package/scripts/_audit/probe4.ts +3 -0
  672. package/scripts/_audit/proj/.AgentWorkShop/commands/echoargs.mjs +13 -0
  673. package/scripts/_audit/proj/config.yml +1 -0
  674. package/scripts/_audit/run.mjs +30 -0
  675. package/scripts/_audit/runtime-audit.md +716 -0
  676. package/scripts/_audit/ts-resolve-hook.mjs +41 -0
  677. package/scripts/_audit/tsconfig.probe.json +24 -0
  678. package/scripts/_audit/typecheck-out.txt +466 -0
  679. package/scripts/_audit/verify-data-integrity.mjs +112 -0
  680. package/scripts/_dbg-agents-dropdown-shot.py +33 -0
  681. package/scripts/_dbg-anim-verify.mjs +1 -1
  682. package/scripts/_dbg-audit-all-pages.mjs +1 -1
  683. package/scripts/_dbg-availability-probe.ts +11 -0
  684. package/scripts/_dbg-bind-bidi-e2e.mjs +1 -1
  685. package/scripts/_dbg-cf-line-shot.mjs +18 -0
  686. package/scripts/_dbg-channel-plugin-ui.mjs +94 -0
  687. package/scripts/_dbg-configroot-audit.mjs +84 -0
  688. package/scripts/_dbg-cpu-profile.mjs +53 -0
  689. package/scripts/_dbg-crash-recovery.mjs +1 -1
  690. package/scripts/_dbg-crush-probe.sh +21 -0
  691. package/scripts/_dbg-crush-spawn-probe.ts +22 -0
  692. package/scripts/_dbg-daq-acc-probe.mjs +1 -1
  693. package/scripts/_dbg-daq-attrib.mjs +1 -1
  694. package/scripts/_dbg-daq-debug.mjs +1 -1
  695. package/scripts/_dbg-daq-diag.mjs +1 -1
  696. package/scripts/_dbg-daq-e2e.mjs +1 -1
  697. package/scripts/_dbg-daq-filter-e2e.mjs +1 -1
  698. package/scripts/_dbg-daq-filter-e2e2.mjs +1 -1
  699. package/scripts/_dbg-daq-final-regression.mjs +1 -1
  700. package/scripts/_dbg-daq-frame-alarm.mjs +1 -1
  701. package/scripts/_dbg-daq-frame-ui.mjs +1 -1
  702. package/scripts/_dbg-daq-frame-ws.mjs +1 -1
  703. package/scripts/_dbg-daq-frames-e2e.mjs +1 -1
  704. package/scripts/_dbg-daq-full-check.mjs +1 -1
  705. package/scripts/_dbg-daq-intervals-func.mjs +94 -0
  706. package/scripts/_dbg-daq-pages-shot.mjs +1 -1
  707. package/scripts/_dbg-daq-perf.mjs +1 -1
  708. package/scripts/_dbg-daq-probe.mjs +1 -1
  709. package/scripts/_dbg-daq-recipe-e2e.mjs +1 -1
  710. package/scripts/_dbg-daq-rows-probe.mjs +1 -1
  711. package/scripts/_dbg-daq-rowstate-e2e.mjs +1 -1
  712. package/scripts/_dbg-daq-rowstate-shot.mjs +1 -1
  713. package/scripts/_dbg-daq-rowstate-shot2.mjs +1 -1
  714. package/scripts/_dbg-daq-rowstyle-verify.mjs +112 -0
  715. package/scripts/_dbg-dash-console-check.mjs +1 -1
  716. package/scripts/_dbg-dash-deep-probe.mjs +1 -1
  717. package/scripts/_dbg-dash-hitpoint.mjs +1 -1
  718. package/scripts/_dbg-dcw-read-rest.mjs +1 -1
  719. package/scripts/_dbg-dcw-read-ui.mjs +1 -1
  720. package/scripts/_dbg-dcw-shot2.mjs +1 -1
  721. package/scripts/_dbg-diag-mock-loop.mjs +89 -0
  722. package/scripts/_dbg-diag-watch.mjs +95 -0
  723. package/scripts/_dbg-error-probe.mjs +2 -2
  724. package/scripts/_dbg-filter-light-verify.mjs +1 -1
  725. package/scripts/_dbg-final-acceptance-2.mjs +1 -1
  726. package/scripts/_dbg-final-acceptance.mjs +1 -1
  727. package/scripts/_dbg-final-full-e2e.mjs +1 -1
  728. package/scripts/_dbg-final-shots.mjs +32 -0
  729. package/scripts/_dbg-final-t6-hitl.mjs +1 -1
  730. package/scripts/_dbg-fix-unused-imports.py +41 -0
  731. package/scripts/_dbg-fresh-scene-e2e.mjs +1 -1
  732. package/scripts/_dbg-goose-probe.mjs +33 -0
  733. package/scripts/_dbg-goose-probe.sh +10 -0
  734. package/scripts/_dbg-groups-ui-verify.mjs +122 -0
  735. package/scripts/_dbg-harness-ui-shot.py +109 -0
  736. package/scripts/_dbg-hidden-check.mjs +1 -1
  737. package/scripts/_dbg-home-repro.mjs +1 -1
  738. package/scripts/_dbg-home-stack.mjs +1 -1
  739. package/scripts/_dbg-hydration-detail.mjs +1 -1
  740. package/scripts/_dbg-infra-lifecycle.mjs +1 -1
  741. package/scripts/_dbg-line-live-e2e.mjs +1 -1
  742. package/scripts/_dbg-line-repo-test.ts +10 -0
  743. package/scripts/_dbg-login-debug.py +23 -0
  744. package/scripts/_dbg-modbus-latency.mjs +22 -0
  745. package/scripts/_dbg-mqtt-chain-e2e.mjs +1 -1
  746. package/scripts/_dbg-oneshot-impl-probe.ts +67 -0
  747. package/scripts/_dbg-opt-team-e2e.mjs +1 -1
  748. package/scripts/_dbg-panesplitter-fix-check.mjs +1 -1
  749. package/scripts/_dbg-phase-e3-monitor.mjs +1 -1
  750. package/scripts/_dbg-pi-spawn-probe.ts +33 -0
  751. package/scripts/_dbg-plc-e2e.mjs +1 -1
  752. package/scripts/_dbg-plugin-config-ui.mjs +111 -0
  753. package/scripts/_dbg-plugin-panels-ui.mjs +54 -0
  754. package/scripts/_dbg-plugin-sink-rest.mjs +1 -1
  755. package/scripts/_dbg-plugin-sink-ui.mjs +1 -1
  756. package/scripts/_dbg-plugin-ui-wizard.mjs +1 -1
  757. package/scripts/_dbg-plugin-verify-e2e.mjs +1 -1
  758. package/scripts/_dbg-pop-clamp-verify.mjs +1 -1
  759. package/scripts/_dbg-preview-console.mjs +1 -1
  760. package/scripts/_dbg-preview-minrepro.mjs +1 -1
  761. package/scripts/_dbg-preview-pixels.mjs +1 -1
  762. package/scripts/_dbg-quality-pages-e2e.mjs +1 -1
  763. package/scripts/_dbg-qwen-acp-probe.mjs +30 -0
  764. package/scripts/_dbg-qwen-capture.mjs +21 -0
  765. package/scripts/_dbg-rail-tree-e2e.mjs +1 -1
  766. package/scripts/_dbg-real-driver-e2e.mjs +1 -1
  767. package/scripts/_dbg-real-scenario-timeline.log +55 -123
  768. package/scripts/_dbg-redesign-shots.mjs +1 -1
  769. package/scripts/_dbg-release-smoke.mjs +1 -1
  770. package/scripts/_dbg-render-perf.mjs +142 -0
  771. package/scripts/_dbg-render-regression.mjs +130 -0
  772. package/scripts/_dbg-resolve-probe.ts +6 -0
  773. package/scripts/_dbg-restart-persist.mjs +1 -1
  774. package/scripts/_dbg-sc001-dispatch.mjs +1 -1
  775. package/scripts/_dbg-scenario-final-shot.mjs +1 -1
  776. package/scripts/_dbg-scenario-phase-e2.mjs +1 -1
  777. package/scripts/_dbg-scenario-phase-e3.mjs +1 -1
  778. package/scripts/_dbg-scenario-phase1.mjs +1 -1
  779. package/scripts/_dbg-scenario-phase2.mjs +1 -1
  780. package/scripts/_dbg-scenario-phase3-monitor.mjs +1 -1
  781. package/scripts/_dbg-scenario-phase3.mjs +1 -1
  782. package/scripts/_dbg-settings-draft-probe.mjs +39 -0
  783. package/scripts/_dbg-settings-probe.mjs +33 -0
  784. package/scripts/_dbg-task-cancel-probe.mjs +66 -0
  785. package/scripts/_dbg-town-alarm-e2e.mjs +1 -1
  786. package/scripts/_dbg-town-daq-shot.mjs +1 -1
  787. package/scripts/_dbg-town-full-e2e.mjs +1 -1
  788. package/scripts/_dbg-town-gate.mjs +1 -1
  789. package/scripts/_dbg-town-ins-probe.mjs +1 -1
  790. package/scripts/_dbg-town-perf.mjs +1 -1
  791. package/scripts/_dbg-town-realtime.mjs +1 -1
  792. package/scripts/_dbg-town-shot.py +25 -0
  793. package/scripts/_dbg-town-shot3.mjs +1 -1
  794. package/scripts/_dbg-town-smoke.mjs +54 -0
  795. package/scripts/_dbg-town-truth.mjs +1 -1
  796. package/scripts/_dbg-town-truth2.mjs +1 -1
  797. package/scripts/_dbg-trend-expand-test.mjs +1 -1
  798. package/scripts/_dbg-twindaq-focus.mjs +1 -1
  799. package/scripts/_dbg-ui-polish-shot.mjs +1 -1
  800. package/scripts/_dbg-ui-polish-verify1.mjs +1 -1
  801. package/scripts/_dbg-ui-polish-verify2.mjs +1 -1
  802. package/scripts/_dbg-ui-polish-verify3.mjs +1 -1
  803. package/scripts/_dbg-ui-polish-verify4.mjs +1 -1
  804. package/scripts/_dbg-unify-shot.mjs +1 -1
  805. package/scripts/_dbg-uplink-probe.mjs +1 -1
  806. package/scripts/_dbg-wizard-preview-shot.mjs +1 -1
  807. package/scripts/_dbg-wizard-ui-e2e.mjs +1 -1
  808. package/scripts/_dbg-ws-probe.mjs +1 -1
  809. package/scripts/_dbg-wsdot-sanity.mjs +1 -1
  810. package/scripts/_node-state-probe.mjs +1 -1
  811. package/scripts/_tmp-args-probe.mjs +20 -0
  812. package/scripts/_tmp-cyc-entry.mjs +8 -0
  813. package/scripts/_tmp-cyc-main.mjs +5 -0
  814. package/scripts/_tmp-cyc-mod.mjs +2 -0
  815. package/scripts/_tmp-cycle-a.mjs +6 -0
  816. package/scripts/_tmp-cycle-b.mjs +2 -0
  817. package/scripts/_tmp-cycle-probe.mjs +4 -0
  818. package/scripts/_tmp-entry-variant.mjs +2 -0
  819. package/scripts/_tmp-help-probe.mjs +19 -0
  820. package/scripts/_tmp-help-probe2.mjs +2 -0
  821. package/scripts/_tmp-trace-preload.mjs +1 -0
  822. package/scripts/aml-agent-bridge.ts +230 -0
  823. package/scripts/aml-industrial-loop.ts +232 -0
  824. package/scripts/aml-ui-smoke.mjs +67 -0
  825. package/scripts/aw-start-smoke.mjs +194 -0
  826. package/scripts/design-verify-templates.mjs +1 -1
  827. package/scripts/device-line-restore.mjs +1 -1
  828. package/scripts/e2e-aml.ts +259 -0
  829. package/scripts/e2e-config-groups.mjs +238 -0
  830. package/scripts/e2e-full-closedloop.mjs +911 -0
  831. package/scripts/e2e-full-scenario.ts +321 -0
  832. package/scripts/e2e-harness-consistency.ts +204 -0
  833. package/scripts/e2e-multi-harness.ts +233 -76
  834. package/scripts/e2e-plc-plugin-closedloop.mjs +518 -0
  835. package/scripts/e2e-real-scenario.mjs +466 -452
  836. package/scripts/e2e-template-isolation.mjs +2 -2
  837. package/scripts/experiment-castfilm-closedloop.mjs +423 -0
  838. package/scripts/experiment-castfilm-finish.mjs +194 -0
  839. package/scripts/experiment-castfilm-ui-shot.mjs +52 -0
  840. package/scripts/experiment-castfilm-viz.mjs +172 -0
  841. package/scripts/i18n-merge.mjs +152 -30
  842. package/scripts/production-closed-loop-e2e.mjs +300 -0
  843. package/scripts/team-plugins-api-smoke.mjs +149 -0
  844. package/scripts/test-aml-integration.ts +159 -0
  845. package/scripts/test-aml-job.ts +174 -0
  846. package/scripts/test-aml-unit.ts +184 -0
  847. package/scripts/test-cli-exit.mjs +235 -0
  848. package/scripts/test-daq-frame-race.mjs +310 -0
  849. package/scripts/test-data-root.mjs +208 -0
  850. package/scripts/test-log-flooding.mjs +160 -0
  851. package/scripts/test-lru.mjs +78 -0
  852. package/scripts/test-memory-month-query.mjs +62 -0
  853. package/scripts/test-plugin-hardening.mjs +45 -0
  854. package/scripts/test-rollback-index.mjs +79 -0
  855. package/scripts/test-sdk-surface.mjs +155 -0
  856. package/scripts/three-system-e2e.mjs +662 -0
  857. package/scripts/town-scene-clear.mjs +1 -1
  858. package/sdk/client.d.mts +110 -0
  859. package/sdk/client.mjs +144 -124
  860. package/sdk/context.mjs +161 -1
  861. package/sdk/index.d.mts +37 -5
  862. package/sdk/index.mjs +44 -41
  863. package/sdk/lifecycle.mjs +4 -1
  864. package/server/api/plugins/[name]/[...path].ts +46 -31
  865. package/server/api/plugins/i18n.get.ts +12 -0
  866. package/server/api/system/config-groups/[id].delete.ts +21 -0
  867. package/server/api/system/config-groups/[id].patch.ts +26 -0
  868. package/server/api/system/config-groups/index.get.ts +21 -0
  869. package/server/api/system/config-groups/index.post.ts +33 -0
  870. package/server/api/system/settings/events.get.ts +8 -4
  871. package/server/api/workshop/agent-tools/bindings/[id].delete.ts +6 -1
  872. package/server/api/workshop/agent-tools/bindings/[id].patch.ts +12 -3
  873. package/server/api/workshop/agent-tools/bindings/index.get.ts +29 -2
  874. package/server/api/workshop/agent-tools/invoke.post.ts +30 -5
  875. package/server/api/workshop/aml/datasets/[id]/preview.get.ts +68 -0
  876. package/server/api/workshop/aml/datasets/[id].get.ts +24 -0
  877. package/server/api/workshop/aml/datasets/index.get.ts +20 -0
  878. package/server/api/workshop/aml/datasets/index.post.ts +27 -0
  879. package/server/api/workshop/aml/experiments/index.get.ts +35 -0
  880. package/server/api/workshop/aml/index.get.ts +24 -0
  881. package/server/api/workshop/aml/jobs/[id]/cancel.post.ts +21 -0
  882. package/server/api/workshop/aml/jobs/[id]/logs.get.ts +23 -0
  883. package/server/api/workshop/aml/jobs/[id]/retry.post.ts +20 -0
  884. package/server/api/workshop/aml/jobs/[id].get.ts +23 -0
  885. package/server/api/workshop/aml/jobs/index.get.ts +26 -0
  886. package/server/api/workshop/aml/jobs/index.post.ts +44 -0
  887. package/server/api/workshop/aml/models/[id]/predict.post.ts +24 -0
  888. package/server/api/workshop/aml/models/[id]/promote.post.ts +30 -0
  889. package/server/api/workshop/aml/models/index.get.ts +48 -0
  890. package/server/api/workshop/channels/[id]/plugins/index.get.ts +35 -0
  891. package/server/api/workshop/channels/[id]/plugins/index.put.ts +39 -0
  892. package/server/api/workshop/channels.post.ts +17 -0
  893. package/server/api/workshop/daq/[id].delete.ts +6 -0
  894. package/server/api/workshop/dcw/[id].patch.ts +14 -2
  895. package/server/api/workshop/hitl/respond.post.ts +3 -1
  896. package/server/api/workshop/teams/[id]/plugins/index.get.ts +36 -0
  897. package/server/api/workshop/teams/[id]/plugins/index.put.ts +42 -0
  898. package/server/api/workshop/teams/index.post.ts +13 -0
  899. package/server/api/workshop/users/me.get.ts +5 -0
  900. package/server/api/workshop/ws.ts +14 -2
  901. package/server/data/daqs.json +1648 -123
  902. package/server/data/dcw-lines.json +308 -0
  903. package/server/data/dcw-products.json +147 -0
  904. package/server/data/dcw-recipes.json +891 -1
  905. package/server/data/dcw-rollback.json +11903 -5540
  906. package/server/data/dcw-runs.json +3745 -3559
  907. package/server/data/dcw-templates.json +120 -0
  908. package/server/data/dcw-writes.json +1872 -0
  909. package/server/data/dcws.json +1723 -434
  910. package/server/data/line-runs.json +137 -27
  911. package/server/data/scene-layouts.json +66 -0
  912. package/server/harness/pi-aw-tools.mjs +51 -0
  913. package/server/plugins/aw-plugins.ts +35 -27
  914. package/server/plugins/dev-stability-guard.ts +63 -63
  915. package/server/plugins/system-config.ts +10 -11
  916. package/server/plugins/workshop.ts +10 -0
  917. package/server/plugins-builtin/diag-bridge/client.mjs +84 -0
  918. package/server/plugins-builtin/diag-bridge/i18n.json +72 -0
  919. package/server/plugins-builtin/diag-bridge/index.mjs +661 -0
  920. package/server/plugins-builtin/rag-bridge/client.mjs +108 -0
  921. package/server/plugins-builtin/rag-bridge/i18n.json +60 -0
  922. package/server/plugins-builtin/rag-bridge/index.mjs +411 -0
  923. package/server/services/system-config.ts +610 -396
  924. package/server/services/workshop/agents/adapters/line-spawn.ts +15 -6
  925. package/server/services/workshop/agents/adapters/one-shot-cli-agent.ts +530 -0
  926. package/server/services/workshop/agents/base-agent.ts +210 -0
  927. package/server/services/workshop/agents/binding-authz.ts +57 -0
  928. package/server/services/workshop/agents/claude-agent.ts +546 -30
  929. package/server/services/workshop/agents/codex-agent.ts +729 -822
  930. package/server/services/workshop/agents/copilot-agent.ts +136 -0
  931. package/server/services/workshop/agents/crush-agent.ts +107 -0
  932. package/server/services/workshop/agents/cursor-agent.ts +102 -0
  933. package/server/services/workshop/agents/dsh-agent.ts +578 -670
  934. package/server/services/workshop/agents/gemini-agent.ts +121 -0
  935. package/server/services/workshop/agents/goose-agent.ts +98 -0
  936. package/server/services/workshop/agents/harness-models.ts +305 -270
  937. package/server/services/workshop/agents/hermes-agent.ts +528 -0
  938. package/server/services/workshop/agents/host-tool-bridge.ts +710 -642
  939. package/server/services/workshop/agents/industrial-tools.ts +659 -7
  940. package/server/services/workshop/agents/omp-agent.ts +1193 -1178
  941. package/server/services/workshop/agents/opencode-agent.ts +936 -987
  942. package/server/services/workshop/agents/pi-agent.ts +108 -0
  943. package/server/services/workshop/agents/plugin-tools.ts +10 -1
  944. package/server/services/workshop/agents/qwen-agent.ts +540 -0
  945. package/server/services/workshop/agents/registry.ts +117 -5
  946. package/server/services/workshop/agents/tool-approvals.ts +3 -3
  947. package/server/services/workshop/aml/aml.repo.ts +368 -0
  948. package/server/services/workshop/aml/clean.ts +120 -0
  949. package/server/services/workshop/aml/dataset-builder.ts +491 -0
  950. package/server/services/workshop/aml/gates.ts +121 -0
  951. package/server/services/workshop/aml/job-orchestrator.ts +650 -0
  952. package/server/services/workshop/aml/model-registry.ts +169 -0
  953. package/server/services/workshop/aml/predictor.ts +262 -0
  954. package/server/services/workshop/aml/python/aml_eval.py +171 -0
  955. package/server/services/workshop/aml/python/amlkit.py +120 -0
  956. package/server/services/workshop/aml/python/requirements.txt +7 -0
  957. package/server/services/workshop/aml/python/train-example.py +92 -0
  958. package/server/services/workshop/aml/python-runtime.ts +217 -0
  959. package/server/services/workshop/aml/retention.ts +98 -0
  960. package/server/services/workshop/aml/runtime.ts +45 -0
  961. package/server/services/workshop/aml/spec.ts +63 -0
  962. package/server/services/workshop/aml/stats.ts +140 -0
  963. package/server/services/workshop/daq/bus/mqtt.adapter.ts +8 -1
  964. package/server/services/workshop/daq/daq-controller.ts +147 -19
  965. package/server/services/workshop/daq/daq-node.repo.ts +13 -11
  966. package/server/services/workshop/daq/daq-runtime.ts +11 -0
  967. package/server/services/workshop/daq/drivers.ts +89 -8
  968. package/server/services/workshop/db/aml-team-seeds.ts +118 -0
  969. package/server/services/workshop/db/channel-plugins.repo.ts +91 -0
  970. package/server/services/workshop/db/database.ts +89 -1
  971. package/server/services/workshop/db/memory.repo.ts +31 -0
  972. package/server/services/workshop/db/user.repo.ts +9 -0
  973. package/server/services/workshop/dcw/dcw-controller.ts +33 -7
  974. package/server/services/workshop/dcw/dcw-line.repo.ts +5 -3
  975. package/server/services/workshop/dcw/dcw-node.repo.ts +4 -4
  976. package/server/services/workshop/dcw/dcw-product.repo.ts +8 -8
  977. package/server/services/workshop/dcw/dcw-recipe.repo.ts +6 -7
  978. package/server/services/workshop/dcw/dcw-runtime.ts +16 -2
  979. package/server/services/workshop/dcw/dcw-templates.ts +4 -4
  980. package/server/services/workshop/dcw/line-run.ts +5 -5
  981. package/server/services/workshop/dcw/recipe-rollback-manager.ts +3 -1
  982. package/server/services/workshop/dcw/recipe-rollback.repo.ts +155 -52
  983. package/server/services/workshop/logger.ts +145 -3
  984. package/server/services/workshop/plugins/host.mjs +857 -518
  985. package/server/services/workshop/prompts/loader.ts +32 -6
  986. package/server/services/workshop/runtime/manager.ts +3016 -2968
  987. package/server/services/workshop/runtime/scheduler-loop.ts +18 -1
  988. package/server/services/workshop/scene/scene-layout.repo.ts +5 -5
  989. package/server/services/workshop/settings.ts +64 -0
  990. package/shared/config/engine.mjs +5 -0
  991. package/shared/config/groups.mjs +220 -0
  992. package/shared/config/home.mjs +11 -2
  993. package/shared/config/schema.json +31 -2
  994. package/shared/daq-protocol.ts +6 -0
  995. package/shared/lru.mjs +94 -0
  996. package/shared/workshop-protocol.ts +2 -2
  997. package/.output/public/_nuxt/BAfp6tmu.js +0 -14
  998. package/.output/public/_nuxt/BUcmySDa2.js +0 -209
  999. package/.output/public/_nuxt/Bc-_IsBP.js +0 -19
  1000. package/.output/public/_nuxt/BvNJUu3s.js +0 -1
  1001. package/.output/public/_nuxt/BytVi9VX2.js +0 -4
  1002. package/.output/public/_nuxt/C1CSiSBN.js +0 -1
  1003. package/.output/public/_nuxt/CAGL7TNK.js +0 -1
  1004. package/.output/public/_nuxt/CDLv-n51.js +0 -1
  1005. package/.output/public/_nuxt/CJviSvm-.js +0 -1
  1006. package/.output/public/_nuxt/CLZWFhZC.js +0 -1
  1007. package/.output/public/_nuxt/CYzpZzB_.js +0 -1
  1008. package/.output/public/_nuxt/Cb3SnTM8.js +0 -1
  1009. package/.output/public/_nuxt/CjXIpPMR.js +0 -1
  1010. package/.output/public/_nuxt/CxY6LfeN.js +0 -1
  1011. package/.output/public/_nuxt/D6HDb-vN2.js +0 -1
  1012. package/.output/public/_nuxt/D95h62Jn.js +0 -1
  1013. package/.output/public/_nuxt/DAR70Lf52.js +0 -1
  1014. package/.output/public/_nuxt/DGAOugLt.js +0 -1
  1015. package/.output/public/_nuxt/DKHcFE1i.js +0 -1
  1016. package/.output/public/_nuxt/DSa2O56y.js +0 -1
  1017. package/.output/public/_nuxt/DUToq-k_.js +0 -1
  1018. package/.output/public/_nuxt/Dfe8vXdG.js +0 -1
  1019. package/.output/public/_nuxt/DjtE7AYt.js +0 -1
  1020. package/.output/public/_nuxt/DvgKXPgu2.js +0 -13
  1021. package/.output/public/_nuxt/JOwsShod.js +0 -2
  1022. package/.output/public/_nuxt/X6IraCTB.js +0 -1
  1023. package/.output/public/_nuxt/_id_.C-YXjn8Q.css +0 -1
  1024. package/.output/public/_nuxt/_wsId_.BqWBlY7X.css +0 -1
  1025. package/.output/public/_nuxt/agents.CB9Ck7VQ.css +0 -1
  1026. package/.output/public/_nuxt/b50gYVZl.js +0 -1
  1027. package/.output/public/_nuxt/builds/meta/024de5f7-6a10-4f53-82ab-bc65f3ec9e35.json +0 -1
  1028. package/.output/public/_nuxt/daq.3OKj58HH.css +0 -1
  1029. package/.output/public/_nuxt/default.BbgdTDCk.css +0 -1
  1030. package/.output/public/_nuxt/entry.AZM1Culo.css +0 -1
  1031. package/.output/public/_nuxt/pages.CG8UJ2TK.css +0 -1
  1032. package/.output/public/_nuxt/plugins.DpCuwaJt.css +0 -1
  1033. package/.output/public/_nuxt/settings.BqMF2nfj.css +0 -1
  1034. package/.output/public/_nuxt/teams.DN0pAGGu.css +0 -1
  1035. package/.output/server/chunks/build/_id_-DQDqj-cZ.mjs.map +0 -1
  1036. package/.output/server/chunks/build/_id_-DY6v6sqB.mjs.map +0 -1
  1037. package/.output/server/chunks/build/agents-GnmUGZir.mjs.map +0 -1
  1038. package/.output/server/chunks/build/alert-qJnjyRcP.mjs.map +0 -1
  1039. package/.output/server/chunks/build/channel-templates-B4z6v8Z5.mjs.map +0 -1
  1040. package/.output/server/chunks/build/daq-B-3xCp_2.mjs.map +0 -1
  1041. package/.output/server/chunks/build/dcw-BL2dhuz7.mjs.map +0 -1
  1042. package/.output/server/chunks/build/logs-Dto_umFY.mjs.map +0 -1
  1043. package/.output/server/chunks/build/pages-Dc2H1QFu.mjs.map +0 -1
  1044. package/.output/server/chunks/build/permissions-BTRW2CVd.mjs.map +0 -1
  1045. package/.output/server/chunks/build/plugins-DZR0T4Mh.mjs.map +0 -1
  1046. package/.output/server/chunks/build/responsiveObserve-CS0UB6wQ.mjs +0 -78
  1047. package/.output/server/chunks/build/responsiveObserve-CS0UB6wQ.mjs.map +0 -1
  1048. package/.output/server/chunks/build/settings-UfGyDgM7.mjs +0 -567
  1049. package/.output/server/chunks/build/settings-UfGyDgM7.mjs.map +0 -1
  1050. package/.output/server/chunks/build/tag-NO9jEqKy.mjs.map +0 -1
  1051. package/.output/server/chunks/build/teams-Cbg27MWW.mjs.map +0 -1
  1052. package/.output/server/chunks/build/tokens-Bmm6rDfj.mjs.map +0 -1
  1053. package/.output/server/chunks/build/town-Dsh0jlwZ.mjs.map +0 -1
  1054. package/.output/server/chunks/build/useDaqStream-DkRL3tEW.mjs.map +0 -1
  1055. package/.output/server/chunks/build/useDcwStream-DyB2ufQI.mjs.map +0 -1
  1056. package/.output/server/chunks/build/users-B50HHrfi.mjs.map +0 -1
  1057. /package/.output/public/_nuxt/{ORt9oDIy.js → ORt9oDIy2.js} +0 -0
@@ -1,642 +1,710 @@
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 { daqRuntimeSettings } from '../settings'
24
- import { toolDaqFrames, toolDaqQuery, toolDcwControl, toolDcwJudge, toolDcwJournal, toolDcwRead, toolDcwRollback, toolLineContext, toolMyIndustrialNodes, toolOpsLog, toolRecipeLog, toolRecipeRollback, toolRecipeUpdate, toolRecipeVersions } from './industrial-tools'
25
- import { listPluginTools } from './plugin-tools'
26
- import { extractTaskMode } from '../runtime/execution-mode'
27
-
28
- /** host tool 定义(外置 .AgentWorkShop/prompts/host-tools.json;加载器缓存) */
29
- export const HOST_TOOLS: RpcHostToolDefinition[] = loadHostToolDefs()
30
-
31
- /** 仅 lead 可见的工具名(dispatch/调度/团队管理面;worker 注册时剔除,压缩工具上下文) */
32
- export const LEAD_ONLY_TOOL_NAMES = new Set([
33
- 'dispatch_task',
34
- 'get_queue_overview',
35
- 'read_channel_mail',
36
- 'reassign_task',
37
- 'update_task',
38
- 'create_team_agent',
39
- 'update_team_agent',
40
- 'remove_team_agent',
41
- ])
42
-
43
- /** 占位符动态注入:工具描述里的运行时配置值(每次装配实时计算,配置热重载后 Agent 拿到新值) */
44
- function applyDescriptionPlaceholders(tools: RpcHostToolDefinition[]): RpcHostToolDefinition[] {
45
- let q: { defaultBucketMs: number, minBucketMs: number } | null = null
46
- try {
47
- q = daqRuntimeSettings().query
48
- }
49
- catch { /* 设置系统不可用(单测) → 保留原始描述 */ }
50
- if (!q) return tools
51
- const map: Record<string, string> = {
52
- queryDefaultBucketMs: String(q.defaultBucketMs),
53
- queryMinBucketMs: String(q.minBucketMs),
54
- }
55
- return tools.map(t => ({
56
- ...t,
57
- description: t.description.replace(/\{(queryDefaultBucketMs|queryMinBucketMs)\}/g, (_, k) => map[k] ?? _),
58
- parameters: JSON.parse(JSON.stringify(t.parameters ?? {}).replace(/\{(queryDefaultBucketMs|queryMinBucketMs)\}/g, (_m: string, k: string) => map[k] ?? _m)),
59
- }))
60
- }
61
-
62
- /**
63
- * 按角色装配 host tools:lead = 全量;worker = 剔除 lead 专属(执行面 + 通信面 + 记忆面);
64
- * 尾部合并插件注册工具(roles 过滤,缺省双角色可用)。
65
- * 全 harness 共用:omp 经 set_host_tools 下发;其余引擎经 MCP 桥 tools/list 拉取。
66
- */
67
- export function hostToolsForRole(role: 'lead' | 'worker'): RpcHostToolDefinition[] {
68
- const base = role === 'lead'
69
- ? HOST_TOOLS
70
- : HOST_TOOLS.filter(t => !LEAD_ONLY_TOOL_NAMES.has(t.name))
71
- const out = [...base]
72
- for (const [name, tool] of listPluginTools()) {
73
- if (out.some(t => t.name === name)) continue
74
- if (tool.roles && !tool.roles.includes(role)) continue
75
- out.push({ name, label: tool.label ?? name, description: tool.description, parameters: tool.parameters ?? {} })
76
- }
77
- return applyDescriptionPlaceholders(out)
78
- }
79
-
80
- /** 工具调用请求(与引擎协议解耦的规范化形状) */
81
- export interface HostToolCall {
82
- toolName: string
83
- arguments: Record<string, unknown>
84
- }
85
-
86
- export interface HostToolResult {
87
- text: string
88
- isError?: boolean
89
- }
90
-
91
- /** 会话态(impl 持有,桥读写):当前执行任务 + 待回执上下文 */
92
- export interface HostToolSessionState {
93
- currentTaskId: string | null
94
- replyContext: { fromId: string, messageId: string } | null
95
- }
96
-
97
- export function createSessionState(): HostToolSessionState {
98
- return { currentTaskId: null, replyContext: null }
99
- }
100
-
101
- /** 桥上下文:impl 注入身份与 workspace 取值器 */
102
- export interface HostToolBridgeContext {
103
- identity: { agentId: string, channelId: string, role: 'lead' | 'worker', name: string }
104
- state: HostToolSessionState
105
- getWorkspace(): AgentWorkspace | null
106
- }
107
-
108
- /** 从消息 parts 提取纯文本(多 harness 共用) */
109
- export function partsToText(parts: Part[]): string {
110
- return parts
111
- .map((p) => {
112
- if ('text' in p) return p.text
113
- if ('data' in p) return JSON.stringify(p.data)
114
- if ('url' in p) return p.url
115
- if ('raw' in p) return p.raw
116
- return ''
117
- })
118
- .join('\n')
119
- }
120
-
121
- /**
122
- * 分发一次 host tool 调用(全引擎唯一入口):
123
- * 插件工具优先 → workspace 面 → 工业工具族 → 插件兜底 → 未知工具。
124
- */
125
- export async function dispatchHostTool(ctx: HostToolBridgeContext, req: HostToolCall): Promise<HostToolResult> {
126
- const identity = ctx.identity
127
- // 插件工具分发(ctx.omp.registerTool 注册的自定义工具;不依赖 workspace,优先于内置面)
128
- const pluginTool = listPluginTools().get(req.toolName)
129
- if (pluginTool) {
130
- try {
131
- return await pluginTool.handler(req.arguments ?? {}, identity)
132
- }
133
- catch (err) {
134
- return {
135
- text: `工具执行异常(${req.toolName}): ${err instanceof Error ? err.message : String(err)}`,
136
- isError: true,
137
- }
138
- }
139
- }
140
- const args = req.arguments ?? {}
141
-
142
- // 工业工具族不依赖 workspace(只按 agentId 查绑定与节点),先于 workspace 门控执行 ——
143
- // 否则 worker 首回合前的 REST/MCP 直调(my_industrial_nodes 等)会被误拒
144
- switch (req.toolName) {
145
- case 'my_industrial_nodes':
146
- return toolMyIndustrialNodes(identity.agentId)
147
- case 'dcw_control':
148
- return toolDcwControl(identity.agentId, args as { node_id?: string, value?: number | string, hypothesis?: string, task_id?: string })
149
- case 'dcw_read':
150
- return toolDcwRead(identity.agentId, args as { node_id?: string })
151
- case 'daq_query':
152
- return toolDaqQuery(identity.agentId, args as Parameters<typeof toolDaqQuery>[1])
153
- case 'daq_frames':
154
- return toolDaqFrames(identity.agentId, args as Parameters<typeof toolDaqFrames>[1])
155
- case 'dcw_judge':
156
- return toolDcwJudge(identity.agentId, args as { record_id?: string, verdict?: string, reason?: string })
157
- case 'dcw_rollback':
158
- return toolDcwRollback(identity.agentId, args as { record_id?: string, node_id?: string, to?: string })
159
- case 'dcw_journal':
160
- return toolDcwJournal(identity.agentId, args as { node_id?: string, recipe_id?: string, limit?: number | string })
161
- case 'ops_log':
162
- return toolOpsLog(identity.agentId, args as Parameters<typeof toolOpsLog>[1])
163
- case 'recipe_log':
164
- return toolRecipeLog(identity.agentId, args as Parameters<typeof toolRecipeLog>[1])
165
- case 'line_context':
166
- return toolLineContext(identity.agentId, args as { line_id?: string })
167
- case 'recipe_versions':
168
- return toolRecipeVersions(identity.agentId, args as { recipe_id?: string, limit?: number | string })
169
- case 'recipe_update':
170
- return toolRecipeUpdate(identity.agentId, args as Parameters<typeof toolRecipeUpdate>[1])
171
- case 'recipe_rollback':
172
- return toolRecipeRollback(identity.agentId, args as Parameters<typeof toolRecipeRollback>[1])
173
- }
174
-
175
- const ws = ctx.getWorkspace()
176
- if (!ws) {
177
- return { text: 'workspace 未就绪', isError: true }
178
- }
179
-
180
- try {
181
- switch (req.toolName) {
182
- case 'report_progress': {
183
- const progress = args.progress as number
184
- const message = args.message as string | undefined
185
- const taskId = ctx.state.currentTaskId
186
- if (!taskId) return { text: '无当前任务上下文', isError: true }
187
- await ws.reportTask({ taskId, progress, message })
188
- return { text: `进度已上报: ${progress}%${message ? ` (${message})` : ''}` }
189
- }
190
-
191
- case 'complete_task': {
192
- const summary = args.summary as string
193
- const deliverable = args.deliverable as string | undefined
194
- const taskId = (args.task_id as string | undefined) ?? ctx.state.currentTaskId
195
- if (!taskId) return { text: '无任务 ID', isError: true }
196
- // 父任务保护:有未完成子任务时拒绝完成(lead 须等 worker 交付)
197
- const allTasks = await ws.listTasks()
198
- const incompleteChildren = allTasks.filter(t => t.parentId === taskId && t.state !== 'COMPLETED' && t.state !== 'CANCELED')
199
- if (incompleteChildren.length > 0) {
200
- return {
201
- text: `任务 ${taskId} 有 ${incompleteChildren.length} 个未完成子任务,不能完成父任务。请等待子任务完成。`,
202
- isError: true,
203
- }
204
- }
205
- // 终态幂等:任务已被平台收口(看门狗取消/调度器完成)时不撞状态机 ——
206
- // 给 Agent 明确的"无需再完成,继续下一项"信号,杜绝重复重试烧 token
207
- const current = await ws.getTask(taskId)
208
- if (current && current.state !== 'SUBMITTED' && current.state !== 'ASSIGNED' && current.state !== 'WORKING' && current.state !== 'WAITING') {
209
- if (current.state === 'COMPLETED') {
210
- return { text: `任务 ${taskId} 已是完成状态(可能已被平台收口),无需重复完成。` }
211
- }
212
- try {
213
- const q = await ws.myQueue()
214
- const next = q.queued[0]
215
- return {
216
- text: `任务 ${taskId} 已被平台${current.state === 'CANCELED' ? '取消(如停滞回收/上级作废)' : '判定失败'},不能再标记完成 —— 这不是你的错误,也无需重试。${next ? `队列还有 ${q.queued.length} 项,下一项「${next.title}」即将开始,请继续处理。` : '队列为空,保持待命。'}`,
217
- isError: false,
218
- }
219
- }
220
- catch {
221
- return { text: `任务 ${taskId} 已被平台${current.state === 'CANCELED' ? '取消' : '判定失败'},无需再完成,请继续处理队列下一项。` }
222
- }
223
- }
224
- const artifacts: A2AArtifact[] = []
225
- if (deliverable || summary) {
226
- artifacts.push({
227
- artifactId: randomUUID(),
228
- name: 'deliverable',
229
- parts: [{ text: deliverable ?? summary }],
230
- })
231
- }
232
- await ws.completeTask(taskId, artifacts)
233
- ctx.state.currentTaskId = null
234
- // 完成即衔接:报告队列余量与下一项(状态同步 + 驱动继续处理)
235
- try {
236
- const q = await ws.myQueue()
237
- const next = q.queued[0]
238
- if (next) {
239
- return {
240
- text: `任务 ${taskId} 已完成(状态已同步为 COMPLETED)。你的队列还有 ${q.queued.length} 项待处理,下一项:「${next.title}」(即将自动开始;收到任务指派消息后按工作流执行,完成后同样调用 complete_task)。`,
241
- }
242
- }
243
- return { text: `任务 ${taskId} 已完成(状态已同步为 COMPLETED),队列为空。保持待命:新任务/实时消息会自动到达你的信箱。` }
244
- }
245
- catch {
246
- return { text: `任务 ${taskId} 已完成(状态已同步为 COMPLETED)。` }
247
- }
248
- }
249
-
250
- case 'dispatch_task': {
251
- const assigneeId = args.assignee_id as string
252
- const title = args.title as string
253
- const description = args.description as string | undefined
254
- const parentTaskId = args.parent_task_id as string | undefined
255
- const routeReason = args.route_reason as string | undefined
256
- // 重复派发守卫(真实场景实测:lead 模型可能对同一目标重复派发,引发协调风暴):
257
- // 同父任务下已存在同标题非终态子任务 → 不再创建,直接指路既有任务
258
- const dup = await ws.listTasks()
259
- const existing = dup.find(t =>
260
- t.parentId === parentTaskId
261
- && t.title === title
262
- && t.state !== 'COMPLETED' && t.state !== 'FAILED' && t.state !== 'CANCELED')
263
- if (existing) {
264
- return {
265
- text: `未创建:同父任务下已存在同标题进行中子任务 ${existing.id}("${existing.title}",state=${existing.state},assignee=${existing.assigneeId})。请勿重复派发;若需跟进请对该任务 notify 或 reassign。`,
266
- }
267
- }
268
- const task = await ws.dispatchTask({ assigneeId, title, description, parentTaskId, routeReason })
269
- return { text: `子任务 ${task.id} 已创建并指派 → ${assigneeId}(父任务 ${parentTaskId ?? '无'},标题: ${title}${routeReason ? `,路由理由: ${routeReason}` : ''})` }
270
- }
271
-
272
- case 'send_message_to_agent': {
273
- const toAgentId = args.to_agent_id as string
274
- const message = args.message as string
275
- // 回执自动实时:回复(in_reply_to)默认提升为 immediate——
276
- // 接收方正等待该结果,realtime 路由会把回复直接注入其运行中的会话
277
- let priority = (args.priority as string | undefined) ?? 'task'
278
- const metadata: Record<string, unknown> = {}
279
- if (args.require_reply === true) metadata['x-aw-require-reply'] = 'true'
280
- let inReplyTo = args.in_reply_to as string | undefined
281
- // 自动关联兜底:LLM 省略 in_reply_to 时,按待回执上下文盖章
282
- const replyCtx = ctx.state.replyContext
283
- ctx.state.replyContext = null
284
- if (!inReplyTo && replyCtx && replyCtx.fromId === toAgentId) {
285
- inReplyTo = replyCtx.messageId
286
- }
287
- if (inReplyTo) {
288
- metadata['x-aw-in-reply-to'] = inReplyTo
289
- if (priority === 'task') priority = 'immediate'
290
- }
291
- metadata['x-aw-msg-priority'] = priority
292
- const sent = await ws.sendMessage({ toAgentId, parts: [{ text: message }], metadata })
293
- const triggerNote = inReplyTo
294
- ? `(回复 ${inReplyTo.slice(0, 8)}…,已实时推送给对方)`
295
- : metadata['x-aw-require-reply'] === 'true' ? '(已要求对方回复)' : ''
296
- return { text: `消息 ${sent.messageId.slice(0, 8)}… 已发送给 ${toAgentId}(priority=${priority})${triggerNote}` }
297
- }
298
-
299
- case 'send_cross_channel_message': {
300
- const toChannelId = args.to_channel_id as string
301
- const message = args.message as string
302
- if (!toChannelId || !message) return { text: '缺少 to_channel_id 或 message', isError: true }
303
- try {
304
- const r = await ws.sendCrossChannelMessage({
305
- toChannelId,
306
- parts: [{ text: message }],
307
- requireReply: args.require_reply === true,
308
- inReplyTo: args.in_reply_to as string | undefined,
309
- })
310
- const note = args.require_reply === true ? '(已要求对方 Leader 回复)' : ''
311
- return { text: `跨 Channel 消息 ${r.messageId.slice(0, 8)}… 已送达 channel「${r.toChannelName}」的 Leader(${r.toLeadAgentId.slice(0, 8)}…)${note}。对方将按你的信息需求处理;其回复会经 mailbox 到达你这里。` }
312
- }
313
- catch (err) {
314
- return { text: `跨 Channel 发送失败: ${err instanceof Error ? err.message : String(err)}(仅 Leader 可跨 Channel 通信)`, isError: true }
315
- }
316
- }
317
-
318
- case 'list_other_teams': {
319
- const teams = await ws.listOtherTeams()
320
- if (teams.length === 0) return { text: '当前没有其他团队(或均未启用)。' }
321
- const text = teams.map((t) => {
322
- const active = t.activeTasks.length > 0
323
- ? t.activeTasks.map(x => `「${x.title}」(${x.state})`).join('、')
324
- : '无进行中任务'
325
- const done = t.recentCompleted.length > 0
326
- ? t.recentCompleted.map(x => `「${x.title}」`).join('、')
327
- : '无'
328
- const mem = t.sharedMemories > 0 ? `共享记忆 ${t.sharedMemories} 条(可检索)` : '暂无共享记忆'
329
- return `- ${t.name}${t.description ? `(${t.description})` : ''} · lead=${t.leadName ?? '?'} · ${mem}\n 进行中: ${active}\n 近期完成: ${done}\n channel_id: ${t.channelId}`
330
- }).join('\n')
331
- return { text: `其他团队概览:\n${text}\n(需要协作时用 send_cross_channel_message 向对应团队 Leader 发信;查具体知识用 search_other_teams_memory)` }
332
- }
333
-
334
- case 'search_other_teams_memory': {
335
- const query = (args.query as string | undefined) ?? ''
336
- if (!query) return { text: '缺少 query', isError: true }
337
- const rows = await ws.searchOtherTeamsMemory({ query, limit: Number(args.limit ?? 5) })
338
- if (rows.length === 0) return { text: `其他团队的共享记忆中没有命中「${query}」的内容。` }
339
- const text = rows.map(r =>
340
- `- [${r.channelName}] 「${r.title}」(${r.createdAt.slice(0, 10)}): ${r.content}`).join('\n')
341
- return { text: `其他团队共享记忆命中 ${rows.length} 条:\n${text}` }
342
- }
343
-
344
- case 'refuse_task': {
345
- const taskId = args.task_id as string
346
- const reason = args.reason as string
347
- if (!taskId || !reason) return { text: '缺少 task_id 或 reason', isError: true }
348
- const r = await ws.refuseTask(taskId, reason)
349
- const notified = r.notifiedTo ? `拒绝回执已送达 ${r.notifiedTo.slice(0, 8)}` : '无回执对象(创建者已不在 channel)'
350
- return {
351
- text: `任务 ${taskId.slice(0, 8)}("${r.task.title}") 已拒绝(state=${r.task.state});${notified}。调度器将改派他人,请勿再处理该任务。`,
352
- }
353
- }
354
-
355
- case 'poll_messages': {
356
- const limit = (args.limit as number | undefined) ?? 10
357
- const waitSec = Math.min(180, Math.max(0, Number(args.wait_seconds ?? 0) || 0))
358
- const msgs = await ws.waitMailbox(limit, waitSec * 1000)
359
- if (msgs.length === 0) {
360
- return {
361
- text: waitSec > 0
362
- ? `等待 ${waitSec}s 后收件箱仍为空。若此前已有"[实时消息 from X]"注入你的会话,那就是回复本身(无需再轮询);否则可继续处理其他工作,对方回复会以新回合送达。`
363
- : '收件箱为空(无未消费消息)。等待回复请用 wait_seconds 参数阻塞等待,不要反复空轮询。',
364
- }
365
- }
366
- // 读即取:协作消息(非任务投递)取出即确认;任务指派(assign)不确认
367
- const ackIds = msgs
368
- .filter(m => !m.metadata?.['x-aw-task-kind'])
369
- .map(m => m.messageId)
370
- if (ackIds.length > 0) await ws.ackMailbox(ackIds)
371
- const trigger = msgs.find(m =>
372
- m.metadata?.['x-aw-require-reply'] === 'true'
373
- && typeof m.metadata?.['x-aw-from-agent'] === 'string')
374
- if (trigger) {
375
- ctx.state.replyContext = {
376
- fromId: String(trigger.metadata!['x-aw-from-agent']),
377
- messageId: trigger.messageId,
378
- }
379
- }
380
- const text = msgs.map((m, i) => {
381
- const from = m.metadata?.['x-aw-from-agent'] ?? '?'
382
- const reply = m.metadata?.['x-aw-in-reply-to']
383
- ? ` (回复 ${String(m.metadata['x-aw-in-reply-to']).slice(0, 8)}…)`
384
- : ''
385
- const needReply = m.metadata?.['x-aw-require-reply'] === 'true'
386
- ? ` [需回复:用 send_message_to_agent 回 ${from},in_reply_to=${m.messageId}]`
387
- : ''
388
- const body = m.parts.map(p => 'text' in p ? p.text : '').join(' ')
389
- return ` [${i + 1}/${msgs.length}] [from ${from}]${needReply}${reply} ${body.slice(0, 2000)}`
390
- }).join('\n')
391
- return {
392
- text:
393
- `未消费消息(${msgs.length},已读即取):\n${text}`
394
- + (msgs.length > 1
395
- ? '\n(收到多条:请按编号逐条处理并逐条回复,不要只回应最后一条或合并敷衍)'
396
- : ''),
397
- }
398
- }
399
-
400
- case 'read_channel_mail': {
401
- const limit = (args.limit as number | undefined) ?? 50
402
- const agentId = args.agent_id as string | undefined
403
- const mails = await ws.listMail({ limit, agentId })
404
- if (mails.length === 0) return { text: 'Channel 无邮件记录(或该成员无往来)' }
405
- const text = mails.map((m) => {
406
- const from = m.fromAgentId ?? '(系统)'
407
- const to = m.toAgentId ?? '(广播)'
408
- const body = partsToText(m.parts).trim().slice(0, 2000)
409
- const reply = m.metadata?.['x-aw-in-reply-to']
410
- ? ` [回复 ${String(m.metadata['x-aw-in-reply-to']).slice(0, 8)}…]`
411
- : ''
412
- const label = m.metadata?.['x-aw-task-kind'] === 'assign'
413
- ? '[任务指派]'
414
- : m.metadata?.['x-aw-msg-priority'] === 'immediate' ? '[实时]' : '[协作]'
415
- const state = m.state === 'pending' ? '未读' : m.state === 'consuming' ? '处理中' : '已读'
416
- return ` ${m.createdAt.slice(11, 19)} ${label} ${from} → ${to} (${state})${reply}: ${body || '(空)'}`
417
- }).join('\n')
418
- return { text: `Channel 邮件(${mails.length},倒序;可传 agent_id 查看指定成员信箱):\n${text}` }
419
- }
420
-
421
- case 'broadcast_message': {
422
- const message = args.message as string
423
- const priority = (args.priority as string | undefined) ?? 'task'
424
- const agents = await ws.listAgents()
425
- const others = agents.filter(a => a.id !== identity.agentId)
426
- for (const agent of others) {
427
- await ws.sendMessage({
428
- toAgentId: agent.id,
429
- parts: [{ text: message }],
430
- metadata: { 'x-aw-msg-priority': priority },
431
- })
432
- }
433
- return { text: `已广播给 ${others.length} 个 agent(priority=${priority})` }
434
- }
435
-
436
- case 'list_channel_tasks': {
437
- const tasks = await ws.listTasks()
438
- const text = tasks.map(t =>
439
- ` ${t.id} [${t.state}] "${t.title}" assignee=${t.assigneeId} progress=${t.progress}%`,
440
- ).join('\n')
441
- return { text: `Channel 任务(${tasks.length}):\n${text || '(空)'}` }
442
- }
443
-
444
- case 'get_my_task_queue': {
445
- const queue = await ws.myQueue()
446
- const fmt = (t: WorkspaceTask): string =>
447
- ` ${t.id} [${t.state}] "${t.title}" progress=${t.progress}%`
448
- return {
449
- text: [
450
- `我的任务队列(${identity.role}):`,
451
- `执行中: ${queue.current ? `${queue.current.id} "${queue.current.title}" (${queue.current.progress}%)` : '(无)'}`,
452
- `待执行(${queue.queued.length},FIFO):`,
453
- ...queue.queued.map(fmt),
454
- `已完成(${queue.completed.length}):`,
455
- ...queue.completed.map(fmt),
456
- ].join('\n'),
457
- }
458
- }
459
-
460
- case 'get_queue_overview': {
461
- const overview = await ws.queueOverview()
462
- const lines = overview.map(s =>
463
- ` ${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})`,
464
- )
465
- return { text: `团队队列总览(${overview.length}):\n${lines.join('\n') || '(空)'}` }
466
- }
467
-
468
- case 'reassign_task': {
469
- const taskId = args.task_id as string
470
- const toAgentId = args.to_agent_id as string
471
- const task = await ws.reassignTask(taskId, toAgentId)
472
- return { text: `任务 ${taskId}("${task.title}")已调配 → ${toAgentId}(state=${task.state})` }
473
- }
474
-
475
- case 'update_task': {
476
- const taskId = args.task_id as string
477
- const title = args.title as string | undefined
478
- const description = args.description as string | undefined
479
- const task = await ws.updateTask(taskId, { title, description })
480
- return { text: `任务 ${taskId} 已更新: "${task.title}"` }
481
- }
482
-
483
- case 'cancel_task': {
484
- const taskId = args.task_id as string
485
- // 守卫:goal/loop/pipeline 的 mode 父任务是用户的作业主任务,Agent 不得经工具取消
486
- const target = await ws.getTask(taskId).catch(() => null)
487
- if (target && extractTaskMode(target)) {
488
- return {
489
- text: `拒绝:任务 ${taskId} 是 mode 父任务(${target.title}),不能用 cancel_task 取消。若目标未达成 → dispatch_task 派发子任务补齐差距;若确认无法达成 → complete_task 并在交付中说明未达成原因。终止整个作业请由用户操作。`,
490
- }
491
- }
492
- await ws.cancelTask(taskId)
493
- return { text: `任务 ${taskId} 已取消并移出 assignee 队列` }
494
- }
495
-
496
- case 'list_team_agents': {
497
- const agents = await ws.listAgents()
498
- const text = agents.map(a =>
499
- ` ${a.id} (${a.name}, role=${a.role}, harness=${a.harness})`,
500
- ).join('\n')
501
- return { text: `团队成员(${agents.length}):\n${text || '(空)'}` }
502
- }
503
-
504
- case 'get_task_details': {
505
- const taskId = args.task_id as string
506
- const task: WorkspaceTask = await ws.getTask(taskId)
507
- const artifactText = task.artifacts.map(a =>
508
- ` artifact ${a.artifactId}: ${a.parts.map(p => 'text' in p ? p.text.slice(0, 100) : '').join('; ')}`,
509
- ).join('\n')
510
- return {
511
- text: `任务 ${task.id}\n 状态: ${task.state}\n 标题: ${task.title}\n 描述: ${task.description ?? '-'}\n 指派: ${task.assigneeId}\n 进度: ${task.progress}%\n 成果:\n${artifactText || ' (无)'}`,
512
- }
513
- }
514
-
515
- case 'search_memory': {
516
- const query = args.query as string
517
- const scope = (args.scope as 'auto' | 'private' | 'shared' | undefined) ?? 'auto'
518
- const snippets = await ws.recallMemory({ query, scope, limit: args.limit as number | undefined })
519
- if (snippets.length === 0) {
520
- return { text: `记忆检索无命中(query="${query}", scope=${scope})。可尝试更换关键词或放宽 scope。` }
521
- }
522
- const lines = snippets.map(s =>
523
- ` [${s.source}·${s.kind}·score=${s.score}] ${s.title}\n ${s.content}`,
524
- )
525
- return { text: `记忆检索结果(${snippets.length} 条, scope=${scope}):\n${lines.join('\n')}` }
526
- }
527
-
528
- case 'save_memory': {
529
- const title = args.title as string
530
- const content = args.content as string
531
- const scope = args.scope as 'private' | 'shared'
532
- const saved = await ws.saveMemory({
533
- title,
534
- content,
535
- importance: args.importance as number | undefined,
536
- scope,
537
- dedupKey: args.dedup_key as string | undefined,
538
- })
539
- const where = scope === 'shared' ? 'Channel 公共记忆(全员可检索)' : '本人私有记忆'
540
- return { text: `已沉淀到${where}: "${title}"(dedupKey=${saved.dedupKey})` }
541
- }
542
-
543
- case 'create_team_agent': {
544
- const name = args.name as string
545
- const harness = args.harness as string | undefined
546
- const systemPrompt = args.system_prompt as string | undefined
547
- const reason = args.reason as string | undefined
548
- const agent: AgentInfo = await ws.createTeamMember({
549
- name,
550
- harness,
551
- config: systemPrompt ? { systemPromptPrefix: systemPrompt } : undefined,
552
- reason,
553
- })
554
- return {
555
- text: [
556
- `团队成员已创建并加入 channel:`,
557
- ` id: ${agent.id}`,
558
- ` name: ${agent.name}(role=worker, harness=${agent.harness})`,
559
- `新成员当前空闲,可立即 dispatch_task 指派任务;list_team_agents 可随时查看团队名册。`,
560
- ].join('\n'),
561
- }
562
- }
563
-
564
- case 'update_team_agent': {
565
- const agentId = args.agent_id as string
566
- const name = args.name as string | undefined
567
- const systemPrompt = args.system_prompt as string | undefined
568
- const enabled = args.enabled as boolean | undefined
569
- const reason = args.reason as string | undefined
570
- const agent = await ws.updateTeamMember(agentId, {
571
- name,
572
- config: systemPrompt !== undefined ? { systemPromptPrefix: systemPrompt } : undefined,
573
- enabled: enabled === undefined ? undefined : (enabled ? 1 : 0),
574
- reason,
575
- })
576
- return {
577
- text: `团队成员 ${agentId} 已更新:name="${agent.name}"${enabled !== undefined ? `, enabled=${enabled ? 1 : 0}` : ''};运行时将按新配置重载(下次任务生效)。`,
578
- }
579
- }
580
-
581
- case 'remove_team_agent': {
582
- const agentId = args.agent_id as string
583
- const reason = args.reason as string | undefined
584
- const result = await ws.removeTeamMember(agentId, reason)
585
- const recycleNote = result.recycledTasks.length > 0
586
- ? `其 ${result.recycledTasks.length} 个在途任务已回收(排队任务重派给剩余最短队列成员;执行中任务转 FAILED 待调度重试)。`
587
- : `该成员无在途任务。`
588
- return { text: `团队成员 ${agentId} 已移除。${recycleNote}` }
589
- }
590
-
591
- case 'my_industrial_nodes': {
592
- return toolMyIndustrialNodes(identity.agentId)
593
- }
594
- case 'dcw_control': {
595
- return toolDcwControl(identity.agentId, args as { node_id?: string, value?: number | string, hypothesis?: string, task_id?: string })
596
- }
597
- case 'dcw_read': {
598
- return toolDcwRead(identity.agentId, args as { node_id?: string })
599
- }
600
- case 'daq_query': {
601
- return toolDaqQuery(identity.agentId, args as Parameters<typeof toolDaqQuery>[1])
602
- }
603
- case 'daq_frames': {
604
- return toolDaqFrames(identity.agentId, args as Parameters<typeof toolDaqFrames>[1])
605
- }
606
- case 'dcw_judge': {
607
- return toolDcwJudge(identity.agentId, args as { record_id?: string, verdict?: string, reason?: string })
608
- }
609
- case 'dcw_rollback': {
610
- return toolDcwRollback(identity.agentId, args as { record_id?: string, node_id?: string, to?: string })
611
- }
612
- case 'dcw_journal': {
613
- return toolDcwJournal(identity.agentId, args as { node_id?: string, recipe_id?: string, limit?: number | string })
614
- }
615
- case 'ops_log': {
616
- return toolOpsLog(identity.agentId, args as Parameters<typeof toolOpsLog>[1])
617
- }
618
- case 'recipe_log': {
619
- return toolRecipeLog(identity.agentId, args as Parameters<typeof toolRecipeLog>[1])
620
- }
621
- case 'line_context': {
622
- return toolLineContext(identity.agentId, args as { line_id?: string })
623
- }
624
- case 'recipe_versions': {
625
- return toolRecipeVersions(identity.agentId, args as { recipe_id?: string, limit?: number | string })
626
- }
627
- case 'recipe_update': {
628
- return toolRecipeUpdate(identity.agentId, args as Parameters<typeof toolRecipeUpdate>[1])
629
- }
630
- case 'recipe_rollback': {
631
- return toolRecipeRollback(identity.agentId, args as Parameters<typeof toolRecipeRollback>[1])
632
- }
633
- }
634
- return { text: `未知工具: ${req.toolName}`, isError: true }
635
- }
636
- catch (err) {
637
- return {
638
- text: `工具执行异常(${req.toolName}): ${err instanceof Error ? err.message : String(err)}`,
639
- isError: true,
640
- }
641
- }
642
- }
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 { daqRuntimeSettings } from '../settings'
24
+ import { toolAmlDatasetBuild, toolAmlDatasetStats, toolAmlJobCancel, toolAmlJobLogs, toolAmlJobStatus, toolAmlJobSubmit, toolAmlLeaderboard, toolAmlModelPromote, toolAmlModelReference, toolAmlNodeCatalog, toolDaqFrames, toolDaqQuery, toolDcwControl, toolDcwJudge, toolDcwJournal, toolDcwRead, toolDcwRollback, toolLineContext, toolMyIndustrialNodes, toolOpsLog, toolRecipeLog, toolRecipeRollback, toolRecipeUpdate, toolRecipeVersions } from './industrial-tools'
25
+ import { listPluginTools, pluginOfTool } from './plugin-tools'
26
+ import { getChannelPluginsRepo } from '../db/channel-plugins.repo'
27
+ import { extractTaskMode } from '../runtime/execution-mode'
28
+
29
+ /** host tool 定义(外置 .AgentWorkShop/prompts/host-tools.json;加载器缓存) */
30
+ export const HOST_TOOLS: RpcHostToolDefinition[] = loadHostToolDefs()
31
+
32
+ /** 仅 lead 可见的工具名(dispatch/调度/团队管理面 + AML 模型治理面;worker 注册时剔除,压缩工具上下文) */
33
+ export const LEAD_ONLY_TOOL_NAMES = new Set([
34
+ 'dispatch_task',
35
+ 'get_queue_overview',
36
+ 'read_channel_mail',
37
+ 'reassign_task',
38
+ 'update_task',
39
+ 'create_team_agent',
40
+ 'update_team_agent',
41
+ 'remove_team_agent',
42
+ 'aml_model_promote',
43
+ ])
44
+
45
+ /** 占位符动态注入:工具描述里的运行时配置值(每次装配实时计算,配置热重载后 Agent 拿到新值) */
46
+ function applyDescriptionPlaceholders(tools: RpcHostToolDefinition[]): RpcHostToolDefinition[] {
47
+ let q: { defaultBucketMs: number, minBucketMs: number } | null = null
48
+ try {
49
+ q = daqRuntimeSettings().query
50
+ }
51
+ catch { /* 设置系统不可用(单测) → 保留原始描述 */ }
52
+ if (!q) return tools
53
+ const map: Record<string, string> = {
54
+ queryDefaultBucketMs: String(q.defaultBucketMs),
55
+ queryMinBucketMs: String(q.minBucketMs),
56
+ }
57
+ return tools.map(t => ({
58
+ ...t,
59
+ description: t.description.replace(/\{(queryDefaultBucketMs|queryMinBucketMs)\}/g, (_, k) => map[k] ?? _),
60
+ parameters: JSON.parse(JSON.stringify(t.parameters ?? {}).replace(/\{(queryDefaultBucketMs|queryMinBucketMs)\}/g, (_m: string, k: string) => map[k] ?? _m)),
61
+ }))
62
+ }
63
+
64
+ /**
65
+ * 按角色装配 host tools:lead = 全量;worker = 剔除 lead 专属(执行面 + 通信面 + 记忆面);
66
+ * 尾部合并插件注册工具(roles 过滤,缺省双角色可用;channelId 给定且该团队有显式
67
+ * 插件开关时,关闭的插件其工具不注入 —— 防不需要插件的 channel 上下文被污染)。
68
+ * 全 harness 共用:omp 经 set_host_tools 下发;其余引擎经 MCP 桥 tools/list 拉取。
69
+ */
70
+ export function hostToolsForRole(role: 'lead' | 'worker', channelId?: string): RpcHostToolDefinition[] {
71
+ const base = role === 'lead'
72
+ ? HOST_TOOLS
73
+ : HOST_TOOLS.filter(t => !LEAD_ONLY_TOOL_NAMES.has(t.name))
74
+ const out = [...base]
75
+ // 团队级插件开关:显式配置过的 channel 按行过滤;未配置(无行)= 全启用,向后兼容
76
+ const channelOff = channelId
77
+ ? getChannelPluginsRepo().explicitFor(channelId)
78
+ : null
79
+ for (const [name, tool] of listPluginTools()) {
80
+ if (out.some(t => t.name === name)) continue
81
+ if (tool.roles && !tool.roles.includes(role)) continue
82
+ const owner = pluginOfTool(name)
83
+ if (channelOff && owner && channelOff.get(owner) === false) continue
84
+ out.push({ name, label: tool.label ?? name, description: tool.description, parameters: tool.parameters ?? {} })
85
+ }
86
+ return applyDescriptionPlaceholders(out)
87
+ }
88
+
89
+ /** 工具调用请求(与引擎协议解耦的规范化形状) */
90
+ export interface HostToolCall {
91
+ toolName: string
92
+ arguments: Record<string, unknown>
93
+ }
94
+
95
+ export interface HostToolResult {
96
+ text: string
97
+ isError?: boolean
98
+ }
99
+
100
+ /** 会话态(impl 持有,桥读写):当前执行任务 + 待回执上下文 */
101
+ export interface HostToolSessionState {
102
+ currentTaskId: string | null
103
+ replyContext: { fromId: string, messageId: string } | null
104
+ }
105
+
106
+ export function createSessionState(): HostToolSessionState {
107
+ return { currentTaskId: null, replyContext: null }
108
+ }
109
+
110
+ /** 桥上下文:impl 注入身份与 workspace 取值器 */
111
+ export interface HostToolBridgeContext {
112
+ identity: { agentId: string, channelId: string, role: 'lead' | 'worker', name: string }
113
+ state: HostToolSessionState
114
+ getWorkspace(): AgentWorkspace | null
115
+ }
116
+
117
+ /** 从消息 parts 提取纯文本(多 harness 共用) */
118
+ export function partsToText(parts: Part[]): string {
119
+ return parts
120
+ .map((p) => {
121
+ if ('text' in p) return p.text
122
+ if ('data' in p) return JSON.stringify(p.data)
123
+ if ('url' in p) return p.url
124
+ if ('raw' in p) return p.raw
125
+ return ''
126
+ })
127
+ .join('\n')
128
+ }
129
+
130
+ /**
131
+ * 分发一次 host tool 调用(全引擎唯一入口):
132
+ * 插件工具优先 → workspace 面 → 工业工具族 → 插件兜底 → 未知工具。
133
+ */
134
+ export async function dispatchHostTool(ctx: HostToolBridgeContext, req: HostToolCall): Promise<HostToolResult> {
135
+ const identity = ctx.identity
136
+ // 插件工具分发(ctx.omp.registerTool 注册的自定义工具;不依赖 workspace,优先于内置面)
137
+ const pluginTool = listPluginTools().get(req.toolName)
138
+ if (pluginTool) {
139
+ // 团队级插件开关:显式关闭的插件,其工具在该团队拒绝执行(与注入过滤同源)
140
+ const channelOff = getChannelPluginsRepo().explicitFor(identity.channelId)
141
+ const owner = pluginOfTool(req.toolName)
142
+ if (channelOff && owner && channelOff.get(owner) === false) {
143
+ return {
144
+ text: `该团队未启用插件「${owner}」,${req.toolName} 不可用。可在团队设置→插件中开启。`,
145
+ isError: true,
146
+ }
147
+ }
148
+ try {
149
+ return await pluginTool.handler(req.arguments ?? {}, identity)
150
+ }
151
+ catch (err) {
152
+ return {
153
+ text: `工具执行异常(${req.toolName}): ${err instanceof Error ? err.message : String(err)}`,
154
+ isError: true,
155
+ }
156
+ }
157
+ }
158
+ const args = req.arguments ?? {}
159
+
160
+ // 工业工具族不依赖 workspace(只按 agentId 查绑定与节点),先于 workspace 门控执行 ——
161
+ // 否则 worker 首回合前的 REST/MCP 直调(my_industrial_nodes 等)会被误拒
162
+ switch (req.toolName) {
163
+ case 'my_industrial_nodes':
164
+ return toolMyIndustrialNodes(identity.agentId)
165
+ case 'aml_node_catalog':
166
+ return toolAmlNodeCatalog(identity.agentId)
167
+ case 'aml_dataset_build':
168
+ return toolAmlDatasetBuild(identity.agentId, args as Parameters<typeof toolAmlDatasetBuild>[1])
169
+ case 'aml_dataset_stats':
170
+ return toolAmlDatasetStats(identity.agentId, args as Parameters<typeof toolAmlDatasetStats>[1])
171
+ case 'aml_job_submit':
172
+ return toolAmlJobSubmit(identity.agentId, args as Parameters<typeof toolAmlJobSubmit>[1])
173
+ case 'aml_job_status':
174
+ return toolAmlJobStatus(identity.agentId, args as Parameters<typeof toolAmlJobStatus>[1])
175
+ case 'aml_job_logs':
176
+ return toolAmlJobLogs(identity.agentId, args as Parameters<typeof toolAmlJobLogs>[1])
177
+ case 'aml_job_cancel':
178
+ return toolAmlJobCancel(identity.agentId, args as Parameters<typeof toolAmlJobCancel>[1])
179
+ case 'aml_leaderboard':
180
+ return toolAmlLeaderboard(identity.agentId, args as Parameters<typeof toolAmlLeaderboard>[1])
181
+ case 'aml_model_promote':
182
+ return toolAmlModelPromote(identity.agentId, args as Parameters<typeof toolAmlModelPromote>[1])
183
+ case 'aml_model_reference':
184
+ return toolAmlModelReference(identity.agentId, args as Parameters<typeof toolAmlModelReference>[1])
185
+ case 'dcw_control':
186
+ return toolDcwControl(identity.agentId, args as { node_id?: string, value?: number | string, hypothesis?: string, task_id?: string })
187
+ case 'dcw_read':
188
+ return toolDcwRead(identity.agentId, args as { node_id?: string })
189
+ case 'daq_query':
190
+ return toolDaqQuery(identity.agentId, args as Parameters<typeof toolDaqQuery>[1])
191
+ case 'daq_frames':
192
+ return toolDaqFrames(identity.agentId, args as Parameters<typeof toolDaqFrames>[1])
193
+ case 'dcw_judge':
194
+ return toolDcwJudge(identity.agentId, args as { record_id?: string, verdict?: string, reason?: string })
195
+ case 'dcw_rollback':
196
+ return toolDcwRollback(identity.agentId, args as { record_id?: string, node_id?: string, to?: string })
197
+ case 'dcw_journal':
198
+ return toolDcwJournal(identity.agentId, args as { node_id?: string, recipe_id?: string, limit?: number | string })
199
+ case 'ops_log':
200
+ return toolOpsLog(identity.agentId, args as Parameters<typeof toolOpsLog>[1])
201
+ case 'recipe_log':
202
+ return toolRecipeLog(identity.agentId, args as Parameters<typeof toolRecipeLog>[1])
203
+ case 'line_context':
204
+ return toolLineContext(identity.agentId, args as { line_id?: string })
205
+ case 'recipe_versions':
206
+ return toolRecipeVersions(identity.agentId, args as { recipe_id?: string, limit?: number | string })
207
+ case 'recipe_update':
208
+ return toolRecipeUpdate(identity.agentId, args as Parameters<typeof toolRecipeUpdate>[1])
209
+ case 'recipe_rollback':
210
+ return toolRecipeRollback(identity.agentId, args as Parameters<typeof toolRecipeRollback>[1])
211
+ }
212
+
213
+ const ws = ctx.getWorkspace()
214
+ if (!ws) {
215
+ return { text: 'workspace 未就绪', isError: true }
216
+ }
217
+
218
+ try {
219
+ switch (req.toolName) {
220
+ case 'report_progress': {
221
+ const progress = args.progress as number
222
+ const message = args.message as string | undefined
223
+ const taskId = ctx.state.currentTaskId
224
+ if (!taskId) return { text: '无当前任务上下文', isError: true }
225
+ await ws.reportTask({ taskId, progress, message })
226
+ return { text: `进度已上报: ${progress}%${message ? ` (${message})` : ''}` }
227
+ }
228
+
229
+ case 'complete_task': {
230
+ const summary = args.summary as string
231
+ const deliverable = args.deliverable as string | undefined
232
+ const taskId = (args.task_id as string | undefined) ?? ctx.state.currentTaskId
233
+ if (!taskId) return { text: '无任务 ID', isError: true }
234
+ // 父任务保护:有未完成子任务时拒绝完成(lead 须等 worker 交付)
235
+ const allTasks = await ws.listTasks()
236
+ const incompleteChildren = allTasks.filter(t => t.parentId === taskId && t.state !== 'COMPLETED' && t.state !== 'CANCELED')
237
+ if (incompleteChildren.length > 0) {
238
+ return {
239
+ text: `任务 ${taskId} 有 ${incompleteChildren.length} 个未完成子任务,不能完成父任务。请等待子任务完成。`,
240
+ isError: true,
241
+ }
242
+ }
243
+ // 终态幂等:任务已被平台收口(看门狗取消/调度器完成)时不撞状态机 ——
244
+ // 给 Agent 明确的"无需再完成,继续下一项"信号,杜绝重复重试烧 token
245
+ const current = await ws.getTask(taskId)
246
+ if (current && current.state !== 'SUBMITTED' && current.state !== 'ASSIGNED' && current.state !== 'WORKING' && current.state !== 'WAITING') {
247
+ if (current.state === 'COMPLETED') {
248
+ return { text: `任务 ${taskId} 已是完成状态(可能已被平台收口),无需重复完成。` }
249
+ }
250
+ try {
251
+ const q = await ws.myQueue()
252
+ const next = q.queued[0]
253
+ return {
254
+ text: `任务 ${taskId} 已被平台${current.state === 'CANCELED' ? '取消(如停滞回收/上级作废)' : '判定失败'},不能再标记完成 —— 这不是你的错误,也无需重试。${next ? `队列还有 ${q.queued.length} 项,下一项「${next.title}」即将开始,请继续处理。` : '队列为空,保持待命。'}`,
255
+ isError: false,
256
+ }
257
+ }
258
+ catch {
259
+ return { text: `任务 ${taskId} 已被平台${current.state === 'CANCELED' ? '取消' : '判定失败'},无需再完成,请继续处理队列下一项。` }
260
+ }
261
+ }
262
+ const artifacts: A2AArtifact[] = []
263
+ if (deliverable || summary) {
264
+ artifacts.push({
265
+ artifactId: randomUUID(),
266
+ name: 'deliverable',
267
+ parts: [{ text: deliverable ?? summary }],
268
+ })
269
+ }
270
+ await ws.completeTask(taskId, artifacts)
271
+ ctx.state.currentTaskId = null
272
+ // 完成即衔接:报告队列余量与下一项(状态同步 + 驱动继续处理)
273
+ try {
274
+ const q = await ws.myQueue()
275
+ const next = q.queued[0]
276
+ if (next) {
277
+ return {
278
+ text: `任务 ${taskId} 已完成(状态已同步为 COMPLETED)。你的队列还有 ${q.queued.length} 项待处理,下一项:「${next.title}」(即将自动开始;收到任务指派消息后按工作流执行,完成后同样调用 complete_task)。`,
279
+ }
280
+ }
281
+ return { text: `任务 ${taskId} 已完成(状态已同步为 COMPLETED),队列为空。保持待命:新任务/实时消息会自动到达你的信箱。` }
282
+ }
283
+ catch {
284
+ return { text: `任务 ${taskId} 已完成(状态已同步为 COMPLETED)。` }
285
+ }
286
+ }
287
+
288
+ case 'dispatch_task': {
289
+ const assigneeId = args.assignee_id as string
290
+ const title = args.title as string
291
+ const description = args.description as string | undefined
292
+ const parentTaskId = args.parent_task_id as string | undefined
293
+ const routeReason = args.route_reason as string | undefined
294
+ // 重复派发守卫(真实场景实测:lead 模型可能对同一目标重复派发,引发协调风暴):
295
+ // 同父任务下已存在同标题非终态子任务 → 不再创建,直接指路既有任务
296
+ const dup = await ws.listTasks()
297
+ const existing = dup.find(t =>
298
+ t.parentId === parentTaskId
299
+ && t.title === title
300
+ && t.state !== 'COMPLETED' && t.state !== 'FAILED' && t.state !== 'CANCELED')
301
+ if (existing) {
302
+ return {
303
+ text: `未创建:同父任务下已存在同标题进行中子任务 ${existing.id}("${existing.title}",state=${existing.state},assignee=${existing.assigneeId})。请勿重复派发;若需跟进请对该任务 notify 或 reassign。`,
304
+ }
305
+ }
306
+ const task = await ws.dispatchTask({ assigneeId, title, description, parentTaskId, routeReason })
307
+ return { text: `子任务 ${task.id} 已创建并指派 → ${assigneeId}(父任务 ${parentTaskId ?? '无'},标题: ${title}${routeReason ? `,路由理由: ${routeReason}` : ''})` }
308
+ }
309
+
310
+ case 'send_message_to_agent': {
311
+ const toAgentId = args.to_agent_id as string
312
+ const message = args.message as string
313
+ // 回执自动实时:回复(in_reply_to)默认提升为 immediate——
314
+ // 接收方正等待该结果,realtime 路由会把回复直接注入其运行中的会话
315
+ let priority = (args.priority as string | undefined) ?? 'task'
316
+ const metadata: Record<string, unknown> = {}
317
+ if (args.require_reply === true) metadata['x-aw-require-reply'] = 'true'
318
+ let inReplyTo = args.in_reply_to as string | undefined
319
+ // 自动关联兜底:LLM 省略 in_reply_to 时,按待回执上下文盖章
320
+ const replyCtx = ctx.state.replyContext
321
+ ctx.state.replyContext = null
322
+ if (!inReplyTo && replyCtx && replyCtx.fromId === toAgentId) {
323
+ inReplyTo = replyCtx.messageId
324
+ }
325
+ if (inReplyTo) {
326
+ metadata['x-aw-in-reply-to'] = inReplyTo
327
+ if (priority === 'task') priority = 'immediate'
328
+ }
329
+ metadata['x-aw-msg-priority'] = priority
330
+ const sent = await ws.sendMessage({ toAgentId, parts: [{ text: message }], metadata })
331
+ const triggerNote = inReplyTo
332
+ ? `(回复 ${inReplyTo.slice(0, 8)}…,已实时推送给对方)`
333
+ : metadata['x-aw-require-reply'] === 'true' ? '(已要求对方回复)' : ''
334
+ return { text: `消息 ${sent.messageId.slice(0, 8)}… 已发送给 ${toAgentId}(priority=${priority})${triggerNote}` }
335
+ }
336
+
337
+ case 'send_cross_channel_message': {
338
+ const toChannelId = args.to_channel_id as string
339
+ const message = args.message as string
340
+ if (!toChannelId || !message) return { text: '缺少 to_channel_id 或 message', isError: true }
341
+ try {
342
+ const r = await ws.sendCrossChannelMessage({
343
+ toChannelId,
344
+ parts: [{ text: message }],
345
+ requireReply: args.require_reply === true,
346
+ inReplyTo: args.in_reply_to as string | undefined,
347
+ })
348
+ const note = args.require_reply === true ? '(已要求对方 Leader 回复)' : ''
349
+ return { text: `跨 Channel 消息 ${r.messageId.slice(0, 8)}… 已送达 channel「${r.toChannelName}」的 Leader(${r.toLeadAgentId.slice(0, 8)}…)${note}。对方将按你的信息需求处理;其回复会经 mailbox 到达你这里。` }
350
+ }
351
+ catch (err) {
352
+ return { text: `跨 Channel 发送失败: ${err instanceof Error ? err.message : String(err)}(仅 Leader 可跨 Channel 通信)`, isError: true }
353
+ }
354
+ }
355
+
356
+ case 'list_other_teams': {
357
+ const teams = await ws.listOtherTeams()
358
+ if (teams.length === 0) return { text: '当前没有其他团队(或均未启用)。' }
359
+ const text = teams.map((t) => {
360
+ const active = t.activeTasks.length > 0
361
+ ? t.activeTasks.map(x => `「${x.title}」(${x.state})`).join('、')
362
+ : '无进行中任务'
363
+ const done = t.recentCompleted.length > 0
364
+ ? t.recentCompleted.map(x => `「${x.title}」`).join('、')
365
+ : '无'
366
+ const mem = t.sharedMemories > 0 ? `共享记忆 ${t.sharedMemories} 条(可检索)` : '暂无共享记忆'
367
+ return `- ${t.name}${t.description ? `(${t.description})` : ''} · lead=${t.leadName ?? '?'} · ${mem}\n 进行中: ${active}\n 近期完成: ${done}\n channel_id: ${t.channelId}`
368
+ }).join('\n')
369
+ return { text: `其他团队概览:\n${text}\n(需要协作时用 send_cross_channel_message 向对应团队 Leader 发信;查具体知识用 search_other_teams_memory)` }
370
+ }
371
+
372
+ case 'search_other_teams_memory': {
373
+ const query = (args.query as string | undefined) ?? ''
374
+ if (!query) return { text: '缺少 query', isError: true }
375
+ const rows = await ws.searchOtherTeamsMemory({ query, limit: Number(args.limit ?? 5) })
376
+ if (rows.length === 0) return { text: `其他团队的共享记忆中没有命中「${query}」的内容。` }
377
+ const text = rows.map(r =>
378
+ `- [${r.channelName}] 「${r.title}」(${r.createdAt.slice(0, 10)}): ${r.content}`).join('\n')
379
+ return { text: `其他团队共享记忆命中 ${rows.length} 条:\n${text}` }
380
+ }
381
+
382
+ case 'refuse_task': {
383
+ const taskId = args.task_id as string
384
+ const reason = args.reason as string
385
+ if (!taskId || !reason) return { text: '缺少 task_id 或 reason', isError: true }
386
+ const r = await ws.refuseTask(taskId, reason)
387
+ const notified = r.notifiedTo ? `拒绝回执已送达 ${r.notifiedTo.slice(0, 8)}` : '无回执对象(创建者已不在 channel)'
388
+ return {
389
+ text: `任务 ${taskId.slice(0, 8)}("${r.task.title}") 已拒绝(state=${r.task.state});${notified}。调度器将改派他人,请勿再处理该任务。`,
390
+ }
391
+ }
392
+
393
+ case 'poll_messages': {
394
+ const limit = (args.limit as number | undefined) ?? 10
395
+ const waitSec = Math.min(180, Math.max(0, Number(args.wait_seconds ?? 0) || 0))
396
+ const msgs = await ws.waitMailbox(limit, waitSec * 1000)
397
+ if (msgs.length === 0) {
398
+ return {
399
+ text: waitSec > 0
400
+ ? `等待 ${waitSec}s 后收件箱仍为空。若此前已有"[实时消息 from X]"注入你的会话,那就是回复本身(无需再轮询);否则可继续处理其他工作,对方回复会以新回合送达。`
401
+ : '收件箱为空(无未消费消息)。等待回复请用 wait_seconds 参数阻塞等待,不要反复空轮询。',
402
+ }
403
+ }
404
+ // 读即取:协作消息(非任务投递)取出即确认;任务指派(assign)不确认
405
+ const ackIds = msgs
406
+ .filter(m => !m.metadata?.['x-aw-task-kind'])
407
+ .map(m => m.messageId)
408
+ if (ackIds.length > 0) await ws.ackMailbox(ackIds)
409
+ const trigger = msgs.find(m =>
410
+ m.metadata?.['x-aw-require-reply'] === 'true'
411
+ && typeof m.metadata?.['x-aw-from-agent'] === 'string')
412
+ if (trigger) {
413
+ ctx.state.replyContext = {
414
+ fromId: String(trigger.metadata!['x-aw-from-agent']),
415
+ messageId: trigger.messageId,
416
+ }
417
+ }
418
+ const text = msgs.map((m, i) => {
419
+ const from = m.metadata?.['x-aw-from-agent'] ?? '?'
420
+ const reply = m.metadata?.['x-aw-in-reply-to']
421
+ ? ` (回复 ${String(m.metadata['x-aw-in-reply-to']).slice(0, 8)}…)`
422
+ : ''
423
+ const needReply = m.metadata?.['x-aw-require-reply'] === 'true'
424
+ ? ` [需回复:用 send_message_to_agent 回 ${from},in_reply_to=${m.messageId}]`
425
+ : ''
426
+ const body = m.parts.map(p => 'text' in p ? p.text : '').join(' ')
427
+ return ` [${i + 1}/${msgs.length}] [from ${from}]${needReply}${reply} ${body.slice(0, 2000)}`
428
+ }).join('\n')
429
+ return {
430
+ text:
431
+ `未消费消息(${msgs.length},已读即取):\n${text}`
432
+ + (msgs.length > 1
433
+ ? '\n(收到多条:请按编号逐条处理并逐条回复,不要只回应最后一条或合并敷衍)'
434
+ : ''),
435
+ }
436
+ }
437
+
438
+ case 'read_channel_mail': {
439
+ const limit = (args.limit as number | undefined) ?? 50
440
+ const agentId = args.agent_id as string | undefined
441
+ const mails = await ws.listMail({ limit, agentId })
442
+ if (mails.length === 0) return { text: 'Channel 无邮件记录(或该成员无往来)' }
443
+ const text = mails.map((m) => {
444
+ const from = m.fromAgentId ?? '(系统)'
445
+ const to = m.toAgentId ?? '(广播)'
446
+ const body = partsToText(m.parts).trim().slice(0, 2000)
447
+ const reply = m.metadata?.['x-aw-in-reply-to']
448
+ ? ` [回复 ${String(m.metadata['x-aw-in-reply-to']).slice(0, 8)}…]`
449
+ : ''
450
+ const label = m.metadata?.['x-aw-task-kind'] === 'assign'
451
+ ? '[任务指派]'
452
+ : m.metadata?.['x-aw-msg-priority'] === 'immediate' ? '[实时]' : '[协作]'
453
+ const state = m.state === 'pending' ? '未读' : m.state === 'consuming' ? '处理中' : '已读'
454
+ return ` ${m.createdAt.slice(11, 19)} ${label} ${from} → ${to} (${state})${reply}: ${body || '(空)'}`
455
+ }).join('\n')
456
+ return { text: `Channel 邮件(${mails.length},倒序;可传 agent_id 查看指定成员信箱):\n${text}` }
457
+ }
458
+
459
+ case 'broadcast_message': {
460
+ const message = args.message as string
461
+ const priority = (args.priority as string | undefined) ?? 'task'
462
+ const agents = await ws.listAgents()
463
+ const others = agents.filter(a => a.id !== identity.agentId)
464
+ for (const agent of others) {
465
+ await ws.sendMessage({
466
+ toAgentId: agent.id,
467
+ parts: [{ text: message }],
468
+ metadata: { 'x-aw-msg-priority': priority },
469
+ })
470
+ }
471
+ return { text: `已广播给 ${others.length} 个 agent(priority=${priority})` }
472
+ }
473
+
474
+ case 'list_channel_tasks': {
475
+ const tasks = await ws.listTasks()
476
+ const text = tasks.map(t =>
477
+ ` ${t.id} [${t.state}] "${t.title}" assignee=${t.assigneeId} progress=${t.progress}%`,
478
+ ).join('\n')
479
+ return { text: `Channel 任务(${tasks.length}):\n${text || '(空)'}` }
480
+ }
481
+
482
+ case 'get_my_task_queue': {
483
+ const queue = await ws.myQueue()
484
+ const fmt = (t: WorkspaceTask): string =>
485
+ ` ${t.id} [${t.state}] "${t.title}" progress=${t.progress}%`
486
+ return {
487
+ text: [
488
+ `我的任务队列(${identity.role}):`,
489
+ `执行中: ${queue.current ? `${queue.current.id} "${queue.current.title}" (${queue.current.progress}%)` : '(无)'}`,
490
+ `待执行(${queue.queued.length},FIFO):`,
491
+ ...queue.queued.map(fmt),
492
+ `已完成(${queue.completed.length}):`,
493
+ ...queue.completed.map(fmt),
494
+ ].join('\n'),
495
+ }
496
+ }
497
+
498
+ case 'get_queue_overview': {
499
+ const overview = await ws.queueOverview()
500
+ const lines = overview.map(s =>
501
+ ` ${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})`,
502
+ )
503
+ return { text: `团队队列总览(${overview.length}):\n${lines.join('\n') || '(空)'}` }
504
+ }
505
+
506
+ case 'reassign_task': {
507
+ const taskId = args.task_id as string
508
+ const toAgentId = args.to_agent_id as string
509
+ const task = await ws.reassignTask(taskId, toAgentId)
510
+ return { text: `任务 ${taskId}("${task.title}")已调配 → ${toAgentId}(state=${task.state})` }
511
+ }
512
+
513
+ case 'update_task': {
514
+ const taskId = args.task_id as string
515
+ const title = args.title as string | undefined
516
+ const description = args.description as string | undefined
517
+ const task = await ws.updateTask(taskId, { title, description })
518
+ return { text: `任务 ${taskId} 已更新: "${task.title}"` }
519
+ }
520
+
521
+ case 'cancel_task': {
522
+ const taskId = args.task_id as string
523
+ // 守卫:goal/loop/pipeline 的 mode 父任务是用户的作业主任务,Agent 不得经工具取消
524
+ const target = await ws.getTask(taskId).catch(() => null)
525
+ if (target && extractTaskMode(target)) {
526
+ return {
527
+ text: `拒绝:任务 ${taskId} 是 mode 父任务(${target.title}),不能用 cancel_task 取消。若目标未达成 → dispatch_task 派发子任务补齐差距;若确认无法达成 → complete_task 并在交付中说明未达成原因。终止整个作业请由用户操作。`,
528
+ }
529
+ }
530
+ await ws.cancelTask(taskId)
531
+ return { text: `任务 ${taskId} 已取消并移出 assignee 队列` }
532
+ }
533
+
534
+ case 'list_team_agents': {
535
+ const agents = await ws.listAgents()
536
+ const text = agents.map(a =>
537
+ ` ${a.id} (${a.name}, role=${a.role}, harness=${a.harness})`,
538
+ ).join('\n')
539
+ return { text: `团队成员(${agents.length}):\n${text || '(空)'}` }
540
+ }
541
+
542
+ case 'get_task_details': {
543
+ const taskId = args.task_id as string
544
+ const task: WorkspaceTask = await ws.getTask(taskId)
545
+ const artifactText = task.artifacts.map(a =>
546
+ ` artifact ${a.artifactId}: ${a.parts.map(p => 'text' in p ? p.text.slice(0, 100) : '').join('; ')}`,
547
+ ).join('\n')
548
+ return {
549
+ text: `任务 ${task.id}\n 状态: ${task.state}\n 标题: ${task.title}\n 描述: ${task.description ?? '-'}\n 指派: ${task.assigneeId}\n 进度: ${task.progress}%\n 成果:\n${artifactText || ' (无)'}`,
550
+ }
551
+ }
552
+
553
+ case 'search_memory': {
554
+ const query = args.query as string
555
+ const scope = (args.scope as 'auto' | 'private' | 'shared' | undefined) ?? 'auto'
556
+ const snippets = await ws.recallMemory({ query, scope, limit: args.limit as number | undefined })
557
+ if (snippets.length === 0) {
558
+ return { text: `记忆检索无命中(query="${query}", scope=${scope})。可尝试更换关键词或放宽 scope。` }
559
+ }
560
+ const lines = snippets.map(s =>
561
+ ` [${s.source}·${s.kind}·score=${s.score}] ${s.title}\n ${s.content}`,
562
+ )
563
+ return { text: `记忆检索结果(${snippets.length} 条, scope=${scope}):\n${lines.join('\n')}` }
564
+ }
565
+
566
+ case 'save_memory': {
567
+ const title = args.title as string
568
+ const content = args.content as string
569
+ const scope = args.scope as 'private' | 'shared'
570
+ const saved = await ws.saveMemory({
571
+ title,
572
+ content,
573
+ importance: args.importance as number | undefined,
574
+ scope,
575
+ dedupKey: args.dedup_key as string | undefined,
576
+ })
577
+ const where = scope === 'shared' ? 'Channel 公共记忆(全员可检索)' : '本人私有记忆'
578
+ return { text: `已沉淀到${where}: "${title}"(dedupKey=${saved.dedupKey})` }
579
+ }
580
+
581
+ case 'create_team_agent': {
582
+ const name = args.name as string
583
+ const harness = args.harness as string | undefined
584
+ const systemPrompt = args.system_prompt as string | undefined
585
+ const reason = args.reason as string | undefined
586
+ const agent: AgentInfo = await ws.createTeamMember({
587
+ name,
588
+ harness,
589
+ config: systemPrompt ? { systemPromptPrefix: systemPrompt } : undefined,
590
+ reason,
591
+ })
592
+ return {
593
+ text: [
594
+ `团队成员已创建并加入 channel:`,
595
+ ` id: ${agent.id}`,
596
+ ` name: ${agent.name}(role=worker, harness=${agent.harness})`,
597
+ `新成员当前空闲,可立即 dispatch_task 指派任务;list_team_agents 可随时查看团队名册。`,
598
+ ].join('\n'),
599
+ }
600
+ }
601
+
602
+ case 'update_team_agent': {
603
+ const agentId = args.agent_id as string
604
+ const name = args.name as string | undefined
605
+ const systemPrompt = args.system_prompt as string | undefined
606
+ const enabled = args.enabled as boolean | undefined
607
+ const reason = args.reason as string | undefined
608
+ const agent = await ws.updateTeamMember(agentId, {
609
+ name,
610
+ config: systemPrompt !== undefined ? { systemPromptPrefix: systemPrompt } : undefined,
611
+ enabled: enabled === undefined ? undefined : (enabled ? 1 : 0),
612
+ reason,
613
+ })
614
+ return {
615
+ text: `团队成员 ${agentId} 已更新:name="${agent.name}"${enabled !== undefined ? `, enabled=${enabled ? 1 : 0}` : ''};运行时将按新配置重载(下次任务生效)。`,
616
+ }
617
+ }
618
+
619
+ case 'remove_team_agent': {
620
+ const agentId = args.agent_id as string
621
+ const reason = args.reason as string | undefined
622
+ const result = await ws.removeTeamMember(agentId, reason)
623
+ const recycleNote = result.recycledTasks.length > 0
624
+ ? `其 ${result.recycledTasks.length} 个在途任务已回收(排队任务重派给剩余最短队列成员;执行中任务转 FAILED 待调度重试)。`
625
+ : `该成员无在途任务。`
626
+ return { text: `团队成员 ${agentId} 已移除。${recycleNote}` }
627
+ }
628
+
629
+ case 'my_industrial_nodes': {
630
+ return toolMyIndustrialNodes(identity.agentId)
631
+ }
632
+ case 'aml_node_catalog': {
633
+ return toolAmlNodeCatalog(identity.agentId)
634
+ }
635
+ case 'aml_dataset_build': {
636
+ return toolAmlDatasetBuild(identity.agentId, args as Parameters<typeof toolAmlDatasetBuild>[1])
637
+ }
638
+ case 'aml_dataset_stats': {
639
+ return toolAmlDatasetStats(identity.agentId, args as Parameters<typeof toolAmlDatasetStats>[1])
640
+ }
641
+ case 'aml_job_submit': {
642
+ return toolAmlJobSubmit(identity.agentId, args as Parameters<typeof toolAmlJobSubmit>[1])
643
+ }
644
+ case 'aml_job_status': {
645
+ return toolAmlJobStatus(identity.agentId, args as Parameters<typeof toolAmlJobStatus>[1])
646
+ }
647
+ case 'aml_job_logs': {
648
+ return toolAmlJobLogs(identity.agentId, args as Parameters<typeof toolAmlJobLogs>[1])
649
+ }
650
+ case 'aml_job_cancel': {
651
+ return toolAmlJobCancel(identity.agentId, args as Parameters<typeof toolAmlJobCancel>[1])
652
+ }
653
+ case 'aml_leaderboard': {
654
+ return toolAmlLeaderboard(identity.agentId, args as Parameters<typeof toolAmlLeaderboard>[1])
655
+ }
656
+ case 'aml_model_promote': {
657
+ return toolAmlModelPromote(identity.agentId, args as Parameters<typeof toolAmlModelPromote>[1])
658
+ }
659
+ case 'aml_model_reference': {
660
+ return toolAmlModelReference(identity.agentId, args as Parameters<typeof toolAmlModelReference>[1])
661
+ }
662
+ case 'dcw_control': {
663
+ return toolDcwControl(identity.agentId, args as { node_id?: string, value?: number | string, hypothesis?: string, task_id?: string })
664
+ }
665
+ case 'dcw_read': {
666
+ return toolDcwRead(identity.agentId, args as { node_id?: string })
667
+ }
668
+ case 'daq_query': {
669
+ return toolDaqQuery(identity.agentId, args as Parameters<typeof toolDaqQuery>[1])
670
+ }
671
+ case 'daq_frames': {
672
+ return toolDaqFrames(identity.agentId, args as Parameters<typeof toolDaqFrames>[1])
673
+ }
674
+ case 'dcw_judge': {
675
+ return toolDcwJudge(identity.agentId, args as { record_id?: string, verdict?: string, reason?: string })
676
+ }
677
+ case 'dcw_rollback': {
678
+ return toolDcwRollback(identity.agentId, args as { record_id?: string, node_id?: string, to?: string })
679
+ }
680
+ case 'dcw_journal': {
681
+ return toolDcwJournal(identity.agentId, args as { node_id?: string, recipe_id?: string, limit?: number | string })
682
+ }
683
+ case 'ops_log': {
684
+ return toolOpsLog(identity.agentId, args as Parameters<typeof toolOpsLog>[1])
685
+ }
686
+ case 'recipe_log': {
687
+ return toolRecipeLog(identity.agentId, args as Parameters<typeof toolRecipeLog>[1])
688
+ }
689
+ case 'line_context': {
690
+ return toolLineContext(identity.agentId, args as { line_id?: string })
691
+ }
692
+ case 'recipe_versions': {
693
+ return toolRecipeVersions(identity.agentId, args as { recipe_id?: string, limit?: number | string })
694
+ }
695
+ case 'recipe_update': {
696
+ return toolRecipeUpdate(identity.agentId, args as Parameters<typeof toolRecipeUpdate>[1])
697
+ }
698
+ case 'recipe_rollback': {
699
+ return toolRecipeRollback(identity.agentId, args as Parameters<typeof toolRecipeRollback>[1])
700
+ }
701
+ }
702
+ return { text: `未知工具: ${req.toolName}`, isError: true }
703
+ }
704
+ catch (err) {
705
+ return {
706
+ text: `工具执行异常(${req.toolName}): ${err instanceof Error ? err.message : String(err)}`,
707
+ isError: true,
708
+ }
709
+ }
710
+ }