agentworkshop 0.7.27 → 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 (1030) hide show
  1. package/.AgentWorkShop/prompts/aml-mission-default.md +20 -0
  2. package/.AgentWorkShop/prompts/aml-playbook.md +49 -0
  3. package/.AgentWorkShop/prompts/host-tools.json +314 -0
  4. package/.output/.AgentWorkShop/prompts/aml-mission-default.md +20 -0
  5. package/.output/.AgentWorkShop/prompts/aml-playbook.md +49 -0
  6. package/.output/.AgentWorkShop/prompts/host-tools.json +314 -0
  7. package/.output/.AgentWorkShop/schema.json +120 -0
  8. package/.output/nitro.json +1 -1
  9. package/.output/public/_nuxt/{BTLEvDxM.js → 4bHdIqEg.js} +8 -8
  10. package/.output/public/_nuxt/B9nXmjSB.js +19 -0
  11. package/.output/public/_nuxt/BASN8nZ0.js +1 -0
  12. package/.output/public/_nuxt/{DNQF_TXX.js → BBBtwOpo.js} +1 -1
  13. package/.output/public/_nuxt/{DoAlYsiF.js → BBwMH_hG.js} +1 -1
  14. package/.output/public/_nuxt/BWSE6hR6.js +1 -0
  15. package/.output/public/_nuxt/BZv4RFYN.js +1 -0
  16. package/.output/public/_nuxt/{BgCrZKv_2.js → Bc0AmjfT.js} +1 -1
  17. package/.output/public/_nuxt/BcmbLh2z2.js +1 -0
  18. package/.output/public/_nuxt/BgTB6h_q.js +2 -0
  19. package/.output/public/_nuxt/BkLJA9J5.js +1 -0
  20. package/.output/public/_nuxt/{XY2z78rj.js → BuCHayqN.js} +1 -1
  21. package/.output/public/_nuxt/{0jKrzLuM.js → BuvcLKh1.js} +1 -1
  22. package/.output/public/_nuxt/C-mDhyEd.js +1 -0
  23. package/.output/public/_nuxt/{DosOJEmZ2.js → C77oC8yC2.js} +1 -1
  24. package/.output/public/_nuxt/CQvmN-Mi.js +1 -0
  25. package/.output/public/_nuxt/CUDrOuW7.js +1 -0
  26. package/.output/public/_nuxt/{DjU9Dx5Y.js → CZcC-gpk.js} +1 -1
  27. package/.output/public/_nuxt/{Cz9gD2Yo.js → CbzsPO5H.js} +1 -1
  28. package/.output/public/_nuxt/CdSOrh2c.js +1 -0
  29. package/.output/public/_nuxt/Cgx818r-.js +1 -0
  30. package/.output/public/_nuxt/Cjm7VogC.js +1 -0
  31. package/.output/public/_nuxt/Cm5mDxzH.js +1 -0
  32. package/.output/public/_nuxt/Cp6z0RN7.js +1 -0
  33. package/.output/public/_nuxt/Ct-WOVr4.js +1 -0
  34. package/.output/public/_nuxt/CwqIxJGj.js +2 -0
  35. package/.output/public/_nuxt/{BGhOrgle.js → D0fhp-Ga.js} +2 -2
  36. package/.output/public/_nuxt/DIaTPH1M.js +1 -0
  37. package/.output/public/_nuxt/DLljr7g0.js +1 -0
  38. package/.output/public/_nuxt/DTYBfjRY.js +1 -0
  39. package/.output/public/_nuxt/DYKVPzN-.js +1 -0
  40. package/.output/public/_nuxt/DZzGarBE2.js +13 -0
  41. package/.output/public/_nuxt/DaMCzQhv.js +1 -0
  42. package/.output/public/_nuxt/DoMxCWN52.js +4 -0
  43. package/.output/public/_nuxt/{CucID8qg2.js → DoTdlVVe2.js} +1 -1
  44. package/.output/public/_nuxt/DsVcWfyR.js +1 -0
  45. package/.output/public/_nuxt/{BCJFMBQ6.js → DzuC31-i.js} +2 -2
  46. package/.output/public/_nuxt/FQri3dV3.js +1 -0
  47. package/.output/public/_nuxt/Lp7Ll94I.js +1 -0
  48. package/.output/public/_nuxt/PluginSlot.DmjNbrcX.css +1 -0
  49. package/.output/public/_nuxt/_id_.hRYo-EAB.css +1 -0
  50. package/.output/public/_nuxt/_wsId_.gXMEOYgX.css +1 -0
  51. package/.output/public/_nuxt/agents.BV70ioCv.css +1 -0
  52. package/.output/public/_nuxt/aml.WU_bh87J.css +1 -0
  53. package/.output/public/_nuxt/builds/latest.json +1 -1
  54. package/.output/public/_nuxt/builds/meta/291ef3e6-fa6a-4dee-8f46-05da1aeab815.json +1 -0
  55. package/.output/public/_nuxt/daq.Bb6l44-O.css +1 -0
  56. package/.output/public/_nuxt/default.jNT73_hq.css +1 -0
  57. package/.output/public/_nuxt/ekuGmQ7R.js +1 -0
  58. package/.output/public/_nuxt/entry.jFrFAWuA.css +1 -0
  59. package/.output/public/_nuxt/pMoIO6rr.js +14 -0
  60. package/.output/public/_nuxt/pages.Cc8GX9T1.css +1 -0
  61. package/.output/public/_nuxt/plugins.wIPyfPn-.css +1 -0
  62. package/.output/public/_nuxt/settings.BCm4NZIc.css +1 -0
  63. package/.output/public/_nuxt/teams.BC75EGnR.css +1 -0
  64. package/.output/server/chunks/_/binding-authz.mjs +23 -0
  65. package/.output/server/chunks/_/binding-authz.mjs.map +1 -0
  66. package/.output/server/chunks/_/character-asset.repo.mjs +1 -1
  67. package/.output/server/chunks/_/host-bindings.mjs +1 -1
  68. package/.output/server/chunks/_/nitro.mjs +13557 -6855
  69. package/.output/server/chunks/_/nitro.mjs.map +1 -1
  70. package/.output/server/chunks/_/scene-layout.repo.mjs +3 -3
  71. package/.output/server/chunks/_/scene-layout.repo.mjs.map +1 -1
  72. package/.output/server/chunks/build/Checkbox-eax2M3o-.mjs +207 -0
  73. package/.output/server/chunks/build/Checkbox-eax2M3o-.mjs.map +1 -0
  74. package/.output/server/chunks/build/{OmpTerminalPanel-Cw_Vw9oO.mjs → OmpTerminalPanel-Cu_s4i0A.mjs} +2 -2
  75. package/.output/server/chunks/build/{OmpTerminalPanel-Cw_Vw9oO.mjs.map → OmpTerminalPanel-Cu_s4i0A.mjs.map} +1 -1
  76. package/.output/server/chunks/build/{alert-qJnjyRcP.mjs → PluginSlot-CcR4Ys3T.mjs} +140 -4
  77. package/.output/server/chunks/build/PluginSlot-CcR4Ys3T.mjs.map +1 -0
  78. package/.output/server/chunks/build/{TownView-ftIylqiD.mjs → TownView-BdHnAilw.mjs} +5 -5
  79. package/.output/server/chunks/build/{TownView-ftIylqiD.mjs.map → TownView-BdHnAilw.mjs.map} +1 -1
  80. package/.output/server/chunks/build/{_id_-CahfkmEt.mjs → _id_-Cb845FHR.mjs} +7 -5
  81. package/.output/server/chunks/build/_id_-Cb845FHR.mjs.map +1 -0
  82. package/.output/server/chunks/build/{_id_-3Axz2-gV.mjs → _id_-fadFPl2i.mjs} +50 -35
  83. package/.output/server/chunks/build/_id_-fadFPl2i.mjs.map +1 -0
  84. package/.output/server/chunks/build/{_wsId_-BymlQhzS.mjs → _wsId_-CTZswnm5.mjs} +181 -22
  85. package/.output/server/chunks/build/{_wsId_-BymlQhzS.mjs.map → _wsId_-CTZswnm5.mjs.map} +1 -1
  86. package/.output/server/chunks/build/{agents-DuMiSWKp.mjs → agents-Bvin73QY.mjs} +82 -32
  87. package/.output/server/chunks/build/agents-Bvin73QY.mjs.map +1 -0
  88. package/.output/server/chunks/build/aml-uBNIppIf.mjs +508 -0
  89. package/.output/server/chunks/build/aml-uBNIppIf.mjs.map +1 -0
  90. package/.output/server/chunks/build/apiClient-BwnfOQU8.mjs +81 -0
  91. package/.output/server/chunks/build/apiClient-BwnfOQU8.mjs.map +1 -0
  92. package/.output/server/chunks/build/{channel-templates-BStqJ-of.mjs → channel-templates-BTq8570n.mjs} +6 -5
  93. package/.output/server/chunks/build/channel-templates-BTq8570n.mjs.map +1 -0
  94. package/.output/server/chunks/build/{checkbox-C1gABOca.mjs → checkbox-8fB-wI-T.mjs} +2 -2
  95. package/.output/server/chunks/build/{checkbox-C1gABOca.mjs.map → checkbox-8fB-wI-T.mjs.map} +1 -1
  96. package/.output/server/chunks/build/{daq-ChYCABz1.mjs → daq-BvihjQyW.mjs} +111 -109
  97. package/.output/server/chunks/build/daq-BvihjQyW.mjs.map +1 -0
  98. package/.output/server/chunks/build/{dcw-CcQNGggh.mjs → dcw-Ks2vJ4PF.mjs} +5 -3
  99. package/.output/server/chunks/build/dcw-Ks2vJ4PF.mjs.map +1 -0
  100. package/.output/server/chunks/build/{default-95-zOTPt.mjs → default-GgHt4O2R.mjs} +164 -101
  101. package/.output/server/chunks/build/{default-95-zOTPt.mjs.map → default-GgHt4O2R.mjs.map} +1 -1
  102. package/.output/server/chunks/build/{input-number-Bd55elNN.mjs → input-number-DzpyYB99.mjs} +2 -2
  103. package/.output/server/chunks/build/{input-number-Bd55elNN.mjs.map → input-number-DzpyYB99.mjs.map} +1 -1
  104. package/.output/server/chunks/build/{logs-D-2UyGtE.mjs → logs-CYBhkQwh.mjs} +5 -3
  105. package/.output/server/chunks/build/logs-CYBhkQwh.mjs.map +1 -0
  106. package/.output/server/chunks/build/{monitor-mfG5jBtz.mjs → monitor-CyfDt4nR.mjs} +7 -6
  107. package/.output/server/chunks/build/{monitor-mfG5jBtz.mjs.map → monitor-CyfDt4nR.mjs.map} +1 -1
  108. package/.output/server/chunks/build/{pages-Dfosfchr.mjs → pages-C-6BRtv8.mjs} +57 -47
  109. package/.output/server/chunks/build/pages-C-6BRtv8.mjs.map +1 -0
  110. package/.output/server/chunks/build/{permissions-B-hhZuzm.mjs → permissions-B52oOmaO.mjs} +6 -5
  111. package/.output/server/chunks/build/permissions-B52oOmaO.mjs.map +1 -0
  112. package/.output/server/chunks/build/{plugins-DZR0T4Mh.mjs → plugins-dZRegC7m.mjs} +22 -18
  113. package/.output/server/chunks/build/plugins-dZRegC7m.mjs.map +1 -0
  114. package/.output/server/chunks/build/{segmented-LPPREMtZ.mjs → segmented-3TrWo0lS.mjs} +3 -3
  115. package/.output/server/chunks/build/{segmented-LPPREMtZ.mjs.map → segmented-3TrWo0lS.mjs.map} +1 -1
  116. package/.output/server/chunks/build/{settings-BajN9TQW.mjs → settings-CgDLkP3s.mjs} +437 -62
  117. package/.output/server/chunks/build/settings-CgDLkP3s.mjs.map +1 -0
  118. package/.output/server/chunks/build/{table-Bf1r2JjE.mjs → table-BjSWwmic.mjs} +4 -4
  119. package/.output/server/chunks/build/{table-Bf1r2JjE.mjs.map → table-BjSWwmic.mjs.map} +1 -1
  120. package/.output/server/chunks/build/{tag-NO9jEqKy.mjs → tag-DNE9vXc0.mjs} +3 -131
  121. package/.output/server/chunks/build/tag-DNE9vXc0.mjs.map +1 -0
  122. package/.output/server/chunks/build/{teams-t2SkRlJP.mjs → teams-2kz3CusY.mjs} +31 -30
  123. package/.output/server/chunks/build/teams-2kz3CusY.mjs.map +1 -0
  124. package/.output/server/chunks/build/{tokens-DiCojbN8.mjs → tokens-BbWLqtVz.mjs} +6 -5
  125. package/.output/server/chunks/build/tokens-BbWLqtVz.mjs.map +1 -0
  126. package/.output/server/chunks/build/town-BUqRobze.mjs +1 -0
  127. package/.output/server/chunks/build/town-BUqRobze.mjs.map +1 -1
  128. package/.output/server/chunks/build/{town-C7QM8DYK.mjs → town-DJ-V5G9U.mjs} +7 -5
  129. package/.output/server/chunks/build/town-DJ-V5G9U.mjs.map +1 -0
  130. package/.output/server/chunks/build/{useDaqStream-BeA2X8KR.mjs → useDaqStream-CIBaiGAl.mjs} +4 -3
  131. package/.output/server/chunks/build/useDaqStream-CIBaiGAl.mjs.map +1 -0
  132. package/.output/server/chunks/build/{useDcwStream-BJW_MitY.mjs → useDcwStream-CBbiYnWe.mjs} +4 -80
  133. package/.output/server/chunks/build/useDcwStream-CBbiYnWe.mjs.map +1 -0
  134. package/.output/server/chunks/build/{useDeviceTwins-Dwz_EY_i.mjs → useDeviceTwins-Yko6nNPF.mjs} +2 -2
  135. package/.output/server/chunks/build/{useDeviceTwins-Dwz_EY_i.mjs.map → useDeviceTwins-Yko6nNPF.mjs.map} +1 -1
  136. package/.output/server/chunks/build/{useOpsLog-Dm8QEb1I.mjs → useOpsLog-CO_VWh7t.mjs} +2 -2
  137. package/.output/server/chunks/build/{useOpsLog-Dm8QEb1I.mjs.map → useOpsLog-CO_VWh7t.mjs.map} +1 -1
  138. package/.output/server/chunks/build/{useWorkshopApi-B-L3MmIX.mjs → useWorkshopApi-NyjL0L3j.mjs} +4 -2
  139. package/.output/server/chunks/build/{useWorkshopApi-B-L3MmIX.mjs.map → useWorkshopApi-NyjL0L3j.mjs.map} +1 -1
  140. package/.output/server/chunks/build/{users-B9SAdEtH.mjs → users-4nzxTjFT.mjs} +6 -5
  141. package/.output/server/chunks/build/users-4nzxTjFT.mjs.map +1 -0
  142. package/.output/server/chunks/build/workshop-81xhz368.mjs +1 -0
  143. package/.output/server/chunks/build/workshop-81xhz368.mjs.map +1 -1
  144. package/.output/server/chunks/routes/api/health.get.mjs +1 -0
  145. package/.output/server/chunks/routes/api/health.get.mjs.map +1 -1
  146. package/.output/server/chunks/routes/api/index.get.mjs +1 -1
  147. package/.output/server/chunks/routes/api/index.post.mjs +1 -1
  148. package/.output/server/chunks/routes/api/metrics.mjs +1 -0
  149. package/.output/server/chunks/routes/api/metrics.mjs.map +1 -1
  150. package/.output/server/chunks/routes/api/plugins/_name/_...path_.mjs +1 -0
  151. package/.output/server/chunks/routes/api/plugins/_name/_...path_.mjs.map +1 -1
  152. package/.output/server/chunks/routes/api/plugins/client/_name_.get.mjs +1 -0
  153. package/.output/server/chunks/routes/api/plugins/client/_name_.get.mjs.map +1 -1
  154. package/.output/server/chunks/routes/api/plugins/i18n.get.mjs +26 -0
  155. package/.output/server/chunks/routes/api/plugins/i18n.get.mjs.map +1 -0
  156. package/.output/server/chunks/routes/api/plugins/manifest.get.mjs +2 -1
  157. package/.output/server/chunks/routes/api/plugins/manifest.get.mjs.map +1 -1
  158. package/.output/server/chunks/routes/api/system/config-groups/_id_.delete.mjs +32 -0
  159. package/.output/server/chunks/routes/api/system/config-groups/_id_.delete.mjs.map +1 -0
  160. package/.output/server/chunks/routes/api/system/config-groups/_id_.patch.mjs +36 -0
  161. package/.output/server/chunks/routes/api/system/config-groups/_id_.patch.mjs.map +1 -0
  162. package/.output/server/chunks/routes/api/system/config.get.mjs +1 -0
  163. package/.output/server/chunks/routes/api/system/config.get.mjs.map +1 -1
  164. package/.output/server/chunks/routes/api/system/index.get.mjs +7 -2
  165. package/.output/server/chunks/routes/api/system/index.get.mjs.map +1 -1
  166. package/.output/server/chunks/routes/api/system/index.patch.mjs +2 -1
  167. package/.output/server/chunks/routes/api/system/index.patch.mjs.map +1 -1
  168. package/.output/server/chunks/routes/api/system/index.post.mjs +36 -0
  169. package/.output/server/chunks/routes/api/system/index.post.mjs.map +1 -0
  170. package/.output/server/chunks/routes/api/system/index2.get.mjs +28 -0
  171. package/.output/server/chunks/routes/api/system/index2.get.mjs.map +1 -0
  172. package/.output/server/chunks/routes/api/system/monitor/terminal/ws.mjs +2 -1
  173. package/.output/server/chunks/routes/api/system/monitor/terminal/ws.mjs.map +1 -1
  174. package/.output/server/chunks/routes/api/system/monitor/terminate.post.mjs +2 -1
  175. package/.output/server/chunks/routes/api/system/monitor/terminate.post.mjs.map +1 -1
  176. package/.output/server/chunks/routes/api/system/monitor.get.mjs +1 -0
  177. package/.output/server/chunks/routes/api/system/monitor.get.mjs.map +1 -1
  178. package/.output/server/chunks/routes/api/system/settings/events.get.mjs +8 -5
  179. package/.output/server/chunks/routes/api/system/settings/events.get.mjs.map +1 -1
  180. package/.output/server/chunks/routes/api/system/settings/reset.post.mjs +2 -1
  181. package/.output/server/chunks/routes/api/system/settings/reset.post.mjs.map +1 -1
  182. package/.output/server/chunks/routes/api/users/_id_.delete.mjs +2 -1
  183. package/.output/server/chunks/routes/api/users/_id_.delete.mjs.map +1 -1
  184. package/.output/server/chunks/routes/api/users/_id_.get.mjs +2 -1
  185. package/.output/server/chunks/routes/api/users/_id_.get.mjs.map +1 -1
  186. package/.output/server/chunks/routes/api/users/_id_.put.mjs +1 -1
  187. package/.output/server/chunks/routes/api/users/index.get.mjs +2 -1
  188. package/.output/server/chunks/routes/api/users/index.get.mjs.map +1 -1
  189. package/.output/server/chunks/routes/api/users/index.post.mjs +1 -1
  190. package/.output/server/chunks/routes/api/users/login.post.mjs +1 -1
  191. package/.output/server/chunks/routes/api/users/logout.post.mjs +2 -1
  192. package/.output/server/chunks/routes/api/users/logout.post.mjs.map +1 -1
  193. package/.output/server/chunks/routes/api/users/me.get.mjs +2 -1
  194. package/.output/server/chunks/routes/api/users/me.get.mjs.map +1 -1
  195. package/.output/server/chunks/routes/api/users/register.post.mjs +1 -1
  196. package/.output/server/chunks/routes/api/users/setup-status.get.mjs +2 -1
  197. package/.output/server/chunks/routes/api/users/setup-status.get.mjs.map +1 -1
  198. package/.output/server/chunks/routes/api/users/tokens/_id/token.get.mjs +2 -1
  199. package/.output/server/chunks/routes/api/users/tokens/_id/token.get.mjs.map +1 -1
  200. package/.output/server/chunks/routes/api/users/tokens/_id_.delete.mjs +2 -1
  201. package/.output/server/chunks/routes/api/users/tokens/_id_.delete.mjs.map +1 -1
  202. package/.output/server/chunks/routes/api/users/tokens/_id_.patch.mjs +1 -1
  203. package/.output/server/chunks/routes/api/workshop/_...path_.mjs +2 -1
  204. package/.output/server/chunks/routes/api/workshop/_...path_.mjs.map +1 -1
  205. package/.output/server/chunks/routes/api/workshop/a2a/_agentId/index.get.mjs +2 -1
  206. package/.output/server/chunks/routes/api/workshop/a2a/_agentId/index.get.mjs.map +1 -1
  207. package/.output/server/chunks/routes/api/workshop/a2a/_agentId/index.post.mjs +1 -1
  208. package/.output/server/chunks/routes/api/workshop/a2a/send.post.mjs +1 -1
  209. package/.output/server/chunks/routes/api/workshop/agent-tools/approvals/_id/decide.post.mjs +2 -1
  210. package/.output/server/chunks/routes/api/workshop/agent-tools/approvals/_id/decide.post.mjs.map +1 -1
  211. package/.output/server/chunks/routes/api/workshop/agent-tools/bindings/_id_.delete.mjs +5 -2
  212. package/.output/server/chunks/routes/api/workshop/agent-tools/bindings/_id_.delete.mjs.map +1 -1
  213. package/.output/server/chunks/routes/api/workshop/agent-tools/bindings/_id_.patch.mjs +9 -3
  214. package/.output/server/chunks/routes/api/workshop/agent-tools/bindings/_id_.patch.mjs.map +1 -1
  215. package/.output/server/chunks/routes/api/workshop/agent-tools/index.get.mjs +2 -1
  216. package/.output/server/chunks/routes/api/workshop/agent-tools/index.get.mjs.map +1 -1
  217. package/.output/server/chunks/routes/api/workshop/agent-tools/index.post.mjs +2 -1
  218. package/.output/server/chunks/routes/api/workshop/agent-tools/index.post.mjs.map +1 -1
  219. package/.output/server/chunks/routes/api/workshop/agent-tools/index2.get.mjs +23 -3
  220. package/.output/server/chunks/routes/api/workshop/agent-tools/index2.get.mjs.map +1 -1
  221. package/.output/server/chunks/routes/api/workshop/agent-tools/invoke.post.mjs +21 -3
  222. package/.output/server/chunks/routes/api/workshop/agent-tools/invoke.post.mjs.map +1 -1
  223. package/.output/server/chunks/routes/api/workshop/agent-tools/list.get.mjs +2 -1
  224. package/.output/server/chunks/routes/api/workshop/agent-tools/list.get.mjs.map +1 -1
  225. package/.output/server/chunks/routes/api/workshop/agents/_id_.delete.mjs +2 -1
  226. package/.output/server/chunks/routes/api/workshop/agents/_id_.delete.mjs.map +1 -1
  227. package/.output/server/chunks/routes/api/workshop/agents/_id_.get.mjs +2 -1
  228. package/.output/server/chunks/routes/api/workshop/agents/_id_.get.mjs.map +1 -1
  229. package/.output/server/chunks/routes/api/workshop/agents/_id_.patch.mjs +1 -1
  230. package/.output/server/chunks/routes/api/workshop/agents/subscribe.post.mjs +1 -1
  231. package/.output/server/chunks/routes/api/workshop/aml/datasets/_id/preview.get.mjs +75 -0
  232. package/.output/server/chunks/routes/api/workshop/aml/datasets/_id/preview.get.mjs.map +1 -0
  233. package/.output/server/chunks/routes/api/workshop/aml/datasets/_id_.get.mjs +35 -0
  234. package/.output/server/chunks/routes/api/workshop/aml/datasets/_id_.get.mjs.map +1 -0
  235. package/.output/server/chunks/routes/api/workshop/aml/index.get.mjs +35 -0
  236. package/.output/server/chunks/routes/api/workshop/aml/index.get.mjs.map +1 -0
  237. package/.output/server/chunks/routes/api/workshop/aml/index.post.mjs +46 -0
  238. package/.output/server/chunks/routes/api/workshop/aml/index.post.mjs.map +1 -0
  239. package/.output/server/chunks/routes/api/workshop/aml/index2.get.mjs +47 -0
  240. package/.output/server/chunks/routes/api/workshop/aml/index2.get.mjs.map +1 -0
  241. package/.output/server/chunks/routes/api/workshop/aml/index2.post.mjs +48 -0
  242. package/.output/server/chunks/routes/api/workshop/aml/index2.post.mjs.map +1 -0
  243. package/.output/server/chunks/routes/api/workshop/aml/index3.get.mjs +41 -0
  244. package/.output/server/chunks/routes/api/workshop/aml/index3.get.mjs.map +1 -0
  245. package/.output/server/chunks/routes/api/workshop/aml/index4.get.mjs +62 -0
  246. package/.output/server/chunks/routes/api/workshop/aml/index4.get.mjs.map +1 -0
  247. package/.output/server/chunks/routes/api/workshop/aml/jobs/_id/cancel.post.mjs +35 -0
  248. package/.output/server/chunks/routes/api/workshop/aml/jobs/_id/cancel.post.mjs.map +1 -0
  249. package/.output/server/chunks/routes/api/workshop/aml/jobs/_id/logs.get.mjs +36 -0
  250. package/.output/server/chunks/routes/api/workshop/aml/jobs/_id/logs.get.mjs.map +1 -0
  251. package/.output/server/chunks/routes/api/workshop/aml/jobs/_id/retry.post.mjs +34 -0
  252. package/.output/server/chunks/routes/api/workshop/aml/jobs/_id/retry.post.mjs.map +1 -0
  253. package/.output/server/chunks/routes/api/workshop/aml/jobs/_id_.get.mjs +38 -0
  254. package/.output/server/chunks/routes/api/workshop/aml/jobs/_id_.get.mjs.map +1 -0
  255. package/.output/server/chunks/routes/api/workshop/aml/models/_id/predict.post.mjs +37 -0
  256. package/.output/server/chunks/routes/api/workshop/aml/models/_id/predict.post.mjs.map +1 -0
  257. package/.output/server/chunks/routes/api/workshop/aml/models/_id/promote.post.mjs +42 -0
  258. package/.output/server/chunks/routes/api/workshop/aml/models/_id/promote.post.mjs.map +1 -0
  259. package/.output/server/chunks/routes/api/workshop/approvals/_id/decide.post.mjs +2 -1
  260. package/.output/server/chunks/routes/api/workshop/approvals/_id/decide.post.mjs.map +1 -1
  261. package/.output/server/chunks/routes/api/workshop/assets/character/_id_.delete.mjs +2 -1
  262. package/.output/server/chunks/routes/api/workshop/assets/character/_id_.delete.mjs.map +1 -1
  263. package/.output/server/chunks/routes/api/workshop/assets/devices/_id_.delete.mjs +2 -1
  264. package/.output/server/chunks/routes/api/workshop/assets/devices/_id_.delete.mjs.map +1 -1
  265. package/.output/server/chunks/routes/api/workshop/assets/index.get.mjs +2 -1
  266. package/.output/server/chunks/routes/api/workshop/assets/index.get.mjs.map +1 -1
  267. package/.output/server/chunks/routes/api/workshop/assets/index.post.mjs +2 -1
  268. package/.output/server/chunks/routes/api/workshop/assets/index.post.mjs.map +1 -1
  269. package/.output/server/chunks/routes/api/workshop/assets/index2.get.mjs +1 -0
  270. package/.output/server/chunks/routes/api/workshop/assets/index2.get.mjs.map +1 -1
  271. package/.output/server/chunks/routes/api/workshop/assets/index2.post.mjs +2 -1
  272. package/.output/server/chunks/routes/api/workshop/assets/index2.post.mjs.map +1 -1
  273. package/.output/server/chunks/routes/api/workshop/audit.get.mjs +2 -1
  274. package/.output/server/chunks/routes/api/workshop/audit.get.mjs.map +1 -1
  275. package/.output/server/chunks/routes/api/workshop/caller.mjs +2 -1
  276. package/.output/server/chunks/routes/api/workshop/caller.mjs.map +1 -1
  277. package/.output/server/chunks/routes/api/workshop/channel-templates/_id/instantiate.post.mjs +2 -2
  278. package/.output/server/chunks/routes/api/workshop/channel-templates/_id_.delete.mjs +2 -1
  279. package/.output/server/chunks/routes/api/workshop/channel-templates/_id_.delete.mjs.map +1 -1
  280. package/.output/server/chunks/routes/api/workshop/channel-templates/_id_.get.mjs +2 -1
  281. package/.output/server/chunks/routes/api/workshop/channel-templates/_id_.get.mjs.map +1 -1
  282. package/.output/server/chunks/routes/api/workshop/channel-templates/_id_.patch.mjs +1 -1
  283. package/.output/server/chunks/routes/api/workshop/channel-templates/from-channel.post.mjs +1 -1
  284. package/.output/server/chunks/routes/api/workshop/channels/_id/activate.post.mjs +2 -1
  285. package/.output/server/chunks/routes/api/workshop/channels/_id/activate.post.mjs.map +1 -1
  286. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/index.get.mjs +2 -1
  287. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/index.get.mjs.map +1 -1
  288. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/index.post.mjs +1 -1
  289. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/memories/_memoryId_.delete.mjs +2 -1
  290. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/memories/_memoryId_.delete.mjs.map +1 -1
  291. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/memories/search.post.mjs +1 -1
  292. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/model.patch.mjs +2 -1
  293. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/model.patch.mjs.map +1 -1
  294. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/position.patch.mjs +2 -1
  295. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/position.patch.mjs.map +1 -1
  296. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/range.patch.mjs +2 -1
  297. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/range.patch.mjs.map +1 -1
  298. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/stop.post.mjs +2 -1
  299. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/stop.post.mjs.map +1 -1
  300. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId_.delete.mjs +2 -1
  301. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId_.delete.mjs.map +1 -1
  302. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId_.patch.mjs +2 -1
  303. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId_.patch.mjs.map +1 -1
  304. package/.output/server/chunks/routes/api/workshop/channels/_id/events.get.mjs +1 -1
  305. package/.output/server/chunks/routes/api/workshop/channels/_id/index.get.mjs +2 -1
  306. package/.output/server/chunks/routes/api/workshop/channels/_id/index.get.mjs.map +1 -1
  307. package/.output/server/chunks/routes/api/workshop/channels/_id/index.post.mjs +1 -1
  308. package/.output/server/chunks/routes/api/workshop/channels/_id/index.put.mjs +2 -1
  309. package/.output/server/chunks/routes/api/workshop/channels/_id/index.put.mjs.map +1 -1
  310. package/.output/server/chunks/routes/api/workshop/channels/_id/index2.get.mjs +2 -1
  311. package/.output/server/chunks/routes/api/workshop/channels/_id/index2.get.mjs.map +1 -1
  312. package/.output/server/chunks/routes/api/workshop/channels/_id/index2.post.mjs +1 -1
  313. package/.output/server/chunks/routes/api/workshop/channels/_id/index3.get.mjs +1 -1
  314. package/.output/server/chunks/routes/api/workshop/channels/_id/index3.post.mjs +1 -1
  315. package/.output/server/chunks/routes/api/workshop/channels/_id/index4.get.mjs +2 -1
  316. package/.output/server/chunks/routes/api/workshop/channels/_id/index4.get.mjs.map +1 -1
  317. package/.output/server/chunks/routes/api/workshop/channels/_id/index4.post.mjs +1 -1
  318. package/.output/server/chunks/routes/api/workshop/channels/_id/index5.get.mjs +1 -0
  319. package/.output/server/chunks/routes/api/workshop/channels/_id/index5.get.mjs.map +1 -1
  320. package/.output/server/chunks/routes/api/workshop/channels/_id/memories/_memoryId_.delete.mjs +2 -1
  321. package/.output/server/chunks/routes/api/workshop/channels/_id/memories/_memoryId_.delete.mjs.map +1 -1
  322. package/.output/server/chunks/routes/api/workshop/channels/_id/queue.get.mjs +2 -1
  323. package/.output/server/chunks/routes/api/workshop/channels/_id/queue.get.mjs.map +1 -1
  324. package/.output/server/chunks/routes/api/workshop/channels/_id/terminals.get.mjs +2 -1
  325. package/.output/server/chunks/routes/api/workshop/channels/_id/terminals.get.mjs.map +1 -1
  326. package/.output/server/chunks/routes/api/workshop/channels/_id_.delete.mjs +1 -0
  327. package/.output/server/chunks/routes/api/workshop/channels/_id_.delete.mjs.map +1 -1
  328. package/.output/server/chunks/routes/api/workshop/channels/index.get.mjs +2 -1
  329. package/.output/server/chunks/routes/api/workshop/channels/index.get.mjs.map +1 -1
  330. package/.output/server/chunks/routes/api/workshop/channels/index.patch.mjs +1 -1
  331. package/.output/server/chunks/routes/api/workshop/channels.get.mjs +1 -0
  332. package/.output/server/chunks/routes/api/workshop/channels.get.mjs.map +1 -1
  333. package/.output/server/chunks/routes/api/workshop/channels.post.mjs +4 -4
  334. package/.output/server/chunks/routes/api/workshop/daq/_id/bind.post.mjs +2 -1
  335. package/.output/server/chunks/routes/api/workshop/daq/_id/bind.post.mjs.map +1 -1
  336. package/.output/server/chunks/routes/api/workshop/daq/_id/bindings.put.mjs +2 -1
  337. package/.output/server/chunks/routes/api/workshop/daq/_id/bindings.put.mjs.map +1 -1
  338. package/.output/server/chunks/routes/api/workshop/daq/_id/frames/content.get.mjs +2 -1
  339. package/.output/server/chunks/routes/api/workshop/daq/_id/frames/content.get.mjs.map +1 -1
  340. package/.output/server/chunks/routes/api/workshop/daq/_id/frames.get.mjs +2 -1
  341. package/.output/server/chunks/routes/api/workshop/daq/_id/frames.get.mjs.map +1 -1
  342. package/.output/server/chunks/routes/api/workshop/daq/_id/samples.get.mjs +2 -1
  343. package/.output/server/chunks/routes/api/workshop/daq/_id/samples.get.mjs.map +1 -1
  344. package/.output/server/chunks/routes/api/workshop/daq/_id/test.post.mjs +2 -1
  345. package/.output/server/chunks/routes/api/workshop/daq/_id/test.post.mjs.map +1 -1
  346. package/.output/server/chunks/routes/api/workshop/daq/_id_.delete.mjs +3 -1
  347. package/.output/server/chunks/routes/api/workshop/daq/_id_.delete.mjs.map +1 -1
  348. package/.output/server/chunks/routes/api/workshop/daq/_id_.patch.mjs +2 -1
  349. package/.output/server/chunks/routes/api/workshop/daq/_id_.patch.mjs.map +1 -1
  350. package/.output/server/chunks/routes/api/workshop/daq/alarms/_id/ack.post.mjs +2 -1
  351. package/.output/server/chunks/routes/api/workshop/daq/alarms/_id/ack.post.mjs.map +1 -1
  352. package/.output/server/chunks/routes/api/workshop/daq/alarms.get.mjs +2 -1
  353. package/.output/server/chunks/routes/api/workshop/daq/alarms.get.mjs.map +1 -1
  354. package/.output/server/chunks/routes/api/workshop/daq/controller.post.mjs +2 -1
  355. package/.output/server/chunks/routes/api/workshop/daq/controller.post.mjs.map +1 -1
  356. package/.output/server/chunks/routes/api/workshop/daq/index.post.mjs +2 -1
  357. package/.output/server/chunks/routes/api/workshop/daq/index.post.mjs.map +1 -1
  358. package/.output/server/chunks/routes/api/workshop/daq/infra/reconnect.post.mjs +2 -1
  359. package/.output/server/chunks/routes/api/workshop/daq/infra/reconnect.post.mjs.map +1 -1
  360. package/.output/server/chunks/routes/api/workshop/daq/infra.get.mjs +2 -1
  361. package/.output/server/chunks/routes/api/workshop/daq/infra.get.mjs.map +1 -1
  362. package/.output/server/chunks/routes/api/workshop/daq/templates/_key_.delete.mjs +2 -1
  363. package/.output/server/chunks/routes/api/workshop/daq/templates/_key_.delete.mjs.map +1 -1
  364. package/.output/server/chunks/routes/api/workshop/daq/templates/_key_.patch.mjs +2 -1
  365. package/.output/server/chunks/routes/api/workshop/daq/templates/_key_.patch.mjs.map +1 -1
  366. package/.output/server/chunks/routes/api/workshop/daq/test-driver.post.mjs +2 -1
  367. package/.output/server/chunks/routes/api/workshop/daq/test-driver.post.mjs.map +1 -1
  368. package/.output/server/chunks/routes/api/workshop/dcw/_id/bind.post.mjs +2 -1
  369. package/.output/server/chunks/routes/api/workshop/dcw/_id/bind.post.mjs.map +1 -1
  370. package/.output/server/chunks/routes/api/workshop/dcw/_id/bindings.put.mjs +2 -1
  371. package/.output/server/chunks/routes/api/workshop/dcw/_id/bindings.put.mjs.map +1 -1
  372. package/.output/server/chunks/routes/api/workshop/dcw/_id/param-ledger.get.mjs +2 -1
  373. package/.output/server/chunks/routes/api/workshop/dcw/_id/param-ledger.get.mjs.map +1 -1
  374. package/.output/server/chunks/routes/api/workshop/dcw/_id/read.post.mjs +2 -1
  375. package/.output/server/chunks/routes/api/workshop/dcw/_id/read.post.mjs.map +1 -1
  376. package/.output/server/chunks/routes/api/workshop/dcw/_id/test.post.mjs +2 -1
  377. package/.output/server/chunks/routes/api/workshop/dcw/_id/test.post.mjs.map +1 -1
  378. package/.output/server/chunks/routes/api/workshop/dcw/_id/write.post.mjs +2 -1
  379. package/.output/server/chunks/routes/api/workshop/dcw/_id/write.post.mjs.map +1 -1
  380. package/.output/server/chunks/routes/api/workshop/dcw/_id_.delete.mjs +2 -1
  381. package/.output/server/chunks/routes/api/workshop/dcw/_id_.delete.mjs.map +1 -1
  382. package/.output/server/chunks/routes/api/workshop/dcw/_id_.patch.mjs +7 -2
  383. package/.output/server/chunks/routes/api/workshop/dcw/_id_.patch.mjs.map +1 -1
  384. package/.output/server/chunks/routes/api/workshop/dcw/controller.post.mjs +2 -1
  385. package/.output/server/chunks/routes/api/workshop/dcw/controller.post.mjs.map +1 -1
  386. package/.output/server/chunks/routes/api/workshop/dcw/index.get.mjs +2 -1
  387. package/.output/server/chunks/routes/api/workshop/dcw/index.get.mjs.map +1 -1
  388. package/.output/server/chunks/routes/api/workshop/dcw/index.post.mjs +2 -1
  389. package/.output/server/chunks/routes/api/workshop/dcw/index.post.mjs.map +1 -1
  390. package/.output/server/chunks/routes/api/workshop/dcw/index2.get.mjs +2 -1
  391. package/.output/server/chunks/routes/api/workshop/dcw/index2.get.mjs.map +1 -1
  392. package/.output/server/chunks/routes/api/workshop/dcw/index2.post.mjs +2 -1
  393. package/.output/server/chunks/routes/api/workshop/dcw/index2.post.mjs.map +1 -1
  394. package/.output/server/chunks/routes/api/workshop/dcw/index3.get.mjs +2 -1
  395. package/.output/server/chunks/routes/api/workshop/dcw/index3.get.mjs.map +1 -1
  396. package/.output/server/chunks/routes/api/workshop/dcw/index3.post.mjs +2 -1
  397. package/.output/server/chunks/routes/api/workshop/dcw/index3.post.mjs.map +1 -1
  398. package/.output/server/chunks/routes/api/workshop/dcw/index4.get.mjs +2 -1
  399. package/.output/server/chunks/routes/api/workshop/dcw/index4.get.mjs.map +1 -1
  400. package/.output/server/chunks/routes/api/workshop/dcw/index4.post.mjs +2 -1
  401. package/.output/server/chunks/routes/api/workshop/dcw/index4.post.mjs.map +1 -1
  402. package/.output/server/chunks/routes/api/workshop/dcw/index5.get.mjs +2 -1
  403. package/.output/server/chunks/routes/api/workshop/dcw/index5.get.mjs.map +1 -1
  404. package/.output/server/chunks/routes/api/workshop/dcw/journal/node/_nodeId/rollback.post.mjs +2 -1
  405. package/.output/server/chunks/routes/api/workshop/dcw/journal/node/_nodeId/rollback.post.mjs.map +1 -1
  406. package/.output/server/chunks/routes/api/workshop/dcw/line/query.get.mjs +2 -1
  407. package/.output/server/chunks/routes/api/workshop/dcw/line/query.get.mjs.map +1 -1
  408. package/.output/server/chunks/routes/api/workshop/dcw/lines/_id/start.post.mjs +2 -1
  409. package/.output/server/chunks/routes/api/workshop/dcw/lines/_id/start.post.mjs.map +1 -1
  410. package/.output/server/chunks/routes/api/workshop/dcw/lines/_id/stop.post.mjs +2 -1
  411. package/.output/server/chunks/routes/api/workshop/dcw/lines/_id/stop.post.mjs.map +1 -1
  412. package/.output/server/chunks/routes/api/workshop/dcw/lines/_id_.delete.mjs +2 -1
  413. package/.output/server/chunks/routes/api/workshop/dcw/lines/_id_.delete.mjs.map +1 -1
  414. package/.output/server/chunks/routes/api/workshop/dcw/lines/_id_.patch.mjs +2 -1
  415. package/.output/server/chunks/routes/api/workshop/dcw/lines/_id_.patch.mjs.map +1 -1
  416. package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id/judge.post.mjs +2 -1
  417. package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id/judge.post.mjs.map +1 -1
  418. package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id/rollback.post.mjs +2 -1
  419. package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id/rollback.post.mjs.map +1 -1
  420. package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id/series.get.mjs +2 -1
  421. package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id/series.get.mjs.map +1 -1
  422. package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id_.get.mjs +2 -1
  423. package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id_.get.mjs.map +1 -1
  424. package/.output/server/chunks/routes/api/workshop/dcw/products/_id_.delete.mjs +2 -1
  425. package/.output/server/chunks/routes/api/workshop/dcw/products/_id_.delete.mjs.map +1 -1
  426. package/.output/server/chunks/routes/api/workshop/dcw/products/_id_.patch.mjs +2 -1
  427. package/.output/server/chunks/routes/api/workshop/dcw/products/_id_.patch.mjs.map +1 -1
  428. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/apply.post.mjs +2 -1
  429. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/apply.post.mjs.map +1 -1
  430. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/mark-good.post.mjs +2 -1
  431. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/mark-good.post.mjs.map +1 -1
  432. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/revert.post.mjs +2 -1
  433. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/revert.post.mjs.map +1 -1
  434. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/rollback-good.post.mjs +2 -1
  435. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/rollback-good.post.mjs.map +1 -1
  436. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/versions.get.mjs +2 -1
  437. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/versions.get.mjs.map +1 -1
  438. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id_.delete.mjs +2 -1
  439. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id_.delete.mjs.map +1 -1
  440. package/.output/server/chunks/routes/api/workshop/dcw/recipes/index.patch.mjs +2 -1
  441. package/.output/server/chunks/routes/api/workshop/dcw/recipes/index.patch.mjs.map +1 -1
  442. package/.output/server/chunks/routes/api/workshop/dcw/runs/_id/close.post.mjs +2 -1
  443. package/.output/server/chunks/routes/api/workshop/dcw/runs/_id/close.post.mjs.map +1 -1
  444. package/.output/server/chunks/routes/api/workshop/dcw/runs/_id/data.get.mjs +2 -1
  445. package/.output/server/chunks/routes/api/workshop/dcw/runs/_id/data.get.mjs.map +1 -1
  446. package/.output/server/chunks/routes/api/workshop/dcw/runs/_id/rollback.post.mjs +2 -1
  447. package/.output/server/chunks/routes/api/workshop/dcw/runs/_id/rollback.post.mjs.map +1 -1
  448. package/.output/server/chunks/routes/api/workshop/dcw/templates/_key_.delete.mjs +2 -1
  449. package/.output/server/chunks/routes/api/workshop/dcw/templates/_key_.delete.mjs.map +1 -1
  450. package/.output/server/chunks/routes/api/workshop/dcw/templates/_key_.patch.mjs +2 -1
  451. package/.output/server/chunks/routes/api/workshop/dcw/templates/_key_.patch.mjs.map +1 -1
  452. package/.output/server/chunks/routes/api/workshop/dcw/test-driver.post.mjs +2 -1
  453. package/.output/server/chunks/routes/api/workshop/dcw/test-driver.post.mjs.map +1 -1
  454. package/.output/server/chunks/routes/api/workshop/device-twins/_id/control.post.mjs +2 -1
  455. package/.output/server/chunks/routes/api/workshop/device-twins/_id/control.post.mjs.map +1 -1
  456. package/.output/server/chunks/routes/api/workshop/device-twins/_id/telemetry.post.mjs +2 -1
  457. package/.output/server/chunks/routes/api/workshop/device-twins/_id/telemetry.post.mjs.map +1 -1
  458. package/.output/server/chunks/routes/api/workshop/device-twins/_id_.delete.mjs +2 -1
  459. package/.output/server/chunks/routes/api/workshop/device-twins/_id_.delete.mjs.map +1 -1
  460. package/.output/server/chunks/routes/api/workshop/device-twins/_id_.patch.mjs +2 -1
  461. package/.output/server/chunks/routes/api/workshop/device-twins/_id_.patch.mjs.map +1 -1
  462. package/.output/server/chunks/routes/api/workshop/fs/dirs.get.mjs +2 -1
  463. package/.output/server/chunks/routes/api/workshop/fs/dirs.get.mjs.map +1 -1
  464. package/.output/server/chunks/routes/api/workshop/harnesses/_id/providers.get.mjs +32 -1
  465. package/.output/server/chunks/routes/api/workshop/harnesses/_id/providers.get.mjs.map +1 -1
  466. package/.output/server/chunks/routes/api/workshop/harnesses.get.mjs +2 -1
  467. package/.output/server/chunks/routes/api/workshop/harnesses.get.mjs.map +1 -1
  468. package/.output/server/chunks/routes/api/workshop/hitl/pending.get.mjs +2 -1
  469. package/.output/server/chunks/routes/api/workshop/hitl/pending.get.mjs.map +1 -1
  470. package/.output/server/chunks/routes/api/workshop/hitl/respond.post.mjs +3 -2
  471. package/.output/server/chunks/routes/api/workshop/hitl/respond.post.mjs.map +1 -1
  472. package/.output/server/chunks/routes/api/workshop/index.get.mjs +1 -0
  473. package/.output/server/chunks/routes/api/workshop/index.get.mjs.map +1 -1
  474. package/.output/server/chunks/routes/api/workshop/index.post.mjs +1 -1
  475. package/.output/server/chunks/routes/api/workshop/index.put.mjs +2 -1
  476. package/.output/server/chunks/routes/api/workshop/index.put.mjs.map +1 -1
  477. package/.output/server/chunks/routes/api/workshop/index10.get.mjs +12 -6
  478. package/.output/server/chunks/routes/api/workshop/index10.get.mjs.map +1 -1
  479. package/.output/server/chunks/routes/api/workshop/index11.get.mjs +4 -2
  480. package/.output/server/chunks/routes/api/workshop/index11.get.mjs.map +1 -1
  481. package/.output/server/chunks/routes/api/workshop/index12.get.mjs +28 -0
  482. package/.output/server/chunks/routes/api/workshop/index12.get.mjs.map +1 -0
  483. package/.output/server/chunks/routes/api/workshop/index2.get.mjs +17 -11
  484. package/.output/server/chunks/routes/api/workshop/index2.get.mjs.map +1 -1
  485. package/.output/server/chunks/routes/api/workshop/index2.post.mjs +1 -1
  486. package/.output/server/chunks/routes/api/workshop/index3.get.mjs +11 -4
  487. package/.output/server/chunks/routes/api/workshop/index3.get.mjs.map +1 -1
  488. package/.output/server/chunks/routes/api/workshop/index3.post.mjs +2 -1
  489. package/.output/server/chunks/routes/api/workshop/index3.post.mjs.map +1 -1
  490. package/.output/server/chunks/routes/api/workshop/index4.get.mjs +5 -27
  491. package/.output/server/chunks/routes/api/workshop/index4.get.mjs.map +1 -1
  492. package/.output/server/chunks/routes/api/workshop/index4.post.mjs +2 -1
  493. package/.output/server/chunks/routes/api/workshop/index4.post.mjs.map +1 -1
  494. package/.output/server/chunks/routes/api/workshop/index5.get.mjs +24 -18
  495. package/.output/server/chunks/routes/api/workshop/index5.get.mjs.map +1 -1
  496. package/.output/server/chunks/routes/api/workshop/index5.post.mjs +2 -1
  497. package/.output/server/chunks/routes/api/workshop/index5.post.mjs.map +1 -1
  498. package/.output/server/chunks/routes/api/workshop/index6.get.mjs +23 -5
  499. package/.output/server/chunks/routes/api/workshop/index6.get.mjs.map +1 -1
  500. package/.output/server/chunks/routes/api/workshop/index6.post.mjs +2 -1
  501. package/.output/server/chunks/routes/api/workshop/index6.post.mjs.map +1 -1
  502. package/.output/server/chunks/routes/api/workshop/index7.get.mjs +4 -17
  503. package/.output/server/chunks/routes/api/workshop/index7.get.mjs.map +1 -1
  504. package/.output/server/chunks/routes/api/workshop/index7.post.mjs +8 -3
  505. package/.output/server/chunks/routes/api/workshop/index7.post.mjs.map +1 -1
  506. package/.output/server/chunks/routes/api/workshop/index8.get.mjs +20 -21
  507. package/.output/server/chunks/routes/api/workshop/index8.get.mjs.map +1 -1
  508. package/.output/server/chunks/routes/api/workshop/index8.post.mjs +1 -1
  509. package/.output/server/chunks/routes/api/workshop/index9.get.mjs +24 -11
  510. package/.output/server/chunks/routes/api/workshop/index9.get.mjs.map +1 -1
  511. package/.output/server/chunks/routes/api/workshop/mailbox/all.get.mjs +1 -0
  512. package/.output/server/chunks/routes/api/workshop/mailbox/all.get.mjs.map +1 -1
  513. package/.output/server/chunks/routes/api/workshop/mailbox.get.mjs +1 -0
  514. package/.output/server/chunks/routes/api/workshop/mailbox.get.mjs.map +1 -1
  515. package/.output/server/chunks/routes/api/workshop/memories/maintenance.post.mjs +2 -1
  516. package/.output/server/chunks/routes/api/workshop/memories/maintenance.post.mjs.map +1 -1
  517. package/.output/server/chunks/routes/api/workshop/plugins/_name/disable.post.mjs +2 -1
  518. package/.output/server/chunks/routes/api/workshop/plugins/_name/disable.post.mjs.map +1 -1
  519. package/.output/server/chunks/routes/api/workshop/plugins/_name/enable.post.mjs +2 -1
  520. package/.output/server/chunks/routes/api/workshop/plugins/_name/enable.post.mjs.map +1 -1
  521. package/.output/server/chunks/routes/api/workshop/plugins/index.get.mjs +2 -1
  522. package/.output/server/chunks/routes/api/workshop/plugins/index.get.mjs.map +1 -1
  523. package/.output/server/chunks/routes/api/workshop/runtime.get.mjs +1 -0
  524. package/.output/server/chunks/routes/api/workshop/runtime.get.mjs.map +1 -1
  525. package/.output/server/chunks/routes/api/workshop/scene/layouts/_channelId_.delete.mjs +2 -1
  526. package/.output/server/chunks/routes/api/workshop/scene/layouts/_channelId_.delete.mjs.map +1 -1
  527. package/.output/server/chunks/routes/api/workshop/scene/layouts/_channelId_.put.mjs +2 -1
  528. package/.output/server/chunks/routes/api/workshop/scene/layouts/_channelId_.put.mjs.map +1 -1
  529. package/.output/server/chunks/routes/api/workshop/scene/layouts.get.mjs +1 -0
  530. package/.output/server/chunks/routes/api/workshop/scene/layouts.get.mjs.map +1 -1
  531. package/.output/server/chunks/routes/api/workshop/tasks/_id/complete.post.mjs +1 -1
  532. package/.output/server/chunks/routes/api/workshop/tasks/_id/dispatch.post.mjs +1 -1
  533. package/.output/server/chunks/routes/api/workshop/tasks/_id/index.post.mjs +2 -1
  534. package/.output/server/chunks/routes/api/workshop/tasks/_id/index.post.mjs.map +1 -1
  535. package/.output/server/chunks/routes/api/workshop/tasks/_id/report.post.mjs +1 -1
  536. package/.output/server/chunks/routes/api/workshop/tasks/_id/retry.post.mjs +2 -1
  537. package/.output/server/chunks/routes/api/workshop/tasks/_id/retry.post.mjs.map +1 -1
  538. package/.output/server/chunks/routes/api/workshop/tasks/_id_.get.mjs +2 -1
  539. package/.output/server/chunks/routes/api/workshop/tasks/_id_.get.mjs.map +1 -1
  540. package/.output/server/chunks/routes/api/workshop/tasks.get.mjs +1 -0
  541. package/.output/server/chunks/routes/api/workshop/tasks.get.mjs.map +1 -1
  542. package/.output/server/chunks/routes/api/workshop/teams/_id/deploy.post.mjs +1 -1
  543. package/.output/server/chunks/routes/api/workshop/teams/_id/index.get.mjs +2 -1
  544. package/.output/server/chunks/routes/api/workshop/teams/_id/index.get.mjs.map +1 -1
  545. package/.output/server/chunks/routes/api/workshop/teams/_id/index.post.mjs +1 -1
  546. package/.output/server/chunks/routes/api/workshop/teams/_id/index.put.mjs +44 -0
  547. package/.output/server/chunks/routes/api/workshop/teams/_id/index.put.mjs.map +1 -0
  548. package/.output/server/chunks/routes/api/workshop/teams/_id/index2.get.mjs +47 -0
  549. package/.output/server/chunks/routes/api/workshop/teams/_id/index2.get.mjs.map +1 -0
  550. package/.output/server/chunks/routes/api/workshop/teams/_id/members/_agentId_.delete.mjs +2 -1
  551. package/.output/server/chunks/routes/api/workshop/teams/_id/members/_agentId_.delete.mjs.map +1 -1
  552. package/.output/server/chunks/routes/api/workshop/teams/_id_.delete.mjs +2 -1
  553. package/.output/server/chunks/routes/api/workshop/teams/_id_.delete.mjs.map +1 -1
  554. package/.output/server/chunks/routes/api/workshop/teams/_id_.get.mjs +2 -1
  555. package/.output/server/chunks/routes/api/workshop/teams/_id_.get.mjs.map +1 -1
  556. package/.output/server/chunks/routes/api/workshop/teams/_id_.patch.mjs +1 -1
  557. package/.output/server/chunks/routes/api/workshop/users/me.get.mjs +2 -0
  558. package/.output/server/chunks/routes/api/workshop/users/me.get.mjs.map +1 -1
  559. package/.output/server/chunks/routes/api/workshop/users/register.post.mjs +1 -1
  560. package/.output/server/chunks/routes/api/workshop/workspaces/_id/channel-templates/_tplId_.post.mjs +2 -2
  561. package/.output/server/chunks/routes/api/workshop/workspaces/_id/channels/_channelId_.delete.mjs +1 -0
  562. package/.output/server/chunks/routes/api/workshop/workspaces/_id/channels/_channelId_.delete.mjs.map +1 -1
  563. package/.output/server/chunks/routes/api/workshop/workspaces/_id/channels/_channelId_.post.mjs +1 -0
  564. package/.output/server/chunks/routes/api/workshop/workspaces/_id/channels/_channelId_.post.mjs.map +1 -1
  565. package/.output/server/chunks/routes/api/workshop/workspaces/index.delete.mjs +1 -0
  566. package/.output/server/chunks/routes/api/workshop/workspaces/index.delete.mjs.map +1 -1
  567. package/.output/server/chunks/routes/renderer.mjs +2 -2
  568. package/.output/server/chunks/virtual/entry.mjs +601 -36
  569. package/.output/server/chunks/virtual/entry.mjs.map +1 -1
  570. package/.output/server/chunks/virtual/precomputed.mjs +1 -1
  571. package/.output/server/index.mjs +1 -0
  572. package/.output/server/node_modules/@anthropic-ai/claude-agent-sdk/package.json +84 -0
  573. package/.output/server/node_modules/@anthropic-ai/claude-agent-sdk/sdk.mjs +225 -0
  574. package/.output/server/package.json +2 -1
  575. package/README-zh.md +507 -478
  576. package/README.md +517 -486
  577. package/app/app.vue +17 -2
  578. package/app/assets/css/main.css +421 -30
  579. package/app/components/AppHeader.vue +17 -0
  580. package/app/components/AppSidebar.vue +162 -63
  581. package/app/components/AwChart.vue +57 -54
  582. package/app/components/workshop/ChannelSessionList.vue +802 -703
  583. package/app/components/workshop/DaqNodeRow.vue +156 -0
  584. package/app/components/workshop/PluginSlot.vue +120 -0
  585. package/app/composables/workshop/useAmlStream.ts +136 -0
  586. package/app/composables/workshop/useDaqStream.ts +8 -1
  587. package/app/composables/workshop/usePluginPanels.ts +72 -0
  588. package/app/composables/workshop/useWorkshopApi.ts +7 -0
  589. package/app/pages/aml/index.vue +1949 -0
  590. package/app/pages/daq/[id].vue +60 -2
  591. package/app/pages/daq/index.vue +7 -148
  592. package/app/pages/index.vue +235 -213
  593. package/app/pages/plugins/index.vue +280 -274
  594. package/app/pages/settings.vue +555 -78
  595. package/app/pages/workshop/agents.vue +23 -1
  596. package/app/pages/workshop/teams.vue +2 -2
  597. package/app/plugins/aw-plugins.client.ts +95 -6
  598. package/app/plugins/runtime-config.client.ts +4 -14
  599. package/app/plugins/theme.client.ts +13 -3
  600. package/app/stores/app.ts +9 -2
  601. package/app/stores/runtime-config.ts +113 -7
  602. package/cli/aw.mjs +16 -3
  603. package/cli/commands/build.mjs +8 -8
  604. package/cli/commands/dev.mjs +5 -13
  605. package/cli/commands/init.mjs +1 -1
  606. package/cli/commands/start.mjs +10 -17
  607. package/cli/core/args.mjs +85 -4
  608. package/cli/core/child-lifecycle.mjs +136 -0
  609. package/config.yml +24 -0
  610. package/docs/plugins.md +128 -220
  611. package/docs/sdk.md +1 -1
  612. package/i18n/dicts/_en.json +43 -2
  613. package/i18n/dicts/aml.json +163 -0
  614. package/i18n/dicts/channelSessionList.json +4 -1
  615. package/i18n/dicts/daqDetail.json +1 -0
  616. package/i18n/dicts/settings.json +33 -1
  617. package/i18n/dicts/teams.json +9 -1
  618. package/i18n/locales/en.ts +364 -132
  619. package/i18n/locales/zh-CN.ts +433 -201
  620. package/nuxt.config.ts +18 -3
  621. package/package.json +153 -149
  622. package/scripts/_audit/.tmp/audit-data/dcws.json +28 -0
  623. package/scripts/_audit/.tmp/dcw-writes.json +15650 -0
  624. package/scripts/_audit/.tmp/dcws.json +9033 -0
  625. package/scripts/_audit/.tmp/pollution-backup/dcw-rollback.polluted.json +470006 -0
  626. package/scripts/_audit/.tmp/pollution-backup/dcws.polluted.json +9085 -0
  627. package/scripts/_audit/.tmp/probe-cwd.txt +1 -0
  628. package/scripts/_audit/audit-harness-adapters.md +664 -0
  629. package/scripts/_audit/awhome/commands/README.md +3 -0
  630. package/scripts/_audit/awhome/commands/hello.mjs +12 -0
  631. package/scripts/_audit/dcw-controller-e2e.ts +99 -0
  632. package/scripts/_audit/dcw-flush-cost.ts +43 -0
  633. package/scripts/_audit/dcw-rollback-ledger.ts +153 -0
  634. package/scripts/_audit/dcw-unrecorded-write.ts +171 -0
  635. package/scripts/_audit/dcw-write-mutex.ts +157 -0
  636. package/scripts/_audit/diag-cwd.ts +20 -0
  637. package/scripts/_audit/diag-cwd2.ts +19 -0
  638. package/scripts/_audit/exp-cost-scaling.mjs +54 -0
  639. package/scripts/_audit/exp-envelope-and-png.mjs +77 -0
  640. package/scripts/_audit/exp-png-decode.mjs +67 -0
  641. package/scripts/_audit/exp-retention-plan.mjs +61 -0
  642. package/scripts/_audit/exp-retention-rescan.mjs +42 -0
  643. package/scripts/_audit/exp-sweep-fairness.mjs +48 -0
  644. package/scripts/_audit/hello.mjs +12 -0
  645. package/scripts/_audit/http-api-authz-audit.md +657 -0
  646. package/scripts/_audit/ndjson-partial-line-repro.mjs +77 -0
  647. package/scripts/_audit/opencode-await-ternary-repro.mjs +20 -0
  648. package/scripts/_audit/part-frag.txt +84 -0
  649. package/scripts/_audit/part-head.txt +45 -0
  650. package/scripts/_audit/probe-binding.mjs +103 -0
  651. package/scripts/_audit/probe-child.mjs +17 -0
  652. package/scripts/_audit/probe-envelope.mjs +49 -0
  653. package/scripts/_audit/probe-packlist.mjs +67 -0
  654. package/scripts/_audit/probe-routes.mjs +47 -0
  655. package/scripts/_audit/probe-routes2.mjs +38 -0
  656. package/scripts/_audit/probe.ts +9 -0
  657. package/scripts/_audit/probe2.ts +6 -0
  658. package/scripts/_audit/probe3.ts +3 -0
  659. package/scripts/_audit/probe4.ts +3 -0
  660. package/scripts/_audit/proj/.AgentWorkShop/commands/echoargs.mjs +13 -0
  661. package/scripts/_audit/proj/config.yml +1 -0
  662. package/scripts/_audit/run.mjs +30 -0
  663. package/scripts/_audit/runtime-audit.md +716 -0
  664. package/scripts/_audit/ts-resolve-hook.mjs +41 -0
  665. package/scripts/_audit/tsconfig.probe.json +24 -0
  666. package/scripts/_audit/typecheck-out.txt +466 -0
  667. package/scripts/_audit/verify-data-integrity.mjs +112 -0
  668. package/scripts/_dbg-agents-dropdown-shot.py +33 -0
  669. package/scripts/_dbg-anim-verify.mjs +1 -1
  670. package/scripts/_dbg-audit-all-pages.mjs +1 -1
  671. package/scripts/_dbg-availability-probe.ts +11 -0
  672. package/scripts/_dbg-bind-bidi-e2e.mjs +1 -1
  673. package/scripts/_dbg-cf-line-shot.mjs +18 -0
  674. package/scripts/_dbg-channel-plugin-ui.mjs +94 -0
  675. package/scripts/_dbg-configroot-audit.mjs +84 -0
  676. package/scripts/_dbg-crash-recovery.mjs +1 -1
  677. package/scripts/_dbg-crush-probe.sh +21 -0
  678. package/scripts/_dbg-crush-spawn-probe.ts +22 -0
  679. package/scripts/_dbg-daq-acc-probe.mjs +1 -1
  680. package/scripts/_dbg-daq-attrib.mjs +1 -1
  681. package/scripts/_dbg-daq-debug.mjs +1 -1
  682. package/scripts/_dbg-daq-diag.mjs +1 -1
  683. package/scripts/_dbg-daq-e2e.mjs +1 -1
  684. package/scripts/_dbg-daq-filter-e2e.mjs +1 -1
  685. package/scripts/_dbg-daq-filter-e2e2.mjs +1 -1
  686. package/scripts/_dbg-daq-final-regression.mjs +1 -1
  687. package/scripts/_dbg-daq-frame-alarm.mjs +1 -1
  688. package/scripts/_dbg-daq-frame-ui.mjs +1 -1
  689. package/scripts/_dbg-daq-frame-ws.mjs +1 -1
  690. package/scripts/_dbg-daq-frames-e2e.mjs +1 -1
  691. package/scripts/_dbg-daq-full-check.mjs +1 -1
  692. package/scripts/_dbg-daq-intervals-func.mjs +94 -0
  693. package/scripts/_dbg-daq-pages-shot.mjs +1 -1
  694. package/scripts/_dbg-daq-perf.mjs +1 -1
  695. package/scripts/_dbg-daq-probe.mjs +1 -1
  696. package/scripts/_dbg-daq-recipe-e2e.mjs +1 -1
  697. package/scripts/_dbg-daq-rows-probe.mjs +1 -1
  698. package/scripts/_dbg-daq-rowstate-e2e.mjs +1 -1
  699. package/scripts/_dbg-daq-rowstate-shot.mjs +1 -1
  700. package/scripts/_dbg-daq-rowstate-shot2.mjs +1 -1
  701. package/scripts/_dbg-daq-rowstyle-verify.mjs +112 -0
  702. package/scripts/_dbg-dash-console-check.mjs +1 -1
  703. package/scripts/_dbg-dash-deep-probe.mjs +1 -1
  704. package/scripts/_dbg-dash-hitpoint.mjs +1 -1
  705. package/scripts/_dbg-dcw-read-rest.mjs +1 -1
  706. package/scripts/_dbg-dcw-read-ui.mjs +1 -1
  707. package/scripts/_dbg-dcw-shot2.mjs +1 -1
  708. package/scripts/_dbg-diag-mock-loop.mjs +89 -0
  709. package/scripts/_dbg-diag-watch.mjs +95 -0
  710. package/scripts/_dbg-error-probe.mjs +2 -2
  711. package/scripts/_dbg-filter-light-verify.mjs +1 -1
  712. package/scripts/_dbg-final-acceptance-2.mjs +1 -1
  713. package/scripts/_dbg-final-acceptance.mjs +1 -1
  714. package/scripts/_dbg-final-full-e2e.mjs +1 -1
  715. package/scripts/_dbg-final-shots.mjs +32 -0
  716. package/scripts/_dbg-final-t6-hitl.mjs +1 -1
  717. package/scripts/_dbg-fix-unused-imports.py +41 -0
  718. package/scripts/_dbg-fresh-scene-e2e.mjs +1 -1
  719. package/scripts/_dbg-goose-probe.mjs +33 -0
  720. package/scripts/_dbg-goose-probe.sh +10 -0
  721. package/scripts/_dbg-groups-ui-verify.mjs +122 -0
  722. package/scripts/_dbg-harness-ui-shot.py +109 -0
  723. package/scripts/_dbg-hidden-check.mjs +1 -1
  724. package/scripts/_dbg-home-repro.mjs +1 -1
  725. package/scripts/_dbg-home-stack.mjs +1 -1
  726. package/scripts/_dbg-hydration-detail.mjs +1 -1
  727. package/scripts/_dbg-infra-lifecycle.mjs +1 -1
  728. package/scripts/_dbg-line-live-e2e.mjs +1 -1
  729. package/scripts/_dbg-line-repo-test.ts +10 -0
  730. package/scripts/_dbg-login-debug.py +23 -0
  731. package/scripts/_dbg-modbus-latency.mjs +22 -0
  732. package/scripts/_dbg-mqtt-chain-e2e.mjs +1 -1
  733. package/scripts/_dbg-oneshot-impl-probe.ts +67 -0
  734. package/scripts/_dbg-opt-team-e2e.mjs +1 -1
  735. package/scripts/_dbg-panesplitter-fix-check.mjs +1 -1
  736. package/scripts/_dbg-phase-e3-monitor.mjs +1 -1
  737. package/scripts/_dbg-pi-spawn-probe.ts +33 -0
  738. package/scripts/_dbg-plc-e2e.mjs +1 -1
  739. package/scripts/_dbg-plugin-config-ui.mjs +111 -0
  740. package/scripts/_dbg-plugin-panels-ui.mjs +54 -0
  741. package/scripts/_dbg-plugin-sink-rest.mjs +1 -1
  742. package/scripts/_dbg-plugin-sink-ui.mjs +1 -1
  743. package/scripts/_dbg-plugin-ui-wizard.mjs +1 -1
  744. package/scripts/_dbg-plugin-verify-e2e.mjs +1 -1
  745. package/scripts/_dbg-pop-clamp-verify.mjs +1 -1
  746. package/scripts/_dbg-preview-console.mjs +1 -1
  747. package/scripts/_dbg-preview-minrepro.mjs +1 -1
  748. package/scripts/_dbg-preview-pixels.mjs +1 -1
  749. package/scripts/_dbg-quality-pages-e2e.mjs +1 -1
  750. package/scripts/_dbg-qwen-acp-probe.mjs +30 -0
  751. package/scripts/_dbg-qwen-capture.mjs +21 -0
  752. package/scripts/_dbg-rail-tree-e2e.mjs +1 -1
  753. package/scripts/_dbg-real-driver-e2e.mjs +1 -1
  754. package/scripts/_dbg-real-scenario-timeline.log +55 -123
  755. package/scripts/_dbg-redesign-shots.mjs +1 -1
  756. package/scripts/_dbg-release-smoke.mjs +1 -1
  757. package/scripts/_dbg-resolve-probe.ts +6 -0
  758. package/scripts/_dbg-restart-persist.mjs +1 -1
  759. package/scripts/_dbg-sc001-dispatch.mjs +1 -1
  760. package/scripts/_dbg-scenario-final-shot.mjs +1 -1
  761. package/scripts/_dbg-scenario-phase-e2.mjs +1 -1
  762. package/scripts/_dbg-scenario-phase-e3.mjs +1 -1
  763. package/scripts/_dbg-scenario-phase1.mjs +1 -1
  764. package/scripts/_dbg-scenario-phase2.mjs +1 -1
  765. package/scripts/_dbg-scenario-phase3-monitor.mjs +1 -1
  766. package/scripts/_dbg-scenario-phase3.mjs +1 -1
  767. package/scripts/_dbg-settings-draft-probe.mjs +39 -0
  768. package/scripts/_dbg-settings-probe.mjs +33 -0
  769. package/scripts/_dbg-task-cancel-probe.mjs +66 -0
  770. package/scripts/_dbg-town-alarm-e2e.mjs +1 -1
  771. package/scripts/_dbg-town-daq-shot.mjs +1 -1
  772. package/scripts/_dbg-town-full-e2e.mjs +1 -1
  773. package/scripts/_dbg-town-gate.mjs +1 -1
  774. package/scripts/_dbg-town-ins-probe.mjs +1 -1
  775. package/scripts/_dbg-town-perf.mjs +1 -1
  776. package/scripts/_dbg-town-realtime.mjs +1 -1
  777. package/scripts/_dbg-town-shot.py +25 -0
  778. package/scripts/_dbg-town-shot3.mjs +1 -1
  779. package/scripts/_dbg-town-smoke.mjs +54 -0
  780. package/scripts/_dbg-town-truth.mjs +1 -1
  781. package/scripts/_dbg-town-truth2.mjs +1 -1
  782. package/scripts/_dbg-trend-expand-test.mjs +1 -1
  783. package/scripts/_dbg-twindaq-focus.mjs +1 -1
  784. package/scripts/_dbg-ui-polish-shot.mjs +1 -1
  785. package/scripts/_dbg-ui-polish-verify1.mjs +1 -1
  786. package/scripts/_dbg-ui-polish-verify2.mjs +1 -1
  787. package/scripts/_dbg-ui-polish-verify3.mjs +1 -1
  788. package/scripts/_dbg-ui-polish-verify4.mjs +1 -1
  789. package/scripts/_dbg-unify-shot.mjs +1 -1
  790. package/scripts/_dbg-uplink-probe.mjs +1 -1
  791. package/scripts/_dbg-wizard-preview-shot.mjs +1 -1
  792. package/scripts/_dbg-wizard-ui-e2e.mjs +1 -1
  793. package/scripts/_dbg-ws-probe.mjs +1 -1
  794. package/scripts/_dbg-wsdot-sanity.mjs +1 -1
  795. package/scripts/_node-state-probe.mjs +1 -1
  796. package/scripts/_tmp-args-probe.mjs +20 -0
  797. package/scripts/_tmp-cyc-entry.mjs +8 -0
  798. package/scripts/_tmp-cyc-main.mjs +5 -0
  799. package/scripts/_tmp-cyc-mod.mjs +2 -0
  800. package/scripts/_tmp-cycle-a.mjs +6 -0
  801. package/scripts/_tmp-cycle-b.mjs +2 -0
  802. package/scripts/_tmp-cycle-probe.mjs +4 -0
  803. package/scripts/_tmp-entry-variant.mjs +2 -0
  804. package/scripts/_tmp-help-probe.mjs +19 -0
  805. package/scripts/_tmp-help-probe2.mjs +2 -0
  806. package/scripts/_tmp-trace-preload.mjs +1 -0
  807. package/scripts/aml-agent-bridge.ts +230 -0
  808. package/scripts/aml-industrial-loop.ts +232 -0
  809. package/scripts/aml-ui-smoke.mjs +67 -0
  810. package/scripts/aw-start-smoke.mjs +194 -0
  811. package/scripts/design-verify-templates.mjs +1 -1
  812. package/scripts/device-line-restore.mjs +1 -1
  813. package/scripts/e2e-aml.ts +259 -0
  814. package/scripts/e2e-config-groups.mjs +238 -0
  815. package/scripts/e2e-full-closedloop.mjs +911 -0
  816. package/scripts/e2e-full-scenario.ts +321 -0
  817. package/scripts/e2e-harness-consistency.ts +204 -0
  818. package/scripts/e2e-multi-harness.ts +233 -76
  819. package/scripts/e2e-plc-plugin-closedloop.mjs +518 -0
  820. package/scripts/e2e-real-scenario.mjs +466 -452
  821. package/scripts/e2e-template-isolation.mjs +2 -2
  822. package/scripts/experiment-castfilm-closedloop.mjs +423 -0
  823. package/scripts/experiment-castfilm-finish.mjs +194 -0
  824. package/scripts/experiment-castfilm-ui-shot.mjs +52 -0
  825. package/scripts/experiment-castfilm-viz.mjs +172 -0
  826. package/scripts/production-closed-loop-e2e.mjs +74 -28
  827. package/scripts/test-aml-integration.ts +159 -0
  828. package/scripts/test-aml-job.ts +174 -0
  829. package/scripts/test-aml-unit.ts +184 -0
  830. package/scripts/test-cli-exit.mjs +235 -0
  831. package/scripts/test-daq-frame-race.mjs +310 -0
  832. package/scripts/test-data-root.mjs +208 -0
  833. package/scripts/test-log-flooding.mjs +160 -0
  834. package/scripts/test-lru.mjs +78 -0
  835. package/scripts/test-memory-month-query.mjs +62 -0
  836. package/scripts/test-plugin-hardening.mjs +45 -0
  837. package/scripts/test-rollback-index.mjs +79 -0
  838. package/scripts/test-sdk-surface.mjs +155 -0
  839. package/scripts/three-system-e2e.mjs +662 -448
  840. package/scripts/town-scene-clear.mjs +1 -1
  841. package/sdk/client.d.mts +110 -0
  842. package/sdk/client.mjs +144 -124
  843. package/sdk/context.mjs +161 -1
  844. package/sdk/index.d.mts +37 -5
  845. package/sdk/index.mjs +44 -41
  846. package/sdk/lifecycle.mjs +4 -1
  847. package/server/api/plugins/i18n.get.ts +12 -0
  848. package/server/api/system/config-groups/[id].delete.ts +21 -0
  849. package/server/api/system/config-groups/[id].patch.ts +26 -0
  850. package/server/api/system/config-groups/index.get.ts +21 -0
  851. package/server/api/system/config-groups/index.post.ts +33 -0
  852. package/server/api/system/settings/events.get.ts +8 -4
  853. package/server/api/workshop/agent-tools/bindings/[id].delete.ts +6 -1
  854. package/server/api/workshop/agent-tools/bindings/[id].patch.ts +12 -3
  855. package/server/api/workshop/agent-tools/bindings/index.get.ts +29 -2
  856. package/server/api/workshop/agent-tools/invoke.post.ts +30 -5
  857. package/server/api/workshop/aml/datasets/[id]/preview.get.ts +68 -0
  858. package/server/api/workshop/aml/datasets/[id].get.ts +24 -0
  859. package/server/api/workshop/aml/datasets/index.get.ts +20 -0
  860. package/server/api/workshop/aml/datasets/index.post.ts +27 -0
  861. package/server/api/workshop/aml/experiments/index.get.ts +35 -0
  862. package/server/api/workshop/aml/index.get.ts +24 -0
  863. package/server/api/workshop/aml/jobs/[id]/cancel.post.ts +21 -0
  864. package/server/api/workshop/aml/jobs/[id]/logs.get.ts +23 -0
  865. package/server/api/workshop/aml/jobs/[id]/retry.post.ts +20 -0
  866. package/server/api/workshop/aml/jobs/[id].get.ts +23 -0
  867. package/server/api/workshop/aml/jobs/index.get.ts +26 -0
  868. package/server/api/workshop/aml/jobs/index.post.ts +44 -0
  869. package/server/api/workshop/aml/models/[id]/predict.post.ts +24 -0
  870. package/server/api/workshop/aml/models/[id]/promote.post.ts +30 -0
  871. package/server/api/workshop/aml/models/index.get.ts +48 -0
  872. package/server/api/workshop/daq/[id].delete.ts +6 -0
  873. package/server/api/workshop/dcw/[id].patch.ts +14 -2
  874. package/server/api/workshop/hitl/respond.post.ts +3 -1
  875. package/server/api/workshop/teams/[id]/plugins/index.get.ts +36 -0
  876. package/server/api/workshop/teams/[id]/plugins/index.put.ts +42 -0
  877. package/server/api/workshop/teams/index.post.ts +13 -0
  878. package/server/api/workshop/users/me.get.ts +5 -0
  879. package/server/api/workshop/ws.ts +14 -2
  880. package/server/data/daqs.json +1648 -123
  881. package/server/data/dcw-lines.json +301 -0
  882. package/server/data/dcw-products.json +140 -0
  883. package/server/data/dcw-recipes.json +890 -0
  884. package/server/data/dcw-rollback.json +11591 -5740
  885. package/server/data/dcw-runs.json +3745 -3559
  886. package/server/data/dcw-templates.json +120 -0
  887. package/server/data/dcw-writes.json +1800 -0
  888. package/server/data/dcws.json +1576 -287
  889. package/server/data/line-runs.json +137 -27
  890. package/server/harness/pi-aw-tools.mjs +51 -0
  891. package/server/plugins/dev-stability-guard.ts +63 -63
  892. package/server/plugins/system-config.ts +10 -11
  893. package/server/plugins/workshop.ts +10 -0
  894. package/server/plugins-builtin/diag-bridge/client.mjs +84 -0
  895. package/server/plugins-builtin/diag-bridge/i18n.json +72 -0
  896. package/server/plugins-builtin/diag-bridge/index.mjs +127 -22
  897. package/server/plugins-builtin/rag-bridge/client.mjs +108 -0
  898. package/server/plugins-builtin/rag-bridge/i18n.json +60 -0
  899. package/server/plugins-builtin/rag-bridge/index.mjs +67 -20
  900. package/server/services/system-config.ts +610 -396
  901. package/server/services/workshop/agents/adapters/line-spawn.ts +15 -6
  902. package/server/services/workshop/agents/adapters/one-shot-cli-agent.ts +530 -0
  903. package/server/services/workshop/agents/base-agent.ts +210 -0
  904. package/server/services/workshop/agents/binding-authz.ts +57 -0
  905. package/server/services/workshop/agents/claude-agent.ts +546 -30
  906. package/server/services/workshop/agents/codex-agent.ts +729 -822
  907. package/server/services/workshop/agents/copilot-agent.ts +136 -0
  908. package/server/services/workshop/agents/crush-agent.ts +107 -0
  909. package/server/services/workshop/agents/cursor-agent.ts +102 -0
  910. package/server/services/workshop/agents/dsh-agent.ts +578 -670
  911. package/server/services/workshop/agents/gemini-agent.ts +121 -0
  912. package/server/services/workshop/agents/goose-agent.ts +98 -0
  913. package/server/services/workshop/agents/harness-models.ts +305 -270
  914. package/server/services/workshop/agents/hermes-agent.ts +528 -0
  915. package/server/services/workshop/agents/host-tool-bridge.ts +53 -2
  916. package/server/services/workshop/agents/industrial-tools.ts +659 -7
  917. package/server/services/workshop/agents/omp-agent.ts +74 -59
  918. package/server/services/workshop/agents/opencode-agent.ts +936 -987
  919. package/server/services/workshop/agents/pi-agent.ts +108 -0
  920. package/server/services/workshop/agents/qwen-agent.ts +540 -0
  921. package/server/services/workshop/agents/registry.ts +117 -5
  922. package/server/services/workshop/agents/tool-approvals.ts +3 -3
  923. package/server/services/workshop/aml/aml.repo.ts +368 -0
  924. package/server/services/workshop/aml/clean.ts +120 -0
  925. package/server/services/workshop/aml/dataset-builder.ts +491 -0
  926. package/server/services/workshop/aml/gates.ts +121 -0
  927. package/server/services/workshop/aml/job-orchestrator.ts +650 -0
  928. package/server/services/workshop/aml/model-registry.ts +169 -0
  929. package/server/services/workshop/aml/predictor.ts +262 -0
  930. package/server/services/workshop/aml/python/aml_eval.py +171 -0
  931. package/server/services/workshop/aml/python/amlkit.py +120 -0
  932. package/server/services/workshop/aml/python/requirements.txt +7 -0
  933. package/server/services/workshop/aml/python/train-example.py +92 -0
  934. package/server/services/workshop/aml/python-runtime.ts +217 -0
  935. package/server/services/workshop/aml/retention.ts +98 -0
  936. package/server/services/workshop/aml/runtime.ts +45 -0
  937. package/server/services/workshop/aml/spec.ts +63 -0
  938. package/server/services/workshop/aml/stats.ts +140 -0
  939. package/server/services/workshop/daq/bus/mqtt.adapter.ts +8 -1
  940. package/server/services/workshop/daq/daq-controller.ts +147 -19
  941. package/server/services/workshop/daq/daq-node.repo.ts +13 -11
  942. package/server/services/workshop/daq/daq-runtime.ts +11 -0
  943. package/server/services/workshop/daq/drivers.ts +89 -8
  944. package/server/services/workshop/db/aml-team-seeds.ts +118 -0
  945. package/server/services/workshop/db/channel-plugins.repo.ts +27 -1
  946. package/server/services/workshop/db/database.ts +89 -1
  947. package/server/services/workshop/db/memory.repo.ts +31 -0
  948. package/server/services/workshop/db/user.repo.ts +9 -0
  949. package/server/services/workshop/dcw/dcw-controller.ts +33 -7
  950. package/server/services/workshop/dcw/dcw-line.repo.ts +5 -3
  951. package/server/services/workshop/dcw/dcw-node.repo.ts +4 -4
  952. package/server/services/workshop/dcw/dcw-product.repo.ts +8 -8
  953. package/server/services/workshop/dcw/dcw-recipe.repo.ts +6 -7
  954. package/server/services/workshop/dcw/dcw-runtime.ts +16 -2
  955. package/server/services/workshop/dcw/dcw-templates.ts +4 -4
  956. package/server/services/workshop/dcw/line-run.ts +5 -5
  957. package/server/services/workshop/dcw/recipe-rollback-manager.ts +3 -1
  958. package/server/services/workshop/dcw/recipe-rollback.repo.ts +155 -52
  959. package/server/services/workshop/logger.ts +145 -3
  960. package/server/services/workshop/plugins/host.mjs +857 -566
  961. package/server/services/workshop/prompts/loader.ts +32 -6
  962. package/server/services/workshop/runtime/manager.ts +53 -13
  963. package/server/services/workshop/runtime/scheduler-loop.ts +18 -1
  964. package/server/services/workshop/scene/scene-layout.repo.ts +5 -5
  965. package/server/services/workshop/settings.ts +64 -0
  966. package/shared/config/engine.mjs +5 -0
  967. package/shared/config/groups.mjs +220 -0
  968. package/shared/config/home.mjs +11 -2
  969. package/shared/config/schema.json +31 -6
  970. package/shared/daq-protocol.ts +6 -0
  971. package/shared/lru.mjs +94 -0
  972. package/shared/workshop-protocol.ts +2 -2
  973. package/.output/public/_nuxt/2jaJHWIJ.js +0 -1
  974. package/.output/public/_nuxt/B8kt898d.js +0 -1
  975. package/.output/public/_nuxt/BFGpEo8S.js +0 -1
  976. package/.output/public/_nuxt/BG4zduPf.js +0 -14
  977. package/.output/public/_nuxt/BHcpzI2n.js +0 -19
  978. package/.output/public/_nuxt/BWyR3awA.js +0 -1
  979. package/.output/public/_nuxt/Bc89zKq2.js +0 -1
  980. package/.output/public/_nuxt/BetmGSO4.js +0 -1
  981. package/.output/public/_nuxt/BowTbasd.js +0 -1
  982. package/.output/public/_nuxt/BvtknqSC2.js +0 -1
  983. package/.output/public/_nuxt/BytVi9VX2.js +0 -4
  984. package/.output/public/_nuxt/CJviSvm-.js +0 -1
  985. package/.output/public/_nuxt/CTfqWGdy.js +0 -1
  986. package/.output/public/_nuxt/Cb3SnTM8.js +0 -1
  987. package/.output/public/_nuxt/Chc5pfAA.js +0 -1
  988. package/.output/public/_nuxt/CobSUzQv.js +0 -2
  989. package/.output/public/_nuxt/D95h62Jn.js +0 -1
  990. package/.output/public/_nuxt/DGAOugLt.js +0 -1
  991. package/.output/public/_nuxt/DHbTyoAV.js +0 -1
  992. package/.output/public/_nuxt/DfLUN8kY.js +0 -1
  993. package/.output/public/_nuxt/DnziMlcX.js +0 -1
  994. package/.output/public/_nuxt/DvgKXPgu2.js +0 -13
  995. package/.output/public/_nuxt/Q_SJDSgx.js +0 -1
  996. package/.output/public/_nuxt/_id_.DdbYeLqn.css +0 -1
  997. package/.output/public/_nuxt/_wsId_.BqWBlY7X.css +0 -1
  998. package/.output/public/_nuxt/agents.CB9Ck7VQ.css +0 -1
  999. package/.output/public/_nuxt/bFnZa2yd.js +0 -1
  1000. package/.output/public/_nuxt/builds/meta/f7a8e33d-5422-45ac-895d-27168f97e3ad.json +0 -1
  1001. package/.output/public/_nuxt/daq.DGV9QS8d.css +0 -1
  1002. package/.output/public/_nuxt/default.BbgdTDCk.css +0 -1
  1003. package/.output/public/_nuxt/entry.BN02X8iR.css +0 -1
  1004. package/.output/public/_nuxt/pages.CG8UJ2TK.css +0 -1
  1005. package/.output/public/_nuxt/plugins.DpCuwaJt.css +0 -1
  1006. package/.output/public/_nuxt/rkVgzg62.js +0 -1
  1007. package/.output/public/_nuxt/settings.W6qrYAui.css +0 -1
  1008. package/.output/public/_nuxt/teams.BBXVkyKq.css +0 -1
  1009. package/.output/server/chunks/build/_id_-3Axz2-gV.mjs.map +0 -1
  1010. package/.output/server/chunks/build/_id_-CahfkmEt.mjs.map +0 -1
  1011. package/.output/server/chunks/build/agents-DuMiSWKp.mjs.map +0 -1
  1012. package/.output/server/chunks/build/alert-qJnjyRcP.mjs.map +0 -1
  1013. package/.output/server/chunks/build/channel-templates-BStqJ-of.mjs.map +0 -1
  1014. package/.output/server/chunks/build/daq-ChYCABz1.mjs.map +0 -1
  1015. package/.output/server/chunks/build/dcw-CcQNGggh.mjs.map +0 -1
  1016. package/.output/server/chunks/build/logs-D-2UyGtE.mjs.map +0 -1
  1017. package/.output/server/chunks/build/pages-Dfosfchr.mjs.map +0 -1
  1018. package/.output/server/chunks/build/permissions-B-hhZuzm.mjs.map +0 -1
  1019. package/.output/server/chunks/build/plugins-DZR0T4Mh.mjs.map +0 -1
  1020. package/.output/server/chunks/build/responsiveObserve-CS0UB6wQ.mjs +0 -78
  1021. package/.output/server/chunks/build/responsiveObserve-CS0UB6wQ.mjs.map +0 -1
  1022. package/.output/server/chunks/build/settings-BajN9TQW.mjs.map +0 -1
  1023. package/.output/server/chunks/build/tag-NO9jEqKy.mjs.map +0 -1
  1024. package/.output/server/chunks/build/teams-t2SkRlJP.mjs.map +0 -1
  1025. package/.output/server/chunks/build/tokens-DiCojbN8.mjs.map +0 -1
  1026. package/.output/server/chunks/build/town-C7QM8DYK.mjs.map +0 -1
  1027. package/.output/server/chunks/build/useDaqStream-BeA2X8KR.mjs.map +0 -1
  1028. package/.output/server/chunks/build/useDcwStream-BJW_MitY.mjs.map +0 -1
  1029. package/.output/server/chunks/build/users-B9SAdEtH.mjs.map +0 -1
  1030. /package/.output/public/_nuxt/{ORt9oDIy.js → ORt9oDIy2.js} +0 -0
@@ -1,703 +1,802 @@
1
- <script setup lang="ts">
2
- /**
3
- * 左栏 Channel 会话列表(Zcode session 栏):workspace 内挂载的 channel,
4
- * 实时状态徽标(忙碌成员数/活跃任务数),点击聚焦;挂载/移出/设置操作。
5
- * v10 模板化:
6
- * - 「从模板挂载」:选择 Channel 模板 → 实例化 + 挂载一步完成(替代"挂载已有 Channel");
7
- * - 「设置」:热修改当前 Channel 实例的场景描述与工作目录(成员运行时自动回收重装配);
8
- * - 「保存为模板」:把当前 Channel 实例捕获为可复用模板(场景/目录/团队快照)。
9
- */
10
- import { message } from 'ant-design-vue'
11
- import { useWorkspacesStore } from '@/app/stores/workshop/workspaces'
12
- import { useEntitiesStore } from '@/app/stores/workshop/entities'
13
- import { useWorkshopApi, type ChannelDto, type ChannelTemplateDto } from '@/app/composables/workshop/useWorkshopApi'
14
-
15
- const { t } = useI18n()
16
-
17
- const props = defineProps<{ wsId: string }>()
18
- const wsStore = useWorkspacesStore()
19
- const entities = useEntitiesStore()
20
- const api = useWorkshopApi()
21
-
22
- const workspace = computed(() => wsStore.workspaces.find(w => w.id === props.wsId))
23
-
24
- const channels = ref<ChannelDto[]>([])
25
- const channelTemplates = ref<ChannelTemplateDto[]>([])
26
- const refreshChannels = async (): Promise<void> => {
27
- // SSR 守卫:axios 相对 baseURL 仅客户端有效(服务端拉取会 Invalid URL)
28
- if (typeof window === 'undefined') return
29
- const [ch, tpl] = await Promise.all([
30
- api.listChannels(),
31
- api.listChannelTemplates().catch(() => null),
32
- ])
33
- channels.value = (ch as unknown as { data?: ChannelDto[] })?.data ?? []
34
- channelTemplates.value = (tpl as unknown as { data?: ChannelTemplateDto[] } | null)?.data ?? []
35
- }
36
- void refreshChannels()
37
-
38
- const mountedChannels = computed(() =>
39
- (workspace.value?.channelIds ?? [])
40
- .map(id => ({ id, meta: channels.value.find(c => c.id === id), entity: entities.channels[id] }))
41
- .map(({ id, meta, entity }) => ({
42
- id,
43
- name: entity?.name ?? meta?.name ?? id.slice(0, 8),
44
- /** 实体基线(WS 快照)是否已到达:未到时计数不可信,展示"同步中"而非误导性的 0 */
45
- synced: entity !== undefined,
46
- busy: entities.busyCount(id),
47
- agents: entities.agents[id]?.length ?? 0,
48
- activeTasks: (entities.tasks[id] ?? []).filter(t => !['COMPLETED', 'CANCELED', 'FAILED'].includes(t.state)).length,
49
- workspace: meta?.workspace ?? '',
50
- })),
51
- )
52
-
53
- const select = (channelId: string): void => {
54
- wsStore.setActiveChannel(props.wsId, channelId)
55
- }
56
-
57
- /** 点击工作目录行:复制完整路径到剪贴板(有真实作用;title 提示全路径) */
58
- const copyWorkspace = async (path: string): Promise<void> => {
59
- try {
60
- await navigator.clipboard.writeText(path)
61
- message.success(t('channelSessionList.kud74vg040', { p0: path }))
62
- }
63
- catch {
64
- message.error(t('channelSessionList.krij3gg026'))
65
- }
66
- }
67
- /** 路径显示 basename(E:\codes\AgentWorkShop → AgentWorkShop),全路径在 title/复制 */
68
- const baseName = (path: string): string => path.replace(/[\\/]+$/, '').split(/[\\/]/).pop() ?? path
69
- /** 默认目录(data/workspaces/<uuid>)的 basename 是 36 位裸 UUID,对用户零信息量 → 不展示该行 */
70
- const UUID_RE = /^[\da-f]{8}-[\da-f]{4}-[\da-f]{4}-[\da-f]{4}-[\da-f]{12}$/i
71
- const displayWorkspace = (path: string): string => {
72
- const base = baseName(path)
73
- return UUID_RE.test(base) ? '' : base
74
- }
75
-
76
- // ===== 新建 Channel 并挂载(空团队) =====
77
- const mountModal = ref(false)
78
- const mountForm = reactive({ name: '', description: '', workspace: '', scenarioPrompt: '' })
79
- const mountSubmitting = ref(false)
80
- /** FileSelector 弹窗(选择服务器目录作为 workspace) */
81
- const fileSelectorOpen = ref(false)
82
- const createAndMount = async (): Promise<void> => {
83
- if (!mountForm.name.trim()) {
84
- message.warning('Channel 名称必填')
85
- return
86
- }
87
- mountSubmitting.value = true
88
- try {
89
- const res = await api.createChannel({
90
- name: mountForm.name.trim(),
91
- description: mountForm.description || undefined,
92
- scenarioPrompt: mountForm.scenarioPrompt.trim() || undefined,
93
- workspace: mountForm.workspace.trim() || undefined,
94
- })
95
- const created = (res as unknown as { data?: { channelId?: string } })?.data
96
- const channelId = created?.channelId
97
- if (!channelId) throw new Error(t('channelSessionList.k1bg6shc027'))
98
- await wsStore.mountChannel(props.wsId, channelId)
99
- mountModal.value = false
100
- mountForm.name = ''
101
- mountForm.description = ''
102
- mountForm.workspace = ''
103
- mountForm.scenarioPrompt = ''
104
- void refreshChannels()
105
- message.success(t('channelSessionList.kn89jvs028'))
106
- }
107
- catch (e) {
108
- message.error(t('channelSessionList.k1x2th9e041', { p0: apiErrorMessage(e) }))
109
- }
110
- finally {
111
- mountSubmitting.value = false
112
- }
113
- }
114
-
115
- // ===== 从 Channel 模板挂载(实例化 + mount 一步) =====
116
- const templateMountId = ref<string | undefined>()
117
- const templateMounting = ref(false)
118
- const mountFromTemplate = async (): Promise<void> => {
119
- if (!templateMountId.value) return
120
- templateMounting.value = true
121
- try {
122
- const res = await api.mountChannelTemplate(props.wsId, templateMountId.value)
123
- const data = (res as unknown as { data?: { agentCount?: number } })?.data
124
- message.success(t('channelSessionList.kai50qc042', { p0: data?.agentCount ?? 0 }))
125
- templateMountId.value = undefined
126
- void refreshChannels()
127
- }
128
- catch (e) {
129
- const err = e as { data?: { message?: string }, message?: string }
130
- message.error(apiErrorMessage(err, t('channelSessionList.k97xi7u029')))
131
- }
132
- finally {
133
- templateMounting.value = false
134
- }
135
- }
136
-
137
- const unmount = (channelId: string): void => {
138
- wsStore.unmountChannel(props.wsId, channelId)
139
- .catch((e: { data?: { message?: string }, message?: string }) => { message.error(apiErrorMessage(e, t('channelSessionList.k1hgfvdc030'))) })
140
- }
141
-
142
- // ===== Channel 实例设置(场景/工作目录热更新)+ 保存为模板 =====
143
- const settingsOpen = ref(false)
144
- const settingsChannelId = ref<string>('')
145
- const settingsForm = reactive({ name: '', scenarioPrompt: '', workspace: '' })
146
-
147
- // ===== Channel 级默认 LLM(harness → provider/model/effort;空 = 用引擎默认) =====
148
- interface CatalogProvider {
149
- id: string
150
- models: Array<{ id: string, efforts: string[], defaultEffort?: string }>
151
- }
152
- const llmForm = reactive({ harness: 'omp', provider: '', model: '', effort: '', enabled: false })
153
- const llmProviders = ref<CatalogProvider[]>([])
154
- const llmEffortMode = ref<'levels' | 'freetext' | 'unsupported'>('levels')
155
- const llmLoading = ref(false)
156
- const llmProviderOptions = computed(() => llmProviders.value.map(p => ({ value: p.id, label: p.id })))
157
- const llmModelOptions = computed(() =>
158
- (llmProviders.value.find(p => p.id === llmForm.provider)?.models ?? []).map(m => ({ value: m.id, label: m.id })),
159
- )
160
- const llmEffortOptions = computed(() => {
161
- const m = llmProviders.value.find(p => p.id === llmForm.provider)?.models.find(x => x.id === llmForm.model)
162
- return (m?.efforts ?? []).map(e => ({ value: e, label: e + (m?.defaultEffort === e ? '(默认)' : '') }))
163
- })
164
- const loadLlmCatalog = async (harness: string): Promise<void> => {
165
- llmLoading.value = true
166
- llmProviders.value = []
167
- try {
168
- const res = await api.listHarnessProviders(harness)
169
- const cat = (res as unknown as { data?: { catalog?: { providers?: CatalogProvider[], effortMode?: 'levels' | 'freetext' | 'unsupported' } } })?.data?.catalog
170
- llmProviders.value = cat?.providers ?? []
171
- llmEffortMode.value = cat?.effortMode ?? 'unsupported'
172
- }
173
- catch { /* 目录拉取失败保留空表 */ }
174
- finally { llmLoading.value = false }
175
- }
176
- const onLlmHarnessChange = async (): Promise<void> => {
177
- llmForm.provider = ''
178
- llmForm.model = ''
179
- llmForm.effort = ''
180
- await loadLlmCatalog(llmForm.harness)
181
- }
182
- const onLlmProviderChange = (): void => {
183
- llmForm.model = ''
184
- llmForm.effort = ''
185
- }
186
- const onLlmModelChange = (): void => {
187
- llmForm.effort = ''
188
- }
189
- const settingsSaving = ref(false)
190
- const fileSelectorOpen2 = ref(false)
191
- const openSettings = (channelId: string): void => {
192
- const meta = channels.value.find(c => c.id === channelId)
193
- settingsChannelId.value = channelId
194
- settingsForm.name = meta?.name ?? ''
195
- settingsForm.scenarioPrompt = meta?.scenarioPrompt ?? ''
196
- settingsForm.workspace = meta?.workspace ?? ''
197
- // 预填 channel 默认 LLM(llmJson 由列表接口透传)
198
- let saved: { provider?: string, model?: string, effort?: string } | null = null
199
- try {
200
- const metaAny = meta as unknown as { llmJson?: string } | undefined
201
- saved = metaAny?.llmJson ? JSON.parse(metaAny.llmJson) as typeof saved : null
202
- }
203
- catch { saved = null }
204
- llmForm.enabled = !!saved?.model
205
- llmForm.harness = 'omp'
206
- llmForm.provider = saved?.provider ?? ''
207
- llmForm.model = saved?.model ?? ''
208
- llmForm.effort = saved?.effort ?? ''
209
- settingsOpen.value = true
210
- if (llmForm.enabled) void loadLlmCatalog(llmForm.harness)
211
- }
212
- const saveSettings = async (): Promise<void> => {
213
- settingsSaving.value = true
214
- try {
215
- await api.patchChannel(settingsChannelId.value, {
216
- scenarioPrompt: settingsForm.scenarioPrompt,
217
- workspace: settingsForm.workspace.trim() || undefined,
218
- llm: llmForm.enabled && llmForm.model
219
- ? { ...(llmForm.provider ? { provider: llmForm.provider } : {}), model: llmForm.model, ...(llmForm.effort ? { effort: llmForm.effort } : {}) }
220
- : null,
221
- })
222
- message.success(t('channelSessionList.kvsxlu6031'))
223
- settingsOpen.value = false
224
- void refreshChannels()
225
- }
226
- catch (e) {
227
- message.error(apiErrorMessage(e))
228
- }
229
- finally {
230
- settingsSaving.value = false
231
- }
232
- }
233
-
234
- // 保存为模板(捕获当前 channel 的场景/目录/团队)
235
- const saveTplOpen = ref(false)
236
- const saveTplForm = reactive({ name: '', description: '', visibility: 'private' as 'private' | 'public' })
237
- const saveTplSubmitting = ref(false)
238
- const openSaveTemplate = (): void => {
239
- saveTplForm.name = t('channelSessionList.k2hfym5043', { p0: settingsForm.name || 'channel' })
240
- saveTplForm.description = ''
241
- saveTplForm.visibility = 'private'
242
- saveTplOpen.value = true
243
- }
244
- const saveAsTemplate = async (): Promise<void> => {
245
- if (!saveTplForm.name.trim()) {
246
- message.warning(t('channelSessionList.k1i0ji0y032'))
247
- return
248
- }
249
- saveTplSubmitting.value = true
250
- try {
251
- await api.captureChannelTemplate({
252
- channelId: settingsChannelId.value,
253
- name: saveTplForm.name.trim(),
254
- description: saveTplForm.description || undefined,
255
- visibility: saveTplForm.visibility,
256
- })
257
- message.success(t('channelSessionList.kjpguxw033'))
258
- saveTplOpen.value = false
259
- void refreshChannels()
260
- }
261
- catch (e) {
262
- message.error(apiErrorMessage(e))
263
- }
264
- finally {
265
- saveTplSubmitting.value = false
266
- }
267
- }
268
- </script>
269
-
270
- <template>
271
- <div class="channel-list">
272
- <div class="list-head">
273
- <span class="title">Channels</span>
274
- <span class="head-actions">
275
- <button
276
- class="head-op im"
277
- type="button"
278
- title="Channel 模板中心"
279
- @click="navigateTo('/workshop/channel-templates')"
280
- >
281
- <span class="i-tabler-layout-grid-add im-pop" />
282
- </button>
283
- <button
284
- class="head-op im"
285
- type="button"
286
- title="新建 Channel"
287
- @click="mountModal = true"
288
- >
289
- <span class="i-tabler-plus im-pop" />
290
- </button>
291
- </span>
292
- </div>
293
-
294
- <!-- 频道列表主体:数据源(REST channels + WS entities)均为客户端态,
295
- SSR 首帧为空 → 硬刷新水合时结构与客户端首渲染不一致,节点会错配到
296
- 相邻 antd Select 的 DOM 上(行内 .row1 布局丢失、按钮错位)。
297
- ClientOnly 隔离:SSR 输出空壳,客户端一次性渲染,无水合配对。 -->
298
- <ClientOnly>
299
- <div
300
- v-if="mountedChannels.length === 0"
301
- class="empty"
302
- >
303
- {{ $t('channelSessionList.kkv789s014') }}
304
- </div>
305
-
306
- <div
307
- v-for="ch in mountedChannels"
308
- :key="ch.id"
309
- class="channel-item"
310
- :class="{ active: workspace?.activeChannelId === ch.id }"
311
- @click="select(ch.id)"
312
- >
313
- <div class="row1">
314
- <span
315
- class="dot"
316
- :class="{ live: ch.activeTasks > 0 }"
317
- />
318
- <span class="ch-name">{{ ch.name }}</span>
319
- <button
320
- class="op im"
321
- type="button"
322
- :title="$t('channelSessionList.kne35ug001')"
323
- :aria-label="$t('channelSessionList.kjmldih035', { p0: ch.name })"
324
- @click.stop="openSettings(ch.id)"
325
- >
326
- <span class="i-tabler-settings2 im-pop" />
327
- </button>
328
- <button
329
- class="op im"
330
- type="button"
331
- title="移出 workspace"
332
- :aria-label="$t('channelSessionList.k1yurooi036', { p0: ch.name })"
333
- @click.stop="unmount(ch.id)"
334
- >
335
- <span class="i-tabler-x im-pop" />
336
- </button>
337
- </div>
338
- <div class="row2">
339
- <!-- 快照未到达:计数不可信,显示同步占位(不呈现误导性的"0 成员") -->
340
- <span
341
- v-if="!ch.synced"
342
- class="meta syncing"
343
- >{{ $t('channelSessionList.k1bst7s9015') }}</span>
344
- <span
345
- v-else
346
- class="meta"
347
- >{{ ch.agents }} {{ $t('channelSessionList.k1ggoa45025') }} {{ ch.busy }} / {{ $t('channelSessionList.k3wcox034') }} {{ ch.activeTasks }}</span>
348
- </div>
349
- <button
350
- v-if="displayWorkspace(ch.workspace)"
351
- class="row2 ws im"
352
- type="button"
353
- :title="$t('channelSessionList.kfe4pzq037', { p0: ch.workspace })"
354
- @click.stop="copyWorkspace(ch.workspace)"
355
- >
356
- <span class="i-tabler-folder" /> {{ displayWorkspace(ch.workspace) }}
357
- </button>
358
- </div>
359
- </ClientOnly>
360
-
361
- <div class="mount-template">
362
- <a-select
363
- v-model:value="templateMountId"
364
- size="small"
365
- :placeholder="'从 Channel 模板挂载'"
366
- class="select"
367
- :loading="templateMounting"
368
- :options="channelTemplates.map(t => ({
369
- value: t.id,
370
- label: $t('channelSessionList.k1oes209038', { p0: t.isBuiltin ? '内置 · ' : t.visibility === 'public' ? '公开 · ' : '', p1: t.name, p2: (t.lead ? 1 : 0) + t.members.length }),
371
- }))"
372
- @change="mountFromTemplate"
373
- />
374
- <div class="tpl-hint">
375
- {{ $t('channelSessionList.k18ppu31016') }}
376
- </div>
377
- </div>
378
-
379
- <a-modal
380
- v-model:open="mountModal"
381
- :title="$t('channelSessionList.k1qjyl6l002')"
382
- :confirm-loading="mountSubmitting"
383
- ok-text="创建"
384
- cancel-text="取消"
385
- @ok="createAndMount"
386
- >
387
- <a-form layout="vertical">
388
- <a-form-item label="Channel 名称">
389
- <a-input v-model:value="mountForm.name" />
390
- </a-form-item>
391
- <a-form-item :label="$t('channelSessionList.k40gkk003')">
392
- <a-input v-model:value="mountForm.description" />
393
- </a-form-item>
394
- <a-form-item :label="$t('channelSessionList.k1wj4f38004')">
395
- <a-textarea
396
- v-model:value="mountForm.scenarioPrompt"
397
- :rows="4"
398
- :placeholder="$t('channelSessionList.k1098zie005')"
399
- />
400
- <template #extra>
401
- <span class="ws-hint">{{ $t('channelSessionList.k1u3zsr5017') }}</span>
402
- </template>
403
- </a-form-item>
404
- <a-form-item :label="$t('channelSessionList.kmgv4h5006')">
405
- <a-input-group compact>
406
- <a-input
407
- v-model:value="mountForm.workspace"
408
- style="width: 70%"
409
- placeholder="留空 = data/workspaces/<channelId>"
410
- allow-clear
411
- @press-enter="createAndMount"
412
- />
413
- <a-button
414
- style="width: 30%"
415
- @click="fileSelectorOpen = true"
416
- >
417
- {{ $t('channelSessionList.k3pz0ma018') }}
418
- </a-button>
419
- </a-input-group>
420
- <template #extra>
421
- <span class="ws-hint">{{ $t('channelSessionList.kucq30k019') }}</span>
422
- </template>
423
- </a-form-item>
424
- <a-form-item>
425
- <span class="ws-hint">{{ $t('channelSessionList.k1ful761020') }}</span>
426
- </a-form-item>
427
- </a-form>
428
- </a-modal>
429
-
430
- <!-- Channel 实例设置:场景/工作目录热更新 + 保存为模板 -->
431
- <a-modal
432
- v-model:open="settingsOpen"
433
- :title="$t('channelSessionList.k1pmemvt039', { p0: settingsForm.name })"
434
- :confirm-loading="settingsSaving"
435
- ok-text="保存"
436
- cancel-text="取消"
437
- @ok="saveSettings"
438
- >
439
- <a-form layout="vertical">
440
- <a-form-item :label="$t('channelSessionList.k1i8q46x007')">
441
- <a-textarea
442
- v-model:value="settingsForm.scenarioPrompt"
443
- :rows="4"
444
- :placeholder="$t('channelSessionList.ku3ugac008')"
445
- />
446
- </a-form-item>
447
- <a-form-item :label="$t('channelSessionList.k67dzev009')">
448
- <a-input-group compact>
449
- <a-input
450
- v-model:value="settingsForm.workspace"
451
- style="width: 70%"
452
- placeholder="data/workspaces/<channelId>"
453
- allow-clear
454
- />
455
- <a-button
456
- style="width: 30%"
457
- @click="fileSelectorOpen2 = true"
458
- >
459
- {{ $t('channelSessionList.k3pz0ma018') }}
460
- </a-button>
461
- </a-input-group>
462
- </a-form-item>
463
- <a-form-item label="默认模型(可选;留空用各 Harness 默认)">
464
- <a-space>
465
- <a-switch
466
- v-model:checked="llmForm.enabled"
467
- size="small"
468
- @change="(v: any) => { if (v) void loadLlmCatalog(llmForm.harness) }"
469
- />
470
- <a-select
471
- v-model:value="llmForm.harness"
472
- style="width: 130px"
473
- :options="[{ value: 'omp', label: 'omp' }, { value: 'codex', label: 'codex' }, { value: 'opencode', label: 'opencode' }, { value: 'dsh', label: 'dsh' }]"
474
- :disabled="!llmForm.enabled"
475
- @change="onLlmHarnessChange"
476
- />
477
- <a-select
478
- v-model:value="llmForm.provider"
479
- style="width: 170px"
480
- :placeholder="llmLoading ? '目录加载中…' : 'provider'"
481
- :options="llmProviderOptions"
482
- :disabled="!llmForm.enabled || llmLoading"
483
- show-search
484
- @change="onLlmProviderChange"
485
- />
486
- <a-select
487
- v-model:value="llmForm.model"
488
- style="width: 210px"
489
- placeholder="model"
490
- :options="llmModelOptions"
491
- :disabled="!llmForm.enabled || !llmForm.provider"
492
- show-search
493
- @change="onLlmModelChange"
494
- />
495
- <a-select
496
- v-if="llmEffortMode === 'levels'"
497
- v-model:value="llmForm.effort"
498
- style="width: 130px"
499
- placeholder="effort(可选)"
500
- :options="llmEffortOptions"
501
- :disabled="!llmForm.enabled || !llmForm.model"
502
- allow-clear
503
- />
504
- <a-input
505
- v-else-if="llmEffortMode === 'freetext'"
506
- v-model:value="llmForm.effort"
507
- style="width: 130px"
508
- placeholder="variant(可选)"
509
- :disabled="!llmForm.enabled || !llmForm.model"
510
- allow-clear
511
- />
512
- </a-space>
513
- </a-form-item>
514
- <a-form-item>
515
- <a-button
516
- size="small"
517
- @click="openSaveTemplate"
518
- >
519
- <span class="i-tabler-template" />
520
- {{ $t('channelSessionList.k6kpql010') }}
521
- </a-button>
522
- <span class="ws-hint">{{ $t('channelSessionList.k1x6kznr021') }}</span>
523
- </a-form-item>
524
- </a-form>
525
- </a-modal>
526
-
527
- <!-- 保存为模板 -->
528
- <a-modal
529
- v-model:open="saveTplOpen"
530
- :title="$t('channelSessionList.k6kpql010')"
531
- :confirm-loading="saveTplSubmitting"
532
- ok-text="保存模板"
533
- cancel-text="取消"
534
- @ok="saveAsTemplate"
535
- >
536
- <a-form layout="vertical">
537
- <a-form-item :label="$t('channelSessionList.k1f55q76011')">
538
- <a-input v-model:value="saveTplForm.name" />
539
- </a-form-item>
540
- <a-form-item :label="$t('channelSessionList.k40gkk003')">
541
- <a-input v-model:value="saveTplForm.description" />
542
- </a-form-item>
543
- <a-form-item :label="$t('channelSessionList.k3lrqn0012')">
544
- <a-radio-group v-model:value="saveTplForm.visibility">
545
- <a-radio value="private">
546
- {{ $t('channelSessionList.k1otvrfv022') }}
547
- </a-radio>
548
- <a-radio value="public">
549
- {{ $t('channelSessionList.k1cc399s023') }}
550
- </a-radio>
551
- </a-radio-group>
552
- </a-form-item>
553
- <a-form-item>
554
- <span class="ws-hint">{{ $t('channelSessionList.kl9btf7024') }}</span>
555
- </a-form-item>
556
- </a-form>
557
- </a-modal>
558
-
559
- <!-- FileSelector:服务器目录选择 -> 回填工作目录 -->
560
- <workshop-file-selector-modal
561
- v-model:open="fileSelectorOpen"
562
- :title="$t('channelSessionList.kbdp56k013')"
563
- :initial-path="mountForm.workspace || undefined"
564
- @select="(p) => { mountForm.workspace = p }"
565
- />
566
- <workshop-file-selector-modal
567
- v-model:open="fileSelectorOpen2"
568
- :title="$t('channelSessionList.kbdp56k013')"
569
- :initial-path="settingsForm.workspace || undefined"
570
- @select="(p) => { settingsForm.workspace = p }"
571
- />
572
- </div>
573
- </template>
574
-
575
- <style scoped>
576
- .channel-list {
577
- display: flex;
578
- flex-direction: column;
579
- min-height: 100%;
580
- padding: 12px 10px 8px;
581
- }
582
- .list-head {
583
- display: flex;
584
- align-items: center;
585
- justify-content: space-between;
586
- padding: 0 8px 8px;
587
- }
588
- .title {
589
- font-family: var(--font-display);
590
- font-size: 16px;
591
- letter-spacing: -0.01em;
592
- color: var(--ink);
593
- }
594
- .head-actions { display: inline-flex; gap: 2px; }
595
- .head-op {
596
- display: inline-flex;
597
- align-items: center;
598
- justify-content: center;
599
- width: 24px;
600
- height: 24px;
601
- font-size: 14px;
602
- color: var(--ink-faint);
603
- cursor: pointer;
604
- background: transparent;
605
- border: 0;
606
- border-radius: var(--radius-chip);
607
- transition: background var(--transition-fast), color var(--transition-fast);
608
- }
609
- .head-op:hover { color: var(--ink); background: var(--paper-deep); }
610
- .empty {
611
- padding: 14px 10px;
612
- font-size: 12px;
613
- color: var(--ink-faint);
614
- }
615
- .channel-item {
616
- padding: 7px 9px;
617
- margin: 1px 0;
618
- cursor: pointer;
619
- border-radius: var(--radius-panel-sm);
620
- transition: background var(--transition-fast);
621
- }
622
- .channel-item:hover { background: var(--paper-deep); }
623
- .channel-item.active { background: var(--paper-deep); box-shadow: inset 2px 0 0 var(--accent); }
624
- .row1 {
625
- display: flex;
626
- gap: 7px;
627
- align-items: center;
628
- font-size: 13px;
629
- color: var(--ink-soft);
630
- }
631
- .channel-item.active .row1 { color: var(--ink); font-weight: 500; }
632
- .dot {
633
- flex: 0 0 auto;
634
- width: 7px;
635
- height: 7px;
636
- background: var(--tone-neutral-dot);
637
- opacity: 0.55;
638
- border-radius: 50%;
639
- }
640
- .dot.live {
641
- background: var(--tone-success-dot);
642
- opacity: 1;
643
- }
644
- .ch-name {
645
- flex: 1 1 auto;
646
- overflow: hidden;
647
- text-overflow: ellipsis;
648
- white-space: nowrap;
649
- }
650
- .op {
651
- display: inline-flex;
652
- flex: 0 0 auto;
653
- align-items: center;
654
- justify-content: center;
655
- width: 20px;
656
- height: 20px;
657
- padding: 0;
658
- font-size: 13px;
659
- color: var(--ink-fainter);
660
- cursor: pointer;
661
- background: transparent;
662
- border: 0;
663
- border-radius: var(--radius-chip);
664
- /* 常显(低透明度):不再 hover-only——行级操作入口不应时隐时现 */
665
- opacity: 0.55;
666
- transition: opacity var(--transition-fast), color var(--transition-fast), background var(--transition-fast);
667
- }
668
- .channel-item:hover .op,
669
- .channel-item.active .op { opacity: 0.9; }
670
- .op:hover { opacity: 1; color: var(--ink); background: var(--paper-deep); }
671
- .op:focus-visible { outline: 2px solid var(--accent); outline-offset: 1px; }
672
- .row2 { padding-left: 14px; font-size: 11px; color: var(--ink-faint); }
673
- .meta.syncing { font-style: italic; opacity: 0.6; }
674
- .row2.ws {
675
- display: flex;
676
- gap: 4px;
677
- align-items: center;
678
- overflow: hidden;
679
- max-width: 100%;
680
- padding: 0 2px 0 14px;
681
- font-family: var(--font-mono);
682
- font-size: 11px;
683
- text-overflow: ellipsis;
684
- white-space: nowrap;
685
- color: var(--ink-fainter);
686
- text-align: left;
687
- cursor: copy; /* 点击复制完整路径(title 提示) */
688
- background: transparent;
689
- border: 0;
690
- border-radius: var(--radius-chip);
691
- transition: color var(--transition-fast), background var(--transition-fast);
692
- }
693
- .row2.ws:hover { color: var(--ink-soft); background: color-mix(in srgb, currentColor 6%, transparent); }
694
- .row2.ws:focus-visible { outline: 2px solid var(--accent); outline-offset: 1px; }
695
- .mount-template { padding: 12px 6px 6px; border-top: 1px solid var(--line); margin-top: 10px; }
696
- .select { width: 100%; }
697
- .tpl-hint {
698
- padding: 5px 2px 0;
699
- font-size: 10.5px;
700
- color: var(--ink-fainter);
701
- }
702
- .ws-hint { font-size: 11px; color: var(--ink-faint); }
703
- </style>
1
+ <script setup lang="ts">
2
+ /**
3
+ * 左栏 Channel 会话列表(Zcode session 栏):workspace 内挂载的 channel,
4
+ * 实时状态徽标(忙碌成员数/活跃任务数),点击聚焦;挂载/移出/设置操作。
5
+ * v10 模板化:
6
+ * - 「从模板挂载」:选择 Channel 模板 → 实例化 + 挂载一步完成(替代"挂载已有 Channel");
7
+ * - 「设置」:热修改当前 Channel 实例的场景描述与工作目录(成员运行时自动回收重装配);
8
+ * - 「保存为模板」:把当前 Channel 实例捕获为可复用模板(场景/目录/团队快照)。
9
+ */
10
+ import { message } from 'ant-design-vue'
11
+ import { useWorkspacesStore } from '@/app/stores/workshop/workspaces'
12
+ import { useEntitiesStore } from '@/app/stores/workshop/entities'
13
+ import { useWorkshopApi, type ChannelDto, type ChannelTemplateDto } from '@/app/composables/workshop/useWorkshopApi'
14
+
15
+ const { t } = useI18n()
16
+
17
+ const props = defineProps<{ wsId: string }>()
18
+ const wsStore = useWorkspacesStore()
19
+ const entities = useEntitiesStore()
20
+ const api = useWorkshopApi()
21
+
22
+ const workspace = computed(() => wsStore.workspaces.find(w => w.id === props.wsId))
23
+
24
+ const channels = ref<ChannelDto[]>([])
25
+ const channelTemplates = ref<ChannelTemplateDto[]>([])
26
+ const refreshChannels = async (): Promise<void> => {
27
+ // SSR 守卫:axios 相对 baseURL 仅客户端有效(服务端拉取会 Invalid URL)
28
+ if (typeof window === 'undefined') return
29
+ const [ch, tpl] = await Promise.all([
30
+ api.listChannels(),
31
+ api.listChannelTemplates().catch(() => null),
32
+ ])
33
+ channels.value = (ch as unknown as { data?: ChannelDto[] })?.data ?? []
34
+ channelTemplates.value = (tpl as unknown as { data?: ChannelTemplateDto[] } | null)?.data ?? []
35
+ }
36
+ void refreshChannels()
37
+
38
+ const mountedChannels = computed(() =>
39
+ (workspace.value?.channelIds ?? [])
40
+ .map(id => ({ id, meta: channels.value.find(c => c.id === id), entity: entities.channels[id] }))
41
+ .map(({ id, meta, entity }) => ({
42
+ id,
43
+ name: entity?.name ?? meta?.name ?? id.slice(0, 8),
44
+ /** 实体基线(WS 快照)是否已到达:未到时计数不可信,展示"同步中"而非误导性的 0 */
45
+ synced: entity !== undefined,
46
+ busy: entities.busyCount(id),
47
+ agents: entities.agents[id]?.length ?? 0,
48
+ activeTasks: (entities.tasks[id] ?? []).filter(t => !['COMPLETED', 'CANCELED', 'FAILED'].includes(t.state)).length,
49
+ workspace: meta?.workspace ?? '',
50
+ })),
51
+ )
52
+
53
+ const select = (channelId: string): void => {
54
+ wsStore.setActiveChannel(props.wsId, channelId)
55
+ }
56
+
57
+ /** 点击工作目录行:复制完整路径到剪贴板(有真实作用;title 提示全路径) */
58
+ const copyWorkspace = async (path: string): Promise<void> => {
59
+ try {
60
+ await navigator.clipboard.writeText(path)
61
+ message.success(t('channelSessionList.kud74vg040', { p0: path }))
62
+ }
63
+ catch {
64
+ message.error(t('channelSessionList.krij3gg026'))
65
+ }
66
+ }
67
+ /** 路径显示 basename(E:\codes\AgentWorkShop → AgentWorkShop),全路径在 title/复制 */
68
+ const baseName = (path: string): string => path.replace(/[\\/]+$/, '').split(/[\\/]/).pop() ?? path
69
+ /** 默认目录(data/workspaces/<uuid>)的 basename 是 36 位裸 UUID,对用户零信息量 → 不展示该行 */
70
+ const UUID_RE = /^[\da-f]{8}-[\da-f]{4}-[\da-f]{4}-[\da-f]{4}-[\da-f]{12}$/i
71
+ const displayWorkspace = (path: string): string => {
72
+ const base = baseName(path)
73
+ return UUID_RE.test(base) ? '' : base
74
+ }
75
+
76
+ // ===== 新建 Channel 并挂载(空团队) =====
77
+ const mountModal = ref(false)
78
+ const mountForm = reactive({ name: '', description: '', workspace: '', scenarioPrompt: '' })
79
+ const mountSubmitting = ref(false)
80
+ /** FileSelector 弹窗(选择服务器目录作为 workspace) */
81
+ const fileSelectorOpen = ref(false)
82
+ const createAndMount = async (): Promise<void> => {
83
+ if (!mountForm.name.trim()) {
84
+ message.warning('Channel 名称必填')
85
+ return
86
+ }
87
+ mountSubmitting.value = true
88
+ try {
89
+ const res = await api.createChannel({
90
+ name: mountForm.name.trim(),
91
+ description: mountForm.description || undefined,
92
+ scenarioPrompt: mountForm.scenarioPrompt.trim() || undefined,
93
+ workspace: mountForm.workspace.trim() || undefined,
94
+ })
95
+ const created = (res as unknown as { data?: { channelId?: string } })?.data
96
+ const channelId = created?.channelId
97
+ if (!channelId) throw new Error(t('channelSessionList.k1bg6shc027'))
98
+ await wsStore.mountChannel(props.wsId, channelId)
99
+ mountModal.value = false
100
+ mountForm.name = ''
101
+ mountForm.description = ''
102
+ mountForm.workspace = ''
103
+ mountForm.scenarioPrompt = ''
104
+ void refreshChannels()
105
+ message.success(t('channelSessionList.kn89jvs028'))
106
+ }
107
+ catch (e) {
108
+ message.error(t('channelSessionList.k1x2th9e041', { p0: apiErrorMessage(e) }))
109
+ }
110
+ finally {
111
+ mountSubmitting.value = false
112
+ }
113
+ }
114
+
115
+ // ===== 从 Channel 模板挂载(实例化 + mount 一步) =====
116
+ const templateMountId = ref<string | undefined>()
117
+ const templateMounting = ref(false)
118
+ const mountFromTemplate = async (): Promise<void> => {
119
+ if (!templateMountId.value) return
120
+ templateMounting.value = true
121
+ try {
122
+ const res = await api.mountChannelTemplate(props.wsId, templateMountId.value)
123
+ const data = (res as unknown as { data?: { agentCount?: number } })?.data
124
+ message.success(t('channelSessionList.kai50qc042', { p0: data?.agentCount ?? 0 }))
125
+ templateMountId.value = undefined
126
+ void refreshChannels()
127
+ }
128
+ catch (e) {
129
+ const err = e as { data?: { message?: string }, message?: string }
130
+ message.error(apiErrorMessage(err, t('channelSessionList.k97xi7u029')))
131
+ }
132
+ finally {
133
+ templateMounting.value = false
134
+ }
135
+ }
136
+
137
+ const unmount = (channelId: string): void => {
138
+ wsStore.unmountChannel(props.wsId, channelId)
139
+ .catch((e: { data?: { message?: string }, message?: string }) => { message.error(apiErrorMessage(e, t('channelSessionList.k1hgfvdc030'))) })
140
+ }
141
+
142
+ // ===== Channel 实例设置(场景/工作目录热更新)+ 保存为模板 =====
143
+ const settingsOpen = ref(false)
144
+ const settingsChannelId = ref<string>('')
145
+ const settingsForm = reactive({ name: '', scenarioPrompt: '', workspace: '' })
146
+
147
+ // ===== Channel 级默认 LLM(harness → provider/model/effort;空 = 用引擎默认) =====
148
+ interface CatalogProvider {
149
+ id: string
150
+ models: Array<{ id: string, efforts: string[], defaultEffort?: string }>
151
+ }
152
+ const llmForm = reactive({ harness: 'omp', provider: '', model: '', effort: '', enabled: false })
153
+ const llmProviders = ref<CatalogProvider[]>([])
154
+ const llmEffortMode = ref<'levels' | 'freetext' | 'unsupported'>('levels')
155
+ const llmLoading = ref(false)
156
+ const llmProviderOptions = computed(() => llmProviders.value.map(p => ({ value: p.id, label: p.id })))
157
+ const llmModelOptions = computed(() =>
158
+ (llmProviders.value.find(p => p.id === llmForm.provider)?.models ?? []).map(m => ({ value: m.id, label: m.id })),
159
+ )
160
+ const llmEffortOptions = computed(() => {
161
+ const m = llmProviders.value.find(p => p.id === llmForm.provider)?.models.find(x => x.id === llmForm.model)
162
+ return (m?.efforts ?? []).map(e => ({ value: e, label: e + (m?.defaultEffort === e ? '(默认)' : '') }))
163
+ })
164
+ const loadLlmCatalog = async (harness: string): Promise<void> => {
165
+ llmLoading.value = true
166
+ llmProviders.value = []
167
+ try {
168
+ const res = await api.listHarnessProviders(harness)
169
+ const cat = (res as unknown as { data?: { catalog?: { providers?: CatalogProvider[], effortMode?: 'levels' | 'freetext' | 'unsupported' } } })?.data?.catalog
170
+ llmProviders.value = cat?.providers ?? []
171
+ llmEffortMode.value = cat?.effortMode ?? 'unsupported'
172
+ }
173
+ catch { /* 目录拉取失败保留空表 */ }
174
+ finally { llmLoading.value = false }
175
+ }
176
+ const onLlmHarnessChange = async (): Promise<void> => {
177
+ llmForm.provider = ''
178
+ llmForm.model = ''
179
+ llmForm.effort = ''
180
+ await loadLlmCatalog(llmForm.harness)
181
+ }
182
+ const onLlmProviderChange = (): void => {
183
+ llmForm.model = ''
184
+ llmForm.effort = ''
185
+ }
186
+ const onLlmModelChange = (): void => {
187
+ llmForm.effort = ''
188
+ }
189
+ const settingsSaving = ref(false)
190
+ const fileSelectorOpen2 = ref(false)
191
+ const openSettings = (channelId: string): void => {
192
+ const meta = channels.value.find(c => c.id === channelId)
193
+ settingsChannelId.value = channelId
194
+ settingsForm.name = meta?.name ?? ''
195
+ settingsForm.scenarioPrompt = meta?.scenarioPrompt ?? ''
196
+ settingsForm.workspace = meta?.workspace ?? ''
197
+ // 预填 channel 默认 LLM(llmJson 由列表接口透传)
198
+ let saved: { provider?: string, model?: string, effort?: string } | null = null
199
+ try {
200
+ const metaAny = meta as unknown as { llmJson?: string } | undefined
201
+ saved = metaAny?.llmJson ? JSON.parse(metaAny.llmJson) as typeof saved : null
202
+ }
203
+ catch { saved = null }
204
+ llmForm.enabled = !!saved?.model
205
+ llmForm.harness = 'omp'
206
+ llmForm.provider = saved?.provider ?? ''
207
+ llmForm.model = saved?.model ?? ''
208
+ llmForm.effort = saved?.effort ?? ''
209
+ settingsOpen.value = true
210
+ if (llmForm.enabled) void loadLlmCatalog(llmForm.harness)
211
+ void loadChannelPlugins(channelId)
212
+ }
213
+
214
+ // ===== Channel 级插件开关(设置弹窗内嵌;切换即 PUT,该 channel 在跑 Agent 工具清单热刷新) =====
215
+ interface ChannelPluginRow { name: string, description?: string, builtin?: boolean, enabled: boolean }
216
+ const pluginRows = ref<ChannelPluginRow[]>([])
217
+ const pluginSource = ref<'explicit' | 'default'>('default')
218
+ const pluginSaving = ref<string | null>(null)
219
+ const loadChannelPlugins = async (channelId: string): Promise<void> => {
220
+ try {
221
+ const res = await api.listChannelPlugins(channelId)
222
+ const data = res?.data ?? {}
223
+ pluginRows.value = data.plugins ?? []
224
+ pluginSource.value = data.source === 'explicit' ? 'explicit' : 'default'
225
+ }
226
+ catch { /* 插件视图不可得(未登录/网络)时留空,不阻塞设置弹窗 */ }
227
+ }
228
+ const toggleChannelPlugin = async (row: ChannelPluginRow, next: boolean): Promise<void> => {
229
+ if (pluginSaving.value) return
230
+ pluginSaving.value = row.name
231
+ try {
232
+ // 全量提交当前开关视图(仅翻转目标行),与 teams 页插件开关同语义
233
+ const payload = pluginRows.value.map(r => ({ name: r.name, enabled: r.name === row.name ? next : r.enabled }))
234
+ const res = await api.putChannelPlugins(settingsChannelId.value, { plugins: payload })
235
+ const data = res?.data ?? {}
236
+ pluginRows.value = data.plugins ?? payload.map(p => ({ ...p }))
237
+ pluginSource.value = data.source === 'explicit' ? 'explicit' : 'default'
238
+ message.success(t('channelSessionList.k1plugon044'))
239
+ }
240
+ catch (e) {
241
+ message.error(apiErrorMessage(e))
242
+ }
243
+ finally {
244
+ pluginSaving.value = null
245
+ }
246
+ }
247
+ const saveSettings = async (): Promise<void> => {
248
+ settingsSaving.value = true
249
+ try {
250
+ await api.patchChannel(settingsChannelId.value, {
251
+ scenarioPrompt: settingsForm.scenarioPrompt,
252
+ workspace: settingsForm.workspace.trim() || undefined,
253
+ llm: llmForm.enabled && llmForm.model
254
+ ? { ...(llmForm.provider ? { provider: llmForm.provider } : {}), model: llmForm.model, ...(llmForm.effort ? { effort: llmForm.effort } : {}) }
255
+ : null,
256
+ })
257
+ message.success(t('channelSessionList.kvsxlu6031'))
258
+ settingsOpen.value = false
259
+ void refreshChannels()
260
+ }
261
+ catch (e) {
262
+ message.error(apiErrorMessage(e))
263
+ }
264
+ finally {
265
+ settingsSaving.value = false
266
+ }
267
+ }
268
+
269
+ // 保存为模板(捕获当前 channel 的场景/目录/团队)
270
+ const saveTplOpen = ref(false)
271
+ const saveTplForm = reactive({ name: '', description: '', visibility: 'private' as 'private' | 'public' })
272
+ const saveTplSubmitting = ref(false)
273
+ const openSaveTemplate = (): void => {
274
+ saveTplForm.name = t('channelSessionList.k2hfym5043', { p0: settingsForm.name || 'channel' })
275
+ saveTplForm.description = ''
276
+ saveTplForm.visibility = 'private'
277
+ saveTplOpen.value = true
278
+ }
279
+ const saveAsTemplate = async (): Promise<void> => {
280
+ if (!saveTplForm.name.trim()) {
281
+ message.warning(t('channelSessionList.k1i0ji0y032'))
282
+ return
283
+ }
284
+ saveTplSubmitting.value = true
285
+ try {
286
+ await api.captureChannelTemplate({
287
+ channelId: settingsChannelId.value,
288
+ name: saveTplForm.name.trim(),
289
+ description: saveTplForm.description || undefined,
290
+ visibility: saveTplForm.visibility,
291
+ })
292
+ message.success(t('channelSessionList.kjpguxw033'))
293
+ saveTplOpen.value = false
294
+ void refreshChannels()
295
+ }
296
+ catch (e) {
297
+ message.error(apiErrorMessage(e))
298
+ }
299
+ finally {
300
+ saveTplSubmitting.value = false
301
+ }
302
+ }
303
+ </script>
304
+
305
+ <template>
306
+ <div class="channel-list">
307
+ <div class="list-head">
308
+ <span class="title">Channels</span>
309
+ <span class="head-actions">
310
+ <button
311
+ class="head-op im"
312
+ type="button"
313
+ title="Channel 模板中心"
314
+ @click="navigateTo('/workshop/channel-templates')"
315
+ >
316
+ <span class="i-tabler-layout-grid-add im-pop" />
317
+ </button>
318
+ <button
319
+ class="head-op im"
320
+ type="button"
321
+ title="新建 Channel"
322
+ @click="mountModal = true"
323
+ >
324
+ <span class="i-tabler-plus im-pop" />
325
+ </button>
326
+ </span>
327
+ </div>
328
+
329
+ <!-- 频道列表主体:数据源(REST channels + WS entities)均为客户端态,
330
+ SSR 首帧为空 → 硬刷新水合时结构与客户端首渲染不一致,节点会错配到
331
+ 相邻 antd Select 的 DOM 上(行内 .row1 布局丢失、按钮错位)。
332
+ ClientOnly 隔离:SSR 输出空壳,客户端一次性渲染,无水合配对。 -->
333
+ <ClientOnly>
334
+ <div
335
+ v-if="mountedChannels.length === 0"
336
+ class="empty"
337
+ >
338
+ {{ $t('channelSessionList.kkv789s014') }}
339
+ </div>
340
+
341
+ <div
342
+ v-for="ch in mountedChannels"
343
+ :key="ch.id"
344
+ class="channel-item"
345
+ :class="{ active: workspace?.activeChannelId === ch.id }"
346
+ @click="select(ch.id)"
347
+ >
348
+ <div class="row1">
349
+ <span
350
+ class="dot"
351
+ :class="{ live: ch.activeTasks > 0 }"
352
+ />
353
+ <span class="ch-name">{{ ch.name }}</span>
354
+ <button
355
+ class="op im"
356
+ type="button"
357
+ :title="$t('channelSessionList.kne35ug001')"
358
+ :aria-label="$t('channelSessionList.kjmldih035', { p0: ch.name })"
359
+ @click.stop="openSettings(ch.id)"
360
+ >
361
+ <span class="i-tabler-settings2 im-pop" />
362
+ </button>
363
+ <button
364
+ class="op im"
365
+ type="button"
366
+ title="移出 workspace"
367
+ :aria-label="$t('channelSessionList.k1yurooi036', { p0: ch.name })"
368
+ @click.stop="unmount(ch.id)"
369
+ >
370
+ <span class="i-tabler-x im-pop" />
371
+ </button>
372
+ </div>
373
+ <div class="row2">
374
+ <!-- 快照未到达:计数不可信,显示同步占位(不呈现误导性的"0 成员") -->
375
+ <span
376
+ v-if="!ch.synced"
377
+ class="meta syncing"
378
+ >{{ $t('channelSessionList.k1bst7s9015') }}</span>
379
+ <span
380
+ v-else
381
+ class="meta"
382
+ >{{ ch.agents }} {{ $t('channelSessionList.k1ggoa45025') }} {{ ch.busy }} / {{ $t('channelSessionList.k3wcox034') }} {{ ch.activeTasks }}</span>
383
+ </div>
384
+ <button
385
+ v-if="displayWorkspace(ch.workspace)"
386
+ class="row2 ws im"
387
+ type="button"
388
+ :title="$t('channelSessionList.kfe4pzq037', { p0: ch.workspace })"
389
+ @click.stop="copyWorkspace(ch.workspace)"
390
+ >
391
+ <span class="i-tabler-folder" /> {{ displayWorkspace(ch.workspace) }}
392
+ </button>
393
+ </div>
394
+ </ClientOnly>
395
+
396
+ <div class="mount-template">
397
+ <a-select
398
+ v-model:value="templateMountId"
399
+ size="small"
400
+ :placeholder="'从 Channel 模板挂载'"
401
+ class="select"
402
+ :loading="templateMounting"
403
+ :options="channelTemplates.map(t => ({
404
+ value: t.id,
405
+ label: $t('channelSessionList.k1oes209038', { p0: t.isBuiltin ? '内置 · ' : t.visibility === 'public' ? '公开 · ' : '', p1: t.name, p2: (t.lead ? 1 : 0) + t.members.length }),
406
+ }))"
407
+ @change="mountFromTemplate"
408
+ />
409
+ <div class="tpl-hint">
410
+ {{ $t('channelSessionList.k18ppu31016') }}
411
+ </div>
412
+ </div>
413
+
414
+ <a-modal
415
+ v-model:open="mountModal"
416
+ :title="$t('channelSessionList.k1qjyl6l002')"
417
+ :confirm-loading="mountSubmitting"
418
+ ok-text="创建"
419
+ cancel-text="取消"
420
+ @ok="createAndMount"
421
+ >
422
+ <a-form layout="vertical">
423
+ <a-form-item label="Channel 名称">
424
+ <a-input v-model:value="mountForm.name" />
425
+ </a-form-item>
426
+ <a-form-item :label="$t('channelSessionList.k40gkk003')">
427
+ <a-input v-model:value="mountForm.description" />
428
+ </a-form-item>
429
+ <a-form-item :label="$t('channelSessionList.k1wj4f38004')">
430
+ <a-textarea
431
+ v-model:value="mountForm.scenarioPrompt"
432
+ :rows="4"
433
+ :placeholder="$t('channelSessionList.k1098zie005')"
434
+ />
435
+ <template #extra>
436
+ <span class="ws-hint">{{ $t('channelSessionList.k1u3zsr5017') }}</span>
437
+ </template>
438
+ </a-form-item>
439
+ <a-form-item :label="$t('channelSessionList.kmgv4h5006')">
440
+ <a-input-group compact>
441
+ <a-input
442
+ v-model:value="mountForm.workspace"
443
+ style="width: 70%"
444
+ placeholder="留空 = data/workspaces/<channelId>"
445
+ allow-clear
446
+ @press-enter="createAndMount"
447
+ />
448
+ <a-button
449
+ style="width: 30%"
450
+ @click="fileSelectorOpen = true"
451
+ >
452
+ {{ $t('channelSessionList.k3pz0ma018') }}
453
+ </a-button>
454
+ </a-input-group>
455
+ <template #extra>
456
+ <span class="ws-hint">{{ $t('channelSessionList.kucq30k019') }}</span>
457
+ </template>
458
+ </a-form-item>
459
+ <a-form-item>
460
+ <span class="ws-hint">{{ $t('channelSessionList.k1ful761020') }}</span>
461
+ </a-form-item>
462
+ </a-form>
463
+ </a-modal>
464
+
465
+ <!-- Channel 实例设置:场景/工作目录热更新 + 保存为模板 -->
466
+ <a-modal
467
+ v-model:open="settingsOpen"
468
+ :title="$t('channelSessionList.k1pmemvt039', { p0: settingsForm.name })"
469
+ :confirm-loading="settingsSaving"
470
+ ok-text="保存"
471
+ cancel-text="取消"
472
+ @ok="saveSettings"
473
+ >
474
+ <a-form layout="vertical">
475
+ <a-form-item :label="$t('channelSessionList.k1i8q46x007')">
476
+ <a-textarea
477
+ v-model:value="settingsForm.scenarioPrompt"
478
+ :rows="4"
479
+ :placeholder="$t('channelSessionList.ku3ugac008')"
480
+ />
481
+ </a-form-item>
482
+ <a-form-item :label="$t('channelSessionList.k67dzev009')">
483
+ <a-input-group compact>
484
+ <a-input
485
+ v-model:value="settingsForm.workspace"
486
+ style="width: 70%"
487
+ placeholder="data/workspaces/<channelId>"
488
+ allow-clear
489
+ />
490
+ <a-button
491
+ style="width: 30%"
492
+ @click="fileSelectorOpen2 = true"
493
+ >
494
+ {{ $t('channelSessionList.k3pz0ma018') }}
495
+ </a-button>
496
+ </a-input-group>
497
+ </a-form-item>
498
+ <a-form-item label="默认模型(可选;留空用各 Harness 默认)">
499
+ <a-space>
500
+ <a-switch
501
+ v-model:checked="llmForm.enabled"
502
+ size="small"
503
+ @change="(v: any) => { if (v) void loadLlmCatalog(llmForm.harness) }"
504
+ />
505
+ <a-select
506
+ v-model:value="llmForm.harness"
507
+ style="width: 130px"
508
+ :options="[{ value: 'omp', label: 'omp' }, { value: 'codex', label: 'codex' }, { value: 'opencode', label: 'opencode' }, { value: 'dsh', label: 'dsh' }]"
509
+ :disabled="!llmForm.enabled"
510
+ @change="onLlmHarnessChange"
511
+ />
512
+ <a-select
513
+ v-model:value="llmForm.provider"
514
+ style="width: 170px"
515
+ :placeholder="llmLoading ? '目录加载中…' : 'provider'"
516
+ :options="llmProviderOptions"
517
+ :disabled="!llmForm.enabled || llmLoading"
518
+ show-search
519
+ @change="onLlmProviderChange"
520
+ />
521
+ <a-select
522
+ v-model:value="llmForm.model"
523
+ style="width: 210px"
524
+ placeholder="model"
525
+ :options="llmModelOptions"
526
+ :disabled="!llmForm.enabled || !llmForm.provider"
527
+ show-search
528
+ @change="onLlmModelChange"
529
+ />
530
+ <a-select
531
+ v-if="llmEffortMode === 'levels'"
532
+ v-model:value="llmForm.effort"
533
+ style="width: 130px"
534
+ placeholder="effort(可选)"
535
+ :options="llmEffortOptions"
536
+ :disabled="!llmForm.enabled || !llmForm.model"
537
+ allow-clear
538
+ />
539
+ <a-input
540
+ v-else-if="llmEffortMode === 'freetext'"
541
+ v-model:value="llmForm.effort"
542
+ style="width: 130px"
543
+ placeholder="variant(可选)"
544
+ :disabled="!llmForm.enabled || !llmForm.model"
545
+ allow-clear
546
+ />
547
+ </a-space>
548
+ </a-form-item>
549
+ <a-form-item :label="t('channelSessionList.k1pluglbl045')">
550
+ <div
551
+ v-if="pluginRows.length"
552
+ class="ch-plugin-list"
553
+ >
554
+ <div
555
+ v-for="p in pluginRows"
556
+ :key="p.name"
557
+ class="ch-plugin-row"
558
+ >
559
+ <div class="ch-plugin-main">
560
+ <span class="aw-mono">{{ p.name }}</span>
561
+ <span
562
+ v-if="p.builtin"
563
+ class="ws-hint"
564
+ >内置</span>
565
+ <span
566
+ v-if="p.description"
567
+ class="ws-hint ch-plugin-desc"
568
+ >{{ p.description }}</span>
569
+ </div>
570
+ <a-switch
571
+ :checked="p.enabled"
572
+ size="small"
573
+ :loading="pluginSaving === p.name"
574
+ @change="(v: any) => toggleChannelPlugin(p, !!v)"
575
+ />
576
+ </div>
577
+ <span
578
+ v-if="pluginSource !== 'explicit'"
579
+ class="ws-hint"
580
+ >{{ t('channelSessionList.k1plugsrc046') }}</span>
581
+ </div>
582
+ <span
583
+ v-else
584
+ class="ws-hint"
585
+ >—</span>
586
+ </a-form-item>
587
+ <a-form-item>
588
+ <a-button
589
+ size="small"
590
+ @click="openSaveTemplate"
591
+ >
592
+ <span class="i-tabler-template" />
593
+ {{ $t('channelSessionList.k6kpql010') }}
594
+ </a-button>
595
+ <span class="ws-hint">{{ $t('channelSessionList.k1x6kznr021') }}</span>
596
+ </a-form-item>
597
+ </a-form>
598
+ </a-modal>
599
+
600
+ <!-- 保存为模板 -->
601
+ <a-modal
602
+ v-model:open="saveTplOpen"
603
+ :title="$t('channelSessionList.k6kpql010')"
604
+ :confirm-loading="saveTplSubmitting"
605
+ ok-text="保存模板"
606
+ cancel-text="取消"
607
+ @ok="saveAsTemplate"
608
+ >
609
+ <a-form layout="vertical">
610
+ <a-form-item :label="$t('channelSessionList.k1f55q76011')">
611
+ <a-input v-model:value="saveTplForm.name" />
612
+ </a-form-item>
613
+ <a-form-item :label="$t('channelSessionList.k40gkk003')">
614
+ <a-input v-model:value="saveTplForm.description" />
615
+ </a-form-item>
616
+ <a-form-item :label="$t('channelSessionList.k3lrqn0012')">
617
+ <a-radio-group v-model:value="saveTplForm.visibility">
618
+ <a-radio value="private">
619
+ {{ $t('channelSessionList.k1otvrfv022') }}
620
+ </a-radio>
621
+ <a-radio value="public">
622
+ {{ $t('channelSessionList.k1cc399s023') }}
623
+ </a-radio>
624
+ </a-radio-group>
625
+ </a-form-item>
626
+ <a-form-item>
627
+ <span class="ws-hint">{{ $t('channelSessionList.kl9btf7024') }}</span>
628
+ </a-form-item>
629
+ </a-form>
630
+ </a-modal>
631
+
632
+ <!-- FileSelector:服务器目录选择 -> 回填工作目录 -->
633
+ <workshop-file-selector-modal
634
+ v-model:open="fileSelectorOpen"
635
+ :title="$t('channelSessionList.kbdp56k013')"
636
+ :initial-path="mountForm.workspace || undefined"
637
+ @select="(p) => { mountForm.workspace = p }"
638
+ />
639
+ <workshop-file-selector-modal
640
+ v-model:open="fileSelectorOpen2"
641
+ :title="$t('channelSessionList.kbdp56k013')"
642
+ :initial-path="settingsForm.workspace || undefined"
643
+ @select="(p) => { settingsForm.workspace = p }"
644
+ />
645
+ </div>
646
+ </template>
647
+
648
+ <style scoped>
649
+ .ch-plugin-list {
650
+ display: flex;
651
+ flex-direction: column;
652
+ gap: 6px;
653
+ width: 100%;
654
+ }
655
+ .ch-plugin-row {
656
+ display: flex;
657
+ align-items: center;
658
+ justify-content: space-between;
659
+ gap: 12px;
660
+ padding: 4px 8px;
661
+ border: 1px solid var(--border, rgba(128, 128, 128, 0.25));
662
+ border-radius: 6px;
663
+ }
664
+ .ch-plugin-main {
665
+ display: flex;
666
+ align-items: baseline;
667
+ gap: 8px;
668
+ min-width: 0;
669
+ }
670
+ .ch-plugin-desc {
671
+ overflow: hidden;
672
+ text-overflow: ellipsis;
673
+ white-space: nowrap;
674
+ }
675
+ .channel-list {
676
+ display: flex;
677
+ flex-direction: column;
678
+ min-height: 100%;
679
+ padding: 12px 10px 8px;
680
+ }
681
+ .list-head {
682
+ display: flex;
683
+ align-items: center;
684
+ justify-content: space-between;
685
+ padding: 0 8px 8px;
686
+ }
687
+ .title {
688
+ font-family: var(--font-display);
689
+ font-size: 16px;
690
+ letter-spacing: -0.01em;
691
+ color: var(--ink);
692
+ }
693
+ .head-actions { display: inline-flex; gap: 2px; }
694
+ .head-op {
695
+ display: inline-flex;
696
+ align-items: center;
697
+ justify-content: center;
698
+ width: 24px;
699
+ height: 24px;
700
+ font-size: 14px;
701
+ color: var(--ink-faint);
702
+ cursor: pointer;
703
+ background: transparent;
704
+ border: 0;
705
+ border-radius: var(--radius-chip);
706
+ transition: background var(--transition-fast), color var(--transition-fast);
707
+ }
708
+ .head-op:hover { color: var(--ink); background: var(--paper-deep); }
709
+ .empty {
710
+ padding: 14px 10px;
711
+ font-size: 12px;
712
+ color: var(--ink-faint);
713
+ }
714
+ .channel-item {
715
+ padding: 7px 9px;
716
+ margin: 1px 0;
717
+ cursor: pointer;
718
+ border-radius: var(--radius-panel-sm);
719
+ transition: background var(--transition-fast);
720
+ }
721
+ .channel-item:hover { background: var(--paper-deep); }
722
+ .channel-item.active { background: var(--paper-deep); box-shadow: inset 2px 0 0 var(--accent); }
723
+ .row1 {
724
+ display: flex;
725
+ gap: 7px;
726
+ align-items: center;
727
+ font-size: 13px;
728
+ color: var(--ink-soft);
729
+ }
730
+ .channel-item.active .row1 { color: var(--ink); font-weight: 500; }
731
+ .dot {
732
+ flex: 0 0 auto;
733
+ width: 7px;
734
+ height: 7px;
735
+ background: var(--tone-neutral-dot);
736
+ opacity: 0.55;
737
+ border-radius: 50%;
738
+ }
739
+ .dot.live {
740
+ background: var(--tone-success-dot);
741
+ opacity: 1;
742
+ }
743
+ .ch-name {
744
+ flex: 1 1 auto;
745
+ overflow: hidden;
746
+ text-overflow: ellipsis;
747
+ white-space: nowrap;
748
+ }
749
+ .op {
750
+ display: inline-flex;
751
+ flex: 0 0 auto;
752
+ align-items: center;
753
+ justify-content: center;
754
+ width: 20px;
755
+ height: 20px;
756
+ padding: 0;
757
+ font-size: 13px;
758
+ color: var(--ink-fainter);
759
+ cursor: pointer;
760
+ background: transparent;
761
+ border: 0;
762
+ border-radius: var(--radius-chip);
763
+ /* 常显(低透明度):不再 hover-only——行级操作入口不应时隐时现 */
764
+ opacity: 0.55;
765
+ transition: opacity var(--transition-fast), color var(--transition-fast), background var(--transition-fast);
766
+ }
767
+ .channel-item:hover .op,
768
+ .channel-item.active .op { opacity: 0.9; }
769
+ .op:hover { opacity: 1; color: var(--ink); background: var(--paper-deep); }
770
+ .op:focus-visible { outline: 2px solid var(--accent); outline-offset: 1px; }
771
+ .row2 { padding-left: 14px; font-size: 11px; color: var(--ink-faint); }
772
+ .meta.syncing { font-style: italic; opacity: 0.6; }
773
+ .row2.ws {
774
+ display: flex;
775
+ gap: 4px;
776
+ align-items: center;
777
+ overflow: hidden;
778
+ max-width: 100%;
779
+ padding: 0 2px 0 14px;
780
+ font-family: var(--font-mono);
781
+ font-size: 11px;
782
+ text-overflow: ellipsis;
783
+ white-space: nowrap;
784
+ color: var(--ink-fainter);
785
+ text-align: left;
786
+ cursor: copy; /* 点击复制完整路径(title 提示) */
787
+ background: transparent;
788
+ border: 0;
789
+ border-radius: var(--radius-chip);
790
+ transition: color var(--transition-fast), background var(--transition-fast);
791
+ }
792
+ .row2.ws:hover { color: var(--ink-soft); background: color-mix(in srgb, currentColor 6%, transparent); }
793
+ .row2.ws:focus-visible { outline: 2px solid var(--accent); outline-offset: 1px; }
794
+ .mount-template { padding: 12px 6px 6px; border-top: 1px solid var(--line); margin-top: 10px; }
795
+ .select { width: 100%; }
796
+ .tpl-hint {
797
+ padding: 5px 2px 0;
798
+ font-size: 10.5px;
799
+ color: var(--ink-fainter);
800
+ }
801
+ .ws-hint { font-size: 11px; color: var(--ink-faint); }
802
+ </style>