agentworkshop 0.7.51 → 0.7.53

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 (482) hide show
  1. package/.AgentWorkShop/prompts/host-tools.json +2097 -1955
  2. package/.output/.AgentWorkShop/prompts/host-tools.json +2097 -1955
  3. package/.output/.AgentWorkShop/schema.json +2 -0
  4. package/.output/nitro.json +1 -1
  5. package/.output/public/_nuxt/{D0ldVwl-.js → 77DRSnQv.js} +1 -1
  6. package/.output/public/_nuxt/8oRmGaAV.js +1 -0
  7. package/.output/public/_nuxt/{BPou3U7b.js → BLnLjzka.js} +1 -1
  8. package/.output/public/_nuxt/{CFQyYMEn2.js → BSdJTnk12.js} +1 -1
  9. package/.output/public/_nuxt/{C4lagVdN2.js → BUD1CNvB2.js} +1 -1
  10. package/.output/public/_nuxt/BXR3tgEk.js +1 -0
  11. package/.output/public/_nuxt/{B9QzrmgE.js → BhlRInVa.js} +1 -1
  12. package/.output/public/_nuxt/{DhFv8S2Z.js → BkfA3BbD.js} +1 -1
  13. package/.output/public/_nuxt/{ChGuLxwW2.js → BpcQDwKM2.js} +1 -1
  14. package/.output/public/_nuxt/{DQMbdg4t.js → BwlGxRxA.js} +1 -1
  15. package/.output/public/_nuxt/{Bt2ZL5332.js → C4sQKuhk2.js} +1 -1
  16. package/.output/public/_nuxt/{zh-S_7rN2.js → CBUIODly2.js} +1 -1
  17. package/.output/public/_nuxt/CR-ILcRu2.js +1 -0
  18. package/.output/public/_nuxt/CZLnEnbE.js +14 -0
  19. package/.output/public/_nuxt/{jRTz0hjN2.js → Chxx-DIE2.js} +1 -1
  20. package/.output/public/_nuxt/{BGAaKBeo2.js → CjwxhpwR2.js} +1 -1
  21. package/.output/public/_nuxt/{D89BUtx6.js → CvGYm7w8.js} +1 -1
  22. package/.output/public/_nuxt/{B9BmiUil.js → DAGuPgXa.js} +1 -1
  23. package/.output/public/_nuxt/{DefDtlKK.js → DE6H1HdJ.js} +1 -1
  24. package/.output/public/_nuxt/{DzfVS8N72.js → DFhyhDGa2.js} +1 -1
  25. package/.output/public/_nuxt/{BXx9AxdF2.js → DSqMyLCV2.js} +1 -1
  26. package/.output/public/_nuxt/{asmJ99nX2.js → DV5joWTn2.js} +1 -1
  27. package/.output/public/_nuxt/{DClNt1uS.js → DVOR2pWg.js} +1 -1
  28. package/.output/public/_nuxt/DWsgRq2c.js +1 -0
  29. package/.output/public/_nuxt/{CU-mhG0-.js → DZDi8inD.js} +1 -1
  30. package/.output/public/_nuxt/{DMYYS5sK.js → Dep0Hc9w.js} +1 -1
  31. package/.output/public/_nuxt/{JAM4aNC_.js → DffgG8vT.js} +1 -1
  32. package/.output/public/_nuxt/{CFQSjB1h.js → DlCktWDT.js} +1 -1
  33. package/.output/public/_nuxt/{CP0I2l-6.js → DmzmgYHb.js} +1 -1
  34. package/.output/public/_nuxt/PluginSlot.CGH0vb95.css +1 -0
  35. package/.output/public/_nuxt/{lWYQbIR3.js → WmMwIS4y.js} +1 -1
  36. package/.output/public/_nuxt/{_id_.DamiFT0Q.css → _id_.rdGx-UDx.css} +1 -1
  37. package/.output/public/_nuxt/{BgEDwFMf.js → _kUzq9VF.js} +1 -1
  38. package/.output/public/_nuxt/_wsId_.XjmieZaJ.css +1 -0
  39. package/.output/public/_nuxt/{B7jlMWsz.js → aV6YPjg0.js} +1 -1
  40. package/.output/public/_nuxt/builds/latest.json +1 -1
  41. package/.output/public/_nuxt/builds/meta/5ccc21c2-aba0-4b63-9a13-410e0569e345.json +1 -0
  42. package/.output/public/_nuxt/channel-templates.DkNZg-lF.css +1 -0
  43. package/.output/public/_nuxt/{default.CXb_zoN6.css → default.CyLpQD1C.css} +1 -1
  44. package/.output/public/_nuxt/o9rJf00k.js +1 -0
  45. package/.output/public/_nuxt/sl1EEoCr2.js +21 -0
  46. package/.output/public/robots.txt +3 -0
  47. package/.output/server/chunks/_/binding-authz.mjs +1 -1
  48. package/.output/server/chunks/_/character-asset.repo.mjs +1 -1
  49. package/.output/server/chunks/_/entity.mjs +1 -1
  50. package/.output/server/chunks/_/host-bindings.mjs +1 -1
  51. package/.output/server/chunks/_/nitro.mjs +2268 -1501
  52. package/.output/server/chunks/_/nitro.mjs.map +1 -1
  53. package/.output/server/chunks/_/scene-layout.repo.mjs +1 -1
  54. package/.output/server/chunks/build/{PluginSlot-D2WUZgbp.mjs → PluginSlot-CT4YaNrB.mjs} +5 -5
  55. package/.output/server/chunks/build/{PluginSlot-D2WUZgbp.mjs.map → PluginSlot-CT4YaNrB.mjs.map} +1 -1
  56. package/.output/server/chunks/build/TownView-fP9BiALv.mjs +1 -1
  57. package/.output/server/chunks/build/{_id_-BUpQSlzo.mjs → _id_-CK-QFrDV.mjs} +55 -51
  58. package/.output/server/chunks/build/_id_-CK-QFrDV.mjs.map +1 -0
  59. package/.output/server/chunks/build/{_wsId_-DPy2BXRd.mjs → _wsId_-DdqXzycE.mjs} +320 -202
  60. package/.output/server/chunks/build/{_wsId_-DPy2BXRd.mjs.map → _wsId_-DdqXzycE.mjs.map} +1 -1
  61. package/.output/server/chunks/build/{agents-CDLcboCv.mjs → agents-DqICy4AL.mjs} +6 -6
  62. package/.output/server/chunks/build/{agents-CDLcboCv.mjs.map → agents-DqICy4AL.mjs.map} +1 -1
  63. package/.output/server/chunks/build/{channel-templates-DjEsj0_v.mjs → channel-templates-gdCLajKy.mjs} +114 -25
  64. package/.output/server/chunks/build/channel-templates-gdCLajKy.mjs.map +1 -0
  65. package/.output/server/chunks/build/daq-N69AOtgw.mjs +1 -1
  66. package/.output/server/chunks/build/dcw-CN9d3Rs7.mjs +1 -1
  67. package/.output/server/chunks/build/{default-DCf9tn1i.mjs → default-CXUe4HL7.mjs} +65 -62
  68. package/.output/server/chunks/build/{default-DCf9tn1i.mjs.map → default-CXUe4HL7.mjs.map} +1 -1
  69. package/.output/server/chunks/build/{pages-rZKH72eC.mjs → pages-CRMeXrxG.mjs} +3 -3
  70. package/.output/server/chunks/build/{pages-rZKH72eC.mjs.map → pages-CRMeXrxG.mjs.map} +1 -1
  71. package/.output/server/chunks/build/{plugins-DSka7-vS.mjs → plugins-NAS9MQ5r.mjs} +2 -2
  72. package/.output/server/chunks/build/{plugins-DSka7-vS.mjs.map → plugins-NAS9MQ5r.mjs.map} +1 -1
  73. package/.output/server/chunks/build/{schedules-lo4bfgVt.mjs → schedules-D8vYHgQ5.mjs} +2 -2
  74. package/.output/server/chunks/build/{schedules-lo4bfgVt.mjs.map → schedules-D8vYHgQ5.mjs.map} +1 -1
  75. package/.output/server/chunks/build/{settings-CAJWvul5.mjs → settings-B7HA-sdb.mjs} +3 -3
  76. package/.output/server/chunks/build/{settings-CAJWvul5.mjs.map → settings-B7HA-sdb.mjs.map} +1 -1
  77. package/.output/server/chunks/build/{teams-DBBvIToa.mjs → teams-wM-MdLv9.mjs} +8 -8
  78. package/.output/server/chunks/build/{teams-DBBvIToa.mjs.map → teams-wM-MdLv9.mjs.map} +1 -1
  79. package/.output/server/chunks/build/types-D6J7slEa.mjs +1 -1
  80. package/.output/server/chunks/build/{useAgentHarnessOptions-D6SJ_uUr.mjs → useAgentHarnessOptions-BnFCh23W.mjs} +2 -2
  81. package/.output/server/chunks/build/{useAgentHarnessOptions-D6SJ_uUr.mjs.map → useAgentHarnessOptions-BnFCh23W.mjs.map} +1 -1
  82. package/.output/server/chunks/build/{useAgentTemplateActions-CdG4g_PF.mjs → useAgentTemplateActions-DsBRUQni.mjs} +2 -2
  83. package/.output/server/chunks/build/{useAgentTemplateActions-CdG4g_PF.mjs.map → useAgentTemplateActions-DsBRUQni.mjs.map} +1 -1
  84. package/.output/server/chunks/build/{useAgentTemplateForm-a5y-N5sB.mjs → useAgentTemplateForm-DzQ_t2Ue.mjs} +2 -2
  85. package/.output/server/chunks/build/{useAgentTemplateForm-a5y-N5sB.mjs.map → useAgentTemplateForm-DzQ_t2Ue.mjs.map} +1 -1
  86. package/.output/server/chunks/build/{useAgentTemplatesCatalog-pBVcUuN3.mjs → useAgentTemplatesCatalog-Q7LgG1Af.mjs} +2 -2
  87. package/.output/server/chunks/build/{useAgentTemplatesCatalog-pBVcUuN3.mjs.map → useAgentTemplatesCatalog-Q7LgG1Af.mjs.map} +1 -1
  88. package/.output/server/chunks/build/useDaqAddNode-kW7uTSMQ.mjs +1 -1
  89. package/.output/server/chunks/build/useDaqDetailNode-D_vhG0jF.mjs +1 -1
  90. package/.output/server/chunks/build/useDaqDetailParams-JfqHvTxr.mjs +1 -1
  91. package/.output/server/chunks/build/useDaqFilters-BUQtZ82a.mjs +1 -1
  92. package/.output/server/chunks/build/useDaqStream-wOxZcMDA.mjs +1 -1
  93. package/.output/server/chunks/build/useDaqTemplates-BqQRdrIm.mjs +1 -1
  94. package/.output/server/chunks/build/{useDashboardData-Do_Vsepa.mjs → useDashboardData-DWJ6vHjm.mjs} +2 -2
  95. package/.output/server/chunks/build/{useDashboardData-Do_Vsepa.mjs.map → useDashboardData-DWJ6vHjm.mjs.map} +1 -1
  96. package/.output/server/chunks/build/useDcwAddNode-C1HDP3yG.mjs +1 -1
  97. package/.output/server/chunks/build/useDcwStream-D04kCV3J.mjs +1 -1
  98. package/.output/server/chunks/build/{useTeamActions-C4n-taBk.mjs → useTeamActions-BOLQkYxg.mjs} +2 -2
  99. package/.output/server/chunks/build/{useTeamActions-C4n-taBk.mjs.map → useTeamActions-BOLQkYxg.mjs.map} +1 -1
  100. package/.output/server/chunks/build/{useTeamAddMemberDialog-Cp_z3nMa.mjs → useTeamAddMemberDialog-BCgrLPxI.mjs} +2 -2
  101. package/.output/server/chunks/build/{useTeamAddMemberDialog-Cp_z3nMa.mjs.map → useTeamAddMemberDialog-BCgrLPxI.mjs.map} +1 -1
  102. package/.output/server/chunks/build/{useTeamCreateDialog-C8LKUoe2.mjs → useTeamCreateDialog-CJk40LqS.mjs} +2 -2
  103. package/.output/server/chunks/build/{useTeamCreateDialog-C8LKUoe2.mjs.map → useTeamCreateDialog-CJk40LqS.mjs.map} +1 -1
  104. package/.output/server/chunks/build/{useTeamDeployDialog-wdBVsNWY.mjs → useTeamDeployDialog-49hdUXQP.mjs} +2 -2
  105. package/.output/server/chunks/build/{useTeamDeployDialog-wdBVsNWY.mjs.map → useTeamDeployDialog-49hdUXQP.mjs.map} +1 -1
  106. package/.output/server/chunks/build/{useTeamPluginDialog-CIk8G8nI.mjs → useTeamPluginDialog-Dh-QOoiU.mjs} +2 -2
  107. package/.output/server/chunks/build/{useTeamPluginDialog-CIk8G8nI.mjs.map → useTeamPluginDialog-Dh-QOoiU.mjs.map} +1 -1
  108. package/.output/server/chunks/build/{useTeamsCatalog-D6TULzmS.mjs → useTeamsCatalog-HBSyKt5P.mjs} +2 -2
  109. package/.output/server/chunks/build/{useTeamsCatalog-D6TULzmS.mjs.map → useTeamsCatalog-HBSyKt5P.mjs.map} +1 -1
  110. package/.output/server/chunks/build/{useWorkshopApi-B1B9vd4m.mjs → useWorkshopApi-C9sTYu1F.mjs} +13 -2
  111. package/.output/server/chunks/build/useWorkshopApi-C9sTYu1F.mjs.map +1 -0
  112. package/.output/server/chunks/build/useWorkshopWs-Bm80bLn7.mjs.map +1 -1
  113. package/.output/server/chunks/routes/api/index.get.mjs +1 -1
  114. package/.output/server/chunks/routes/api/index.post.mjs +14 -3
  115. package/.output/server/chunks/routes/api/index.post.mjs.map +1 -1
  116. package/.output/server/chunks/routes/api/mcp/workshop.mjs +43 -14
  117. package/.output/server/chunks/routes/api/mcp/workshop.mjs.map +1 -1
  118. package/.output/server/chunks/routes/api/metrics.mjs +2 -0
  119. package/.output/server/chunks/routes/api/metrics.mjs.map +1 -1
  120. package/.output/server/chunks/routes/api/plugins/_name/_...path_.mjs +1 -1
  121. package/.output/server/chunks/routes/api/plugins/_name/_...path_.mjs.map +1 -1
  122. package/.output/server/chunks/routes/api/system/backup/list.get.mjs +47 -0
  123. package/.output/server/chunks/routes/api/system/backup/list.get.mjs.map +1 -0
  124. package/.output/server/chunks/routes/api/system/backup/run.post.mjs +35 -0
  125. package/.output/server/chunks/routes/api/system/backup/run.post.mjs.map +1 -0
  126. package/.output/server/chunks/routes/api/system/config-groups/_id_.delete.mjs +1 -1
  127. package/.output/server/chunks/routes/api/system/config-groups/_id_.patch.mjs +1 -1
  128. package/.output/server/chunks/routes/api/system/index.get.mjs +1 -1
  129. package/.output/server/chunks/routes/api/system/index.patch.mjs +15 -4
  130. package/.output/server/chunks/routes/api/system/index.patch.mjs.map +1 -1
  131. package/.output/server/chunks/routes/api/system/index.post.mjs +1 -1
  132. package/.output/server/chunks/routes/api/system/index2.get.mjs +1 -1
  133. package/.output/server/chunks/routes/api/system/monitor/terminal/ws.mjs +1 -1
  134. package/.output/server/chunks/routes/api/system/monitor/terminate.post.mjs +1 -1
  135. package/.output/server/chunks/routes/api/system/settings/events.get.mjs +1 -1
  136. package/.output/server/chunks/routes/api/system/settings/reset.post.mjs +15 -3
  137. package/.output/server/chunks/routes/api/system/settings/reset.post.mjs.map +1 -1
  138. package/.output/server/chunks/routes/api/system/timezone.get.mjs +1 -1
  139. package/.output/server/chunks/routes/api/users/_id_.delete.mjs +14 -3
  140. package/.output/server/chunks/routes/api/users/_id_.delete.mjs.map +1 -1
  141. package/.output/server/chunks/routes/api/users/_id_.get.mjs +1 -1
  142. package/.output/server/chunks/routes/api/users/_id_.put.mjs +14 -3
  143. package/.output/server/chunks/routes/api/users/_id_.put.mjs.map +1 -1
  144. package/.output/server/chunks/routes/api/users/index.get.mjs +1 -1
  145. package/.output/server/chunks/routes/api/users/index.post.mjs +1 -1
  146. package/.output/server/chunks/routes/api/users/login.post.mjs +3 -2
  147. package/.output/server/chunks/routes/api/users/login.post.mjs.map +1 -1
  148. package/.output/server/chunks/routes/api/users/logout.post.mjs +1 -1
  149. package/.output/server/chunks/routes/api/users/me.get.mjs +1 -1
  150. package/.output/server/chunks/routes/api/users/register.post.mjs +4 -1
  151. package/.output/server/chunks/routes/api/users/register.post.mjs.map +1 -1
  152. package/.output/server/chunks/routes/api/users/setup-status.get.mjs +1 -1
  153. package/.output/server/chunks/routes/api/users/tokens/_id/token.get.mjs +1 -1
  154. package/.output/server/chunks/routes/api/users/tokens/_id_.delete.mjs +1 -1
  155. package/.output/server/chunks/routes/api/users/tokens/_id_.patch.mjs +1 -1
  156. package/.output/server/chunks/routes/api/workshop/a2a/_agentId/index.get.mjs +1 -1
  157. package/.output/server/chunks/routes/api/workshop/a2a/_agentId/index.post.mjs +19 -15
  158. package/.output/server/chunks/routes/api/workshop/a2a/_agentId/index.post.mjs.map +1 -1
  159. package/.output/server/chunks/routes/api/workshop/a2a/send.post.mjs +1 -1
  160. package/.output/server/chunks/routes/api/workshop/agent-tools/approvals/_id/decide.post.mjs +1 -1
  161. package/.output/server/chunks/routes/api/workshop/agent-tools/bindings/_id_.delete.mjs +1 -1
  162. package/.output/server/chunks/routes/api/workshop/agent-tools/bindings/_id_.patch.mjs +1 -1
  163. package/.output/server/chunks/routes/api/workshop/agent-tools/bindings/grant.post.mjs +54 -0
  164. package/.output/server/chunks/routes/api/workshop/agent-tools/bindings/grant.post.mjs.map +1 -0
  165. package/.output/server/chunks/routes/api/workshop/agent-tools/bindings/revoke.post.mjs +51 -0
  166. package/.output/server/chunks/routes/api/workshop/agent-tools/bindings/revoke.post.mjs.map +1 -0
  167. package/.output/server/chunks/routes/api/workshop/agent-tools/index.get.mjs +1 -1
  168. package/.output/server/chunks/routes/api/workshop/agent-tools/index.post.mjs +1 -1
  169. package/.output/server/chunks/routes/api/workshop/agent-tools/index2.get.mjs +1 -1
  170. package/.output/server/chunks/routes/api/workshop/agent-tools/invoke.post.mjs +1 -1
  171. package/.output/server/chunks/routes/api/workshop/agent-tools/list.get.mjs +1 -1
  172. package/.output/server/chunks/routes/api/workshop/agents/_id_.patch.mjs +1 -1
  173. package/.output/server/chunks/routes/api/workshop/agents/subscribe.post.mjs +1 -1
  174. package/.output/server/chunks/routes/api/workshop/aml/datasets/_id/preview.get.mjs +1 -1
  175. package/.output/server/chunks/routes/api/workshop/aml/datasets/_id_.delete.mjs +1 -1
  176. package/.output/server/chunks/routes/api/workshop/aml/datasets/_id_.get.mjs +1 -1
  177. package/.output/server/chunks/routes/api/workshop/aml/datasets/_id_.patch.mjs +1 -1
  178. package/.output/server/chunks/routes/api/workshop/aml/entities/prune.post.mjs +1 -1
  179. package/.output/server/chunks/routes/api/workshop/aml/env/recheck.post.mjs +1 -1
  180. package/.output/server/chunks/routes/api/workshop/aml/env/uv.post.mjs +1 -1
  181. package/.output/server/chunks/routes/api/workshop/aml/env/venv.post.mjs +1 -1
  182. package/.output/server/chunks/routes/api/workshop/aml/index.get.mjs +1 -1
  183. package/.output/server/chunks/routes/api/workshop/aml/index.post.mjs +1 -1
  184. package/.output/server/chunks/routes/api/workshop/aml/index2.post.mjs +1 -1
  185. package/.output/server/chunks/routes/api/workshop/aml/index3.get.mjs +1 -1
  186. package/.output/server/chunks/routes/api/workshop/aml/index3.post.mjs +1 -1
  187. package/.output/server/chunks/routes/api/workshop/aml/index4.get.mjs +1 -1
  188. package/.output/server/chunks/routes/api/workshop/aml/index5.get.mjs +1 -1
  189. package/.output/server/chunks/routes/api/workshop/aml/index6.get.mjs +1 -1
  190. package/.output/server/chunks/routes/api/workshop/aml/index7.get.mjs +1 -1
  191. package/.output/server/chunks/routes/api/workshop/aml/jobs/_id/cancel.post.mjs +1 -1
  192. package/.output/server/chunks/routes/api/workshop/aml/jobs/_id/logs.get.mjs +1 -1
  193. package/.output/server/chunks/routes/api/workshop/aml/jobs/_id/retry.post.mjs +1 -1
  194. package/.output/server/chunks/routes/api/workshop/aml/jobs/_id_.delete.mjs +1 -1
  195. package/.output/server/chunks/routes/api/workshop/aml/jobs/_id_.get.mjs +1 -1
  196. package/.output/server/chunks/routes/api/workshop/aml/models/_id/predict.post.mjs +1 -1
  197. package/.output/server/chunks/routes/api/workshop/aml/models/_id/promote.post.mjs +1 -1
  198. package/.output/server/chunks/routes/api/workshop/aml/models/_id_.delete.mjs +1 -1
  199. package/.output/server/chunks/routes/api/workshop/aml/models/_id_.patch.mjs +1 -1
  200. package/.output/server/chunks/routes/api/workshop/aml/training-plans/_id/train.post.mjs +1 -1
  201. package/.output/server/chunks/routes/api/workshop/aml/training-plans/_id_.delete.mjs +1 -1
  202. package/.output/server/chunks/routes/api/workshop/aml/training-plans/_id_.patch.mjs +1 -1
  203. package/.output/server/chunks/routes/api/workshop/aml/twin/providers.get.mjs +1 -1
  204. package/.output/server/chunks/routes/api/workshop/approvals/_id/decide.post.mjs +1 -1
  205. package/.output/server/chunks/routes/api/workshop/assets/index.get.mjs +1 -1
  206. package/.output/server/chunks/routes/api/workshop/assets/index.post.mjs +1 -1
  207. package/.output/server/chunks/routes/api/workshop/assets/index2.post.mjs +1 -1
  208. package/.output/server/chunks/routes/api/workshop/audit.get.mjs +1 -1
  209. package/.output/server/chunks/routes/api/workshop/caller.mjs +1 -1
  210. package/.output/server/chunks/routes/api/workshop/channel-templates/_id/instantiate.post.mjs +10 -4
  211. package/.output/server/chunks/routes/api/workshop/channel-templates/_id/instantiate.post.mjs.map +1 -1
  212. package/.output/server/chunks/routes/api/workshop/channel-templates/_id_.patch.mjs +1 -1
  213. package/.output/server/chunks/routes/api/workshop/channel-templates/from-channel.post.mjs +1 -1
  214. package/.output/server/chunks/routes/api/workshop/channels/_id/activate.post.mjs +1 -1
  215. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/index.post.mjs +1 -1
  216. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/memories/search.post.mjs +1 -1
  217. package/.output/server/chunks/routes/api/workshop/channels/_id/chat/index.get.mjs +1 -1
  218. package/.output/server/chunks/routes/api/workshop/channels/_id/chat/index.post.mjs +1 -1
  219. package/.output/server/chunks/routes/api/workshop/channels/_id/events.get.mjs +1 -1
  220. package/.output/server/chunks/routes/api/workshop/channels/_id/index.post.mjs +1 -1
  221. package/.output/server/chunks/routes/api/workshop/channels/_id/index.put.mjs +1 -1
  222. package/.output/server/chunks/routes/api/workshop/channels/_id/index2.post.mjs +1 -1
  223. package/.output/server/chunks/routes/api/workshop/channels/_id/index3.post.mjs +1 -1
  224. package/.output/server/chunks/routes/api/workshop/channels/_id/index4.get.mjs +1 -1
  225. package/.output/server/chunks/routes/api/workshop/channels/_id/index4.post.mjs +1 -1
  226. package/.output/server/chunks/routes/api/workshop/channels/_id/index5.get.mjs +1 -1
  227. package/.output/server/chunks/routes/api/workshop/channels/_id/line.put.mjs +37 -0
  228. package/.output/server/chunks/routes/api/workshop/channels/_id/line.put.mjs.map +1 -0
  229. package/.output/server/chunks/routes/api/workshop/channels/_id/terminals.get.mjs +1 -1
  230. package/.output/server/chunks/routes/api/workshop/channels/_id/twin-profile.get.mjs +1 -1
  231. package/.output/server/chunks/routes/api/workshop/channels/_id/twin-profile.patch.mjs +1 -1
  232. package/.output/server/chunks/routes/api/workshop/channels/index.get.mjs +1 -1
  233. package/.output/server/chunks/routes/api/workshop/channels/index.patch.mjs +1 -1
  234. package/.output/server/chunks/routes/api/workshop/channels.post.mjs +4 -4
  235. package/.output/server/chunks/routes/api/workshop/daq/_id/bind.post.mjs +1 -1
  236. package/.output/server/chunks/routes/api/workshop/daq/_id/bindings.put.mjs +1 -1
  237. package/.output/server/chunks/routes/api/workshop/daq/_id/frames/content.get.mjs +1 -1
  238. package/.output/server/chunks/routes/api/workshop/daq/_id/frames.get.mjs +1 -1
  239. package/.output/server/chunks/routes/api/workshop/daq/_id/samples.get.mjs +1 -1
  240. package/.output/server/chunks/routes/api/workshop/daq/_id/test.post.mjs +1 -1
  241. package/.output/server/chunks/routes/api/workshop/daq/_id_.delete.mjs +1 -1
  242. package/.output/server/chunks/routes/api/workshop/daq/_id_.patch.mjs +1 -1
  243. package/.output/server/chunks/routes/api/workshop/daq/alarms/_id/ack.post.mjs +1 -1
  244. package/.output/server/chunks/routes/api/workshop/daq/alarms.get.mjs +1 -1
  245. package/.output/server/chunks/routes/api/workshop/daq/controller.post.mjs +1 -1
  246. package/.output/server/chunks/routes/api/workshop/daq/index.post.mjs +1 -1
  247. package/.output/server/chunks/routes/api/workshop/daq/infra/reconnect.post.mjs +1 -1
  248. package/.output/server/chunks/routes/api/workshop/daq/infra.get.mjs +1 -1
  249. package/.output/server/chunks/routes/api/workshop/daq/templates/_key_.delete.mjs +1 -1
  250. package/.output/server/chunks/routes/api/workshop/daq/templates/_key_.patch.mjs +1 -1
  251. package/.output/server/chunks/routes/api/workshop/daq/test-driver.post.mjs +1 -1
  252. package/.output/server/chunks/routes/api/workshop/dcw/_id/bind.post.mjs +1 -1
  253. package/.output/server/chunks/routes/api/workshop/dcw/_id/bindings.put.mjs +1 -1
  254. package/.output/server/chunks/routes/api/workshop/dcw/_id/param-ledger.get.mjs +1 -1
  255. package/.output/server/chunks/routes/api/workshop/dcw/_id/read.post.mjs +1 -1
  256. package/.output/server/chunks/routes/api/workshop/dcw/_id/test.post.mjs +1 -1
  257. package/.output/server/chunks/routes/api/workshop/dcw/_id/write.post.mjs +1 -1
  258. package/.output/server/chunks/routes/api/workshop/dcw/_id_.delete.mjs +1 -1
  259. package/.output/server/chunks/routes/api/workshop/dcw/_id_.patch.mjs +1 -1
  260. package/.output/server/chunks/routes/api/workshop/dcw/controller.post.mjs +1 -1
  261. package/.output/server/chunks/routes/api/workshop/dcw/index.get.mjs +1 -1
  262. package/.output/server/chunks/routes/api/workshop/dcw/index.post.mjs +1 -1
  263. package/.output/server/chunks/routes/api/workshop/dcw/index2.get.mjs +1 -1
  264. package/.output/server/chunks/routes/api/workshop/dcw/index2.post.mjs +1 -1
  265. package/.output/server/chunks/routes/api/workshop/dcw/index3.get.mjs +1 -1
  266. package/.output/server/chunks/routes/api/workshop/dcw/index3.post.mjs +1 -1
  267. package/.output/server/chunks/routes/api/workshop/dcw/index4.get.mjs +1 -1
  268. package/.output/server/chunks/routes/api/workshop/dcw/index4.post.mjs +1 -1
  269. package/.output/server/chunks/routes/api/workshop/dcw/index5.get.mjs +1 -1
  270. package/.output/server/chunks/routes/api/workshop/dcw/index5.post.mjs +1 -1
  271. package/.output/server/chunks/routes/api/workshop/dcw/index6.get.mjs +1 -1
  272. package/.output/server/chunks/routes/api/workshop/dcw/journal/node/_nodeId/rollback.post.mjs +1 -1
  273. package/.output/server/chunks/routes/api/workshop/dcw/line/query.get.mjs +6 -1
  274. package/.output/server/chunks/routes/api/workshop/dcw/line/query.get.mjs.map +1 -1
  275. package/.output/server/chunks/routes/api/workshop/dcw/lines/_id/start.post.mjs +1 -1
  276. package/.output/server/chunks/routes/api/workshop/dcw/lines/_id/stop.post.mjs +1 -1
  277. package/.output/server/chunks/routes/api/workshop/dcw/lines/_id_.delete.mjs +1 -1
  278. package/.output/server/chunks/routes/api/workshop/dcw/lines/_id_.patch.mjs +1 -1
  279. package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id/judge.post.mjs +1 -1
  280. package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id/rollback.post.mjs +1 -1
  281. package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id/series.get.mjs +1 -1
  282. package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id_.get.mjs +1 -1
  283. package/.output/server/chunks/routes/api/workshop/dcw/params/_id/read.post.mjs +1 -1
  284. package/.output/server/chunks/routes/api/workshop/dcw/params/_id/write.post.mjs +1 -1
  285. package/.output/server/chunks/routes/api/workshop/dcw/params/_id_.delete.mjs +1 -1
  286. package/.output/server/chunks/routes/api/workshop/dcw/params/_id_.patch.mjs +1 -1
  287. package/.output/server/chunks/routes/api/workshop/dcw/products/_id_.delete.mjs +1 -1
  288. package/.output/server/chunks/routes/api/workshop/dcw/products/_id_.patch.mjs +1 -1
  289. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/apply.post.mjs +1 -1
  290. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/mark-good.post.mjs +1 -1
  291. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/revert.post.mjs +3 -3
  292. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/revert.post.mjs.map +1 -1
  293. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/rollback-good.post.mjs +1 -1
  294. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/versions.get.mjs +1 -1
  295. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id_.delete.mjs +1 -1
  296. package/.output/server/chunks/routes/api/workshop/dcw/recipes/index.patch.mjs +1 -1
  297. package/.output/server/chunks/routes/api/workshop/dcw/runs/_id/close.post.mjs +1 -1
  298. package/.output/server/chunks/routes/api/workshop/dcw/runs/_id/data.get.mjs +1 -1
  299. package/.output/server/chunks/routes/api/workshop/dcw/runs/_id/rollback.post.mjs +1 -1
  300. package/.output/server/chunks/routes/api/workshop/dcw/templates/_key_.delete.mjs +1 -1
  301. package/.output/server/chunks/routes/api/workshop/dcw/templates/_key_.patch.mjs +1 -1
  302. package/.output/server/chunks/routes/api/workshop/dcw/test-driver.post.mjs +1 -1
  303. package/.output/server/chunks/routes/api/workshop/device-twins/_id/control.post.mjs +1 -1
  304. package/.output/server/chunks/routes/api/workshop/device-twins/_id/telemetry.post.mjs +1 -1
  305. package/.output/server/chunks/routes/api/workshop/device-twins/_id_.delete.mjs +1 -1
  306. package/.output/server/chunks/routes/api/workshop/device-twins/_id_.patch.mjs +1 -1
  307. package/.output/server/chunks/routes/api/workshop/fs/dirs.get.mjs +14 -2
  308. package/.output/server/chunks/routes/api/workshop/fs/dirs.get.mjs.map +1 -1
  309. package/.output/server/chunks/routes/api/workshop/harnesses/_id/providers.get.mjs +1 -1
  310. package/.output/server/chunks/routes/api/workshop/harnesses.get.mjs +1 -1
  311. package/.output/server/chunks/routes/api/workshop/hitl/pending.get.mjs +1 -1
  312. package/.output/server/chunks/routes/api/workshop/hitl/respond.post.mjs +1 -1
  313. package/.output/server/chunks/routes/api/workshop/index.post.mjs +1 -1
  314. package/.output/server/chunks/routes/api/workshop/index.put.mjs +1 -1
  315. package/.output/server/chunks/routes/api/workshop/index10.get.mjs +1 -1
  316. package/.output/server/chunks/routes/api/workshop/index2.get.mjs +1 -1
  317. package/.output/server/chunks/routes/api/workshop/index2.post.mjs +1 -1
  318. package/.output/server/chunks/routes/api/workshop/index3.get.mjs +1 -1
  319. package/.output/server/chunks/routes/api/workshop/index3.post.mjs +1 -1
  320. package/.output/server/chunks/routes/api/workshop/index4.post.mjs +1 -1
  321. package/.output/server/chunks/routes/api/workshop/index5.get.mjs +1 -1
  322. package/.output/server/chunks/routes/api/workshop/index5.post.mjs +1 -1
  323. package/.output/server/chunks/routes/api/workshop/index6.get.mjs +1 -1
  324. package/.output/server/chunks/routes/api/workshop/index6.post.mjs +1 -1
  325. package/.output/server/chunks/routes/api/workshop/index7.get.mjs +1 -1
  326. package/.output/server/chunks/routes/api/workshop/index7.post.mjs +1 -1
  327. package/.output/server/chunks/routes/api/workshop/index8.get.mjs +1 -1
  328. package/.output/server/chunks/routes/api/workshop/index8.post.mjs +1 -1
  329. package/.output/server/chunks/routes/api/workshop/index9.get.mjs +3 -3
  330. package/.output/server/chunks/routes/api/workshop/index9.get.mjs.map +1 -1
  331. package/.output/server/chunks/routes/api/workshop/index9.post.mjs +1 -1
  332. package/.output/server/chunks/routes/api/workshop/notifications/read.post.mjs +1 -1
  333. package/.output/server/chunks/routes/api/workshop/plugins/_name/disable.post.mjs +1 -1
  334. package/.output/server/chunks/routes/api/workshop/plugins/_name/enable.post.mjs +1 -1
  335. package/.output/server/chunks/routes/api/workshop/scene/layouts/_channelId_.delete.mjs +1 -1
  336. package/.output/server/chunks/routes/api/workshop/scene/layouts/_channelId_.put.mjs +1 -1
  337. package/.output/server/chunks/routes/api/workshop/schedules/_id/runs.get.mjs +1 -1
  338. package/.output/server/chunks/routes/api/workshop/schedules/_id_.patch.mjs +1 -1
  339. package/.output/server/chunks/routes/api/workshop/tasks/_id/complete.post.mjs +1 -1
  340. package/.output/server/chunks/routes/api/workshop/tasks/_id/dispatch.post.mjs +1 -1
  341. package/.output/server/chunks/routes/api/workshop/tasks/_id/report.post.mjs +1 -1
  342. package/.output/server/chunks/routes/api/workshop/tasks/_id_.get.mjs +1 -1
  343. package/.output/server/chunks/routes/api/workshop/teams/_id/deploy.post.mjs +1 -1
  344. package/.output/server/chunks/routes/api/workshop/teams/_id/index.post.mjs +1 -1
  345. package/.output/server/chunks/routes/api/workshop/teams/_id/index.put.mjs +1 -1
  346. package/.output/server/chunks/routes/api/workshop/teams/_id/index2.get.mjs +1 -1
  347. package/.output/server/chunks/routes/api/workshop/teams/_id_.patch.mjs +1 -1
  348. package/.output/server/chunks/routes/api/workshop/users/register.post.mjs +4 -1
  349. package/.output/server/chunks/routes/api/workshop/users/register.post.mjs.map +1 -1
  350. package/.output/server/chunks/routes/api/workshop/workspaces/_id/channel-templates/_tplId_.post.mjs +2 -2
  351. package/.output/server/chunks/routes/renderer.mjs +2 -2
  352. package/.output/server/chunks/virtual/entry.mjs +350 -52
  353. package/.output/server/chunks/virtual/precomputed.mjs +1 -1
  354. package/.output/server/package.json +1 -1
  355. package/README-zh.md +7 -3
  356. package/README.md +11 -5
  357. package/app/components/app-header/HitlBell.vue +9 -9
  358. package/app/components/dcw/DcwAddNodeModal.vue +3 -3
  359. package/app/components/dcw/DcwNodesTable.vue +4 -4
  360. package/app/components/dcw/DcwRecipeEditModal.vue +2 -2
  361. package/app/components/workshop/ChatMemberPanel.vue +39 -38
  362. package/app/components/workshop/ChatTimeline.vue +33 -24
  363. package/app/components/workshop/Composer.vue +7 -7
  364. package/app/components/workshop/NotificationCenter.vue +22 -13
  365. package/app/components/workshop/PluginSlot.vue +1 -1
  366. package/app/components/workshop/TaskInspectorDrawer.vue +5 -5
  367. package/app/components/workshop/blocks/ClusterTool.vue +1 -1
  368. package/app/components/workshop/composer/ComposerToolbar.vue +2 -2
  369. package/app/components/workshop/composer/MentionMenu.vue +1 -1
  370. package/app/components/workshop/composer/ReplyChip.vue +2 -2
  371. package/app/components/workshop/composer/StatusChip.vue +7 -7
  372. package/app/components/workshop/console/LineOperationsPanel.vue +15 -14
  373. package/app/components/workshop/lanes/LaneHeader.vue +5 -3
  374. package/app/components/workshop/session-list/ChannelSettingsModal.vue +43 -1
  375. package/app/composables/useCodeCopy.ts +16 -2
  376. package/app/composables/workshop/useWorkshopApi.ts +11 -2
  377. package/app/pages/workshop/channel-templates.vue +43 -4
  378. package/app/stores/workshop/notifications.ts +43 -17
  379. package/config.yml +1 -1
  380. package/docs/cli.en.md +3 -3
  381. package/docs/cli.md +2 -2
  382. package/docs/plugins.en.md +1 -1
  383. package/docs/plugins.md +1 -1
  384. package/docs/sdk.en.md +1 -1
  385. package/docs/sdk.md +1 -1
  386. package/i18n/dicts/_en.json +1551 -1557
  387. package/i18n/dicts/_en2.json +300 -300
  388. package/i18n/dicts/_en4.json +114 -115
  389. package/i18n/dicts/agentLanesView.json +61 -57
  390. package/i18n/dicts/appHeader.json +17 -7
  391. package/i18n/dicts/channelSessionList.json +51 -48
  392. package/i18n/dicts/chat.json +79 -0
  393. package/i18n/dicts/clusterTool.json +4 -3
  394. package/i18n/dicts/composer.json +38 -38
  395. package/i18n/dicts/ctpl.json +37 -32
  396. package/i18n/dicts/dcwDetail.json +219 -209
  397. package/i18n/dicts/lineOps.json +14 -0
  398. package/i18n/dicts/multiChannelView.json +13 -13
  399. package/i18n/dicts/notifications.json +13 -0
  400. package/i18n/dicts/taskInspectorDrawer.json +25 -19
  401. package/i18n/locales/en.ts +157 -8
  402. package/i18n/locales/zh-CN.ts +157 -8
  403. package/package.json +1 -1
  404. package/public/robots.txt +3 -0
  405. package/scripts/_audit/kb-team-mock-e2e.mjs +146 -0
  406. package/scripts/_audit/kb-team-omp-e2e.mjs +229 -0
  407. package/server/api/mcp/workshop.ts +8 -1
  408. package/server/api/metrics.ts +4 -1
  409. package/server/api/plugins/[name]/[...path].ts +4 -3
  410. package/server/api/system/backup/list.get.ts +32 -0
  411. package/server/api/system/backup/run.post.ts +21 -0
  412. package/server/api/system/settings/index.patch.ts +12 -2
  413. package/server/api/system/settings/reset.post.ts +11 -2
  414. package/server/api/users/[id].delete.ts +9 -2
  415. package/server/api/users/[id].put.ts +9 -2
  416. package/server/api/users/index.post.ts +9 -2
  417. package/server/api/users/login.post.ts +3 -3
  418. package/server/api/users/register.post.ts +11 -1
  419. package/server/api/workshop/a2a/[agentId]/rpc/index.post.ts +23 -13
  420. package/server/api/workshop/agent-tools/bindings/grant.post.ts +45 -0
  421. package/server/api/workshop/agent-tools/bindings/revoke.post.ts +42 -0
  422. package/server/api/workshop/channel-templates/[id]/instantiate.post.ts +8 -1
  423. package/server/api/workshop/channels/[id]/line.put.ts +30 -0
  424. package/server/api/workshop/dcw/line/query.get.ts +6 -0
  425. package/server/api/workshop/dcw/recipes/[id]/revert.post.ts +3 -2
  426. package/server/api/workshop/fs/dirs.get.ts +19 -1
  427. package/server/api/workshop/ops-logs/index.get.ts +3 -2
  428. package/server/api/workshop/users/register.post.ts +7 -0
  429. package/server/mcp/workshop-server.ts +36 -13
  430. package/server/middleware/00-security-headers.ts +38 -0
  431. package/server/middleware/01-rate-guard.ts +101 -0
  432. package/server/plugins/backup.ts +56 -1
  433. package/server/plugins-builtin/diag-bridge/host/plugin.mjs +18 -11
  434. package/server/repositories/user.repository.ts +10 -5
  435. package/server/services/user.service.ts +24 -1
  436. package/server/services/workshop/agents/host-tool-bridge/dispatch.ts +7 -2
  437. package/server/services/workshop/agents/host-tool-bridge/tools/industrial.ts +4 -2
  438. package/server/services/workshop/agents/host-tool-bridge/tools/tasks.ts +15 -2
  439. package/server/services/workshop/agents/host-tool-bridge/tools/team-delegation.ts +104 -0
  440. package/server/services/workshop/agents/industrial/index.ts +1 -1
  441. package/server/services/workshop/agents/industrial/ops-tools.ts +168 -26
  442. package/server/services/workshop/agents/node-bindings.repo.ts +10 -1
  443. package/server/services/workshop/agents/node-delegation.ts +150 -0
  444. package/server/services/workshop/agents/tool-classes.ts +4 -0
  445. package/server/services/workshop/aml/dataset-builder.ts +4 -2
  446. package/server/services/workshop/aml/job-orchestrator/process.ts +1 -0
  447. package/server/services/workshop/aml/job-orchestrator/shared.ts +2 -0
  448. package/server/services/workshop/aml/job-orchestrator/start-job.ts +5 -2
  449. package/server/services/workshop/db/channel.repo.ts +11 -1
  450. package/server/services/workshop/db/database/migrations.ts +2 -0
  451. package/server/services/workshop/db/database/rows.ts +2 -0
  452. package/server/services/workshop/db/database/seed.ts +30 -0
  453. package/server/services/workshop/dcw/dcw-controller/recipes.ts +60 -4
  454. package/server/services/workshop/dcw/dcw-controller/write.ts +35 -6
  455. package/server/services/workshop/dcw/dcw-recipe.repo.ts +4 -3
  456. package/server/services/workshop/dcw/param-map.repo.ts +3 -0
  457. package/server/services/workshop/plugins/host/init.mjs +9 -1
  458. package/server/services/workshop/plugins/host/load.mjs +2 -2
  459. package/server/services/workshop/runtime/manager/admin-channel.ts +27 -1
  460. package/server/services/workshop/runtime/manager/channel-templates.ts +27 -2
  461. package/server/services/workshop/runtime/manager/runtime-wiring.ts +17 -1
  462. package/server/services/workshop/runtime/manager/types.ts +2 -0
  463. package/shared/config/schema.json +2 -0
  464. package/.output/public/_nuxt/8FXd9As6.js +0 -1
  465. package/.output/public/_nuxt/BOmDHp5L.js +0 -14
  466. package/.output/public/_nuxt/BWU1pvLL.js +0 -1
  467. package/.output/public/_nuxt/CdIsmU5a2.js +0 -21
  468. package/.output/public/_nuxt/D0SNhlnt.js +0 -1
  469. package/.output/public/_nuxt/DnH9SRMW2.js +0 -1
  470. package/.output/public/_nuxt/ON2x-t6n.js +0 -1
  471. package/.output/public/_nuxt/PluginSlot.DmjNbrcX.css +0 -1
  472. package/.output/public/_nuxt/_wsId_.DkrQkT6r.css +0 -1
  473. package/.output/public/_nuxt/builds/meta/912eb5bb-670e-4cc8-b21d-7fc097723466.json +0 -1
  474. package/.output/public/_nuxt/channel-templates.DplM1pJ3.css +0 -1
  475. package/.output/server/chunks/build/_id_-BUpQSlzo.mjs.map +0 -1
  476. package/.output/server/chunks/build/channel-templates-DjEsj0_v.mjs.map +0 -1
  477. package/.output/server/chunks/build/useWorkshopApi-B1B9vd4m.mjs.map +0 -1
  478. package/scripts/.chk-tok +0 -1
  479. package/scripts/.retrain-body.json +0 -1
  480. package/scripts/.retrain3-body.json +0 -1
  481. package/scripts/.rt-tok +0 -1
  482. package/scripts/.rt3-tok +0 -1
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "agentworkshop-prod",
3
- "version": "0.7.51",
3
+ "version": "0.7.53",
4
4
  "type": "module",
5
5
  "private": true,
6
6
  "dependencies": {
package/README-zh.md CHANGED
@@ -28,7 +28,7 @@
28
28
 
29
29
  **[English](./README.md)** · **[在线文档](https://kingdol666.github.io/AgentWorkShop)** · **[版本发布](https://github.com/kingdol666/AgentWorkShop/releases)** · **[更新日志](./changelog.md)** · **[插件 API](./docs/plugins.md)** · **[SDK](./docs/sdk.md)**
30
30
 
31
- <sub><b>v0.7.51</b> · 14 个执行引擎 · 6 种现场协议(5 内置 + 串口插件) · 113 个运行时设置项 · 双语文档(简体中文 / English)</sub>
31
+ <sub><b>v0.7.53</b> · 14 个执行引擎 · 6 种现场协议(5 内置 + 串口插件) · 115 个运行时设置项 · 双语文档(简体中文 / English)</sub>
32
32
 
33
33
  <br />
34
34
 
@@ -165,6 +165,8 @@ AgentWorkShop 起家于**多智能体软件工作坊**——Channel 内的编码
165
165
  | **人工审批的写控** | 数控下发经过「**安全量程 ∩ 活动配方窗口**」联锁 → 可选 **HITL 审批** → PLC 写入 → **回读校验** → 带签名的写历史。 |
166
166
  | **数控读写通道** | 每个控制节点都能沿**写入时所用的同一条标定链路**读回 PLC 当前值:周期读 + 按需读 + Agent 读取,SET 与 ACT 并排呈现——读是被动观测,永不被写联锁阻断。 |
167
167
  | **Recipe 版本化治理** | 参数修改按版本入史(归因 用户/Agent/系统 + 操作者 + 原因)。可非破坏地回退到任意修订版或最近一次良好批次。失效节点参数跳过并明确标识。 |
168
+ | **配方链路优化闭环** | Agent 像人类工艺员一样通过配方管理做优化:`recipe_trial` 把多参数候选**整批试验(不写版本)**→ 复测 → 有进步用 `recipe_update` 固化(同一配方 id,版本+1)→ 劣化触发**统一回退**(`recipe_rollback` 带 `dispatch:true` = 定义回退 + PLC 整批恢复)。单参数直调移出闭环;试验受四层限界与同线节拍卡控。 |
169
+ | **频道绑定产线(只读授权)** | 频道可绑定一条产线:全员无需节点绑定即可读取该线的运维日志、配方历史与实时状态(工具回执标注「频道绑定,只读」),写操作仍需节点授权。产线简报自动注入成员提示词;换绑即时回收成员运行时。 |
168
170
  | **工艺参数语义映射与调控闭环** | Agent 用工程语义思考:`param_control(param, value)` 按**工艺参数**寻址(跨批次/换配方语义稳定),`param_read` 读回 PLC 当前值取证。每次写入被**四层限界**逐层收窄——节点安全量程 ∩ 工艺参数基准限界 ∩ 活动产品限界 ∩ 活动配方工艺窗口——且每次下发自动开一条调控记录,由 `dcw_judge` 落判定(keep / rollback / uncertain),`dcw_rollback` 执行回退。 |
169
171
  | **产线运营** | 产线 → 产品 → 配方 → 批次。配方窗口门控采集并联锁写入;每条样本打标 `product/recipe/run`,实现按批次隔离。 |
170
172
  | **多形态数采帧管线** | 多点轮廓(测厚仪/扫描仪)与 CCD 图像帧流经模板 sink 管线:向量与元数据入 Timescale(`daq_frames`),像素入对象存储(MinIO,不可达时自动降级到本地磁盘);派生指标阈值越限走既有告警链路。 |
@@ -184,7 +186,7 @@ AgentWorkShop 起家于**多智能体软件工作坊**——Channel 内的编码
184
186
  | **运行时可观测** | `GET /api/system/monitor` 把 Agent 团队内部暴露成数字:根队列深度、看门狗介入次数、Harness 会话复用、记忆 outbox 积压——每项都有对应的文档化回退开关,新机制可以不重新部署就关掉。 |
185
187
  | **产线操作单页(`/operations`)** | 一页看全对产线的每一次触碰:实时操作流水(REST 快照 + WS 推流)把写控、数采、建模、配方、回退、报警、产线、人工、系统动作归入**九类分类**,写控行渲染结构化 **前值 → 后值 diff 徽章**(失败标红),并直接从事件流推断**闭环阶段**(监视 → 探索·小步 → 推荐搜索 → 影子验证 → 生产)。同一数据面也供工作台控制台的「产线作业」面板使用。 |
186
188
  | **外部 MCP 网关** | `aw mcp` 启动零依赖的 **stdio MCP 服务**(38 个工具),自动发现运行中的实例(环境变量 → 锁文件 → 配置文件),把产线、配方(含 mark-good)、受治理 DCW 写入、工艺参数语义映射、数采查询、频道、团队供给、模型晋升、判卷/回退与插件管理暴露给任意 MCP 客户端——受 `mcp.enabled` 运行时设置门控,附 `--doctor` 与 `--print-config` 辅助指令。 |
187
- | **全量配置驱动运行时** | 全部运行旋钮(记忆预算、上下文压缩、回退护栏、保留策略、备份、日志级别、系统时区、MCP 开关…)在设置描述符注册表声明一次,优先级 **config.yml < runtime-settings < env**——**113 个设置项、18 组**(34 live / 79 restart),代码零硬编码默认。 |
189
+ | **全量配置驱动运行时** | 全部运行旋钮(记忆预算、上下文压缩、回退护栏、保留策略、备份、日志级别、系统时区、MCP 开关…)在设置描述符注册表声明一次,优先级 **config.yml < runtime-settings < env**——**113 个设置项、18 组**(36 live / 79 restart),代码零硬编码默认。 |
188
190
  | **可配置系统时区** | 一个 `time.timeZone` 设置项(IANA 时区,live 热生效)统一驱动人读时间——日志、聊天、审计、Agent 记录与定时任务;机器时间轴(数采样本、`timestamptz`)仍保存绝对时间。 |
189
191
  | **可配置节拍** | 采样与查询的默认值/下限全部是 **live 设置**(`daq.sampling.*`、`daq.query.*`):热重载、create/patch 时钳制,Agent 工具描述实时携带当前值。 |
190
192
 
@@ -386,7 +388,7 @@ aw update --check # 只报告,不安装
386
388
  npm install -g agentworkshop@latest # 手动等效
387
389
  ```
388
390
 
389
- 版本遵循 semver。每次 `aw start` 都会校验配置根,并把 `home` 之前的旧版 `data/` 布局迁移进来(以最新文件为准),因此数据可以跨版本存活。SQLite schema 迁移在服务端启动时执行。当前版本:**v0.7.51**——见[版本发布](https://github.com/kingdol666/AgentWorkShop/releases)。
391
+ 版本遵循 semver。每次 `aw start` 都会校验配置根,并把 `home` 之前的旧版 `data/` 布局迁移进来(以最新文件为准),因此数据可以跨版本存活。SQLite schema 迁移在服务端启动时执行。当前版本:**v0.7.53**——见[版本发布](https://github.com/kingdol666/AgentWorkShop/releases)。
390
392
 
391
393
  ### 第一次「Agent × 产线」会话(约 2 分钟)
392
394
 
@@ -717,6 +719,8 @@ cd docs/site && npx vitepress build # 生产构建 → .vitepress/dist
717
719
  | 六种现场协议:Modbus TCP · Modbus RTU-over-TCP · OPC UA · MQTT · HTTP + 内置 serial-bridge 串口插件(数采 + 数控双向) | 已交付 |
718
720
  | Harness 可用性探测 + 执行前引擎强校验(UI 禁选 + 409) | 已交付 |
719
721
  | Recipe 归因版本化 + 非破坏回退(界面 + Agent 工具) | 已交付 |
722
+ | 配方链路优化闭环:recipe_trial 整批试验(不写版本)→ 进步才固化 → 统一回退(PLC 整批恢复) | 已交付 |
723
+ | 频道绑定产线:全员只读日志/配方/状态 + 产线简报注入提示词 | 已交付 |
720
724
  | Agent 自查工具:line_context / ops_log / recipe_log / recipe_versions / dcw_journal | 已交付 |
721
725
  | 多 Harness 并行真实产线 live E2E(四引擎、一条产线) | 已交付 |
722
726
  | HITL 审批流经真实 OPC UA 写入验证 | 已交付 |
package/README.md CHANGED
@@ -28,7 +28,7 @@
28
28
 
29
29
  **[简体中文](./README-zh.md)** · **[Documentation](https://kingdol666.github.io/AgentWorkShop)** · **[Releases](https://github.com/kingdol666/AgentWorkShop/releases)** · **[Changelog](./changelog.md)** · **[Plugin API](./docs/plugins.md)** · **[SDK](./docs/sdk.md)**
30
30
 
31
- <sub><b>v0.7.51</b> · 14 engines · 6 field protocols (5 built-in + serial plugin) · 113 runtime settings · bilingual docs (简体中文 / English)</sub>
31
+ <sub><b>v0.7.53</b> · 14 engines · 6 field protocols (5 built-in + serial plugin) · 115 runtime settings · bilingual docs (简体中文 / English)</sub>
32
32
 
33
33
  <br />
34
34
 
@@ -166,6 +166,8 @@ Recorded against a running instance: real DAQ history, real write control, real
166
166
  | **Human-approved write control** | DCW writes flow through **safe-range ∩ recipe-window** interlock → optional **HITL approval** → PLC write → **readback verification** → signed write history. |
167
167
  | **Read-write DCW channels** | Every control node also **reads its PLC value back** through the same calibration path it writes with: periodic + on-demand + agent reads surface **SET vs ACT** side by side — passive observation, never blocked by write interlocks. |
168
168
  | **Recipe versioning & governance** | Parameter changes are versioned with attribution (user/agent/system + operator + reason). Roll back to any revision or the last-good batch — non-destructively. Stale-node params are skipped and clearly marked. |
169
+ | **Recipe-chain optimization loop** | Agents optimize through recipe management, the way human process engineers do: `recipe_trial` batch-dispatches multi-parameter candidates **without writing a version** → re-measure → progress adopts via `recipe_update` (same recipe id, version +1) → regression triggers a **unified rollback** (`recipe_rollback` with `dispatch: true` = definition revert + batch restore to the PLC). Single-knob direct dispatch is out of the loop; trials run under four-layer bounds and a per-line cadence. |
170
+ | **Channel-bound lines (read-only grant)** | A channel can bind a line: every member reads that line's ops logs, recipe history and live status without any node binding (tool outputs are tagged "channel-bound, read-only"), while writes still require node authorization. The line brief is injected into member prompts; binding changes hot-recycle member runtimes. |
169
171
  | **Semantic parameter mapping & tuning loop** | Agents reason in engineering semantics: `param_control(param, value)` addresses a **process parameter** (stable across batches and recipe swaps) instead of a raw node, and `param_read` reads back the PLC value for evidence. Every write is narrowed by a **four-layer bound** — node safe range ∩ parameter baseline bounds ∩ active product bounds ∩ active recipe window — and each adjustment opens a tuning record that `dcw_judge` must close (keep / rollback / uncertain), with `dcw_rollback` executing the undo. |
170
172
  | **Line operations** | Lines → products → recipes → batch runs. Recipe windows gate acquisition and interlock writes; every sample is tagged `product/recipe/run` for per-batch isolation. |
171
173
  | **Multi-modal DAQ frame pipeline** | Multi-point profiles (thickness/scanner) and CCD image frames flow through template sink pipelines: vectors & metadata into Timescale (`daq_frames`), pixels into object storage (MinIO, auto disk fallback); derived-metric thresholds ride the existing alarm chain. |
@@ -185,7 +187,7 @@ Recorded against a running instance: real DAQ history, real write control, real
185
187
  | **Runtime observability** | `GET /api/system/monitor` exposes the agent-team internals as numbers: root queue depth, watchdog interventions, harness session reuse, pending memory outbox — each guarded by a documented rollback switch, so new machinery can be turned off without a redeploy. |
186
188
  | **Line operations feed (`/operations`)** | One page for every touch on the plant: a live operation feed (REST snapshot + WS stream) classifies writes, DAQ, AML, recipe, rollback, alarm, line, manual and system actions into **nine categories**, renders structured **before → after diff badges** on write rows (failures marked red), and infers the **closed-loop phase** (monitor → exploration · small-step → recommendation search → shadow verification → production) straight from the event stream. The same feed powers a line-operations panel inside the workshop console. |
187
189
  | **External MCP gateway** | `aw mcp` starts a zero-dependency **stdio MCP server** (38 tools) that discovers a running instance automatically (env → lock file → config file) and exposes lines, recipes (incl. mark-good), governed DCW writes, semantic parameter mapping, DAQ queries, channels, team provisioning, model promotion, judge/rollback and plugin management to any MCP client — gated by the `mcp.enabled` runtime setting, with `--doctor` and `--print-config` helpers. |
188
- | **Fully config-driven runtime** | Every runtime knob (memory budgets, compaction, rollback guardrails, retention, backups, log level, system timezone, MCP gate…) is declared once in the settings descriptor registry with precedence **config.yml < runtime-settings < env** — **113 settings across 18 groups** (34 live / 79 restart), no hardcoded defaults in code. |
190
+ | **Fully config-driven runtime** | Every runtime knob (memory budgets, compaction, rollback guardrails, retention, backups, log level, system timezone, MCP gate…) is declared once in the settings descriptor registry with precedence **config.yml < runtime-settings < env** — **115 settings across 18 groups** (36 live / 79 restart), no hardcoded defaults in code. |
189
191
  | **Configurable system timezone** | One `time.timeZone` setting (IANA id, live-applied) drives human-facing timestamps — logs, chat, audit, agent records and schedules — through a single formatter; machine timelines (DAQ samples, `timestamptz`) stay absolute. |
190
192
  | **Configurable cadences** | Sampling and query defaults/floors are **live settings** (`daq.sampling.*`, `daq.query.*`): hot-reloaded, clamped on node create/patch, and agent tool descriptions always carry the current values. |
191
193
 
@@ -254,7 +256,7 @@ page headers stack, dense tables become scrollable ledgers with a pinned identit
254
256
  <td width="50%"><img src="https://raw.githubusercontent.com/kingdol666/AgentWorkShop/main/docs/readme-assets/shot-monitor.png" alt="Runtime monitor" width="100%" /><br/><sub><b>Runtime monitor.</b> Every wired channel, member count, dependency cycle and owner.</sub></td>
255
257
  </tr>
256
258
  <tr>
257
- <td><img src="https://raw.githubusercontent.com/kingdol666/AgentWorkShop/main/docs/readme-assets/shot-settings.png" alt="Settings" width="100%" /><br/><sub><b>Settings.</b> 113 keys across 18 groups, descriptor-driven — the same registry the CLI reads.</sub></td>
259
+ <td><img src="https://raw.githubusercontent.com/kingdol666/AgentWorkShop/main/docs/readme-assets/shot-settings.png" alt="Settings" width="100%" /><br/><sub><b>Settings.</b> 115 keys across 18 groups, descriptor-driven — the same registry the CLI reads.</sub></td>
258
260
  <td><img src="https://raw.githubusercontent.com/kingdol666/AgentWorkShop/main/docs/readme-assets/shot-plugins.png" alt="Plugins" width="100%" /><br/><sub><b>Plugins.</b> Three scopes, hot reload on edit, per-team switches.</sub></td>
259
261
  </tr>
260
262
  </table>
@@ -377,7 +379,7 @@ aw update --check # only report; nothing is installed
377
379
  npm install -g agentworkshop@latest # manual equivalent
378
380
  ```
379
381
 
380
- Releases follow semver. `aw start` verifies the config root on every launch and migrates the legacy pre-`home` `data/` layout into it (newest file wins), so data survives upgrades. SQLite schema migrations run server-side at boot. Current version: **v0.7.51** — see [Releases](https://github.com/kingdol666/AgentWorkShop/releases).
382
+ Releases follow semver. `aw start` verifies the config root on every launch and migrates the legacy pre-`home` `data/` layout into it (newest file wins), so data survives upgrades. SQLite schema migrations run server-side at boot. Current version: **v0.7.53** — see [Releases](https://github.com/kingdol666/AgentWorkShop/releases).
381
383
 
382
384
  ### Your first agent × line session (~2 minutes)
383
385
 
@@ -655,7 +657,7 @@ AgentWorkShop/
655
657
  ├── sdk/ # agentworkshop/sdk — plugin context, hook bus, REST client, browser SDK
656
658
  ├── tui/ # terminal workbench (aw tui)
657
659
  ├── shared/
658
- │ └── config/ # schema.json (113 setting descriptors) + engine (merge/validate/persist) + path resolver
660
+ │ └── config/ # schema.json (115 setting descriptors) + engine (merge/validate/persist) + path resolver
659
661
  ├── config.yml # factory defaults (read at build/start; version comes from package.json)
660
662
  ├── .AgentWorkShop/ # config root in a checkout — prompts (versioned) + runtime overrides · data · logs · commands (git-ignored)
661
663
  ├── data/ # legacy pre-migration location (auto-migrated into the config root)
@@ -727,6 +729,10 @@ building, so those files are the single source of truth for the single-page guid
727
729
  | Six field protocols: Modbus TCP · Modbus RTU-over-TCP · OPC UA · MQTT · HTTP + the built-in serial-bridge plugin (acquisition + write control) | Shipped |
728
730
  | Harness availability probing + dispatch-time engine checks (UI disable + 409) | Shipped |
729
731
  | Recipe versioning with attribution + non-destructive rollback (UI + agent tools) | Shipped |
732
+ | Recipe-chain optimization loop: recipe_trial batch trials (no version) → adopt on progress → unified rollback with PLC restore | Shipped |
733
+ | Channel-bound lines: read-only log/recipe/status access for all members, line brief injected into prompts | Shipped |
734
+ | Recipe-chain optimization loop: recipe_trial batch trials (no version) → adopt on progress → unified rollback with PLC restore | Shipped |
735
+ | Channel-bound lines: read-only log/recipe/status access for all members, line brief injected into prompts | Shipped |
730
736
  | Agent self-audit: line_context / ops_log / recipe_log / recipe_versions / dcw_journal | Shipped |
731
737
  | Multi-harness parallel live E2E on a real protocol line (four engines, one line) | Shipped |
732
738
  | HITL approval flow verified over real OPC UA writes | Shipped |
@@ -61,7 +61,7 @@ const {
61
61
  v-if="item.requestType || isQuestion(item)"
62
62
  class="hitl-item-reqtype"
63
63
  :data-type="requestTypeOf(item)"
64
- >{{ isQuestion(item) ? '提问' : '审批' }}</span>
64
+ >{{ isQuestion(item) ? t('appHeader.hitlReqQuestion') : t('appHeader.hitlReqApproval') }}</span>
65
65
  </span>
66
66
  <span class="hitl-item-title">{{ item.title }}</span>
67
67
  <span
@@ -76,7 +76,7 @@ const {
76
76
  v-if="item.policy"
77
77
  class="hitl-item-policy"
78
78
  >
79
- <span class="i-tabler-shield-lock" /> 策略:{{ policyLabel(item) }}
79
+ <span class="i-tabler-shield-lock" /> {{ t('appHeader.hitlPolicy', { p0: policyLabel(item) }) }}
80
80
  </span>
81
81
  </button>
82
82
 
@@ -85,19 +85,19 @@ const {
85
85
  v-if="!HITL_KINDS.includes(item.kind)"
86
86
  class="hitl-answer-note"
87
87
  >
88
- 该类型待办需在对应引擎界面处理
88
+ {{ t('appHeader.hitlEngineNote') }}
89
89
  </div>
90
90
  <div
91
91
  v-else-if="!permsKnown(item)"
92
92
  class="hitl-answer-note"
93
93
  >
94
- 读取审批权限…
94
+ {{ t('appHeader.hitlPermsLoading') }}
95
95
  </div>
96
96
  <div
97
97
  v-else-if="!canAnswer(item)"
98
98
  class="hitl-answer-note"
99
99
  >
100
- 无审批权限{{ item.policy ? `(${policyLabel(item)})` : '' }}
100
+ {{ t('appHeader.hitlNoPerm') }}{{ item.policy ? `(${policyLabel(item)})` : '' }}
101
101
  </div>
102
102
  <div
103
103
  v-else
@@ -142,7 +142,7 @@ const {
142
142
  v-if="!(q.options && q.options.length > 0) || q.freeText"
143
143
  v-model:value="qFree[slotOf(item, q.id)]"
144
144
  :rows="2"
145
- :placeholder="q.options && q.options.length > 0 ? '补充说明(可选)' : '输入答案'"
145
+ :placeholder="q.options && q.options.length > 0 ? t('appHeader.hitlSupplementPlaceholder') : t('appHeader.hitlAnswerPlaceholder')"
146
146
  />
147
147
  </div>
148
148
  <div class="hitl-btns">
@@ -152,14 +152,14 @@ const {
152
152
  :loading="hitl.answering === `${item.kind}:${item.id}`"
153
153
  @click="submitQuestion(item)"
154
154
  >
155
- 提交答案
155
+ {{ t('appHeader.hitlSubmitAnswer') }}
156
156
  </a-button>
157
157
  <a-button
158
158
  size="small"
159
159
  :disabled="hitl.answering === `${item.kind}:${item.id}`"
160
160
  @click="submitCancel(item)"
161
161
  >
162
- 取消请求
162
+ {{ t('appHeader.hitlCancelRequest') }}
163
163
  </a-button>
164
164
  </div>
165
165
  </template>
@@ -202,7 +202,7 @@ const {
202
202
  :disabled="hitl.answering === `${item.kind}:${item.id}`"
203
203
  @click="submitCancel(item)"
204
204
  >
205
- 取消
205
+ {{ t('common.cancel') }}
206
206
  </a-button>
207
207
  </div>
208
208
  </template>
@@ -124,16 +124,16 @@ const addSemantics = defineModel<string>('semantics', { required: true })
124
124
  >
125
125
  </label>
126
126
  <label class="f">
127
- <span>探索阶段单步上限 <em>(工程量)</em></span>
127
+ <span>{{ $t('dcwDetail.stepLimitLabel') }} <em>({{ $t('dcwDetail.stepLimitUnit') }})</em></span>
128
128
  <input
129
129
  v-model.number="addStepLimit"
130
130
  type="number"
131
131
  min="0"
132
132
  step="any"
133
133
  class="inp"
134
- placeholder="留空:按节点量程 2% 默认值"
134
+ :placeholder="$t('dcwDetail.stepLimitPlaceholder')"
135
135
  >
136
- <small class="field-hint">Agent 每次写入的最大变化量;无有限值时探索写入会被拒绝。</small>
136
+ <small class="field-hint">{{ $t('dcwDetail.stepLimitHint') }}</small>
137
137
  </label>
138
138
  </div>
139
139
 
@@ -54,7 +54,7 @@ function saveStep(n: DcwNodeView): void {
54
54
  <th>{{ $t('dcwDetail.k1dexou6058') }}</th>
55
55
  <th>{{ $t('dcwDetail.k1b1nnaa059') }}</th>
56
56
  <th>{{ $t('dcwDetail.k1i8rtqt060') }}</th>
57
- <th>探索步长</th>
57
+ <th>{{ $t('dcwDetail.thStepLimit') }}</th>
58
58
  <th class="right">
59
59
  {{ $t('dcwDetail.k40aa6061') }}
60
60
  </th>
@@ -168,7 +168,7 @@ function saveStep(n: DcwNodeView): void {
168
168
  step="any"
169
169
  class="inp step-inp mono"
170
170
  placeholder="2% default"
171
- title="在线控制单步最大变化量;留空将关闭探索写入"
171
+ :title="$t('dcwDetail.stepInputTitle')"
172
172
  @input="stepDrafts[n.id] = ($event.target as HTMLInputElement).value === '' ? '' : Number(($event.target as HTMLInputElement).value)"
173
173
  >
174
174
  <button
@@ -176,10 +176,10 @@ function saveStep(n: DcwNodeView): void {
176
176
  :disabled="stepPatchingId === n.id"
177
177
  @click="saveStep(n)"
178
178
  >
179
- {{ stepPatchingId === n.id ? '…' : '保存' }}
179
+ {{ stepPatchingId === n.id ? '…' : $t('common.save') }}
180
180
  </button>
181
181
  </div>
182
- <small class="dim">当前 Δ≤{{ n.stepLimit ?? '未配置' }} {{ n.unit }}</small>
182
+ <small class="dim">{{ $t('dcwDetail.stepCurrent', { p0: n.stepLimit ?? $t('dcwDetail.stepUnset') }) }} {{ n.unit }}</small>
183
183
  </td>
184
184
  <td class="right">
185
185
  <button
@@ -131,14 +131,14 @@ const recipeForm = defineModel<DcwRecipeForm>('form', { required: true })
131
131
  >
132
132
  </label>
133
133
  <label class="f">
134
- <span>Recipe 单步上限 Δ≤</span>
134
+ <span>{{ $t('dcwDetail.recipeStepLimitLabel') }}</span>
135
135
  <input
136
136
  v-model.number="p.stepLimit"
137
137
  type="number"
138
138
  min="0"
139
139
  class="inp"
140
140
  step="any"
141
- placeholder="跟随节点默认"
141
+ :placeholder="$t('dcwDetail.recipeStepLimitPlaceholder')"
142
142
  >
143
143
  </label>
144
144
  <button
@@ -16,6 +16,7 @@ import type { AepChannelMember } from '#shared/workshop-protocol'
16
16
 
17
17
  const props = defineProps<{ channelId: string }>()
18
18
 
19
+ const { t } = useI18n()
19
20
  const chat = useChatStore()
20
21
 
21
22
  const perms = computed<ChatPermissions | null>(() => chat.permissions[props.channelId] ?? null)
@@ -78,14 +79,14 @@ async function onJoin(): Promise<void> {
78
79
  busy.value = 'join'
79
80
  try {
80
81
  const status = await chat.join(props.channelId)
81
- if (status === 'pending') message.info('已提交加入申请,等待 owner 批准')
82
- else message.success('已加入群聊')
82
+ if (status === 'pending') message.info(t('chat.joinedPending'))
83
+ else message.success(t('chat.joinedOk'))
83
84
  await refresh()
84
85
  }
85
86
  catch (e) {
86
87
  const code = chatErrorCode(e)
87
- if (code === 'CHAT_DISABLED') message.warning('该 Channel 未开启群聊')
88
- else if (code === 'CHANNEL_PRIVATE') message.warning('该 Channel 未公开,需 owner 邀请')
88
+ if (code === 'CHAT_DISABLED') message.warning(t('chat.errChatDisabled'))
89
+ else if (code === 'CHANNEL_PRIVATE') message.warning(t('chat.errChannelPrivate'))
89
90
  else message.error(chatErrorMessage(e))
90
91
  }
91
92
  finally {
@@ -98,11 +99,11 @@ async function onLeave(): Promise<void> {
98
99
  busy.value = 'leave'
99
100
  try {
100
101
  await chat.leave(props.channelId)
101
- message.success('已退出群聊')
102
+ message.success(t('chat.leftOk'))
102
103
  await refresh()
103
104
  }
104
105
  catch (e) {
105
- if (chatErrorCode(e) === 'OWNER_CANNOT_LEAVE') message.warning('owner 不能退出群聊,请先转移 owner')
106
+ if (chatErrorCode(e) === 'OWNER_CANNOT_LEAVE') message.warning(t('chat.errOwnerCannotLeave'))
106
107
  else message.error(chatErrorMessage(e))
107
108
  }
108
109
  finally {
@@ -115,7 +116,7 @@ async function onApprove(m: AepChannelMember): Promise<void> {
115
116
  busy.value = `approve:${m.userId}`
116
117
  try {
117
118
  await chat.approveMember(props.channelId, m.userId)
118
- message.success('已批准加入')
119
+ message.success(t('chat.approvedOk'))
119
120
  }
120
121
  catch (e) {
121
122
  message.error(chatErrorMessage(e))
@@ -130,7 +131,7 @@ async function onRemove(m: AepChannelMember): Promise<void> {
130
131
  busy.value = `remove:${m.userId}`
131
132
  try {
132
133
  await chat.removeMember(props.channelId, m.userId)
133
- message.success('已移除成员')
134
+ message.success(t('chat.removedOk'))
134
135
  }
135
136
  catch (e) {
136
137
  message.error(chatErrorMessage(e))
@@ -156,12 +157,12 @@ async function onSaveSettings(): Promise<void> {
156
157
  approvalPolicy: d.approvalPolicy,
157
158
  chatEnabled: d.chatEnabled ? 1 : 0,
158
159
  })
159
- message.success('群聊设置已保存')
160
+ message.success(t('chat.settingsSaved'))
160
161
  syncDraft()
161
162
  }
162
163
  catch (e) {
163
164
  if (chatErrorCode(e) === 'VERSION_CONFLICT') {
164
- settingsError.value = 'Channel 设置已被他人修改,请刷新后重试'
165
+ settingsError.value = t('chat.settingsConflict')
165
166
  }
166
167
  else if (chatErrorCode(e) === 'CHAT_DISABLED') {
167
168
  settingsError.value = chatErrorMessage(e)
@@ -175,12 +176,12 @@ async function onSaveSettings(): Promise<void> {
175
176
  }
176
177
  }
177
178
 
178
- const statusLabel: Record<AepChannelMember['status'], string> = {
179
- active: '在群',
180
- pending: '待批准',
181
- left: '已退出',
182
- removed: '已移除',
183
- }
179
+ const statusLabels = computed<Record<AepChannelMember['status'], string>>(() => ({
180
+ active: t('chat.statusActive'),
181
+ pending: t('chat.statusPending'),
182
+ left: t('chat.statusLeft'),
183
+ removed: t('chat.statusRemoved'),
184
+ }))
184
185
 
185
186
  const avatarText = (m: AepChannelMember): string =>
186
187
  (m.displayName || m.userId.slice(0, 8)).trim().charAt(0).toUpperCase()
@@ -190,13 +191,13 @@ const avatarText = (m: AepChannelMember): string =>
190
191
  <div class="member-panel">
191
192
  <div class="mp-head">
192
193
  <span class="i-tabler-users-group mp-icon" />
193
- <span class="mp-title">成员</span>
194
+ <span class="mp-title">{{ $t('chat.title') }}</span>
194
195
  <span class="mp-count">{{ members.filter(m => m.status === 'active').length }}</span>
195
196
  <span class="mp-spacer" />
196
197
  <button
197
198
  type="button"
198
199
  class="mp-refresh"
199
- title="刷新成员与设置"
200
+ :title="$t('chat.refreshTitle')"
200
201
  @click="refresh().then(syncDraft)"
201
202
  >
202
203
  <span class="i-tabler-refresh" />
@@ -215,23 +216,23 @@ const avatarText = (m: AepChannelMember): string =>
215
216
  :loading="busy === 'join'"
216
217
  @click="onJoin"
217
218
  >
218
- 加入群聊
219
+ {{ $t('chat.join') }}
219
220
  </a-button>
220
221
  <div
221
222
  v-else
222
223
  class="mp-hint"
223
224
  >
224
- {{ perms === null ? '未加入群聊 —— 需 owner 邀请或 Channel 未公开' : '该 Channel 未公开或未开启群聊 —— 需 owner 邀请' }}
225
+ {{ perms === null ? $t('chat.notMemberHint') : $t('chat.privateHint') }}
225
226
  </div>
226
227
  </template>
227
228
  <template v-else-if="myStatus === 'pending'">
228
229
  <div class="mp-hint pending">
229
- <span class="i-tabler-hourglass" /> 加入申请待 owner 批准
230
+ <span class="i-tabler-hourglass" /> {{ $t('chat.pendingHint') }}
230
231
  </div>
231
232
  </template>
232
233
  <template v-else-if="!isOwner">
233
234
  <a-popconfirm
234
- title="退出群聊后将立即失去读、发言、审批与通知补拉权限,确认退出?"
235
+ :title="$t('chat.leaveConfirm')"
235
236
  :ok-text="$t('common.confirm')"
236
237
  :cancel-text="$t('common.cancel')"
237
238
  @confirm="onLeave"
@@ -241,7 +242,7 @@ const avatarText = (m: AepChannelMember): string =>
241
242
  block
242
243
  :loading="busy === 'leave'"
243
244
  >
244
- 退出群聊
245
+ {{ $t('chat.leave') }}
245
246
  </a-button>
246
247
  </a-popconfirm>
247
248
  </template>
@@ -249,7 +250,7 @@ const avatarText = (m: AepChannelMember): string =>
249
250
  v-else
250
251
  class="mp-hint"
251
252
  >
252
- <span class="i-tabler-crown" /> 你是 owner(不可退出,可转移 owner 或删除 Channel)
253
+ <span class="i-tabler-crown" /> {{ $t('chat.ownerHint') }}
253
254
  </div>
254
255
  </div>
255
256
 
@@ -274,7 +275,7 @@ const avatarText = (m: AepChannelMember): string =>
274
275
  <span
275
276
  class="mp-status"
276
277
  :data-status="m.status"
277
- >{{ statusLabel[m.status] }}</span>
278
+ >{{ statusLabels[m.status] }}</span>
278
279
  <span class="mp-joined">{{ formatLocalClock(m.joinedAt, false) }}</span>
279
280
  </div>
280
281
  </div>
@@ -290,11 +291,11 @@ const avatarText = (m: AepChannelMember): string =>
290
291
  :loading="busy === `approve:${m.userId}`"
291
292
  @click="onApprove(m)"
292
293
  >
293
- 批准
294
+ {{ $t('chat.approve') }}
294
295
  </a-button>
295
296
  <a-popconfirm
296
297
  v-if="m.status === 'active' || m.status === 'pending'"
297
- title="移除该成员后其立即失去群聊与审批权限,确认?"
298
+ :title="$t('chat.removeConfirm')"
298
299
  :ok-text="$t('common.remove')"
299
300
  :cancel-text="$t('common.cancel')"
300
301
  @confirm="onRemove(m)"
@@ -313,7 +314,7 @@ const avatarText = (m: AepChannelMember): string =>
313
314
  v-if="sortedMembers.length === 0"
314
315
  class="mp-hint"
315
316
  >
316
- 名册不可见(非成员)
317
+ {{ $t('chat.rosterHidden') }}
317
318
  </div>
318
319
  </div>
319
320
 
@@ -323,35 +324,35 @@ const avatarText = (m: AepChannelMember): string =>
323
324
  class="mp-settings"
324
325
  >
325
326
  <div class="mp-sec-title">
326
- 群聊设置
327
+ {{ $t('chat.settingsTitle') }}
327
328
  <span class="mp-ver">v{{ settings?.version ?? '-' }}</span>
328
329
  </div>
329
330
  <label class="mp-field">
330
- <span>可见性</span>
331
+ <span>{{ $t('chat.visibilityLabel') }}</span>
331
332
  <a-select
332
333
  v-model:value="draft.visibility"
333
334
  size="small"
334
- :options="[{ value: 'private', label: '私有(仅成员可见)' }, { value: 'public', label: '公开(登录用户可发现)' }]"
335
+ :options="[{ value: 'private', label: $t('chat.visibilityPrivate') }, { value: 'public', label: $t('chat.visibilityPublic') }]"
335
336
  />
336
337
  </label>
337
338
  <label class="mp-field">
338
- <span>加入策略</span>
339
+ <span>{{ $t('chat.joinPolicyLabel') }}</span>
339
340
  <a-select
340
341
  v-model:value="draft.joinPolicy"
341
342
  size="small"
342
- :options="[{ value: 'owner_approve', label: '需 owner 批准' }, { value: 'open', label: '开放加入' }]"
343
+ :options="[{ value: 'owner_approve', label: $t('chat.joinPolicyOwnerApprove') }, { value: 'open', label: $t('chat.joinPolicyOpen') }]"
343
344
  />
344
345
  </label>
345
346
  <label class="mp-field">
346
- <span>审批策略</span>
347
+ <span>{{ $t('chat.approvalPolicyLabel') }}</span>
347
348
  <a-select
348
349
  v-model:value="draft.approvalPolicy"
349
350
  size="small"
350
- :options="[{ value: 'owner_only', label: '仅 owner 可决策' }, { value: 'any_member', label: '任一成员可决策' }]"
351
+ :options="[{ value: 'owner_only', label: $t('chat.approvalOwnerOnly') }, { value: 'any_member', label: $t('chat.approvalAnyMember') }]"
351
352
  />
352
353
  </label>
353
354
  <label class="mp-field switch">
354
- <span>开启群聊</span>
355
+ <span>{{ $t('chat.chatEnabledLabel') }}</span>
355
356
  <a-switch
356
357
  v-model:checked="draft.chatEnabled"
357
358
  size="small"
@@ -367,7 +368,7 @@ const avatarText = (m: AepChannelMember): string =>
367
368
  type="link"
368
369
  @click="refresh().then(syncDraft)"
369
370
  >
370
- 刷新
371
+ {{ $t('chat.refresh') }}
371
372
  </a-button>
372
373
  </div>
373
374
  <a-button
@@ -377,7 +378,7 @@ const avatarText = (m: AepChannelMember): string =>
377
378
  :loading="busy === 'settings'"
378
379
  @click="onSaveSettings"
379
380
  >
380
- 保存设置
381
+ {{ $t('chat.saveSettings') }}
381
382
  </a-button>
382
383
  </div>
383
384
  </div>