agentworkshop 0.7.24 → 0.7.27

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 (243) hide show
  1. package/.output/nitro.json +1 -1
  2. package/.output/public/_nuxt/2jaJHWIJ.js +1 -0
  3. package/.output/public/_nuxt/B7gZokg82.js +209 -0
  4. package/.output/public/_nuxt/{Dfe8vXdG.js → B8kt898d.js} +1 -1
  5. package/.output/public/_nuxt/{BvNJUu3s.js → BFGpEo8S.js} +1 -1
  6. package/.output/public/_nuxt/{BAfp6tmu.js → BG4zduPf.js} +5 -5
  7. package/.output/public/_nuxt/{BMb80_tm.js → BGhOrgle.js} +1 -1
  8. package/.output/public/_nuxt/{Bc-_IsBP.js → BHcpzI2n.js} +1 -1
  9. package/.output/public/_nuxt/{Djir5rSD.js → BTLEvDxM.js} +1 -1
  10. package/.output/public/_nuxt/{b50gYVZl.js → BWyR3awA.js} +1 -1
  11. package/.output/public/_nuxt/Bc89zKq2.js +1 -0
  12. package/.output/public/_nuxt/{CxY6LfeN.js → BetmGSO4.js} +1 -1
  13. package/.output/public/_nuxt/{DAR70Lf52.js → BgCrZKv_2.js} +1 -1
  14. package/.output/public/_nuxt/{DUToq-k_.js → BowTbasd.js} +1 -1
  15. package/.output/public/_nuxt/{D6HDb-vN2.js → BvtknqSC2.js} +1 -1
  16. package/.output/public/_nuxt/{CLZWFhZC.js → CTfqWGdy.js} +1 -1
  17. package/.output/public/_nuxt/Chc5pfAA.js +1 -0
  18. package/.output/public/_nuxt/CobSUzQv.js +2 -0
  19. package/.output/public/_nuxt/{kZV5TQvh2.js → CucID8qg2.js} +1 -1
  20. package/.output/public/_nuxt/{CAGL7TNK.js → DHbTyoAV.js} +1 -1
  21. package/.output/public/_nuxt/{DSa2O56y.js → DfLUN8kY.js} +1 -1
  22. package/.output/public/_nuxt/{Coik560n.js → DjU9Dx5Y.js} +1 -1
  23. package/.output/public/_nuxt/DnziMlcX.js +1 -0
  24. package/.output/public/_nuxt/{Ct68Z0232.js → DosOJEmZ2.js} +1 -1
  25. package/.output/public/_nuxt/{CDLv-n51.js → Q_SJDSgx.js} +1 -1
  26. package/.output/public/_nuxt/{TownView.zu2rU5nS.css → TownView.CtskuMXS.css} +1 -1
  27. package/.output/public/_nuxt/{CuVGPuP1.js → XY2z78rj.js} +1 -1
  28. package/.output/public/_nuxt/_id_.DdbYeLqn.css +1 -0
  29. package/.output/public/_nuxt/{C1CSiSBN.js → bFnZa2yd.js} +1 -1
  30. package/.output/public/_nuxt/builds/latest.json +1 -1
  31. package/.output/public/_nuxt/builds/meta/f7a8e33d-5422-45ac-895d-27168f97e3ad.json +1 -0
  32. package/.output/public/_nuxt/daq.DGV9QS8d.css +1 -0
  33. package/.output/public/_nuxt/{entry.AZM1Culo.css → entry.BN02X8iR.css} +1 -1
  34. package/.output/public/_nuxt/{X6IraCTB.js → rkVgzg62.js} +1 -1
  35. package/.output/public/_nuxt/settings.W6qrYAui.css +1 -0
  36. package/.output/public/_nuxt/teams.BBXVkyKq.css +1 -0
  37. package/.output/public/assets/game/character/yangyang-walk.glb +0 -0
  38. package/.output/server/chunks/_/host-bindings.mjs +1 -1
  39. package/.output/server/chunks/_/nitro.mjs +1013 -844
  40. package/.output/server/chunks/_/nitro.mjs.map +1 -1
  41. package/.output/server/chunks/build/{TownView-DxeQe1Bl.mjs → TownView-ftIylqiD.mjs} +178 -151
  42. package/.output/server/chunks/build/{TownView-DxeQe1Bl.mjs.map → TownView-ftIylqiD.mjs.map} +1 -1
  43. package/.output/server/chunks/build/{_id_-DQDqj-cZ.mjs → _id_-3Axz2-gV.mjs} +35 -35
  44. package/.output/server/chunks/build/{_id_-DQDqj-cZ.mjs.map → _id_-3Axz2-gV.mjs.map} +1 -1
  45. package/.output/server/chunks/build/{_id_-DY6v6sqB.mjs → _id_-CahfkmEt.mjs} +5 -5
  46. package/.output/server/chunks/build/{_id_-DY6v6sqB.mjs.map → _id_-CahfkmEt.mjs.map} +1 -1
  47. package/.output/server/chunks/build/{_wsId_-D38Vx6Ky.mjs → _wsId_-BymlQhzS.mjs} +7 -7
  48. package/.output/server/chunks/build/{_wsId_-D38Vx6Ky.mjs.map → _wsId_-BymlQhzS.mjs.map} +1 -1
  49. package/.output/server/chunks/build/{agents-GnmUGZir.mjs → agents-DuMiSWKp.mjs} +4 -4
  50. package/.output/server/chunks/build/{agents-GnmUGZir.mjs.map → agents-DuMiSWKp.mjs.map} +1 -1
  51. package/.output/server/chunks/build/{channel-templates-B4z6v8Z5.mjs → channel-templates-BStqJ-of.mjs} +2 -2
  52. package/.output/server/chunks/build/{channel-templates-B4z6v8Z5.mjs.map → channel-templates-BStqJ-of.mjs.map} +1 -1
  53. package/.output/server/chunks/build/{checkbox-dzcpU_Cd.mjs → checkbox-C1gABOca.mjs} +4 -4
  54. package/.output/server/chunks/build/{checkbox-dzcpU_Cd.mjs.map → checkbox-C1gABOca.mjs.map} +1 -1
  55. package/.output/server/chunks/build/{daq-B-3xCp_2.mjs → daq-ChYCABz1.mjs} +312 -426
  56. package/.output/server/chunks/build/daq-ChYCABz1.mjs.map +1 -0
  57. package/.output/server/chunks/build/{dcw-BL2dhuz7.mjs → dcw-CcQNGggh.mjs} +3 -3
  58. package/.output/server/chunks/build/{dcw-BL2dhuz7.mjs.map → dcw-CcQNGggh.mjs.map} +1 -1
  59. package/.output/server/chunks/build/{default-CLf5m0NE.mjs → default-95-zOTPt.mjs} +2 -2
  60. package/.output/server/chunks/build/{default-CLf5m0NE.mjs.map → default-95-zOTPt.mjs.map} +1 -1
  61. package/.output/server/chunks/build/{logs-Dto_umFY.mjs → logs-D-2UyGtE.mjs} +3 -3
  62. package/.output/server/chunks/build/{logs-Dto_umFY.mjs.map → logs-D-2UyGtE.mjs.map} +1 -1
  63. package/.output/server/chunks/build/{monitor-Cp4V-H2n.mjs → monitor-mfG5jBtz.mjs} +3 -3
  64. package/.output/server/chunks/build/{monitor-Cp4V-H2n.mjs.map → monitor-mfG5jBtz.mjs.map} +1 -1
  65. package/.output/server/chunks/build/{pages-Dc2H1QFu.mjs → pages-Dfosfchr.mjs} +4 -4
  66. package/.output/server/chunks/build/{pages-Dc2H1QFu.mjs.map → pages-Dfosfchr.mjs.map} +1 -1
  67. package/.output/server/chunks/build/{permissions-BTRW2CVd.mjs → permissions-B-hhZuzm.mjs} +3 -3
  68. package/.output/server/chunks/build/{permissions-BTRW2CVd.mjs.map → permissions-B-hhZuzm.mjs.map} +1 -1
  69. package/.output/server/chunks/build/{settings-UfGyDgM7.mjs → settings-BajN9TQW.mjs} +249 -20
  70. package/.output/server/chunks/build/settings-BajN9TQW.mjs.map +1 -0
  71. package/.output/server/chunks/build/{table-Cswq-l2r.mjs → table-Bf1r2JjE.mjs} +2 -2
  72. package/.output/server/chunks/build/{table-Cswq-l2r.mjs.map → table-Bf1r2JjE.mjs.map} +1 -1
  73. package/.output/server/chunks/build/{teams-Cbg27MWW.mjs → teams-t2SkRlJP.mjs} +346 -46
  74. package/.output/server/chunks/build/teams-t2SkRlJP.mjs.map +1 -0
  75. package/.output/server/chunks/build/{tokens-Bmm6rDfj.mjs → tokens-DiCojbN8.mjs} +3 -3
  76. package/.output/server/chunks/build/{tokens-Bmm6rDfj.mjs.map → tokens-DiCojbN8.mjs.map} +1 -1
  77. package/.output/server/chunks/build/{town-Dsh0jlwZ.mjs → town-C7QM8DYK.mjs} +5 -5
  78. package/.output/server/chunks/build/{town-Dsh0jlwZ.mjs.map → town-C7QM8DYK.mjs.map} +1 -1
  79. package/.output/server/chunks/build/{useDaqStream-DkRL3tEW.mjs → useDaqStream-BeA2X8KR.mjs} +26 -11
  80. package/.output/server/chunks/build/useDaqStream-BeA2X8KR.mjs.map +1 -0
  81. package/.output/server/chunks/build/{useDcwStream-DyB2ufQI.mjs → useDcwStream-BJW_MitY.mjs} +14 -6
  82. package/.output/server/chunks/build/useDcwStream-BJW_MitY.mjs.map +1 -0
  83. package/.output/server/chunks/build/{useDeviceTwins-ZbT86L9O.mjs → useDeviceTwins-Dwz_EY_i.mjs} +2 -2
  84. package/.output/server/chunks/build/{useDeviceTwins-ZbT86L9O.mjs.map → useDeviceTwins-Dwz_EY_i.mjs.map} +1 -1
  85. package/.output/server/chunks/build/{useOpsLog-8HCYFb6n.mjs → useOpsLog-Dm8QEb1I.mjs} +2 -2
  86. package/.output/server/chunks/build/{useOpsLog-8HCYFb6n.mjs.map → useOpsLog-Dm8QEb1I.mjs.map} +1 -1
  87. package/.output/server/chunks/build/{useWorkshopApi-D2gq06N2.mjs → useWorkshopApi-B-L3MmIX.mjs} +9 -2
  88. package/.output/server/chunks/build/{useWorkshopApi-D2gq06N2.mjs.map → useWorkshopApi-B-L3MmIX.mjs.map} +1 -1
  89. package/.output/server/chunks/build/{users-B50HHrfi.mjs → users-B9SAdEtH.mjs} +3 -3
  90. package/.output/server/chunks/build/{users-B50HHrfi.mjs.map → users-B9SAdEtH.mjs.map} +1 -1
  91. package/.output/server/chunks/routes/api/plugins/_name/_...path_.mjs +14 -2
  92. package/.output/server/chunks/routes/api/plugins/_name/_...path_.mjs.map +1 -1
  93. package/.output/server/chunks/routes/api/workshop/channel-templates/_id/instantiate.post.mjs +1 -1
  94. package/.output/server/chunks/routes/api/workshop/channels/_id/index.put.mjs +40 -0
  95. package/.output/server/chunks/routes/api/workshop/channels/_id/index.put.mjs.map +1 -0
  96. package/.output/server/chunks/routes/api/workshop/channels/_id/index4.get.mjs +21 -9
  97. package/.output/server/chunks/routes/api/workshop/channels/_id/index4.get.mjs.map +1 -1
  98. package/.output/server/chunks/routes/api/workshop/channels/_id/index5.get.mjs +33 -0
  99. package/.output/server/chunks/routes/api/workshop/channels/_id/index5.get.mjs.map +1 -0
  100. package/.output/server/chunks/routes/api/workshop/channels/_id/terminals.get.mjs +1 -1
  101. package/.output/server/chunks/routes/api/workshop/channels.post.mjs +15 -1
  102. package/.output/server/chunks/routes/api/workshop/channels.post.mjs.map +1 -1
  103. package/.output/server/chunks/routes/api/workshop/daq/_id/bind.post.mjs +1 -1
  104. package/.output/server/chunks/routes/api/workshop/daq/_id/bindings.put.mjs +1 -1
  105. package/.output/server/chunks/routes/api/workshop/daq/_id/frames/content.get.mjs +1 -1
  106. package/.output/server/chunks/routes/api/workshop/daq/_id/frames.get.mjs +1 -1
  107. package/.output/server/chunks/routes/api/workshop/daq/_id/samples.get.mjs +1 -1
  108. package/.output/server/chunks/routes/api/workshop/daq/_id/test.post.mjs +1 -1
  109. package/.output/server/chunks/routes/api/workshop/daq/_id_.delete.mjs +1 -1
  110. package/.output/server/chunks/routes/api/workshop/daq/_id_.patch.mjs +1 -1
  111. package/.output/server/chunks/routes/api/workshop/daq/alarms/_id/ack.post.mjs +1 -1
  112. package/.output/server/chunks/routes/api/workshop/daq/controller.post.mjs +1 -1
  113. package/.output/server/chunks/routes/api/workshop/daq/index.post.mjs +1 -1
  114. package/.output/server/chunks/routes/api/workshop/daq/infra/reconnect.post.mjs +1 -1
  115. package/.output/server/chunks/routes/api/workshop/daq/infra.get.mjs +1 -1
  116. package/.output/server/chunks/routes/api/workshop/daq/templates/_key_.delete.mjs +1 -1
  117. package/.output/server/chunks/routes/api/workshop/daq/templates/_key_.patch.mjs +1 -1
  118. package/.output/server/chunks/routes/api/workshop/daq/test-driver.post.mjs +1 -1
  119. package/.output/server/chunks/routes/api/workshop/dcw/_id/bind.post.mjs +1 -1
  120. package/.output/server/chunks/routes/api/workshop/dcw/_id/bindings.put.mjs +1 -1
  121. package/.output/server/chunks/routes/api/workshop/dcw/_id/param-ledger.get.mjs +1 -1
  122. package/.output/server/chunks/routes/api/workshop/dcw/_id/read.post.mjs +1 -1
  123. package/.output/server/chunks/routes/api/workshop/dcw/_id/test.post.mjs +1 -1
  124. package/.output/server/chunks/routes/api/workshop/dcw/_id/write.post.mjs +1 -1
  125. package/.output/server/chunks/routes/api/workshop/dcw/_id_.delete.mjs +1 -1
  126. package/.output/server/chunks/routes/api/workshop/dcw/_id_.patch.mjs +1 -1
  127. package/.output/server/chunks/routes/api/workshop/dcw/controller.post.mjs +1 -1
  128. package/.output/server/chunks/routes/api/workshop/dcw/index.get.mjs +1 -1
  129. package/.output/server/chunks/routes/api/workshop/dcw/index.post.mjs +1 -1
  130. package/.output/server/chunks/routes/api/workshop/dcw/index2.get.mjs +1 -1
  131. package/.output/server/chunks/routes/api/workshop/dcw/index2.post.mjs +1 -1
  132. package/.output/server/chunks/routes/api/workshop/dcw/index3.get.mjs +1 -1
  133. package/.output/server/chunks/routes/api/workshop/dcw/index3.post.mjs +1 -1
  134. package/.output/server/chunks/routes/api/workshop/dcw/index4.get.mjs +1 -1
  135. package/.output/server/chunks/routes/api/workshop/dcw/index4.post.mjs +1 -1
  136. package/.output/server/chunks/routes/api/workshop/dcw/index5.get.mjs +1 -1
  137. package/.output/server/chunks/routes/api/workshop/dcw/journal/node/_nodeId/rollback.post.mjs +1 -1
  138. package/.output/server/chunks/routes/api/workshop/dcw/line/query.get.mjs +1 -1
  139. package/.output/server/chunks/routes/api/workshop/dcw/lines/_id/start.post.mjs +1 -1
  140. package/.output/server/chunks/routes/api/workshop/dcw/lines/_id/stop.post.mjs +1 -1
  141. package/.output/server/chunks/routes/api/workshop/dcw/lines/_id_.delete.mjs +1 -1
  142. package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id/judge.post.mjs +1 -1
  143. package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id/rollback.post.mjs +1 -1
  144. package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id/series.get.mjs +1 -1
  145. package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id_.get.mjs +1 -1
  146. package/.output/server/chunks/routes/api/workshop/dcw/products/_id_.delete.mjs +1 -1
  147. package/.output/server/chunks/routes/api/workshop/dcw/products/_id_.patch.mjs +1 -1
  148. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/apply.post.mjs +1 -1
  149. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/mark-good.post.mjs +1 -1
  150. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/rollback-good.post.mjs +1 -1
  151. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id_.delete.mjs +1 -1
  152. package/.output/server/chunks/routes/api/workshop/dcw/runs/_id/close.post.mjs +1 -1
  153. package/.output/server/chunks/routes/api/workshop/dcw/runs/_id/data.get.mjs +1 -1
  154. package/.output/server/chunks/routes/api/workshop/dcw/runs/_id/rollback.post.mjs +1 -1
  155. package/.output/server/chunks/routes/api/workshop/dcw/templates/_key_.delete.mjs +1 -1
  156. package/.output/server/chunks/routes/api/workshop/dcw/templates/_key_.patch.mjs +1 -1
  157. package/.output/server/chunks/routes/api/workshop/dcw/test-driver.post.mjs +1 -1
  158. package/.output/server/chunks/routes/api/workshop/device-twins/_id_.delete.mjs +1 -1
  159. package/.output/server/chunks/routes/api/workshop/device-twins/_id_.patch.mjs +1 -1
  160. package/.output/server/chunks/routes/api/workshop/harnesses/_id/providers.get.mjs +1 -1
  161. package/.output/server/chunks/routes/api/workshop/harnesses.get.mjs +1 -1
  162. package/.output/server/chunks/routes/api/workshop/hitl/pending.get.mjs +1 -1
  163. package/.output/server/chunks/routes/api/workshop/hitl/respond.post.mjs +1 -1
  164. package/.output/server/chunks/routes/api/workshop/index.put.mjs +1 -1
  165. package/.output/server/chunks/routes/api/workshop/index3.post.mjs +1 -1
  166. package/.output/server/chunks/routes/api/workshop/index4.get.mjs +1 -1
  167. package/.output/server/chunks/routes/api/workshop/index4.post.mjs +1 -1
  168. package/.output/server/chunks/routes/api/workshop/index5.get.mjs +1 -1
  169. package/.output/server/chunks/routes/api/workshop/index5.post.mjs +1 -1
  170. package/.output/server/chunks/routes/api/workshop/index6.post.mjs +1 -1
  171. package/.output/server/chunks/routes/api/workshop/plugins/_name/disable.post.mjs +1 -1
  172. package/.output/server/chunks/routes/api/workshop/plugins/_name/enable.post.mjs +1 -1
  173. package/.output/server/chunks/routes/api/workshop/scene/layouts/_channelId_.delete.mjs +1 -1
  174. package/.output/server/chunks/routes/api/workshop/scene/layouts/_channelId_.put.mjs +1 -1
  175. package/.output/server/chunks/routes/api/workshop/workspaces/_id/channel-templates/_tplId_.post.mjs +1 -1
  176. package/.output/server/chunks/routes/renderer.mjs +2 -2
  177. package/.output/server/chunks/virtual/entry.mjs +352 -433
  178. package/.output/server/chunks/virtual/precomputed.mjs +1 -1
  179. package/.output/server/package.json +1 -1
  180. package/app/components/workshop/DaqNodeRow.vue +398 -0
  181. package/app/components/workshop/town/ModelPreview3D.vue +26 -4
  182. package/app/components/workshop/town/TownScene3D.ts +60 -12
  183. package/app/components/workshop/town/TownView.vue +4 -3
  184. package/app/composables/workshop/useCharacterAssets.ts +1 -0
  185. package/app/composables/workshop/useDaqStream.ts +24 -5
  186. package/app/composables/workshop/useDcwStream.ts +13 -4
  187. package/app/composables/workshop/useWorkshopApi.ts +294 -259
  188. package/app/pages/daq/[id].vue +27 -3
  189. package/app/pages/daq/index.vue +8 -355
  190. package/app/pages/settings.vue +253 -2
  191. package/app/pages/workshop/teams.vue +212 -2
  192. package/i18n/dicts/_en.json +361 -1
  193. package/i18n/dicts/plugins.json +10 -0
  194. package/i18n/dicts/settings.json +1 -0
  195. package/i18n/dicts/teamPlugins.json +10 -0
  196. package/i18n/locales/en.ts +1860 -1900
  197. package/i18n/locales/zh-CN.ts +1788 -1829
  198. package/package.json +149 -148
  199. package/public/assets/game/character/yangyang-walk.glb +0 -0
  200. package/scripts/_dbg-cpu-profile.mjs +53 -0
  201. package/scripts/_dbg-render-perf.mjs +142 -0
  202. package/scripts/_dbg-render-regression.mjs +130 -0
  203. package/scripts/i18n-merge.mjs +152 -30
  204. package/scripts/production-closed-loop-e2e.mjs +254 -0
  205. package/scripts/team-plugins-api-smoke.mjs +149 -0
  206. package/scripts/three-system-e2e.mjs +448 -0
  207. package/server/api/plugins/[name]/[...path].ts +46 -31
  208. package/server/api/workshop/channels/[id]/plugins/index.get.ts +35 -0
  209. package/server/api/workshop/channels/[id]/plugins/index.put.ts +39 -0
  210. package/server/api/workshop/channels.post.ts +17 -0
  211. package/server/data/dcw-lines.json +7 -0
  212. package/server/data/dcw-products.json +7 -0
  213. package/server/data/dcw-recipes.json +1 -1
  214. package/server/data/dcw-rollback.json +523 -11
  215. package/server/data/dcw-writes.json +72 -0
  216. package/server/data/dcws.json +368 -368
  217. package/server/data/scene-layouts.json +66 -0
  218. package/server/plugins/aw-plugins.ts +35 -27
  219. package/server/plugins-builtin/diag-bridge/index.mjs +556 -0
  220. package/server/plugins-builtin/rag-bridge/index.mjs +364 -0
  221. package/server/services/workshop/agents/host-tool-bridge.ts +659 -642
  222. package/server/services/workshop/agents/omp-agent.ts +1178 -1178
  223. package/server/services/workshop/agents/plugin-tools.ts +10 -1
  224. package/server/services/workshop/db/channel-plugins.repo.ts +65 -0
  225. package/server/services/workshop/plugins/host.mjs +52 -4
  226. package/server/services/workshop/runtime/manager.ts +2976 -2968
  227. package/shared/config/schema.json +4 -0
  228. package/.output/public/_nuxt/BUcmySDa2.js +0 -209
  229. package/.output/public/_nuxt/CYzpZzB_.js +0 -1
  230. package/.output/public/_nuxt/CjXIpPMR.js +0 -1
  231. package/.output/public/_nuxt/DKHcFE1i.js +0 -1
  232. package/.output/public/_nuxt/DjtE7AYt.js +0 -1
  233. package/.output/public/_nuxt/JOwsShod.js +0 -2
  234. package/.output/public/_nuxt/_id_.C-YXjn8Q.css +0 -1
  235. package/.output/public/_nuxt/builds/meta/024de5f7-6a10-4f53-82ab-bc65f3ec9e35.json +0 -1
  236. package/.output/public/_nuxt/daq.3OKj58HH.css +0 -1
  237. package/.output/public/_nuxt/settings.BqMF2nfj.css +0 -1
  238. package/.output/public/_nuxt/teams.DN0pAGGu.css +0 -1
  239. package/.output/server/chunks/build/daq-B-3xCp_2.mjs.map +0 -1
  240. package/.output/server/chunks/build/settings-UfGyDgM7.mjs.map +0 -1
  241. package/.output/server/chunks/build/teams-Cbg27MWW.mjs.map +0 -1
  242. package/.output/server/chunks/build/useDaqStream-DkRL3tEW.mjs.map +0 -1
  243. package/.output/server/chunks/build/useDcwStream-DyB2ufQI.mjs.map +0 -1
@@ -1,259 +1,294 @@
1
- /**
2
- * Workshop API 类型化封装(P0 面:channels/agents/tasks/messages/memories/queue/runtime)。
3
- * 统一走 $http(Bearer cookie 注入 + envelope 解包);错误由拦截器统一 toast。
4
- */
5
- import type { AepSnapshot } from '#shared/workshop-protocol'
6
-
7
- export interface ChannelDto {
8
- id: string
9
- name: string
10
- description?: string
11
- /** channel 级默认 LLM JSON(透传 llmJson;前端解析) */
12
- llmJson?: string
13
- /** channel 级作业场景 prompt(设置弹窗可编辑) */
14
- scenarioPrompt?: string
15
- leadAgentId: string | null
16
- workspace?: string
17
- enabled: number
18
- /** 归属用户(null = 遗留公共) */
19
- ownerUserId?: string | null
20
- createdAt: string
21
- updatedAt: string
22
- }
23
-
24
- export interface AgentInfoDto {
25
- id: string
26
- channelId: string
27
- name: string
28
- harness: string
29
- role: 'lead' | 'worker'
30
- config: Record<string, unknown>
31
- token?: string
32
- /** 实例启停(1 启用 / 0 禁用) */
33
- enabled?: number
34
- }
35
-
36
- /** harness 注册表元信息(GET /workshop/harnesses;含环境可用性探测结果) */
37
- export interface HarnessMetaDto {
38
- id: string
39
- label: string
40
- description: string
41
- capabilities: {
42
- steer: boolean
43
- supervise: boolean
44
- hitl: boolean
45
- terminal: boolean
46
- contextStats: boolean
47
- compact: boolean
48
- }
49
- /** 环境探测:引擎可立即使用(进程内引擎恒 true;进程型引擎 = CLI 在 PATH 中) */
50
- available?: boolean
51
- /** 进程内引擎(无外部 CLI) */
52
- inprocess?: boolean
53
- /** 进程型引擎声明将拉起的命令 */
54
- command?: string | null
55
- /** PATH 解析出的可执行文件绝对路径 */
56
- resolvedPath?: string | null
57
- /** 不可用原因(available=false 时的人话提示) */
58
- error?: string | null
59
- }
60
-
61
- export interface TaskDto {
62
- id: string
63
- channelId: string
64
- parentId?: string
65
- assigneeId: string
66
- title: string
67
- description?: string
68
- state: string
69
- progress: number
70
- /** 派发路由理由(lead 留痕的审计决策) */
71
- routeReason?: string
72
- artifacts: Array<{ artifactId: string, name?: string, parts: Array<{ text?: string }> }>
73
- createdAt: string
74
- updatedAt: string
75
- }
76
-
77
- export interface MemoryRowDto {
78
- id: string
79
- channelId: string
80
- agentId: string
81
- kind: string
82
- title: string
83
- content: string
84
- importance: number
85
- accessCount: number
86
- createdAt: string
87
- }
88
-
89
- export interface MemorySnippetDto {
90
- id: string
91
- kind: string
92
- title: string
93
- content: string
94
- importance: number
95
- createdAt: string
96
- score: number
97
- source: 'private' | 'shared'
98
- }
99
-
100
- export function useWorkshopApi() {
101
- const http = useHttp()
102
-
103
- return {
104
- // channels
105
- listChannels: () => http.get<{ data: ChannelDto[] }>('/workshop/channels'),
106
- createChannel: (body: { name: string, description?: string, scenarioPrompt?: string, workspace?: string, leadAgent?: { name: string, harness: string, config?: Record<string, unknown> } }) =>
107
- http.post<{ data: { channelId: string, leadAgentId?: string, workspace: string } }>('/workshop/channels', body),
108
- deleteChannel: (id: string) => http.delete<{ data: unknown }>(`/workshop/channels/${id}`),
109
- /** 修改 Channel 实例设置(场景 prompt / 工作目录热更新;成员运行时自动回收重装配) */
110
- patchChannel: (id: string, body: { name?: string, description?: string, scenarioPrompt?: string, workspace?: string, enabled?: number }) =>
111
- http.request<{ data: ChannelDto }>({ method: 'PATCH', url: `/workshop/channels/${id}`, data: body }),
112
- // channel agents
113
- listChannelAgents: (id: string) => http.get<{ data: AgentInfoDto[] }>(`/workshop/channels/${id}/agents`),
114
- addChannelAgent: (id: string, body: { agentId?: string, name?: string, harness?: string, role?: 'lead' | 'worker', config?: Record<string, unknown> }) =>
115
- http.post<{ data: AgentInfoDto }>(`/workshop/channels/${id}/agents`, body),
116
- updateChannelAgent: (id: string, agentId: string, body: { name?: string, config?: Record<string, unknown>, enabled?: 0 | 1, reason?: string }) =>
117
- http.request<{ data: { agentId: string, name: string } }>({ method: 'PATCH', url: `/workshop/channels/${id}/agents/${agentId}`, data: body }),
118
- removeChannelAgent: (id: string, agentId: string) => http.delete<{ data: unknown }>(`/workshop/channels/${id}/agents/${agentId}`),
119
- /** HITL:独立中断指定成员运行时(worker/lead 均可;lead 停止同时停调度,下次任务提交自动重激活) */
120
- stopChannelAgent: (id: string, agentId: string) =>
121
- http.post<{ data: { agentId: string, stopped: boolean } }>(`/workshop/channels/${id}/agents/${agentId}/stop`, {}),
122
- // tasks
123
- listTasks: (id: string) => http.get<{ data: TaskDto[] }>(`/workshop/channels/${id}/tasks`),
124
- submitTask: (id: string, body: { title: string, description?: string, mode?: 'goal' | 'loop' | 'pipeline', modeConfig?: Record<string, unknown>, assigneeId?: string, fromLabel?: string, parts?: Array<{ text: string }> }) =>
125
- http.post<{ data: TaskDto }>(`/workshop/channels/${id}/tasks`, body),
126
- // messages(注入即时消息/队列消息;fromLabel = 人类发送者显示名)
127
- injectMessage: (id: string, body: { toAgentId: string, text: string, priority?: 'immediate' | 'task', requireReply?: boolean, fromLabel?: string }) =>
128
- http.post<{ data: unknown }>(`/workshop/channels/${id}/messages`, body),
129
- // memories
130
- listAgentMemories: (id: string, agentId: string) => http.get<{ data: MemoryRowDto[] }>(`/workshop/channels/${id}/agents/${agentId}/memories`),
131
- searchMemories: (id: string, agentId: string, body: { query: string, scope?: 'auto' | 'private' | 'shared', limit?: number }) =>
132
- http.post<{ data: MemorySnippetDto[] }>(`/workshop/channels/${id}/agents/${agentId}/memories/search`, body),
133
- saveMemory: (id: string, agentId: string, body: { title: string, content: string, importance?: number, dedupKey?: string, scope?: 'private' | 'shared' }) =>
134
- http.post<{ data: unknown }>(`/workshop/channels/${id}/agents/${agentId}/memories`, body),
135
- listTeamMemories: (id: string) => http.get<{ data: MemoryRowDto[] }>(`/workshop/channels/${id}/memories`),
136
- // queue / runtime
137
- queueOverview: (id: string) => http.get<{ data: Array<{ agentId: string, name: string, state: string, currentTaskId: string | null, queuedCount: number, completedCount: number }> }>(`/workshop/channels/${id}/queue`),
138
- runtimeStatus: () => http.get<{ data: { wiredAgents: string[], activeChannels: string[] } }>('/workshop/runtime'),
139
- /** harness 注册表(引擎下拉/能力徽标;与 factory/manager 校验同源) */
140
- listHarnesses: () => http.get<{ data: { harnesses: HarnessMetaDto[] } }>('/workshop/harnesses'),
141
- /** harness 已配置的 LLM provider/model 目录(引擎官方目录面,5 分钟缓存) */
142
- listHarnessProviders: (harness: string) =>
143
- http.get<{ data: { catalog: { providers: Array<{ id: string, models: Array<{ id: string, efforts: string[], defaultEffort?: string }> }>, effortMode: 'levels' | 'freetext' | 'unsupported', note?: string } } }>(`/workshop/harnesses/${harness}/providers`),
144
- // tasks detail / lifecycle(P1 抽屉)
145
- getTask: (taskId: string) => http.get<{ data: TaskDto }>(`/workshop/tasks/${taskId}`),
146
- cancelTask: (taskId: string) => http.post<{ data: TaskDto }>(`/workshop/tasks/${taskId}/cancel`, {}),
147
- /** HITL:重试 FAILED 任务(优先原 assignee,否则队列最短空闲 worker) */
148
- retryTask: (taskId: string) => http.post<{ data: TaskDto }>(`/workshop/tasks/${taskId}/retry`, {}),
149
- /** HITL:统一应答路由(omp-dialog/dcw-approval/codex-approval/opencode-permission/dsh-permission) */
150
- respondHitl: (body: { kind: string, id: string, confirmed?: boolean, cancelled?: boolean, value?: string, response?: string, comment?: string }) =>
151
- http.post<{ data: { ok: boolean, kind: string, id: string } }>('/workshop/hitl/respond', body),
152
- // agent 模板库(P1;v10 用户隔离:private 仅本人,public 全员可用,内置只读)
153
- listTemplates: () => http.get<{ data: AgentTemplateDto[] }>('/workshop/agents'),
154
- createTemplate: (body: { name: string, harness: string, config?: Record<string, unknown>, visibility?: 'private' | 'public' }) =>
155
- http.post<{ data: AgentTemplateDto }>('/workshop/agents', body),
156
- updateTemplate: (id: string, body: { name?: string, harness?: string, config?: Record<string, unknown>, enabled?: number, visibility?: 'private' | 'public' }) =>
157
- http.request<{ data: AgentTemplateDto }>({ method: 'PATCH', url: `/workshop/agents/${id}`, data: body }),
158
- deleteTemplate: (id: string) => http.delete<{ data: unknown }>(`/workshop/agents/${id}`),
159
- // teams(P1 编组库;v10 可见性)
160
- listTeams: () => http.get<{ data: TeamDto[] }>('/workshop/teams'),
161
- createTeam: (body: { name: string, description?: string, visibility?: 'private' | 'public' }) => http.post<{ data: TeamDto }>('/workshop/teams', body),
162
- updateTeam: (id: string, body: { name?: string, description?: string, visibility?: 'private' | 'public' }) =>
163
- http.request<{ data: TeamDto }>({ method: 'PATCH', url: `/workshop/teams/${id}`, data: body }),
164
- deleteTeam: (id: string) => http.delete<{ data: unknown }>(`/workshop/teams/${id}`),
165
- addTeamMember: (id: string, body: { agentId: string, role?: 'lead' | 'worker' }) =>
166
- http.post<{ data: TeamDto }>(`/workshop/teams/${id}/members`, body),
167
- removeTeamMember: (id: string, templateId: string) => http.delete<{ data: TeamDto }>(`/workshop/teams/${id}/members/${templateId}`),
168
- deployTeam: (teamId: string, channelId: string) => http.post<{ data: unknown }>(`/workshop/teams/${teamId}/deploy`, { channelId }),
169
- // channel 模板库(v10:场景 + 工作目录 + 成员组合;实例化一键建 channel)
170
- listChannelTemplates: () => http.get<{ data: ChannelTemplateDto[] }>('/workshop/channel-templates'),
171
- createChannelTemplate: (body: { name: string, description?: string, scenarioPrompt?: string, workspace?: string, lead?: ChannelTemplateDto['lead'], members?: ChannelTemplateMemberDto[], visibility?: 'private' | 'public' }) =>
172
- http.post<{ data: ChannelTemplateDto }>('/workshop/channel-templates', body),
173
- captureChannelTemplate: (body: { channelId: string, name: string, description?: string, visibility?: 'private' | 'public' }) =>
174
- http.post<{ data: ChannelTemplateDto }>('/workshop/channel-templates/from-channel', body),
175
- updateChannelTemplate: (id: string, body: { name?: string, description?: string, scenarioPrompt?: string, workspace?: string, visibility?: 'private' | 'public' }) =>
176
- http.request<{ data: ChannelTemplateDto }>({ method: 'PATCH', url: `/workshop/channel-templates/${id}`, data: body }),
177
- deleteChannelTemplate: (id: string) => http.delete<{ data: unknown }>(`/workshop/channel-templates/${id}`),
178
- instantiateChannelTemplate: (id: string, name?: string) =>
179
- http.post<{ data: { channelId: string, workspace: string, agentCount: number, leadAgentId?: string } }>(`/workshop/channel-templates/${id}/instantiate`, { name }),
180
- /** 从 Channel 模板实例化并挂载到 workspace(替代"挂载已有 Channel") */
181
- mountChannelTemplate: (wsId: string, tplId: string, name?: string) =>
182
- http.post<{ data: { channelId: string, workspace: string, agentCount: number, leadAgentId?: string } }>(`/workshop/workspaces/${wsId}/channel-templates/${tplId}`, { name }),
183
- // channel 成员的 harness 终端会话(rpc-ui 镜像;lanes 控制面板数据源)
184
- listChannelTerminals: (id: string) => http.get<{ data: TerminalSessionDto[] }>(`/workshop/channels/${id}/terminals`),
185
- }
186
- }
187
-
188
- /** harness 终端会话视图(GET /workshop/channels/:id/terminals) */
189
- export interface TerminalSessionDto {
190
- pid: number
191
- agentId: string | null
192
- channelId: string | null
193
- name: string | null
194
- role: 'lead' | 'worker' | null
195
- harness: string
196
- alive: boolean
197
- running: boolean
198
- streaming: boolean
199
- startedAt: number
200
- }
201
-
202
- /** Agent 模板详情(全局;instances = 已克隆实例去向;v10 用户隔离字段) */
203
- export interface AgentTemplateDto {
204
- id: string
205
- name: string
206
- harness: string
207
- config: Record<string, unknown>
208
- enabled: number
209
- /** 可见性:'private' 仅本人 | 'public' 全员可读可用 */
210
- visibility: 'private' | 'public'
211
- /** 内置模板(公开只读,任何人不可修改删除) */
212
- isBuiltin: boolean
213
- /** 归属用户(null = 内置) */
214
- ownerUserId: string | null
215
- /** 归属用户名(列表接口附注;'system' = 内置) */
216
- ownerName?: string | null
217
- instances: Array<{ id: string, channelId: string, role: 'lead' | 'worker', token: string }>
218
- createdAt: string
219
- updatedAt: string
220
- }
221
-
222
- /** AgentTeam 详情(v10 用户隔离字段) */
223
- export interface TeamDto {
224
- id: string
225
- name: string
226
- description?: string
227
- visibility: 'private' | 'public'
228
- isBuiltin: boolean
229
- ownerUserId: string | null
230
- ownerName?: string | null
231
- members: Array<{ templateId: string, name: string, harness: string, role: 'lead' | 'worker', addedAt: string }>
232
- createdAt: string
233
- updatedAt: string
234
- }
235
-
236
- /** Channel 模板成员条目(引用 Agent 模板或内联定义) */
237
- export type ChannelTemplateMemberDto
238
- = | { templateId: string, role: 'lead' | 'worker' }
239
- | { inline: { name: string, harness: string, config?: Record<string, unknown> }, role: 'lead' | 'worker' }
240
-
241
- /** Channel 模板详情(场景 + 工作目录 + 成员组合;v10) */
242
- export interface ChannelTemplateDto {
243
- id: string
244
- name: string
245
- description: string
246
- scenarioPrompt: string
247
- workspace: string
248
- lead: { name: string, harness: string, config?: Record<string, unknown> } | null
249
- members: ChannelTemplateMemberDto[]
250
- visibility: 'private' | 'public'
251
- isBuiltin: boolean
252
- ownerUserId: string | null
253
- ownerName?: string | null
254
- createdAt: string
255
- updatedAt: string
256
- }
257
-
258
- /** AepSnapshot 的轻量 REST 对齐(WS 未连时兜底刷新;实际从 WS channel.snapshot 取) */
259
- export type { AepSnapshot }
1
+ /**
2
+ * Workshop API 类型化封装(P0 面:channels/agents/tasks/messages/memories/queue/runtime)。
3
+ * 统一走 $http(Bearer cookie 注入 + envelope 解包);错误由拦截器统一 toast。
4
+ */
5
+ import type { AepSnapshot } from '#shared/workshop-protocol'
6
+
7
+ export interface ChannelDto {
8
+ id: string
9
+ name: string
10
+ description?: string
11
+ /** channel 级默认 LLM JSON(透传 llmJson;前端解析) */
12
+ llmJson?: string
13
+ /** channel 级作业场景 prompt(设置弹窗可编辑) */
14
+ scenarioPrompt?: string
15
+ leadAgentId: string | null
16
+ workspace?: string
17
+ enabled: number
18
+ /** 归属用户(null = 遗留公共) */
19
+ ownerUserId?: string | null
20
+ createdAt: string
21
+ updatedAt: string
22
+ }
23
+
24
+ export interface AgentInfoDto {
25
+ id: string
26
+ channelId: string
27
+ name: string
28
+ harness: string
29
+ role: 'lead' | 'worker'
30
+ config: Record<string, unknown>
31
+ token?: string
32
+ /** 实例启停(1 启用 / 0 禁用) */
33
+ enabled?: number
34
+ }
35
+
36
+ /** harness 注册表元信息(GET /workshop/harnesses;含环境可用性探测结果) */
37
+ export interface HarnessMetaDto {
38
+ id: string
39
+ label: string
40
+ description: string
41
+ capabilities: {
42
+ steer: boolean
43
+ supervise: boolean
44
+ hitl: boolean
45
+ terminal: boolean
46
+ contextStats: boolean
47
+ compact: boolean
48
+ }
49
+ /** 环境探测:引擎可立即使用(进程内引擎恒 true;进程型引擎 = CLI 在 PATH 中) */
50
+ available?: boolean
51
+ /** 进程内引擎(无外部 CLI) */
52
+ inprocess?: boolean
53
+ /** 进程型引擎声明将拉起的命令 */
54
+ command?: string | null
55
+ /** PATH 解析出的可执行文件绝对路径 */
56
+ resolvedPath?: string | null
57
+ /** 不可用原因(available=false 时的人话提示) */
58
+ error?: string | null
59
+ }
60
+
61
+ export interface TaskDto {
62
+ id: string
63
+ channelId: string
64
+ parentId?: string
65
+ assigneeId: string
66
+ title: string
67
+ description?: string
68
+ state: string
69
+ progress: number
70
+ /** 派发路由理由(lead 留痕的审计决策) */
71
+ routeReason?: string
72
+ artifacts: Array<{ artifactId: string, name?: string, parts: Array<{ text?: string }> }>
73
+ createdAt: string
74
+ updatedAt: string
75
+ }
76
+
77
+ export interface MemoryRowDto {
78
+ id: string
79
+ channelId: string
80
+ agentId: string
81
+ kind: string
82
+ title: string
83
+ content: string
84
+ importance: number
85
+ accessCount: number
86
+ createdAt: string
87
+ }
88
+
89
+ export interface MemorySnippetDto {
90
+ id: string
91
+ kind: string
92
+ title: string
93
+ content: string
94
+ importance: number
95
+ createdAt: string
96
+ score: number
97
+ source: 'private' | 'shared'
98
+ }
99
+
100
+ export function useWorkshopApi() {
101
+ const http = useHttp()
102
+
103
+ return {
104
+ // channels
105
+ listChannels: () => http.get<{ data: ChannelDto[] }>('/workshop/channels'),
106
+ createChannel: (body: { name: string, description?: string, scenarioPrompt?: string, workspace?: string, leadAgent?: { name: string, harness: string, config?: Record<string, unknown> } }) =>
107
+ http.post<{ data: { channelId: string, leadAgentId?: string, workspace: string } }>('/workshop/channels', body),
108
+ deleteChannel: (id: string) => http.delete<{ data: unknown }>(`/workshop/channels/${id}`),
109
+ /** 修改 Channel 实例设置(场景 prompt / 工作目录热更新;成员运行时自动回收重装配) */
110
+ patchChannel: (id: string, body: { name?: string, description?: string, scenarioPrompt?: string, workspace?: string, enabled?: number }) =>
111
+ http.request<{ data: ChannelDto }>({ method: 'PATCH', url: `/workshop/channels/${id}`, data: body }),
112
+ // channel agents
113
+ listChannelAgents: (id: string) => http.get<{ data: AgentInfoDto[] }>(`/workshop/channels/${id}/agents`),
114
+ addChannelAgent: (id: string, body: { agentId?: string, name?: string, harness?: string, role?: 'lead' | 'worker', config?: Record<string, unknown> }) =>
115
+ http.post<{ data: AgentInfoDto }>(`/workshop/channels/${id}/agents`, body),
116
+ updateChannelAgent: (id: string, agentId: string, body: { name?: string, config?: Record<string, unknown>, enabled?: 0 | 1, reason?: string }) =>
117
+ http.request<{ data: { agentId: string, name: string } }>({ method: 'PATCH', url: `/workshop/channels/${id}/agents/${agentId}`, data: body }),
118
+ removeChannelAgent: (id: string, agentId: string) => http.delete<{ data: unknown }>(`/workshop/channels/${id}/agents/${agentId}`),
119
+ /** HITL:独立中断指定成员运行时(worker/lead 均可;lead 停止同时停调度,下次任务提交自动重激活) */
120
+ stopChannelAgent: (id: string, agentId: string) =>
121
+ http.post<{ data: { agentId: string, stopped: boolean } }>(`/workshop/channels/${id}/agents/${agentId}/stop`, {}),
122
+ // tasks
123
+ listTasks: (id: string) => http.get<{ data: TaskDto[] }>(`/workshop/channels/${id}/tasks`),
124
+ submitTask: (id: string, body: { title: string, description?: string, mode?: 'goal' | 'loop' | 'pipeline', modeConfig?: Record<string, unknown>, assigneeId?: string, fromLabel?: string, parts?: Array<{ text: string }> }) =>
125
+ http.post<{ data: TaskDto }>(`/workshop/channels/${id}/tasks`, body),
126
+ // messages(注入即时消息/队列消息;fromLabel = 人类发送者显示名)
127
+ injectMessage: (id: string, body: { toAgentId: string, text: string, priority?: 'immediate' | 'task', requireReply?: boolean, fromLabel?: string }) =>
128
+ http.post<{ data: unknown }>(`/workshop/channels/${id}/messages`, body),
129
+ // memories
130
+ listAgentMemories: (id: string, agentId: string) => http.get<{ data: MemoryRowDto[] }>(`/workshop/channels/${id}/agents/${agentId}/memories`),
131
+ searchMemories: (id: string, agentId: string, body: { query: string, scope?: 'auto' | 'private' | 'shared', limit?: number }) =>
132
+ http.post<{ data: MemorySnippetDto[] }>(`/workshop/channels/${id}/agents/${agentId}/memories/search`, body),
133
+ saveMemory: (id: string, agentId: string, body: { title: string, content: string, importance?: number, dedupKey?: string, scope?: 'private' | 'shared' }) =>
134
+ http.post<{ data: unknown }>(`/workshop/channels/${id}/agents/${agentId}/memories`, body),
135
+ listTeamMemories: (id: string) => http.get<{ data: MemoryRowDto[] }>(`/workshop/channels/${id}/memories`),
136
+ // queue / runtime
137
+ queueOverview: (id: string) => http.get<{ data: Array<{ agentId: string, name: string, state: string, currentTaskId: string | null, queuedCount: number, completedCount: number }> }>(`/workshop/channels/${id}/queue`),
138
+ runtimeStatus: () => http.get<{ data: { wiredAgents: string[], activeChannels: string[] } }>('/workshop/runtime'),
139
+ /** harness 注册表(引擎下拉/能力徽标;与 factory/manager 校验同源) */
140
+ listHarnesses: () => http.get<{ data: { harnesses: HarnessMetaDto[] } }>('/workshop/harnesses'),
141
+ /** harness 已配置的 LLM provider/model 目录(引擎官方目录面,5 分钟缓存) */
142
+ listHarnessProviders: (harness: string) =>
143
+ http.get<{ data: { catalog: { providers: Array<{ id: string, models: Array<{ id: string, efforts: string[], defaultEffort?: string }> }>, effortMode: 'levels' | 'freetext' | 'unsupported', note?: string } } }>(`/workshop/harnesses/${harness}/providers`),
144
+ // tasks detail / lifecycle(P1 抽屉)
145
+ getTask: (taskId: string) => http.get<{ data: TaskDto }>(`/workshop/tasks/${taskId}`),
146
+ cancelTask: (taskId: string) => http.post<{ data: TaskDto }>(`/workshop/tasks/${taskId}/cancel`, {}),
147
+ /** HITL:重试 FAILED 任务(优先原 assignee,否则队列最短空闲 worker) */
148
+ retryTask: (taskId: string) => http.post<{ data: TaskDto }>(`/workshop/tasks/${taskId}/retry`, {}),
149
+ /** HITL:统一应答路由(omp-dialog/dcw-approval/codex-approval/opencode-permission/dsh-permission) */
150
+ respondHitl: (body: { kind: string, id: string, confirmed?: boolean, cancelled?: boolean, value?: string, response?: string, comment?: string }) =>
151
+ http.post<{ data: { ok: boolean, kind: string, id: string } }>('/workshop/hitl/respond', body),
152
+ // agent 模板库(P1;v10 用户隔离:private 仅本人,public 全员可用,内置只读)
153
+ listTemplates: () => http.get<{ data: AgentTemplateDto[] }>('/workshop/agents'),
154
+ createTemplate: (body: { name: string, harness: string, config?: Record<string, unknown>, visibility?: 'private' | 'public' }) =>
155
+ http.post<{ data: AgentTemplateDto }>('/workshop/agents', body),
156
+ updateTemplate: (id: string, body: { name?: string, harness?: string, config?: Record<string, unknown>, enabled?: number, visibility?: 'private' | 'public' }) =>
157
+ http.request<{ data: AgentTemplateDto }>({ method: 'PATCH', url: `/workshop/agents/${id}`, data: body }),
158
+ deleteTemplate: (id: string) => http.delete<{ data: unknown }>(`/workshop/agents/${id}`),
159
+ // teams(P1 编组库;v10 可见性)
160
+ listTeams: () => http.get<{ data: TeamDto[] }>('/workshop/teams'),
161
+ createTeam: (body: { name: string, description?: string, visibility?: 'private' | 'public', plugins?: Array<{ name: string, enabled: boolean }> }) => http.post<{ data: TeamDto }>('/workshop/teams', body),
162
+ updateTeam: (id: string, body: { name?: string, description?: string, visibility?: 'private' | 'public' }) =>
163
+ http.request<{ data: TeamDto }>({ method: 'PATCH', url: `/workshop/teams/${id}`, data: body }),
164
+ deleteTeam: (id: string) => http.delete<{ data: unknown }>(`/workshop/teams/${id}`),
165
+ addTeamMember: (id: string, body: { agentId: string, role?: 'lead' | 'worker' }) =>
166
+ http.post<{ data: TeamDto }>(`/workshop/teams/${id}/members`, body),
167
+ removeTeamMember: (id: string, templateId: string) => http.delete<{ data: TeamDto }>(`/workshop/teams/${id}/members/${templateId}`),
168
+ deployTeam: (teamId: string, channelId: string) => http.post<{ data: unknown }>(`/workshop/teams/${teamId}/deploy`, { channelId }),
169
+ // channel 模板库(v10:场景 + 工作目录 + 成员组合;实例化一键建 channel)
170
+ listChannelTemplates: () => http.get<{ data: ChannelTemplateDto[] }>('/workshop/channel-templates'),
171
+ createChannelTemplate: (body: { name: string, description?: string, scenarioPrompt?: string, workspace?: string, lead?: ChannelTemplateDto['lead'], members?: ChannelTemplateMemberDto[], visibility?: 'private' | 'public' }) =>
172
+ http.post<{ data: ChannelTemplateDto }>('/workshop/channel-templates', body),
173
+ captureChannelTemplate: (body: { channelId: string, name: string, description?: string, visibility?: 'private' | 'public' }) =>
174
+ http.post<{ data: ChannelTemplateDto }>('/workshop/channel-templates/from-channel', body),
175
+ updateChannelTemplate: (id: string, body: { name?: string, description?: string, scenarioPrompt?: string, workspace?: string, visibility?: 'private' | 'public' }) =>
176
+ http.request<{ data: ChannelTemplateDto }>({ method: 'PATCH', url: `/workshop/channel-templates/${id}`, data: body }),
177
+ deleteChannelTemplate: (id: string) => http.delete<{ data: unknown }>(`/workshop/channel-templates/${id}`),
178
+ instantiateChannelTemplate: (id: string, name?: string) =>
179
+ http.post<{ data: { channelId: string, workspace: string, agentCount: number, leadAgentId?: string } }>(`/workshop/channel-templates/${id}/instantiate`, { name }),
180
+ /** 从 Channel 模板实例化并挂载到 workspace(替代"挂载已有 Channel") */
181
+ mountChannelTemplate: (wsId: string, tplId: string, name?: string) =>
182
+ http.post<{ data: { channelId: string, workspace: string, agentCount: number, leadAgentId?: string } }>(`/workshop/workspaces/${wsId}/channel-templates/${tplId}`, { name }),
183
+ // channel 成员的 harness 终端会话(rpc-ui 镜像;lanes 控制面板数据源)
184
+ listChannelTerminals: (id: string) => http.get<{ data: TerminalSessionDto[] }>(`/workshop/channels/${id}/terminals`),
185
+ // plugins(插件管理:清单为顶层 plugins key,非信封;启停 admin + 热重载;健康走插件自注册 /health)
186
+ listPlugins: () => http.get<{ plugins?: WorkshopPluginDto[], data?: { plugins?: WorkshopPluginDto[] } }>('/workshop/plugins'),
187
+ enablePlugin: (name: string) => http.post<{ data?: { ok?: boolean, enabled?: boolean } }>(`/workshop/plugins/${name}/enable`, {}),
188
+ disablePlugin: (name: string) => http.post<{ data?: { ok?: boolean, enabled?: boolean } }>(`/workshop/plugins/${name}/disable`, {}),
189
+ /** 插件健康检测(原始返回,非信封:rag-bridge 看 backend.ok && web.ok,diag-bridge 看 remote.status==='ok') */
190
+ pluginHealth: (name: string) => http.get<Record<string, unknown>>(`/plugins/${name}/health`),
191
+ // 团队(Channel)级插件开关(channel_plugins 表;source=default 表示未显式配置,默认全启用)
192
+ listChannelPlugins: (id: string) =>
193
+ http.get<{ data?: { plugins?: ChannelPluginStateDto[], source?: 'explicit' | 'default' } }>(`/workshop/channels/${id}/plugins`),
194
+ putChannelPlugins: (id: string, body: { plugins: Array<{ name: string, enabled: boolean }> }) =>
195
+ http.put<{ data?: { plugins?: ChannelPluginStateDto[], source?: 'explicit' | 'default' } }>(`/workshop/channels/${id}/plugins`, body),
196
+ }
197
+ }
198
+
199
+ /** 平台插件清单条目(GET /workshop/plugins;顶层 plugins key,兼容 {code,data} 信封) */
200
+ export interface WorkshopPluginDto {
201
+ name: string
202
+ version?: string
203
+ description?: string
204
+ scope?: string
205
+ /** 内置插件(桥接插件) */
206
+ builtin?: boolean
207
+ enabled?: boolean
208
+ hasClient?: boolean
209
+ routes?: Array<{ method: string, path: string }>
210
+ /** 装载失败原因 */
211
+ error?: string | null
212
+ }
213
+
214
+ /** 团队(Channel)插件开关条目(GET/PUT /workshop/channels/:id/plugins) */
215
+ export interface ChannelPluginStateDto {
216
+ name: string
217
+ description?: string
218
+ builtin?: boolean
219
+ /** 该团队对此插件的开关 */
220
+ enabled: boolean
221
+ }
222
+
223
+ /** harness 终端会话视图(GET /workshop/channels/:id/terminals) */
224
+ export interface TerminalSessionDto {
225
+ pid: number
226
+ agentId: string | null
227
+ channelId: string | null
228
+ name: string | null
229
+ role: 'lead' | 'worker' | null
230
+ harness: string
231
+ alive: boolean
232
+ running: boolean
233
+ streaming: boolean
234
+ startedAt: number
235
+ }
236
+
237
+ /** Agent 模板详情(全局;instances = 已克隆实例去向;v10 用户隔离字段) */
238
+ export interface AgentTemplateDto {
239
+ id: string
240
+ name: string
241
+ harness: string
242
+ config: Record<string, unknown>
243
+ enabled: number
244
+ /** 可见性:'private' 仅本人 | 'public' 全员可读可用 */
245
+ visibility: 'private' | 'public'
246
+ /** 内置模板(公开只读,任何人不可修改删除) */
247
+ isBuiltin: boolean
248
+ /** 归属用户(null = 内置) */
249
+ ownerUserId: string | null
250
+ /** 归属用户名(列表接口附注;'system' = 内置) */
251
+ ownerName?: string | null
252
+ instances: Array<{ id: string, channelId: string, role: 'lead' | 'worker', token: string }>
253
+ createdAt: string
254
+ updatedAt: string
255
+ }
256
+
257
+ /** AgentTeam 详情(v10 用户隔离字段) */
258
+ export interface TeamDto {
259
+ id: string
260
+ name: string
261
+ description?: string
262
+ visibility: 'private' | 'public'
263
+ isBuiltin: boolean
264
+ ownerUserId: string | null
265
+ ownerName?: string | null
266
+ members: Array<{ templateId: string, name: string, harness: string, role: 'lead' | 'worker', addedAt: string }>
267
+ createdAt: string
268
+ updatedAt: string
269
+ }
270
+
271
+ /** Channel 模板成员条目(引用 Agent 模板或内联定义) */
272
+ export type ChannelTemplateMemberDto
273
+ = | { templateId: string, role: 'lead' | 'worker' }
274
+ | { inline: { name: string, harness: string, config?: Record<string, unknown> }, role: 'lead' | 'worker' }
275
+
276
+ /** Channel 模板详情(场景 + 工作目录 + 成员组合;v10) */
277
+ export interface ChannelTemplateDto {
278
+ id: string
279
+ name: string
280
+ description: string
281
+ scenarioPrompt: string
282
+ workspace: string
283
+ lead: { name: string, harness: string, config?: Record<string, unknown> } | null
284
+ members: ChannelTemplateMemberDto[]
285
+ visibility: 'private' | 'public'
286
+ isBuiltin: boolean
287
+ ownerUserId: string | null
288
+ ownerName?: string | null
289
+ createdAt: string
290
+ updatedAt: string
291
+ }
292
+
293
+ /** AepSnapshot 的轻量 REST 对齐(WS 未连时兜底刷新;实际从 WS channel.snapshot 取) */
294
+ export type { AepSnapshot }
@@ -291,13 +291,18 @@ function drawChart(): void {
291
291
  ctx.stroke()
292
292
  }
293
293
 
294
- /** live 趋势(WS hist 环形缓冲;独立小画布,与历史图互补) */
294
+ /** live 趋势(WS hist 环形缓冲;独立小画布,与历史图互补)。
295
+ * 绘制门控:hist 未变化跳过重绘;后台标签页暂停;容器 resize 后补绘(免错位模糊)。 */
295
296
  const liveCanvas = ref<HTMLCanvasElement | null>(null)
296
297
  let uiTimer: ReturnType<typeof setInterval> | null = null
298
+ let liveSig = ''
297
299
  function drawLive(): void {
298
300
  const cv = liveCanvas.value
299
301
  const n = node.value
300
302
  if (!cv || !n || n.hist.length < 2) return
303
+ const sig = `${n.hist.length}:${n.hist[n.hist.length - 1]}:${n.hist[0]}`
304
+ if (sig === liveSig) return
305
+ liveSig = sig
301
306
  const dpr = Math.min(window.devicePixelRatio || 1, 2)
302
307
  const w = cv.clientWidth
303
308
  const h = cv.clientHeight
@@ -323,15 +328,34 @@ function drawLive(): void {
323
328
  })
324
329
  ctx.stroke()
325
330
  }
331
+ /** resize 后历史图与 live 图都需补绘(尺寸变化不触发数据变化,原实现会错位) */
332
+ let resizeObs: ResizeObserver | null = null
333
+ let liveHidden = false
334
+ function onVisChange(): void {
335
+ liveHidden = document.hidden
336
+ if (!liveHidden) drawLive()
337
+ }
326
338
  onMounted(() => {
327
339
  void loadHistory()
328
- // live 趋势重绘循环(仅浏览器;SSR 安全)
340
+ // live 趋势重绘循环(仅浏览器;SSR 安全;绘制由 liveSig 门控,数据未变零开销)
329
341
  uiTimer = setInterval(() => {
330
- drawLive()
342
+ if (!liveHidden) drawLive()
331
343
  }, 800)
344
+ document.addEventListener('visibilitychange', onVisChange)
345
+ if (typeof ResizeObserver !== 'undefined') {
346
+ resizeObs = new ResizeObserver(() => {
347
+ liveSig = ''
348
+ drawLive()
349
+ drawChart()
350
+ })
351
+ if (liveCanvas.value) resizeObs.observe(liveCanvas.value)
352
+ }
332
353
  })
333
354
  onBeforeUnmount(() => {
334
355
  if (uiTimer) clearInterval(uiTimer)
356
+ document.removeEventListener('visibilitychange', onVisChange)
357
+ resizeObs?.disconnect()
358
+ resizeObs = null
335
359
  })
336
360
 
337
361
  watch(bucketMs, () => void loadHistory())