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
@@ -24,6 +24,7 @@ import { classifyOperation, type OperationMeta } from '@/app/composables/worksho
24
24
 
25
25
  const props = defineProps<{ channelId: string }>()
26
26
 
27
+ const { t } = useI18n()
27
28
  const chat = useChatStore()
28
29
  const entities = useEntitiesStore()
29
30
  const notifications = useNotificationsStore()
@@ -53,7 +54,7 @@ function senderNameOf(m: AepChatMessage): string {
53
54
 
54
55
  function avatarText(m: AepChatMessage): string {
55
56
  if (m.senderType === 'agent') return senderNameOf(m).charAt(0).toUpperCase()
56
- return '人'
57
+ return t('chat.avatarHuman')
57
58
  }
58
59
 
59
60
  function renderText(m: AepChatMessage): string {
@@ -67,7 +68,7 @@ function operationOf(m: AepChatMessage): OperationMeta | null {
67
68
  /** 引用锚点的发送者名(锚点不在已加载窗口内 → 显示"更早的消息") */
68
69
  function replyAnchorName(m: AepChatMessage): string {
69
70
  const anchor = m.replyToId ? byId.value.get(m.replyToId) : undefined
70
- return anchor ? senderNameOf(anchor) : '更早的消息'
71
+ return anchor ? senderNameOf(anchor) : t('chat.earlierMessage')
71
72
  }
72
73
 
73
74
  /**
@@ -88,14 +89,22 @@ const deliveriesByMessage = computed<Map<string, AepChatDelivery[]>>(() => {
88
89
  })
89
90
  const deliveriesOf = (m: AepChatMessage): AepChatDelivery[] => deliveriesByMessage.value.get(m.id) ?? []
90
91
 
91
- const DELIVERY_META: Record<AepChatDelivery['status'], { label: string, tone: string }> = {
92
- pending: { label: '待投递', tone: 'pending' },
93
- delivered: { label: '已入信箱', tone: 'delivered' },
94
- consumed: { label: '已被消费', tone: 'consumed' },
95
- failed: { label: '投递失败', tone: 'failed' },
96
- cancelled: { label: '已取消', tone: 'cancelled' },
92
+ const DELIVERY_TONE: Record<AepChatDelivery['status'], string> = {
93
+ pending: 'pending',
94
+ delivered: 'delivered',
95
+ consumed: 'consumed',
96
+ failed: 'failed',
97
+ cancelled: 'cancelled',
97
98
  }
98
99
 
100
+ const deliveryLabels = computed<Record<AepChatDelivery['status'], string>>(() => ({
101
+ pending: t('chat.deliveryPending'),
102
+ delivered: t('chat.deliveryDelivered'),
103
+ consumed: t('chat.deliveryConsumed'),
104
+ failed: t('chat.deliveryFailed'),
105
+ cancelled: t('chat.deliveryCancelled'),
106
+ }))
107
+
99
108
  function setReply(m: AepChatMessage): void {
100
109
  chat.setReplyTarget({
101
110
  channelId: props.channelId,
@@ -181,19 +190,19 @@ watch(() => props.channelId, async () => {
181
190
  <div class="chat-timeline">
182
191
  <div class="ct-head">
183
192
  <span class="i-tabler-messages ct-icon" />
184
- <span class="ct-title">群聊</span>
185
- <span class="ct-count">{{ messages.length }} 条</span>
193
+ <span class="ct-title">{{ $t('chat.title') }}</span>
194
+ <span class="ct-count">{{ $t('chat.messageCount', { p0: messages.length }) }}</span>
186
195
  <span class="ct-spacer" />
187
196
  <span
188
197
  v-if="!atBottom"
189
198
  class="ct-jump"
190
199
  role="button"
191
200
  tabindex="0"
192
- title="回到最新"
201
+ :title="$t('chat.backToLatest')"
193
202
  @click="scrollToBottom(); atBottom = true"
194
203
  @keydown.enter="scrollToBottom(); atBottom = true"
195
204
  >
196
- <span class="i-tabler-arrow-down" /> 最新
205
+ <span class="i-tabler-arrow-down" /> {{ $t('chat.latest') }}
197
206
  </span>
198
207
  </div>
199
208
 
@@ -209,7 +218,7 @@ watch(() => props.channelId, async () => {
209
218
  :disabled="loading"
210
219
  @click="loadEarlier"
211
220
  >
212
- {{ loading ? '加载中…' : '加载更早的消息' }}
221
+ {{ loading ? $t('chat.loading') : $t('chat.loadEarlier') }}
213
222
  </button>
214
223
 
215
224
  <div
@@ -217,9 +226,9 @@ watch(() => props.channelId, async () => {
217
226
  class="ct-empty"
218
227
  >
219
228
  <span class="i-tabler-message-2 ct-empty-icon" />
220
- <div>还没有群聊消息</div>
229
+ <div>{{ $t('chat.emptyTitle') }}</div>
221
230
  <div class="ct-empty-sub">
222
- 直接发言只进群聊(0 次 Agent 执行);输入 @ 提及 Agent 才会触发执行,@ 成员只发定向通知。
231
+ {{ $t('chat.emptyHint') }}
223
232
  </div>
224
233
  </div>
225
234
 
@@ -252,16 +261,16 @@ watch(() => props.channelId, async () => {
252
261
  v-else-if="m.senderType === 'agent'"
253
262
  class="i-tabler-robot"
254
263
  />
255
- {{ m.senderType === 'agent' ? (entities.agents[channelId]?.find(a => a.agentId === m.senderId)?.role ?? 'agent') : (m.senderType === 'user' ? '用户' : '系统') }}
264
+ {{ m.senderType === 'agent' ? (entities.agents[channelId]?.find(a => a.agentId === m.senderId)?.role ?? 'agent') : (m.senderType === 'user' ? $t('chat.roleUser') : $t('chat.roleSystem')) }}
256
265
  </span>
257
266
  <span class="ct-time">{{ formatLocalClock(m.createdAt, false) }}</span>
258
267
  <button
259
268
  type="button"
260
269
  class="ct-reply-btn"
261
- title="引用这条消息回复"
270
+ :title="$t('chat.replyTitle')"
262
271
  @click="setReply(m)"
263
272
  >
264
- <span class="i-tabler-arrow-back-up" /> 回复
273
+ <span class="i-tabler-arrow-back-up" /> {{ $t('chat.reply') }}
265
274
  </button>
266
275
  </div>
267
276
 
@@ -270,7 +279,7 @@ watch(() => props.channelId, async () => {
270
279
  class="ct-replyto"
271
280
  >
272
281
  <span class="i-tabler-corner-down-right" />
273
- 回复 <b>{{ replyAnchorName(m) }}</b>
282
+ {{ $t('chat.reply') }} <b>{{ replyAnchorName(m) }}</b>
274
283
  </div>
275
284
 
276
285
  <div
@@ -301,7 +310,7 @@ watch(() => props.channelId, async () => {
301
310
  class="ct-mention-chip"
302
311
  :class="mm.type"
303
312
  :data-agent-id="mm.type === 'agent' ? mm.id : undefined"
304
- :title="mm.type === 'agent' ? '点击查看该 Agent' : '被 @ 的成员(不触发 Agent)'"
313
+ :title="mm.type === 'agent' ? $t('chat.mentionAgentTitle') : $t('chat.mentionMemberTitle')"
305
314
  @click="mm.type === 'agent' && openAgent({ channelId, agentId: mm.id })"
306
315
  >
307
316
  <span :class="mm.type === 'agent' ? 'i-tabler-robot' : 'i-tabler-user'" />
@@ -318,10 +327,10 @@ watch(() => props.channelId, async () => {
318
327
  v-for="d in deliveriesOf(m)"
319
328
  :key="d.deliveryId"
320
329
  class="ct-delivery"
321
- :data-tone="DELIVERY_META[d.status]?.tone ?? 'pending'"
330
+ :data-tone="DELIVERY_TONE[d.status] ?? 'pending'"
322
331
  :title="d.error || `deliveryId: ${d.deliveryId}`"
323
332
  >
324
- <span class="cd-dot" />@{{ entities.agentName(channelId, d.targetAgentId) }} · {{ DELIVERY_META[d.status]?.label ?? d.status }}
333
+ <span class="cd-dot" />@{{ entities.agentName(channelId, d.targetAgentId) }} · {{ deliveryLabels[d.status] ?? d.status }}
325
334
  </span>
326
335
  </div>
327
336
 
@@ -331,9 +340,9 @@ watch(() => props.channelId, async () => {
331
340
  class="ct-source"
332
341
  >
333
342
  <span class="i-tabler-link" />
334
- 回答自 {{ m.sourceChatMessageId.slice(0, 8) }}
343
+ {{ $t('chat.answeredFrom', { p0: m.sourceChatMessageId.slice(0, 8) }) }}
335
344
  <template v-if="m.requesterUserId">
336
- · 提问者 {{ m.requesterUserId.slice(0, 8) }}
345
+ {{ $t('chat.askedBy', { p0: m.requesterUserId.slice(0, 8) }) }}
337
346
  </template>
338
347
  </div>
339
348
  </div>
@@ -210,11 +210,11 @@ const sendChat = async (text: string): Promise<void> => {
210
210
  chat.clearReplyTarget()
211
211
  if (res.unresolvedMentions?.length) {
212
212
  // 服务端逐目标校验归属:名单外的 @ 不会被投递,必须让人看见
213
- message.warning(`未识别的 @: ${res.unresolvedMentions.join('、')}(不在本群成员内,未投递)`)
213
+ message.warning(t('chat.unresolvedMentions', { p0: res.unresolvedMentions.join('、') }))
214
214
  }
215
215
  const n = res.deliveries?.length ?? 0
216
- if (n > 0) message.success(`已发到群聊 · ${n} 个 Agent 已收到投递`)
217
- else message.success('已发到群聊(未 @Agent,无 Agent 执行)')
216
+ if (n > 0) message.success(t('chat.sentToChat', { p0: n }))
217
+ else message.success(t('chat.sentToChatNoAgent'))
218
218
  }
219
219
 
220
220
  const send = async (): Promise<void> => {
@@ -294,10 +294,10 @@ const send = async (): Promise<void> => {
294
294
  catch (e) {
295
295
  const code = chatErrorCode(e)
296
296
  if (mode.value === 'chat' && code === 'CHAT_DISABLED') {
297
- message.warning('该 Channel 未开启群聊 —— 请 owner 在右侧成员面板开启后重试')
297
+ message.warning(t('chat.composerChatDisabled'))
298
298
  }
299
299
  else if (mode.value === 'chat' && (code === 'NOT_CHANNEL_MEMBER' || code === 'FORBIDDEN_LEGACY')) {
300
- message.warning('你还不是该 Channel 的群成员 —— 请在右侧成员面板加入群聊')
300
+ message.warning(t('chat.composerNotMember'))
301
301
  }
302
302
  else {
303
303
  message.error(chatErrorMessage(e))
@@ -383,7 +383,7 @@ const reachHint = computed<Reach | null>(() => {
383
383
  })
384
384
 
385
385
  const placeholder = computed(() => {
386
- if (mode.value === 'chat') return '发送到群聊… @ 提及 Agent(触发执行)或成员(仅通知)'
386
+ if (mode.value === 'chat') return t('chat.composerPlaceholder')
387
387
  return mode.value === 'task'
388
388
  ? t('composer.k2h5jwc030')
389
389
  : t('composer.k15mwzt7031')
@@ -428,7 +428,7 @@ const placeholder = computed(() => {
428
428
  class="composer-block-hint"
429
429
  >
430
430
  <span class="i-tabler-lock" />
431
- {{ isMember ? '该 Channel 未开启群聊(owner 可在右侧成员面板开启)' : '你还不是群成员 —— 请在右侧成员面板加入群聊后发言' }}
431
+ {{ isMember ? $t('chat.blockChatDisabled') : $t('chat.blockNotMember') }}
432
432
  </div>
433
433
 
434
434
  <textarea
@@ -20,6 +20,7 @@ import type { AepNotification, AepNotificationType } from '#shared/workshop-prot
20
20
  const notifications = useNotificationsStore()
21
21
  const wsStore = useWorkspacesStore()
22
22
  const { hostNotifications } = useWorkshopWs()
23
+ const { t } = useI18n()
23
24
 
24
25
  const open = ref(false)
25
26
  const releaseHost = ref<(() => void) | null>(null)
@@ -48,14 +49,22 @@ watch(() => notifications.liveSeq, () => {
48
49
  })
49
50
  })
50
51
 
51
- const TYPE_META: Record<AepNotificationType, { label: string, icon: string, tone: string }> = {
52
- mention: { label: '@ 提及', icon: 'i-tabler-at', tone: 'mention' },
53
- agent_reply: { label: 'Agent 回复', icon: 'i-tabler-robot', tone: 'reply' },
54
- hitl_request: { label: '待审批', icon: 'i-tabler-alert-triangle', tone: 'hitl' },
55
- hitl_resolved: { label: '审批结果', icon: 'i-tabler-circle-check', tone: 'ok' },
56
- member: { label: '成员变更', icon: 'i-tabler-user-plus', tone: 'info' },
52
+ const TYPE_META: Record<AepNotificationType, { icon: string, tone: string }> = {
53
+ mention: { icon: 'i-tabler-at', tone: 'mention' },
54
+ agent_reply: { icon: 'i-tabler-robot', tone: 'reply' },
55
+ hitl_request: { icon: 'i-tabler-alert-triangle', tone: 'hitl' },
56
+ hitl_resolved: { icon: 'i-tabler-circle-check', tone: 'ok' },
57
+ member: { icon: 'i-tabler-user-plus', tone: 'info' },
57
58
  }
58
59
 
60
+ const typeLabels = computed<Record<AepNotificationType, string>>(() => ({
61
+ mention: t('notifications.typeMention'),
62
+ agent_reply: t('notifications.typeAgentReply'),
63
+ hitl_request: t('notifications.typeHitlRequest'),
64
+ hitl_resolved: t('notifications.typeHitlResolved'),
65
+ member: t('notifications.typeMember'),
66
+ }))
67
+
59
68
  const badge = computed(() => (notifications.unreadCount > 99 ? '99+' : String(notifications.unreadCount)))
60
69
 
61
70
  /** 点击通知:先标已读,再跳到对应界面(群聊消息 → 该频道群聊;审批 → 运行时监控) */
@@ -98,7 +107,7 @@ async function markAll(): Promise<void> {
98
107
  await notifications.markRead({ all: true })
99
108
  }
100
109
  catch (e) {
101
- message.error(e instanceof Error ? e.message : '标记已读失败')
110
+ message.error(e instanceof Error ? e.message : t('notifications.markReadFailed'))
102
111
  }
103
112
  finally {
104
113
  markingAll.value = false
@@ -115,7 +124,7 @@ async function markAll(): Promise<void> {
115
124
  <button
116
125
  class="icon-btn nc-bell"
117
126
  :class="{ unread: notifications.unreadCount > 0 }"
118
- title="我的通知(@ 提及 / Agent 回复 / 审批)"
127
+ :title="$t('notifications.bellTitle')"
119
128
  >
120
129
  <span class="i-tabler-bell" />
121
130
  <span
@@ -126,15 +135,15 @@ async function markAll(): Promise<void> {
126
135
  <template #overlay>
127
136
  <div class="nc-menu">
128
137
  <div class="nc-menu-title">
129
- <span>我的通知</span>
130
- <span class="nc-unread">{{ notifications.unreadCount }} 未读</span>
138
+ <span>{{ $t('notifications.title') }}</span>
139
+ <span class="nc-unread">{{ $t('notifications.unreadCount', { p0: notifications.unreadCount }) }}</span>
131
140
  <button
132
141
  v-if="notifications.unreadCount > 0"
133
142
  type="button"
134
143
  class="nc-markall"
135
144
  @click.stop="markAll"
136
145
  >
137
- 全部已读
146
+ {{ $t('notifications.markAllRead') }}
138
147
  </button>
139
148
  </div>
140
149
  <div class="nc-list">
@@ -152,7 +161,7 @@ async function markAll(): Promise<void> {
152
161
  />
153
162
  <span class="nc-item-body">
154
163
  <span class="nc-item-top">
155
- <span class="nc-item-type">{{ TYPE_META[n.type]?.label ?? n.type }}</span>
164
+ <span class="nc-item-type">{{ typeLabels[n.type] ?? n.type }}</span>
156
165
  <span class="nc-item-time">{{ formatLocalClock(n.createdAt, false) }}</span>
157
166
  </span>
158
167
  <span class="nc-item-title">{{ n.title }}</span>
@@ -171,7 +180,7 @@ async function markAll(): Promise<void> {
171
180
  v-if="notifications.items.length === 0"
172
181
  class="nc-empty"
173
182
  >
174
- 暂无通知 —— 被 @ 、收到 Agent 回复或审批请求时会出现在这里
183
+ {{ $t('notifications.empty') }}
175
184
  </div>
176
185
  </div>
177
186
  </div>
@@ -57,7 +57,7 @@ async function renderPanels(): Promise<void> {
57
57
  mounted.set(key, { el, cleanup: typeof cleanup === 'function' ? cleanup : undefined })
58
58
  }
59
59
  catch (err) {
60
- console.warn(`[plugin-slot] 面板渲染失败 ${key}:`, err)
60
+ console.warn(`[plugin-slot] panel render failed ${key}:`, err)
61
61
  }
62
62
  }
63
63
  }
@@ -95,13 +95,13 @@ const deadlineLabel = computed(() => {
95
95
  const ts = new Date(value).getTime()
96
96
  if (!Number.isFinite(ts)) return value
97
97
  const delta = ts - Date.now()
98
- if (delta <= 0) return '已超时'
98
+ if (delta <= 0) return t('taskInspectorDrawer.timedOut')
99
99
  const mins = Math.ceil(delta / 60_000)
100
- return mins < 60 ? `剩余约 ${mins} 分钟` : `截止 ${formatLocalClock(value)}`
100
+ return mins < 60 ? t('taskInspectorDrawer.remainingMinutes', { p0: mins }) : t('taskInspectorDrawer.deadlineAt', { p0: formatLocalClock(value) })
101
101
  })
102
102
  const cancelTitle = computed(() => childHealth.value.total > 0
103
- ? `这会同时停止 ${childHealth.value.active} 个活动后代任务,已完成结果会保留。确定继续?`
104
- : '确定取消这个任务吗?')
103
+ ? t('taskInspectorDrawer.cancelWithChildren', { p0: childHealth.value.active })
104
+ : t('taskInspectorDrawer.cancelConfirm'))
105
105
 
106
106
  /** AEP 状态时间线重放 */
107
107
  const timeline = computed(() => {
@@ -254,7 +254,7 @@ const stateColor: Record<string, string> = {
254
254
  v-if="childHealth.total > 0"
255
255
  class="guardrail-chip tree"
256
256
  >
257
- <span class="i-tabler-git-branch" /> 后代 {{ childHealth.total }} · 活动 {{ childHealth.active }} · 已取消 {{ childHealth.canceled }}
257
+ <span class="i-tabler-git-branch" /> {{ $t('taskInspectorDrawer.childrenStats', { p0: childHealth.total, p1: childHealth.active, p2: childHealth.canceled }) }}
258
258
  </span>
259
259
  </div>
260
260
 
@@ -51,7 +51,7 @@ const hasMore = computed(() => toolLines.value.length > MAX)
51
51
  v-if="t.meta.kind !== 'native'"
52
52
  class="tool-kind"
53
53
  :class="t.meta.kind"
54
- >{{ t.meta.kind === 'industrial' ? '工业' : 'harness' }}</span>
54
+ >{{ t.meta.kind === 'industrial' ? $t('clusterTool.kindIndustrial') : 'harness' }}</span>
55
55
  </div>
56
56
  <button
57
57
  v-if="hasMore"
@@ -41,10 +41,10 @@ const requireReply = defineModel<boolean>('requireReply', { required: true })
41
41
  v-if="canPost || !perms"
42
42
  type="button"
43
43
  :class="{ on: mode === 'chat' }"
44
- title="群聊:仅显式 @Agent 才触发执行"
44
+ :title="$t('chat.toolbarChatTitle')"
45
45
  @click="emit('pick', 'chat')"
46
46
  >
47
- 群聊
47
+ {{ $t('chat.title') }}
48
48
  </button>
49
49
  <button
50
50
  v-if="canManage || !perms || !canPost"
@@ -34,7 +34,7 @@ const emit = defineEmits<{
34
34
  class="aw-avatar mention-ava"
35
35
  :class="c.type === 'agent' ? 'is-agent' : 'is-user'"
36
36
  :style="{ '--av': c.type === 'agent' ? agentHueColor(c.id) : 'var(--ink-faint)' }"
37
- >{{ c.type === 'agent' ? 'A' : '人' }}</span>
37
+ >{{ c.type === 'agent' ? 'A' : $t('chat.avatarHuman') }}</span>
38
38
  <span class="mention-name">@{{ c.name }}</span>
39
39
  <span class="mention-role">{{ c.role }}</span>
40
40
  <span
@@ -16,12 +16,12 @@ const emit = defineEmits<{
16
16
  <template>
17
17
  <div class="reply-chip">
18
18
  <span class="i-tabler-arrow-back-up" />
19
- <span class="reply-label">回复 <b>{{ senderName }}</b></span>
19
+ <span class="reply-label">{{ $t('chat.reply') }} <b>{{ senderName }}</b></span>
20
20
  <span class="reply-excerpt">{{ excerpt }}</span>
21
21
  <button
22
22
  type="button"
23
23
  class="reply-cancel"
24
- title="取消回复"
24
+ :title="$t('chat.cancelReply')"
25
25
  @click="emit('cancel')"
26
26
  >
27
27
  <span class="i-tabler-x" />
@@ -22,37 +22,37 @@ defineProps<{
22
22
  <template>
23
23
  <div class="composer-status-chip">
24
24
  <template v-if="mode === 'chat'">
25
- <span class="chip-key">群聊</span>
25
+ <span class="chip-key">{{ $t('chat.title') }}</span>
26
26
  <span
27
27
  v-if="draftAgentMentions.length > 0"
28
28
  class="reach-chip"
29
29
  data-tone="info"
30
- :title="'仅显式 @Agent 触发执行'"
30
+ :title="$t('chat.reachAgentsTitle')"
31
31
  >
32
32
  <span
33
33
  class="reach-dot"
34
34
  aria-hidden="true"
35
- />@{{ draftAgentMentions.map(m => m.label).join(' @') }} · 将触发 {{ draftAgentMentions.length }} 次 Agent 执行
35
+ />{{ $t('chat.reachAgentsText', { p0: draftAgentMentions.map(m => m.label).join(' @'), p1: draftAgentMentions.length }) }}
36
36
  </span>
37
37
  <span
38
38
  v-else
39
39
  class="reach-chip"
40
40
  data-tone="ok"
41
- title="未 @Agent:消息只进群聊,不触发任何 Agent"
41
+ :title="$t('chat.reachNoAgentTitle')"
42
42
  >
43
43
  <span
44
44
  class="reach-dot"
45
45
  aria-hidden="true"
46
- />仅群聊 · 0 次 Agent 执行
46
+ />{{ $t('chat.reachNoAgentText') }}
47
47
  </span>
48
48
  <span
49
49
  v-if="draftUserMentions.length > 0"
50
50
  class="chip-hint"
51
- >@{{ draftUserMentions.map(m => m.label).join(' @') }} 将收到定向通知</span>
51
+ >@{{ draftUserMentions.map(m => m.label).join(' @') }}{{ $t('chat.notifyMembersSuffix') }}</span>
52
52
  <span
53
53
  v-else
54
54
  class="chip-hint"
55
- >输入 @ 提及成员 · Enter 发送</span>
55
+ >{{ $t('chat.mentionHint') }}</span>
56
56
  </template>
57
57
  <template v-else-if="mode === 'task'">
58
58
  <span class="chip-key">{{ $t('composer.k3wcox005') }}</span>
@@ -10,6 +10,7 @@ const props = defineProps<{ channelId: string }>()
10
10
  const events = useEventsStore()
11
11
  const entities = useEntitiesStore()
12
12
  const filter = ref<'all' | OperationKind>('all')
13
+ const { t } = useI18n()
13
14
 
14
15
  const allItems = computed<AepEnvelope[]>(() => events.ring(props.channelId).items)
15
16
  const operations = computed(() => allItems.value
@@ -34,7 +35,7 @@ const stats = computed(() => {
34
35
  })
35
36
 
36
37
  function agentName(e: AepEnvelope): string {
37
- return e.agentId ? entities.agentName(props.channelId, e.agentId) || e.agentId.slice(0, 8) : '系统'
38
+ return e.agentId ? entities.agentName(props.channelId, e.agentId) || e.agentId.slice(0, 8) : t('lineOps.systemName')
38
39
  }
39
40
  function tone(meta: OperationMeta): string {
40
41
  return `${meta.kind} ${meta.severity}`
@@ -47,14 +48,14 @@ function phaseTone(): string {
47
48
  <template>
48
49
  <section
49
50
  class="line-ops-panel"
50
- aria-label="产线作业面板"
51
+ :aria-label="$t('lineOps.panelAria')"
51
52
  >
52
53
  <header class="lop-head">
53
54
  <div>
54
55
  <div class="lop-kicker">
55
56
  <span class="lop-live" />LINE OPERATIONS
56
57
  </div>
57
- <h3>产线作业</h3>
58
+ <h3>{{ $t('lineOps.title') }}</h3>
58
59
  </div>
59
60
  <span
60
61
  class="lop-phase"
@@ -64,40 +65,40 @@ function phaseTone(): string {
64
65
 
65
66
  <div class="lop-summary">
66
67
  <div class="lop-stat dcw">
67
- <span>DCW</span><b>{{ stats.dcw }}</b><small>写控</small>
68
+ <span>DCW</span><b>{{ stats.dcw }}</b><small>{{ $t('lineOps.statDcw') }}</small>
68
69
  </div>
69
70
  <div class="lop-stat daq">
70
- <span>DAQ</span><b>{{ stats.daq }}</b><small>采集</small>
71
+ <span>DAQ</span><b>{{ stats.daq }}</b><small>{{ $t('lineOps.statDaq') }}</small>
71
72
  </div>
72
73
  <div class="lop-stat aml">
73
- <span>AML</span><b>{{ stats.aml }}</b><small>训练</small>
74
+ <span>AML</span><b>{{ stats.aml }}</b><small>{{ $t('lineOps.statAml') }}</small>
74
75
  </div>
75
76
  <div class="lop-stat safety">
76
- <span>SAFE</span><b>{{ stats.blocked }}</b><small>拦截</small>
77
+ <span>SAFE</span><b>{{ stats.blocked }}</b><small>{{ $t('lineOps.statSafe') }}</small>
77
78
  </div>
78
79
  </div>
79
80
 
80
81
  <nav
81
82
  class="lop-filters"
82
- aria-label="作业筛选"
83
+ :aria-label="$t('lineOps.filterAria')"
83
84
  >
84
85
  <button
85
86
  :class="{ on: filter === 'all' }"
86
87
  @click="filter = 'all'"
87
88
  >
88
- 全部
89
+ {{ $t('common.all') }}
89
90
  </button>
90
91
  <button
91
92
  :class="{ on: filter === 'dcw' }"
92
93
  @click="filter = 'dcw'"
93
94
  >
94
- 写控
95
+ {{ $t('lineOps.statDcw') }}
95
96
  </button>
96
97
  <button
97
98
  :class="{ on: filter === 'daq' }"
98
99
  @click="filter = 'daq'"
99
100
  >
100
- 取数
101
+ {{ $t('lineOps.filterDaq') }}
101
102
  </button>
102
103
  <button
103
104
  :class="{ on: filter === 'aml' }"
@@ -109,13 +110,13 @@ function phaseTone(): string {
109
110
  :class="{ on: filter === 'twin' }"
110
111
  @click="filter = 'twin'"
111
112
  >
112
- 孪生
113
+ {{ $t('lineOps.filterTwin') }}
113
114
  </button>
114
115
  <button
115
116
  :class="{ on: filter === 'safety' }"
116
117
  @click="filter = 'safety'"
117
118
  >
118
- 安全
119
+ {{ $t('lineOps.filterSafety') }}
119
120
  </button>
120
121
  </nav>
121
122
 
@@ -125,7 +126,7 @@ function phaseTone(): string {
125
126
  class="lop-empty"
126
127
  >
127
128
  <span class="i-tabler-activity-heartbeat" />
128
- <span>等待产线作业事件</span>
129
+ <span>{{ $t('lineOps.empty') }}</span>
129
130
  </div>
130
131
  <article
131
132
  v-for="item in visible.slice(0, 24)"
@@ -24,6 +24,8 @@ const emit = defineEmits<{
24
24
 
25
25
  const agent = computed(() => props.agent)
26
26
 
27
+ const { t } = useI18n()
28
+
27
29
  /**
28
30
  * §8 监督/watchdog 徽标:
29
31
  * - `watchdog N`:监督回合已触发 watchdog(观察信号,不是取消);
@@ -35,10 +37,10 @@ const supervisionBadge = computed(() => {
35
37
  if (!s) return null
36
38
  const live = s.state === 'RUNNING' || s.state === 'WATCHDOG_SIGNALED' || s.state === 'WAITING_FOR_RESULT'
37
39
  if (s.watchdogCount > 0 || s.state === 'WATCHDOG_SIGNALED') {
38
- return { kind: 'watchdog' as const, text: `watchdog ${s.watchdogCount}`, title: `监督观察阈值已触发(${s.watchdogAt ?? '-'});这是观察信号,不是取消` }
40
+ return { kind: 'watchdog' as const, text: `watchdog ${s.watchdogCount}`, title: t('agentLanesView.supervisionWatchdogTitle', { p0: s.watchdogAt ?? '-' }) }
39
41
  }
40
- if (live) return { kind: 'running' as const, text: 'supervising', title: `监督回合进行中(attempt=${s.attemptId?.slice(0, 8) ?? '-'},tick=${s.snapshotRevision ?? '-'})` }
41
- if (s.lastDecisionKind) return { kind: 'decision' as const, text: `决策 ${s.lastDecisionKind}`, title: `Lead 最后决策:${s.lastDecisionKind}(${s.completedAt ?? '-'})` }
42
+ if (live) return { kind: 'running' as const, text: 'supervising', title: t('agentLanesView.supervisionRunningTitle', { p0: s.attemptId?.slice(0, 8) ?? '-', p1: s.snapshotRevision ?? '-' }) }
43
+ if (s.lastDecisionKind) return { kind: 'decision' as const, text: t('agentLanesView.supervisionDecisionText', { p0: s.lastDecisionKind }), title: t('agentLanesView.supervisionDecisionTitle', { p0: s.lastDecisionKind, p1: s.completedAt ?? '-' }) }
42
44
  return null
43
45
  })
44
46
 
@@ -20,7 +20,26 @@ const emit = defineEmits<{
20
20
  const api = useWorkshopApi()
21
21
 
22
22
  // ===== Channel 实例设置(场景/工作目录热更新)+ 保存为模板 =====
23
- const settingsForm = reactive({ name: '', scenarioPrompt: '', workspace: '' })
23
+ const settingsForm = reactive({ name: '', scenarioPrompt: '', workspace: '', lineId: '' })
24
+
25
+ // ===== v18 绑定产线(只读扩权:成员可读该线日志/配方/历史/状态;写仍走节点授权) =====
26
+ interface LineOption { id: string, name: string, state?: string }
27
+ const lineOptions = ref<LineOption[]>([])
28
+ const linesLoading = ref(false)
29
+ const lineChanged = ref(false)
30
+ const loadLines = async (): Promise<void> => {
31
+ linesLoading.value = true
32
+ try {
33
+ const res = await api.listDcwLines()
34
+ lineOptions.value = res?.data?.lines ?? []
35
+ }
36
+ catch { /* 产线清单不可得时留空,不阻塞设置弹窗 */ }
37
+ finally { linesLoading.value = false }
38
+ }
39
+ const onLineChange = (v: unknown): void => {
40
+ settingsForm.lineId = String(v ?? '')
41
+ lineChanged.value = true
42
+ }
24
43
 
25
44
  // ===== Channel 级默认 LLM(harness → provider/model/effort;空 = 用引擎默认) =====
26
45
  interface CatalogProvider {
@@ -73,6 +92,9 @@ const openSettings = (): void => {
73
92
  settingsForm.name = meta?.name ?? ''
74
93
  settingsForm.scenarioPrompt = meta?.scenarioPrompt ?? ''
75
94
  settingsForm.workspace = meta?.workspace ?? ''
95
+ settingsForm.lineId = meta?.lineId ?? ''
96
+ lineChanged.value = false
97
+ void loadLines()
76
98
  // 预填 channel 默认 LLM(llmJson 由列表接口透传)
77
99
  let saved: ChannelLlmDefaults | null = null
78
100
  try {
@@ -136,6 +158,10 @@ const saveSettings = async (): Promise<void> => {
136
158
  ? { ...(llmForm.provider ? { provider: llmForm.provider } : {}), model: llmForm.model, ...(llmForm.effort ? { effort: llmForm.effort } : {}) }
137
159
  : null,
138
160
  })
161
+ // v18 绑线变更单独提交(只读扩权;成员运行时自动回收重装配)
162
+ if (lineChanged.value) {
163
+ await api.bindChannelLine(props.channelId, settingsForm.lineId || null)
164
+ }
139
165
  message.success(t('channelSessionList.kvsxlu6031'))
140
166
  open.value = false
141
167
  emit('saved')
@@ -165,6 +191,21 @@ const openSaveTemplate = (): void => {
165
191
  @ok="saveSettings"
166
192
  >
167
193
  <a-form layout="vertical">
194
+ <a-form-item :label="$t('channelSessionList.bindLineLabel')">
195
+ <a-select
196
+ :value="settingsForm.lineId || undefined"
197
+ :loading="linesLoading"
198
+ allow-clear
199
+ show-search
200
+ option-filter-prop="label"
201
+ :placeholder="$t('channelSessionList.bindLinePlaceholder')"
202
+ :options="lineOptions.map(l => ({ value: l.id, label: l.name }))"
203
+ @change="onLineChange"
204
+ />
205
+ <div class="bind-line-hint">
206
+ {{ $t('channelSessionList.bindLineHint') }}
207
+ </div>
208
+ </a-form-item>
168
209
  <a-form-item :label="$t('channelSessionList.k1i8q46x007')">
169
210
  <a-textarea
170
211
  v-model:value="settingsForm.scenarioPrompt"
@@ -326,4 +367,5 @@ const openSaveTemplate = (): void => {
326
367
  white-space: nowrap;
327
368
  }
328
369
  .ws-hint { font-size: 11px; color: var(--ink-faint); }
370
+ .bind-line-hint { margin-top: 4px; font-size: 11px; color: var(--ink-faint); line-height: 1.5; }
329
371
  </style>