agentworkshop 0.7.8 → 0.7.11

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 (627) hide show
  1. package/.output/nitro.json +1 -1
  2. package/.output/public/_nuxt/-6OnbLFb.js +1 -0
  3. package/.output/public/_nuxt/{BUxYN2mw.js → -nb2uqVg.js} +1 -1
  4. package/.output/public/_nuxt/6vYobj4F.js +1 -0
  5. package/.output/public/_nuxt/{BSXx2vqR.js → B-xskWta.js} +1 -1
  6. package/.output/public/_nuxt/B3Psw_sL.js +1 -0
  7. package/.output/public/_nuxt/B53Mp7lD.js +1 -0
  8. package/.output/public/_nuxt/B5CYgFAD.js +14 -0
  9. package/.output/public/_nuxt/{uBbDCfTz.js → B5S_UyaC.js} +1 -1
  10. package/.output/public/_nuxt/{DZk24ego.js → B7wL3pDk.js} +1 -1
  11. package/.output/public/_nuxt/B8WV7GzS.js +1 -0
  12. package/.output/public/_nuxt/{BYL0Rjqj.js → BBwMH_hG.js} +3 -3
  13. package/.output/public/_nuxt/BLzCac9K2.js +1 -0
  14. package/.output/public/_nuxt/BNXfwXpE.js +1 -0
  15. package/.output/public/_nuxt/{VnIWJ0ts.js → BN_PdN3J.js} +1 -1
  16. package/.output/public/_nuxt/BZGNTgTQ2.js +1 -0
  17. package/.output/public/_nuxt/BbZAzXjZ2.js +1 -0
  18. package/.output/public/_nuxt/Bc3PiGGr.js +1 -0
  19. package/.output/public/_nuxt/Bckshc9V.js +1 -0
  20. package/.output/public/_nuxt/BcrN7QEl2.js +1 -0
  21. package/.output/public/_nuxt/BgOhoDTI.js +1 -0
  22. package/.output/public/_nuxt/Bmpvki7M.js +1 -0
  23. package/.output/public/_nuxt/{BkfchkK62.js → Bp5luxkg2.js} +1 -1
  24. package/.output/public/_nuxt/BxPPAkGA.js +3 -0
  25. package/.output/public/_nuxt/{C8dxXc6K.js → BxtpDtzC.js} +1 -1
  26. package/.output/public/_nuxt/{pRQri7vQ2.js → BytVi9VX2.js} +1 -1
  27. package/.output/public/_nuxt/{D5KJ7_0V.js → C3tCneTM.js} +1 -1
  28. package/.output/public/_nuxt/{C_gFA2H_2.js → C4OAdbVK2.js} +1 -1
  29. package/.output/public/_nuxt/C6m-kenn.js +1 -0
  30. package/.output/public/_nuxt/{zwdqvGN_.js → CGx-mtWf.js} +1 -1
  31. package/.output/public/_nuxt/{DCXIGxzT.js → CKfhtOt7.js} +2 -2
  32. package/.output/public/_nuxt/{ChEKFMxj.js → CUXCQXjG.js} +1 -1
  33. package/.output/public/_nuxt/CfVAr2nf.js +1 -0
  34. package/.output/public/_nuxt/Cj6139IM.js +1 -0
  35. package/.output/public/_nuxt/{DM8DS9MA.js → Cor9siSf.js} +1 -1
  36. package/.output/public/_nuxt/{BsMpJf7S.js → D-Ca4BGY.js} +6 -6
  37. package/.output/public/_nuxt/{CsCpu2Zh.js → D1z7i2UP.js} +1 -1
  38. package/.output/public/_nuxt/D7jiode2.js +1 -0
  39. package/.output/public/_nuxt/D8CqF0yy.js +1 -0
  40. package/.output/public/_nuxt/{DYZBdSSg2.js → DA4lxCWC2.js} +1 -1
  41. package/.output/public/_nuxt/DEaY_uvR.js +1 -0
  42. package/.output/public/_nuxt/{DCEyMaN-.js → DNxVTfhe.js} +3 -3
  43. package/.output/public/_nuxt/DT-Wg8r1.js +1 -0
  44. package/.output/public/_nuxt/DTYBfjRY.js +1 -0
  45. package/.output/public/_nuxt/{fQUs58kX2.js → DWcEk1ur2.js} +1 -1
  46. package/.output/public/_nuxt/DXRZPxGs.js +1 -0
  47. package/.output/public/_nuxt/Dhqra7NB.js +1 -0
  48. package/.output/public/_nuxt/DlRO_q5L.js +1 -0
  49. package/.output/public/_nuxt/{C2iWjzEC2.js → DoLasgPj2.js} +1 -1
  50. package/.output/public/_nuxt/{DRq09ZmT.js → DpojD719.js} +1 -1
  51. package/.output/public/_nuxt/Ds8JbqGB.js +1 -0
  52. package/.output/public/_nuxt/{BCipft_k2.js → DsUUYP292.js} +1 -1
  53. package/.output/public/_nuxt/DtBu71ev.js +32 -0
  54. package/.output/public/_nuxt/Dy-mxvXY2.js +1 -0
  55. package/.output/public/_nuxt/DyisHHzD.js +18 -0
  56. package/.output/public/_nuxt/G0qIw7Gq2.js +1 -0
  57. package/.output/public/_nuxt/ORt9oDIy2.js +1 -0
  58. package/.output/public/_nuxt/QoCzfpo2.js +1 -0
  59. package/.output/public/_nuxt/RzXYI9FM.js +23 -0
  60. package/.output/public/_nuxt/TownView.BHLKAjEu.css +1 -0
  61. package/.output/public/_nuxt/VLI2Zy4t.js +5 -0
  62. package/.output/public/_nuxt/_id_.DIxEKj88.css +1 -0
  63. package/.output/public/_nuxt/_id_.DTvjd6VN.css +1 -0
  64. package/.output/public/_nuxt/{_wsId_.COUzMXpP.css → _wsId_.BFyCuUwS.css} +1 -1
  65. package/.output/public/_nuxt/agents.CEbox5-D.css +1 -0
  66. package/.output/public/_nuxt/{ZugRk0CM2.js → arUY5dyq2.js} +2 -2
  67. package/.output/public/_nuxt/builds/latest.json +1 -1
  68. package/.output/public/_nuxt/builds/meta/88479a5b-ce6a-400f-9737-1cc9f54b1fe5.json +1 -0
  69. package/.output/public/_nuxt/channel-templates.De5ZvrGz.css +1 -0
  70. package/.output/public/_nuxt/d_Sz9KGm.js +1 -0
  71. package/.output/public/_nuxt/daq.6IrhVVfy.css +1 -0
  72. package/.output/public/_nuxt/dcw.DcDjwvqv.css +1 -0
  73. package/.output/public/_nuxt/default.BbgdTDCk.css +1 -0
  74. package/.output/public/_nuxt/{CblLEiCZ.js → eHYnGew0.js} +3 -3
  75. package/.output/public/_nuxt/eUGyJdiT.js +1 -0
  76. package/.output/public/_nuxt/{entry.5qf6EqfN.css → entry.B03HBJGC.css} +1 -1
  77. package/.output/public/_nuxt/{Cyk3du4K2.js → kZV5TQvh2.js} +1 -1
  78. package/.output/public/_nuxt/kkEthL84.js +2 -0
  79. package/.output/public/_nuxt/logs.BO-BSyjm.css +1 -0
  80. package/.output/public/_nuxt/{D4qXvjuV.js → niDwBOZW.js} +2 -2
  81. package/.output/public/_nuxt/permissions.CwZo6t1V.css +1 -0
  82. package/.output/public/_nuxt/plugins.Clsky_kl.css +1 -0
  83. package/.output/public/_nuxt/rqZ-1SoP.js +2 -0
  84. package/.output/public/_nuxt/settings.BqMF2nfj.css +1 -0
  85. package/.output/public/_nuxt/tJuVvBSl.js +1 -0
  86. package/.output/public/_nuxt/teams.CUMnbQGf.css +1 -0
  87. package/.output/public/_nuxt/tokens.BPLe9ioQ.css +1 -0
  88. package/.output/public/_nuxt/{Bi6AiCuP.js → vJ4FPb-_.js} +1 -1
  89. package/.output/public/_nuxt/workshop.BIdoGfoC.css +1 -0
  90. package/.output/public/_nuxt/{B7aqqzkY.js → zVkqCZ78.js} +1 -1
  91. package/.output/server/chunks/_/LeftOutlined.mjs +1 -1
  92. package/.output/server/chunks/_/SearchOutlined.mjs +1 -1
  93. package/.output/server/chunks/_/character-asset.repo.mjs +1 -1
  94. package/.output/server/chunks/_/host-bindings.mjs +1 -1
  95. package/.output/server/chunks/_/nitro.mjs +1614 -1279
  96. package/.output/server/chunks/_/nitro.mjs.map +1 -1
  97. package/.output/server/chunks/_/scene-layout.repo.mjs +1 -1
  98. package/.output/server/chunks/build/Col-biaNnEPf.mjs +1 -1
  99. package/.output/server/chunks/build/{OmpTerminalPanel-COphA1br.mjs → OmpTerminalPanel-Ban3yJZ4.mjs} +4 -5
  100. package/.output/server/chunks/build/OmpTerminalPanel-Ban3yJZ4.mjs.map +1 -0
  101. package/.output/server/chunks/build/{TownView-B5KifIaT.mjs → TownView-CunmEMzS.mjs} +184 -184
  102. package/.output/server/chunks/build/{TownView-B5KifIaT.mjs.map → TownView-CunmEMzS.mjs.map} +1 -1
  103. package/.output/server/chunks/build/{_id_-Ct4Jhvl1.mjs → _id_-CVnMdSeG.mjs} +38 -37
  104. package/.output/server/chunks/build/_id_-CVnMdSeG.mjs.map +1 -0
  105. package/.output/server/chunks/build/{_id_-C-ewLgfl.mjs → _id_-D265Wh_k.mjs} +127 -126
  106. package/.output/server/chunks/build/_id_-D265Wh_k.mjs.map +1 -0
  107. package/.output/server/chunks/build/{_wsId_-CanI_6Su.mjs → _wsId_-eNJmBp05.mjs} +137 -136
  108. package/.output/server/chunks/build/{_wsId_-CanI_6Su.mjs.map → _wsId_-eNJmBp05.mjs.map} +1 -1
  109. package/.output/server/chunks/build/{agents-DSOptxXA.mjs → agents-B10wmFri.mjs} +24 -23
  110. package/.output/server/chunks/build/agents-B10wmFri.mjs.map +1 -0
  111. package/.output/server/chunks/build/alert-qJnjyRcP.mjs +1 -1
  112. package/.output/server/chunks/build/api-error-dul30BYQ.mjs +47 -0
  113. package/.output/server/chunks/build/api-error-dul30BYQ.mjs.map +1 -0
  114. package/.output/server/chunks/build/button-DEcZFcqN.mjs +2 -2
  115. package/.output/server/chunks/build/{card-Dipvaykh.mjs → card-CCPQoKlh.mjs} +4 -4
  116. package/.output/server/chunks/build/{card-Dipvaykh.mjs.map → card-CCPQoKlh.mjs.map} +1 -1
  117. package/.output/server/chunks/build/{channel-templates-BK0KuPOd.mjs → channel-templates-CpWxVk5A.mjs} +29 -28
  118. package/.output/server/chunks/build/channel-templates-CpWxVk5A.mjs.map +1 -0
  119. package/.output/server/chunks/build/{checkbox-dzcpU_Cd.mjs → checkbox-Dv1kjaUZ.mjs} +3 -3
  120. package/.output/server/chunks/build/{checkbox-dzcpU_Cd.mjs.map → checkbox-Dv1kjaUZ.mjs.map} +1 -1
  121. package/.output/server/chunks/build/client-only-D5BzSQc6.mjs +1 -1
  122. package/.output/server/chunks/build/{daq-D9RA_uze.mjs → daq-DxaXk_8N.mjs} +114 -114
  123. package/.output/server/chunks/build/daq-DxaXk_8N.mjs.map +1 -0
  124. package/.output/server/chunks/build/{dcw-BTM5YU-B.mjs → dcw-DqjHrl5Z.mjs} +48 -47
  125. package/.output/server/chunks/build/dcw-DqjHrl5Z.mjs.map +1 -0
  126. package/.output/server/chunks/build/{default-BfWGTlbj.mjs → default-YcUHc1Ev.mjs} +34 -26
  127. package/.output/server/chunks/build/{default-BfWGTlbj.mjs.map → default-YcUHc1Ev.mjs.map} +1 -1
  128. package/.output/server/chunks/build/drawer-Cmh90erI.mjs +1 -1
  129. package/.output/server/chunks/build/dropdown-vhn1NPFs.mjs +2 -2
  130. package/.output/server/chunks/build/hasIn-vQ9LWt-J.mjs +554 -0
  131. package/.output/server/chunks/build/hasIn-vQ9LWt-J.mjs.map +1 -0
  132. package/.output/server/chunks/build/initDefaultProps-DIbWwP4R.mjs +1 -1
  133. package/.output/server/chunks/build/{input-sf_BT6o6.mjs → input-DxDqeyQW.mjs} +5 -553
  134. package/.output/server/chunks/build/input-DxDqeyQW.mjs.map +1 -0
  135. package/.output/server/chunks/build/{input-number-Bd55elNN.mjs → input-number-CZ3ZrCsy.mjs} +3 -3
  136. package/.output/server/chunks/build/{input-number-Bd55elNN.mjs.map → input-number-CZ3ZrCsy.mjs.map} +1 -1
  137. package/.output/server/chunks/build/{logs-Dyk0I2I9.mjs → logs-Co854R4y.mjs} +40 -40
  138. package/.output/server/chunks/build/{logs-Dyk0I2I9.mjs.map → logs-Co854R4y.mjs.map} +1 -1
  139. package/.output/server/chunks/build/menu-WCrlpYVh.mjs +2 -2
  140. package/.output/server/chunks/build/modal-yvUquPj5.mjs +2 -2
  141. package/.output/server/chunks/build/{monitor-MIOvsyLa.mjs → monitor-miqq9xHB.mjs} +11 -11
  142. package/.output/server/chunks/build/{monitor-MIOvsyLa.mjs.map → monitor-miqq9xHB.mjs.map} +1 -1
  143. package/.output/server/chunks/build/{pages-DR2bzczM.mjs → pages-DPC1Vp6w.mjs} +6 -5
  144. package/.output/server/chunks/build/pages-DPC1Vp6w.mjs.map +1 -0
  145. package/.output/server/chunks/build/permissions-Eu9e6hfZ.mjs +534 -0
  146. package/.output/server/chunks/build/permissions-Eu9e6hfZ.mjs.map +1 -0
  147. package/.output/server/chunks/build/{plugins-DnOBIWGg.mjs → plugins-D84mvK9G.mjs} +27 -25
  148. package/.output/server/chunks/build/plugins-D84mvK9G.mjs.map +1 -0
  149. package/.output/server/chunks/build/popconfirm-CRaHcz5O.mjs +2 -2
  150. package/.output/server/chunks/build/responsiveObserve-CS0UB6wQ.mjs +1 -1
  151. package/.output/server/chunks/build/{segmented-DPe9ZzLO.mjs → segmented-ChmQZwz6.mjs} +5 -4
  152. package/.output/server/chunks/build/{segmented-DPe9ZzLO.mjs.map → segmented-ChmQZwz6.mjs.map} +1 -1
  153. package/.output/server/chunks/build/select-D-CeE5vY.mjs +1 -1
  154. package/.output/server/chunks/build/{settings-DA8IkGLo.mjs → settings-BPBll_7K.mjs} +28 -26
  155. package/.output/server/chunks/build/settings-BPBll_7K.mjs.map +1 -0
  156. package/.output/server/chunks/build/space-CCBYAkXt.mjs +2 -2
  157. package/.output/server/chunks/build/spin-HVY81X_L.mjs +1 -1
  158. package/.output/server/chunks/build/switch-CelRXpcy.mjs +2 -2
  159. package/.output/server/chunks/build/{table-Cswq-l2r.mjs → table-BtksyDlQ.mjs} +5 -5
  160. package/.output/server/chunks/build/{table-Cswq-l2r.mjs.map → table-BtksyDlQ.mjs.map} +1 -1
  161. package/.output/server/chunks/build/{tabs-BM3tAh_J.mjs → tabs-DQv-_-R6.mjs} +3 -3
  162. package/.output/server/chunks/build/{tabs-BM3tAh_J.mjs.map → tabs-DQv-_-R6.mjs.map} +1 -1
  163. package/.output/server/chunks/build/{tag-NO9jEqKy.mjs → tag-A0tZ2Ouq.mjs} +4 -4
  164. package/.output/server/chunks/build/{tag-NO9jEqKy.mjs.map → tag-A0tZ2Ouq.mjs.map} +1 -1
  165. package/.output/server/chunks/build/{teams-BhSKBBBM.mjs → teams-CNflUtPh.mjs} +25 -24
  166. package/.output/server/chunks/build/teams-CNflUtPh.mjs.map +1 -0
  167. package/.output/server/chunks/build/{tokens-D_eyxmcv.mjs → tokens-CZpnEDVf.mjs} +27 -26
  168. package/.output/server/chunks/build/tokens-CZpnEDVf.mjs.map +1 -0
  169. package/.output/server/chunks/build/town-BUqRobze.mjs +1 -1
  170. package/.output/server/chunks/build/{town-DPtOPRRO.mjs → town-BbaR-8io.mjs} +10 -10
  171. package/.output/server/chunks/build/{town-DPtOPRRO.mjs.map → town-BbaR-8io.mjs.map} +1 -1
  172. package/.output/server/chunks/build/{useDaqStream-hwkhJHFU.mjs → useDaqStream-BkmyQT06.mjs} +36 -24
  173. package/.output/server/chunks/build/useDaqStream-BkmyQT06.mjs.map +1 -0
  174. package/.output/server/chunks/build/{useDcwStream-Bdew_yrr.mjs → useDcwStream-DWVoU96J.mjs} +63 -48
  175. package/.output/server/chunks/build/useDcwStream-DWVoU96J.mjs.map +1 -0
  176. package/.output/server/chunks/build/{useDeviceTwins-C6EBg9oN.mjs → useDeviceTwins-34WGk9aN.mjs} +4 -3
  177. package/.output/server/chunks/build/useDeviceTwins-34WGk9aN.mjs.map +1 -0
  178. package/.output/server/chunks/build/useLocalTime-9a4B-aHv.mjs +1 -1
  179. package/.output/server/chunks/build/{useOpsLog-DdCqKVVG.mjs → useOpsLog-C9zTzYof.mjs} +30 -17
  180. package/.output/server/chunks/build/useOpsLog-C9zTzYof.mjs.map +1 -0
  181. package/.output/server/chunks/build/useSiteConfig-DJe_KMVr.mjs +1 -1
  182. package/.output/server/chunks/build/useWorkshopApi-D2gq06N2.mjs +1 -1
  183. package/.output/server/chunks/build/{useWorkshopWs-B3j5wIAK.mjs → useWorkshopWs-CprkZEdq.mjs} +2 -3
  184. package/.output/server/chunks/build/useWorkshopWs-CprkZEdq.mjs.map +1 -0
  185. package/.output/server/chunks/build/{users-CmVvb1oq.mjs → users-D6RNylrW.mjs} +10 -10
  186. package/.output/server/chunks/build/{users-CmVvb1oq.mjs.map → users-D6RNylrW.mjs.map} +1 -1
  187. package/.output/server/chunks/build/{workshop-D5CQj2A8.mjs → workshop-Crsai2Y9.mjs} +27 -26
  188. package/.output/server/chunks/build/workshop-Crsai2Y9.mjs.map +1 -0
  189. package/.output/server/chunks/build/{workspaces-IfORCDJE.mjs → workspaces-BuydxM-3.mjs} +2 -3
  190. package/.output/server/chunks/build/workspaces-BuydxM-3.mjs.map +1 -0
  191. package/.output/server/chunks/routes/api/health.get.mjs +1 -1
  192. package/.output/server/chunks/routes/api/index.get.mjs +1 -1
  193. package/.output/server/chunks/routes/api/index.post.mjs +1 -1
  194. package/.output/server/chunks/routes/api/mcp/workshop.mjs +1 -1
  195. package/.output/server/chunks/routes/api/metrics.mjs +1 -1
  196. package/.output/server/chunks/routes/api/plugins/_name/_...path_.mjs +1 -1
  197. package/.output/server/chunks/routes/api/plugins/client/_name_.get.mjs +1 -1
  198. package/.output/server/chunks/routes/api/plugins/manifest.get.mjs +1 -1
  199. package/.output/server/chunks/routes/api/system/config.get.mjs +1 -1
  200. package/.output/server/chunks/routes/api/system/index.get.mjs +1 -1
  201. package/.output/server/chunks/routes/api/system/index.patch.mjs +1 -1
  202. package/.output/server/chunks/routes/api/system/monitor/terminal/ws.mjs +1 -1
  203. package/.output/server/chunks/routes/api/system/monitor/terminate.post.mjs +1 -1
  204. package/.output/server/chunks/routes/api/system/monitor.get.mjs +1 -1
  205. package/.output/server/chunks/routes/api/system/settings/events.get.mjs +1 -1
  206. package/.output/server/chunks/routes/api/system/settings/reset.post.mjs +1 -1
  207. package/.output/server/chunks/routes/api/users/_id_.delete.mjs +1 -1
  208. package/.output/server/chunks/routes/api/users/_id_.get.mjs +1 -1
  209. package/.output/server/chunks/routes/api/users/_id_.put.mjs +1 -1
  210. package/.output/server/chunks/routes/api/users/index.get.mjs +1 -1
  211. package/.output/server/chunks/routes/api/users/index.post.mjs +1 -1
  212. package/.output/server/chunks/routes/api/users/login.post.mjs +1 -1
  213. package/.output/server/chunks/routes/api/users/logout.post.mjs +1 -1
  214. package/.output/server/chunks/routes/api/users/me.get.mjs +1 -1
  215. package/.output/server/chunks/routes/api/users/register.post.mjs +1 -1
  216. package/.output/server/chunks/routes/api/users/setup-status.get.mjs +1 -1
  217. package/.output/server/chunks/routes/api/users/tokens/_id/token.get.mjs +1 -1
  218. package/.output/server/chunks/routes/api/users/tokens/_id_.delete.mjs +1 -1
  219. package/.output/server/chunks/routes/api/users/tokens/_id_.patch.mjs +1 -1
  220. package/.output/server/chunks/routes/api/workshop/_...path_.mjs +1 -1
  221. package/.output/server/chunks/routes/api/workshop/a2a/_agentId/index.get.mjs +1 -1
  222. package/.output/server/chunks/routes/api/workshop/a2a/_agentId/index.post.mjs +1 -1
  223. package/.output/server/chunks/routes/api/workshop/a2a/send.post.mjs +1 -1
  224. package/.output/server/chunks/routes/api/workshop/agent-tools/approvals/_id/decide.post.mjs +1 -1
  225. package/.output/server/chunks/routes/api/workshop/agent-tools/bindings/_id_.delete.mjs +1 -1
  226. package/.output/server/chunks/routes/api/workshop/agent-tools/bindings/_id_.patch.mjs +1 -1
  227. package/.output/server/chunks/routes/api/workshop/agent-tools/index.get.mjs +1 -1
  228. package/.output/server/chunks/routes/api/workshop/agent-tools/index.post.mjs +19 -8
  229. package/.output/server/chunks/routes/api/workshop/agent-tools/index.post.mjs.map +1 -1
  230. package/.output/server/chunks/routes/api/workshop/agent-tools/index2.get.mjs +1 -1
  231. package/.output/server/chunks/routes/api/workshop/agent-tools/invoke.post.mjs +2 -2
  232. package/.output/server/chunks/routes/api/workshop/agent-tools/list.get.mjs +2 -2
  233. package/.output/server/chunks/routes/api/workshop/agents/_id_.delete.mjs +1 -1
  234. package/.output/server/chunks/routes/api/workshop/agents/_id_.get.mjs +1 -1
  235. package/.output/server/chunks/routes/api/workshop/agents/_id_.patch.mjs +1 -1
  236. package/.output/server/chunks/routes/api/workshop/agents/subscribe.post.mjs +1 -1
  237. package/.output/server/chunks/routes/api/workshop/approvals/_id/decide.post.mjs +1 -1
  238. package/.output/server/chunks/routes/api/workshop/assets/character/_id_.delete.mjs +1 -1
  239. package/.output/server/chunks/routes/api/workshop/assets/devices/_id_.delete.mjs +1 -1
  240. package/.output/server/chunks/routes/api/workshop/assets/index.get.mjs +1 -1
  241. package/.output/server/chunks/routes/api/workshop/assets/index.post.mjs +2 -2
  242. package/.output/server/chunks/routes/api/workshop/assets/index2.get.mjs +1 -1
  243. package/.output/server/chunks/routes/api/workshop/assets/index2.post.mjs +2 -2
  244. package/.output/server/chunks/routes/api/workshop/audit.get.mjs +1 -1
  245. package/.output/server/chunks/routes/api/workshop/caller.mjs +1 -1
  246. package/.output/server/chunks/routes/api/workshop/channel-templates/_id/instantiate.post.mjs +3 -3
  247. package/.output/server/chunks/routes/api/workshop/channel-templates/_id_.delete.mjs +1 -1
  248. package/.output/server/chunks/routes/api/workshop/channel-templates/_id_.get.mjs +1 -1
  249. package/.output/server/chunks/routes/api/workshop/channel-templates/_id_.patch.mjs +1 -1
  250. package/.output/server/chunks/routes/api/workshop/channel-templates/from-channel.post.mjs +1 -1
  251. package/.output/server/chunks/routes/api/workshop/channels/_id/activate.post.mjs +2 -2
  252. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/index.get.mjs +1 -1
  253. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/index.post.mjs +1 -1
  254. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/memories/_memoryId_.delete.mjs +1 -1
  255. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/memories/search.post.mjs +1 -1
  256. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/model.patch.mjs +1 -1
  257. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/position.patch.mjs +1 -1
  258. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/range.patch.mjs +1 -1
  259. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/stop.post.mjs +1 -1
  260. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId_.delete.mjs +1 -1
  261. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId_.patch.mjs +1 -1
  262. package/.output/server/chunks/routes/api/workshop/channels/_id/events.get.mjs +1 -1
  263. package/.output/server/chunks/routes/api/workshop/channels/_id/index.get.mjs +1 -1
  264. package/.output/server/chunks/routes/api/workshop/channels/_id/index.post.mjs +2 -2
  265. package/.output/server/chunks/routes/api/workshop/channels/_id/index2.get.mjs +1 -1
  266. package/.output/server/chunks/routes/api/workshop/channels/_id/index2.post.mjs +1 -1
  267. package/.output/server/chunks/routes/api/workshop/channels/_id/index3.get.mjs +1 -1
  268. package/.output/server/chunks/routes/api/workshop/channels/_id/index3.post.mjs +1 -1
  269. package/.output/server/chunks/routes/api/workshop/channels/_id/index4.get.mjs +1 -1
  270. package/.output/server/chunks/routes/api/workshop/channels/_id/index4.post.mjs +1 -1
  271. package/.output/server/chunks/routes/api/workshop/channels/_id/memories/_memoryId_.delete.mjs +1 -1
  272. package/.output/server/chunks/routes/api/workshop/channels/_id/queue.get.mjs +1 -1
  273. package/.output/server/chunks/routes/api/workshop/channels/_id/terminals.get.mjs +2 -2
  274. package/.output/server/chunks/routes/api/workshop/channels/_id_.delete.mjs +1 -1
  275. package/.output/server/chunks/routes/api/workshop/channels/index.get.mjs +2 -2
  276. package/.output/server/chunks/routes/api/workshop/channels/index.patch.mjs +1 -1
  277. package/.output/server/chunks/routes/api/workshop/channels.get.mjs +1 -1
  278. package/.output/server/chunks/routes/api/workshop/channels.post.mjs +3 -3
  279. package/.output/server/chunks/routes/api/workshop/daq/_id/bind.post.mjs +7 -6
  280. package/.output/server/chunks/routes/api/workshop/daq/_id/bind.post.mjs.map +1 -1
  281. package/.output/server/chunks/routes/api/workshop/daq/_id/frames/content.get.mjs +5 -4
  282. package/.output/server/chunks/routes/api/workshop/daq/_id/frames/content.get.mjs.map +1 -1
  283. package/.output/server/chunks/routes/api/workshop/daq/_id/frames.get.mjs +5 -4
  284. package/.output/server/chunks/routes/api/workshop/daq/_id/frames.get.mjs.map +1 -1
  285. package/.output/server/chunks/routes/api/workshop/daq/_id/samples.get.mjs +5 -4
  286. package/.output/server/chunks/routes/api/workshop/daq/_id/samples.get.mjs.map +1 -1
  287. package/.output/server/chunks/routes/api/workshop/daq/_id/test.post.mjs +2 -2
  288. package/.output/server/chunks/routes/api/workshop/daq/_id_.delete.mjs +2 -2
  289. package/.output/server/chunks/routes/api/workshop/daq/_id_.patch.mjs +5 -4
  290. package/.output/server/chunks/routes/api/workshop/daq/_id_.patch.mjs.map +1 -1
  291. package/.output/server/chunks/routes/api/workshop/daq/alarms/_id/ack.post.mjs +5 -2
  292. package/.output/server/chunks/routes/api/workshop/daq/alarms/_id/ack.post.mjs.map +1 -1
  293. package/.output/server/chunks/routes/api/workshop/daq/alarms.get.mjs +2 -2
  294. package/.output/server/chunks/routes/api/workshop/daq/controller.post.mjs +3 -2
  295. package/.output/server/chunks/routes/api/workshop/daq/controller.post.mjs.map +1 -1
  296. package/.output/server/chunks/routes/api/workshop/daq/index.post.mjs +2 -2
  297. package/.output/server/chunks/routes/api/workshop/daq/infra/reconnect.post.mjs +2 -2
  298. package/.output/server/chunks/routes/api/workshop/daq/infra.get.mjs +2 -2
  299. package/.output/server/chunks/routes/api/workshop/daq/templates/_key_.delete.mjs +2 -2
  300. package/.output/server/chunks/routes/api/workshop/daq/templates/_key_.patch.mjs +2 -2
  301. package/.output/server/chunks/routes/api/workshop/daq/test-driver.post.mjs +2 -2
  302. package/.output/server/chunks/routes/api/workshop/dcw/_id/bind.post.mjs +7 -6
  303. package/.output/server/chunks/routes/api/workshop/dcw/_id/bind.post.mjs.map +1 -1
  304. package/.output/server/chunks/routes/api/workshop/dcw/_id/param-ledger.get.mjs +2 -2
  305. package/.output/server/chunks/routes/api/workshop/dcw/_id/read.post.mjs +2 -2
  306. package/.output/server/chunks/routes/api/workshop/dcw/_id/test.post.mjs +5 -4
  307. package/.output/server/chunks/routes/api/workshop/dcw/_id/test.post.mjs.map +1 -1
  308. package/.output/server/chunks/routes/api/workshop/dcw/_id/write.post.mjs +4 -3
  309. package/.output/server/chunks/routes/api/workshop/dcw/_id/write.post.mjs.map +1 -1
  310. package/.output/server/chunks/routes/api/workshop/dcw/_id_.delete.mjs +2 -2
  311. package/.output/server/chunks/routes/api/workshop/dcw/_id_.patch.mjs +2 -2
  312. package/.output/server/chunks/routes/api/workshop/dcw/controller.post.mjs +2 -2
  313. package/.output/server/chunks/routes/api/workshop/dcw/index.get.mjs +2 -2
  314. package/.output/server/chunks/routes/api/workshop/dcw/index.post.mjs +4 -4
  315. package/.output/server/chunks/routes/api/workshop/dcw/index.post.mjs.map +1 -1
  316. package/.output/server/chunks/routes/api/workshop/dcw/index2.get.mjs +8 -4
  317. package/.output/server/chunks/routes/api/workshop/dcw/index2.get.mjs.map +1 -1
  318. package/.output/server/chunks/routes/api/workshop/dcw/index2.post.mjs +4 -4
  319. package/.output/server/chunks/routes/api/workshop/dcw/index2.post.mjs.map +1 -1
  320. package/.output/server/chunks/routes/api/workshop/dcw/index3.get.mjs +2 -2
  321. package/.output/server/chunks/routes/api/workshop/dcw/index3.post.mjs +2 -2
  322. package/.output/server/chunks/routes/api/workshop/dcw/index4.get.mjs +2 -2
  323. package/.output/server/chunks/routes/api/workshop/dcw/index4.post.mjs +2 -2
  324. package/.output/server/chunks/routes/api/workshop/dcw/index5.get.mjs +4 -4
  325. package/.output/server/chunks/routes/api/workshop/dcw/index5.get.mjs.map +1 -1
  326. package/.output/server/chunks/routes/api/workshop/dcw/journal/node/_nodeId/rollback.post.mjs +2 -2
  327. package/.output/server/chunks/routes/api/workshop/dcw/line/query.get.mjs +7 -3
  328. package/.output/server/chunks/routes/api/workshop/dcw/line/query.get.mjs.map +1 -1
  329. package/.output/server/chunks/routes/api/workshop/dcw/lines/_id/start.post.mjs +3 -2
  330. package/.output/server/chunks/routes/api/workshop/dcw/lines/_id/start.post.mjs.map +1 -1
  331. package/.output/server/chunks/routes/api/workshop/dcw/lines/_id/stop.post.mjs +3 -2
  332. package/.output/server/chunks/routes/api/workshop/dcw/lines/_id/stop.post.mjs.map +1 -1
  333. package/.output/server/chunks/routes/api/workshop/dcw/lines/_id_.delete.mjs +2 -2
  334. package/.output/server/chunks/routes/api/workshop/dcw/lines/_id_.patch.mjs +2 -2
  335. package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id/judge.post.mjs +2 -2
  336. package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id/rollback.post.mjs +2 -2
  337. package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id/series.get.mjs +2 -2
  338. package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id_.get.mjs +2 -2
  339. package/.output/server/chunks/routes/api/workshop/dcw/products/_id_.delete.mjs +2 -2
  340. package/.output/server/chunks/routes/api/workshop/dcw/products/_id_.patch.mjs +2 -2
  341. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/apply.post.mjs +2 -2
  342. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/mark-good.post.mjs +2 -2
  343. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/rollback-good.post.mjs +2 -2
  344. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id_.delete.mjs +2 -2
  345. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id_.patch.mjs +2 -2
  346. package/.output/server/chunks/routes/api/workshop/dcw/runs/_id/close.post.mjs +2 -2
  347. package/.output/server/chunks/routes/api/workshop/dcw/runs/_id/data.get.mjs +5 -3
  348. package/.output/server/chunks/routes/api/workshop/dcw/runs/_id/data.get.mjs.map +1 -1
  349. package/.output/server/chunks/routes/api/workshop/dcw/runs/_id/rollback.post.mjs +2 -2
  350. package/.output/server/chunks/routes/api/workshop/dcw/templates/_key_.delete.mjs +2 -2
  351. package/.output/server/chunks/routes/api/workshop/dcw/templates/_key_.patch.mjs +2 -2
  352. package/.output/server/chunks/routes/api/workshop/dcw/test-driver.post.mjs +2 -2
  353. package/.output/server/chunks/routes/api/workshop/device-twins/_id/control.post.mjs +1 -1
  354. package/.output/server/chunks/routes/api/workshop/device-twins/_id/telemetry.post.mjs +1 -1
  355. package/.output/server/chunks/routes/api/workshop/device-twins/_id_.delete.mjs +2 -2
  356. package/.output/server/chunks/routes/api/workshop/device-twins/_id_.patch.mjs +2 -2
  357. package/.output/server/chunks/routes/api/workshop/fs/dirs.get.mjs +1 -1
  358. package/.output/server/chunks/routes/api/workshop/harnesses/_id/providers.get.mjs +2 -2
  359. package/.output/server/chunks/routes/api/workshop/harnesses.get.mjs +2 -2
  360. package/.output/server/chunks/routes/api/workshop/hitl/pending.get.mjs +2 -2
  361. package/.output/server/chunks/routes/api/workshop/hitl/respond.post.mjs +2 -2
  362. package/.output/server/chunks/routes/api/workshop/index.get.mjs +1 -1
  363. package/.output/server/chunks/routes/api/workshop/index.post.mjs +1 -1
  364. package/.output/server/chunks/routes/api/workshop/index.put.mjs +41 -0
  365. package/.output/server/chunks/routes/api/workshop/index.put.mjs.map +1 -0
  366. package/.output/server/chunks/routes/api/workshop/index10.get.mjs +4 -3
  367. package/.output/server/chunks/routes/api/workshop/index10.get.mjs.map +1 -1
  368. package/.output/server/chunks/routes/api/workshop/index11.get.mjs +27 -0
  369. package/.output/server/chunks/routes/api/workshop/index11.get.mjs.map +1 -0
  370. package/.output/server/chunks/routes/api/workshop/index2.get.mjs +1 -1
  371. package/.output/server/chunks/routes/api/workshop/index2.post.mjs +1 -1
  372. package/.output/server/chunks/routes/api/workshop/index3.get.mjs +1 -1
  373. package/.output/server/chunks/routes/api/workshop/index3.post.mjs +4 -4
  374. package/.output/server/chunks/routes/api/workshop/index3.post.mjs.map +1 -1
  375. package/.output/server/chunks/routes/api/workshop/index4.get.mjs +5 -4
  376. package/.output/server/chunks/routes/api/workshop/index4.get.mjs.map +1 -1
  377. package/.output/server/chunks/routes/api/workshop/index4.post.mjs +2 -2
  378. package/.output/server/chunks/routes/api/workshop/index5.get.mjs +18 -11
  379. package/.output/server/chunks/routes/api/workshop/index5.get.mjs.map +1 -1
  380. package/.output/server/chunks/routes/api/workshop/index5.post.mjs +2 -2
  381. package/.output/server/chunks/routes/api/workshop/index6.get.mjs +1 -1
  382. package/.output/server/chunks/routes/api/workshop/index6.post.mjs +2 -2
  383. package/.output/server/chunks/routes/api/workshop/index7.get.mjs +1 -1
  384. package/.output/server/chunks/routes/api/workshop/index7.post.mjs +1 -1
  385. package/.output/server/chunks/routes/api/workshop/index8.get.mjs +24 -12
  386. package/.output/server/chunks/routes/api/workshop/index8.get.mjs.map +1 -1
  387. package/.output/server/chunks/routes/api/workshop/index8.post.mjs +1 -1
  388. package/.output/server/chunks/routes/api/workshop/index9.get.mjs +12 -7
  389. package/.output/server/chunks/routes/api/workshop/index9.get.mjs.map +1 -1
  390. package/.output/server/chunks/routes/api/workshop/mailbox/all.get.mjs +1 -1
  391. package/.output/server/chunks/routes/api/workshop/mailbox.get.mjs +1 -1
  392. package/.output/server/chunks/routes/api/workshop/memories/maintenance.post.mjs +1 -1
  393. package/.output/server/chunks/routes/api/workshop/plugins/_name/disable.post.mjs +4 -4
  394. package/.output/server/chunks/routes/api/workshop/plugins/_name/disable.post.mjs.map +1 -1
  395. package/.output/server/chunks/routes/api/workshop/plugins/_name/enable.post.mjs +4 -4
  396. package/.output/server/chunks/routes/api/workshop/plugins/_name/enable.post.mjs.map +1 -1
  397. package/.output/server/chunks/routes/api/workshop/plugins/index.get.mjs +1 -1
  398. package/.output/server/chunks/routes/api/workshop/runtime.get.mjs +1 -1
  399. package/.output/server/chunks/routes/api/workshop/scene/layouts/_channelId_.delete.mjs +2 -2
  400. package/.output/server/chunks/routes/api/workshop/scene/layouts/_channelId_.put.mjs +2 -2
  401. package/.output/server/chunks/routes/api/workshop/scene/layouts.get.mjs +1 -1
  402. package/.output/server/chunks/routes/api/workshop/tasks/_id/complete.post.mjs +1 -1
  403. package/.output/server/chunks/routes/api/workshop/tasks/_id/dispatch.post.mjs +1 -1
  404. package/.output/server/chunks/routes/api/workshop/tasks/_id/index.post.mjs +1 -1
  405. package/.output/server/chunks/routes/api/workshop/tasks/_id/report.post.mjs +1 -1
  406. package/.output/server/chunks/routes/api/workshop/tasks/_id/retry.post.mjs +1 -1
  407. package/.output/server/chunks/routes/api/workshop/tasks/_id_.get.mjs +1 -1
  408. package/.output/server/chunks/routes/api/workshop/tasks.get.mjs +1 -1
  409. package/.output/server/chunks/routes/api/workshop/teams/_id/deploy.post.mjs +2 -2
  410. package/.output/server/chunks/routes/api/workshop/teams/_id/index.get.mjs +1 -1
  411. package/.output/server/chunks/routes/api/workshop/teams/_id/index.post.mjs +1 -1
  412. package/.output/server/chunks/routes/api/workshop/teams/_id/members/_agentId_.delete.mjs +1 -1
  413. package/.output/server/chunks/routes/api/workshop/teams/_id_.delete.mjs +1 -1
  414. package/.output/server/chunks/routes/api/workshop/teams/_id_.get.mjs +1 -1
  415. package/.output/server/chunks/routes/api/workshop/teams/_id_.patch.mjs +1 -1
  416. package/.output/server/chunks/routes/api/workshop/users/me.get.mjs +1 -1
  417. package/.output/server/chunks/routes/api/workshop/users/register.post.mjs +1 -1
  418. package/.output/server/chunks/routes/api/workshop/workspaces/_id/channel-templates/_tplId_.post.mjs +3 -3
  419. package/.output/server/chunks/routes/api/workshop/workspaces/_id/channels/_channelId_.delete.mjs +1 -1
  420. package/.output/server/chunks/routes/api/workshop/workspaces/_id/channels/_channelId_.post.mjs +1 -1
  421. package/.output/server/chunks/routes/api/workshop/workspaces/index.delete.mjs +1 -1
  422. package/.output/server/chunks/routes/renderer.mjs +3 -3
  423. package/.output/server/chunks/virtual/entry.mjs +303 -37
  424. package/.output/server/chunks/virtual/entry.mjs.map +1 -1
  425. package/.output/server/chunks/virtual/precomputed.mjs +1 -1
  426. package/.output/server/index.mjs +1 -1
  427. package/.output/server/package.json +1 -1
  428. package/README-zh.md +15 -0
  429. package/README.md +20 -0
  430. package/app/components/AppHeader.vue +1 -1
  431. package/app/components/AppSidebar.vue +7 -1
  432. package/app/components/workshop/A2aRpcDebugger.vue +1 -1
  433. package/app/components/workshop/AgentInspectorDrawer.vue +3 -3
  434. package/app/components/workshop/AgentLanesView.vue +6 -6
  435. package/app/components/workshop/AssetLibrary.vue +2 -2
  436. package/app/components/workshop/ChannelSessionList.vue +5 -5
  437. package/app/components/workshop/Composer.vue +1 -1
  438. package/app/components/workshop/DeviceTwinPanel.vue +2 -2
  439. package/app/components/workshop/TaskBoardView.vue +1 -1
  440. package/app/components/workshop/TaskInspectorDrawer.vue +2 -2
  441. package/app/components/workshop/town/TownView.vue +23 -23
  442. package/app/composables/workshop/apiClient.ts +103 -95
  443. package/app/composables/workshop/useCharacterAssets.ts +1 -1
  444. package/app/composables/workshop/useDaqStream.ts +36 -22
  445. package/app/composables/workshop/useDcwStream.ts +23 -6
  446. package/app/composables/workshop/useDeviceTwins.ts +1 -1
  447. package/app/composables/workshop/useOpsLog.ts +28 -15
  448. package/app/composables/workshop/useSceneLayouts.ts +1 -1
  449. package/app/composables/workshop/useWorkshopWs.ts +11 -2
  450. package/app/pages/daq/[id].vue +1 -1
  451. package/app/pages/daq/index.vue +8 -8
  452. package/app/pages/dcw/[id].vue +13 -13
  453. package/app/pages/dcw/index.vue +7 -7
  454. package/app/pages/logs/index.vue +1 -1
  455. package/app/pages/permissions/index.vue +327 -0
  456. package/app/pages/plugins/index.vue +14 -6
  457. package/app/pages/settings.vue +4 -2
  458. package/app/pages/tokens.vue +3 -3
  459. package/app/pages/workshop/agents.vue +2 -2
  460. package/app/pages/workshop/channel-templates.vue +3 -3
  461. package/app/pages/workshop/index.vue +4 -4
  462. package/app/pages/workshop/teams.vue +3 -3
  463. package/app/plugins/http.ts +18 -2
  464. package/app/plugins/session-restore.client.ts +7 -2
  465. package/app/stores/workshop/user.ts +14 -1
  466. package/app/utils/api-error.ts +75 -0
  467. package/cli/commands/plugin.mjs +2 -2
  468. package/config.yml +1 -1
  469. package/i18n/locales/en.ts +53 -3
  470. package/i18n/locales/zh-CN.ts +53 -3
  471. package/package.json +1 -1
  472. package/scripts/_dbg-acc-1-setup.mjs +57 -0
  473. package/scripts/_dbg-acc-2-diag.mjs +14 -0
  474. package/scripts/_dbg-acc-2-intervals.mjs +81 -0
  475. package/scripts/_dbg-acc-3-daq.mjs +48 -0
  476. package/scripts/_dbg-acc-4-team.mjs +92 -0
  477. package/scripts/_dbg-acc-5-visual.mjs +63 -0
  478. package/scripts/_dbg-acc-5b-ws-town.mjs +18 -0
  479. package/scripts/_dbg-acc-5c-town.mjs +12 -0
  480. package/scripts/_dbg-acc-6-i18n.mjs +19 -0
  481. package/scripts/_dbg-audit-neg-e2e.mjs +64 -0
  482. package/scripts/_dbg-final-features.mjs +155 -0
  483. package/scripts/_dbg-final-fixups.mjs +62 -0
  484. package/scripts/_dbg-final-visual.mjs +29 -0
  485. package/scripts/_dbg-interval-config.mjs +17 -6
  486. package/scripts/_dbg-perms-e2e.mjs +102 -0
  487. package/scripts/_dbg-perms-visual.mjs +36 -0
  488. package/scripts/_dbg-plugins-e2e.mjs +101 -0
  489. package/scripts/_dbg-protocol-matrix.mjs +16 -0
  490. package/scripts/_dbg-repo-setup-verify.mjs +31 -0
  491. package/scripts/_dbg-setup-e2e.mjs +1 -1
  492. package/sdk/api.mjs +117 -101
  493. package/sdk/context.mjs +240 -219
  494. package/sdk/hooks.mjs +105 -103
  495. package/sdk/index.d.mts +142 -135
  496. package/sdk/lifecycle.mjs +26 -25
  497. package/server/api/workshop/agent-tools/bindings/index.post.ts +40 -20
  498. package/server/api/workshop/daq/[id]/bind.post.ts +5 -2
  499. package/server/api/workshop/daq/[id]/frames/content.get.ts +4 -1
  500. package/server/api/workshop/daq/[id]/frames.get.ts +4 -1
  501. package/server/api/workshop/daq/[id]/samples.get.ts +4 -1
  502. package/server/api/workshop/daq/[id].patch.ts +3 -0
  503. package/server/api/workshop/daq/alarms/[id]/ack.post.ts +20 -15
  504. package/server/api/workshop/daq/controller.post.ts +2 -0
  505. package/server/api/workshop/daq/index.get.ts +5 -3
  506. package/server/api/workshop/daq/index.post.ts +2 -2
  507. package/server/api/workshop/dcw/[id]/bind.post.ts +20 -17
  508. package/server/api/workshop/dcw/[id]/test.post.ts +18 -15
  509. package/server/api/workshop/dcw/[id]/write.post.ts +3 -0
  510. package/server/api/workshop/dcw/index.get.ts +22 -9
  511. package/server/api/workshop/dcw/line/query.get.ts +38 -31
  512. package/server/api/workshop/dcw/lines/[id]/start.post.ts +3 -0
  513. package/server/api/workshop/dcw/lines/[id]/stop.post.ts +3 -0
  514. package/server/api/workshop/dcw/lines/index.get.ts +8 -2
  515. package/server/api/workshop/dcw/lines/index.post.ts +2 -2
  516. package/server/api/workshop/dcw/products/index.post.ts +16 -16
  517. package/server/api/workshop/dcw/runs/[id]/data.get.ts +20 -15
  518. package/server/api/workshop/dcw/runs/index.get.ts +13 -11
  519. package/server/api/workshop/permissions/index.get.ts +30 -0
  520. package/server/api/workshop/permissions/index.put.ts +29 -0
  521. package/server/api/workshop/plugins/[name]/disable.post.ts +5 -3
  522. package/server/api/workshop/plugins/[name]/enable.post.ts +5 -3
  523. package/server/api/workshop/ws.ts +18 -6
  524. package/server/data/daqs.json +90 -46
  525. package/server/data/dcw-lines.json +21 -0
  526. package/server/data/dcw-products.json +140 -0
  527. package/server/data/dcw-recipes.json +506 -0
  528. package/server/data/dcw-rollback.json +281 -6
  529. package/server/data/dcw-runs.json +1374 -1257
  530. package/server/data/dcw-writes.json +312 -0
  531. package/server/data/dcws.json +1165 -477
  532. package/server/data/line-runs.json +26 -6
  533. package/server/plugins/backup.ts +119 -116
  534. package/server/repositories/user.repository.ts +86 -6
  535. package/server/services/system-config.ts +5 -0
  536. package/server/services/user.service.ts +5 -3
  537. package/server/services/workshop/daq/bus/index.ts +5 -3
  538. package/server/services/workshop/daq/bus/inproc.adapter.ts +12 -3
  539. package/server/services/workshop/daq/bus/mqtt.adapter.ts +13 -0
  540. package/server/services/workshop/daq/bus/queue-port.ts +2 -0
  541. package/server/services/workshop/daq/daq-controller.ts +18 -1
  542. package/server/services/workshop/daq/storage/sqlite.adapter.ts +10 -5
  543. package/server/services/workshop/db/ops.repo.ts +6 -0
  544. package/server/services/workshop/dcw/dcw-controller.ts +10 -2
  545. package/server/services/workshop/permissions.ts +79 -0
  546. package/server/services/workshop/plugins/host.mjs +40 -2
  547. package/server/services/workshop/scene-events.ts +25 -1
  548. package/server/services/workshop/settings.ts +10 -0
  549. package/shared/config/single-instance.mjs +24 -0
  550. package/shared/daq-protocol.ts +2 -0
  551. package/.output/public/_nuxt/2LwEn9gX.js +0 -2
  552. package/.output/public/_nuxt/3612gD2V.js +0 -32
  553. package/.output/public/_nuxt/8eIQAVlb.js +0 -1
  554. package/.output/public/_nuxt/Ah9qOv1m.js +0 -1
  555. package/.output/public/_nuxt/B4Fia4FB.js +0 -3
  556. package/.output/public/_nuxt/BH0Z05CS.js +0 -1
  557. package/.output/public/_nuxt/BJ-fxrSw.js +0 -1
  558. package/.output/public/_nuxt/BJvGPTpC.js +0 -1
  559. package/.output/public/_nuxt/BVZjSVs2.js +0 -1
  560. package/.output/public/_nuxt/BVzDoF8t.js +0 -1
  561. package/.output/public/_nuxt/BjVLsC3M.js +0 -1
  562. package/.output/public/_nuxt/BnVoQ74r.js +0 -1
  563. package/.output/public/_nuxt/Bnp4vIAf.js +0 -1
  564. package/.output/public/_nuxt/Bt_HDizI.js +0 -5
  565. package/.output/public/_nuxt/Bu-P92Pe.js +0 -18
  566. package/.output/public/_nuxt/ButLXkjo.js +0 -2
  567. package/.output/public/_nuxt/By-LNp3k.js +0 -1
  568. package/.output/public/_nuxt/CGdPdJPP.js +0 -1
  569. package/.output/public/_nuxt/CRGlf1Gb.js +0 -1
  570. package/.output/public/_nuxt/CS8R0_J3.js +0 -1
  571. package/.output/public/_nuxt/CUxV8Bw_.js +0 -1
  572. package/.output/public/_nuxt/Cd15nPnG2.js +0 -1
  573. package/.output/public/_nuxt/CvbHIGQY2.js +0 -1
  574. package/.output/public/_nuxt/DNJSkm3Q.js +0 -1
  575. package/.output/public/_nuxt/DNzaswei.js +0 -1
  576. package/.output/public/_nuxt/DXK1U43I.js +0 -1
  577. package/.output/public/_nuxt/Dc46i75T.js +0 -14
  578. package/.output/public/_nuxt/Dk6pq9JB2.js +0 -1
  579. package/.output/public/_nuxt/Do88WZG2.js +0 -23
  580. package/.output/public/_nuxt/Du-eSpo2.js +0 -1
  581. package/.output/public/_nuxt/GP2wXyuY.js +0 -1
  582. package/.output/public/_nuxt/NIM0Wglj2.js +0 -1
  583. package/.output/public/_nuxt/PQLnLxYe.js +0 -1
  584. package/.output/public/_nuxt/R_Wv_Nd9.js +0 -1
  585. package/.output/public/_nuxt/TownView.Bt33bo1M.css +0 -1
  586. package/.output/public/_nuxt/_id_.BzKMZnLe.css +0 -1
  587. package/.output/public/_nuxt/_id_.CbpDAWRh.css +0 -1
  588. package/.output/public/_nuxt/agents.BlejnOOC.css +0 -1
  589. package/.output/public/_nuxt/builds/meta/e5bb1803-86d9-43b3-85be-dc787dc9a978.json +0 -1
  590. package/.output/public/_nuxt/channel-templates.lkqEYlWY.css +0 -1
  591. package/.output/public/_nuxt/daq.zZ8GR433.css +0 -1
  592. package/.output/public/_nuxt/dcw.C46dGiF_.css +0 -1
  593. package/.output/public/_nuxt/default.V3_hUJq1.css +0 -1
  594. package/.output/public/_nuxt/eHGLpQSg2.js +0 -1
  595. package/.output/public/_nuxt/logs.DaIsHWZE.css +0 -1
  596. package/.output/public/_nuxt/p7wSGMtc.js +0 -1
  597. package/.output/public/_nuxt/plugins.FTm0PcEe.css +0 -1
  598. package/.output/public/_nuxt/settings.DeRNNUcP.css +0 -1
  599. package/.output/public/_nuxt/tRBT-plo.js +0 -1
  600. package/.output/public/_nuxt/teams.B8JNbUZg.css +0 -1
  601. package/.output/public/_nuxt/tokens.CWOTXM-Z.css +0 -1
  602. package/.output/public/_nuxt/ubPfs9mQ.js +0 -1
  603. package/.output/public/_nuxt/workshop.3kAcLB_M.css +0 -1
  604. package/.output/server/chunks/build/OmpTerminalPanel-COphA1br.mjs.map +0 -1
  605. package/.output/server/chunks/build/_id_-C-ewLgfl.mjs.map +0 -1
  606. package/.output/server/chunks/build/_id_-Ct4Jhvl1.mjs.map +0 -1
  607. package/.output/server/chunks/build/agents-DSOptxXA.mjs.map +0 -1
  608. package/.output/server/chunks/build/channel-templates-BK0KuPOd.mjs.map +0 -1
  609. package/.output/server/chunks/build/daq-D9RA_uze.mjs.map +0 -1
  610. package/.output/server/chunks/build/dcw-BTM5YU-B.mjs.map +0 -1
  611. package/.output/server/chunks/build/input-sf_BT6o6.mjs.map +0 -1
  612. package/.output/server/chunks/build/pages-DR2bzczM.mjs.map +0 -1
  613. package/.output/server/chunks/build/plugins-DnOBIWGg.mjs.map +0 -1
  614. package/.output/server/chunks/build/settings-DA8IkGLo.mjs.map +0 -1
  615. package/.output/server/chunks/build/teams-BhSKBBBM.mjs.map +0 -1
  616. package/.output/server/chunks/build/tokens-D_eyxmcv.mjs.map +0 -1
  617. package/.output/server/chunks/build/useDaqStream-hwkhJHFU.mjs.map +0 -1
  618. package/.output/server/chunks/build/useDcwStream-Bdew_yrr.mjs.map +0 -1
  619. package/.output/server/chunks/build/useDeviceTwins-C6EBg9oN.mjs.map +0 -1
  620. package/.output/server/chunks/build/useOpsLog-DdCqKVVG.mjs.map +0 -1
  621. package/.output/server/chunks/build/useWorkshopWs-B3j5wIAK.mjs.map +0 -1
  622. package/.output/server/chunks/build/user-Dk-ytEUV.mjs +0 -140
  623. package/.output/server/chunks/build/user-Dk-ytEUV.mjs.map +0 -1
  624. package/.output/server/chunks/build/workshop-D5CQj2A8.mjs.map +0 -1
  625. package/.output/server/chunks/build/workspaces-IfORCDJE.mjs.map +0 -1
  626. /package/.output/public/_nuxt/{CNs_Ozdc2.js → CNs_Ozdc.js} +0 -0
  627. /package/.output/public/_nuxt/{Cno6kYiO2.js → Cno6kYiO.js} +0 -0
@@ -55,7 +55,8 @@ export const useUserStore = defineStore('workshop.user', {
55
55
  // 请求上下文已丢失,useCookie 会抛 NUXT_E1001(useNuxtApp outside context);
56
56
  // 请求期写 Set-Cookie 在响应完成后也无实效。客户端 useCookie 不依赖请求上下文。
57
57
  if (import.meta.server) return
58
- const cookie = useCookie<string | null>('token', { maxAge: 60 * 60 * 24 * 365 })
58
+ // maxAge 与服务端 token TTL(30 天)对齐:365 天会让浏览器带着必死 token 往返
59
+ const cookie = useCookie<string | null>('token', { maxAge: 60 * 60 * 24 * 30 })
59
60
  cookie.value = this.user?.token ?? null
60
61
  },
61
62
  /** 以 me 响应补全 tokenId(注册/登录签发的新 token 尚未绑定 id) */
@@ -171,6 +172,18 @@ export const useUserStore = defineStore('workshop.user', {
171
172
  },
172
173
  },
173
174
  persist: {
175
+ // localStorage 不持久化 token(长命明文凭据,XSS 可读且跨标签页漂移):
176
+ // token 真源是 30 天 cookie;hydration 后从 cookie 回填,无 cookie 即回登出态
174
177
  pick: ['user'],
178
+ afterHydrate: (ctx) => {
179
+ const store = ctx.store as { user?: { token?: string } | null, user?: CurrentUser | null, applyCookie?: () => void }
180
+ if (!store.user) return
181
+ try {
182
+ const cookie = useCookie<string | null>('token')
183
+ if (cookie.value) store.user.token = cookie.value
184
+ else (store as { user?: CurrentUser | null }).user = null
185
+ }
186
+ catch { /* SSR 上下文:跳过(session-restore.client 负责) */ }
187
+ },
175
188
  },
176
189
  })
@@ -0,0 +1,75 @@
1
+ /**
2
+ * 统一错误文案解析 —— 任何 fetch/axios/业务异常 → 面向用户的可读提示。
3
+ *
4
+ * 项目约定:API 错误一律走 {code, message} 信封(defineApiHandler/AppError),
5
+ * 服务端 message 本就是人话;但 ofetch/axios 抛出的错误对象把 "[POST] /api/x
6
+ * 403 (forbidden)" 这类码式文本放在 err.message 上,信封在 err.data 里。
7
+ * 本解析器统一取值顺序:
8
+ * 1. 服务端信封 message(人话,优先);
9
+ * 2. HTTP 状态码 → 本地化映射(errors.* i18n,取不到回退内置中文);
10
+ * 3. 网络层失败特征 → "无法连接服务器";
11
+ * 4. 原始 message(最后兜底,通常已可读)。
12
+ * 永远返回非空字符串;message.error(messageError(err)) 即可替换一切裸 err.message 渲染。
13
+ */
14
+ interface ErrLike {
15
+ data?: unknown
16
+ statusCode?: number
17
+ status?: number
18
+ message?: string
19
+ code?: string | number
20
+ }
21
+
22
+ /** i18n 取不到时的内置回退(与 locales errors.* 保持一致,zh 优先项目) */
23
+ const FALLBACK: Record<string, string> = {
24
+ http400: '请求参数有误,请检查后重试',
25
+ http401: '登录已过期,请重新登录',
26
+ http403: '权限不足:该操作需要管理员权限',
27
+ http404: '目标不存在或已被删除',
28
+ http409: '操作冲突:资源已存在或状态不允许',
29
+ http5xx: '服务器内部错误,请稍后重试',
30
+ network: '无法连接服务器,请检查网络与服务状态',
31
+ fallback: '操作失败,请稍后重试',
32
+ }
33
+
34
+ /** 事件回调里 useI18n 不可靠,经 nuxt app 取 $i18n;任何失败静默回退内置文案 */
35
+ function tt(key: string): string | null {
36
+ try {
37
+ const nuxt = useNuxtApp()
38
+ const i18n = (nuxt as { $i18n?: { t?: (k: string) => string } }).$i18n
39
+ const v = i18n?.t?.(key)
40
+ return typeof v === 'string' && v && !v.startsWith('errors.') ? v : null
41
+ }
42
+ catch {
43
+ return null
44
+ }
45
+ }
46
+
47
+ function statusKey(status: number): keyof typeof FALLBACK | null {
48
+ if (status === 400) return 'http400'
49
+ if (status === 401) return 'http401'
50
+ if (status === 403) return 'http403'
51
+ if (status === 404) return 'http404'
52
+ if (status === 409) return 'http409'
53
+ if (status >= 500) return 'http5xx'
54
+ return null
55
+ }
56
+
57
+ export function apiErrorMessage(err: unknown, fallback?: string): string {
58
+ const e = (err ?? {}) as ErrLike
59
+ // 1. 服务端信封(ofetch: err.data = {code,message};axios: err.response.data)
60
+ const data = (e.data ?? null) as { message?: unknown } | null
61
+ if (data && typeof data.message === 'string' && data.message.trim()) return data.message.trim()
62
+ // 2. HTTP 状态码 → 本地化映射
63
+ const status = Number(e.statusCode ?? e.status ?? 0)
64
+ const key = statusKey(status)
65
+ if (key) return tt(`errors.${key}`) ?? FALLBACK[key]
66
+ // 3. 网络层失败(fetch failed / ECONNREFUSED / 超时)
67
+ const raw = String(e.message ?? '')
68
+ if (/fetch failed|network|ECONNREFUSED|ENOTFOUND|ECONNRESET|aborted|timeout/i.test(raw)) {
69
+ return tt('errors.network') ?? FALLBACK.network
70
+ }
71
+ // 4. 原始 message 兜底(裸 Error 等通常已可读;剥掉 "Error: " 前缀)
72
+ const cleaned = raw.replace(/^Error:\s*/, '').trim()
73
+ if (cleaned) return cleaned
74
+ return fallback ?? tt('errors.fallback') ?? FALLBACK.fallback
75
+ }
@@ -158,8 +158,8 @@ function findPluginDir(ctx, name) {
158
158
 
159
159
  function scopes(ctx) {
160
160
  return [
161
- { scope: 'project', dir: ctx.root ? join(ctx.root, '.AgentWorkShop', 'plugins') : null, label: '项目级' },
162
- { scope: 'user', dir: ctx.commandsDir?.global ? join(ctx.home, 'plugins') : join(ctx.home, 'plugins'), label: '用户级' },
161
+ { scope: 'project', dir: ctx.root ? join(ctx.root, '.AgentWorkShop', 'plugins') : null, label: '内置示例' },
162
+ { scope: 'user', dir: ctx.commandsDir?.global ? join(ctx.home, 'plugins') : join(ctx.home, 'plugins'), label: '用户级扩展' },
163
163
  ]
164
164
  }
165
165
 
package/config.yml CHANGED
@@ -10,7 +10,7 @@
10
10
  app:
11
11
  name: AgentWorkShop
12
12
  title: AgentWorkShop
13
- version: 0.7.8
13
+ version: 0.7.9
14
14
  description: 基于 Nuxt 4 的配置驱动运行范式
15
15
 
16
16
  # 运行模式(dev/prod 实际由启动命令决定,此处仅作运行时展示)
@@ -25,6 +25,7 @@ export default {
25
25
  monitor: 'Runtime Monitor',
26
26
  plugins: 'Plugins',
27
27
  settings: 'Settings',
28
+ permissions: 'Permissions',
28
29
  },
29
30
  header: {
30
31
  collapse: 'Collapse menu',
@@ -225,6 +226,15 @@ export default {
225
226
  groupI18n: 'i18n',
226
227
  groupSecurity: 'Security',
227
228
  groupDaq: 'DAQ',
229
+ groupApi: 'API',
230
+ groupMemory: 'Memory',
231
+ groupOmp: 'Agent Harness',
232
+ groupHarness: 'Harness Adapters',
233
+ groupDcw: 'Write Control',
234
+ groupWorkshop: 'Workshop',
235
+ groupBackup: 'Backup',
236
+ groupRetention: 'Retention',
237
+ groupLog: 'Logs',
228
238
  server: {
229
239
  host: 'Listen address',
230
240
  devPort: 'Dev port',
@@ -1872,12 +1882,15 @@ export default {
1872
1882
  },
1873
1883
  plugins: {
1874
1884
  title: 'Plugins',
1875
- subtitle: 'Config-root plugins/ · toggles hot-reload instantly',
1885
+ subtitle: 'Built-in samples & user extensions · toggles hot-reload instantly',
1876
1886
  refresh: 'Refresh',
1877
1887
  enabled: 'Enabled',
1878
1888
  disabled: 'Disabled',
1879
- scopeProject: 'Project',
1880
- scopeUser: 'User',
1889
+ scopeProject: 'Built-in sample',
1890
+ scopeUser: 'User extension',
1891
+ scopeBuiltinHint: 'Built-in sample plugin: shipped with the project checkout (repo .AgentWorkShop/plugins), can be toggled',
1892
+ scopeUserHint: 'User extension plugin: lives in ~/.AgentWorkShop/plugins, created and maintained by you',
1893
+ loadFail: 'Failed to load plugin list',
1881
1894
  hasClient: 'Client enhancer',
1882
1895
  routes: 'API routes',
1883
1896
  empty: 'No plugins yet — aw plugin create <name>, or aw plugin enable to turn on examples',
@@ -1886,6 +1899,43 @@ export default {
1886
1899
  enableFail: 'Toggle failed',
1887
1900
  detail: 'Plugin detail',
1888
1901
  },
1902
+ errors: {
1903
+ http400: 'Invalid request, please check and retry',
1904
+ http401: 'Session expired, please sign in again',
1905
+ http403: 'Insufficient permission: this action requires an administrator',
1906
+ http404: 'Target not found or already removed',
1907
+ http409: 'Conflict: resource already exists or state does not allow it',
1908
+ http5xx: 'Server error, please retry later',
1909
+ network: 'Cannot reach the server, check network and service status',
1910
+ fallback: 'Action failed, please retry later',
1911
+ },
1912
+ permissions: {
1913
+ title: 'Permissions',
1914
+ subtitle: 'User × line three-state grants: none / read-only (DAQ) / operate (DAQ+DCW); users default to none',
1915
+ search: 'Search name or email',
1916
+ loadFail: 'Failed to load permission data',
1917
+ saveFail: 'Failed to save grants',
1918
+ saved: 'Saved {n} grant change(s)',
1919
+ colUser: 'User',
1920
+ colEmail: 'Email',
1921
+ colRole: 'Role',
1922
+ colStatus: 'Status',
1923
+ colChannels: 'Channels',
1924
+ colGrants: 'Line grants',
1925
+ colOps: 'Actions',
1926
+ active: 'Active',
1927
+ manage: 'Manage',
1928
+ detail: 'Permission detail',
1929
+ secProfile: 'Profile',
1930
+ secChannels: 'Created channels',
1931
+ noChannels: 'No channels created by this user',
1932
+ secMatrix: 'Line grant matrix',
1933
+ save: 'Save ({n})',
1934
+ matrixHint: 'none = line data is withheld server-side (invisible in UI & digital twin); read-only = DAQ read; operate = full DAQ read + DCW write.',
1935
+ none: 'None',
1936
+ readonly: 'Read-only',
1937
+ operate: 'Operate',
1938
+ },
1889
1939
  error: {
1890
1940
  backHome: 'Back to Home',
1891
1941
  lost: 'Page lost',
@@ -25,6 +25,7 @@ export default {
25
25
  monitor: '运行时监控',
26
26
  plugins: '插件管理',
27
27
  settings: '系统设置',
28
+ permissions: '权限管理',
28
29
  },
29
30
  header: {
30
31
  collapse: '折叠菜单',
@@ -225,6 +226,15 @@ export default {
225
226
  groupI18n: '国际化',
226
227
  groupSecurity: '安全',
227
228
  groupDaq: '数采',
229
+ groupApi: 'API',
230
+ groupMemory: '记忆系统',
231
+ groupOmp: 'Agent Harness',
232
+ groupHarness: 'Harness 接入',
233
+ groupDcw: '数控写控',
234
+ groupWorkshop: '车间运行',
235
+ groupBackup: '数据备份',
236
+ groupRetention: '数据保留',
237
+ groupLog: '日志',
228
238
  server: {
229
239
  host: '监听地址',
230
240
  devPort: '开发端口',
@@ -1871,12 +1881,15 @@ export default {
1871
1881
  },
1872
1882
  plugins: {
1873
1883
  title: '插件管理',
1874
- subtitle: '配置根 plugins/ 目录 · 启停即时热重载',
1884
+ subtitle: '内置示例与用户级扩展插件 · 启停即时热重载',
1875
1885
  refresh: '刷新',
1876
1886
  enabled: '已启用',
1877
1887
  disabled: '已停用',
1878
- scopeProject: '项目级',
1879
- scopeUser: '用户级',
1888
+ scopeProject: '内置示例',
1889
+ scopeUser: '用户级扩展',
1890
+ scopeBuiltinHint: '内置示例插件:随项目检出提供(仓库 .AgentWorkShop/plugins),可启停',
1891
+ scopeUserHint: '用户级扩展插件:位于 ~/.AgentWorkShop/plugins,由使用者自行创建维护',
1892
+ loadFail: '插件列表加载失败',
1880
1893
  hasClient: '浏览器增强',
1881
1894
  routes: 'API 路由',
1882
1895
  empty: '暂无插件 —— aw plugin create <name> 创建,或 aw plugin enable 开启示例',
@@ -1885,6 +1898,43 @@ export default {
1885
1898
  enableFail: '启停操作失败',
1886
1899
  detail: '插件详情',
1887
1900
  },
1901
+ errors: {
1902
+ http400: '请求参数有误,请检查后重试',
1903
+ http401: '登录已过期,请重新登录',
1904
+ http403: '权限不足:该操作需要管理员权限',
1905
+ http404: '目标不存在或已被删除',
1906
+ http409: '操作冲突:资源已存在或状态不允许',
1907
+ http5xx: '服务器内部错误,请稍后重试',
1908
+ network: '无法连接服务器,请检查网络与服务状态',
1909
+ fallback: '操作失败,请稍后重试',
1910
+ },
1911
+ permissions: {
1912
+ title: '权限管理',
1913
+ subtitle: '用户 × 产线三态授权:无权 / 仅查看(数采只读) / 可操控(数采+数控全量);普通用户默认无权',
1914
+ search: '搜索用户名或邮箱',
1915
+ loadFail: '权限数据加载失败',
1916
+ saveFail: '保存授权失败',
1917
+ saved: '已保存 {n} 项授权变更',
1918
+ colUser: '用户',
1919
+ colEmail: '邮箱',
1920
+ colRole: '角色',
1921
+ colStatus: '状态',
1922
+ colChannels: 'Channel 数',
1923
+ colGrants: '产线授权',
1924
+ colOps: '操作',
1925
+ active: '正常',
1926
+ manage: '授权管理',
1927
+ detail: '权限详情',
1928
+ secProfile: '基本信息',
1929
+ secChannels: '创建的 Channel',
1930
+ noChannels: '该用户尚未创建 Channel',
1931
+ secMatrix: '产线授权矩阵',
1932
+ save: '保存变更({n})',
1933
+ matrixHint: '无权=后端不返回该产线数据(前端/数字孪生不可见);仅查看=数采节点只读;可操控=数采读取+数控写控全量。',
1934
+ none: '无权',
1935
+ readonly: '仅查看',
1936
+ operate: '可操控',
1937
+ },
1888
1938
  error: {
1889
1939
  backHome: '返回首页',
1890
1940
  lost: '页面走失了',
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "agentworkshop",
3
- "version": "0.7.8",
3
+ "version": "0.7.11",
4
4
  "type": "module",
5
5
  "description": "AgentWorkShop 软件开发系统 - 基于 Nuxt 4 的配置驱动运行范式",
6
6
  "license": "PolyForm-Noncommercial-1.0.0",
@@ -0,0 +1,57 @@
1
+ // 验收阶段1:setup 门注册 admin 账户(凭据经 argv 传入,不落源码)
2
+ // 用法:node scripts/_dbg-acc-1-setup.mjs <base> <adminUser> <adminPass>
3
+ import puppeteer from 'puppeteer-core'
4
+ import { mkdirSync } from 'node:fs'
5
+
6
+ const BASE = process.argv[2] ?? 'http://127.0.0.1:3021'
7
+ const [USER, PASS] = [process.argv[3], process.argv[4]]
8
+ const EMAIL = `${USER}@awshop.local`
9
+ mkdirSync('.e2e-shots', { recursive: true })
10
+
11
+ const api = async (path, opts = {}) => {
12
+ const res = await fetch(`${BASE}${path}`, { ...opts, headers: { 'content-type': 'application/json', ...opts.headers } })
13
+ return { status: res.status, body: await res.json().catch(() => null) }
14
+ }
15
+
16
+ const s0 = await api('/api/users/setup-status')
17
+ console.log(s0.body?.data?.needsSetup === true ? '✔ setup 状态:true(零用户)' : `✖ setup 状态异常: ${JSON.stringify(s0.body)}`)
18
+
19
+ const browser = await puppeteer.launch({
20
+ executablePath: 'C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe',
21
+ headless: 'new',
22
+ args: ['--no-sandbox', '--disable-gpu', '--no-proxy-server', '--window-size=1600,1000'],
23
+ })
24
+ try {
25
+ const page = await browser.newPage()
26
+ await page.setViewport({ width: 1600, height: 1000, deviceScaleFactor: 1.25 })
27
+ await page.goto(`${BASE}/workshop`, { waitUntil: 'networkidle2', timeout: 60000 })
28
+ await page.waitForFunction(() => document.body.innerText.includes('创建管理员账号'), { timeout: 30000 })
29
+ console.log('✔ setup 登录门呈现')
30
+
31
+ await page.waitForSelector('.auth-card input')
32
+ const nameInput = (await page.$$('.auth-card input'))[0]
33
+ await nameInput.click({ clickCount: 3 })
34
+ await nameInput.type(USER)
35
+ const emailInput = await page.$('.auth-card input[type="email"]')
36
+ await emailInput.click({ clickCount: 3 })
37
+ await emailInput.type(EMAIL)
38
+ const pwInput = await page.$('.auth-card input[type="password"]')
39
+ await pwInput.click({ clickCount: 3 })
40
+ await pwInput.type(PASS)
41
+ await page.keyboard.press('Enter')
42
+ await page.waitForFunction(() => document.body.innerText.includes('Workshop'), { timeout: 30000 })
43
+ console.log('✔ 注册并自动进入项目')
44
+
45
+ // 登录态确认:me 返回 admin
46
+ const cookie = await page.cookies()
47
+ const token = cookie.find(c => c.name === 'token')?.value
48
+ const me = await api('/api/users/me', { headers: { authorization: `Bearer ${token}` } })
49
+ console.log(me.body?.data?.role === 'admin' ? `✔ me=${me.body.data.name} role=admin` : `✖ me 异常: ${JSON.stringify(me.body)}`)
50
+ await page.screenshot({ path: '.e2e-shots/acc-1-admin-entered.png' })
51
+
52
+ const s1 = await api('/api/users/setup-status')
53
+ console.log(s1.body?.data?.needsSetup === false ? '✔ setup 状态收敛:false' : '✖ setup 未收敛')
54
+ }
55
+ finally {
56
+ await browser.close()
57
+ }
@@ -0,0 +1,14 @@
1
+ // 诊断:settings 页文本结构
2
+ import puppeteer from 'puppeteer-core'
3
+ const browser = await puppeteer.launch({ executablePath: 'C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe', headless: 'new', args: ['--no-sandbox', '--no-proxy-server'] })
4
+ const page = await browser.newPage()
5
+ await page.setViewport({ width: 1600, height: 1000 })
6
+ const login = await fetch('http://127.0.0.1:3021/api/users/login', { method: 'POST', headers: { 'content-type': 'application/json' }, body: JSON.stringify({ email: 'admin@awshop.local', password: 'admin123' }) }).then(r => r.json())
7
+ await page.setCookie({ name: 'token', value: login.data.token, domain: '127.0.0.1', path: '/' })
8
+ await page.goto('http://127.0.0.1:3021/settings', { waitUntil: 'networkidle2', timeout: 60000 })
9
+ await new Promise(r => setTimeout(r, 2500))
10
+ console.log('BODY-HEAD:', await page.evaluate(() => document.body.innerText.slice(0, 400).replace(/\n/g, ' / ')))
11
+ console.log('TITLES:', await page.evaluate(() => [...document.querySelectorAll('.section-title,h3,h4,.ant-tabs-tab')].map(e => e.textContent?.trim()).filter(Boolean).slice(0, 30).join(' | ')))
12
+ console.log('HAS-DAQ-LABEL:', await page.evaluate(() => document.body.innerText.includes('节点采样默认间隔')))
13
+ console.log('RT-ROWS:', await page.evaluate(() => document.querySelectorAll('.rt-row').length))
14
+ await browser.close()
@@ -0,0 +1,81 @@
1
+ // 验收阶段2:前端设置页修改数采采样间隔 + 时序查询默认间隔,验证生效
2
+ // 用法:node scripts/_dbg-acc-2-intervals.mjs <base> <user> <pass> <samplingMs> <bucketMs>
3
+ import puppeteer from 'puppeteer-core'
4
+ import { mkdirSync } from 'node:fs'
5
+
6
+ const BASE = process.argv[2] ?? 'http://127.0.0.1:3021'
7
+ const [USER, PASS, SAMPLE_MS, BUCKET_MS] = [process.argv[3], process.argv[4], Number(process.argv[5]), Number(process.argv[6])]
8
+ const TAG = process.argv[7] ?? 'change'
9
+ mkdirSync('.e2e-shots', { recursive: true })
10
+
11
+ const api = async (path, opts = {}) => {
12
+ const res = await fetch(`${BASE}${path}`, { ...opts, headers: { 'content-type': 'application/json', ...opts.headers } })
13
+ return { status: res.status, body: await res.json().catch(() => null) }
14
+ }
15
+ const login = await api('/api/users/login', { method: 'POST', body: JSON.stringify({ email: `${USER}@awshop.local`, password: PASS }) })
16
+ const TOKEN = login.body?.data?.token
17
+ if (!TOKEN) { console.error('✖ admin 登录失败'); process.exit(1) }
18
+
19
+ const browser = await puppeteer.launch({
20
+ executablePath: 'C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe',
21
+ headless: 'new',
22
+ args: ['--no-sandbox', '--disable-gpu', '--no-proxy-server', '--window-size=1600,1000'],
23
+ })
24
+ try {
25
+ const page = await browser.newPage()
26
+ await page.setViewport({ width: 1600, height: 1000, deviceScaleFactor: 1.25 })
27
+ await page.setCookie({ name: 'token', value: TOKEN, domain: new URL(BASE).hostname, path: '/' })
28
+ await page.goto(`${BASE}/settings`, { waitUntil: 'networkidle2', timeout: 60000 })
29
+ await new Promise(r => setTimeout(r, 1200))
30
+ // 切到「运行配置」tab(runtime 设置区)
31
+ await page.evaluate(() => {
32
+ const tab = [...document.querySelectorAll('.ant-tabs-tab,[role=tab],button,.section-title')].find(e => (e.textContent ?? '').trim() === '运行配置')
33
+ tab?.dispatchEvent(new MouseEvent('click', { bubbles: true }))
34
+ })
35
+ await page.waitForFunction(() => document.body.innerText.includes('节点采样默认间隔'), { timeout: 30000 })
36
+ console.log('✔ 设置页呈现数采间隔项')
37
+
38
+ // 定位行:rt-row 内 rt-title 含目标文本 → 行内 .ant-input-number input
39
+ const setNumber = async (titleText, value) => {
40
+ const ok = await page.evaluate((t, v) => {
41
+ const rows = [...document.querySelectorAll('.rt-row')]
42
+ const row = rows.find(r => r.querySelector('.rt-title')?.textContent?.includes(t))
43
+ if (!row) return false
44
+ const input = row.querySelector('.ant-input-number input')
45
+ if (!input) return false
46
+ input.focus()
47
+ document.execCommand('selectAll', false, null)
48
+ document.execCommand('insertText', false, String(v))
49
+ input.dispatchEvent(new Event('input', { bubbles: true }))
50
+ input.blur()
51
+ input.dispatchEvent(new Event('change', { bubbles: true }))
52
+ return true
53
+ }, titleText, value)
54
+ if (!ok) throw new Error(`未找到输入框: ${titleText}`)
55
+ await new Promise(r => setTimeout(r, 400))
56
+ }
57
+ await setNumber('节点采样默认间隔', SAMPLE_MS)
58
+ console.log(`✔ 采样默认间隔 → ${SAMPLE_MS}ms`)
59
+ await setNumber('时序查询默认间隔', BUCKET_MS)
60
+ console.log(`✔ 时序查询默认间隔 → ${BUCKET_MS}ms`)
61
+
62
+ // 全局保存
63
+ await page.evaluate(() => {
64
+ const btn = [...document.querySelectorAll('button')].find(b => /保\s*存|Save/.test(b.textContent ?? ''))
65
+ btn?.click()
66
+ })
67
+ await new Promise(r => setTimeout(r, 1500))
68
+ await page.screenshot({ path: `.e2e-shots/acc-2-intervals-${TAG}.png` })
69
+ }
70
+ finally {
71
+ await browser.close()
72
+ }
73
+
74
+ // API 确认 effective 生效
75
+ const cfg = await api('/api/system/config', { headers: { authorization: `Bearer ${await (async () => TOKEN)()}` } })
76
+ const eff = cfg.body?.data?.effective ?? {}
77
+ const sampleOk = eff['daq.sampling.defaultIntervalMs'] === SAMPLE_MS
78
+ const bucketOk = eff['daq.query.defaultBucketMs'] === BUCKET_MS
79
+ console.log(sampleOk ? `✔ effective daq.sampling.defaultIntervalMs=${SAMPLE_MS}` : `✖ sampling=${JSON.stringify(eff['daq.sampling.defaultIntervalMs'])}`)
80
+ console.log(bucketOk ? `✔ effective daq.query.defaultBucketMs=${BUCKET_MS}` : `✖ bucket=${JSON.stringify(eff['daq.query.defaultBucketMs'])}`)
81
+ process.exit(sampleOk && bucketOk ? 0 : 1)
@@ -0,0 +1,48 @@
1
+ // 验收阶段3:数采中心可视化(列表状态 + 节点详情图表渲染)
2
+ // 用法:node scripts/_dbg-acc-3-daq.mjs <base> <user> <pass> <liveNodeId>
3
+ import puppeteer from 'puppeteer-core'
4
+ import { mkdirSync } from 'node:fs'
5
+
6
+ const BASE = process.argv[2] ?? 'http://127.0.0.1:3021'
7
+ const [USER, PASS, NODE_ID] = [process.argv[3], process.argv[4], process.argv[5]]
8
+ mkdirSync('.e2e-shots', { recursive: true })
9
+ const api = async (path, opts = {}) => {
10
+ const res = await fetch(`${BASE}${path}`, { ...opts, headers: { 'content-type': 'application/json', ...opts.headers } })
11
+ return { status: res.status, body: await res.json().catch(() => null) }
12
+ }
13
+ const login = await api('/api/users/login', { method: 'POST', body: JSON.stringify({ email: `${USER}@awshop.local`, password: PASS }) })
14
+ const TOKEN = login.body?.data?.token
15
+
16
+ const browser = await puppeteer.launch({
17
+ executablePath: 'C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe',
18
+ headless: 'new',
19
+ args: ['--no-sandbox', '--disable-gpu', '--no-proxy-server', '--window-size=1600,1000'],
20
+ })
21
+ try {
22
+ const page = await browser.newPage()
23
+ await page.setViewport({ width: 1600, height: 1000, deviceScaleFactor: 1.25 })
24
+ await page.setCookie({ name: 'token', value: TOKEN, domain: new URL(BASE).hostname, path: '/' })
25
+
26
+ // 1) 数采中心列表
27
+ await page.goto(`${BASE}/daq`, { waitUntil: 'networkidle2', timeout: 60000 })
28
+ await new Promise(r => setTimeout(r, 2500))
29
+ const listText = await page.evaluate(() => document.body.innerText)
30
+ const hasStats = /在线|online|节点/i.test(listText)
31
+ console.log(hasStats ? '✔ 数采中心列表渲染' : '✖ 数采中心列表空')
32
+ await page.screenshot({ path: '.e2e-shots/acc-3-daq-list.png' })
33
+
34
+ // 2) 节点详情 + 图表
35
+ await page.goto(`${BASE}/daq/${NODE_ID}`, { waitUntil: 'networkidle2', timeout: 60000 })
36
+ await new Promise(r => setTimeout(r, 6000)) // 等实时数据+图表渲染
37
+ const chart = await page.evaluate(() => ({
38
+ canvases: document.querySelectorAll('canvas').length,
39
+ svgs: document.querySelectorAll('svg').length,
40
+ text: document.body.innerText.slice(0, 200).replace(/\n/g, ' '),
41
+ }))
42
+ console.log(`图表渲染: canvas=${chart.canvases} svg=${chart.svgs}`)
43
+ console.log(chart.canvases + chart.svgs > 0 ? '✔ 图表已渲染' : '✖ 未见图表')
44
+ await page.screenshot({ path: '.e2e-shots/acc-3-daq-detail.png' })
45
+ }
46
+ finally {
47
+ await browser.close()
48
+ }
@@ -0,0 +1,92 @@
1
+ // 验收阶段4:多 Harness 团队 + 设备绑定 + 极简任务
2
+ // 用法:node scripts/_dbg-acc-4-team.mjs <base> <user> <pass>
3
+ import { mkdirSync } from 'node:fs'
4
+ const BASE = process.argv[2] ?? 'http://127.0.0.1:3021'
5
+ const [USER, PASS] = [process.argv[3], process.argv[4]]
6
+ mkdirSync('.e2e-shots', { recursive: true })
7
+ const stamp = Date.now().toString(36)
8
+
9
+ const api = async (path, opts = {}) => {
10
+ const res = await fetch(`${BASE}${path}`, { ...opts, headers: { 'content-type': 'application/json', ...opts.headers } })
11
+ return { status: res.status, body: await res.json().catch(() => null) }
12
+ }
13
+ const login = await api('/api/users/login', { method: 'POST', body: JSON.stringify({ email: `${USER}@awshop.local`, password: PASS }) })
14
+ const H = { authorization: `Bearer ${login.body.data.token}`, 'content-type': 'application/json' }
15
+ const post = (p, b) => api(p, { method: 'POST', headers: H, body: JSON.stringify(b) })
16
+
17
+ // 1) 三个不同 harness 的 agent 模板
18
+ const mk = async (name, harness) => {
19
+ const r = await post('/api/workshop/agents', { name, harness, visibility: 'private' })
20
+ if (r.status !== 0 && r.body?.code !== 0) throw new Error(`建 agent ${name}: ${JSON.stringify(r.body)}`)
21
+ console.log(`✔ agent 模板 ${name} harness=${harness} id=${r.body.data.id.slice(0, 10)}`)
22
+ return r.body.data
23
+ }
24
+ const leadTpl = await mk(`acc-lead-${stamp}`, 'omp')
25
+ const wMock = await mk(`acc-w-mock-${stamp}`, 'mock')
26
+ const wCodex = await mk(`acc-w-codex-${stamp}`, 'codex')
27
+
28
+ // 2) team + 成员
29
+ const team = await post('/api/workshop/teams', { name: `验收团队-${stamp}`, description: '多 harness 验收' })
30
+ const teamId = team.body.data.id
31
+ console.log('✔ team 创建', teamId.slice(0, 10))
32
+ for (const [tpl, role] of [[leadTpl, 'lead'], [wMock, 'worker'], [wCodex, 'worker']]) {
33
+ const r = await post(`/api/workshop/teams/${teamId}/members`, { agentId: tpl.id, role })
34
+ console.log(`${r.body?.code === 0 ? '✔' : '✖'} member ${tpl.name} role=${role}`, r.body?.code === 0 ? '' : JSON.stringify(r.body))
35
+ }
36
+
37
+ // 3) channel(不带 lead,由 deploy 带入) + deploy
38
+ const ch = await post('/api/workshop/channels', { name: `验收频道-${stamp}`, description: '多 harness 团队验收' })
39
+ const channelId = ch.body.data.channelId ?? ch.body.data.id
40
+ console.log('✔ channel 创建', channelId.slice(0, 10))
41
+ const dep = await post(`/api/workshop/teams/${teamId}/deploy`, { channelId })
42
+ if (dep.body?.code !== 0) { console.error('✖ deploy 失败:', JSON.stringify(dep.body)); process.exit(1) }
43
+ const deployed = dep.body.data
44
+ console.log('✔ team 部署到 channel:', JSON.stringify(deployed).slice(0, 200))
45
+
46
+ // 部署后实例 id(克隆体):channel agents 列表
47
+ const ags = await api(`/api/workshop/channels/${channelId}/agents`, { headers: H })
48
+ const chanAgents = ags.body?.data ?? []
49
+ const find = (harness) => chanAgents.find(a => a.harness === harness)
50
+ const leadInst = find('omp')
51
+ const mockInst = find('mock')
52
+ const codexInst = find('codex')
53
+ console.log('实例:', [leadInst, mockInst, codexInst].map(a => a ? `${a.name}(${a.harness})=${a.id.slice(0, 10)}` : '(缺)').join(' '))
54
+
55
+ // 4) 设备绑定:worker ↔ daq 节点 / worker ↔ dcw 写控节点
56
+ for (const [inst, nodeId, kind] of [[mockInst, 'dn-43f55a32', 'daq'], [codexInst, 'dw-322b1978', 'dcw']]) {
57
+ if (!inst) { console.log(`✖ 绑定跳过:实例缺失 kind=${kind}`); continue }
58
+ const r = await post('/api/workshop/agent-tools/bindings', { agentId: inst.id, nodeId, kind, mode: 'auto' })
59
+ console.log(`${r.body?.code === 0 ? '✔' : '✖'} 绑定 ${inst.name}(${kind}) ↔ ${nodeId}`, r.body?.code === 0 ? '' : JSON.stringify(r.body))
60
+ }
61
+ const bl = await api('/api/workshop/agent-tools/bindings', { headers: H })
62
+ const mine = (bl.body?.data?.bindings ?? []).filter(b => [mockInst?.id, codexInst?.id].includes(b.agentId))
63
+ console.log(`✔ 绑定清单(${mine.length} 条新建):`, mine.map(b => `${b.kind}:${b.nodeId}`).join(', '))
64
+
65
+ // 5) 极简任务(省 token):发消息给 lead,要求派发给各 worker 单句回复
66
+ const msg = await post(`/api/workshop/channels/${channelId}/messages`, {
67
+ toAgentId: leadInst?.id,
68
+ text: '团队自检任务:请把下面这句话原样转交给每个 worker 执行——「用一句不超过 15 字的话报告你的引擎名并说 ok,不要调用任何工具」。收齐后向人类汇总。',
69
+ fromLabel: 'admin',
70
+ priority: 'task',
71
+ })
72
+ console.log(`${msg.body?.code === 0 ? '✔' : '✖'} 任务消息下发`, msg.body?.code === 0 ? '' : JSON.stringify(msg.body))
73
+
74
+ // 6) 轮询 channel 消息(最多 90s),统计各 harness 回复
75
+ console.log('等待 worker 回复(轮询 90s)...')
76
+ const seen = new Map()
77
+ for (let i = 0; i < 30; i++) {
78
+ await new Promise(r => setTimeout(r, 3000))
79
+ const ms = await api(`/api/workshop/channels/${channelId}/messages?limit=50`, { headers: H })
80
+ const items = ms.body?.data?.items ?? ms.body?.data ?? []
81
+ for (const m of (Array.isArray(items) ? items : [])) {
82
+ if (i === 0 && seen.size === 0) console.log(' [msg 样例]', JSON.stringify(m).slice(0, 220))
83
+ const from = m.fromAgentName ?? m.fromAgentId ?? m.from ?? '?'
84
+ if (!seen.has(from)) seen.set(from, String(m.text ?? '').slice(0, 60))
85
+ }
86
+ const harnessHits = ['mock', 'omp', 'codex'].filter(h => [...seen.keys()].some(k => String(k).toLowerCase().includes(h)) || [...seen.values()].some(v => v.toLowerCase().includes(h)))
87
+ process.stdout.write(` t=${(i + 1) * 3}s 发言者=${seen.size} 命中=${harnessHits.join(',')}\r`)
88
+ if (harnessHits.length >= 2 && seen.size >= 3) break
89
+ }
90
+ console.log('')
91
+ for (const [k, v] of seen) console.log(` [${k}] ${v}`)
92
+ console.log('CHANNEL_ID=' + channelId)