agentworkshop 0.7.44 → 0.7.47

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 (1880) hide show
  1. package/.AgentWorkShop/prompts/host-tools.json +265 -6
  2. package/.AgentWorkShop/prompts/lead-supervise.md +54 -29
  3. package/.AgentWorkShop/prompts/peer-reply-optional.md +6 -2
  4. package/.AgentWorkShop/prompts/peer-reply-required.md +8 -7
  5. package/.output/.AgentWorkShop/aml-python/__pycache__/amlkit.cpython-312.pyc +0 -0
  6. package/.output/.AgentWorkShop/aml-python/amlkit.py +185 -120
  7. package/.output/.AgentWorkShop/aml-python/requirements.txt +9 -7
  8. package/.output/.AgentWorkShop/aml-python/train-hybrid-example.py +87 -0
  9. package/.output/.AgentWorkShop/prompts/host-tools.json +265 -6
  10. package/.output/.AgentWorkShop/prompts/lead-supervise.md +54 -29
  11. package/.output/.AgentWorkShop/prompts/peer-reply-optional.md +6 -2
  12. package/.output/.AgentWorkShop/prompts/peer-reply-required.md +8 -7
  13. package/.output/.AgentWorkShop/schema.json +12 -0
  14. package/.output/nitro.json +1 -1
  15. package/.output/public/_nuxt/-hB4kEmt.js +1 -0
  16. package/.output/public/_nuxt/1g9IT9Qh2.js +1 -0
  17. package/.output/public/_nuxt/74x7BOWv2.js +1 -0
  18. package/.output/public/_nuxt/9c5GOgbu.js +1 -0
  19. package/.output/public/_nuxt/9zrLAN2o2.js +1 -0
  20. package/.output/public/_nuxt/B1RT9NTO2.js +1 -0
  21. package/.output/public/_nuxt/B2x8SKRO.js +1 -0
  22. package/.output/public/_nuxt/B6Olw0Op.js +1 -0
  23. package/.output/public/_nuxt/B7jlMWsz.js +1 -0
  24. package/.output/public/_nuxt/B8cnjDtt.js +1 -0
  25. package/.output/public/_nuxt/B9rIcCX12.js +1 -0
  26. package/.output/public/_nuxt/BACBBVdw.js +1 -0
  27. package/.output/public/_nuxt/BBhLVYdM.js +1 -0
  28. package/.output/public/_nuxt/BDmNbZ252.js +1 -0
  29. package/.output/public/_nuxt/BFVf8HLR.js +1 -0
  30. package/.output/public/_nuxt/BGKUW7ra.js +1 -0
  31. package/.output/public/_nuxt/BH3obZJ42.js +1 -0
  32. package/.output/public/_nuxt/BHwG4yNs.js +1 -0
  33. package/.output/public/_nuxt/BIOq3xqe2.js +1 -0
  34. package/.output/public/_nuxt/BITZvQBK.js +1 -0
  35. package/.output/public/_nuxt/BL_dbd2v2.js +1 -0
  36. package/.output/public/_nuxt/BMMoqi94.js +1 -0
  37. package/.output/public/_nuxt/BNnnYEYh2.js +1 -0
  38. package/.output/public/_nuxt/BQXCMsXk.js +1 -0
  39. package/.output/public/_nuxt/BS9P_Ies2.js +1 -0
  40. package/.output/public/_nuxt/BWU1pvLL.js +1 -0
  41. package/.output/public/_nuxt/B_9_BM9G.js +3 -0
  42. package/.output/public/_nuxt/B_LcD7qE2.js +1 -0
  43. package/.output/public/_nuxt/BcQXL8pb.js +1 -0
  44. package/.output/public/_nuxt/BdM_Qr752.js +1 -0
  45. package/.output/public/_nuxt/BiOSWsjD.js +2 -0
  46. package/.output/public/_nuxt/BkSViqQd.js +1 -0
  47. package/.output/public/_nuxt/Bl5dYv4m.js +1 -0
  48. package/.output/public/_nuxt/BmiMC_BC.js +2 -0
  49. package/.output/public/_nuxt/BnpY_zNx.js +1 -0
  50. package/.output/public/_nuxt/BqYVLAcm.js +1 -0
  51. package/.output/public/_nuxt/Br3AySNQ.js +1 -0
  52. package/.output/public/_nuxt/Br3MggOL.js +1 -0
  53. package/.output/public/_nuxt/BrRX-l9B2.js +4108 -0
  54. package/.output/public/_nuxt/Bt2ZL5332.js +1 -0
  55. package/.output/public/_nuxt/Bub2P5me.js +28 -0
  56. package/.output/public/_nuxt/BvRk9kiK.js +0 -0
  57. package/.output/public/_nuxt/BvRk9kiK2.js +0 -0
  58. package/.output/public/_nuxt/Bwc6lt2X.js +3 -0
  59. package/.output/public/_nuxt/BxHBIVAg.js +1 -0
  60. package/.output/public/_nuxt/BxYTM0hb.js +1 -0
  61. package/.output/public/_nuxt/ByMj6e7s.js +3 -0
  62. package/.output/public/_nuxt/BzvHUfRR2.js +1 -0
  63. package/.output/public/_nuxt/C2YYOgMe.js +42 -0
  64. package/.output/public/_nuxt/C3twEwTh2.js +1 -0
  65. package/.output/public/_nuxt/C4WhK2wq.js +1 -0
  66. package/.output/public/_nuxt/C50LmoI1.js +0 -0
  67. package/.output/public/_nuxt/CAaSPBqk.js +1 -0
  68. package/.output/public/_nuxt/CBDX7p73.js +1 -0
  69. package/.output/public/_nuxt/CD9lpEz22.js +13 -0
  70. package/.output/public/_nuxt/CGZVhYJ4.js +1 -0
  71. package/.output/public/_nuxt/CJRDL4EG.js +1 -0
  72. package/.output/public/_nuxt/CKQPwwZa2.js +1 -0
  73. package/.output/public/_nuxt/CLySL7mW.js +75 -0
  74. package/.output/public/_nuxt/CMXcOb6W.js +1 -0
  75. package/.output/public/_nuxt/CN1CDAwe.js +1 -0
  76. package/.output/public/_nuxt/CP0I2l-6.js +1 -0
  77. package/.output/public/_nuxt/CP0Nep9S.js +1 -0
  78. package/.output/public/_nuxt/CPeZNE4S2.js +1 -0
  79. package/.output/public/_nuxt/CPmNRTBk2.js +21 -0
  80. package/.output/public/_nuxt/CQabB0oy.js +1 -0
  81. package/.output/public/_nuxt/CT-vTjcG.js +1 -0
  82. package/.output/public/_nuxt/CTVfcnjU.js +3 -0
  83. package/.output/public/_nuxt/CWzp2R6G.js +1 -0
  84. package/.output/public/_nuxt/C_VAXV7I2.js +7 -0
  85. package/.output/public/_nuxt/CavpkQb0.js +1 -0
  86. package/.output/public/_nuxt/CeWnOF3O.js +1 -0
  87. package/.output/public/_nuxt/CfLUvgr32.js +1 -0
  88. package/.output/public/_nuxt/Ch1P2mIf.js +1 -0
  89. package/.output/public/_nuxt/ChoLwR-s.js +1 -0
  90. package/.output/public/_nuxt/Chphw5IA2.js +1 -0
  91. package/.output/public/_nuxt/ChtjzEpK2.js +19 -0
  92. package/.output/public/_nuxt/CiTQY_n32.js +1 -0
  93. package/.output/public/_nuxt/Ck5oMvUk.js +1 -0
  94. package/.output/public/_nuxt/Ckafrjnw2.js +1 -0
  95. package/.output/public/_nuxt/Cm_PTn9t2.js +1 -0
  96. package/.output/public/_nuxt/Cmp8PMrA.js +1 -0
  97. package/.output/public/_nuxt/Cnrmlixo.js +3 -0
  98. package/.output/public/_nuxt/Cr518Gh02.js +1 -0
  99. package/.output/public/_nuxt/Crbir9cT.js +1 -0
  100. package/.output/public/_nuxt/CtPNnATm2.js +31 -0
  101. package/.output/public/_nuxt/Cu8c3oMN2.js +1 -0
  102. package/.output/public/_nuxt/CwLQAKay2.js +1 -0
  103. package/.output/public/_nuxt/CzlUIbK32.js +17 -0
  104. package/.output/public/_nuxt/D6lZftfy.js +1 -0
  105. package/.output/public/_nuxt/D83nVQPl.js +1 -0
  106. package/.output/public/_nuxt/D89BUtx6.js +1 -0
  107. package/.output/public/_nuxt/DCtk3qqr.js +1 -0
  108. package/.output/public/_nuxt/DD6Z0yPN2.js +1 -0
  109. package/.output/public/_nuxt/DGw8juu_.js +2 -0
  110. package/.output/public/_nuxt/DHSDk8Bq2.js +4 -0
  111. package/.output/public/_nuxt/DJdDFnjG2.js +1 -0
  112. package/.output/public/_nuxt/DJyNDnag.js +1 -0
  113. package/.output/public/_nuxt/DK3Fl9T5.js +1 -0
  114. package/.output/public/_nuxt/DLPuRMeG.js +19 -0
  115. package/.output/public/_nuxt/DMYYS5sK.js +1 -0
  116. package/.output/public/_nuxt/DNno23Jf2.js +1 -0
  117. package/.output/public/_nuxt/DNoEoo8t.js +1 -0
  118. package/.output/public/_nuxt/DPUXbTg92.js +1 -0
  119. package/.output/public/_nuxt/DRpFsrno.js +1 -0
  120. package/.output/public/_nuxt/DXIaadqv.js +1 -0
  121. package/.output/public/_nuxt/D_7AzAWe.js +1 -0
  122. package/.output/public/_nuxt/Dbe9TFc9.js +1 -0
  123. package/.output/public/_nuxt/DdNujZN5.js +1 -0
  124. package/.output/public/_nuxt/DdvQ7LRI.js +14 -0
  125. package/.output/public/_nuxt/DhFv8S2Z.js +1 -0
  126. package/.output/public/_nuxt/DkJVtqfc.js +1 -0
  127. package/.output/public/_nuxt/DkLCjrCk2.js +47 -0
  128. package/.output/public/_nuxt/DkpmSnHX.js +1 -0
  129. package/.output/public/_nuxt/DlUQa0wn2.js +1 -0
  130. package/.output/public/_nuxt/DoKpLEqc.js +1 -0
  131. package/.output/public/_nuxt/DpqA8D8_.js +1 -0
  132. package/.output/public/_nuxt/Dq0emNZi2.js +1 -0
  133. package/.output/public/_nuxt/DqtgGFEc.js +1 -0
  134. package/.output/public/_nuxt/DqtnqNgL2.js +1 -0
  135. package/.output/public/_nuxt/Dqz5HiXa.js +2 -0
  136. package/.output/public/_nuxt/DxagrjB8.js +1 -0
  137. package/.output/public/_nuxt/Dy3oXKdn2.js +1 -0
  138. package/.output/public/_nuxt/DzBbYWrw2.js +1 -0
  139. package/.output/public/_nuxt/EhhQmlBV2.js +1 -0
  140. package/.output/public/_nuxt/H2rNs1O82.js +1 -0
  141. package/.output/public/_nuxt/H6pPjo0l.js +1 -0
  142. package/.output/public/_nuxt/JAM4aNC_.js +1 -0
  143. package/.output/public/_nuxt/JgheoP3e.js +1 -0
  144. package/.output/public/_nuxt/LwIFGLgF.js +1 -0
  145. package/.output/public/_nuxt/Nw_6OpQZ2.js +1 -0
  146. package/.output/public/_nuxt/OXtV_ukR.js +1 -0
  147. package/.output/public/_nuxt/OmpTerminalPanel.ComMDrA8.css +1 -0
  148. package/.output/public/_nuxt/PLGqdko0.js +1 -0
  149. package/.output/public/_nuxt/PixDfCSm.js +1 -0
  150. package/.output/public/_nuxt/RAqsw632.js +1 -0
  151. package/.output/public/_nuxt/Sjjmp5OD2.js +1 -0
  152. package/.output/public/_nuxt/TOWR4WpO.js +1 -0
  153. package/.output/public/_nuxt/TownView.BvlfuLtP.css +1 -0
  154. package/.output/public/_nuxt/U8oQxruK.js +1 -0
  155. package/.output/public/_nuxt/WleoCtUX.js +1 -0
  156. package/.output/public/_nuxt/YaroNkJZ2.js +1 -0
  157. package/.output/public/_nuxt/Z-Z6EhXs.js +1 -0
  158. package/.output/public/_nuxt/ZuQtOnfI.js +1 -0
  159. package/.output/public/_nuxt/ZvXovq7N2.js +1 -0
  160. package/.output/public/_nuxt/_id_.BTrFUIHX.css +1 -0
  161. package/.output/public/_nuxt/_id_.Bossmhv1.css +1 -0
  162. package/.output/public/_nuxt/_wsId_.D-u-dbP9.css +1 -0
  163. package/.output/public/_nuxt/agents.Cgm_JG9L.css +1 -0
  164. package/.output/public/_nuxt/aml.Bi5X6_oi.css +1 -0
  165. package/.output/public/_nuxt/bg2adfck.js +1 -0
  166. package/.output/public/_nuxt/bt__BP-I.js +13 -0
  167. package/.output/public/_nuxt/builds/latest.json +1 -1
  168. package/.output/public/_nuxt/builds/meta/1b18aaf2-ccbc-45e0-b9c3-107655b226f9.json +1 -0
  169. package/.output/public/_nuxt/cBI0JqsV2.js +209 -0
  170. package/.output/public/_nuxt/cDcDztgb2.js +1 -0
  171. package/.output/public/_nuxt/cGSl2GZp.js +1 -0
  172. package/.output/public/_nuxt/csitHKnE2.js +1 -0
  173. package/.output/public/_nuxt/d-w5jR8R.js +1 -0
  174. package/.output/public/_nuxt/daq.0uieKcZk.css +1 -0
  175. package/.output/public/_nuxt/dcw.pQRVkAi_.css +1 -0
  176. package/.output/public/_nuxt/default.uao9U50c.css +1 -0
  177. package/.output/public/_nuxt/e7BBCLxr.js +1 -0
  178. package/.output/public/_nuxt/entry.6DEjPWvR.css +1 -0
  179. package/.output/public/_nuxt/eutnXI4F.js +24 -0
  180. package/.output/public/_nuxt/fxWyOzyp2.js +1 -0
  181. package/.output/public/_nuxt/hkMGMTqt.js +1 -0
  182. package/.output/public/_nuxt/ikAUnxx3.js +1 -0
  183. package/.output/public/_nuxt/lWYQbIR3.js +1 -0
  184. package/.output/public/_nuxt/logs.CD0Olr3c.css +1 -0
  185. package/.output/public/_nuxt/monitor.CI2v5Nvl.css +1 -0
  186. package/.output/public/_nuxt/pages.CMhSEhEb.css +1 -0
  187. package/.output/public/_nuxt/permissions.DxuOOIqQ.css +1 -0
  188. package/.output/public/_nuxt/plugins.C50x1qZp.css +1 -0
  189. package/.output/public/_nuxt/qOlYoGLf.js +1 -0
  190. package/.output/public/_nuxt/schedules.BXNJ9q_I.css +1 -0
  191. package/.output/public/_nuxt/settings.Bo5EYkLI.css +1 -0
  192. package/.output/public/_nuxt/teams.sGmx1AdX.css +1 -0
  193. package/.output/public/_nuxt/tokens.DFMFaCYU.css +1 -0
  194. package/.output/public/_nuxt/uI9Ki_XZ.js +9 -0
  195. package/.output/public/_nuxt/users.DBxcKnfg.css +1 -0
  196. package/.output/public/_nuxt/v55S8LnT.js +1 -0
  197. package/.output/public/_nuxt/wDPc4SSR.js +106 -0
  198. package/.output/public/_nuxt/workshop.b4YRXEe0.css +1 -0
  199. package/.output/public/_nuxt/y9kob70X.js +1 -0
  200. package/.output/public/_nuxt/zh-S_7rN.js +1 -0
  201. package/.output/server/chunks/_/LeftOutlined.mjs +1 -1
  202. package/.output/server/chunks/_/SearchOutlined.mjs +1243 -279
  203. package/.output/server/chunks/_/SearchOutlined.mjs.map +1 -1
  204. package/.output/server/chunks/_/binding-authz.mjs +1 -1
  205. package/.output/server/chunks/_/character-asset.repo.mjs +1 -1
  206. package/.output/server/chunks/_/entity.mjs +1 -1
  207. package/.output/server/chunks/_/env-manager.mjs +1 -1
  208. package/.output/server/chunks/_/host-bindings.mjs +1 -1
  209. package/.output/server/chunks/_/nitro.mjs +27006 -19064
  210. package/.output/server/chunks/_/nitro.mjs.map +1 -1
  211. package/.output/server/chunks/_/scene-layout.repo.mjs +1 -1
  212. package/.output/server/chunks/build/Checkbox-4EdGAAl_.mjs +206 -0
  213. package/.output/server/chunks/build/Checkbox-4EdGAAl_.mjs.map +1 -0
  214. package/.output/server/chunks/build/FormItemContext-4ORSzhWv.mjs +72 -0
  215. package/.output/server/chunks/build/FormItemContext-4ORSzhWv.mjs.map +1 -0
  216. package/.output/server/chunks/build/OmpTerminalPanel-EQHrOJbw.mjs +942 -0
  217. package/.output/server/chunks/build/OmpTerminalPanel-EQHrOJbw.mjs.map +1 -0
  218. package/.output/server/chunks/build/PluginSlot-BP_qedpQ.mjs +399 -0
  219. package/.output/server/chunks/build/PluginSlot-BP_qedpQ.mjs.map +1 -0
  220. package/.output/server/chunks/build/TownView-BAR8CPIZ.mjs +6373 -0
  221. package/.output/server/chunks/build/TownView-BAR8CPIZ.mjs.map +1 -0
  222. package/.output/server/chunks/build/_id_-DgMpjM3_.mjs +1354 -0
  223. package/.output/server/chunks/build/_id_-DgMpjM3_.mjs.map +1 -0
  224. package/.output/server/chunks/build/_id_-Dv3BQbYV.mjs +388 -0
  225. package/.output/server/chunks/build/_id_-Dv3BQbYV.mjs.map +1 -0
  226. package/.output/server/chunks/build/_wsId_-BKJvFmyf.mjs +13109 -0
  227. package/.output/server/chunks/build/_wsId_-BKJvFmyf.mjs.map +1 -0
  228. package/.output/server/chunks/build/agents-B2GLPmn2.mjs +1085 -0
  229. package/.output/server/chunks/build/agents-B2GLPmn2.mjs.map +1 -0
  230. package/.output/server/chunks/build/aml-DdWicH3t.mjs +806 -0
  231. package/.output/server/chunks/build/aml-DdWicH3t.mjs.map +1 -0
  232. package/.output/server/chunks/build/api-BY6ji7RC.mjs +50 -0
  233. package/.output/server/chunks/build/api-BY6ji7RC.mjs.map +1 -0
  234. package/.output/server/chunks/build/api-error-BwAQLw44.mjs +47 -0
  235. package/.output/server/chunks/build/api-error-BwAQLw44.mjs.map +1 -0
  236. package/.output/server/chunks/build/apiClient-D281qrK2.mjs +81 -0
  237. package/.output/server/chunks/build/apiClient-D281qrK2.mjs.map +1 -0
  238. package/.output/server/chunks/build/builtin-catalog-edpDcgfL.mjs +1 -1
  239. package/.output/server/chunks/build/card-CUSocE9p.mjs +953 -0
  240. package/.output/server/chunks/build/card-CUSocE9p.mjs.map +1 -0
  241. package/.output/server/chunks/build/channel-templates-RPOtkgRf.mjs +846 -0
  242. package/.output/server/chunks/build/channel-templates-RPOtkgRf.mjs.map +1 -0
  243. package/.output/server/chunks/build/checkbox-C4AKj81e.mjs +439 -0
  244. package/.output/server/chunks/build/checkbox-C4AKj81e.mjs.map +1 -0
  245. package/.output/server/chunks/build/client-only-qNA2OVV_.mjs +43 -0
  246. package/.output/server/chunks/build/client-only-qNA2OVV_.mjs.map +1 -0
  247. package/.output/server/chunks/build/constants-HPHJvjne.mjs +139 -0
  248. package/.output/server/chunks/build/constants-HPHJvjne.mjs.map +1 -0
  249. package/.output/server/chunks/build/core-CgTOPS4t.mjs +294 -0
  250. package/.output/server/chunks/build/core-CgTOPS4t.mjs.map +1 -0
  251. package/.output/server/chunks/build/daq-CPtsh0e7.mjs +1253 -0
  252. package/.output/server/chunks/build/daq-CPtsh0e7.mjs.map +1 -0
  253. package/.output/server/chunks/build/dcw-ry5Gyw6Y.mjs +478 -0
  254. package/.output/server/chunks/build/dcw-ry5Gyw6Y.mjs.map +1 -0
  255. package/.output/server/chunks/build/default-DxOE1eB0.mjs +2061 -0
  256. package/.output/server/chunks/build/default-DxOE1eB0.mjs.map +1 -0
  257. package/.output/server/chunks/build/descriptions-CFaUq4y4.mjs +406 -0
  258. package/.output/server/chunks/build/descriptions-CFaUq4y4.mjs.map +1 -0
  259. package/.output/server/chunks/build/drawer-Cfh9_zft.mjs +834 -0
  260. package/.output/server/chunks/build/drawer-Cfh9_zft.mjs.map +1 -0
  261. package/.output/server/chunks/build/dropdown-KdKWCS5K.mjs +556 -0
  262. package/.output/server/chunks/build/dropdown-KdKWCS5K.mjs.map +1 -0
  263. package/.output/server/chunks/build/dropdown-Yev6knaj.mjs +14 -0
  264. package/.output/server/chunks/build/dropdown-Yev6knaj.mjs.map +1 -0
  265. package/.output/server/chunks/build/form-uSlNqIAV.mjs +4711 -0
  266. package/.output/server/chunks/build/form-uSlNqIAV.mjs.map +1 -0
  267. package/.output/server/chunks/build/input-Cr_KFj4T.mjs +1381 -0
  268. package/.output/server/chunks/build/input-Cr_KFj4T.mjs.map +1 -0
  269. package/.output/server/chunks/build/input-number-BRVnxeiA.mjs +1119 -0
  270. package/.output/server/chunks/build/input-number-BRVnxeiA.mjs.map +1 -0
  271. package/.output/server/chunks/build/interval-DvHBIIZh.mjs +9 -0
  272. package/.output/server/chunks/build/interval-DvHBIIZh.mjs.map +1 -0
  273. package/.output/server/chunks/build/logs-CeaiO3y9.mjs +367 -0
  274. package/.output/server/chunks/build/logs-CeaiO3y9.mjs.map +1 -0
  275. package/.output/server/chunks/build/menu-BgkRSSx7.mjs +1949 -0
  276. package/.output/server/chunks/build/menu-BgkRSSx7.mjs.map +1 -0
  277. package/.output/server/chunks/build/monitor-DnuXEIi5.mjs +2245 -0
  278. package/.output/server/chunks/build/monitor-DnuXEIi5.mjs.map +1 -0
  279. package/.output/server/chunks/build/narrow-fetch-CcG-BPxc.mjs +6 -0
  280. package/.output/server/chunks/build/narrow-fetch-CcG-BPxc.mjs.map +1 -0
  281. package/.output/server/chunks/build/pages-Bn90ijKD.mjs +539 -0
  282. package/.output/server/chunks/build/pages-Bn90ijKD.mjs.map +1 -0
  283. package/.output/server/chunks/build/permissions-DL70W1YD.mjs +629 -0
  284. package/.output/server/chunks/build/permissions-DL70W1YD.mjs.map +1 -0
  285. package/.output/server/chunks/build/plugins-DrsZo--K.mjs +246 -0
  286. package/.output/server/chunks/build/plugins-DrsZo--K.mjs.map +1 -0
  287. package/.output/server/chunks/build/popconfirm-Ox-_2V8A.mjs +339 -0
  288. package/.output/server/chunks/build/popconfirm-Ox-_2V8A.mjs.map +1 -0
  289. package/.output/server/chunks/build/schedules-VLzNcjnW.mjs +7164 -0
  290. package/.output/server/chunks/build/schedules-VLzNcjnW.mjs.map +1 -0
  291. package/.output/server/chunks/build/segmented-C61yLHvo.mjs +341 -0
  292. package/.output/server/chunks/build/segmented-C61yLHvo.mjs.map +1 -0
  293. package/.output/server/chunks/build/select-rdBWytVK.mjs +3922 -0
  294. package/.output/server/chunks/build/select-rdBWytVK.mjs.map +1 -0
  295. package/.output/server/chunks/build/settings-DVAUVMsX.mjs +1089 -0
  296. package/.output/server/chunks/build/settings-DVAUVMsX.mjs.map +1 -0
  297. package/.output/server/chunks/build/space-B2uhHJG8.mjs +110 -0
  298. package/.output/server/chunks/build/space-B2uhHJG8.mjs.map +1 -0
  299. package/.output/server/chunks/build/spin-C2cuvGth.mjs +357 -0
  300. package/.output/server/chunks/build/spin-C2cuvGth.mjs.map +1 -0
  301. package/.output/server/chunks/build/switch-DZAUIbIN.mjs +377 -0
  302. package/.output/server/chunks/build/switch-DZAUIbIN.mjs.map +1 -0
  303. package/.output/server/chunks/build/table-DOFAvY-v.mjs +8881 -0
  304. package/.output/server/chunks/build/table-DOFAvY-v.mjs.map +1 -0
  305. package/.output/server/chunks/build/tabs-DTeIuZeP.mjs +1923 -0
  306. package/.output/server/chunks/build/tabs-DTeIuZeP.mjs.map +1 -0
  307. package/.output/server/chunks/build/tag-CHLGvNM6.mjs +1029 -0
  308. package/.output/server/chunks/build/tag-CHLGvNM6.mjs.map +1 -0
  309. package/.output/server/chunks/build/teams-Mc07PYO8.mjs +1195 -0
  310. package/.output/server/chunks/build/teams-Mc07PYO8.mjs.map +1 -0
  311. package/.output/server/chunks/build/tokens-DiwD5qni.mjs +1036 -0
  312. package/.output/server/chunks/build/tokens-DiwD5qni.mjs.map +1 -0
  313. package/.output/server/chunks/build/town-BIn3be5v.mjs +39 -0
  314. package/.output/server/chunks/build/town-BIn3be5v.mjs.map +1 -0
  315. package/.output/server/chunks/build/town-D8VmTCmN.mjs +128 -0
  316. package/.output/server/chunks/build/town-D8VmTCmN.mjs.map +1 -0
  317. package/.output/server/chunks/build/types-D6J7slEa.mjs +5561 -0
  318. package/.output/server/chunks/build/types-D6J7slEa.mjs.map +1 -0
  319. package/.output/server/chunks/build/useAgentHarnessOptions-CPn5dzKe.mjs +121 -0
  320. package/.output/server/chunks/build/useAgentHarnessOptions-CPn5dzKe.mjs.map +1 -0
  321. package/.output/server/chunks/build/useAgentTemplateActions-DQWzVnZ0.mjs +74 -0
  322. package/.output/server/chunks/build/useAgentTemplateActions-DQWzVnZ0.mjs.map +1 -0
  323. package/.output/server/chunks/build/useAgentTemplateDialogState-CZzpu5og.mjs +64 -0
  324. package/.output/server/chunks/build/useAgentTemplateDialogState-CZzpu5og.mjs.map +1 -0
  325. package/.output/server/chunks/build/useAgentTemplateForm-vqyiRPtt.mjs +114 -0
  326. package/.output/server/chunks/build/useAgentTemplateForm-vqyiRPtt.mjs.map +1 -0
  327. package/.output/server/chunks/build/useAgentTemplatesCatalog-DcQbsOik.mjs +130 -0
  328. package/.output/server/chunks/build/useAgentTemplatesCatalog-DcQbsOik.mjs.map +1 -0
  329. package/.output/server/chunks/build/useAmlDatasets-BM0lZu40.mjs +89 -0
  330. package/.output/server/chunks/build/useAmlDatasets-BM0lZu40.mjs.map +1 -0
  331. package/.output/server/chunks/build/useAmlEntities-BjXWvFd_.mjs +83 -0
  332. package/.output/server/chunks/build/useAmlEntities-BjXWvFd_.mjs.map +1 -0
  333. package/.output/server/chunks/build/useAmlEnv-BB7p6x_w.mjs +191 -0
  334. package/.output/server/chunks/build/useAmlEnv-BB7p6x_w.mjs.map +1 -0
  335. package/.output/server/chunks/build/useAmlExperiments-BtyW32PO.mjs +86 -0
  336. package/.output/server/chunks/build/useAmlExperiments-BtyW32PO.mjs.map +1 -0
  337. package/.output/server/chunks/build/useAmlFormat-WrKuRfw2.mjs +79 -0
  338. package/.output/server/chunks/build/useAmlFormat-WrKuRfw2.mjs.map +1 -0
  339. package/.output/server/chunks/build/useAmlJobs-DBuLvWMF.mjs +263 -0
  340. package/.output/server/chunks/build/useAmlJobs-DBuLvWMF.mjs.map +1 -0
  341. package/.output/server/chunks/build/useAmlModels-VurmkBYe.mjs +90 -0
  342. package/.output/server/chunks/build/useAmlModels-VurmkBYe.mjs.map +1 -0
  343. package/.output/server/chunks/build/useAmlNotes-BUdj3X6Y.mjs +83 -0
  344. package/.output/server/chunks/build/useAmlNotes-BUdj3X6Y.mjs.map +1 -0
  345. package/.output/server/chunks/build/useAmlPredict-DFy-Do10.mjs +127 -0
  346. package/.output/server/chunks/build/useAmlPredict-DFy-Do10.mjs.map +1 -0
  347. package/.output/server/chunks/build/useDaqAddNode-kW7uTSMQ.mjs +139 -0
  348. package/.output/server/chunks/build/useDaqAddNode-kW7uTSMQ.mjs.map +1 -0
  349. package/.output/server/chunks/build/useDaqDetailBinding-cpBz4hSL.mjs +67 -0
  350. package/.output/server/chunks/build/useDaqDetailBinding-cpBz4hSL.mjs.map +1 -0
  351. package/.output/server/chunks/build/useDaqDetailFrames-BZGtKKXW.mjs +76 -0
  352. package/.output/server/chunks/build/useDaqDetailFrames-BZGtKKXW.mjs.map +1 -0
  353. package/.output/server/chunks/build/useDaqDetailHistory-C4_hVeqZ.mjs +173 -0
  354. package/.output/server/chunks/build/useDaqDetailHistory-C4_hVeqZ.mjs.map +1 -0
  355. package/.output/server/chunks/build/useDaqDetailNode-Bwid_iA8.mjs +96 -0
  356. package/.output/server/chunks/build/useDaqDetailNode-Bwid_iA8.mjs.map +1 -0
  357. package/.output/server/chunks/build/useDaqDetailParams-JfqHvTxr.mjs +156 -0
  358. package/.output/server/chunks/build/useDaqDetailParams-JfqHvTxr.mjs.map +1 -0
  359. package/.output/server/chunks/build/useDaqFilters-C13836p-.mjs +219 -0
  360. package/.output/server/chunks/build/useDaqFilters-C13836p-.mjs.map +1 -0
  361. package/.output/server/chunks/build/useDaqNodeWindow-1DWj2H5G.mjs +87 -0
  362. package/.output/server/chunks/build/useDaqNodeWindow-1DWj2H5G.mjs.map +1 -0
  363. package/.output/server/chunks/build/useDaqOptimizations-Ct-TSXxy.mjs +133 -0
  364. package/.output/server/chunks/build/useDaqOptimizations-Ct-TSXxy.mjs.map +1 -0
  365. package/.output/server/chunks/build/useDaqStream-wOxZcMDA.mjs +395 -0
  366. package/.output/server/chunks/build/useDaqStream-wOxZcMDA.mjs.map +1 -0
  367. package/.output/server/chunks/build/useDaqTemplates-BqQRdrIm.mjs +184 -0
  368. package/.output/server/chunks/build/useDaqTemplates-BqQRdrIm.mjs.map +1 -0
  369. package/.output/server/chunks/build/useDashboardCharts-DZysNDUX.mjs +351 -0
  370. package/.output/server/chunks/build/useDashboardCharts-DZysNDUX.mjs.map +1 -0
  371. package/.output/server/chunks/build/useDashboardData-Ny_wtbo6.mjs +150 -0
  372. package/.output/server/chunks/build/useDashboardData-Ny_wtbo6.mjs.map +1 -0
  373. package/.output/server/chunks/build/useDcwAddNode-C8nE7geh.mjs +148 -0
  374. package/.output/server/chunks/build/useDcwAddNode-C8nE7geh.mjs.map +1 -0
  375. package/.output/server/chunks/build/useDcwCards-ETEsHvVy.mjs +64 -0
  376. package/.output/server/chunks/build/useDcwCards-ETEsHvVy.mjs.map +1 -0
  377. package/.output/server/chunks/build/useDcwDetailScope-BNrpDzbO.mjs +181 -0
  378. package/.output/server/chunks/build/useDcwDetailScope-BNrpDzbO.mjs.map +1 -0
  379. package/.output/server/chunks/build/useDcwDetailTemplates-IcKAJ37Y.mjs +145 -0
  380. package/.output/server/chunks/build/useDcwDetailTemplates-IcKAJ37Y.mjs.map +1 -0
  381. package/.output/server/chunks/build/useDcwFilter-FfVlDdyS.mjs +68 -0
  382. package/.output/server/chunks/build/useDcwFilter-FfVlDdyS.mjs.map +1 -0
  383. package/.output/server/chunks/build/useDcwLedger-BLoMmcu1.mjs +76 -0
  384. package/.output/server/chunks/build/useDcwLedger-BLoMmcu1.mjs.map +1 -0
  385. package/.output/server/chunks/build/useDcwLineMutations-BMC5BTWU.mjs +134 -0
  386. package/.output/server/chunks/build/useDcwLineMutations-BMC5BTWU.mjs.map +1 -0
  387. package/.output/server/chunks/build/useDcwLineRun-Bpxk4mse.mjs +101 -0
  388. package/.output/server/chunks/build/useDcwLineRun-Bpxk4mse.mjs.map +1 -0
  389. package/.output/server/chunks/build/useDcwProducts-D-zrMaeV.mjs +90 -0
  390. package/.output/server/chunks/build/useDcwProducts-D-zrMaeV.mjs.map +1 -0
  391. package/.output/server/chunks/build/useDcwQuery-1lYHOaU6.mjs +95 -0
  392. package/.output/server/chunks/build/useDcwQuery-1lYHOaU6.mjs.map +1 -0
  393. package/.output/server/chunks/build/useDcwQuickActions-C-tgcXIr.mjs +85 -0
  394. package/.output/server/chunks/build/useDcwQuickActions-C-tgcXIr.mjs.map +1 -0
  395. package/.output/server/chunks/build/useDcwRecipes-BzGOymqz.mjs +237 -0
  396. package/.output/server/chunks/build/useDcwRecipes-BzGOymqz.mjs.map +1 -0
  397. package/.output/server/chunks/build/useDcwStream-D04kCV3J.mjs +435 -0
  398. package/.output/server/chunks/build/useDcwStream-D04kCV3J.mjs.map +1 -0
  399. package/.output/server/chunks/build/useDcwTemplates-Dsjw9u6U.mjs +88 -0
  400. package/.output/server/chunks/build/useDcwTemplates-Dsjw9u6U.mjs.map +1 -0
  401. package/.output/server/chunks/build/useDcwWrites-3RxwN36I.mjs +120 -0
  402. package/.output/server/chunks/build/useDcwWrites-3RxwN36I.mjs.map +1 -0
  403. package/.output/server/chunks/build/useDeviceTwins-CbVad1M3.mjs +128 -0
  404. package/.output/server/chunks/build/useDeviceTwins-CbVad1M3.mjs.map +1 -0
  405. package/.output/server/chunks/build/useLocalTime-9a4B-aHv.mjs +1 -8
  406. package/.output/server/chunks/build/useLocalTime-9a4B-aHv.mjs.map +1 -1
  407. package/.output/server/chunks/build/useLogsFormat-BlwLpyzy.mjs +74 -0
  408. package/.output/server/chunks/build/useLogsFormat-BlwLpyzy.mjs.map +1 -0
  409. package/.output/server/chunks/build/useLogsManual-Deev2Cjk.mjs +81 -0
  410. package/.output/server/chunks/build/useLogsManual-Deev2Cjk.mjs.map +1 -0
  411. package/.output/server/chunks/build/useLogsQuery-CRAm2hmS.mjs +112 -0
  412. package/.output/server/chunks/build/useLogsQuery-CRAm2hmS.mjs.map +1 -0
  413. package/.output/server/chunks/build/useLogsScope-ClNijVj4.mjs +80 -0
  414. package/.output/server/chunks/build/useLogsScope-ClNijVj4.mjs.map +1 -0
  415. package/.output/server/chunks/build/useMonitorColumns-ylxrUNTK.mjs +212 -0
  416. package/.output/server/chunks/build/useMonitorColumns-ylxrUNTK.mjs.map +1 -0
  417. package/.output/server/chunks/build/useMonitorData-CEpKXoD4.mjs +131 -0
  418. package/.output/server/chunks/build/useMonitorData-CEpKXoD4.mjs.map +1 -0
  419. package/.output/server/chunks/build/useMonitorFormat-_7zLapf3.mjs +87 -0
  420. package/.output/server/chunks/build/useMonitorFormat-_7zLapf3.mjs.map +1 -0
  421. package/.output/server/chunks/build/useMonitorTerminal-Dj4QwRNW.mjs +68 -0
  422. package/.output/server/chunks/build/useMonitorTerminal-Dj4QwRNW.mjs.map +1 -0
  423. package/.output/server/chunks/build/useOpsLog-CgnNG7_n.mjs +137 -0
  424. package/.output/server/chunks/build/useOpsLog-CgnNG7_n.mjs.map +1 -0
  425. package/.output/server/chunks/build/useTeamActions-D6sxdpkP.mjs +76 -0
  426. package/.output/server/chunks/build/useTeamActions-D6sxdpkP.mjs.map +1 -0
  427. package/.output/server/chunks/build/useTeamAddMemberDialog-Q-ntQ6Vo.mjs +81 -0
  428. package/.output/server/chunks/build/useTeamAddMemberDialog-Q-ntQ6Vo.mjs.map +1 -0
  429. package/.output/server/chunks/build/useTeamCreateDialog-D7OMfDTM.mjs +94 -0
  430. package/.output/server/chunks/build/useTeamCreateDialog-D7OMfDTM.mjs.map +1 -0
  431. package/.output/server/chunks/build/useTeamDeployDialog-vBRqjiut.mjs +77 -0
  432. package/.output/server/chunks/build/useTeamDeployDialog-vBRqjiut.mjs.map +1 -0
  433. package/.output/server/chunks/build/useTeamDialogState-CFRUQxAf.mjs +79 -0
  434. package/.output/server/chunks/build/useTeamDialogState-CFRUQxAf.mjs.map +1 -0
  435. package/.output/server/chunks/build/useTeamPluginDialog-B8kxewpZ.mjs +100 -0
  436. package/.output/server/chunks/build/useTeamPluginDialog-B8kxewpZ.mjs.map +1 -0
  437. package/.output/server/chunks/build/useTeamsCatalog-xRhk7ezA.mjs +120 -0
  438. package/.output/server/chunks/build/useTeamsCatalog-xRhk7ezA.mjs.map +1 -0
  439. package/.output/server/chunks/build/useTokenClipboard-CwQpoFeP.mjs +69 -0
  440. package/.output/server/chunks/build/useTokenClipboard-CwQpoFeP.mjs.map +1 -0
  441. package/.output/server/chunks/build/useTokenCreate-DpDcF1Vx.mjs +112 -0
  442. package/.output/server/chunks/build/useTokenCreate-DpDcF1Vx.mjs.map +1 -0
  443. package/.output/server/chunks/build/useTokenRename-BRejFrtc.mjs +84 -0
  444. package/.output/server/chunks/build/useTokenRename-BRejFrtc.mjs.map +1 -0
  445. package/.output/server/chunks/build/useTokenReveal-DER2afAS.mjs +115 -0
  446. package/.output/server/chunks/build/useTokenReveal-DER2afAS.mjs.map +1 -0
  447. package/.output/server/chunks/build/useTokensList-DHt65IOY.mjs +89 -0
  448. package/.output/server/chunks/build/useTokensList-DHt65IOY.mjs.map +1 -0
  449. package/.output/server/chunks/build/useWorkbenchAuth-B2j-zILO.mjs +135 -0
  450. package/.output/server/chunks/build/useWorkbenchAuth-B2j-zILO.mjs.map +1 -0
  451. package/.output/server/chunks/build/useWorkbenchWorkspaces-B_2mOxN6.mjs +133 -0
  452. package/.output/server/chunks/build/useWorkbenchWorkspaces-B_2mOxN6.mjs.map +1 -0
  453. package/.output/server/chunks/build/useWorkshopApi-B1B9vd4m.mjs +102 -0
  454. package/.output/server/chunks/build/useWorkshopApi-B1B9vd4m.mjs.map +1 -0
  455. package/.output/server/chunks/build/useWorkshopWs-B-Es2Xg3.mjs +1782 -0
  456. package/.output/server/chunks/build/useWorkshopWs-B-Es2Xg3.mjs.map +1 -0
  457. package/.output/server/chunks/build/useWorkspaceAuth-tQ1ORWXo.mjs +57 -0
  458. package/.output/server/chunks/build/useWorkspaceAuth-tQ1ORWXo.mjs.map +1 -0
  459. package/.output/server/chunks/build/useWorkspaceChannels-BwB6TAWY.mjs +87 -0
  460. package/.output/server/chunks/build/useWorkspaceChannels-BwB6TAWY.mjs.map +1 -0
  461. package/.output/server/chunks/build/useWorkspacePanels-CuAmDpT5.mjs +75 -0
  462. package/.output/server/chunks/build/useWorkspacePanels-CuAmDpT5.mjs.map +1 -0
  463. package/.output/server/chunks/build/useWorkspaceShell-CcQ4JlqO.mjs +165 -0
  464. package/.output/server/chunks/build/useWorkspaceShell-CcQ4JlqO.mjs.map +1 -0
  465. package/.output/server/chunks/build/users-De2HygNt.mjs +561 -0
  466. package/.output/server/chunks/build/users-De2HygNt.mjs.map +1 -0
  467. package/.output/server/chunks/build/workshop-CmgpTwyf.mjs +1018 -0
  468. package/.output/server/chunks/build/workshop-CmgpTwyf.mjs.map +1 -0
  469. package/.output/server/chunks/build/workspaces-DVIEk1Bl.mjs +139 -0
  470. package/.output/server/chunks/build/workspaces-DVIEk1Bl.mjs.map +1 -0
  471. package/.output/server/chunks/routes/api/health.get.mjs +2 -2
  472. package/.output/server/chunks/routes/api/index.get.mjs +2 -2
  473. package/.output/server/chunks/routes/api/index.post.mjs +2 -2
  474. package/.output/server/chunks/routes/api/mcp/workshop.mjs +2 -2
  475. package/.output/server/chunks/routes/api/metrics.mjs +2 -2
  476. package/.output/server/chunks/routes/api/plugins/_name/_...path_.mjs +2 -2
  477. package/.output/server/chunks/routes/api/plugins/client/_name_.get.mjs +2 -2
  478. package/.output/server/chunks/routes/api/plugins/i18n.get.mjs +2 -2
  479. package/.output/server/chunks/routes/api/plugins/manifest.get.mjs +2 -2
  480. package/.output/server/chunks/routes/api/system/config-groups/_id_.delete.mjs +2 -2
  481. package/.output/server/chunks/routes/api/system/config-groups/_id_.patch.mjs +2 -2
  482. package/.output/server/chunks/routes/api/system/config.get.mjs +2 -2
  483. package/.output/server/chunks/routes/api/system/index.get.mjs +2 -2
  484. package/.output/server/chunks/routes/api/system/index.patch.mjs +2 -2
  485. package/.output/server/chunks/routes/api/system/index.post.mjs +2 -2
  486. package/.output/server/chunks/routes/api/system/index2.get.mjs +2 -2
  487. package/.output/server/chunks/routes/api/system/monitor/terminal/ws.mjs +35 -4
  488. package/.output/server/chunks/routes/api/system/monitor/terminal/ws.mjs.map +1 -1
  489. package/.output/server/chunks/routes/api/system/monitor/terminate.post.mjs +2 -2
  490. package/.output/server/chunks/routes/api/system/monitor.get.mjs +2 -2
  491. package/.output/server/chunks/routes/api/system/settings/events.get.mjs +2 -2
  492. package/.output/server/chunks/routes/api/system/settings/reset.post.mjs +2 -2
  493. package/.output/server/chunks/routes/api/users/_id_.delete.mjs +2 -2
  494. package/.output/server/chunks/routes/api/users/_id_.get.mjs +2 -2
  495. package/.output/server/chunks/routes/api/users/_id_.put.mjs +2 -2
  496. package/.output/server/chunks/routes/api/users/index.get.mjs +2 -2
  497. package/.output/server/chunks/routes/api/users/index.post.mjs +2 -2
  498. package/.output/server/chunks/routes/api/users/login.post.mjs +2 -2
  499. package/.output/server/chunks/routes/api/users/logout.post.mjs +2 -2
  500. package/.output/server/chunks/routes/api/users/me.get.mjs +2 -2
  501. package/.output/server/chunks/routes/api/users/register.post.mjs +2 -2
  502. package/.output/server/chunks/routes/api/users/setup-status.get.mjs +2 -2
  503. package/.output/server/chunks/routes/api/users/tokens/_id/token.get.mjs +2 -2
  504. package/.output/server/chunks/routes/api/users/tokens/_id_.delete.mjs +2 -2
  505. package/.output/server/chunks/routes/api/users/tokens/_id_.patch.mjs +2 -2
  506. package/.output/server/chunks/routes/api/workshop/_...path_.mjs +2 -2
  507. package/.output/server/chunks/routes/api/workshop/a2a/_agentId/index.get.mjs +2 -2
  508. package/.output/server/chunks/routes/api/workshop/a2a/_agentId/index.post.mjs +2 -2
  509. package/.output/server/chunks/routes/api/workshop/a2a/send.post.mjs +2 -2
  510. package/.output/server/chunks/routes/api/workshop/agent-tools/approvals/_id/decide.post.mjs +38 -6
  511. package/.output/server/chunks/routes/api/workshop/agent-tools/approvals/_id/decide.post.mjs.map +1 -1
  512. package/.output/server/chunks/routes/api/workshop/agent-tools/bindings/_id_.delete.mjs +2 -2
  513. package/.output/server/chunks/routes/api/workshop/agent-tools/bindings/_id_.patch.mjs +2 -2
  514. package/.output/server/chunks/routes/api/workshop/agent-tools/index.get.mjs +14 -5
  515. package/.output/server/chunks/routes/api/workshop/agent-tools/index.get.mjs.map +1 -1
  516. package/.output/server/chunks/routes/api/workshop/agent-tools/index.post.mjs +2 -2
  517. package/.output/server/chunks/routes/api/workshop/agent-tools/index2.get.mjs +2 -2
  518. package/.output/server/chunks/routes/api/workshop/agent-tools/invoke.post.mjs +2 -2
  519. package/.output/server/chunks/routes/api/workshop/agent-tools/list.get.mjs +2 -2
  520. package/.output/server/chunks/routes/api/workshop/agents/_id_.delete.mjs +2 -2
  521. package/.output/server/chunks/routes/api/workshop/agents/_id_.get.mjs +2 -2
  522. package/.output/server/chunks/routes/api/workshop/agents/_id_.patch.mjs +2 -2
  523. package/.output/server/chunks/routes/api/workshop/agents/subscribe.post.mjs +2 -2
  524. package/.output/server/chunks/routes/api/workshop/aml/datasets/_id/preview.get.mjs +1 -1
  525. package/.output/server/chunks/routes/api/workshop/aml/datasets/_id_.delete.mjs +2 -2
  526. package/.output/server/chunks/routes/api/workshop/aml/datasets/_id_.get.mjs +2 -2
  527. package/.output/server/chunks/routes/api/workshop/aml/datasets/_id_.patch.mjs +2 -2
  528. package/.output/server/chunks/routes/api/workshop/aml/entities/prune.post.mjs +2 -2
  529. package/.output/server/chunks/routes/api/workshop/aml/env/recheck.post.mjs +2 -2
  530. package/.output/server/chunks/routes/api/workshop/aml/env/uv.post.mjs +2 -2
  531. package/.output/server/chunks/routes/api/workshop/aml/env/venv.post.mjs +2 -2
  532. package/.output/server/chunks/routes/api/workshop/aml/index.get.mjs +2 -2
  533. package/.output/server/chunks/routes/api/workshop/aml/index.post.mjs +2 -2
  534. package/.output/server/chunks/routes/api/workshop/aml/index2.get.mjs +2 -2
  535. package/.output/server/chunks/routes/api/workshop/aml/index2.post.mjs +2 -2
  536. package/.output/server/chunks/routes/api/workshop/aml/index3.get.mjs +2 -2
  537. package/.output/server/chunks/routes/api/workshop/aml/index4.get.mjs +2 -2
  538. package/.output/server/chunks/routes/api/workshop/aml/index5.get.mjs +2 -2
  539. package/.output/server/chunks/routes/api/workshop/aml/index6.get.mjs +2 -2
  540. package/.output/server/chunks/routes/api/workshop/aml/jobs/_id/cancel.post.mjs +2 -2
  541. package/.output/server/chunks/routes/api/workshop/aml/jobs/_id/logs.get.mjs +2 -2
  542. package/.output/server/chunks/routes/api/workshop/aml/jobs/_id/retry.post.mjs +2 -2
  543. package/.output/server/chunks/routes/api/workshop/aml/jobs/_id_.delete.mjs +2 -2
  544. package/.output/server/chunks/routes/api/workshop/aml/jobs/_id_.get.mjs +2 -2
  545. package/.output/server/chunks/routes/api/workshop/aml/models/_id/predict.post.mjs +2 -2
  546. package/.output/server/chunks/routes/api/workshop/aml/models/_id/promote.post.mjs +2 -2
  547. package/.output/server/chunks/routes/api/workshop/aml/models/_id_.delete.mjs +2 -2
  548. package/.output/server/chunks/routes/api/workshop/aml/models/_id_.patch.mjs +2 -2
  549. package/.output/server/chunks/routes/api/workshop/approvals/_id/decide.post.mjs +2 -2
  550. package/.output/server/chunks/routes/api/workshop/assets/character/_id_.delete.mjs +1 -1
  551. package/.output/server/chunks/routes/api/workshop/assets/devices/_id_.delete.mjs +1 -1
  552. package/.output/server/chunks/routes/api/workshop/assets/index.get.mjs +2 -2
  553. package/.output/server/chunks/routes/api/workshop/assets/index.post.mjs +1 -1
  554. package/.output/server/chunks/routes/api/workshop/assets/index2.get.mjs +1 -1
  555. package/.output/server/chunks/routes/api/workshop/assets/index2.post.mjs +1 -1
  556. package/.output/server/chunks/routes/api/workshop/audit.get.mjs +2 -2
  557. package/.output/server/chunks/routes/api/workshop/caller.mjs +2 -2
  558. package/.output/server/chunks/routes/api/workshop/channel-templates/_id/instantiate.post.mjs +10 -5
  559. package/.output/server/chunks/routes/api/workshop/channel-templates/_id/instantiate.post.mjs.map +1 -1
  560. package/.output/server/chunks/routes/api/workshop/channel-templates/_id_.delete.mjs +2 -2
  561. package/.output/server/chunks/routes/api/workshop/channel-templates/_id_.get.mjs +2 -2
  562. package/.output/server/chunks/routes/api/workshop/channel-templates/_id_.patch.mjs +2 -2
  563. package/.output/server/chunks/routes/api/workshop/channel-templates/from-channel.post.mjs +2 -2
  564. package/.output/server/chunks/routes/api/workshop/channels/_id/activate.post.mjs +2 -2
  565. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/index.get.mjs +2 -2
  566. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/index.post.mjs +2 -2
  567. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/memories/_memoryId_.delete.mjs +2 -2
  568. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/memories/search.post.mjs +2 -2
  569. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/model.patch.mjs +2 -2
  570. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/position.patch.mjs +2 -2
  571. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/range.patch.mjs +2 -2
  572. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/stop.post.mjs +2 -2
  573. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId_.delete.mjs +2 -2
  574. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId_.patch.mjs +2 -2
  575. package/.output/server/chunks/routes/api/workshop/channels/_id/chat/index.get.mjs +41 -0
  576. package/.output/server/chunks/routes/api/workshop/channels/_id/chat/index.get.mjs.map +1 -0
  577. package/.output/server/chunks/routes/api/workshop/channels/_id/chat/index.post.mjs +52 -0
  578. package/.output/server/chunks/routes/api/workshop/channels/_id/chat/index.post.mjs.map +1 -0
  579. package/.output/server/chunks/routes/api/workshop/channels/_id/chat/messages/_messageId/read.post.mjs +33 -0
  580. package/.output/server/chunks/routes/api/workshop/channels/_id/chat/messages/_messageId/read.post.mjs.map +1 -0
  581. package/.output/server/chunks/routes/api/workshop/channels/_id/chat/permissions.get.mjs +48 -0
  582. package/.output/server/chunks/routes/api/workshop/channels/_id/chat/permissions.get.mjs.map +1 -0
  583. package/.output/server/chunks/routes/api/workshop/channels/_id/events.get.mjs +2 -2
  584. package/.output/server/chunks/routes/api/workshop/channels/_id/index.get.mjs +2 -2
  585. package/.output/server/chunks/routes/api/workshop/channels/_id/index.post.mjs +2 -2
  586. package/.output/server/chunks/routes/api/workshop/channels/_id/index.put.mjs +2 -2
  587. package/.output/server/chunks/routes/api/workshop/channels/_id/index2.get.mjs +10 -14
  588. package/.output/server/chunks/routes/api/workshop/channels/_id/index2.get.mjs.map +1 -1
  589. package/.output/server/chunks/routes/api/workshop/channels/_id/index2.post.mjs +2 -2
  590. package/.output/server/chunks/routes/api/workshop/channels/_id/index3.get.mjs +15 -28
  591. package/.output/server/chunks/routes/api/workshop/channels/_id/index3.get.mjs.map +1 -1
  592. package/.output/server/chunks/routes/api/workshop/channels/_id/index3.post.mjs +3 -2
  593. package/.output/server/chunks/routes/api/workshop/channels/_id/index3.post.mjs.map +1 -1
  594. package/.output/server/chunks/routes/api/workshop/channels/_id/index4.get.mjs +29 -23
  595. package/.output/server/chunks/routes/api/workshop/channels/_id/index4.get.mjs.map +1 -1
  596. package/.output/server/chunks/routes/api/workshop/channels/_id/index4.post.mjs +9 -4
  597. package/.output/server/chunks/routes/api/workshop/channels/_id/index4.post.mjs.map +1 -1
  598. package/.output/server/chunks/routes/api/workshop/channels/_id/index5.get.mjs +22 -10
  599. package/.output/server/chunks/routes/api/workshop/channels/_id/index5.get.mjs.map +1 -1
  600. package/.output/server/chunks/routes/api/workshop/channels/_id/index6.get.mjs +34 -0
  601. package/.output/server/chunks/routes/api/workshop/channels/_id/index6.get.mjs.map +1 -0
  602. package/.output/server/chunks/routes/api/workshop/channels/_id/members/_userId/approve.post.mjs +33 -0
  603. package/.output/server/chunks/routes/api/workshop/channels/_id/members/_userId/approve.post.mjs.map +1 -0
  604. package/.output/server/chunks/routes/api/workshop/channels/_id/members/_userId_.delete.mjs +34 -0
  605. package/.output/server/chunks/routes/api/workshop/channels/_id/members/_userId_.delete.mjs.map +1 -0
  606. package/.output/server/chunks/routes/api/workshop/channels/_id/members/join.post.mjs +35 -0
  607. package/.output/server/chunks/routes/api/workshop/channels/_id/members/join.post.mjs.map +1 -0
  608. package/.output/server/chunks/routes/api/workshop/channels/_id/members/leave.post.mjs +33 -0
  609. package/.output/server/chunks/routes/api/workshop/channels/_id/members/leave.post.mjs.map +1 -0
  610. package/.output/server/chunks/routes/api/workshop/channels/_id/memories/_memoryId_.delete.mjs +2 -2
  611. package/.output/server/chunks/routes/api/workshop/channels/_id/queue.get.mjs +2 -2
  612. package/.output/server/chunks/routes/api/workshop/channels/_id/terminals.get.mjs +2 -2
  613. package/.output/server/chunks/routes/api/workshop/channels/_id_.delete.mjs +2 -2
  614. package/.output/server/chunks/routes/api/workshop/channels/index.get.mjs +2 -2
  615. package/.output/server/chunks/routes/api/workshop/channels/index.patch.mjs +22 -6
  616. package/.output/server/chunks/routes/api/workshop/channels/index.patch.mjs.map +1 -1
  617. package/.output/server/chunks/routes/api/workshop/channels.get.mjs +21 -3
  618. package/.output/server/chunks/routes/api/workshop/channels.get.mjs.map +1 -1
  619. package/.output/server/chunks/routes/api/workshop/channels.post.mjs +5 -5
  620. package/.output/server/chunks/routes/api/workshop/daq/_id/bind.post.mjs +2 -2
  621. package/.output/server/chunks/routes/api/workshop/daq/_id/bindings.put.mjs +2 -2
  622. package/.output/server/chunks/routes/api/workshop/daq/_id/frames/content.get.mjs +2 -2
  623. package/.output/server/chunks/routes/api/workshop/daq/_id/frames.get.mjs +2 -2
  624. package/.output/server/chunks/routes/api/workshop/daq/_id/samples.get.mjs +2 -2
  625. package/.output/server/chunks/routes/api/workshop/daq/_id/test.post.mjs +2 -2
  626. package/.output/server/chunks/routes/api/workshop/daq/_id_.delete.mjs +2 -2
  627. package/.output/server/chunks/routes/api/workshop/daq/_id_.patch.mjs +2 -2
  628. package/.output/server/chunks/routes/api/workshop/daq/alarms/_id/ack.post.mjs +2 -2
  629. package/.output/server/chunks/routes/api/workshop/daq/alarms.get.mjs +2 -2
  630. package/.output/server/chunks/routes/api/workshop/daq/controller.post.mjs +2 -2
  631. package/.output/server/chunks/routes/api/workshop/daq/index.post.mjs +2 -2
  632. package/.output/server/chunks/routes/api/workshop/daq/infra/reconnect.post.mjs +2 -2
  633. package/.output/server/chunks/routes/api/workshop/daq/infra.get.mjs +2 -2
  634. package/.output/server/chunks/routes/api/workshop/daq/templates/_key_.delete.mjs +2 -2
  635. package/.output/server/chunks/routes/api/workshop/daq/templates/_key_.patch.mjs +2 -2
  636. package/.output/server/chunks/routes/api/workshop/daq/test-driver.post.mjs +2 -2
  637. package/.output/server/chunks/routes/api/workshop/dcw/_id/bind.post.mjs +2 -2
  638. package/.output/server/chunks/routes/api/workshop/dcw/_id/bindings.put.mjs +2 -2
  639. package/.output/server/chunks/routes/api/workshop/dcw/_id/param-ledger.get.mjs +2 -2
  640. package/.output/server/chunks/routes/api/workshop/dcw/_id/read.post.mjs +2 -2
  641. package/.output/server/chunks/routes/api/workshop/dcw/_id/test.post.mjs +2 -2
  642. package/.output/server/chunks/routes/api/workshop/dcw/_id/write.post.mjs +2 -2
  643. package/.output/server/chunks/routes/api/workshop/dcw/_id_.delete.mjs +2 -2
  644. package/.output/server/chunks/routes/api/workshop/dcw/_id_.patch.mjs +2 -2
  645. package/.output/server/chunks/routes/api/workshop/dcw/controller.post.mjs +2 -2
  646. package/.output/server/chunks/routes/api/workshop/dcw/index.get.mjs +2 -2
  647. package/.output/server/chunks/routes/api/workshop/dcw/index.post.mjs +2 -2
  648. package/.output/server/chunks/routes/api/workshop/dcw/index2.get.mjs +2 -2
  649. package/.output/server/chunks/routes/api/workshop/dcw/index2.post.mjs +2 -2
  650. package/.output/server/chunks/routes/api/workshop/dcw/index3.get.mjs +2 -2
  651. package/.output/server/chunks/routes/api/workshop/dcw/index3.post.mjs +2 -2
  652. package/.output/server/chunks/routes/api/workshop/dcw/index4.get.mjs +2 -2
  653. package/.output/server/chunks/routes/api/workshop/dcw/index4.post.mjs +2 -2
  654. package/.output/server/chunks/routes/api/workshop/dcw/index5.get.mjs +2 -2
  655. package/.output/server/chunks/routes/api/workshop/dcw/index5.post.mjs +2 -2
  656. package/.output/server/chunks/routes/api/workshop/dcw/index6.get.mjs +2 -2
  657. package/.output/server/chunks/routes/api/workshop/dcw/journal/node/_nodeId/rollback.post.mjs +2 -2
  658. package/.output/server/chunks/routes/api/workshop/dcw/line/query.get.mjs +2 -2
  659. package/.output/server/chunks/routes/api/workshop/dcw/lines/_id/start.post.mjs +2 -2
  660. package/.output/server/chunks/routes/api/workshop/dcw/lines/_id/stop.post.mjs +2 -2
  661. package/.output/server/chunks/routes/api/workshop/dcw/lines/_id_.delete.mjs +2 -2
  662. package/.output/server/chunks/routes/api/workshop/dcw/lines/_id_.patch.mjs +2 -2
  663. package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id/judge.post.mjs +2 -2
  664. package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id/rollback.post.mjs +2 -2
  665. package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id/series.get.mjs +2 -2
  666. package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id_.get.mjs +2 -2
  667. package/.output/server/chunks/routes/api/workshop/dcw/params/_id/read.post.mjs +2 -2
  668. package/.output/server/chunks/routes/api/workshop/dcw/params/_id/write.post.mjs +2 -2
  669. package/.output/server/chunks/routes/api/workshop/dcw/params/_id_.delete.mjs +2 -2
  670. package/.output/server/chunks/routes/api/workshop/dcw/params/_id_.patch.mjs +2 -2
  671. package/.output/server/chunks/routes/api/workshop/dcw/products/_id_.delete.mjs +2 -2
  672. package/.output/server/chunks/routes/api/workshop/dcw/products/_id_.patch.mjs +2 -2
  673. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/apply.post.mjs +2 -2
  674. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/mark-good.post.mjs +2 -2
  675. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/revert.post.mjs +2 -2
  676. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/rollback-good.post.mjs +2 -2
  677. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/versions.get.mjs +2 -2
  678. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id_.delete.mjs +2 -2
  679. package/.output/server/chunks/routes/api/workshop/dcw/recipes/index.patch.mjs +2 -2
  680. package/.output/server/chunks/routes/api/workshop/dcw/runs/_id/close.post.mjs +2 -2
  681. package/.output/server/chunks/routes/api/workshop/dcw/runs/_id/data.get.mjs +2 -2
  682. package/.output/server/chunks/routes/api/workshop/dcw/runs/_id/rollback.post.mjs +2 -2
  683. package/.output/server/chunks/routes/api/workshop/dcw/templates/_key_.delete.mjs +2 -2
  684. package/.output/server/chunks/routes/api/workshop/dcw/templates/_key_.patch.mjs +2 -2
  685. package/.output/server/chunks/routes/api/workshop/dcw/test-driver.post.mjs +2 -2
  686. package/.output/server/chunks/routes/api/workshop/device-twins/_id/control.post.mjs +2 -2
  687. package/.output/server/chunks/routes/api/workshop/device-twins/_id/telemetry.post.mjs +2 -2
  688. package/.output/server/chunks/routes/api/workshop/device-twins/_id_.delete.mjs +2 -2
  689. package/.output/server/chunks/routes/api/workshop/device-twins/_id_.patch.mjs +2 -2
  690. package/.output/server/chunks/routes/api/workshop/fs/dirs.get.mjs +1 -1
  691. package/.output/server/chunks/routes/api/workshop/harnesses/_id/providers.get.mjs +2 -2
  692. package/.output/server/chunks/routes/api/workshop/harnesses.get.mjs +2 -2
  693. package/.output/server/chunks/routes/api/workshop/hitl/pending.get.mjs +11 -4
  694. package/.output/server/chunks/routes/api/workshop/hitl/pending.get.mjs.map +1 -1
  695. package/.output/server/chunks/routes/api/workshop/hitl/respond.post.mjs +28 -36
  696. package/.output/server/chunks/routes/api/workshop/hitl/respond.post.mjs.map +1 -1
  697. package/.output/server/chunks/routes/api/workshop/index.get.mjs +2 -2
  698. package/.output/server/chunks/routes/api/workshop/index.post.mjs +2 -2
  699. package/.output/server/chunks/routes/api/workshop/index.put.mjs +2 -2
  700. package/.output/server/chunks/routes/api/workshop/index10.get.mjs +26 -12
  701. package/.output/server/chunks/routes/api/workshop/index10.get.mjs.map +1 -1
  702. package/.output/server/chunks/routes/api/workshop/index11.get.mjs +12 -7
  703. package/.output/server/chunks/routes/api/workshop/index11.get.mjs.map +1 -1
  704. package/.output/server/chunks/routes/api/workshop/index12.get.mjs +3 -3
  705. package/.output/server/chunks/routes/api/workshop/index12.get.mjs.map +1 -1
  706. package/.output/server/chunks/routes/api/workshop/index13.get.mjs +29 -0
  707. package/.output/server/chunks/routes/api/workshop/index13.get.mjs.map +1 -0
  708. package/.output/server/chunks/routes/api/workshop/index14.get.mjs +28 -0
  709. package/.output/server/chunks/routes/api/workshop/index14.get.mjs.map +1 -0
  710. package/.output/server/chunks/routes/api/workshop/index2.get.mjs +2 -2
  711. package/.output/server/chunks/routes/api/workshop/index2.post.mjs +2 -2
  712. package/.output/server/chunks/routes/api/workshop/index3.get.mjs +2 -2
  713. package/.output/server/chunks/routes/api/workshop/index3.post.mjs +2 -2
  714. package/.output/server/chunks/routes/api/workshop/index4.get.mjs +2 -2
  715. package/.output/server/chunks/routes/api/workshop/index4.post.mjs +2 -2
  716. package/.output/server/chunks/routes/api/workshop/index5.get.mjs +2 -2
  717. package/.output/server/chunks/routes/api/workshop/index5.post.mjs +2 -2
  718. package/.output/server/chunks/routes/api/workshop/index6.get.mjs +2 -2
  719. package/.output/server/chunks/routes/api/workshop/index6.post.mjs +2 -2
  720. package/.output/server/chunks/routes/api/workshop/index7.get.mjs +2 -2
  721. package/.output/server/chunks/routes/api/workshop/index7.post.mjs +14 -16
  722. package/.output/server/chunks/routes/api/workshop/index7.post.mjs.map +1 -1
  723. package/.output/server/chunks/routes/api/workshop/index8.get.mjs +40 -19
  724. package/.output/server/chunks/routes/api/workshop/index8.get.mjs.map +1 -1
  725. package/.output/server/chunks/routes/api/workshop/index8.post.mjs +19 -5
  726. package/.output/server/chunks/routes/api/workshop/index8.post.mjs.map +1 -1
  727. package/.output/server/chunks/routes/api/workshop/index9.get.mjs +20 -24
  728. package/.output/server/chunks/routes/api/workshop/index9.get.mjs.map +1 -1
  729. package/.output/server/chunks/routes/api/workshop/index9.post.mjs +30 -0
  730. package/.output/server/chunks/routes/api/workshop/index9.post.mjs.map +1 -0
  731. package/.output/server/chunks/routes/api/workshop/mailbox/all.get.mjs +2 -2
  732. package/.output/server/chunks/routes/api/workshop/mailbox.get.mjs +2 -2
  733. package/.output/server/chunks/routes/api/workshop/memories/maintenance.post.mjs +2 -2
  734. package/.output/server/chunks/routes/api/workshop/notifications/read.post.mjs +41 -0
  735. package/.output/server/chunks/routes/api/workshop/notifications/read.post.mjs.map +1 -0
  736. package/.output/server/chunks/routes/api/workshop/plugins/_name/disable.post.mjs +2 -2
  737. package/.output/server/chunks/routes/api/workshop/plugins/_name/enable.post.mjs +2 -2
  738. package/.output/server/chunks/routes/api/workshop/plugins/index.get.mjs +2 -2
  739. package/.output/server/chunks/routes/api/workshop/runtime.get.mjs +2 -2
  740. package/.output/server/chunks/routes/api/workshop/scene/layouts/_channelId_.delete.mjs +2 -2
  741. package/.output/server/chunks/routes/api/workshop/scene/layouts/_channelId_.put.mjs +2 -2
  742. package/.output/server/chunks/routes/api/workshop/scene/layouts.get.mjs +2 -2
  743. package/.output/server/chunks/routes/api/workshop/schedules/_id/run.post.mjs +29 -0
  744. package/.output/server/chunks/routes/api/workshop/schedules/_id/run.post.mjs.map +1 -0
  745. package/.output/server/chunks/routes/api/workshop/schedules/_id/runs.get.mjs +31 -0
  746. package/.output/server/chunks/routes/api/workshop/schedules/_id/runs.get.mjs.map +1 -0
  747. package/.output/server/chunks/routes/api/workshop/schedules/_id_.delete.mjs +30 -0
  748. package/.output/server/chunks/routes/api/workshop/schedules/_id_.delete.mjs.map +1 -0
  749. package/.output/server/chunks/routes/api/workshop/schedules/_id_.get.mjs +29 -0
  750. package/.output/server/chunks/routes/api/workshop/schedules/_id_.get.mjs.map +1 -0
  751. package/.output/server/chunks/routes/api/workshop/schedules/_id_.patch.mjs +40 -0
  752. package/.output/server/chunks/routes/api/workshop/schedules/_id_.patch.mjs.map +1 -0
  753. package/.output/server/chunks/routes/api/workshop/tasks/_id/complete.post.mjs +2 -2
  754. package/.output/server/chunks/routes/api/workshop/tasks/_id/dispatch.post.mjs +2 -2
  755. package/.output/server/chunks/routes/api/workshop/tasks/_id/index.post.mjs +2 -2
  756. package/.output/server/chunks/routes/api/workshop/tasks/_id/reassign.post.mjs +39 -0
  757. package/.output/server/chunks/routes/api/workshop/tasks/_id/reassign.post.mjs.map +1 -0
  758. package/.output/server/chunks/routes/api/workshop/tasks/_id/report.post.mjs +2 -2
  759. package/.output/server/chunks/routes/api/workshop/tasks/_id/retry.post.mjs +2 -2
  760. package/.output/server/chunks/routes/api/workshop/tasks/_id/update.post.mjs +44 -0
  761. package/.output/server/chunks/routes/api/workshop/tasks/_id/update.post.mjs.map +1 -0
  762. package/.output/server/chunks/routes/api/workshop/tasks/_id_.get.mjs +9 -5
  763. package/.output/server/chunks/routes/api/workshop/tasks/_id_.get.mjs.map +1 -1
  764. package/.output/server/chunks/routes/api/workshop/tasks.get.mjs +2 -2
  765. package/.output/server/chunks/routes/api/workshop/teams/_id/deploy.post.mjs +2 -2
  766. package/.output/server/chunks/routes/api/workshop/teams/_id/index.get.mjs +2 -2
  767. package/.output/server/chunks/routes/api/workshop/teams/_id/index.post.mjs +2 -2
  768. package/.output/server/chunks/routes/api/workshop/teams/_id/index.put.mjs +2 -2
  769. package/.output/server/chunks/routes/api/workshop/teams/_id/index2.get.mjs +2 -2
  770. package/.output/server/chunks/routes/api/workshop/teams/_id/members/_agentId_.delete.mjs +2 -2
  771. package/.output/server/chunks/routes/api/workshop/teams/_id_.delete.mjs +2 -2
  772. package/.output/server/chunks/routes/api/workshop/teams/_id_.get.mjs +2 -2
  773. package/.output/server/chunks/routes/api/workshop/teams/_id_.patch.mjs +2 -2
  774. package/.output/server/chunks/routes/api/workshop/users/me.get.mjs +2 -2
  775. package/.output/server/chunks/routes/api/workshop/users/register.post.mjs +2 -2
  776. package/.output/server/chunks/routes/api/workshop/workspaces/_id/channel-templates/_tplId_.post.mjs +3 -3
  777. package/.output/server/chunks/routes/api/workshop/workspaces/_id/channels/_channelId_.delete.mjs +2 -2
  778. package/.output/server/chunks/routes/api/workshop/workspaces/_id/channels/_channelId_.post.mjs +2 -2
  779. package/.output/server/chunks/routes/api/workshop/workspaces/index.delete.mjs +2 -2
  780. package/.output/server/chunks/routes/renderer.mjs +3 -3
  781. package/.output/server/chunks/virtual/entry.mjs +6055 -1624
  782. package/.output/server/chunks/virtual/entry.mjs.map +1 -1
  783. package/.output/server/chunks/virtual/precomputed.mjs +1 -1
  784. package/.output/server/index.mjs +15 -5549
  785. package/.output/server/index.mjs.map +1 -1
  786. package/.output/server/package.json +1 -1
  787. package/README-zh.md +102 -48
  788. package/README.md +105 -38
  789. package/app/components/AppHeader.vue +26 -703
  790. package/app/components/aml/AmlDatasetFormModal.vue +279 -0
  791. package/app/components/aml/AmlDatasetTable.vue +319 -0
  792. package/app/components/aml/AmlEnvPanel.vue +230 -0
  793. package/app/components/aml/AmlExperimentsTable.vue +142 -0
  794. package/app/components/aml/AmlInfraBanner.vue +23 -0
  795. package/app/components/aml/AmlJobsTable.vue +248 -0
  796. package/app/components/aml/AmlModelsTable.vue +173 -0
  797. package/app/components/aml/AmlOverviewBar.vue +62 -0
  798. package/app/components/aml/AmlPageHeader.vue +47 -0
  799. package/app/components/aml/AmlPredictConsole.vue +201 -0
  800. package/app/components/app-header/HeaderTools.vue +208 -0
  801. package/app/components/app-header/HitlBell.vue +423 -0
  802. package/app/components/app-header/TrailNav.vue +261 -0
  803. package/app/components/app-header/UserChip.vue +150 -0
  804. package/app/components/daq/DaqAddNodeModal.vue +209 -0
  805. package/app/components/daq/DaqAlarmBar.vue +46 -0
  806. package/app/components/daq/DaqControlCard.vue +159 -0
  807. package/app/components/daq/DaqDetailFramesTile.vue +139 -0
  808. package/app/components/daq/DaqDetailHistoryCard.vue +128 -0
  809. package/app/components/daq/DaqDetailLiveCard.vue +92 -0
  810. package/app/components/daq/DaqDetailParamForm.vue +350 -0
  811. package/app/components/daq/DaqInfraBanner.vue +31 -0
  812. package/app/components/daq/DaqLineBanner.vue +47 -0
  813. package/app/components/daq/DaqNodePanel.vue +396 -0
  814. package/app/components/daq/DaqOptPanel.vue +197 -0
  815. package/app/components/daq/DaqTemplateModal.vue +246 -0
  816. package/app/components/dashboard/DashboardFleetPanel.vue +228 -0
  817. package/app/components/dashboard/DashboardGaugeBand.vue +78 -0
  818. package/app/components/dashboard/DashboardHarnessPanel.vue +149 -0
  819. package/app/components/dashboard/DashboardHero.vue +209 -0
  820. package/app/components/dashboard/DashboardLineStatePanel.vue +78 -0
  821. package/app/components/dashboard/DashboardNodeStatePanel.vue +46 -0
  822. package/app/components/dashboard/DashboardPipelinePanel.vue +46 -0
  823. package/app/components/dashboard/DashboardTrendPanel.vue +83 -0
  824. package/app/components/dashboard/DashboardWritePanel.vue +52 -0
  825. package/app/components/dcw/DcwAddNodeModal.vue +328 -0
  826. package/app/components/dcw/DcwAdoptCard.vue +89 -0
  827. package/app/components/dcw/DcwCreateLineModal.vue +105 -0
  828. package/app/components/dcw/DcwDeleteLineModal.vue +73 -0
  829. package/app/components/dcw/DcwDetailHead.vue +65 -0
  830. package/app/components/dcw/DcwDetailTemplateModal.vue +238 -0
  831. package/app/components/dcw/DcwEditLineModal.vue +108 -0
  832. package/app/components/dcw/DcwGatewayBar.vue +94 -0
  833. package/app/components/dcw/DcwLedgerCard.vue +160 -0
  834. package/app/components/dcw/DcwLineCard.vue +117 -0
  835. package/app/components/dcw/DcwLineRunCard.vue +158 -0
  836. package/app/components/dcw/DcwNodesTable.vue +253 -0
  837. package/app/components/dcw/DcwProductCreateModal.vue +113 -0
  838. package/app/components/dcw/DcwQueryCard.vue +251 -0
  839. package/app/components/dcw/DcwRecipeEditModal.vue +285 -0
  840. package/app/components/dcw/DcwRecipeHistoryModal.vue +165 -0
  841. package/app/components/dcw/DcwRecipePanel.vue +367 -0
  842. package/app/components/dcw/DcwRunDataModal.vue +191 -0
  843. package/app/components/dcw/DcwTemplateModal.vue +227 -0
  844. package/app/components/dcw/DcwWriteHistoryCard.vue +96 -0
  845. package/app/components/logs/LogsEventTable.vue +309 -0
  846. package/app/components/logs/LogsFilterCard.vue +234 -0
  847. package/app/components/logs/LogsManualModal.vue +231 -0
  848. package/app/components/logs/LogsPageHead.vue +71 -0
  849. package/app/components/monitor/MonitorAgentTable.vue +143 -0
  850. package/app/components/monitor/MonitorChannelTable.vue +80 -0
  851. package/app/components/monitor/MonitorLoginGate.vue +24 -0
  852. package/app/components/monitor/MonitorPageHead.vue +92 -0
  853. package/app/components/monitor/MonitorProcessTable.vue +159 -0
  854. package/app/components/monitor/MonitorStatGrid.vue +165 -0
  855. package/app/components/settings/AppearancePane.vue +282 -0
  856. package/app/components/settings/PluginsSection.vue +280 -0
  857. package/app/components/settings/RuntimeFieldRow.vue +189 -0
  858. package/app/components/settings/RuntimeGroupSection.vue +290 -0
  859. package/app/components/settings/RuntimePane.vue +235 -0
  860. package/app/components/settings/SystemPane.vue +83 -0
  861. package/app/components/tokens/TokenCreateModal.vue +42 -0
  862. package/app/components/tokens/TokenOnceModal.vue +164 -0
  863. package/app/components/tokens/TokenRenameModal.vue +40 -0
  864. package/app/components/tokens/TokensAuthGate.vue +47 -0
  865. package/app/components/tokens/TokensPageHead.vue +76 -0
  866. package/app/components/tokens/TokensTable.vue +227 -0
  867. package/app/components/workshop/AgentLanesView.vue +35 -755
  868. package/app/components/workshop/ChannelSessionList.vue +58 -493
  869. package/app/components/workshop/ChatMemberPanel.vue +555 -0
  870. package/app/components/workshop/ChatTimeline.vue +569 -0
  871. package/app/components/workshop/CommandPalette.vue +1 -0
  872. package/app/components/workshop/Composer.vue +224 -511
  873. package/app/components/workshop/DeviceTwinPanel.vue +23 -499
  874. package/app/components/workshop/EventBlock.vue +20 -408
  875. package/app/components/workshop/MemoryPanel.vue +405 -364
  876. package/app/components/workshop/MultiChannelView.vue +189 -189
  877. package/app/components/workshop/NotificationCenter.vue +325 -0
  878. package/app/components/workshop/TaskBoardView.vue +260 -686
  879. package/app/components/workshop/TaskInspectorDrawer.vue +484 -390
  880. package/app/components/workshop/TranscriptTimeline.vue +60 -438
  881. package/app/components/workshop/agents/AgentTemplateEditModal.vue +139 -0
  882. package/app/components/workshop/agents/AgentTemplateTable.vue +269 -0
  883. package/app/components/workshop/agents/AgentTemplateToolbar.vue +67 -0
  884. package/app/components/workshop/blocks/ClusterRoute.vue +1 -1
  885. package/app/components/workshop/blocks/EventBlockAvatar.vue +114 -0
  886. package/app/components/workshop/blocks/EventBlockHead.vue +232 -0
  887. package/app/components/workshop/composer/ComposerToolbar.vue +278 -0
  888. package/app/components/workshop/composer/MentionMenu.vue +135 -0
  889. package/app/components/workshop/composer/ReplyChip.vue +65 -0
  890. package/app/components/workshop/composer/StatusChip.vue +171 -0
  891. package/app/components/workshop/console/CenterPane.vue +94 -0
  892. package/app/components/workshop/console/Dock.vue +71 -0
  893. package/app/components/workshop/console/LeftPane.vue +84 -0
  894. package/app/components/workshop/console/RightPane.vue +95 -0
  895. package/app/components/workshop/console/Topbar.vue +289 -0
  896. package/app/components/workshop/device-twin/DeviceTwinCard.vue +265 -0
  897. package/app/components/workshop/device-twin/DeviceTwinDcwSection.vue +203 -0
  898. package/app/components/workshop/lanes/AddMemberModal.vue +270 -0
  899. package/app/components/workshop/lanes/EditMemberModal.vue +106 -0
  900. package/app/components/workshop/lanes/LaneHeader.vue +432 -0
  901. package/app/components/workshop/lanes/LanesToolbar.vue +97 -0
  902. package/app/components/workshop/session-list/ChannelSettingsModal.vue +329 -0
  903. package/app/components/workshop/session-list/MountChannelModal.vue +124 -0
  904. package/app/components/workshop/session-list/SaveTemplateModal.vue +93 -0
  905. package/app/components/workshop/task-board/Card.vue +172 -0
  906. package/app/components/workshop/task-board/Column.vue +151 -0
  907. package/app/components/workshop/task-board/List.vue +157 -0
  908. package/app/components/workshop/task-board/StatusMenu.vue +88 -0
  909. package/app/components/workshop/teams/TeamAddMemberModal.vue +53 -0
  910. package/app/components/workshop/teams/TeamCard.vue +183 -0
  911. package/app/components/workshop/teams/TeamCreateModal.vue +94 -0
  912. package/app/components/workshop/teams/TeamDeployModal.vue +40 -0
  913. package/app/components/workshop/teams/TeamPluginModal.vue +119 -0
  914. package/app/components/workshop/terminal/OmpTerminalPanel.vue +19 -760
  915. package/app/components/workshop/terminal/TerminalHitlCard.vue +170 -0
  916. package/app/components/workshop/town/TownScene.ts +72 -961
  917. package/app/components/workshop/town/TownScene3D.ts +357 -4045
  918. package/app/components/workshop/town/TownView.vue +461 -7405
  919. package/app/components/workshop/town/components/TownAgentBindings.vue +380 -0
  920. package/app/components/workshop/town/components/TownAgentInspector.vue +546 -0
  921. package/app/components/workshop/town/components/TownAlarmList.vue +147 -0
  922. package/app/components/workshop/town/components/TownBoundaryPanel.vue +350 -0
  923. package/app/components/workshop/town/components/TownCalloutLayer.vue +147 -0
  924. package/app/components/workshop/town/components/TownChannelDock.vue +116 -0
  925. package/app/components/workshop/town/components/TownControlDock.vue +400 -0
  926. package/app/components/workshop/town/components/TownDaqNodeInspector.vue +345 -0
  927. package/app/components/workshop/town/components/TownDaqTree.vue +366 -0
  928. package/app/components/workshop/town/components/TownDcwBindSection.vue +473 -0
  929. package/app/components/workshop/town/components/TownDcwNodeInspector.vue +185 -0
  930. package/app/components/workshop/town/components/TownDcwTree.vue +280 -0
  931. package/app/components/workshop/town/components/TownDeviceBindings.vue +394 -0
  932. package/app/components/workshop/town/components/TownDeviceTransform.vue +248 -0
  933. package/app/components/workshop/town/components/TownEventList.vue +120 -0
  934. package/app/components/workshop/town/components/TownHealthBody.vue +100 -0
  935. package/app/components/workshop/town/components/TownKpiStrip.vue +207 -0
  936. package/app/components/workshop/town/components/TownLeftRail.vue +308 -0
  937. package/app/components/workshop/town/components/TownLoadingMask.vue +61 -0
  938. package/app/components/workshop/town/components/TownNavMap.vue +154 -0
  939. package/app/components/workshop/town/components/TownRightRail.vue +540 -0
  940. package/app/components/workshop/town/components/TownStage.vue +281 -0
  941. package/app/components/workshop/town/components/TownStageTop.vue +238 -0
  942. package/app/components/workshop/town/components/TownStatusBar.vue +108 -0
  943. package/app/components/workshop/town/components/TownTopNav.vue +367 -0
  944. package/app/components/workshop/town/components/TownTrendDock.vue +178 -0
  945. package/app/components/workshop/town/scene/town-scene-agents.ts +254 -0
  946. package/app/components/workshop/town/scene/town-scene-behavior.ts +194 -0
  947. package/app/components/workshop/town/scene/town-scene-bubbles.ts +96 -0
  948. package/app/components/workshop/town/scene/town-scene-core.ts +158 -0
  949. package/app/components/workshop/town/scene/town-scene-models.ts +109 -0
  950. package/app/components/workshop/town/scene/town-scene-visuals.ts +279 -0
  951. package/app/components/workshop/town/scene/town-scene3d-agents.ts +308 -0
  952. package/app/components/workshop/town/scene/town-scene3d-blocks.ts +297 -0
  953. package/app/components/workshop/town/scene/town-scene3d-bubbles.ts +281 -0
  954. package/app/components/workshop/town/scene/town-scene3d-camera.ts +282 -0
  955. package/app/components/workshop/town/scene/town-scene3d-devices.ts +433 -0
  956. package/app/components/workshop/town/scene/town-scene3d-editing.ts +490 -0
  957. package/app/components/workshop/town/scene/town-scene3d-events.ts +173 -0
  958. package/app/components/workshop/town/scene/town-scene3d-factory.ts +412 -0
  959. package/app/components/workshop/town/scene/town-scene3d-hud.ts +110 -0
  960. package/app/components/workshop/town/scene/town-scene3d-lifecycle.ts +144 -0
  961. package/app/components/workshop/town/scene/town-scene3d-links.ts +141 -0
  962. package/app/components/workshop/town/scene/town-scene3d-loop.ts +286 -0
  963. package/app/components/workshop/town/scene/town-scene3d-models.ts +154 -0
  964. package/app/components/workshop/town/scene/town-scene3d-nodes.ts +562 -0
  965. package/app/components/workshop/town/scene/town-scene3d-ranges.ts +273 -0
  966. package/app/components/workshop/town/scene/town-scene3d-renderer.ts +320 -0
  967. package/app/components/workshop/town/scene/town-scene3d-selection.ts +257 -0
  968. package/app/components/workshop/town/scene/town-scene3d-types.ts +264 -0
  969. package/app/components/workshop/transcript/TranscriptBlockList.vue +68 -0
  970. package/app/components/workshop/transcript/TranscriptEarlierPager.vue +81 -0
  971. package/app/components/workshop/transcript/TranscriptEmptyState.vue +153 -0
  972. package/app/components/workshop/transcript/TranscriptFilterBar.vue +126 -0
  973. package/app/components/workshop/workbench/AuthGate.vue +179 -0
  974. package/app/components/workshop/workbench/CreateWorkspaceModal.vue +36 -0
  975. package/app/components/workshop/workbench/WorkbenchHead.vue +129 -0
  976. package/app/components/workshop/workbench/WorkspaceCard.vue +198 -0
  977. package/app/components/workshop/workbench/WorkspaceEmpty.vue +56 -0
  978. package/app/composables/workshop/device-twin-types.ts +29 -0
  979. package/app/composables/workshop/event-blocks/attention.ts +58 -0
  980. package/app/composables/workshop/event-blocks/classify.ts +44 -0
  981. package/app/composables/workshop/event-blocks/clusterer.ts +231 -0
  982. package/app/composables/workshop/event-blocks/constants.ts +48 -0
  983. package/app/composables/workshop/event-blocks/fold-stream.ts +45 -0
  984. package/app/composables/workshop/event-blocks/markdown.ts +81 -0
  985. package/app/composables/workshop/event-blocks/mentions.ts +49 -0
  986. package/app/composables/workshop/event-blocks/text-utils.ts +100 -0
  987. package/app/composables/workshop/event-blocks/types.ts +40 -0
  988. package/app/composables/workshop/town/town-relay-props.ts +226 -0
  989. package/app/composables/workshop/town/town-view-types.ts +145 -0
  990. package/app/composables/workshop/town/useTownAgentBindings.ts +115 -0
  991. package/app/composables/workshop/town/useTownAgentChat.ts +203 -0
  992. package/app/composables/workshop/town/useTownAlarms.ts +36 -0
  993. package/app/composables/workshop/town/useTownCallouts.ts +174 -0
  994. package/app/composables/workshop/town/useTownChannels.ts +220 -0
  995. package/app/composables/workshop/town/useTownHealth.ts +66 -0
  996. package/app/composables/workshop/town/useTownHudTickers.ts +77 -0
  997. package/app/composables/workshop/town/useTownLayout.ts +277 -0
  998. package/app/composables/workshop/town/useTownNavMap.ts +301 -0
  999. package/app/composables/workshop/town/useTownNodeBindings.ts +345 -0
  1000. package/app/composables/workshop/town/useTownPanelDrag.ts +91 -0
  1001. package/app/composables/workshop/town/useTownRailData.ts +421 -0
  1002. package/app/composables/workshop/town/useTownSceneControl.ts +92 -0
  1003. package/app/composables/workshop/town/useTownSceneInput.ts +275 -0
  1004. package/app/composables/workshop/town/useTownSceneRuntime.ts +390 -0
  1005. package/app/composables/workshop/town/useTownSheets.ts +41 -0
  1006. package/app/composables/workshop/town/useTownTrends.ts +93 -0
  1007. package/app/composables/workshop/useChannelList.ts +88 -0
  1008. package/app/composables/workshop/useChannelTerminals.ts +65 -0
  1009. package/app/composables/workshop/useComposerMentions.ts +130 -0
  1010. package/app/composables/workshop/useDeviceTwinDcwWrite.ts +77 -0
  1011. package/app/composables/workshop/useDeviceTwinPanel.ts +56 -0
  1012. package/app/composables/workshop/useEventBlockView.ts +159 -0
  1013. package/app/composables/workshop/useEventBlocks.ts +33 -662
  1014. package/app/composables/workshop/useHitlAnswer.ts +184 -0
  1015. package/app/composables/workshop/useLaneWidths.ts +27 -0
  1016. package/app/composables/workshop/useOmpTerminalSession.ts +424 -0
  1017. package/app/composables/workshop/usePluginAdmin.ts +152 -0
  1018. package/app/composables/workshop/useRuntimeConfigDraft.ts +118 -0
  1019. package/app/composables/workshop/useSettingsGroups.ts +243 -0
  1020. package/app/composables/workshop/useTaskBoardColumns.ts +47 -0
  1021. package/app/composables/workshop/useTaskBoardDrag.ts +78 -0
  1022. package/app/composables/workshop/useTaskBoardMenu.ts +60 -0
  1023. package/app/composables/workshop/useTaskBoardTasks.ts +74 -0
  1024. package/app/composables/workshop/useTerminalRenderer.ts +308 -0
  1025. package/app/composables/workshop/useTranscriptEnterStage.ts +48 -0
  1026. package/app/composables/workshop/useTranscriptHistory.ts +52 -0
  1027. package/app/composables/workshop/useTranscriptScroll.ts +113 -0
  1028. package/app/composables/workshop/useWorkshopApi.ts +85 -2
  1029. package/app/composables/workshop/useWorkshopWs.ts +265 -126
  1030. package/app/config/schema.ts +13 -0
  1031. package/app/layouts/town.vue +21 -16
  1032. package/app/pages/aml/api.ts +6 -0
  1033. package/app/pages/aml/composables/useAmlDatasets.ts +38 -0
  1034. package/app/pages/aml/composables/useAmlEntities.ts +57 -0
  1035. package/app/pages/aml/composables/useAmlEnv.ts +191 -0
  1036. package/app/pages/aml/composables/useAmlExperiments.ts +45 -0
  1037. package/app/pages/aml/composables/useAmlFormat.ts +44 -0
  1038. package/app/pages/aml/composables/useAmlJobs.ts +131 -0
  1039. package/app/pages/aml/composables/useAmlModels.ts +56 -0
  1040. package/app/pages/aml/composables/useAmlNotes.ts +47 -0
  1041. package/app/pages/aml/composables/useAmlPredict.ts +93 -0
  1042. package/app/pages/aml/constants.ts +63 -0
  1043. package/app/pages/aml/index.vue +143 -2596
  1044. package/app/pages/aml/styles.css +420 -0
  1045. package/app/pages/aml/types.ts +189 -0
  1046. package/app/pages/composables/useDashboardCharts.ts +192 -0
  1047. package/app/pages/composables/useDashboardData.ts +144 -0
  1048. package/app/pages/daq/[id].vue +59 -929
  1049. package/app/pages/daq/composables/useDaqAddNode.ts +126 -0
  1050. package/app/pages/daq/composables/useDaqDetailBinding.ts +29 -0
  1051. package/app/pages/daq/composables/useDaqDetailFrames.ts +42 -0
  1052. package/app/pages/daq/composables/useDaqDetailHistory.ts +199 -0
  1053. package/app/pages/daq/composables/useDaqDetailNode.ts +53 -0
  1054. package/app/pages/daq/composables/useDaqDetailParams.ts +138 -0
  1055. package/app/pages/daq/composables/useDaqFilters.ts +187 -0
  1056. package/app/pages/daq/composables/useDaqNodeWindow.ts +86 -0
  1057. package/app/pages/daq/composables/useDaqOptimizations.ts +99 -0
  1058. package/app/pages/daq/composables/useDaqTemplates.ts +152 -0
  1059. package/app/pages/daq/daq-page.css +681 -0
  1060. package/app/pages/daq/index.vue +132 -2188
  1061. package/app/pages/dcw/[id].vue +297 -2615
  1062. package/app/pages/dcw/composables/useDcwAddNode.ts +121 -0
  1063. package/app/pages/dcw/composables/useDcwCards.ts +27 -0
  1064. package/app/pages/dcw/composables/useDcwDetailScope.ts +145 -0
  1065. package/app/pages/dcw/composables/useDcwDetailTemplates.ts +94 -0
  1066. package/app/pages/dcw/composables/useDcwFilter.ts +29 -0
  1067. package/app/pages/dcw/composables/useDcwLedger.ts +34 -0
  1068. package/app/pages/dcw/composables/useDcwLineMutations.ts +115 -0
  1069. package/app/pages/dcw/composables/useDcwLineRun.ts +60 -0
  1070. package/app/pages/dcw/composables/useDcwProducts.ts +54 -0
  1071. package/app/pages/dcw/composables/useDcwQuery.ts +68 -0
  1072. package/app/pages/dcw/composables/useDcwQuickActions.ts +47 -0
  1073. package/app/pages/dcw/composables/useDcwRecipes.ts +239 -0
  1074. package/app/pages/dcw/composables/useDcwTemplates.ts +50 -0
  1075. package/app/pages/dcw/composables/useDcwWrites.ts +81 -0
  1076. package/app/pages/dcw/dcw-page.css +344 -0
  1077. package/app/pages/dcw/index.vue +64 -986
  1078. package/app/pages/dcw/types.ts +9 -0
  1079. package/app/pages/index.vue +64 -925
  1080. package/app/pages/logs/composables/useLogsFormat.ts +43 -0
  1081. package/app/pages/logs/composables/useLogsManual.ts +63 -0
  1082. package/app/pages/logs/composables/useLogsQuery.ts +52 -0
  1083. package/app/pages/logs/composables/useLogsScope.ts +39 -0
  1084. package/app/pages/logs/index.vue +57 -728
  1085. package/app/pages/monitor/composables/useMonitorColumns.ts +69 -0
  1086. package/app/pages/monitor/composables/useMonitorData.ts +124 -0
  1087. package/app/pages/monitor/composables/useMonitorFormat.ts +39 -0
  1088. package/app/pages/monitor/composables/useMonitorTerminal.ts +28 -0
  1089. package/app/pages/monitor/types.ts +61 -0
  1090. package/app/pages/monitor.vue +88 -658
  1091. package/app/pages/permissions/index.vue +3 -2
  1092. package/app/pages/plugins/index.vue +3 -2
  1093. package/app/pages/settings.vue +7 -1403
  1094. package/app/pages/tokens/composables/useTokenClipboard.ts +33 -0
  1095. package/app/pages/tokens/composables/useTokenCreate.ts +93 -0
  1096. package/app/pages/tokens/composables/useTokenRename.ts +54 -0
  1097. package/app/pages/tokens/composables/useTokenReveal.ts +84 -0
  1098. package/app/pages/tokens/composables/useTokensList.ts +60 -0
  1099. package/app/pages/tokens.vue +79 -597
  1100. package/app/pages/users.vue +5 -4
  1101. package/app/pages/workshop/agents.vue +47 -529
  1102. package/app/pages/workshop/composables/useAgentHarnessOptions.ts +59 -0
  1103. package/app/pages/workshop/composables/useAgentTemplateActions.ts +42 -0
  1104. package/app/pages/workshop/composables/useAgentTemplateDialogState.ts +24 -0
  1105. package/app/pages/workshop/composables/useAgentTemplateForm.ts +88 -0
  1106. package/app/pages/workshop/composables/useAgentTemplatesCatalog.ts +92 -0
  1107. package/app/pages/workshop/composables/useTeamActions.ts +44 -0
  1108. package/app/pages/workshop/composables/useTeamAddMemberDialog.ts +49 -0
  1109. package/app/pages/workshop/composables/useTeamCreateDialog.ts +67 -0
  1110. package/app/pages/workshop/composables/useTeamDeployDialog.ts +49 -0
  1111. package/app/pages/workshop/composables/useTeamDialogState.ts +46 -0
  1112. package/app/pages/workshop/composables/useTeamPluginDialog.ts +72 -0
  1113. package/app/pages/workshop/composables/useTeamsCatalog.ts +100 -0
  1114. package/app/pages/workshop/composables/useWorkbenchAuth.ts +125 -0
  1115. package/app/pages/workshop/composables/useWorkbenchWorkspaces.ts +123 -0
  1116. package/app/pages/workshop/composables/useWorkspaceAuth.ts +31 -0
  1117. package/app/pages/workshop/composables/useWorkspaceChannels.ts +62 -0
  1118. package/app/pages/workshop/composables/useWorkspacePanels.ts +56 -0
  1119. package/app/pages/workshop/composables/useWorkspaceShell.ts +136 -0
  1120. package/app/pages/workshop/index.vue +68 -620
  1121. package/app/pages/workshop/schedules.vue +553 -0
  1122. package/app/pages/workshop/teams.vue +58 -568
  1123. package/app/pages/workshop/w/[wsId].vue +113 -596
  1124. package/app/stores/workshop/chat.ts +434 -0
  1125. package/app/stores/workshop/entities.ts +385 -283
  1126. package/app/stores/workshop/events.ts +5 -4
  1127. package/app/stores/workshop/hitl.ts +110 -7
  1128. package/app/stores/workshop/narrow-fetch.ts +23 -0
  1129. package/app/stores/workshop/notifications.ts +288 -0
  1130. package/app/stores/workshop/user.ts +23 -10
  1131. package/app/stores/workshop/workspaces.ts +12 -2
  1132. package/config.yml +7 -1
  1133. package/docs/aml.md +11 -0
  1134. package/docs/cli.en.md +5 -5
  1135. package/docs/cli.md +5 -5
  1136. package/docs/full-test-plan.md +15 -1
  1137. package/docs/plugins.en.md +1 -1
  1138. package/docs/plugins.md +1 -1
  1139. package/docs/sdk.en.md +1 -1
  1140. package/docs/sdk.md +1 -1
  1141. package/i18n/dicts/dcwDetail.json +2 -0
  1142. package/i18n/locales/en.ts +71 -0
  1143. package/i18n/locales/zh-CN.ts +71 -0
  1144. package/package.json +2 -3
  1145. package/scripts/_audit/detached-instance.mjs +112 -0
  1146. package/scripts/_audit/schedules-ui/schedules-page.png +0 -0
  1147. package/scripts/_audit/schedules-ui/workspace-channel-tag.png +0 -0
  1148. package/scripts/_audit/stubs/nuxt-imports.mjs +67 -0
  1149. package/scripts/_audit/ts-register-hook.mjs +12 -0
  1150. package/scripts/_audit/ts-resolve-hook.mjs +25 -5
  1151. package/scripts/_audit/watchdog-recovery-test.mjs +24 -2
  1152. package/scripts/_aw-packaged-start.cjs +22 -0
  1153. package/scripts/_aw0746-stage12.mjs +94 -0
  1154. package/scripts/_aw0746-stage34.mjs +134 -0
  1155. package/scripts/_aw0746-stage5.mjs +106 -0
  1156. package/scripts/_aw0746-stage6-aml.mjs +177 -0
  1157. package/scripts/_aw0746-stage6b-train-sweep.mjs +142 -0
  1158. package/scripts/_aw0746-stage7-twin.mjs +259 -0
  1159. package/scripts/_aw0746-train-strong.py +142 -0
  1160. package/scripts/_dbg-comm-verify.mjs +188 -0
  1161. package/scripts/_dbg-full-feature-e2e.mjs +19 -11
  1162. package/scripts/_dbg-im-e2e.mjs +169 -0
  1163. package/scripts/_dbg-opt2-run.mjs +114 -0
  1164. package/scripts/_dbg-opt2-setup.mjs +95 -0
  1165. package/scripts/_dbg-param-map-e2e.ts +1 -1
  1166. package/scripts/_dbg-param-map-rest-smoke.mjs +1 -1
  1167. package/scripts/_dbg-real-scenario-e2e.mjs +246 -0
  1168. package/scripts/_dbg-schedule-e2e.mjs +262 -0
  1169. package/scripts/_dbg-schedule-ui-verify.mjs +115 -0
  1170. package/scripts/_dbg-team-matrix.mjs +148 -0
  1171. package/scripts/_dbg-ui-fullcrawl.mjs +91 -0
  1172. package/scripts/_dbg-ui-static-audit.mjs +65 -0
  1173. package/scripts/_dbg-write-lock-e2e.mjs +131 -0
  1174. package/scripts/_plc-sim-detached.cjs +22 -0
  1175. package/scripts/_probe-daq-omp-task.mjs +100 -0
  1176. package/scripts/_probe-daq-scope-default.mjs +123 -0
  1177. package/scripts/_probe-density.cjs +15 -0
  1178. package/scripts/_probe-gate-model.mjs +34 -0
  1179. package/scripts/_probe-model-eligibility.cjs +13 -0
  1180. package/scripts/_probe-recipe-switch.mjs +92 -0
  1181. package/scripts/_provision-injection-line.mjs +39 -0
  1182. package/scripts/_run-matrix.ps1 +53 -0
  1183. package/scripts/_run-real-injection-fifo-goals.mjs +367 -0
  1184. package/scripts/acceptance-aml-db.ts +23 -0
  1185. package/scripts/acceptance-aml-hybrid-live.mjs +94 -0
  1186. package/scripts/acceptance-aml-hybrid-twin.ts +93 -0
  1187. package/scripts/acceptance-hybrid-python.py +51 -0
  1188. package/scripts/aml-ui-smoke.mjs +2 -0
  1189. package/scripts/api-live-e2e.mjs +32 -7
  1190. package/scripts/demo-group-chat-all-real.ts +279 -0
  1191. package/scripts/demo-group-chat-omp-cases.ts +210 -0
  1192. package/scripts/demo-group-chat-omp.ts +184 -0
  1193. package/scripts/demo-group-chat-order.ts +197 -0
  1194. package/scripts/e2e-agent-team.mjs +6 -4
  1195. package/scripts/e2e-agentteam-chat.mjs +473 -0
  1196. package/scripts/e2e-agentteam-real-triage.mjs +421 -0
  1197. package/scripts/e2e-agentteam-task-flow-real.ts +443 -0
  1198. package/scripts/e2e-aw-tui-global.mjs +8 -8
  1199. package/scripts/e2e-channel-isolation.ts +5 -1
  1200. package/scripts/e2e-closedloop/cleanup.mjs +27 -0
  1201. package/scripts/e2e-closedloop/lib.mjs +109 -0
  1202. package/scripts/e2e-closedloop/main.mjs +59 -0
  1203. package/scripts/e2e-closedloop/scenarios-accounts.mjs +208 -0
  1204. package/scripts/e2e-closedloop/scenarios-authz.mjs +190 -0
  1205. package/scripts/e2e-closedloop/scenarios-daq-dcw.mjs +219 -0
  1206. package/scripts/e2e-closedloop/scenarios-plugins.mjs +169 -0
  1207. package/scripts/e2e-closedloop/state.mjs +10 -0
  1208. package/scripts/e2e-crash-cycle.mjs +108 -0
  1209. package/scripts/e2e-full-closedloop.mjs +6 -919
  1210. package/scripts/e2e-hil-multi-user.mjs +307 -0
  1211. package/scripts/e2e-hil-restart.mjs +339 -0
  1212. package/scripts/e2e-hitl-live.mjs +336 -323
  1213. package/scripts/e2e-lead-team-mgmt.ts +1 -1
  1214. package/scripts/e2e-memory-system.ts +70 -89
  1215. package/scripts/e2e-multiharness-team.mjs +32 -15
  1216. package/scripts/e2e-omp-workspace.ts +21 -6
  1217. package/scripts/e2e-parallel-execution.mjs +20 -6
  1218. package/scripts/e2e-plc-plugin-closedloop.mjs +96 -65
  1219. package/scripts/e2e-rest-memory.mjs +26 -11
  1220. package/scripts/e2e-resume-crash.mjs +22 -7
  1221. package/scripts/e2e-task-queue.ts +8 -8
  1222. package/scripts/e2e-template-isolation.mjs +4 -2
  1223. package/scripts/proof-omp-real.ts +189 -0
  1224. package/scripts/real-injection-closed-loop.mjs +383 -0
  1225. package/scripts/test-agent-runtime.ts +5 -1
  1226. package/scripts/test-agentteam-guardrails.ts +113 -0
  1227. package/scripts/test-agentteam-task-chat-flow.ts +420 -0
  1228. package/scripts/test-agentteam-workflow.ts +472 -0
  1229. package/scripts/test-collab-e2e.mjs +17 -3
  1230. package/scripts/test-dcw-read.ts +9 -2
  1231. package/scripts/test-event-persistence.mjs +10 -2
  1232. package/scripts/test-full-system.ts +16 -3
  1233. package/scripts/test-group-chat-hardening.ts +265 -0
  1234. package/scripts/test-group-chat-unit/lib.ts +186 -0
  1235. package/scripts/test-group-chat-unit/main.ts +45 -0
  1236. package/scripts/test-group-chat-unit/section-a-migration.ts +75 -0
  1237. package/scripts/test-group-chat-unit/section-b-permission-matrix.ts +88 -0
  1238. package/scripts/test-group-chat-unit/section-c-member-lifecycle.ts +64 -0
  1239. package/scripts/test-group-chat-unit/section-d-mention-resolution.ts +36 -0
  1240. package/scripts/test-group-chat-unit/section-e-chat-facts.ts +97 -0
  1241. package/scripts/test-group-chat-unit/section-f-user-notifications.ts +52 -0
  1242. package/scripts/test-group-chat-unit/section-g-member-projection.ts +44 -0
  1243. package/scripts/test-group-chat-unit/section-h-outbox-consistency.ts +30 -0
  1244. package/scripts/test-group-chat-unit/section-i-read-idempotency.ts +24 -0
  1245. package/scripts/test-group-chat-unit/section-j-permission-scope.ts +150 -0
  1246. package/scripts/test-group-chat-unit.ts +35 -0
  1247. package/scripts/test-hitl-decision.ts +526 -0
  1248. package/scripts/test-hitl-legacy-channel-auth.ts +143 -0
  1249. package/scripts/test-lane-history-live.mjs +30 -7
  1250. package/scripts/test-memory-vector.ts +10 -0
  1251. package/scripts/test-orchestration.ts +7 -2
  1252. package/scripts/test-persistence-lazy.ts +7 -1
  1253. package/scripts/test-prompt-system.mjs +46 -20
  1254. package/scripts/test-route-reason.mjs +9 -2
  1255. package/scripts/test-schedule-runtime.ts +309 -0
  1256. package/scripts/test-scheduler-loop/lib.ts +321 -0
  1257. package/scripts/test-scheduler-loop/main.ts +40 -0
  1258. package/scripts/test-scheduler-loop/scenarios-modes.ts +95 -0
  1259. package/scripts/test-scheduler-loop/scenarios-runtime.ts +58 -0
  1260. package/scripts/test-scheduler-loop/scenarios-supervise.ts +183 -0
  1261. package/scripts/test-scheduler-loop/scenarios-triage.ts +102 -0
  1262. package/scripts/test-scheduler-loop.ts +5 -460
  1263. package/scripts/test-supervision-watchdog.ts +105 -0
  1264. package/scripts/test-task-engine.ts +27 -5
  1265. package/scripts/test-task-lease-fencing.ts +154 -0
  1266. package/scripts/test-terminal-e2e.mjs +9 -3
  1267. package/scripts/three-system-e2e/lib.mjs +79 -0
  1268. package/scripts/three-system-e2e/main.mjs +40 -0
  1269. package/scripts/three-system-e2e/phases/phase-0-user-token.mjs +42 -0
  1270. package/scripts/three-system-e2e/phases/phase-0a2-line-autoselect.mjs +35 -0
  1271. package/scripts/three-system-e2e/phases/phase-0b-fixture-grants.mjs +39 -0
  1272. package/scripts/three-system-e2e/phases/phase-0c-plugin-outbound-auth.mjs +95 -0
  1273. package/scripts/three-system-e2e/phases/stage-1-health.mjs +47 -0
  1274. package/scripts/three-system-e2e/phases/stage-2-5-team-plugins.mjs +84 -0
  1275. package/scripts/three-system-e2e/phases/stage-2-teams-tools-hitl.mjs +184 -0
  1276. package/scripts/three-system-e2e/phases/stage-3-diag.mjs +73 -0
  1277. package/scripts/three-system-e2e/phases/stage-4-plugin-toggle.mjs +53 -0
  1278. package/scripts/three-system-e2e/state.mjs +87 -0
  1279. package/scripts/three-system-e2e.mjs +24 -646
  1280. package/scripts/typecheck.mjs +75 -0
  1281. package/scripts/ui/lib.mjs +14 -2
  1282. package/scripts/ui/smoke-refactor.mjs +258 -0
  1283. package/scripts/verify-a2a-live.mjs +15 -1
  1284. package/scripts/verify-ws-events.mjs +19 -1
  1285. package/server/api/system/monitor/terminal/ws.ts +51 -1
  1286. package/server/api/workshop/agent-tools/approvals/[id]/decide.post.ts +59 -5
  1287. package/server/api/workshop/agent-tools/approvals/index.get.ts +28 -3
  1288. package/server/api/workshop/channel-templates/[id]/instantiate.post.ts +6 -1
  1289. package/server/api/workshop/channels/[id]/chat/messages/[messageId]/read.post.ts +22 -0
  1290. package/server/api/workshop/channels/[id]/chat/messages/index.get.ts +29 -0
  1291. package/server/api/workshop/channels/[id]/chat/messages/index.post.ts +51 -0
  1292. package/server/api/workshop/channels/[id]/chat/permissions.get.ts +35 -0
  1293. package/server/api/workshop/channels/[id]/index.patch.ts +34 -8
  1294. package/server/api/workshop/channels/[id]/members/[userId]/approve.post.ts +20 -0
  1295. package/server/api/workshop/channels/[id]/members/[userId].delete.ts +21 -0
  1296. package/server/api/workshop/channels/[id]/members/index.get.ts +23 -0
  1297. package/server/api/workshop/channels/[id]/members/join.post.ts +30 -0
  1298. package/server/api/workshop/channels/[id]/members/leave.post.ts +20 -0
  1299. package/server/api/workshop/channels/[id]/messages/index.post.ts +3 -0
  1300. package/server/api/workshop/channels/[id]/tasks/index.post.ts +8 -0
  1301. package/server/api/workshop/channels.get.ts +21 -1
  1302. package/server/api/workshop/hitl/pending.get.ts +27 -7
  1303. package/server/api/workshop/hitl/respond.post.ts +86 -89
  1304. package/server/api/workshop/notifications/index.get.ts +60 -0
  1305. package/server/api/workshop/notifications/read.post.ts +31 -0
  1306. package/server/api/workshop/schedules/[id]/run.post.ts +15 -0
  1307. package/server/api/workshop/schedules/[id]/runs.get.ts +15 -0
  1308. package/server/api/workshop/schedules/[id].delete.ts +14 -0
  1309. package/server/api/workshop/schedules/[id].get.ts +13 -0
  1310. package/server/api/workshop/schedules/[id].patch.ts +29 -0
  1311. package/server/api/workshop/schedules/index.get.ts +12 -0
  1312. package/server/api/workshop/schedules/index.post.ts +32 -0
  1313. package/server/api/workshop/tasks/[id]/reassign.post.ts +32 -0
  1314. package/server/api/workshop/tasks/[id]/update.post.ts +35 -0
  1315. package/server/api/workshop/tasks/[id].get.ts +15 -6
  1316. package/server/api/workshop/ws/audience.ts +56 -0
  1317. package/server/api/workshop/ws/db-buffer.ts +68 -0
  1318. package/server/api/workshop/ws/event-mapping.ts +47 -0
  1319. package/server/api/workshop/ws/handlers.ts +132 -0
  1320. package/server/api/workshop/ws/hub.ts +133 -0
  1321. package/server/api/workshop/ws/index.ts +23 -0
  1322. package/server/api/workshop/ws/notification-uplink.ts +77 -0
  1323. package/server/api/workshop/ws/peer-sub.ts +128 -0
  1324. package/server/api/workshop/ws/publish.ts +122 -0
  1325. package/server/api/workshop/ws/shared.ts +94 -0
  1326. package/server/api/workshop/ws/streams.ts +146 -0
  1327. package/server/api/workshop/ws/subscriptions.ts +137 -0
  1328. package/server/plugins/workshop.ts +30 -0
  1329. package/server/plugins-builtin/diag-bridge/host/constants.mjs +25 -0
  1330. package/server/plugins-builtin/diag-bridge/host/diagnosis.mjs +56 -0
  1331. package/server/plugins-builtin/diag-bridge/host/helpers.mjs +126 -0
  1332. package/server/plugins-builtin/diag-bridge/host/index.mjs +15 -0
  1333. package/server/plugins-builtin/diag-bridge/host/plugin.mjs +296 -0
  1334. package/server/plugins-builtin/diag-bridge/host/snapshot.mjs +93 -0
  1335. package/server/plugins-builtin/diag-bridge/host/sweep.mjs +51 -0
  1336. package/server/plugins-builtin/diag-bridge/index.mjs +6 -605
  1337. package/server/repositories/user.repository.ts +13 -0
  1338. package/server/services/system-config/contracts.ts +29 -0
  1339. package/server/services/system-config/dispose.ts +19 -0
  1340. package/server/services/system-config/facade.ts +26 -0
  1341. package/server/services/system-config/groups.ts +108 -0
  1342. package/server/services/system-config/helpers.ts +41 -0
  1343. package/server/services/system-config/index.ts +21 -0
  1344. package/server/services/system-config/init.ts +26 -0
  1345. package/server/services/system-config/mutate.ts +103 -0
  1346. package/server/services/system-config/plugins.ts +104 -0
  1347. package/server/services/system-config/recompute.ts +66 -0
  1348. package/server/services/system-config/snapshot.ts +59 -0
  1349. package/server/services/system-config/state.ts +79 -0
  1350. package/server/services/system-config/types.ts +58 -0
  1351. package/server/services/workshop/agents/adapters/line-spawn.ts +2 -2
  1352. package/server/services/workshop/agents/adapters/omp-rpc-client/api.ts +111 -0
  1353. package/server/services/workshop/agents/adapters/omp-rpc-client/contracts.ts +22 -0
  1354. package/server/services/workshop/agents/adapters/omp-rpc-client/facade.ts +7 -0
  1355. package/server/services/workshop/agents/adapters/omp-rpc-client/frames.ts +111 -0
  1356. package/server/services/workshop/agents/adapters/omp-rpc-client/helpers.ts +38 -0
  1357. package/server/services/workshop/agents/adapters/omp-rpc-client/index.ts +25 -0
  1358. package/server/services/workshop/agents/adapters/omp-rpc-client/start.ts +70 -0
  1359. package/server/services/workshop/agents/adapters/omp-rpc-client/state.ts +65 -0
  1360. package/server/services/workshop/agents/adapters/omp-rpc-client/stdout.ts +92 -0
  1361. package/server/services/workshop/agents/adapters/omp-rpc-client/types.ts +115 -0
  1362. package/server/services/workshop/agents/adapters/omp-rpc-client/usage.ts +47 -0
  1363. package/server/services/workshop/agents/agent-interface.ts +52 -4
  1364. package/server/services/workshop/agents/base-agent.ts +36 -8
  1365. package/server/services/workshop/agents/claude-agent.ts +5 -0
  1366. package/server/services/workshop/agents/codex-agent/client.ts +170 -0
  1367. package/server/services/workshop/agents/codex-agent/core.ts +119 -0
  1368. package/server/services/workshop/agents/codex-agent/facade.ts +8 -0
  1369. package/server/services/workshop/agents/codex-agent/helpers.ts +13 -0
  1370. package/server/services/workshop/agents/codex-agent/hitl.ts +138 -0
  1371. package/server/services/workshop/agents/codex-agent/index.ts +14 -0
  1372. package/server/services/workshop/agents/codex-agent/turn.ts +367 -0
  1373. package/server/services/workshop/agents/codex-agent/types.ts +42 -0
  1374. package/server/services/workshop/agents/dsh-agent.ts +5 -0
  1375. package/server/services/workshop/agents/harness-availability.ts +127 -127
  1376. package/server/services/workshop/agents/harness-terminal/api.ts +197 -0
  1377. package/server/services/workshop/agents/harness-terminal/index.ts +17 -0
  1378. package/server/services/workshop/agents/harness-terminal/io.ts +120 -0
  1379. package/server/services/workshop/agents/harness-terminal/park.ts +55 -0
  1380. package/server/services/workshop/agents/harness-terminal/sanitize.ts +98 -0
  1381. package/server/services/workshop/agents/harness-terminal/session.ts +124 -0
  1382. package/server/services/workshop/agents/harness-terminal/shared.ts +74 -0
  1383. package/server/services/workshop/agents/hermes-agent.ts +5 -0
  1384. package/server/services/workshop/agents/hitl-capabilities.ts +312 -0
  1385. package/server/services/workshop/agents/hitl-decision/answers.ts +27 -0
  1386. package/server/services/workshop/agents/hitl-decision/decide.ts +268 -0
  1387. package/server/services/workshop/agents/hitl-decision/dispatcher.ts +81 -0
  1388. package/server/services/workshop/agents/hitl-decision/index.ts +24 -0
  1389. package/server/services/workshop/agents/hitl-decision/payload.ts +45 -0
  1390. package/server/services/workshop/agents/hitl-decision/reconcile.ts +70 -0
  1391. package/server/services/workshop/agents/hitl-decision/shared.ts +106 -0
  1392. package/server/services/workshop/agents/hitl-decision/visibility.ts +94 -0
  1393. package/server/services/workshop/agents/hitl-registry.ts +403 -7
  1394. package/server/services/workshop/agents/host-tool-bridge/catalog.ts +78 -0
  1395. package/server/services/workshop/agents/host-tool-bridge/dispatch.ts +167 -0
  1396. package/server/services/workshop/agents/host-tool-bridge/index.ts +15 -0
  1397. package/server/services/workshop/agents/host-tool-bridge/session.ts +22 -0
  1398. package/server/services/workshop/agents/host-tool-bridge/tools/industrial.ts +64 -0
  1399. package/server/services/workshop/agents/host-tool-bridge/tools/memory.ts +44 -0
  1400. package/server/services/workshop/agents/host-tool-bridge/tools/messaging.ts +182 -0
  1401. package/server/services/workshop/agents/host-tool-bridge/tools/progress.ts +84 -0
  1402. package/server/services/workshop/agents/host-tool-bridge/tools/tasks.ts +120 -0
  1403. package/server/services/workshop/agents/host-tool-bridge/tools/team.ts +70 -0
  1404. package/server/services/workshop/agents/host-tool-bridge/types.ts +31 -0
  1405. package/server/services/workshop/agents/industrial/aml-dataset-tools.ts +276 -0
  1406. package/server/services/workshop/agents/industrial/aml-job-tools.ts +363 -0
  1407. package/server/services/workshop/agents/industrial/daq-tools.ts +251 -0
  1408. package/server/services/workshop/agents/industrial/dcw-judge-tools.ts +153 -0
  1409. package/server/services/workshop/agents/industrial/dcw-tools.ts +213 -0
  1410. package/server/services/workshop/agents/industrial/index.ts +24 -0
  1411. package/server/services/workshop/agents/industrial/ops-tools.ts +382 -0
  1412. package/server/services/workshop/agents/industrial/param-tools.ts +172 -0
  1413. package/server/services/workshop/agents/industrial/twin-tools.ts +250 -0
  1414. package/server/services/workshop/agents/mock-agent.ts +136 -12
  1415. package/server/services/workshop/agents/omp-agent/client.ts +116 -0
  1416. package/server/services/workshop/agents/omp-agent/context-governance.ts +204 -0
  1417. package/server/services/workshop/agents/omp-agent/core.ts +146 -0
  1418. package/server/services/workshop/agents/omp-agent/event-mapping.ts +142 -0
  1419. package/server/services/workshop/agents/omp-agent/facade.ts +8 -0
  1420. package/server/services/workshop/agents/omp-agent/helpers.ts +37 -0
  1421. package/server/services/workshop/agents/omp-agent/index.ts +16 -0
  1422. package/server/services/workshop/agents/omp-agent/lifecycle.ts +80 -0
  1423. package/server/services/workshop/agents/omp-agent/tools-steer.ts +487 -0
  1424. package/server/services/workshop/agents/omp-agent/types.ts +45 -0
  1425. package/server/services/workshop/agents/opencode-agent/core.ts +77 -0
  1426. package/server/services/workshop/agents/opencode-agent/engine-agnostic.ts +274 -0
  1427. package/server/services/workshop/agents/opencode-agent/facade.ts +8 -0
  1428. package/server/services/workshop/agents/opencode-agent/helpers.ts +29 -0
  1429. package/server/services/workshop/agents/opencode-agent/hitl.ts +113 -0
  1430. package/server/services/workshop/agents/opencode-agent/index.ts +16 -0
  1431. package/server/services/workshop/agents/opencode-agent/lifecycle.ts +44 -0
  1432. package/server/services/workshop/agents/opencode-agent/server.ts +244 -0
  1433. package/server/services/workshop/agents/opencode-agent/turn.ts +278 -0
  1434. package/server/services/workshop/agents/opencode-agent/types.ts +54 -0
  1435. package/server/services/workshop/agents/prompt-builder.ts +16 -6
  1436. package/server/services/workshop/agents/qwen-agent.ts +6 -2
  1437. package/server/services/workshop/agents/registry.ts +32 -2
  1438. package/server/services/workshop/aml/job-orchestrator/broadcast.ts +37 -0
  1439. package/server/services/workshop/aml/job-orchestrator/control.ts +94 -0
  1440. package/server/services/workshop/aml/job-orchestrator/failure.ts +77 -0
  1441. package/server/services/workshop/aml/job-orchestrator/index.ts +22 -0
  1442. package/server/services/workshop/aml/job-orchestrator/process.ts +100 -0
  1443. package/server/services/workshop/aml/job-orchestrator/shared.ts +51 -0
  1444. package/server/services/workshop/aml/job-orchestrator/stages.ts +96 -0
  1445. package/server/services/workshop/aml/job-orchestrator/start-job.ts +140 -0
  1446. package/server/services/workshop/aml/job-orchestrator/status.ts +20 -0
  1447. package/server/services/workshop/aml/job-orchestrator/submit.ts +120 -0
  1448. package/server/services/workshop/aml/job-orchestrator/tick.ts +37 -0
  1449. package/server/services/workshop/aml/python/__pycache__/amlkit.cpython-312.pyc +0 -0
  1450. package/server/services/workshop/aml/python/amlkit.py +185 -120
  1451. package/server/services/workshop/aml/python/requirements.txt +9 -7
  1452. package/server/services/workshop/aml/python/train-hybrid-example.py +87 -0
  1453. package/server/services/workshop/aml/twin/acceptance.ts +68 -0
  1454. package/server/services/workshop/aml/twin/calibration-scheduler.ts +48 -0
  1455. package/server/services/workshop/aml/twin/channel-profile.ts +43 -0
  1456. package/server/services/workshop/aml/twin/contracts.ts +215 -0
  1457. package/server/services/workshop/aml/twin/physics-runtime.ts +165 -0
  1458. package/server/services/workshop/aml/twin/repo.ts +31 -0
  1459. package/server/services/workshop/aml/twin/snapshot-service.ts +81 -0
  1460. package/server/services/workshop/aml/twin/trial-service.ts +89 -0
  1461. package/server/services/workshop/aml/twin/uq-ood.ts +66 -0
  1462. package/server/services/workshop/daq/daq-controller/contracts.ts +39 -0
  1463. package/server/services/workshop/daq/daq-controller/crud.ts +202 -0
  1464. package/server/services/workshop/daq/daq-controller/driver-probe.ts +64 -0
  1465. package/server/services/workshop/daq/daq-controller/facade.ts +28 -0
  1466. package/server/services/workshop/daq/daq-controller/frames.ts +137 -0
  1467. package/server/services/workshop/daq/daq-controller/helpers.ts +52 -0
  1468. package/server/services/workshop/daq/daq-controller/index.ts +22 -0
  1469. package/server/services/workshop/daq/daq-controller/ingest.ts +189 -0
  1470. package/server/services/workshop/daq/daq-controller/runtime-control.ts +72 -0
  1471. package/server/services/workshop/daq/daq-controller/state.ts +194 -0
  1472. package/server/services/workshop/daq/daq-controller/sweep-alarms.ts +164 -0
  1473. package/server/services/workshop/daq/daq-controller/tsdb-twin.ts +138 -0
  1474. package/server/services/workshop/daq/daq-controller/types.ts +68 -0
  1475. package/server/services/workshop/daq/daq-controller/views.ts +84 -0
  1476. package/server/services/workshop/daq/drivers/http.ts +95 -0
  1477. package/server/services/workshop/daq/drivers/index.ts +29 -0
  1478. package/server/services/workshop/daq/drivers/mock.ts +130 -0
  1479. package/server/services/workshop/daq/drivers/modbus-rtu.ts +67 -0
  1480. package/server/services/workshop/daq/drivers/modbus-tcp.ts +307 -0
  1481. package/server/services/workshop/daq/drivers/mqtt.ts +182 -0
  1482. package/server/services/workshop/daq/drivers/opcua.ts +227 -0
  1483. package/server/services/workshop/daq/drivers/registry.ts +144 -0
  1484. package/server/services/workshop/daq/drivers/s7-stub.ts +29 -0
  1485. package/server/services/workshop/daq/drivers/shared.ts +60 -0
  1486. package/server/services/workshop/db/channel-member.repo.ts +122 -0
  1487. package/server/services/workshop/db/channel.repo.ts +93 -8
  1488. package/server/services/workshop/db/chat-message.repo.ts +233 -0
  1489. package/server/services/workshop/db/database/index.ts +18 -0
  1490. package/server/services/workshop/db/database/json.ts +14 -0
  1491. package/server/services/workshop/db/database/migrations.ts +367 -0
  1492. package/server/services/workshop/db/database/open.ts +76 -0
  1493. package/server/services/workshop/db/database/rows.ts +374 -0
  1494. package/server/services/workshop/db/database/schema.ts +651 -0
  1495. package/server/services/workshop/db/database/seed-data.ts +60 -0
  1496. package/server/services/workshop/db/database/seed.ts +145 -0
  1497. package/server/services/workshop/db/hitl-request.repo.ts +221 -0
  1498. package/server/services/workshop/db/notification.repo.ts +199 -0
  1499. package/server/services/workshop/db/outbox.repo.ts +127 -0
  1500. package/server/services/workshop/db/scheduled-task.repo.ts +235 -0
  1501. package/server/services/workshop/db/schema.sql +185 -0
  1502. package/server/services/workshop/db/task.repo.ts +185 -69
  1503. package/server/services/workshop/db/transaction.ts +72 -0
  1504. package/server/services/workshop/dcw/dcw-controller/actuation.ts +127 -0
  1505. package/server/services/workshop/dcw/dcw-controller/bindings.ts +83 -0
  1506. package/server/services/workshop/dcw/dcw-controller/contracts.ts +16 -0
  1507. package/server/services/workshop/dcw/dcw-controller/control.ts +78 -0
  1508. package/server/services/workshop/dcw/dcw-controller/crud.ts +152 -0
  1509. package/server/services/workshop/dcw/dcw-controller/facade.ts +19 -0
  1510. package/server/services/workshop/dcw/dcw-controller/helpers.ts +57 -0
  1511. package/server/services/workshop/dcw/dcw-controller/index.ts +22 -0
  1512. package/server/services/workshop/dcw/dcw-controller/lines.ts +213 -0
  1513. package/server/services/workshop/dcw/dcw-controller/params.ts +97 -0
  1514. package/server/services/workshop/dcw/dcw-controller/products.ts +103 -0
  1515. package/server/services/workshop/dcw/dcw-controller/recipes.ts +137 -0
  1516. package/server/services/workshop/dcw/dcw-controller/state.ts +66 -0
  1517. package/server/services/workshop/dcw/dcw-controller/types.ts +57 -0
  1518. package/server/services/workshop/dcw/dcw-controller/write.ts +147 -0
  1519. package/server/services/workshop/dcw/dcw-node.ts +8 -0
  1520. package/server/services/workshop/dcw/drivers/http.ts +66 -0
  1521. package/server/services/workshop/dcw/drivers/index.ts +26 -0
  1522. package/server/services/workshop/dcw/drivers/mock.ts +44 -0
  1523. package/server/services/workshop/dcw/drivers/modbus-rtu.ts +93 -0
  1524. package/server/services/workshop/dcw/drivers/modbus.ts +139 -0
  1525. package/server/services/workshop/dcw/drivers/mqtt.ts +108 -0
  1526. package/server/services/workshop/dcw/drivers/opcua.ts +110 -0
  1527. package/server/services/workshop/dcw/drivers/registry.ts +118 -0
  1528. package/server/services/workshop/dcw/drivers/shared.ts +113 -0
  1529. package/server/services/workshop/dcw/recipe-rollback-manager/contracts.ts +26 -0
  1530. package/server/services/workshop/dcw/recipe-rollback-manager/facade.ts +13 -0
  1531. package/server/services/workshop/dcw/recipe-rollback-manager/helpers.ts +30 -0
  1532. package/server/services/workshop/dcw/recipe-rollback-manager/index.ts +17 -0
  1533. package/server/services/workshop/dcw/recipe-rollback-manager/internal.ts +33 -0
  1534. package/server/services/workshop/dcw/recipe-rollback-manager/judge.ts +52 -0
  1535. package/server/services/workshop/dcw/recipe-rollback-manager/lock.ts +137 -0
  1536. package/server/services/workshop/dcw/recipe-rollback-manager/rollback.ts +190 -0
  1537. package/server/services/workshop/dcw/recipe-rollback-manager/state.ts +21 -0
  1538. package/server/services/workshop/dcw/recipe-rollback-manager/sweep.ts +77 -0
  1539. package/server/services/workshop/dcw/recipe-rollback-manager/types.ts +3 -0
  1540. package/server/services/workshop/dcw/recipe-rollback-manager/views.ts +214 -0
  1541. package/server/services/workshop/plugins/host/api.mjs +90 -0
  1542. package/server/services/workshop/plugins/host/config.mjs +135 -0
  1543. package/server/services/workshop/plugins/host/index.mjs +23 -0
  1544. package/server/services/workshop/plugins/host/init.mjs +101 -0
  1545. package/server/services/workshop/plugins/host/load.mjs +321 -0
  1546. package/server/services/workshop/plugins/host/reload.mjs +94 -0
  1547. package/server/services/workshop/plugins/host/rollback.mjs +72 -0
  1548. package/server/services/workshop/plugins/host/services.mjs +58 -0
  1549. package/server/services/workshop/plugins/host/state.mjs +54 -0
  1550. package/server/services/workshop/plugins/host/toggle.mjs +64 -0
  1551. package/server/services/workshop/plugins/host.mjs +6 -890
  1552. package/server/services/workshop/runtime/agent-runtime/contracts.ts +25 -0
  1553. package/server/services/workshop/runtime/agent-runtime/facade.ts +7 -0
  1554. package/server/services/workshop/runtime/agent-runtime/helpers.ts +18 -0
  1555. package/server/services/workshop/runtime/agent-runtime/index.ts +19 -0
  1556. package/server/services/workshop/runtime/agent-runtime/lifecycle.ts +119 -0
  1557. package/server/services/workshop/runtime/agent-runtime/message.ts +409 -0
  1558. package/server/services/workshop/runtime/agent-runtime/state.ts +371 -0
  1559. package/server/services/workshop/runtime/agent-runtime/supervise.ts +188 -0
  1560. package/server/services/workshop/runtime/agent-runtime/types.ts +186 -0
  1561. package/server/services/workshop/runtime/channel-runtime.ts +7 -0
  1562. package/server/services/workshop/runtime/chat-mention.ts +164 -0
  1563. package/server/services/workshop/runtime/chat-projection.ts +246 -0
  1564. package/server/services/workshop/runtime/execution-mode.ts +11 -2
  1565. package/server/services/workshop/runtime/manager/a2a.ts +283 -0
  1566. package/server/services/workshop/runtime/manager/access.ts +483 -0
  1567. package/server/services/workshop/runtime/manager/admin-agents.ts +268 -0
  1568. package/server/services/workshop/runtime/manager/admin-channel.ts +276 -0
  1569. package/server/services/workshop/runtime/manager/bus.ts +182 -0
  1570. package/server/services/workshop/runtime/manager/channel-templates.ts +171 -0
  1571. package/server/services/workshop/runtime/manager/chat-reply.ts +181 -0
  1572. package/server/services/workshop/runtime/manager/chat.ts +384 -0
  1573. package/server/services/workshop/runtime/manager/contracts.ts +210 -0
  1574. package/server/services/workshop/runtime/manager/facade.ts +24 -0
  1575. package/server/services/workshop/runtime/manager/helpers.ts +119 -0
  1576. package/server/services/workshop/runtime/manager/host-tools.ts +249 -0
  1577. package/server/services/workshop/runtime/manager/index.ts +42 -0
  1578. package/server/services/workshop/runtime/manager/internal.ts +73 -0
  1579. package/server/services/workshop/runtime/manager/lead-team.ts +161 -0
  1580. package/server/services/workshop/runtime/manager/notifications.ts +108 -0
  1581. package/server/services/workshop/runtime/manager/runtime-observe.ts +300 -0
  1582. package/server/services/workshop/runtime/manager/runtime-wiring.ts +307 -0
  1583. package/server/services/workshop/runtime/manager/schedules.ts +302 -0
  1584. package/server/services/workshop/runtime/manager/state.ts +644 -0
  1585. package/server/services/workshop/runtime/manager/tasks.ts +518 -0
  1586. package/server/services/workshop/runtime/manager/teams.ts +148 -0
  1587. package/server/services/workshop/runtime/manager/types.ts +245 -0
  1588. package/server/services/workshop/runtime/manager/workspace.ts +136 -0
  1589. package/server/services/workshop/runtime/memory/contracts.ts +18 -0
  1590. package/server/services/workshop/runtime/memory/facade.ts +10 -0
  1591. package/server/services/workshop/runtime/memory/governance.ts +184 -0
  1592. package/server/services/workshop/runtime/memory/helpers.ts +196 -0
  1593. package/server/services/workshop/runtime/memory/index.ts +27 -0
  1594. package/server/services/workshop/runtime/memory/recall.ts +216 -0
  1595. package/server/services/workshop/runtime/memory/score.ts +33 -0
  1596. package/server/services/workshop/runtime/memory/state.ts +40 -0
  1597. package/server/services/workshop/runtime/memory/types.ts +44 -0
  1598. package/server/services/workshop/runtime/memory/write.ts +93 -0
  1599. package/server/services/workshop/runtime/permission-scope.ts +81 -0
  1600. package/server/services/workshop/runtime/schedule-runtime.ts +320 -0
  1601. package/server/services/workshop/runtime/scheduler-loop/contracts.ts +29 -0
  1602. package/server/services/workshop/runtime/scheduler-loop/execute.ts +295 -0
  1603. package/server/services/workshop/runtime/scheduler-loop/facade.ts +7 -0
  1604. package/server/services/workshop/runtime/scheduler-loop/helpers.ts +14 -0
  1605. package/server/services/workshop/runtime/scheduler-loop/index.ts +16 -0
  1606. package/server/services/workshop/runtime/scheduler-loop/rules.ts +131 -0
  1607. package/server/services/workshop/runtime/scheduler-loop/snapshot.ts +99 -0
  1608. package/server/services/workshop/runtime/scheduler-loop/state.ts +150 -0
  1609. package/server/services/workshop/runtime/scheduler-loop/tick.ts +157 -0
  1610. package/server/services/workshop/runtime/scheduler-loop/types.ts +50 -0
  1611. package/server/services/workshop/runtime/task-engine/contracts.ts +16 -0
  1612. package/server/services/workshop/runtime/task-engine/create.ts +145 -0
  1613. package/server/services/workshop/runtime/task-engine/facade.ts +7 -0
  1614. package/server/services/workshop/runtime/task-engine/helpers.ts +87 -0
  1615. package/server/services/workshop/runtime/task-engine/index.ts +15 -0
  1616. package/server/services/workshop/runtime/task-engine/lease.ts +79 -0
  1617. package/server/services/workshop/runtime/task-engine/lifecycle.ts +308 -0
  1618. package/server/services/workshop/runtime/task-engine/policy.ts +113 -0
  1619. package/server/services/workshop/runtime/task-engine/transition.ts +146 -0
  1620. package/server/services/workshop/runtime/task-engine/types.ts +3 -0
  1621. package/server/services/workshop/runtime/task-engine/update.ts +116 -0
  1622. package/server/services/workshop/runtime/task-engine/views.ts +169 -0
  1623. package/server/services/workshop/runtime/user-notification-hub.ts +192 -0
  1624. package/server/services/workshop/settings.ts +32 -0
  1625. package/server/services/workshop/types/task.ts +85 -0
  1626. package/server/utils/errors.ts +2 -0
  1627. package/server/utils/mojibake-guard.ts +29 -0
  1628. package/shared/config/schema.json +12 -0
  1629. package/shared/dcw-protocol/catalog.ts +203 -0
  1630. package/shared/dcw-protocol/closed-loop.ts +137 -0
  1631. package/shared/dcw-protocol/index.ts +19 -0
  1632. package/shared/dcw-protocol/line.ts +131 -0
  1633. package/shared/dcw-protocol/recipe.ts +301 -0
  1634. package/shared/workshop-protocol.ts +327 -5
  1635. package/tui/aw-tui.mjs +27 -6
  1636. package/tui/lib/pickers.mjs +21 -2
  1637. package/.output/public/_nuxt/4sIEbgcl.js +0 -42
  1638. package/.output/public/_nuxt/B7gZokg82.js +0 -209
  1639. package/.output/public/_nuxt/B8uy9iRW.js +0 -1
  1640. package/.output/public/_nuxt/BC9wjTJK2.js +0 -4
  1641. package/.output/public/_nuxt/BCGafdXT.js +0 -2
  1642. package/.output/public/_nuxt/BDmh31hl.js +0 -1
  1643. package/.output/public/_nuxt/BFjGV-RV2.js +0 -4108
  1644. package/.output/public/_nuxt/BGTYYQH-.js +0 -1
  1645. package/.output/public/_nuxt/BHA40aHa.js +0 -1
  1646. package/.output/public/_nuxt/BJHKLJJU.js +0 -1
  1647. package/.output/public/_nuxt/BN6iuJEg2.js +0 -1
  1648. package/.output/public/_nuxt/BU83-NnX.js +0 -106
  1649. package/.output/public/_nuxt/BUmHEJ77.js +0 -2
  1650. package/.output/public/_nuxt/BY7YrV_D.js +0 -1
  1651. package/.output/public/_nuxt/BYhEUx8t.js +0 -17
  1652. package/.output/public/_nuxt/BneN7fbu.js +0 -75
  1653. package/.output/public/_nuxt/Bqcgz95s.js +0 -18
  1654. package/.output/public/_nuxt/C3J6FYKa.js +0 -1
  1655. package/.output/public/_nuxt/C3gwHTz0.js +0 -1
  1656. package/.output/public/_nuxt/C4DWUZ6d2.js +0 -1
  1657. package/.output/public/_nuxt/C7UlqPeD.js +0 -1
  1658. package/.output/public/_nuxt/CClOy-Hz2.js +0 -1
  1659. package/.output/public/_nuxt/CFxtLwjp.js +0 -1
  1660. package/.output/public/_nuxt/CS50LB_l.js +0 -1
  1661. package/.output/public/_nuxt/CSkxz2NX.js +0 -3
  1662. package/.output/public/_nuxt/CTmDn-YP.js +0 -1
  1663. package/.output/public/_nuxt/CWoJjWmZ.js +0 -1
  1664. package/.output/public/_nuxt/CYWVXZTS2.js +0 -7
  1665. package/.output/public/_nuxt/C__m4EhR.js +0 -1
  1666. package/.output/public/_nuxt/CoNpEq5X.js +0 -1
  1667. package/.output/public/_nuxt/Crod5z2f.js +0 -1
  1668. package/.output/public/_nuxt/Cs8pVeVG.js +0 -1
  1669. package/.output/public/_nuxt/CssgYAAL2.js +0 -1
  1670. package/.output/public/_nuxt/CzlMDL5H.js +0 -13
  1671. package/.output/public/_nuxt/D0ZBQrN_2.js +0 -1
  1672. package/.output/public/_nuxt/D6uzXueg.js +0 -2
  1673. package/.output/public/_nuxt/D98NH8kG.js +0 -1
  1674. package/.output/public/_nuxt/D9Oidm5I.js +0 -1
  1675. package/.output/public/_nuxt/DBHNsT1Y.js +0 -23
  1676. package/.output/public/_nuxt/DDgJcSET.js +0 -19
  1677. package/.output/public/_nuxt/DGIuvyRN2.js +0 -1
  1678. package/.output/public/_nuxt/DGj-WEBg.js +0 -1
  1679. package/.output/public/_nuxt/DHFrCUxA2.js +0 -13
  1680. package/.output/public/_nuxt/DIaZ2PTo2.js +0 -1
  1681. package/.output/public/_nuxt/DKySmNPI.js +0 -14
  1682. package/.output/public/_nuxt/DPnwL14Y.js +0 -1
  1683. package/.output/public/_nuxt/DR12_WCA.js +0 -3
  1684. package/.output/public/_nuxt/DTFCy6h-.js +0 -1
  1685. package/.output/public/_nuxt/DYr1VMiQ.js +0 -6
  1686. package/.output/public/_nuxt/DZtm4l-P2.js +0 -1
  1687. package/.output/public/_nuxt/DdD9mCHM.js +0 -1
  1688. package/.output/public/_nuxt/DeyBFhKH2.js +0 -4
  1689. package/.output/public/_nuxt/Di0NY_ht.js +0 -1
  1690. package/.output/public/_nuxt/DkGQ7lnb2.js +0 -1
  1691. package/.output/public/_nuxt/DtYHUi5Z.js +0 -1
  1692. package/.output/public/_nuxt/Dz_Q3Lpw2.js +0 -1
  1693. package/.output/public/_nuxt/DzbFpZRk.js +0 -3
  1694. package/.output/public/_nuxt/EHlEMRii.js +0 -1
  1695. package/.output/public/_nuxt/Eke1fs-U.js +0 -1
  1696. package/.output/public/_nuxt/H0BcqZtT.js +0 -9
  1697. package/.output/public/_nuxt/HSYEkkce.js +0 -1
  1698. package/.output/public/_nuxt/IREZ1eC2.js +0 -1
  1699. package/.output/public/_nuxt/J9oU00D1.js +0 -1
  1700. package/.output/public/_nuxt/JCoYF4IJ.js +0 -31
  1701. package/.output/public/_nuxt/JTLM-kqr2.js +0 -1
  1702. package/.output/public/_nuxt/KZQX7xoM.js +0 -3
  1703. package/.output/public/_nuxt/OmpTerminalPanel.BxR5-lvi.css +0 -1
  1704. package/.output/public/_nuxt/RYFtK4qZ2.js +0 -1
  1705. package/.output/public/_nuxt/SSyAPaHc.js +0 -1
  1706. package/.output/public/_nuxt/TownView.li4EMQxK.css +0 -1
  1707. package/.output/public/_nuxt/VdLk4jLE2.js +0 -1
  1708. package/.output/public/_nuxt/YnQxK3eG.js +0 -1
  1709. package/.output/public/_nuxt/_id_.BhsXoEuk.css +0 -1
  1710. package/.output/public/_nuxt/_id_.DQyj-WKN.css +0 -1
  1711. package/.output/public/_nuxt/_wsId_.CTx-BlfF.css +0 -1
  1712. package/.output/public/_nuxt/aLLjF2K-2.js +0 -1
  1713. package/.output/public/_nuxt/aShsv_rG.js +0 -19
  1714. package/.output/public/_nuxt/aWWIh8YL.js +0 -24
  1715. package/.output/public/_nuxt/aesgXKSr.js +0 -4
  1716. package/.output/public/_nuxt/agents.B21nUEUX.css +0 -1
  1717. package/.output/public/_nuxt/aml.ekTjxFkf.css +0 -1
  1718. package/.output/public/_nuxt/builds/meta/b5506ef0-f48e-4f14-a6c0-d65e505d0b09.json +0 -1
  1719. package/.output/public/_nuxt/ca4TJ3Op.js +0 -1
  1720. package/.output/public/_nuxt/daq.BdVmoIfe.css +0 -1
  1721. package/.output/public/_nuxt/dcw.DCgyzpWV.css +0 -1
  1722. package/.output/public/_nuxt/default.Bh3L2HU8.css +0 -1
  1723. package/.output/public/_nuxt/entry.bdm0tv6M.css +0 -1
  1724. package/.output/public/_nuxt/jZsY8yYz.js +0 -1
  1725. package/.output/public/_nuxt/lHAxdSsj.js +0 -1
  1726. package/.output/public/_nuxt/logs.BpKzmKsh.css +0 -1
  1727. package/.output/public/_nuxt/monitor.D9pe7qN6.css +0 -1
  1728. package/.output/public/_nuxt/pages.j9rzRocr.css +0 -1
  1729. package/.output/public/_nuxt/pdk8jLGT.js +0 -1
  1730. package/.output/public/_nuxt/permissions.DwTVlFe6.css +0 -1
  1731. package/.output/public/_nuxt/plugins.DhiZbHU8.css +0 -1
  1732. package/.output/public/_nuxt/settings.BRx9rIDg.css +0 -1
  1733. package/.output/public/_nuxt/teams.BLlOPB_Z.css +0 -1
  1734. package/.output/public/_nuxt/tokens.De8xzszn.css +0 -1
  1735. package/.output/public/_nuxt/town.BLrD9-WH.css +0 -1
  1736. package/.output/public/_nuxt/users.DLgZ1D0h.css +0 -1
  1737. package/.output/public/_nuxt/vRTjoWqd.js +0 -1
  1738. package/.output/public/_nuxt/workshop.D1jFNkrn.css +0 -1
  1739. package/.output/public/_nuxt/xh3_vYcu.js +0 -1
  1740. package/.output/public/_nuxt/zq5t1vyX.js +0 -1
  1741. package/.output/server/chunks/build/Checkbox-eax2M3o-.mjs +0 -207
  1742. package/.output/server/chunks/build/Checkbox-eax2M3o-.mjs.map +0 -1
  1743. package/.output/server/chunks/build/OmpTerminalPanel-CVvxpsF7.mjs +0 -915
  1744. package/.output/server/chunks/build/OmpTerminalPanel-CVvxpsF7.mjs.map +0 -1
  1745. package/.output/server/chunks/build/PluginSlot-CcR4Ys3T.mjs +0 -400
  1746. package/.output/server/chunks/build/PluginSlot-CcR4Ys3T.mjs.map +0 -1
  1747. package/.output/server/chunks/build/TownView-CJ6IsDCc.mjs +0 -2791
  1748. package/.output/server/chunks/build/TownView-CJ6IsDCc.mjs.map +0 -1
  1749. package/.output/server/chunks/build/_id_-CVD_H0ir.mjs +0 -804
  1750. package/.output/server/chunks/build/_id_-CVD_H0ir.mjs.map +0 -1
  1751. package/.output/server/chunks/build/_id_-CtxMb3qp.mjs +0 -381
  1752. package/.output/server/chunks/build/_id_-CtxMb3qp.mjs.map +0 -1
  1753. package/.output/server/chunks/build/_wsId_-DpY3T-md.mjs +0 -10136
  1754. package/.output/server/chunks/build/_wsId_-DpY3T-md.mjs.map +0 -1
  1755. package/.output/server/chunks/build/agents-DsCkuXDV.mjs +0 -1114
  1756. package/.output/server/chunks/build/agents-DsCkuXDV.mjs.map +0 -1
  1757. package/.output/server/chunks/build/aml-CT0xKGKI.mjs +0 -605
  1758. package/.output/server/chunks/build/aml-CT0xKGKI.mjs.map +0 -1
  1759. package/.output/server/chunks/build/api-error-dul30BYQ.mjs +0 -47
  1760. package/.output/server/chunks/build/api-error-dul30BYQ.mjs.map +0 -1
  1761. package/.output/server/chunks/build/apiClient-BwnfOQU8.mjs +0 -81
  1762. package/.output/server/chunks/build/apiClient-BwnfOQU8.mjs.map +0 -1
  1763. package/.output/server/chunks/build/button-DEcZFcqN.mjs +0 -1938
  1764. package/.output/server/chunks/build/button-DEcZFcqN.mjs.map +0 -1
  1765. package/.output/server/chunks/build/card-Dipvaykh.mjs +0 -955
  1766. package/.output/server/chunks/build/card-Dipvaykh.mjs.map +0 -1
  1767. package/.output/server/chunks/build/channel-templates-Dla9FbYa.mjs +0 -847
  1768. package/.output/server/chunks/build/channel-templates-Dla9FbYa.mjs.map +0 -1
  1769. package/.output/server/chunks/build/checkbox-8fB-wI-T.mjs +0 -439
  1770. package/.output/server/chunks/build/checkbox-8fB-wI-T.mjs.map +0 -1
  1771. package/.output/server/chunks/build/client-only-D5BzSQc6.mjs +0 -43
  1772. package/.output/server/chunks/build/client-only-D5BzSQc6.mjs.map +0 -1
  1773. package/.output/server/chunks/build/daq-DWWSKGAV.mjs +0 -1059
  1774. package/.output/server/chunks/build/daq-DWWSKGAV.mjs.map +0 -1
  1775. package/.output/server/chunks/build/dcw-CT8k17_E.mjs +0 -250
  1776. package/.output/server/chunks/build/dcw-CT8k17_E.mjs.map +0 -1
  1777. package/.output/server/chunks/build/default-D3525UFX.mjs +0 -1487
  1778. package/.output/server/chunks/build/default-D3525UFX.mjs.map +0 -1
  1779. package/.output/server/chunks/build/drawer-Cmh90erI.mjs +0 -836
  1780. package/.output/server/chunks/build/drawer-Cmh90erI.mjs.map +0 -1
  1781. package/.output/server/chunks/build/dropdown-CGQ0KAzA.mjs +0 -14
  1782. package/.output/server/chunks/build/dropdown-CGQ0KAzA.mjs.map +0 -1
  1783. package/.output/server/chunks/build/dropdown-vhn1NPFs.mjs +0 -558
  1784. package/.output/server/chunks/build/dropdown-vhn1NPFs.mjs.map +0 -1
  1785. package/.output/server/chunks/build/initDefaultProps-DIbWwP4R.mjs +0 -21
  1786. package/.output/server/chunks/build/initDefaultProps-DIbWwP4R.mjs.map +0 -1
  1787. package/.output/server/chunks/build/input-number-DzpyYB99.mjs +0 -1521
  1788. package/.output/server/chunks/build/input-number-DzpyYB99.mjs.map +0 -1
  1789. package/.output/server/chunks/build/input-sf_BT6o6.mjs +0 -2617
  1790. package/.output/server/chunks/build/input-sf_BT6o6.mjs.map +0 -1
  1791. package/.output/server/chunks/build/logs--dByNyhw.mjs +0 -198
  1792. package/.output/server/chunks/build/logs--dByNyhw.mjs.map +0 -1
  1793. package/.output/server/chunks/build/menu-WCrlpYVh.mjs +0 -1950
  1794. package/.output/server/chunks/build/menu-WCrlpYVh.mjs.map +0 -1
  1795. package/.output/server/chunks/build/modal-yvUquPj5.mjs +0 -1272
  1796. package/.output/server/chunks/build/modal-yvUquPj5.mjs.map +0 -1
  1797. package/.output/server/chunks/build/monitor-Dh2Kvaq5.mjs +0 -2212
  1798. package/.output/server/chunks/build/monitor-Dh2Kvaq5.mjs.map +0 -1
  1799. package/.output/server/chunks/build/pages-BHcSBM2D.mjs +0 -518
  1800. package/.output/server/chunks/build/pages-BHcSBM2D.mjs.map +0 -1
  1801. package/.output/server/chunks/build/permissions-68SsNjex.mjs +0 -629
  1802. package/.output/server/chunks/build/permissions-68SsNjex.mjs.map +0 -1
  1803. package/.output/server/chunks/build/plugins-BNgIi61W.mjs +0 -246
  1804. package/.output/server/chunks/build/plugins-BNgIi61W.mjs.map +0 -1
  1805. package/.output/server/chunks/build/popconfirm-CRaHcz5O.mjs +0 -342
  1806. package/.output/server/chunks/build/popconfirm-CRaHcz5O.mjs.map +0 -1
  1807. package/.output/server/chunks/build/segmented-3TrWo0lS.mjs +0 -5047
  1808. package/.output/server/chunks/build/segmented-3TrWo0lS.mjs.map +0 -1
  1809. package/.output/server/chunks/build/select-D-CeE5vY.mjs +0 -3923
  1810. package/.output/server/chunks/build/select-D-CeE5vY.mjs.map +0 -1
  1811. package/.output/server/chunks/build/settings-ipYBDWdn.mjs +0 -1175
  1812. package/.output/server/chunks/build/settings-ipYBDWdn.mjs.map +0 -1
  1813. package/.output/server/chunks/build/space-CCBYAkXt.mjs +0 -197
  1814. package/.output/server/chunks/build/space-CCBYAkXt.mjs.map +0 -1
  1815. package/.output/server/chunks/build/spin-HVY81X_L.mjs +0 -358
  1816. package/.output/server/chunks/build/spin-HVY81X_L.mjs.map +0 -1
  1817. package/.output/server/chunks/build/switch-CelRXpcy.mjs +0 -377
  1818. package/.output/server/chunks/build/switch-CelRXpcy.mjs.map +0 -1
  1819. package/.output/server/chunks/build/table-BjSWwmic.mjs +0 -8883
  1820. package/.output/server/chunks/build/table-BjSWwmic.mjs.map +0 -1
  1821. package/.output/server/chunks/build/tabs-BM3tAh_J.mjs +0 -1925
  1822. package/.output/server/chunks/build/tabs-BM3tAh_J.mjs.map +0 -1
  1823. package/.output/server/chunks/build/tag-DNE9vXc0.mjs +0 -1029
  1824. package/.output/server/chunks/build/tag-DNE9vXc0.mjs.map +0 -1
  1825. package/.output/server/chunks/build/teams-5lx-CwFa.mjs +0 -1218
  1826. package/.output/server/chunks/build/teams-5lx-CwFa.mjs.map +0 -1
  1827. package/.output/server/chunks/build/tokens-q-IDT8Io.mjs +0 -908
  1828. package/.output/server/chunks/build/tokens-q-IDT8Io.mjs.map +0 -1
  1829. package/.output/server/chunks/build/town-BUqRobze.mjs +0 -52
  1830. package/.output/server/chunks/build/town-BUqRobze.mjs.map +0 -1
  1831. package/.output/server/chunks/build/town-QJWB5wng.mjs +0 -125
  1832. package/.output/server/chunks/build/town-QJWB5wng.mjs.map +0 -1
  1833. package/.output/server/chunks/build/useDaqStream-DfCFpb3p.mjs +0 -395
  1834. package/.output/server/chunks/build/useDaqStream-DfCFpb3p.mjs.map +0 -1
  1835. package/.output/server/chunks/build/useDcwStream-UPiX-3iO.mjs +0 -435
  1836. package/.output/server/chunks/build/useDcwStream-UPiX-3iO.mjs.map +0 -1
  1837. package/.output/server/chunks/build/useDeviceTwins-Yko6nNPF.mjs +0 -128
  1838. package/.output/server/chunks/build/useDeviceTwins-Yko6nNPF.mjs.map +0 -1
  1839. package/.output/server/chunks/build/useOpsLog-CO_VWh7t.mjs +0 -137
  1840. package/.output/server/chunks/build/useOpsLog-CO_VWh7t.mjs.map +0 -1
  1841. package/.output/server/chunks/build/useWorkshopApi-NyjL0L3j.mjs +0 -90
  1842. package/.output/server/chunks/build/useWorkshopApi-NyjL0L3j.mjs.map +0 -1
  1843. package/.output/server/chunks/build/useWorkshopWs-C_I7q9As.mjs +0 -1319
  1844. package/.output/server/chunks/build/useWorkshopWs-C_I7q9As.mjs.map +0 -1
  1845. package/.output/server/chunks/build/users-Cfd5-l2-.mjs +0 -561
  1846. package/.output/server/chunks/build/users-Cfd5-l2-.mjs.map +0 -1
  1847. package/.output/server/chunks/build/workshop-BIlCj_ZP.mjs +0 -931
  1848. package/.output/server/chunks/build/workshop-BIlCj_ZP.mjs.map +0 -1
  1849. package/.output/server/chunks/build/workspaces-Bgz5Ekwp.mjs +0 -139
  1850. package/.output/server/chunks/build/workspaces-Bgz5Ekwp.mjs.map +0 -1
  1851. package/scripts/test-agent-brain.ts +0 -135
  1852. package/scripts/test-game-session.ts +0 -160
  1853. package/scripts/test-protocol.ts +0 -156
  1854. package/scripts/verify-game.mjs +0 -477
  1855. package/server/api/workshop/ws.ts +0 -763
  1856. package/server/services/system-config.ts +0 -629
  1857. package/server/services/workshop/agents/adapters/omp-rpc-client.ts +0 -604
  1858. package/server/services/workshop/agents/codex-agent.ts +0 -743
  1859. package/server/services/workshop/agents/harness-terminal.ts +0 -625
  1860. package/server/services/workshop/agents/host-tool-bridge.ts +0 -714
  1861. package/server/services/workshop/agents/industrial-tools.ts +0 -1680
  1862. package/server/services/workshop/agents/omp-agent.ts +0 -1199
  1863. package/server/services/workshop/agents/opencode-agent.ts +0 -960
  1864. package/server/services/workshop/aml/job-orchestrator.ts +0 -639
  1865. package/server/services/workshop/daq/daq-controller.ts +0 -1284
  1866. package/server/services/workshop/daq/drivers.ts +0 -1196
  1867. package/server/services/workshop/db/database.ts +0 -1044
  1868. package/server/services/workshop/dcw/dcw-controller.ts +0 -1176
  1869. package/server/services/workshop/dcw/drivers.ts +0 -731
  1870. package/server/services/workshop/dcw/recipe-rollback-manager.ts +0 -713
  1871. package/server/services/workshop/runtime/agent-runtime.ts +0 -821
  1872. package/server/services/workshop/runtime/manager.ts +0 -3050
  1873. package/server/services/workshop/runtime/memory.ts +0 -681
  1874. package/server/services/workshop/runtime/scheduler-loop.ts +0 -799
  1875. package/server/services/workshop/runtime/task-engine.ts +0 -574
  1876. package/shared/dcw-protocol.ts +0 -747
  1877. /package/.output/public/_nuxt/{BrIJiJSN.js → BrIJiJSN2.js} +0 -0
  1878. /package/.output/public/_nuxt/{CNs_Ozdc2.js → CNs_Ozdc.js} +0 -0
  1879. /package/.output/public/_nuxt/{DIOBYJe3.js → DIOBYJe32.js} +0 -0
  1880. /package/.output/public/_nuxt/{lO5tpDZ5.js → lO5tpDZ52.js} +0 -0
@@ -1,2615 +1,297 @@
1
- <script setup lang="ts">
2
- import { computed, onUnmounted, reactive, ref } from 'vue'
3
- import { useRoute } from 'vue-router'
4
- import { DCW_DRIVERS, type DcwParamLedger, type DcwTemplateIcon, type LineQueryResult, type RecipeRunData, type RecipeView } from '#shared/dcw-protocol'
5
- import type { DaqDriverCatalogEntry, DriverConfigField } from '#shared/daq-protocol'
6
- import { useDcwStream } from '~/composables/workshop/useDcwStream'
7
- import { useDaqStream } from '~/composables/workshop/useDaqStream'
8
- import { useDeviceTwins } from '~/composables/workshop/useDeviceTwins'
9
-
10
- const { t } = useI18n()
11
-
12
- const route = useRoute()
13
- const dcw = useDcwStream()
14
- const daq = useDaqStream()
15
- const deviceTwins = useDeviceTwins()
16
- void daq.load()
17
-
18
- /** 路由产线 id;总览页「产线管理」进入 */
19
- const lineId = computed(() => String(route.params.id ?? ''))
20
- const line = computed(() => dcw.lines.find(l => l.id === lineId.value))
21
- const ls = computed(() => dcw.lineStateOf(lineId.value))
22
-
23
- void dcw.load()
24
- /** WS 喂帧:节点变更(dcw.node.changed)/写 ACK 实时收敛 —— 本页状态同步的通道 */
25
- const unsubDcw = dcw.ensureWsFeed()
26
- onUnmounted(() => unsubDcw())
27
-
28
- const nodeDeviceNames = (n: { deviceIds?: string[], deviceBindingId?: string | null }): string =>
29
- (n.deviceIds ?? (n.deviceBindingId ? [n.deviceBindingId] : []))
30
- .map(id => deviceName(id))
31
- .join(' / ') || '—'
32
- const deviceName = (id: string | null): string =>
33
- id ? (deviceTwins.twins.find(t => t.id === id)?.name ?? id) : t('dcwDetail.k3own4q121')
34
-
35
- const stateLabel = computed<Record<string, string>>(() => ({
36
- idle: t('dcwDetail.k3zgkk122'), writing: t('dcwDetail.k3l3h80123'), ok: t('dcwDetail.stAck'), error: t('dcwDetail.k40reu124'), offline: t('dcwDetail.k44c2n125'),
37
- }))
38
-
39
- function dcwTemplateRefCh(templateRef?: string): string {
40
- const ref = templateRef ?? ''
41
- const tpl = dcw.templates.find(t => t.key === (ref.startsWith('dcw-') ? ref.slice(4) : ref))
42
- return tpl?.ch ?? ref
43
- }
44
-
45
- /** 配方参数窗口提示:目标节点的全局工艺量程 */
46
- function nodeMin(nodeId: string): number | undefined {
47
- return dcw.nodeById(nodeId)?.min
48
- }
49
- function nodeMax(nodeId: string): number | undefined {
50
- return dcw.nodeById(nodeId)?.max
51
- }
52
-
53
- /** 本产线数采节点(配方监控窗口的可选目标) */
54
- const lineDaqNodes = computed(() => daq.nodes.filter(n => n.lineId === lineId.value))
55
-
56
- // ---------- 参数台账(调控闭环:三值对照 + 设定历史 + 优化记录) ----------
57
- const ledgerNodeId = ref('')
58
- const ledger = ref<DcwParamLedger | null>(null)
59
- const ledgerLoading = ref(false)
60
- async function loadLedger(): Promise<void> {
61
- if (!ledgerNodeId.value) return
62
- ledgerLoading.value = true
63
- try {
64
- ledger.value = await dcw.fetchLedger(ledgerNodeId.value)
65
- }
66
- finally {
67
- ledgerLoading.value = false
68
- }
69
- }
70
- /** 单步回退(经 write() 门控;回退后刷新台账) */
71
- async function rollbackLedgerNode(): Promise<void> {
72
- if (!ledgerNodeId.value) return
73
- await dcw.rollbackNode(ledgerNodeId.value)
74
- await loadLedger()
75
- }
76
-
77
- /** 监控窗口 chip 显示:数采节点参数语义 */
78
- function daqNodeCh(nodeId: string): string {
79
- return daq.nodeById(nodeId)?.name ?? nodeId
80
- }
81
-
82
- // ---------- 产线作用域数据(仅本产线 + 未分配收编) ----------
83
- /** 本产线节点(直写表) */
84
- const lineNodes = computed(() => dcw.nodes.filter(n => n.lineId === lineId.value))
85
- /** 本产线产品 */
86
- const lineProducts = computed(() => dcw.products.filter(p => p.lineId === lineId.value))
87
- /** 本产线配方 */
88
- const lineRecipesAll = computed(() => dcw.recipes.filter(r => r.lineId === lineId.value))
89
- /** 本产线批次 */
90
- const lineRuns = computed(() => dcw.runs.filter(r => r.lineId === lineId.value))
91
- /** 本产线写历史(按本产线节点过滤) */
92
- const lineHistory = computed(() => {
93
- const ids = new Set(lineNodes.value.map(n => n.id))
94
- return dcw.history.filter(h => ids.has(h.nodeId))
95
- })
96
- /** 未分配节点/产品(可收编进本产线) */
97
- const unassignedNodes = computed(() => dcw.nodes.filter(n => !n.lineId))
98
- const unassignedProducts = computed(() => dcw.products.filter(p => !p.lineId))
99
-
100
- async function adoptNode(id: string): Promise<void> {
101
- await dcw.patchNode(id, { lineId: lineId.value })
102
- const n = dcw.nodeById(id)
103
- if (n) n.lineId = lineId.value
104
- }
105
- async function adoptProduct(id: string): Promise<void> {
106
- await dcw.updateProduct(id, { lineId: lineId.value })
107
- await dcw.load()
108
- }
109
-
110
- // ---------- 直写 ----------
111
- const setInputs = reactive<Record<string, number | ''>>({})
112
- const writingId = ref('')
113
- const writeError = ref('')
114
- const writeOk = ref('')
115
-
116
- async function doWrite(nodeId: string, value: number): Promise<void> {
117
- writingId.value = nodeId
118
- writeError.value = ''
119
- writeOk.value = ''
120
- try {
121
- const outcome = await dcw.write(nodeId, value)
122
- if (outcome.ok) {
123
- writeOk.value = t('dcwDetail.k1alcbyu182', { p0: dcw.nodeById(nodeId)?.name ?? nodeId, p1: outcome.message })
124
- setInputs[nodeId] = ''
125
- }
126
- else {
127
- writeError.value = t('dcwDetail.kl1e9x9183', { p0: dcw.nodeById(nodeId)?.name ?? nodeId, p1: outcome.message })
128
- }
129
- }
130
- catch (err) {
131
- writeError.value = apiErrorMessage(err)
132
- }
133
- finally {
134
- writingId.value = ''
135
- }
136
- }
137
-
138
- // ---------- 读取(读写集成的读半边:手动读 PLC 当前值,周期读由服务端调度) ----------
139
- const readingId = ref('')
140
-
141
- async function doRead(nodeId: string): Promise<void> {
142
- readingId.value = nodeId
143
- writeError.value = ''
144
- try {
145
- await dcw.readNode(nodeId)
146
- }
147
- catch (err) {
148
- writeError.value = apiErrorMessage(err)
149
- }
150
- finally {
151
- readingId.value = ''
152
- }
153
- }
154
-
155
- // ---------- 逐节点 控制开启/暂停 ----------
156
- const togglingId = ref('')
157
- /** 开启/暂停单个节点的控制:暂停后服务端拒绝一切下发(409 当前节点暂停),本地即时收敛状态 */
158
- async function toggleControl(nodeId: string, enabled: boolean): Promise<void> {
159
- togglingId.value = nodeId
160
- writeError.value = ''
161
- try {
162
- await dcw.patchNode(nodeId, { enabled })
163
- const n = dcw.nodeById(nodeId)
164
- if (n) {
165
- n.enabled = enabled
166
- if (!enabled) n.state = 'offline'
167
- else if (n.state === 'offline') n.state = 'idle'
168
- }
169
- }
170
- catch (err) {
171
- writeError.value = apiErrorMessage(err)
172
- }
173
- finally {
174
- togglingId.value = ''
175
- }
176
- }
177
-
178
- // ---------- 添加控制节点向导 ----------
179
- const addOpen = ref(false)
180
- const addScenario = ref<'mock' | 'real'>('mock')
181
- const addTemplate = ref(dcw.templates[0]?.key ?? '')
182
- const addDriver = ref<'mock' | 'modbus-tcp' | 'opcua'>('mock')
183
- const addName = ref('')
184
- const addHold = ref<number | null>(null)
185
- const addRead = ref<number | null>(null)
186
- const addCfg = ref<Record<string, string | number>>({})
187
- const addTransform = reactive({ kind: 'none' as 'none' | 'linear', scale: 1, offset: 0 })
188
- const addSemantics = ref('')
189
- const addTesting = ref(false)
190
- const addTest = ref<{ ok: boolean, message: string } | null>(null)
191
- const addSaving = ref(false)
192
- const addError = ref('')
193
-
194
- // 写驱动目录:server 权威(内置 + 协议插件自描述;REST 未返回时回落静态目录)
195
- const driverCatalog = computed<DaqDriverCatalogEntry[]>(() => dcw.driverCatalog.length
196
- ? dcw.driverCatalog
197
- : DCW_DRIVERS.map(d => ({ ...d })))
198
- const addDriverMeta = computed(() => driverCatalog.value.find(d => d.kind === addDriver.value))
199
- const addFields = computed<DriverConfigField[]>(() => addDriverMeta.value?.configFields ?? [])
200
-
201
- function resetAddCfg(): void {
202
- const cfg: Record<string, string | number> = {}
203
- for (const f of addFields.value) {
204
- if (f.default !== undefined) cfg[f.key] = f.default
205
- }
206
- addCfg.value = cfg
207
- addTest.value = null
208
- }
209
- void resetAddCfg()
210
-
211
- async function doTestConnection(): Promise<void> {
212
- addTesting.value = true
213
- addTest.value = null
214
- try {
215
- addTest.value = await dcw.testDriver(addDriver.value, addCfg.value)
216
- }
217
- catch (err) {
218
- addTest.value = { ok: false, message: apiErrorMessage(err) }
219
- }
220
- finally {
221
- addTesting.value = false
222
- }
223
- }
224
-
225
- async function doAddNode(): Promise<void> {
226
- addSaving.value = true
227
- addError.value = ''
228
- try {
229
- for (const f of addFields.value) {
230
- if (f.required && (addCfg.value[f.key] === undefined || addCfg.value[f.key] === '')) {
231
- throw new Error(t('dcwDetail.k8x1un1184', { p0: f.label }))
232
- }
233
- }
234
- const transform = addTransform.kind === 'linear'
235
- ? { kind: 'linear' as const, scale: Number(addTransform.scale), offset: Number(addTransform.offset) }
236
- : undefined
237
- await dcw.createFromTemplate(`dcw-${addTemplate.value}`, {
238
- name: addName.value.trim() || undefined,
239
- driver: addDriver.value,
240
- driverConfig: { ...addCfg.value },
241
- transform,
242
- holdIntervalMs: addHold.value,
243
- readIntervalMs: addRead.value,
244
- lineId: lineId.value,
245
- semantics: addSemantics.value.trim() || undefined,
246
- })
247
- addOpen.value = false
248
- addName.value = ''
249
- addSemantics.value = ''
250
- }
251
- catch (err) {
252
- addError.value = apiErrorMessage(err)
253
- }
254
- finally {
255
- addSaving.value = false
256
- }
257
- }
258
-
259
- // ---------- 添加控制节点模板(自定义创建) ----------
260
- const tplOpen = ref(false)
261
- const tplSaving = ref(false)
262
- const tplError = ref('')
263
- const tplOk = ref('')
264
-
265
- function openTplModal(): void {
266
- tplOpen.value = true
267
- tplError.value = ''
268
- tplOk.value = ''
269
- }
270
-
271
- const tplForm = reactive({
272
- name: '', ch: '', code: '', unit: '', min: '' as number | '', max: '' as number | '',
273
- decimals: 1, icon: 'gateway' as DcwTemplateIcon, semantics: '',
274
- })
275
- const tplIcons: Array<{ key: DcwTemplateIcon, label: string }> = [
276
- { key: 'thermo', label: t('dcwDetail.k422b8126') },
277
- { key: 'pressure', label: t('dcwDetail.k3x6ff127') },
278
- { key: 'tension', label: t('dcwDetail.k3z9xc128') },
279
- { key: 'encoder', label: t('dcwDetail.kjb3vhs129') },
280
- { key: 'camera', label: t('dcwDetail.k47atw130') },
281
- { key: 'gateway', label: t('dcwDetail.k48c07131') },
282
- ]
283
-
284
- async function doCreateTemplate(): Promise<void> {
285
- tplSaving.value = true
286
- tplError.value = ''
287
- tplOk.value = ''
288
- try {
289
- if (!tplForm.name.trim()) throw new Error(t('dcwDetail.k6ugbw2132'))
290
- if (tplForm.unit.trim() === '') throw new Error(t('dcwDetail.kx3pg59133'))
291
- if (tplForm.min === '' || tplForm.max === '') throw new Error(t('dcwDetail.k13awowo134'))
292
- const tpl = await dcw.createTemplate({
293
- name: tplForm.name.trim(),
294
- ch: tplForm.ch.trim() || tplForm.name.trim(),
295
- code: tplForm.code.trim() || 'CUSTOM',
296
- unit: tplForm.unit.trim(),
297
- min: Number(tplForm.min),
298
- max: Number(tplForm.max),
299
- decimals: Number(tplForm.decimals) || 0,
300
- icon: tplForm.icon,
301
- semantics: tplForm.semantics.trim() || undefined,
302
- })
303
- // 新模板即刻可选:添加控制节点向导自动选中它,下拉随 store 响应式更新
304
- addTemplate.value = tpl.key
305
- tplOk.value = t('dcwDetail.ky4e1tr185', { p0: catalogTplName(t, tpl) })
306
- tplForm.name = ''
307
- tplForm.ch = ''
308
- tplForm.code = ''
309
- tplForm.unit = ''
310
- tplForm.min = ''
311
- tplForm.max = ''
312
- tplForm.semantics = ''
313
- }
314
- catch (err) {
315
- tplError.value = apiErrorMessage(err)
316
- }
317
- finally {
318
- tplSaving.value = false
319
- }
320
- }
321
-
322
- // ---------- 产线开跑/停止(逐产线) ----------
323
- const lineProductId = ref('')
324
- const lineRecipeId = ref('')
325
- const lineBusy = ref(false)
326
- const lineMsg = ref('')
327
- const lineErr = ref('')
328
-
329
- const lineRecipes = computed(() => lineRecipesAll.value.filter(r => r.productId === lineProductId.value))
330
-
331
- async function doLineStart(): Promise<void> {
332
- lineBusy.value = true
333
- lineMsg.value = ''
334
- lineErr.value = ''
335
- try {
336
- if (!lineRecipeId.value) {
337
- throw new Error(t('dcwDetail.k1b6qe0r135'))
338
- }
339
- await dcw.startLine(lineId.value, lineRecipeId.value)
340
- lineMsg.value = t('dcwDetail.k17jteb9186', { p0: ls.value.productName, p1: ls.value.recipeName, p2: ls.value.runId })
341
- }
342
- catch (err) {
343
- lineErr.value = apiErrorMessage(err)
344
- }
345
- finally {
346
- lineBusy.value = false
347
- }
348
- }
349
-
350
- async function doLineStop(): Promise<void> {
351
- lineBusy.value = true
352
- lineMsg.value = ''
353
- lineErr.value = ''
354
- try {
355
- const was = `${ls.value.productName ?? ''} · ${ls.value.recipeName ?? ''}`
356
- await dcw.stopLine(lineId.value)
357
- lineMsg.value = t('dcwDetail.kzl49pd187', { p0: was })
358
- }
359
- catch (err) {
360
- lineErr.value = apiErrorMessage(err)
361
- }
362
- finally {
363
- lineBusy.value = false
364
- }
365
- }
366
-
367
- // ---------- 产品管理 ----------
368
- const productOpen = ref(false)
369
- const productSaving = ref(false)
370
- const productError = ref('')
371
- const productForm = reactive({ name: '', description: '' })
372
- const filterProductId = ref('')
373
-
374
- async function doCreateProduct(): Promise<void> {
375
- productSaving.value = true
376
- productError.value = ''
377
- try {
378
- const p = await dcw.createProduct({ name: productForm.name.trim(), description: productForm.description.trim(), lineId: lineId.value })
379
- lineProductId.value = p.id
380
- filterProductId.value = p.id
381
- productOpen.value = false
382
- productForm.name = ''
383
- productForm.description = ''
384
- }
385
- catch (err) {
386
- productError.value = apiErrorMessage(err)
387
- }
388
- finally {
389
- productSaving.value = false
390
- }
391
- }
392
-
393
- const visibleRecipes = computed(() =>
394
- filterProductId.value
395
- ? lineRecipesAll.value.filter(r => r.productId === filterProductId.value)
396
- : lineRecipesAll.value,
397
- )
398
- const productName = (id: string): string => dcw.products.find(p => p.id === id)?.name ?? id
399
-
400
- // ---------- 配方参数节点失效态(已删除/已停用/已取消绑定;灰化 + 徽标) ----------
401
- interface StaleRef { code: 'deleted' | 'disabled' | 'unbound', label: string }
402
- function paramStatus(nodeId: string, lineId: string): StaleRef | null {
403
- const node = dcw.nodes.find(n => n.id === nodeId)
404
- if (!node) return { code: 'deleted', label: t('dcwDetail.staleDeleted') }
405
- if (!node.enabled) return { code: 'disabled', label: t('dcwDetail.staleDisabled') }
406
- if (lineId && node.lineId !== lineId) return { code: 'unbound', label: t('dcwDetail.staleUnbound') }
407
- return null
408
- }
409
- function paramNodeName(nodeId: string): string {
410
- return dcw.nodes.find(n => n.id === nodeId)?.name ?? nodeId
411
- }
412
- function daqWindowStatus(nodeId: string, lineId: string): StaleRef | null {
413
- const node = daq.nodes.find(n => n.id === nodeId)
414
- if (!node) return { code: 'deleted', label: t('dcwDetail.staleDeleted') }
415
- if (!node.enabled) return { code: 'disabled', label: t('dcwDetail.staleDisabled') }
416
- if (lineId && node.lineId !== lineId) return { code: 'unbound', label: t('dcwDetail.staleUnbound') }
417
- return null
418
- }
419
-
420
- // ---------- 配方版本历史(整体修改变更记录;来源=用户/Agent/系统 + 操作者 + 回退) ----------
421
- interface RecipeVersionRow {
422
- version: number
423
- at: string
424
- by?: string
425
- actorName?: string
426
- description?: string
427
- params: Array<{ nodeId: string, value: number, min?: number, max?: number }>
428
- current?: boolean
429
- }
430
- const verOpen = ref(false)
431
- const verRecipe = ref<RecipeView | null>(null)
432
- const verRows = ref<RecipeVersionRow[]>([])
433
- const verLoading = ref(false)
434
- const verMsg = ref('')
435
-
436
- async function openRecipeHistory(id: string): Promise<void> {
437
- verRecipe.value = dcw.recipes.find(r => r.id === id) ?? null
438
- verOpen.value = true
439
- verMsg.value = ''
440
- verLoading.value = true
441
- try {
442
- verRows.value = await dcw.recipeVersions(id)
443
- }
444
- catch (err) {
445
- verMsg.value = apiErrorMessage(err)
446
- }
447
- finally {
448
- verLoading.value = false
449
- }
450
- }
451
-
452
- const verSrcLabel = (by?: string): string => (by === 'agent' ? 'Agent' : by === 'system' ? t('dcwDetail.srcSystem') : t('dcwDetail.srcUser'))
453
-
454
- function verDiff(row: RecipeVersionRow, idx: number): string {
455
- if (idx === 0) return t('dcwDetail.histInit')
456
- const prev = verRows.value[idx - 1]!
457
- const changed = row.params
458
- .map(p => ({ p, old: prev.params.find(x => x.nodeId === p.nodeId) }))
459
- .filter(({ p, old }) => !old || old.value !== p.value)
460
- .map(({ p, old }) => `${dcw.nodes.find(n => n.id === p.nodeId)?.name ?? p.nodeId}: ${old?.value ?? t('dcwDetail.histAdded')} → ${p.value}`)
461
- return changed.length > 0 ? changed.join(';') : t('dcwDetail.histNoChange')
462
- }
463
-
464
- async function doRevert(version: number): Promise<void> {
465
- if (!verRecipe.value) return
466
- verMsg.value = ''
467
- try {
468
- const recipe = await dcw.revertRecipe(verRecipe.value.id, { version, reason: t('dcwDetail.revertReasonUi') })
469
- verMsg.value = t('dcwDetail.revertOk', { p0: recipe.version ?? 0 })
470
- verRows.value = await dcw.recipeVersions(verRecipe.value.id)
471
- }
472
- catch (err) {
473
- verMsg.value = apiErrorMessage(err)
474
- }
475
- }
476
-
477
- // ---------- 产线数据查询(产品/配方/参数/时间/间隔;限定本产线通道) ----------
478
- const query = reactive({
479
- productId: '',
480
- recipeId: '',
481
- paramKey: '',
482
- nodeId: '',
483
- lastMin: 30,
484
- bucketMs: 15000,
485
- })
486
- const queryResult = ref<LineQueryResult | null>(null)
487
- const queryBusy = ref(false)
488
- const queryError = ref('')
489
-
490
- async function doQuery(): Promise<void> {
491
- queryBusy.value = true
492
- queryError.value = ''
493
- queryResult.value = null
494
- try {
495
- queryResult.value = await dcw.queryLine({
496
- lineId: lineId.value,
497
- productId: query.productId || undefined,
498
- recipeId: query.recipeId || undefined,
499
- paramKey: query.paramKey || undefined,
500
- nodeId: query.nodeId || undefined,
501
- fromMs: Date.now() - query.lastMin * 60_000,
502
- toMs: Date.now(),
503
- bucketMs: query.bucketMs > 0 ? query.bucketMs : undefined,
504
- limit: 2000,
505
- })
506
- if (queryResult.value.channels.length === 0) queryError.value = t('dcwDetail.kszv5sq136')
507
- }
508
- catch (err) {
509
- queryError.value = apiErrorMessage(err)
510
- }
511
- finally {
512
- queryBusy.value = false
513
- }
514
- }
515
-
516
- /** 查询参数选项(DAQ 模板 key,含自定义) */
517
- const daqParamKeys = computed(() => dcw.templates.map(t => t.key))
518
-
519
- // ---------- Recipe 配方管理(参数节点级绑定) ----------
520
- const recipeOpen = ref(false)
521
- const recipeEditing = ref<string | null>(null)
522
- const recipeSaving = ref(false)
523
- const recipeError = ref('')
524
- const recipeStaleNote = ref('')
525
- const recipeForm = reactive({
526
- productId: '',
527
- name: '',
528
- description: '',
529
- params: [] as Array<{ nodeId: string, value: number | '', min: number | '', max: number | '' }>,
530
- daqWindows: [] as Array<{ nodeId: string, min: number | '', max: number | '' }>,
531
- })
532
- const applyResult = ref<{ runId: string, ok: number, total: number } | null>(null)
533
- const runDataView = ref<{ runId: string, data: RecipeRunData } | null>(null)
534
- const runDataLoading = ref(false)
535
-
536
- function openRecipeCreate(): void {
537
- recipeEditing.value = null
538
- recipeError.value = ''
539
- recipeForm.productId = filterProductId.value || lineProductId.value || lineProducts.value[0]?.id || ''
540
- recipeForm.name = ''
541
- recipeForm.description = ''
542
- recipeForm.params = [{ nodeId: lineNodes.value[0]?.id ?? '', value: '', min: '', max: '' }]
543
- recipeForm.daqWindows = []
544
- recipeOpen.value = true
545
- }
546
-
547
- function openRecipeEdit(id: string): void {
548
- const r = dcw.recipes.find(x => x.id === id)
549
- if (!r) return
550
- recipeEditing.value = id
551
- recipeError.value = ''
552
- // 失效参数自动清理:节点已删除的参数行直接剔除(保存会被后端归一化拒绝);
553
- // 停用/解绑节点参数保留可编辑,状态由 select 旁徽标标示
554
- const live = r.params.filter(p => dcw.nodes.some(n => n.id === p.nodeId))
555
- const dropped = r.params.length - live.length
556
- recipeStaleNote.value = dropped > 0 ? t('dcwDetail.staleDropped', { p0: dropped }) : ''
557
- recipeForm.productId = r.productId
558
- recipeForm.name = r.name
559
- recipeForm.description = r.description
560
- recipeForm.params = live.map(p => ({
561
- nodeId: p.nodeId,
562
- value: p.value,
563
- min: p.min ?? '',
564
- max: p.max ?? '',
565
- }))
566
- recipeForm.daqWindows = (r.daqWindows ?? []).map(w => ({
567
- nodeId: w.nodeId,
568
- min: w.min ?? '',
569
- max: w.max ?? '',
570
- }))
571
- recipeOpen.value = true
572
- }
573
-
574
- async function saveRecipe(): Promise<void> {
575
- recipeSaving.value = true
576
- recipeError.value = ''
577
- try {
578
- const input = {
579
- productId: recipeForm.productId,
580
- name: recipeForm.name.trim(),
581
- description: recipeForm.description.trim(),
582
- params: recipeForm.params
583
- .filter(p => p.nodeId && p.value !== '' && Number.isFinite(Number(p.value)))
584
- .map(p => ({
585
- nodeId: p.nodeId,
586
- value: Number(p.value),
587
- ...(p.min !== '' && Number.isFinite(Number(p.min)) ? { min: Number(p.min) } : {}),
588
- ...(p.max !== '' && Number.isFinite(Number(p.max)) ? { max: Number(p.max) } : {}),
589
- })),
590
- daqWindows: recipeForm.daqWindows
591
- .filter(w => w.nodeId && (w.min !== '' || w.max !== ''))
592
- .map(w => ({
593
- nodeId: w.nodeId,
594
- ...(w.min !== '' && Number.isFinite(Number(w.min)) ? { min: Number(w.min) } : {}),
595
- ...(w.max !== '' && Number.isFinite(Number(w.max)) ? { max: Number(w.max) } : {}),
596
- })),
597
- }
598
- if (recipeEditing.value) await dcw.updateRecipe(recipeEditing.value, input)
599
- else await dcw.createRecipe(input)
600
- recipeOpen.value = false
601
- }
602
- catch (err) {
603
- recipeError.value = apiErrorMessage(err)
604
- }
605
- finally {
606
- recipeSaving.value = false
607
- }
608
- }
609
-
610
- async function doApplyRecipe(id: string): Promise<void> {
611
- applyResult.value = null
612
- writeError.value = ''
613
- try {
614
- const run = await dcw.applyRecipe(id)
615
- const ok = run.results.filter(r => r.ok).length
616
- applyResult.value = { runId: run.id, ok, total: run.results.length }
617
- if (ok < run.results.length) writeError.value = t('dcwDetail.ks7szkt188', { p0: run.results.filter(r => !r.ok).map(r => r.message).join(';') })
618
- }
619
- catch (err) {
620
- writeError.value = apiErrorMessage(err)
621
- }
622
- }
623
-
624
- async function doViewRun(id: string): Promise<void> {
625
- runDataLoading.value = true
626
- try {
627
- const data = await dcw.runData(id)
628
- runDataView.value = { runId: id, data }
629
- }
630
- catch (err) {
631
- writeError.value = apiErrorMessage(err)
632
- }
633
- finally {
634
- runDataLoading.value = false
635
- }
636
- }
637
-
638
- /** 查询点位展示(原始值或桶均值) */
639
- function fmtPoint(p: { value?: number, avg?: number } | undefined): string {
640
- const v = p?.value ?? p?.avg
641
- return v == null ? '--' : String(Math.round(v * 1000) / 1000)
642
- }
643
- </script>
644
-
645
- <template>
646
- <div
647
- v-if="dcw.loaded && !line"
648
- class="page"
649
- >
650
- <p class="banner bad">
651
- {{ $t('dcwDetail.k19337yp018') }}
652
- </p>
653
- <NuxtLink
654
- class="pill-btn"
655
- to="/dcw"
656
- >
657
- {{ $t('dcwDetail.kllwu1c019') }}
658
- </NuxtLink>
659
- </div>
660
- <div
661
- v-else
662
- class="page"
663
- >
664
- <div class="aw-page-head">
665
- <div>
666
- <p class="aw-kicker">
667
- <span
668
- class="line-chip"
669
- :style="{ background: line?.color ?? '#3aa0ff' }"
670
- />AGENTWORKSHOP / LINE / {{ line?.name ?? lineId }}
671
- </p>
672
- <h1>{{ line?.name ?? $t('dcwDetail.k1b2snna151') }} · {{ $t('dcwDetail.k1l0iow1137') }}</h1>
673
- <p class="sub">
674
- {{ line?.description || $t('dcwDetail.kzcbfki152') }}
675
- </p>
676
- </div>
677
- <div class="badges mono">
678
- <span class="badge">{{ $t('dcwDetail.k45uio082') }} {{ lineNodes.length }}</span>
679
- <span class="badge">{{ $t('dcwDetail.k3waz1025') }} {{ lineProducts.length }}</span>
680
- <span class="badge">{{ $t('dcwDetail.k48grv027') }} {{ lineRecipesAll.length }}</span>
681
- </div>
682
- </div>
683
-
684
- <!-- 网关总控条 -->
685
- <section class="aw-tile ctrl-card">
686
- <div class="ctrl-left">
687
- <button
688
- class="aw-pill"
689
- :class="{ running: dcw.controller.running }"
690
- :title="$t('dcwDetail.k1snap154')"
691
- @click="dcw.startStop(dcw.controller.running ? 'pause' : 'resume')"
692
- >
693
- <span :class="dcw.controller.running ? 'i-tabler-player-pause' : 'i-tabler-player-play'" />
694
- {{ dcw.controller.running ? $t('dcwDetail.kplrsg153') : $t('dcwDetail.knxgni9169') }}
695
- </button>
696
- </div>
697
- <div class="ctrl-right">
698
- <span class="ctrl-metrics mono">
699
- <span>{{ $t('dcwDetail.k45uio082') }} {{ dcw.controller.nodesOnline }}/{{ dcw.controller.nodesTotal }}</span>
700
- <span class="sep">·</span>
701
- <span :title="$t('dcwDetail.kd3ygmn001')">{{ $t('dcwDetail.k3wtib138') }} {{ dcw.controller.writesTotal }}</span>
702
- <span class="sep">·</span>
703
- <span
704
- :class="{ warn: dcw.controller.writesFailed > 0 }"
705
- :title="$t('dcwDetail.kd3znl0002')"
706
- >{{ $t('dcwDetail.k3yit7139') }} {{ dcw.controller.writesFailed }}</span>
707
- </span>
708
- <button
709
- class="aw-pill outline"
710
- :title="$t('dcwDetail.kc4ixly003')"
711
- @click="openTplModal"
712
- >
713
- <span class="i-tabler-template" />
714
- {{ $t('dcwDetail.k1972dx9020') }}
715
- </button>
716
- <button
717
- class="aw-pill add-btn"
718
- @click="addOpen = true"
719
- >
720
- <span class="i-tabler-plus" />
721
- {{ $t('dcwDetail.k1976uns021') }}
722
- </button>
723
- </div>
724
- </section>
725
-
726
- <!-- 写错误/成功横幅 -->
727
- <p
728
- v-if="writeError || writeOk"
729
- class="banner"
730
- :class="writeError ? 'bad' : 'good'"
731
- >
732
- {{ writeError || writeOk }}
733
- </p>
734
-
735
- <!-- 未分配资产收编(历史节点/产品迁移到本产线) -->
736
- <section
737
- v-if="unassignedNodes.length || unassignedProducts.length"
738
- class="aw-tile adopt-card"
739
- >
740
- <b class="adopt-title">{{ $t('dcwDetail.kaebkky022') }}</b>
741
- <div class="adopt-list">
742
- <span
743
- v-for="n in unassignedNodes"
744
- :key="n.id"
745
- class="adopt-chip"
746
- >
747
- {{ n.name }}
748
- <button
749
- class="mini-btn"
750
- @click="adoptNode(n.id)"
751
- >
752
- {{ $t('dcwDetail.kyjp9fg023') }}
753
- </button>
754
- </span>
755
- <span
756
- v-for="p in unassignedProducts"
757
- :key="p.id"
758
- class="adopt-chip"
759
- >
760
- {{ p.name }}({{ $t('dcwDetail.k3km252140') }}<button
761
- class="mini-btn"
762
- @click="adoptProduct(p.id)"
763
- >
764
- {{ $t('dcwDetail.kyjp9fg023') }}
765
- </button>
766
- </span>
767
- </div>
768
- </section>
769
-
770
- <!-- 产线运行控制:开跑必设配方;窗口内数采逐样本打标 -->
771
- <section class="aw-tile line-card">
772
- <div class="line-status">
773
- <span
774
- class="line-dot"
775
- :class="{ on: ls.active }"
776
- />
777
- <div class="line-info">
778
- <b>{{ ls.active ? $t('dcwDetail.k1pxrhx0154') : $t('dcwDetail.k1b2hxmx170') }}</b>
779
- <small
780
- v-if="ls.active"
781
- class="mono dim"
782
- >{{ ls.productName }} · {{ ls.recipeName }} · {{ $t('dcwDetail.k400lb075') }} {{ ls.runId }} · {{ $t('dcwDetail.k3zkt2166') }} {{ ls.startedAt?.slice(11, 19) }} {{ $t('dcwDetail.k69vag8168') }} {{ ls.taggedSamples }} {{ $t('dcwDetail.k4118o085') }}</small>
783
- <small
784
- v-else
785
- class="dim"
786
- >{{ $t('dcwDetail.k19pof14024') }}</small>
787
- </div>
788
- </div>
789
- <div class="line-ctl">
790
- <label class="ctl-sel">
791
- <span>{{ $t('dcwDetail.k3waz1025') }}</span>
792
- <select
793
- v-model="lineProductId"
794
- class="inp"
795
- @change="lineRecipeId = ''"
796
- >
797
- <option value="">
798
- {{ $t('dcwDetail.kuisodh026') }}
799
- </option>
800
- <option
801
- v-for="p in lineProducts"
802
- :key="p.id"
803
- :value="p.id"
804
- >
805
- {{ p.name }}
806
- </option>
807
- </select>
808
- </label>
809
- <label class="ctl-sel">
810
- <span>{{ $t('dcwDetail.k48grv027') }}</span>
811
- <select
812
- v-model="lineRecipeId"
813
- class="inp"
814
- :disabled="!lineProductId"
815
- >
816
- <option value="">
817
- {{ $t('dcwDetail.kutxzsz028') }}
818
- </option>
819
- <option
820
- v-for="r in lineRecipes"
821
- :key="r.id"
822
- :value="r.id"
823
- :disabled="r.params.length === 0"
824
- >
825
- {{ r.name }}{{ r.params.length === 0 ? $t('dcwDetail.k1hicmch155') : $t('dcwDetail.k1lzfi4g180', { p0: r.params.length }) }}
826
- </option>
827
- </select>
828
- </label>
829
- <button
830
- v-if="!ls.active"
831
- class="pill-btn"
832
- :disabled="lineBusy || !lineRecipeId"
833
- :title="!lineRecipeId ? $t('dcwDetail.startNeedRecipe') : $t('dcwDetail.startTip')"
834
- @click="doLineStart"
835
- >
836
- {{ $t('dcwDetail.kfb8vml029') }}
837
- </button>
838
- <button
839
- v-else
840
- class="pill-btn stop"
841
- :disabled="lineBusy"
842
- @click="doLineStop"
843
- >
844
- {{ $t('dcwDetail.k1xyhd2y030') }}
845
- </button>
846
- </div>
847
- <p
848
- v-if="lineErr"
849
- class="banner bad"
850
- style="margin-top: 10px;"
851
- >
852
- {{ lineErr }}
853
- </p>
854
- <p
855
- v-if="lineMsg"
856
- class="banner good"
857
- style="margin-top: 10px;"
858
- >
859
- {{ lineMsg }}
860
- </p>
861
- </section>
862
-
863
- <!-- 添加控制节点模板(自定义创建) -->
864
- <div
865
- v-if="tplOpen"
866
- class="modal-mask"
867
- @click.self="tplOpen = false"
868
- >
869
- <div class="modal">
870
- <h3 class="m-title">
871
- {{ $t('dcwDetail.k1x4vam0031') }} <small class="dim mono">{{ $t('dcwDetail.k3x23c141') }} {{ dcw.templates.filter(t => t.builtin).length }} · {{ $t('dcwDetail.k3t616a142') }} {{ dcw.templates.filter(t => !t.builtin).length }}</small>
872
- </h3>
873
- <p class="dim tpl-hint">
874
- {{ $t('dcwDetail.ke1iyud032') }}
875
- </p>
876
-
877
- <div class="tpl-chips">
878
- <span
879
- v-for="tpl in dcw.templates"
880
- :key="tpl.key"
881
- class="tpl-chip"
882
- :title="`${tpl.code} · ${tpl.min}~${tpl.max} ${tpl.unit}${tpl.semantics ? ` · ${tpl.semantics}` : ''}`"
883
- >
884
- {{ catalogTplName(t, tpl) }} <small class="mono">{{ tpl.min }}~{{ tpl.max }}{{ tpl.unit }}</small>
885
- <em
886
- class="tpl-tag"
887
- :class="{ builtin: tpl.builtin }"
888
- >{{ tpl.builtin ? $t('dcwDetail.k3x23c141') : $t('dcwDetail.k3t616a142') }}</em>
889
- </span>
890
- </div>
891
-
892
- <p class="sec-label">
893
- {{ $t('dcwDetail.k169eb4s033') }}
894
- </p>
895
- <div class="f-grid tpl-form">
896
- <label class="f">
897
- <span>{{ $t('dcwDetail.k1f55q76034') }}<em>*</em></span>
898
- <input
899
- v-model="tplForm.name"
900
- class="inp"
901
- :placeholder="$t('dcwDetail.k1tooi3o004')"
902
- >
903
- </label>
904
- <label class="f">
905
- <span>{{ $t('dcwDetail.k1bqk219035') }}</span>
906
- <input
907
- v-model="tplForm.ch"
908
- class="inp"
909
- :placeholder="$t('dcwDetail.k698qz0005')"
910
- >
911
- </label>
912
- <label class="f">
913
- <span>{{ $t('dcwDetail.k1ayxrqb036') }}</span>
914
- <input
915
- v-model="tplForm.code"
916
- class="inp"
917
- :placeholder="$t('dcwDetail.codePh')"
918
- >
919
- </label>
920
- <label class="f">
921
- <span>{{ $t('dcwDetail.k3x4ef037') }}<em>*</em></span>
922
- <input
923
- v-model="tplForm.unit"
924
- class="inp"
925
- :placeholder="$t('dcwDetail.unitPh')"
926
- >
927
- </label>
928
- <label class="f">
929
- <span>{{ $t('dcwDetail.k1l9jv5m038') }}<em>*</em></span>
930
- <input
931
- v-model.number="tplForm.min"
932
- type="number"
933
- class="inp"
934
- :placeholder="$t('dcwDetail.kxz9174006')"
935
- >
936
- </label>
937
- <label class="f">
938
- <span>{{ $t('dcwDetail.k1l9jv4p039') }}<em>*</em></span>
939
- <input
940
- v-model.number="tplForm.max"
941
- type="number"
942
- class="inp"
943
- :placeholder="$t('dcwDetail.kxz9167007')"
944
- >
945
- </label>
946
- <label class="f">
947
- <span>{{ $t('dcwDetail.k3mxmcx040') }}</span>
948
- <input
949
- v-model.number="tplForm.decimals"
950
- type="number"
951
- min="0"
952
- max="4"
953
- class="inp"
954
- >
955
- </label>
956
- <label class="f">
957
- <span>{{ $t('dcwDetail.k3xx56041') }}</span>
958
- <select
959
- v-model="tplForm.icon"
960
- class="inp"
961
- >
962
- <option
963
- v-for="ic in tplIcons"
964
- :key="ic.key"
965
- :value="ic.key"
966
- >
967
- {{ ic.label }}
968
- </option>
969
- </select>
970
- </label>
971
- </div>
972
- <label class="f">
973
- <span>{{ $t('dcwDetail.knjmyfr042') }}</span>
974
- <textarea
975
- v-model="tplForm.semantics"
976
- class="inp"
977
- rows="2"
978
- :placeholder="$t('dcwDetail.k1qdnfzc008')"
979
- />
980
- </label>
981
-
982
- <p
983
- v-if="tplOk"
984
- class="banner good"
985
- style="margin-top: 10px;"
986
- >
987
- {{ tplOk }}
988
- </p>
989
- <p
990
- v-if="tplError"
991
- class="m-err"
992
- >
993
- {{ tplError }}
994
- </p>
995
- <div class="m-actions">
996
- <button
997
- class="aw-pill outline"
998
- @click="tplOpen = false"
999
- >
1000
- {{ $t('dcwDetail.k3x62t043') }}
1001
- </button>
1002
- <button
1003
- class="pill-btn"
1004
- :disabled="tplSaving || !tplForm.name.trim() || tplForm.unit.trim() === '' || tplForm.min === '' || tplForm.max === ''"
1005
- @click="doCreateTemplate"
1006
- >
1007
- {{ tplSaving ? $t('dcwDetail.k1bg4759156') : $t('dcwDetail.k1bg9nga171') }}
1008
- </button>
1009
- </div>
1010
- </div>
1011
- </div>
1012
-
1013
- <!-- 添加控制节点向导 -->
1014
- <div
1015
- v-if="addOpen"
1016
- class="modal-mask"
1017
- @click.self="addOpen = false"
1018
- >
1019
- <div class="modal">
1020
- <h3 class="m-title">
1021
- {{ $t('dcwDetail.k1976uns021') }}
1022
- </h3>
1023
-
1024
- <div class="seg-row">
1025
- <button
1026
- class="seg"
1027
- :class="{ on: addScenario === 'mock' }"
1028
- @click="addScenario = 'mock'"
1029
- >
1030
- {{ $t('dcwDetail.mockPlc') }}
1031
- </button>
1032
- <button
1033
- class="seg"
1034
- :class="{ on: addScenario === 'real' }"
1035
- @click="addScenario = 'real'"
1036
- >
1037
- {{ $t('dcwDetail.kyj8fen044') }}
1038
- </button>
1039
- </div>
1040
-
1041
- <div class="f-grid">
1042
- <label class="f">
1043
- <span>{{ $t('dcwDetail.k1ejzwqp045') }}</span>
1044
- <select
1045
- v-model="addTemplate"
1046
- class="inp"
1047
- >
1048
- <option
1049
- v-for="tpl in dcw.templates"
1050
- :key="tpl.key"
1051
- :value="tpl.key"
1052
- >
1053
- {{ catalogTplName(t, tpl) }} · {{ tpl.ch }}({{ tpl.min }}~{{ tpl.max }} {{ tpl.unit }}){{ tpl.builtin ? '' : $t('dcwDetail.kr45rk9157') }}
1054
- </option>
1055
- </select>
1056
- </label>
1057
- <label class="f">
1058
- <span>{{ $t('dcwDetail.k1ce2k1y046') }}</span>
1059
- <input
1060
- v-model="addName"
1061
- class="inp"
1062
- :placeholder="$t('dcwDetail.kgpxzy3009')"
1063
- >
1064
- </label>
1065
- <label class="f">
1066
- <span>{{ $t('dcwDetail.k1vyb8im047') }}</span>
1067
- <input
1068
- v-model.number="addHold"
1069
- type="number"
1070
- min="0"
1071
- max="3600000"
1072
- step="500"
1073
- class="inp"
1074
- :placeholder="$t('dcwDetail.kb1srz0010')"
1075
- >
1076
- </label>
1077
- <label class="f">
1078
- <span>{{ $t('dcwDetail.k9r7d4e016') }}</span>
1079
- <input
1080
- v-model.number="addRead"
1081
- type="number"
1082
- min="0"
1083
- max="3600000"
1084
- step="500"
1085
- class="inp"
1086
- :placeholder="$t('dcwDetail.k9r7d4e017')"
1087
- >
1088
- </label>
1089
- </div>
1090
-
1091
- <!-- 数据语义标定 encode(物理设定值 → PLC 设定值;mock/真实均可用) -->
1092
- <div class="f-grid cal-form">
1093
- <label class="f">
1094
- <span>{{ $t('dcwDetail.kiune1f048') }}</span>
1095
- <select
1096
- v-model="addTransform.kind"
1097
- class="inp"
1098
- >
1099
- <option value="none">
1100
- {{ $t('dcwDetail.kkzy0k049') }}
1101
- </option>
1102
- <option value="linear">
1103
- {{ $t('dcwDetail.linearCalOpt') }}
1104
- </option>
1105
- </select>
1106
- </label>
1107
- <label class="f">
1108
- <span>scale / offset</span>
1109
- <div style="display: flex; gap: 6px;">
1110
- <input
1111
- v-model.number="addTransform.scale"
1112
- type="number"
1113
- step="0.1"
1114
- class="inp"
1115
- :disabled="addTransform.kind !== 'linear'"
1116
- :title="$t('dcwDetail.calScaleTip')"
1117
- >
1118
- <input
1119
- v-model.number="addTransform.offset"
1120
- type="number"
1121
- step="0.1"
1122
- class="inp"
1123
- :disabled="addTransform.kind !== 'linear'"
1124
- :title="$t('dcwDetail.calOffsetTip')"
1125
- >
1126
- </div>
1127
- </label>
1128
- </div>
1129
-
1130
- <template v-if="addScenario === 'real'">
1131
- <div class="f-grid">
1132
- <label class="f">
1133
- <span>{{ $t('dcwDetail.k1kt87rx050') }}</span>
1134
- <select
1135
- v-model="addDriver"
1136
- class="inp"
1137
- >
1138
- <option
1139
- v-for="d in driverCatalog.filter(x => x.status !== 'builtin')"
1140
- :key="d.kind"
1141
- :value="d.kind"
1142
- >
1143
- {{ d.label }}{{ d.plugin ? ' ⌁' : '' }}
1144
- </option>
1145
- </select>
1146
- </label>
1147
- </div>
1148
- <div
1149
- v-if="addFields.length"
1150
- class="f-grid driver-form"
1151
- >
1152
- <label
1153
- v-for="f in addFields"
1154
- :key="f.key"
1155
- class="f"
1156
- >
1157
- <span>{{ f.label }}<em
1158
- v-if="f.required"
1159
- style="color: var(--tone-danger-dot); font-style: normal;"
1160
- >*</em></span>
1161
- <select
1162
- v-if="f.type === 'select'"
1163
- v-model="addCfg[f.key]"
1164
- class="inp"
1165
- >
1166
- <option
1167
- v-for="o in f.options"
1168
- :key="o.value"
1169
- :value="o.value"
1170
- >
1171
- {{ o.label }}
1172
- </option>
1173
- </select>
1174
- <input
1175
- v-else
1176
- v-model="addCfg[f.key]"
1177
- :type="f.type === 'number' ? 'number' : 'text'"
1178
- :placeholder="f.placeholder"
1179
- class="inp"
1180
- >
1181
- <small
1182
- v-if="f.hint"
1183
- class="hint"
1184
- >{{ f.hint }}</small>
1185
- </label>
1186
- </div>
1187
- <div class="test-row">
1188
- <button
1189
- class="pill-btn outline"
1190
- :disabled="addTesting"
1191
- @click="doTestConnection"
1192
- >
1193
- {{ addTesting ? $t('dcwDetail.k1fsh720158') : $t('dcwDetail.k1fstglk172') }}
1194
- </button>
1195
- <span
1196
- v-if="addTest"
1197
- class="test-result"
1198
- :class="addTest.ok ? 'good' : 'bad'"
1199
- >{{ addTest.ok ? '✓' : '✗' }} {{ addTest.message }}</span>
1200
- </div>
1201
- </template>
1202
-
1203
- <label class="f">
1204
- <span>{{ $t('dcwDetail.k1hgizn7051') }}</span>
1205
- <textarea
1206
- v-model="addSemantics"
1207
- class="inp"
1208
- rows="2"
1209
- :placeholder="$t('dcwDetail.k12bnyt9011')"
1210
- />
1211
- </label>
1212
-
1213
- <p
1214
- v-if="addError"
1215
- class="m-err"
1216
- >
1217
- {{ addError }}
1218
- </p>
1219
-
1220
- <div class="m-actions">
1221
- <button
1222
- class="aw-pill outline"
1223
- @click="addOpen = false"
1224
- >
1225
- {{ $t('dcwDetail.k3xdnn052') }}
1226
- </button>
1227
- <button
1228
- class="aw-pill"
1229
- :disabled="addSaving"
1230
- @click="doAddNode"
1231
- >
1232
- {{ addSaving ? $t('dcwDetail.k1bg4759156') : $t('dcwDetail.k1bge46t173') }}
1233
- </button>
1234
- </div>
1235
- </div>
1236
- </div>
1237
-
1238
- <!-- 控制节点清单 -->
1239
- <a-spin :spinning="!dcw.loaded && !dcw.error">
1240
- <section class="aw-tile table-card">
1241
- <table class="nodes-table">
1242
- <thead>
1243
- <tr>
1244
- <th>{{ $t('dcwDetail.k1e2dtkt053') }}</th>
1245
- <th>{{ $t('dcwDetail.k403cy054') }}</th>
1246
- <th>{{ $t('dcwDetail.k42w8s055') }}</th>
1247
- <th>{{ $t('dcwDetail.k1deqh0d056') }}</th>
1248
- <th>{{ $t('dcwDetail.k9r7d4e018') }}</th>
1249
- <th>{{ $t('dcwDetail.k1k79ec9057') }}</th>
1250
- <th>{{ $t('dcwDetail.k1dexou6058') }}</th>
1251
- <th>{{ $t('dcwDetail.k1b1nnaa059') }}</th>
1252
- <th>{{ $t('dcwDetail.k1i8rtqt060') }}</th>
1253
- <th class="right">
1254
- {{ $t('dcwDetail.k40aa6061') }}
1255
- </th>
1256
- </tr>
1257
- </thead>
1258
- <tbody>
1259
- <tr
1260
- v-for="n in lineNodes"
1261
- :key="n.id"
1262
- :class="{ 'node-paused': !n.enabled }"
1263
- >
1264
- <td>
1265
- <span class="mono dim">{{ n.id.slice(0, 8) }}</span>
1266
- <b>{{ n.name }}</b>
1267
- <small class="mono ch">{{ dcwTemplateRefCh(n.templateRef) }}</small>
1268
- </td>
1269
- <td>
1270
- <button
1271
- class="ctrl-toggle"
1272
- :class="{ on: n.enabled }"
1273
- :disabled="togglingId === n.id"
1274
- :title="n.enabled ? $t('dcwDetail.pauseCtrlTip') : $t('dcwDetail.enableCtrlTip')"
1275
- @click="toggleControl(n.id, !n.enabled)"
1276
- >
1277
- <span class="ct-dot" />
1278
- {{ n.enabled ? $t('dcwDetail.k3o3ib3159') : $t('dcwDetail.k3n93ed062') }}
1279
- </button>
1280
- </td>
1281
- <td>
1282
- <span
1283
- v-if="!n.enabled"
1284
- class="st-pill paused"
1285
- >{{ $t('dcwDetail.k3n93ed062') }}</span>
1286
- <span
1287
- v-else
1288
- class="st-pill"
1289
- :class="n.state"
1290
- >{{ stateLabel[n.state] ?? n.state }}</span>
1291
- </td>
1292
- <td class="mono val">
1293
- {{ n.value != null ? n.value.toFixed(n.decimals) : '--' }}
1294
- <small>{{ n.unit }}</small>
1295
- <small
1296
- v-if="n.lastAckAt"
1297
- class="dim"
1298
- > · {{ n.lastAckAt.slice(11, 19) }}</small>
1299
- </td>
1300
- <td class="mono val">
1301
- <span
1302
- :title="n.lastReadError ?? $t('dcwDetail.k9r7d4e019')"
1303
- :class="{ 'read-stale': n.lastReadError }"
1304
- >{{ n.readValue != null ? n.readValue.toFixed(n.decimals) : '--' }}</span>
1305
- <small>{{ n.unit }}</small>
1306
- <small
1307
- v-if="n.lastReadAt"
1308
- class="dim"
1309
- > · {{ n.lastReadAt.slice(11, 19) }}</small>
1310
- <button
1311
- class="mini-btn read-btn"
1312
- :disabled="readingId === n.id"
1313
- :title="$t('dcwDetail.k9r7d4e020')"
1314
- @click="doRead(n.id)"
1315
- >
1316
- {{ readingId === n.id ? '···' : $t('dcwDetail.k9r7d4e021') }}
1317
- </button>
1318
- </td>
1319
- <td>
1320
- <div class="write-row">
1321
- <input
1322
- v-model.number="setInputs[n.id]"
1323
- type="number"
1324
- class="inp write-inp mono"
1325
- :placeholder="`${n.min}~${n.max}`"
1326
- :min="n.min"
1327
- :max="n.max"
1328
- :step="10 ** -n.decimals"
1329
- :disabled="!n.enabled"
1330
- :title="!n.enabled ? $t('dcwDetail.pausedTip') : ''"
1331
- >
1332
- <button
1333
- class="mini-btn write-btn"
1334
- :disabled="!n.enabled || writingId === n.id || setInputs[n.id] == null || setInputs[n.id] === ''"
1335
- :title="!n.enabled ? $t('dcwDetail.pausedTip') : $t('dcwDetail.writeTip')"
1336
- @click="doWrite(n.id, Number(setInputs[n.id]))"
1337
- >
1338
- {{ writingId === n.id ? $t('dcwDetail.k3l3h80123') : $t('dcwDetail.k3w6td174') }}
1339
- </button>
1340
- </div>
1341
- </td>
1342
- <td class="mono dim">
1343
- {{ n.min }} ~ {{ n.max }} {{ n.unit }}
1344
- </td>
1345
- <td class="mono">
1346
- {{ n.holdIntervalMs == null ? $t('dcwDetail.k3zul4160') : `${n.holdIntervalMs}ms` }}
1347
- <small
1348
- class="dim"
1349
- :title="$t('dcwDetail.k9r7d4e016')"
1350
- >· {{ n.readIntervalMs === 0 ? $t('dcwDetail.k9r7d4e022') : (n.readIntervalMs == null ? $t('dcwDetail.k9r7d4e023') : `${n.readIntervalMs}ms`) }}</small>
1351
- </td>
1352
- <td>{{ nodeDeviceNames(n) }}</td>
1353
- <td class="right">
1354
- <button
1355
- class="mini-btn danger"
1356
- @click="dcw.removeNode(n.id)"
1357
- >
1358
- {{ $t('dcwDetail.k3xakp063') }}
1359
- </button>
1360
- </td>
1361
- </tr>
1362
- <tr v-if="dcw.loaded && lineNodes.length === 0">
1363
- <td colspan="9">
1364
- <div
1365
- class="pane-empty"
1366
- style="min-height: 120px;"
1367
- >
1368
- <p class="pe-sub">
1369
- {{ $t('dcwDetail.k1wtecyw064') }}
1370
- </p>
1371
- </div>
1372
- </td>
1373
- </tr>
1374
- </tbody>
1375
- </table>
1376
- </section>
1377
- </a-spin>
1378
-
1379
- <!-- 产品与配方管理 -->
1380
- <section class="aw-tile recipe-card">
1381
- <div class="recipe-hd">
1382
- <h3>{{ $t('dcwDetail.k1j8w3hd065') }}</h3>
1383
- <span class="panel-tag mono">{{ lineProducts.length }} {{ $t('dcwDetail.k1av3wgs143') }} {{ visibleRecipes.length }} {{ $t('dcwDetail.k48grv027') }}</span>
1384
- <button
1385
- class="pill-btn"
1386
- style="margin-left: auto;"
1387
- @click="openRecipeCreate"
1388
- >
1389
- {{ $t('dcwDetail.k1akm6dc066') }}
1390
- </button>
1391
- <button
1392
- class="mini-btn"
1393
- @click="productOpen = true"
1394
- >
1395
- {{ $t('dcwDetail.k1aka0ki067') }}
1396
- </button>
1397
- </div>
1398
- <p class="recipe-sub">
1399
- {{ $t('dcwDetail.k6bl2q8068') }}
1400
- </p>
1401
-
1402
- <!-- 产品管理行 -->
1403
- <div
1404
- v-if="lineProducts.length"
1405
- class="product-row"
1406
- >
1407
- <button
1408
- class="prod-chip"
1409
- :class="{ on: filterProductId === '' }"
1410
- @click="filterProductId = ''"
1411
- >
1412
- {{ $t('dcwDetail.k3x4t1069') }}
1413
- </button>
1414
- <button
1415
- v-for="p in lineProducts"
1416
- :key="p.id"
1417
- class="prod-chip"
1418
- :class="{ on: filterProductId === p.id }"
1419
- :title="p.description"
1420
- @click="filterProductId = p.id"
1421
- >
1422
- {{ p.name }}
1423
- <span
1424
- class="prod-del"
1425
- :title="$t('dcwDetail.k1bpfjgx012')"
1426
- @click.stop="dcw.removeProduct(p.id)"
1427
- >×</span>
1428
- </button>
1429
- </div>
1430
- <p
1431
- v-else
1432
- class="dim"
1433
- style="margin: 6px 0 12px; font-size: 12px;"
1434
- >
1435
- {{ $t('dcwDetail.knov3zg070') }}
1436
- </p>
1437
-
1438
- <div class="recipe-grid">
1439
- <div
1440
- v-for="r in visibleRecipes"
1441
- :key="r.id"
1442
- class="recipe-item"
1443
- >
1444
- <div class="recipe-name">
1445
- <b>{{ r.name }}</b>
1446
- <span
1447
- v-if="r.version"
1448
- class="param-chip mono"
1449
- :title="t('dcwDetail.histTitle')"
1450
- >v{{ r.version }}</span>
1451
- <small class="dim">{{ productName(r.productId) }}</small>
1452
- <small class="mono dim">{{ r.id }}</small>
1453
- </div>
1454
- <p
1455
- v-if="r.description"
1456
- class="dim desc"
1457
- >
1458
- {{ r.description }}
1459
- </p>
1460
- <div class="recipe-params mono">
1461
- <span
1462
- v-for="(p, i) in r.params"
1463
- :key="i"
1464
- class="param-chip"
1465
- :class="{ stale: paramStatus(p.nodeId, r.lineId) }"
1466
- :title="paramStatus(p.nodeId, r.lineId)?.label ?? ''"
1467
- >
1468
- {{ paramNodeName(p.nodeId) }} = {{ p.value }}<span
1469
- v-if="paramStatus(p.nodeId, r.lineId)"
1470
- class="chip-stale-tag"
1471
- >{{ paramStatus(p.nodeId, r.lineId)!.label }}</span>
1472
- </span>
1473
- <span
1474
- v-for="(w, i) in r.daqWindows"
1475
- :key="`w-${i}`"
1476
- class="param-chip daqwin"
1477
- :class="{ stale: daqWindowStatus(w.nodeId, r.lineId) }"
1478
- :title="daqWindowStatus(w.nodeId, r.lineId)?.label ?? $t('dcwDetail.k1l11api013')"
1479
- >
1480
- ◎ {{ daqNodeCh(w.nodeId) }} ∈ [{{ w.min ?? '-∞' }}, {{ w.max ?? '+∞' }}]<span
1481
- v-if="daqWindowStatus(w.nodeId, r.lineId)"
1482
- class="chip-stale-tag"
1483
- >{{ daqWindowStatus(w.nodeId, r.lineId)!.label }}</span>
1484
- </span>
1485
- </div>
1486
- <div class="recipe-actions">
1487
- <button
1488
- class="pill-btn"
1489
- @click="doApplyRecipe(r.id)"
1490
- >
1491
- {{ $t('dcwDetail.k1497qvr071') }}
1492
- </button>
1493
- <button
1494
- class="mini-btn"
1495
- @click="openRecipeEdit(r.id)"
1496
- >
1497
- {{ $t('dcwDetail.k45eb0072') }}
1498
- </button>
1499
- <button
1500
- class="mini-btn"
1501
- @click="openRecipeHistory(r.id)"
1502
- >
1503
- {{ t('dcwDetail.histBtn') }}<span
1504
- v-if="r.version"
1505
- class="mono"
1506
- >·v{{ r.version }}</span>
1507
- </button>
1508
- <button
1509
- class="mini-btn danger"
1510
- @click="dcw.removeRecipe(r.id)"
1511
- >
1512
- {{ $t('dcwDetail.k3xakp063') }}
1513
- </button>
1514
- </div>
1515
- </div>
1516
- <div
1517
- v-if="visibleRecipes.length === 0"
1518
- class="pane-empty"
1519
- style="grid-column: 1 / -1;"
1520
- >
1521
- {{ $t('dcwDetail.keko1xy073') }}
1522
- </div>
1523
- </div>
1524
-
1525
- <div
1526
- v-if="applyResult"
1527
- class="banner good"
1528
- >
1529
- {{ $t('dcwDetail.k1l3hrvp144') }} {{ applyResult.runId }} {{ $t('dcwDetail.k1g3lh2v167') }}{{ applyResult.ok }}/{{ applyResult.total }} {{ $t('dcwDetail.k1bqci06149') }}
1530
- <button
1531
- class="mini-btn"
1532
- style="margin-left: 10px;"
1533
- :disabled="runDataLoading"
1534
- @click="doViewRun(applyResult.runId)"
1535
- >
1536
- {{ runDataLoading ? $t('dcwDetail.k1br0ij9161') : $t('dcwDetail.kxwei5175') }}
1537
- </button>
1538
- </div>
1539
-
1540
- <!-- 批次列表 -->
1541
- <div
1542
- v-if="lineRuns.length"
1543
- class="runs"
1544
- >
1545
- <p class="sec-label">
1546
- {{ $t('dcwDetail.k1rjer8d074') }}
1547
- </p>
1548
- <table class="nodes-table">
1549
- <thead>
1550
- <tr>
1551
- <th>{{ $t('dcwDetail.k400lb075') }}</th>
1552
- <th>{{ $t('dcwDetail.k48grv027') }}</th>
1553
- <th>{{ $t('dcwDetail.k4497j076') }}</th>
1554
- <th>{{ $t('dcwDetail.k1bqhtmu077') }}</th>
1555
- <th class="right">
1556
- {{ $t('dcwDetail.k40aa6061') }}
1557
- </th>
1558
- </tr>
1559
- </thead>
1560
- <tbody>
1561
- <tr
1562
- v-for="run in [...lineRuns].reverse().slice(0, 8)"
1563
- :key="run.id"
1564
- >
1565
- <td class="mono">
1566
- {{ run.id }}
1567
- </td>
1568
- <td>{{ run.recipeName }}</td>
1569
- <td class="mono dim">
1570
- {{ run.startedAt.slice(5, 19) }} ~ {{ run.endedAt ? run.endedAt.slice(5, 19) : $t('dcwDetail.k3vpfg9162') }}
1571
- </td>
1572
- <td>
1573
- <span
1574
- class="st-pill"
1575
- :class="run.results.every(r => r.ok) ? 'ok' : 'warn'"
1576
- >{{ run.results.filter(r => r.ok).length }}/{{ run.results.length }}</span>
1577
- </td>
1578
- <td class="right">
1579
- <button
1580
- class="mini-btn"
1581
- :disabled="runDataLoading"
1582
- @click="doViewRun(run.id)"
1583
- >
1584
- {{ $t('dcwDetail.k1dzwrdp078') }}
1585
- </button>
1586
- <button
1587
- v-if="!run.endedAt"
1588
- class="mini-btn"
1589
- @click="dcw.closeRun(run.id)"
1590
- >
1591
- {{ $t('dcwDetail.k1blr7y7079') }}
1592
- </button>
1593
- </td>
1594
- </tr>
1595
- </tbody>
1596
- </table>
1597
- </div>
1598
-
1599
- <!-- 批次数据视图 -->
1600
- <div
1601
- v-if="runDataView"
1602
- class="modal-mask"
1603
- @click.self="runDataView = null"
1604
- >
1605
- <div class="modal">
1606
- <h3 class="m-title">
1607
- {{ $t('dcwDetail.k11lq94k145') }} {{ runDataView.data.run.recipeName }}({{ runDataView.runId }})
1608
- </h3>
1609
- <p class="sec-label">
1610
- {{ $t('dcwDetail.k1me41w8080') }}
1611
- </p>
1612
- <table class="nodes-table">
1613
- <thead>
1614
- <tr>
1615
- <th>{{ $t('dcwDetail.k48hde081') }}</th>
1616
- <th>{{ $t('dcwDetail.k45uio082') }}</th>
1617
- <th>{{ $t('dcwDetail.k40t11083') }}</th>
1618
- <th>{{ $t('dcwDetail.k3xuaw084') }}</th>
1619
- <th>min ~ max</th>
1620
- <th>{{ $t('dcwDetail.k4118o085') }}</th>
1621
- </tr>
1622
- </thead>
1623
- <tbody>
1624
- <tr
1625
- v-for="d in runDataView.data.daq"
1626
- :key="d.nodeId"
1627
- >
1628
- <td>{{ d.ch }}<small class="mono dim"> {{ d.unit }}</small></td>
1629
- <td>{{ d.nodeName }}</td>
1630
- <td class="mono">
1631
- {{ d.latest }}
1632
- </td>
1633
- <td class="mono">
1634
- {{ d.avg }}
1635
- </td>
1636
- <td class="mono dim">
1637
- {{ d.min }} ~ {{ d.max }}
1638
- </td>
1639
- <td class="mono dim">
1640
- {{ d.cnt }}
1641
- </td>
1642
- </tr>
1643
- <tr v-if="runDataView.data.daq.length === 0">
1644
- <td
1645
- colspan="6"
1646
- class="dim"
1647
- style="text-align: center; padding: 12px;"
1648
- >
1649
- {{ $t('dcwDetail.kd457ry086') }}
1650
- </td>
1651
- </tr>
1652
- </tbody>
1653
- </table>
1654
- <p class="sec-label">
1655
- {{ $t('dcwDetail.k12b7cxs087') }}
1656
- </p>
1657
- <table class="nodes-table">
1658
- <thead>
1659
- <tr>
1660
- <th>{{ $t('dcwDetail.k3xbjr088') }}</th>
1661
- <th>{{ $t('dcwDetail.k45uio082') }}</th>
1662
- <th>{{ $t('dcwDetail.k3ncbsh089') }}</th>
1663
- <th>{{ $t('dcwDetail.k3lh3mz090') }}</th>
1664
- <th>{{ $t('dcwDetail.k454pg091') }}</th>
1665
- <th>{{ $t('dcwDetail.k40ieu092') }}</th>
1666
- </tr>
1667
- </thead>
1668
- <tbody>
1669
- <tr
1670
- v-for="(w, i) in runDataView.data.writes"
1671
- :key="i"
1672
- >
1673
- <td>{{ w.param }}</td>
1674
- <td>{{ w.nodeName }}</td>
1675
- <td class="mono">
1676
- {{ w.eng }}
1677
- </td>
1678
- <td class="mono dim">
1679
- {{ w.raw }}
1680
- </td>
1681
- <td>
1682
- <span
1683
- class="st-pill"
1684
- :class="w.ok ? 'ok' : 'alarm'"
1685
- >{{ w.ok ? 'ACK' : $t('dcwDetail.k3yit7139') }}</span>
1686
- </td>
1687
- <td class="mono dim">
1688
- {{ w.at.slice(5, 19) }}
1689
- </td>
1690
- </tr>
1691
- <tr v-if="runDataView.data.writes.length === 0">
1692
- <td
1693
- colspan="6"
1694
- class="dim"
1695
- style="text-align: center; padding: 12px;"
1696
- >
1697
- {{ $t('dcwDetail.knzcp8i093') }}
1698
- </td>
1699
- </tr>
1700
- </tbody>
1701
- </table>
1702
- <div class="m-actions">
1703
- <button
1704
- class="aw-pill outline"
1705
- @click="runDataView = null"
1706
- >
1707
- {{ $t('dcwDetail.k3x62t043') }}
1708
- </button>
1709
- </div>
1710
- </div>
1711
- </div>
1712
- </section>
1713
-
1714
- <!-- 配方编辑弹窗 -->
1715
- <div
1716
- v-if="recipeOpen"
1717
- class="modal-mask"
1718
- @click.self="recipeOpen = false"
1719
- >
1720
- <div class="modal">
1721
- <h3 class="m-title">
1722
- {{ recipeEditing ? $t('dcwDetail.k1iiwk0i163') : $t('dcwDetail.k1efq0r9176') }}
1723
- </h3>
1724
- <div class="f-grid">
1725
- <label class="f">
1726
- <span>{{ $t('dcwDetail.k1dw4fzf094') }}<em>*</em></span>
1727
- <select
1728
- v-model="recipeForm.productId"
1729
- class="inp"
1730
- >
1731
- <option
1732
- v-for="p in lineProducts"
1733
- :key="p.id"
1734
- :value="p.id"
1735
- >
1736
- {{ p.name }}
1737
- </option>
1738
- </select>
1739
- </label>
1740
- <label class="f">
1741
- <span>{{ $t('dcwDetail.k1l3f8so095') }}<em>*</em></span>
1742
- <input
1743
- v-model="recipeForm.name"
1744
- class="inp"
1745
- :placeholder="$t('dcwDetail.k12c11vm014')"
1746
- >
1747
- </label>
1748
- <label class="f">
1749
- <span>{{ $t('dcwDetail.k40gkk096') }}</span>
1750
- <input
1751
- v-model="recipeForm.description"
1752
- class="inp"
1753
- :placeholder="$t('dcwDetail.k1hxx8hy015')"
1754
- >
1755
- </label>
1756
- </div>
1757
- <p class="sec-label">
1758
- {{ $t('dcwDetail.ka1kfgh097') }}
1759
- </p>
1760
- <div
1761
- v-for="(p, i) in recipeForm.params"
1762
- :key="i"
1763
- class="param-row"
1764
- >
1765
- <label class="f">
1766
- <span>{{ $t('dcwDetail.k1e2dtkt053') }}</span>
1767
- <select
1768
- v-model="p.nodeId"
1769
- class="inp"
1770
- >
1771
- <option
1772
- v-for="n in lineNodes"
1773
- :key="n.id"
1774
- :value="n.id"
1775
- >
1776
- {{ n.name }}({{ dcwTemplateRefCh(n.templateRef) }} · {{ n.min }}~{{ n.max }} {{ n.unit }})
1777
- </option>
1778
- </select>
1779
- <span
1780
- v-if="paramStatus(p.nodeId, lineId)"
1781
- class="row-stale"
1782
- >{{ paramStatus(p.nodeId, lineId)!.label }}</span>
1783
- </label>
1784
- <label class="f">
1785
- <span>{{ $t('dcwDetail.k3renp2098') }}<em>*</em></span>
1786
- <input
1787
- v-model.number="p.value"
1788
- type="number"
1789
- class="inp"
1790
- :step="0.1"
1791
- >
1792
- </label>
1793
- <label class="f">
1794
- <span>{{ $t('dcwDetail.k134rw3b146') }}{{ nodeMin(p.nodeId) ?? '-' }})</span>
1795
- <input
1796
- v-model.number="p.min"
1797
- type="number"
1798
- class="inp"
1799
- :step="0.1"
1800
- :placeholder="$t('dcwDetail.k5vew9z016')"
1801
- >
1802
- </label>
1803
- <label class="f">
1804
- <span>{{ $t('dcwDetail.khrv911147') }}{{ nodeMax(p.nodeId) ?? '-' }})</span>
1805
- <input
1806
- v-model.number="p.max"
1807
- type="number"
1808
- class="inp"
1809
- :step="0.1"
1810
- :placeholder="$t('dcwDetail.kzoh5pr017')"
1811
- >
1812
- </label>
1813
- <button
1814
- class="mini-btn danger param-del"
1815
- @click="recipeForm.params.splice(i, 1)"
1816
- >
1817
- {{ $t('dcwDetail.k44idg099') }}
1818
- </button>
1819
- </div>
1820
- <button
1821
- class="mini-btn"
1822
- @click="recipeForm.params.push({ nodeId: lineNodes[0]?.id ?? '', value: '', min: '', max: '' })"
1823
- >
1824
- {{ $t('dcwDetail.k1broh7h100') }}
1825
- </button>
1826
- <p class="sec-label">
1827
- {{ $t('dcwDetail.k1h5gues101') }}
1828
- </p>
1829
- <div
1830
- v-for="(w, i) in recipeForm.daqWindows"
1831
- :key="`dw-${i}`"
1832
- class="param-row"
1833
- >
1834
- <label class="f">
1835
- <span>{{ $t('dcwDetail.k1empnnb102') }}</span>
1836
- <select
1837
- v-model="w.nodeId"
1838
- class="inp"
1839
- >
1840
- <option
1841
- v-for="n in lineDaqNodes"
1842
- :key="n.id"
1843
- :value="n.id"
1844
- >
1845
- {{ n.name }}({{ n.min }}~{{ n.max }} {{ n.unit }})
1846
- </option>
1847
- </select>
1848
- </label>
1849
- <label class="f">
1850
- <span>{{ $t('dcwDetail.kqm08ap103') }}</span>
1851
- <input
1852
- v-model.number="w.min"
1853
- type="number"
1854
- class="inp"
1855
- :step="0.1"
1856
- >
1857
- </label>
1858
- <label class="f">
1859
- <span>{{ $t('dcwDetail.kpypf8g104') }}</span>
1860
- <input
1861
- v-model.number="w.max"
1862
- type="number"
1863
- class="inp"
1864
- :step="0.1"
1865
- >
1866
- </label>
1867
- <button
1868
- class="mini-btn danger param-del"
1869
- @click="recipeForm.daqWindows.splice(i, 1)"
1870
- >
1871
- {{ $t('dcwDetail.k44idg099') }}
1872
- </button>
1873
- </div>
1874
- <button
1875
- class="mini-btn"
1876
- :disabled="lineDaqNodes.length === 0"
1877
- :title="lineDaqNodes.length === 0 ? $t('dcwDetail.noDaqTip') : ''"
1878
- @click="recipeForm.daqWindows.push({ nodeId: lineDaqNodes[0]?.id ?? '', min: '', max: '' })"
1879
- >
1880
- {{ $t('dcwDetail.kv1de1p105') }}
1881
- </button>
1882
- <p
1883
- v-if="recipeStaleNote"
1884
- class="m-note"
1885
- >
1886
- {{ recipeStaleNote }}
1887
- </p>
1888
- <p
1889
- v-if="recipeError"
1890
- class="m-err"
1891
- >
1892
- {{ recipeError }}
1893
- </p>
1894
- <div class="m-actions">
1895
- <button
1896
- class="aw-pill outline"
1897
- @click="recipeOpen = false"
1898
- >
1899
- {{ $t('dcwDetail.k3xdnn052') }}
1900
- </button>
1901
- <button
1902
- class="pill-btn"
1903
- :disabled="recipeSaving"
1904
- @click="saveRecipe"
1905
- >
1906
- {{ recipeSaving ? $t('dcwDetail.k1b38d59164') : $t('dcwDetail.k1b3kwg0177') }}
1907
- </button>
1908
- </div>
1909
- </div>
1910
- </div>
1911
-
1912
- <!-- 配方版本历史(整体修改变更记录:来源/操作者/原因/参数 diff + 回退) -->
1913
- <div
1914
- v-if="verOpen"
1915
- class="modal-mask"
1916
- @click.self="verOpen = false"
1917
- >
1918
- <div
1919
- class="modal"
1920
- style="max-width: 760px;"
1921
- >
1922
- <div class="modal-head">
1923
- <h3>
1924
- {{ t('dcwDetail.histTitle') }}<span
1925
- v-if="verRecipe"
1926
- class="dim"
1927
- style="margin-left: 8px; font-size: 12px;"
1928
- >{{ verRecipe.name }} · v{{ verRecipe.version }}</span>
1929
- </h3>
1930
- <button
1931
- class="mini-btn"
1932
- @click="verOpen = false"
1933
- >
1934
- ✕
1935
- </button>
1936
- </div>
1937
- <p
1938
- v-if="verMsg"
1939
- class="banner good"
1940
- style="margin: 6px 0;"
1941
- >
1942
- {{ verMsg }}
1943
- </p>
1944
- <p
1945
- v-if="verLoading"
1946
- class="dim"
1947
- >
1948
- {{ t('dcwDetail.histLoading') }}
1949
- </p>
1950
- <div
1951
- v-else-if="verRows.length === 0"
1952
- class="pane-empty"
1953
- >
1954
- {{ t('dcwDetail.histEmpty') }}
1955
- </div>
1956
- <div
1957
- v-for="(row, i) in verRows"
1958
- v-else
1959
- :key="row.version"
1960
- class="ver-row"
1961
- :class="{ cur: row.current }"
1962
- >
1963
- <div class="ver-head">
1964
- <span class="mono ver-v">v{{ row.version }}</span>
1965
- <span
1966
- class="ver-src"
1967
- :class="row.by ?? (row.current ? 'cur' : '')"
1968
- >{{ row.current ? t('dcwDetail.histCurrent') : verSrcLabel(row.by) }}</span>
1969
- <span class="mono dim">{{ row.at.slice(0, 19).replace('T', ' ') }}</span>
1970
- <span class="ver-actor">{{ row.actorName || '—' }}</span>
1971
- <button
1972
- v-if="!row.current"
1973
- class="mini-btn"
1974
- @click="doRevert(row.version)"
1975
- >
1976
- {{ t('dcwDetail.revertTo') }}
1977
- </button>
1978
- </div>
1979
- <p
1980
- v-if="row.description"
1981
- class="ver-desc"
1982
- >
1983
- {{ row.description }}
1984
- </p>
1985
- <p class="ver-diff mono">
1986
- {{ verDiff(row, i) }}
1987
- </p>
1988
- </div>
1989
- </div>
1990
- </div>
1991
-
1992
- <!-- 产线数据查询(产品/配方/参数/时间/间隔) -->
1993
- <section class="aw-tile query-card">
1994
- <p class="sec-label">
1995
- {{ $t('dcwDetail.k1us3jse106') }}
1996
- </p>
1997
- <div class="q-grid">
1998
- <label class="f">
1999
- <span>{{ $t('dcwDetail.k3waz1025') }}</span>
2000
- <select
2001
- v-model="query.productId"
2002
- class="inp"
2003
- @change="query.recipeId = ''"
2004
- >
2005
- <option value="">
2006
- {{ $t('dcwDetail.k1bkl1jx107') }}
2007
- </option>
2008
- <option
2009
- v-for="p in lineProducts"
2010
- :key="p.id"
2011
- :value="p.id"
2012
- >
2013
- {{ p.name }}
2014
- </option>
2015
- </select>
2016
- </label>
2017
- <label class="f">
2018
- <span>{{ $t('dcwDetail.k48grv027') }}</span>
2019
- <select
2020
- v-model="query.recipeId"
2021
- class="inp"
2022
- :disabled="!query.productId"
2023
- >
2024
- <option value="">
2025
- {{ $t('dcwDetail.k1bkx7cr108') }}
2026
- </option>
2027
- <option
2028
- v-for="r in visibleRecipes"
2029
- :key="r.id"
2030
- :value="r.id"
2031
- >
2032
- {{ r.name }}
2033
- </option>
2034
- </select>
2035
- </label>
2036
- <label class="f">
2037
- <span>{{ $t('dcwDetail.k1demcae109') }}</span>
2038
- <select
2039
- v-model="query.paramKey"
2040
- class="inp"
2041
- >
2042
- <option value="">
2043
- {{ $t('dcwDetail.k1bkx7ya110') }}
2044
- </option>
2045
- <option
2046
- v-for="k in daqParamKeys"
2047
- :key="k"
2048
- :value="k"
2049
- >
2050
- {{ k }}
2051
- </option>
2052
- </select>
2053
- </label>
2054
- <label class="f">
2055
- <span>{{ $t('dcwDetail.k45uio082') }}</span>
2056
- <select
2057
- v-model="query.nodeId"
2058
- class="inp"
2059
- >
2060
- <option value="">
2061
- {{ $t('dcwDetail.k1bkul3k111') }}
2062
- </option>
2063
- <option
2064
- v-for="n in lineDaqNodes"
2065
- :key="n.id"
2066
- :value="n.id"
2067
- >
2068
- {{ n.name }}
2069
- </option>
2070
- </select>
2071
- </label>
2072
- <label class="f">
2073
- <span>{{ $t('dcwDetail.kx2ojn0112') }}</span>
2074
- <input
2075
- v-model.number="query.lastMin"
2076
- type="number"
2077
- min="1"
2078
- max="10080"
2079
- class="inp"
2080
- >
2081
- </label>
2082
- <label class="f">
2083
- <span>{{ $t('dcwDetail.kjvnvn4113') }}</span>
2084
- <input
2085
- v-model.number="query.bucketMs"
2086
- type="number"
2087
- min="1000"
2088
- step="500"
2089
- class="inp"
2090
- >
2091
- </label>
2092
- <div class="f q-actions">
2093
- <button
2094
- class="pill-btn"
2095
- :disabled="queryBusy"
2096
- @click="doQuery"
2097
- >
2098
- {{ queryBusy ? $t('dcwDetail.k1eyx09r165') : $t('dcwDetail.k416ek178') }}
2099
- </button>
2100
- </div>
2101
- </div>
2102
- <p
2103
- v-if="queryError"
2104
- class="banner bad"
2105
- style="margin-top: 8px;"
2106
- >
2107
- {{ queryError }}
2108
- </p>
2109
- <div
2110
- v-if="queryResult"
2111
- class="q-result"
2112
- >
2113
- <table class="nodes-table">
2114
- <thead>
2115
- <tr>
2116
- <th>{{ $t('dcwDetail.k48hde081') }}</th>
2117
- <th>{{ $t('dcwDetail.k45uio082') }}</th>
2118
- <th>{{ $t('dcwDetail.k42kcu114') }}</th>
2119
- <th>{{ $t('dcwDetail.k49ujb115') }}</th>
2120
- <th>{{ $t('dcwDetail.k40pvw116') }}</th>
2121
- <th>{{ $t('dcwDetail.k3xho3117') }}</th>
2122
- </tr>
2123
- </thead>
2124
- <tbody>
2125
- <tr
2126
- v-for="c in queryResult.channels"
2127
- :key="c.nodeId"
2128
- >
2129
- <td>{{ c.ch }}<small class="mono dim"> {{ c.unit }}</small></td>
2130
- <td>{{ c.nodeName }}</td>
2131
- <td class="mono">
2132
- {{ c.points.length }}
2133
- </td>
2134
- <td class="mono">
2135
- {{ fmtPoint(c.points[0]) }}
2136
- </td>
2137
- <td class="mono">
2138
- {{ fmtPoint(c.points[c.points.length - 1]) }}
2139
- </td>
2140
- <td class="mono dim">
2141
- {{ new Date(c.points[0]?.at ?? 0).toLocaleTimeString() }} ~ {{ new Date(c.points[c.points.length - 1]?.at ?? 0).toLocaleTimeString() }}
2142
- </td>
2143
- </tr>
2144
- </tbody>
2145
- </table>
2146
- </div>
2147
- </section>
2148
-
2149
- <!-- 写历史 -->
2150
- <section
2151
- v-if="lineHistory.length"
2152
- class="aw-tile table-card"
2153
- >
2154
- <p class="sec-label">
2155
- {{ $t('dcwDetail.kw7ym9b148') }} {{ lineHistory.length }} {{ $t('dcwDetail.k40bfz150') }}
2156
- </p>
2157
- <table class="nodes-table">
2158
- <tbody>
2159
- <tr
2160
- v-for="h in lineHistory.slice(0, 12)"
2161
- :key="h.id"
2162
- >
2163
- <td class="mono dim">
2164
- {{ h.at.slice(5, 19) }}
2165
- </td>
2166
- <td>{{ h.param }}</td>
2167
- <td>{{ h.nodeName }}</td>
2168
- <td class="mono">
2169
- {{ h.eng }}
2170
- </td>
2171
- <td class="mono dim">
2172
- raw {{ h.raw ?? '-' }}
2173
- </td>
2174
- <td>
2175
- <span
2176
- class="st-pill"
2177
- :class="h.ok ? 'ok' : 'alarm'"
2178
- >{{ h.ok ? 'ACK' : $t('dcwDetail.k3yit7139') }}</span>
2179
- </td>
2180
- <td class="dim">
2181
- {{ h.recipeRunId ? $t('dcwDetail.k6vgks7181', { p0: h.recipeRunId }) : $t('dcwDetail.manualTag') }}
2182
- </td>
2183
- </tr>
2184
- </tbody>
2185
- </table>
2186
- </section>
2187
-
2188
- <!-- 新建产品弹窗 -->
2189
- <div
2190
- v-if="productOpen"
2191
- class="modal-mask"
2192
- @click.self="productOpen = false"
2193
- >
2194
- <div class="modal">
2195
- <h3 class="m-title">
2196
- {{ $t('dcwDetail.k1efduyf118') }}
2197
- </h3>
2198
- <div class="f-grid">
2199
- <label class="f">
2200
- <span>{{ $t('dcwDetail.k1avjrl6119') }}<em>*</em></span>
2201
- <input
2202
- v-model="productForm.name"
2203
- class="inp"
2204
- :placeholder="$t('dcwDetail.k12c11vm014')"
2205
- >
2206
- </label>
2207
- <label class="f">
2208
- <span>{{ $t('dcwDetail.k40gkk096') }}</span>
2209
- <input
2210
- v-model="productForm.description"
2211
- class="inp"
2212
- :placeholder="$t('dcwDetail.k1hxx8hy015')"
2213
- >
2214
- </label>
2215
- </div>
2216
- <p
2217
- v-if="productError"
2218
- class="m-err"
2219
- >
2220
- {{ productError }}
2221
- </p>
2222
- <div class="m-actions">
2223
- <button
2224
- class="aw-pill outline"
2225
- @click="productOpen = false"
2226
- >
2227
- {{ $t('dcwDetail.k3xdnn052') }}
2228
- </button>
2229
- <button
2230
- class="pill-btn"
2231
- :disabled="productSaving"
2232
- @click="doCreateProduct"
2233
- >
2234
- {{ productSaving ? $t('dcwDetail.k1bg4759156') : $t('dcwDetail.k1bg4kn6179') }}
2235
- </button>
2236
- </div>
2237
- </div>
2238
- </div>
2239
-
2240
- <p
2241
- v-if="dcw.error"
2242
- class="err"
2243
- >
2244
- {{ dcw.error }}(<NuxtLink to="/workshop">{{ $t('dcwDetail.k1bhhheq120') }}</NuxtLink>)
2245
- </p>
2246
-
2247
- <!-- 参数台账(调控闭环:当前值/配方目标/lastGood 三值对照 + 设定历史 + 优化记录) -->
2248
- <section class="aw-tile ledger-card">
2249
- <div class="ledger-head">
2250
- <b>{{ $t('dcwDetail.k1ledgt001') }}</b>
2251
- <select
2252
- v-model="ledgerNodeId"
2253
- class="inp"
2254
- @change="loadLedger"
2255
- >
2256
- <option value="">
2257
- {{ $t('dcwDetail.k1ledgs001') }}
2258
- </option>
2259
- <option
2260
- v-for="n in lineNodes"
2261
- :key="n.id"
2262
- :value="n.id"
2263
- >
2264
- {{ n.name }}
2265
- </option>
2266
- </select>
2267
- </div>
2268
- <template v-if="ledger">
2269
- <div class="ledger-tri">
2270
- <div class="tri-cell">
2271
- <small>{{ $t('dcwDetail.k1ledgv001') }}</small>
2272
- <b class="mono">{{ ledger.current ?? '--' }}</b>
2273
- </div>
2274
- <div class="tri-cell">
2275
- <small>{{ $t('dcwDetail.k1ledgv002') }}</small>
2276
- <b class="mono">{{ ledger.recipeTarget ?? '--' }}</b>
2277
- </div>
2278
- <div class="tri-cell">
2279
- <small>{{ $t('dcwDetail.k1ledgv003') }}</small>
2280
- <b class="mono">{{ ledger.lastGood ?? '--' }}</b>
2281
- </div>
2282
- <button
2283
- class="mini-btn"
2284
- @click="loadLedger"
2285
- >
2286
- {{ $t('dcwDetail.k1ledga001') }}
2287
- </button>
2288
- <button
2289
- class="mini-btn danger"
2290
- @click="rollbackLedgerNode"
2291
- >
2292
- {{ $t('dcwDetail.k1ledga002') }}
2293
- </button>
2294
- </div>
2295
- <div class="ledger-cols">
2296
- <div class="ledger-col">
2297
- <small class="sec-t">{{ $t('dcwDetail.k1ledgh001') }}</small>
2298
- <ul class="ledger-list mono">
2299
- <li
2300
- v-for="a in ledger.journal"
2301
- :key="a.id"
2302
- >
2303
- {{ a.at.slice(5, 16).replace('T', ' ') }} [{{ a.source }}] {{ a.prevValue ?? '?' }} → {{ a.newValue }}
2304
- </li>
2305
- </ul>
2306
- </div>
2307
- <div class="ledger-col">
2308
- <small class="sec-t">{{ $t('dcwDetail.k1ledgr001') }}</small>
2309
- <ul class="ledger-list">
2310
- <li
2311
- v-for="r in ledger.records"
2312
- :key="r.id"
2313
- class="ledger-rec"
2314
- >
2315
- <span
2316
- class="rec-st"
2317
- :class="r.status"
2318
- >{{ r.status }}</span>
2319
- <span class="mono">{{ r.params[0]?.from ?? '?' }} → {{ r.params[0]?.to }}</span>
2320
- <small>{{ r.judge ? `${r.judge.verdict}(${r.judge.by})` : (r.status === 'open' ? 'open' : r.closedBy ?? '') }}</small>
2321
- </li>
2322
- </ul>
2323
- </div>
2324
- </div>
2325
- </template>
2326
- </section>
2327
- </div>
2328
- </template>
2329
-
2330
- <style scoped>
2331
- .line-chip {
2332
- display: inline-block;
2333
- width: 10px;
2334
- height: 10px;
2335
- margin-right: 8px;
2336
- vertical-align: -1px;
2337
- border-radius: 3px;
2338
- box-shadow: 0 0 10px currentColor;
2339
- }
2340
- .param-chip.daqwin { color: #41c8f4; border-color: rgba(65, 200, 244, 0.4); }
2341
- .adopt-card { display: flex; gap: 12px; align-items: flex-start; flex-wrap: wrap; }
2342
- .adopt-title { font-size: 12px; color: var(--aw-dim, #8fa0b5); flex: none; padding-top: 4px; }
2343
- .adopt-list { display: flex; gap: 8px; flex-wrap: wrap; }
2344
- .adopt-chip {
2345
- display: inline-flex;
2346
- flex-wrap: wrap;
2347
- gap: 6px;
2348
- align-items: center;
2349
- padding: 4px 8px;
2350
- font-size: 11.5px;
2351
- color: #e8eef8;
2352
- background: rgba(13, 20, 32, 0.7);
2353
- border: 1px solid rgba(60, 80, 110, 0.5);
2354
- border-radius: 8px;
2355
- }
2356
- .page { padding: 4px; }
2357
- h1 { margin: 2px 0 4px; font-size: 30px; font-weight: 400; letter-spacing: -0.015em; }
2358
-
2359
- /* ── 参数台账(调控闭环) ── */
2360
- .ledger-card { padding: 14px 18px; margin-bottom: 14px; }
2361
- .ledger-head { display: flex; gap: 12px; align-items: center; }
2362
- .ledger-head b { font-size: 13.5px; }
2363
- .ledger-tri { display: flex; gap: 12px; align-items: center; margin-top: 12px; }
2364
- .tri-cell {
2365
- display: flex;
2366
- flex: 0 0 auto;
2367
- flex-direction: column;
2368
- gap: 2px;
2369
- padding: 8px 16px;
2370
- background: var(--paper-deep);
2371
- border: 1px solid var(--line-strong);
2372
- border-radius: var(--radius-chip);
2373
- }
2374
- .tri-cell small { font-size: 11.5px; color: var(--ink-faint); }
2375
- .tri-cell b { font-size: 17px; color: var(--ink); }
2376
- .ledger-cols { display: grid; grid-template-columns: 1fr 1fr; gap: 16px; margin-top: 12px; }
2377
- .sec-t { display: block; margin-bottom: 6px; font-size: 11.5px; font-weight: 700; letter-spacing: 0.12em; color: var(--ink-faint); }
2378
- .ledger-list { display: flex; flex-direction: column; gap: 3px; max-height: 200px; margin: 0; padding: 0; overflow: auto; font-size: 11.5px; color: var(--ink-soft); list-style: none; }
2379
- .ledger-rec { display: flex; gap: 8px; align-items: center; }
2380
- .rec-st {
2381
- flex: none;
2382
- padding: 0 6px;
2383
- font-family: var(--font-mono);
2384
- font-size: 11.5px;
2385
- color: var(--ink-faint);
2386
- border: 1px solid var(--line-strong);
2387
- border-radius: 4px;
2388
- }
2389
- .rec-st.open { color: var(--tone-warning-dot); border-color: var(--tone-warning-dot); }
2390
- .tri-cell b { overflow-wrap: anywhere; }
2391
- .rec-st.judged { color: var(--tone-warning-dot); border-color: var(--tone-warning-dot); opacity: 0.85; }
2392
- .rec-st.rolled-back, .rec-st.judged-keep { color: var(--tone-success-dot); border-color: var(--tone-success-dot); }
2393
- .sub { margin: 0; font-size: 12.5px; opacity: 0.6; }
2394
- .mono { font-family: var(--font-mono); font-variant-numeric: tabular-nums; }
2395
- .dim { opacity: 0.55; }
2396
- .badges { display: flex; gap: 8px; }
2397
- .badge { padding: 3px 10px; font-size: 11.5px; letter-spacing: 0.05em; color: var(--ink-soft); border: 1px solid var(--line-strong); border-radius: var(--radius-chip); }
2398
-
2399
- .ctrl-card { display: flex; flex-wrap: wrap; gap: 16px; align-items: center; justify-content: space-between; padding: 14px 18px; margin-bottom: 14px; }
2400
- .ctrl-left { display: flex; gap: 14px; align-items: center; }
2401
- .aw-pill.running { background: var(--accent); }
2402
- .ctrl-right { display: flex; gap: 12px; align-items: center; }
2403
- .ctrl-metrics { display: flex; flex-wrap: wrap; gap: 6px 8px; align-items: center; font-size: 11.5px; color: var(--ink-soft); }
2404
- .ctrl-metrics .sep { opacity: 0.4; }
2405
- .ctrl-metrics .warn { color: var(--tone-warning-dot); }
2406
- .add-btn { padding: 8px 16px; font-size: 13px; }
2407
-
2408
- .banner { padding: 9px 14px; margin: 0 0 12px; font-size: 12.5px; border-radius: var(--radius-chip); }
2409
- .banner.bad { color: var(--tone-danger-dot); background: var(--tone-danger-bg); border: 1px solid color-mix(in srgb, var(--tone-danger-dot) 40%, transparent); }
2410
- .banner.good { color: var(--tone-success-dot); background: var(--tone-success-bg); border: 1px solid color-mix(in srgb, var(--tone-success-dot) 40%, transparent); }
2411
-
2412
- .table-card { overflow-x: auto; margin-bottom: 14px; }
2413
- .nodes-table { width: 100%; border-collapse: collapse; font-size: 12.5px; }
2414
- .nodes-table th, .nodes-table td { padding: 9px 12px; text-align: left; border-bottom: 1px solid var(--divider-hair); }
2415
- .nodes-table th { font-size: 11px; font-weight: 600; letter-spacing: 0.06em; text-transform: uppercase; color: var(--ink-faint); border-bottom: 1px solid var(--line-strong); }
2416
- .nodes-table td b { margin-left: 8px; }
2417
- .ch { display: block; margin-top: 2px; font-size: 11.5px; color: var(--ink-faint); }
2418
- .right { text-align: right; }
2419
- .val { font-size: 13px; }
2420
- .val small { margin-left: 3px; color: var(--ink-faint); }
2421
- .read-stale { color: var(--tone-danger-dot, #e05a5a); text-decoration: underline dotted; text-underline-offset: 3px; }
2422
- .read-btn { margin-left: 8px; }
2423
-
2424
- .st-pill { display: inline-block; padding: 3px 9px; font-family: var(--font-mono); font-size: 11.5px; letter-spacing: 0.04em; border-radius: var(--radius-pill); }
2425
- .st-pill.ok { color: var(--tone-success-dot); background: var(--tone-success-bg); }
2426
- .st-pill.writing { color: var(--ink); background: var(--hover-tint); }
2427
- .st-pill.error, .st-pill.alarm { color: var(--tone-danger-dot); background: var(--tone-danger-bg); }
2428
- .st-pill.warn { color: var(--tone-warning-dot); background: var(--tone-warning-bg); }
2429
- .st-pill.offline, .st-pill.idle { color: var(--tone-neutral-dot); background: var(--tone-neutral-bg); }
2430
- .st-pill.paused { color: var(--tone-warning-dot); background: var(--tone-warning-bg); }
2431
-
2432
- /* 逐节点 控制开关 */
2433
- .ctrl-toggle { display: inline-flex; gap: 6px; align-items: center; padding: 3px 10px; font-size: 11.5px; cursor: pointer; color: var(--ink-faint); background: var(--paper-deep); border: 1px solid var(--line-strong); border-radius: var(--radius-pill); }
2434
- .ctrl-toggle .ct-dot { width: 7px; height: 7px; border-radius: 50%; background: var(--tone-neutral-dot); }
2435
- .ctrl-toggle.on { color: var(--tone-success-dot); border-color: color-mix(in srgb, var(--tone-success-dot) 45%, transparent); }
2436
- .ctrl-toggle.on .ct-dot { background: var(--tone-success-dot); box-shadow: 0 0 6px var(--tone-success-dot); }
2437
- .ctrl-toggle:disabled { opacity: 0.55; cursor: wait; }
2438
- .node-paused td { opacity: 0.6; }
2439
- .node-paused .write-row { opacity: 0.5; }
2440
-
2441
- /* 模板弹窗 */
2442
- .tpl-hint { margin: 0 0 10px; font-size: 12px; }
2443
- .recipe-hd { flex-wrap: wrap; }
2444
- .recipe-actions { flex-wrap: wrap; }
2445
- .tpl-chips { display: flex; flex-wrap: wrap; gap: 6px; margin-bottom: 4px; }
2446
- .tpl-chip { display: inline-flex; flex-wrap: wrap; gap: 6px; align-items: center; padding: 3px 9px; font-size: 11.5px; color: var(--ink-soft); background: var(--paper-deep); border: 1px solid var(--line); border-radius: var(--radius-chip); }
2447
- .tpl-chip small { color: var(--ink-faint); }
2448
- .tpl-tag { padding: 1px 6px; font-size: 11.5px; font-style: normal; color: var(--accent); border: 1px solid color-mix(in srgb, var(--accent) 40%, transparent); border-radius: var(--radius-pill); }
2449
- .tpl-tag.builtin { color: var(--ink-faint); border-color: var(--line-strong); }
2450
-
2451
- .write-row { display: flex; gap: 6px; align-items: center; }
2452
- .write-inp { width: 92px; padding: 4px 8px; }
2453
- .write-btn { padding: 5px 12px; }
2454
- .mini-btn { margin-right: 4px; }
2455
- .mini-btn.danger { color: var(--tone-danger-dot); }
2456
- .mini-btn:hover { border-color: var(--accent); color: var(--accent); }
2457
- .inp { padding: 5px 9px; font-size: 12.5px; color: var(--ink); background: var(--paper-deep); border: 1px solid var(--line-strong); border-radius: var(--radius-chip); }
2458
-
2459
- .line-card { display: flex; flex-wrap: wrap; gap: 16px; align-items: center; justify-content: space-between; padding: 14px 18px; margin-bottom: 14px; }
2460
- .line-status { display: flex; gap: 12px; align-items: center; min-width: 260px; }
2461
- .line-dot { width: 12px; height: 12px; border-radius: 50%; background: var(--tone-neutral-dot); box-shadow: 0 0 0 4px color-mix(in srgb, var(--tone-neutral-dot) 20%, transparent); }
2462
- .line-dot.on { background: var(--tone-success-dot); box-shadow: 0 0 0 4px color-mix(in srgb, var(--tone-success-dot) 22%, transparent); animation: linePulse 1.6s infinite; }
2463
- @keyframes linePulse { 0%, 100% { box-shadow: 0 0 0 3px color-mix(in srgb, var(--tone-success-dot) 25%, transparent); } 50% { box-shadow: 0 0 0 7px color-mix(in srgb, var(--tone-success-dot) 8%, transparent); } }
2464
- .line-info b { font-size: 14px; }
2465
- .line-info small { display: block; margin-top: 2px; font-size: 11px; }
2466
- .line-ctl { display: flex; flex-wrap: wrap; gap: 10px; align-items: flex-end; }
2467
- .ctl-sel { display: flex; flex-direction: column; gap: 4px; font-size: 11px; color: var(--ink-faint); }
2468
- .ctl-sel .inp { min-width: 150px; }
2469
- /* 配方参数行:窄屏不再按 5 列硬分,否则数值列被压成竖排字 */
2470
- .param-chip { overflow-wrap: anywhere; }
2471
- .product-row { display: flex; flex-wrap: wrap; gap: 8px; margin: 0 0 12px; }
2472
- .prod-chip { display: inline-flex; gap: 6px; align-items: center; padding: 4px 12px; font-size: 12px; cursor: pointer; color: var(--ink-soft); background: var(--paper-deep); border: 1px solid var(--line-strong); border-radius: var(--radius-pill); }
2473
- .prod-chip.on { color: var(--on-accent); background: var(--accent); border-color: var(--accent); }
2474
- .prod-del { color: var(--tone-danger-dot); font-weight: 700; }
2475
- .query-card { padding: 14px 18px; margin-bottom: 14px; }
2476
- .q-grid { display: grid; grid-template-columns: repeat(6, 1fr); gap: 10px; align-items: end; }
2477
- /* 配方网格:minmax(320px) 在 355px 画布(减去卡片内边距)里会溢出 1px,用 min() 兜住 */
2478
- .recipe-grid { grid-template-columns: repeat(auto-fill, minmax(min(320px, 100%), 1fr)); }
2479
- .q-grid .f { font-size: 11px; color: var(--ink-faint); }
2480
- .q-actions { justify-content: flex-end; }
2481
- .q-result { margin-top: 12px; overflow-x: auto; }
2482
- .cal-form { grid-template-columns: 2fr 1fr; align-items: end; }
2483
- .recipe-card { padding: 16px 18px; margin-bottom: 14px; }
2484
- .recipe-hd { display: flex; gap: 10px; align-items: center; margin-bottom: 6px; }
2485
- .recipe-hd h3 { margin: 0; font-size: 16px; }
2486
- .panel-tag { padding: 2px 8px; font-size: 11.5px; color: var(--ink-soft); border: 1px solid var(--line-strong); border-radius: var(--radius-chip); }
2487
- .recipe-sub { margin: 0 0 14px; font-size: 12px; color: var(--ink-faint); }
2488
- .recipe-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(320px, 1fr)); gap: 12px; }
2489
- .recipe-item { padding: 12px 14px; background: var(--paper-deep); border: 1px solid var(--line); border-radius: var(--radius-chip); }
2490
- .recipe-name b { font-size: 13.5px; }
2491
- .recipe-name small { margin-left: 8px; }
2492
- .desc { margin: 4px 0; font-size: 12px; }
2493
- .recipe-params { display: flex; flex-wrap: wrap; gap: 6px; margin: 8px 0; }
2494
- .param-chip { padding: 2px 8px; font-size: 11.5px; color: var(--accent); background: color-mix(in srgb, var(--accent) 8%, transparent); border: 1px solid color-mix(in srgb, var(--accent) 30%, transparent); border-radius: var(--radius-chip); }
2495
- .recipe-actions { display: flex; gap: 6px; align-items: center; margin-top: 8px; }
2496
- /* ---------- 配方版本历史 ---------- */
2497
- .ver-row { padding: 10px 12px; margin-bottom: 8px; border: 1px solid var(--divider-hair); border-radius: 10px; }
2498
- .ver-row.cur { background: color-mix(in srgb, var(--accent) 6%, transparent); border-color: color-mix(in srgb, var(--accent) 30%, transparent); }
2499
- .ver-head { display: flex; gap: 10px; align-items: center; }
2500
- .ver-v { font-weight: 700; font-size: 13px; }
2501
- .ver-src { padding: 1px 8px; font-size: 11.5px; border: 1px solid var(--line-strong); border-radius: var(--radius-pill); }
2502
- .ver-src.agent { color: var(--accent); border-color: color-mix(in srgb, var(--accent) 50%, transparent); }
2503
- .ver-src.user { color: var(--ink-soft); }
2504
- .ver-src.system { color: var(--ink-faint); }
2505
- .ver-src.cur { color: var(--accent); background: color-mix(in srgb, var(--accent) 10%, transparent); border-color: transparent; }
2506
- .ver-actor { font-family: var(--font-mono); font-size: 12px; color: var(--ink-soft); }
2507
- .ver-desc { margin: 6px 0 0; font-size: 12px; color: var(--ink); }
2508
- .ver-diff { margin: 4px 0 0; font-size: 11px; color: var(--ink-faint); }
2509
- .sec-label { margin: 14px 0 6px; font-size: 11px; font-weight: 600; letter-spacing: 0.06em; text-transform: uppercase; color: var(--ink-faint); }
2510
- .runs { margin-top: 6px; }
2511
-
2512
- .modal-mask { position: fixed; z-index: 50; inset: 0; display: flex; align-items: center; justify-content: center; background: var(--scrim); backdrop-filter: blur(2px); }
2513
- .modal { width: 680px; max-width: 94vw; max-height: 88vh; overflow-y: auto; padding: 22px 24px; background: var(--surface-glass-strong); backdrop-filter: var(--aurora-blur); border: 1px solid var(--glass-line); border-radius: var(--radius-panel); box-shadow: var(--glass-edge), var(--shadow-float); }
2514
- .m-title { margin: 0 0 14px; font-size: 17px; }
2515
- .seg-row { display: flex; gap: 8px; margin-bottom: 14px; }
2516
- .seg { flex: 1; padding: 8px 0; font-size: 13px; cursor: pointer; color: var(--ink-faint); background: var(--paper-deep); border: 1px solid var(--line); border-radius: var(--radius-chip); }
2517
- .seg.on { font-weight: 600; color: var(--on-accent); background: var(--accent); border-color: var(--accent); }
2518
- .f-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 10px; margin-bottom: 10px; }
2519
- .driver-form { grid-template-columns: repeat(3, 1fr); }
2520
- .param-row { display: grid; grid-template-columns: 2fr 1fr 1fr 1fr auto; gap: 8px; align-items: end; margin-bottom: 8px; }
2521
- .param-row .f { flex: 1; }
2522
- .param-del { margin-bottom: 2px; }
2523
- .f { display: flex; flex-direction: column; gap: 4px; font-size: 11.5px; color: var(--ink-faint); }
2524
- .f em { margin-left: 3px; font-style: normal; }
2525
- .hint { font-size: 11.5px; color: var(--ink-faint); }
2526
- .test-row { display: flex; gap: 10px; align-items: center; margin: 6px 0 4px; }
2527
- .test-result { font-family: var(--font-mono); font-size: 11px; }
2528
- .test-result.good { color: var(--tone-success-dot); }
2529
- .test-result.bad { color: var(--tone-danger-dot); }
2530
- .m-err { margin: 8px 0 0; font-size: 12px; color: var(--tone-danger-dot); }
2531
- .m-note { margin: 8px 0 0; font-size: 12px; color: var(--ink-faint); }
2532
- /* 失效配方参数:灰化 + 徽标 */
2533
- .param-chip.stale { color: var(--ink-faint); background: color-mix(in srgb, var(--ink) 5%, transparent); border-color: var(--divider-hair); text-decoration: line-through; text-decoration-color: color-mix(in srgb, var(--ink-faint) 60%, transparent); }
2534
- .chip-stale-tag { margin-left: 5px; padding: 0 5px; font-size: 11.5px; font-style: normal; color: var(--tone-danger-dot); background: color-mix(in srgb, var(--tone-danger-dot) 8%, transparent); border: 1px solid color-mix(in srgb, var(--tone-danger-dot) 30%, transparent); border-radius: var(--radius-chip); text-decoration: none; }
2535
- .row-stale { flex: none; padding: 1px 7px; font-size: 11.5px; color: var(--tone-danger-dot); border: 1px solid color-mix(in srgb, var(--tone-danger-dot) 30%, transparent); border-radius: var(--radius-chip); }
2536
- .m-actions { display: flex; gap: 10px; justify-content: flex-end; margin-top: 16px; }
2537
- .aw-pill.outline { color: var(--ink); background: var(--paper-raised); border-color: var(--line-strong); }
2538
- .err { margin-top: 14px; font-size: 13px; color: var(--tone-danger-dot); }
2539
- @media (prefers-reduced-motion: no-preference) {
2540
- .nodes-table tbody tr:hover { background: var(--hover-tint); }
2541
- }
2542
-
2543
- /* ══ 窄屏自适应层(≤900 手持/平板竖,≤640 单列)════════════════════════════
2544
- 375px 下本页的三类实测缺陷:网关总控条右侧三件套不换行(整块顶出画布)、
2545
- 运行控制行的两个 150px 选择器 + 按钮并排超宽、微标签 9~10.5px。 */
2546
- @media (max-width: 900px) {
2547
- .ctrl-card { gap: 12px; padding: 12px; }
2548
- .ctrl-right { flex-wrap: wrap; gap: 8px 10px; width: 100%; }
2549
- .ctrl-metrics { width: 100%; }
2550
- .line-card { gap: 12px; padding: 12px; }
2551
- .line-status { min-width: 0; }
2552
- .line-ctl { width: 100%; }
2553
- .ctl-sel { flex: 1 1 140px; min-width: 0; }
2554
- .ctl-sel .inp { min-width: 0; width: 100%; }
2555
- .line-ctl .pill-btn { flex: 1 1 120px; }
2556
-
2557
- /* 控制节点表:保留列语义,给一条可横扫的卷轴 + 首列钉住 */
2558
- .table-card { overflow-x: auto; -webkit-overflow-scrolling: touch; }
2559
- .nodes-table { min-width: 1080px; }
2560
- .nodes-table th,
2561
- .nodes-table td { white-space: nowrap; }
2562
- .nodes-table thead > tr > th:first-child,
2563
- .nodes-table tbody > tr > td:first-child {
2564
- position: sticky;
2565
- left: 0;
2566
- z-index: 2;
2567
- background: var(--paper-raised);
2568
- box-shadow: 1px 0 0 var(--line);
2569
- }
2570
-
2571
- .adopt-card { padding: 12px; }
2572
- .ledger-card,
2573
- .recipe-card,
2574
- .query-card { padding: 12px; }
2575
- .ledger-cols { grid-template-columns: 1fr; }
2576
- .ledger-tri { flex-wrap: wrap; }
2577
-
2578
- /* 触摸目标:手持命中区 ≥40px(main.css 只在 pointer:coarse 下兜底) */
2579
- .mini-btn,
2580
- .pill-btn,
2581
- .aw-pill,
2582
- .ctrl-toggle,
2583
- .inp,
2584
- .write-inp,
2585
- .prod-chip,
2586
- .tpl-chip {
2587
- min-height: 40px;
2588
- }
2589
-
2590
- .write-inp { width: 100%; min-width: 90px; }
2591
- .write-row { flex-wrap: wrap; }
2592
-
2593
- /* 弹窗表单:两列/三列在窄屏一律落成一列,否则标签被压成竖排字 */
2594
- .f-grid,
2595
- .driver-form,
2596
- .cal-form { grid-template-columns: 1fr; }
2597
- .q-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); }
2598
- .param-row { grid-template-columns: 1fr 1fr; }
2599
- .modal {
2600
- width: calc(100vw - 20px);
2601
- max-width: calc(100vw - 20px);
2602
- padding: 16px 14px;
2603
- }
2604
- .seg { padding: 10px 0; min-height: 40px; }
2605
- .m-actions { flex-wrap: wrap; }
2606
- .m-actions > * { flex: 1 1 auto; }
2607
- .recipe-hd .pill-btn,
2608
- .recipe-hd .mini-btn { min-height: 40px; }
2609
- }
2610
-
2611
- @media (max-width: 640px) {
2612
- h1 { font-size: 22px; }
2613
- .q-grid { grid-template-columns: 1fr; }
2614
- }
2615
- </style>
1
+ <script setup lang="ts">
2
+ /**
3
+ * 单产线专业控制台(/dcw/[id])—— 网关总控 / 产线启停 / 控制节点清单 / 产品与配方 /
4
+ * 配方版本历史 / 产线数据查询 / 写历史 / 参数台账(调控闭环)。
5
+ *
6
+ * 页面只做编排:路由作用域、写路径、台账、产线启停、产品、配方、查询、添加节点、控制模板
7
+ * 各一个 composable(状态各归其主);视图放在 components/dcw/ 下的子组件
8
+ * (绝不放进 pages/** —— 那会生成路由),样式随标记进各组件自己的 scoped 样式块
9
+ * (scoped 的 data-v 不跨组件,共享工具类各自持有一份逐字相同的副本)。
10
+ * 弹窗与面板经 v-model 就地读写 composable 持有的同一份状态,不产生第二副本。
11
+ */
12
+ import { useDcwAddNode } from './composables/useDcwAddNode'
13
+ import { useDcwDetailScope } from './composables/useDcwDetailScope'
14
+ import { useDcwDetailTemplates } from './composables/useDcwDetailTemplates'
15
+ import { useDcwLedger } from './composables/useDcwLedger'
16
+ import { useDcwLineRun } from './composables/useDcwLineRun'
17
+ import { useDcwProducts } from './composables/useDcwProducts'
18
+ import { useDcwQuery } from './composables/useDcwQuery'
19
+ import { useDcwRecipes } from './composables/useDcwRecipes'
20
+ import { useDcwWrites } from './composables/useDcwWrites'
21
+
22
+ const scope = useDcwDetailScope()
23
+ const writes = useDcwWrites()
24
+ const ledgerCtl = useDcwLedger()
25
+ const lineRun = useDcwLineRun(scope)
26
+ const products = useDcwProducts(scope, lineRun)
27
+ const recipes = useDcwRecipes(scope, products, lineRun, writes)
28
+ const queryCtl = useDcwQuery(scope)
29
+ const addNode = useDcwAddNode(scope)
30
+ const tplCtl = useDcwDetailTemplates(addNode)
31
+
32
+ const { dcw, line, lineId, ls, lineNodes, lineProducts, lineRecipesAll, lineRuns, lineHistory, unassignedNodes, unassignedProducts, stateLabel, dcwTemplateRefCh, nodeMin, nodeMax, lineDaqNodes, daqNodeCh, adoptNode, adoptProduct, productName, paramStatus, paramNodeName, daqWindowStatus, nodeDeviceNames } = scope
33
+ const { setInputs, writingId, writeError, writeOk, readingId, togglingId, doWrite, doRead, toggleControl } = writes
34
+ const { ledgerNodeId, ledger, loadLedger, rollbackLedgerNode } = ledgerCtl
35
+ const { lineProductId, lineRecipeId, lineBusy, lineMsg, lineErr, lineRecipes, doLineStart, doLineStop } = lineRun
36
+ const { filterProductId, visibleRecipes, productOpen, productSaving, productError, productForm, doCreateProduct } = products
37
+ const { verOpen, verRecipe, verRows, verLoading, verMsg, doRevert, recipeOpen, recipeEditing, recipeSaving, recipeError, recipeStaleNote, recipeForm, applyResult, runDataView, runDataLoading, openRecipeCreate, openRecipeEdit, openRecipeHistory, saveRecipe, doApplyRecipe, doViewRun } = recipes
38
+ const { query, queryBusy, queryError, queryResult, doQuery, daqParamKeys } = queryCtl
39
+ const { addOpen, addScenario, addTemplate, addDriver, addName, addHold, addRead, addWriteLock, addCfg, addTransform, addSemantics, addTesting, addTest, addSaving, addError, addFields, driverCatalog, doTestConnection, doAddNode } = addNode
40
+ const { tplOpen, tplSaving, tplError, tplOk, tplForm, tplIcons, builtinCount, customCount, openTplModal, doCreateTemplate } = tplCtl
41
+ </script>
42
+
43
+ <template>
44
+ <div
45
+ v-if="dcw.loaded && !line"
46
+ class="page"
47
+ >
48
+ <p class="banner bad">
49
+ {{ $t('dcwDetail.k19337yp018') }}
50
+ </p>
51
+ <NuxtLink
52
+ class="pill-btn"
53
+ to="/dcw"
54
+ >
55
+ {{ $t('dcwDetail.kllwu1c019') }}
56
+ </NuxtLink>
57
+ </div>
58
+ <div
59
+ v-else
60
+ class="page"
61
+ >
62
+ <DcwDetailHead
63
+ :line="line"
64
+ :line-id="lineId"
65
+ :nodes-count="lineNodes.length"
66
+ :products-count="lineProducts.length"
67
+ :recipes-count="lineRecipesAll.length"
68
+ />
69
+
70
+ <!-- 网关总控条 -->
71
+ <DcwGatewayBar
72
+ :running="dcw.controller.running"
73
+ :nodes-online="dcw.controller.nodesOnline"
74
+ :nodes-total="dcw.controller.nodesTotal"
75
+ :writes-total="dcw.controller.writesTotal"
76
+ :writes-failed="dcw.controller.writesFailed"
77
+ @toggle="dcw.startStop"
78
+ @open-templates="openTplModal"
79
+ @open-add="addOpen = true"
80
+ />
81
+
82
+ <!-- 写错误/成功横幅 -->
83
+ <p
84
+ v-if="writeError || writeOk"
85
+ class="banner"
86
+ :class="writeError ? 'bad' : 'good'"
87
+ >
88
+ {{ writeError || writeOk }}
89
+ </p>
90
+
91
+ <!-- 未分配资产收编(历史节点/产品迁移到本产线) -->
92
+ <DcwAdoptCard
93
+ :unassigned-nodes="unassignedNodes"
94
+ :unassigned-products="unassignedProducts"
95
+ @adopt-node="adoptNode"
96
+ @adopt-product="adoptProduct"
97
+ />
98
+
99
+ <!-- 产线运行控制:开跑必设配方;窗口内数采逐样本打标 -->
100
+ <DcwLineRunCard
101
+ v-model:product-id="lineProductId"
102
+ v-model:recipe-id="lineRecipeId"
103
+ :ls="ls"
104
+ :line-products="lineProducts"
105
+ :line-recipes="lineRecipes"
106
+ :line-busy="lineBusy"
107
+ :line-msg="lineMsg"
108
+ :line-err="lineErr"
109
+ @start="doLineStart"
110
+ @stop="doLineStop"
111
+ />
112
+
113
+ <!-- 添加控制节点模板(自定义创建) -->
114
+ <DcwDetailTemplateModal
115
+ v-model:open="tplOpen"
116
+ v-model:form="tplForm"
117
+ :templates="dcw.templates"
118
+ :tpl-icons="tplIcons"
119
+ :builtin-count="builtinCount"
120
+ :custom-count="customCount"
121
+ :tpl-saving="tplSaving"
122
+ :tpl-error="tplError"
123
+ :tpl-ok="tplOk"
124
+ @submit="doCreateTemplate"
125
+ @close="tplOpen = false"
126
+ />
127
+
128
+ <!-- 添加控制节点向导 -->
129
+ <DcwAddNodeModal
130
+ v-model:open="addOpen"
131
+ v-model:scenario="addScenario"
132
+ v-model:template="addTemplate"
133
+ v-model:driver="addDriver"
134
+ v-model:name="addName"
135
+ v-model:hold="addHold"
136
+ v-model:read="addRead"
137
+ v-model:write-lock="addWriteLock"
138
+ v-model:cfg="addCfg"
139
+ v-model:transform="addTransform"
140
+ v-model:semantics="addSemantics"
141
+ :templates="dcw.templates"
142
+ :driver-catalog="driverCatalog"
143
+ :add-fields="addFields"
144
+ :add-testing="addTesting"
145
+ :add-test="addTest"
146
+ :add-saving="addSaving"
147
+ :add-error="addError"
148
+ @test="doTestConnection"
149
+ @submit="doAddNode"
150
+ />
151
+
152
+ <!-- 控制节点清单 -->
153
+ <DcwNodesTable
154
+ v-model:set-inputs="setInputs"
155
+ :line-nodes="lineNodes"
156
+ :state-label="stateLabel"
157
+ :toggling-id="togglingId"
158
+ :reading-id="readingId"
159
+ :writing-id="writingId"
160
+ :loaded="dcw.loaded"
161
+ :error="dcw.error"
162
+ :dcw-template-ref-ch="dcwTemplateRefCh"
163
+ :node-device-names="nodeDeviceNames"
164
+ @toggle="toggleControl"
165
+ @read="doRead"
166
+ @write="doWrite"
167
+ @remove="dcw.removeNode"
168
+ />
169
+
170
+ <!-- 产品与配方管理 -->
171
+ <DcwRecipePanel
172
+ v-model:filter-product-id="filterProductId"
173
+ :line-products="lineProducts"
174
+ :visible-recipes="visibleRecipes"
175
+ :line-runs="lineRuns"
176
+ :apply-result="applyResult"
177
+ :run-data-view="runDataView"
178
+ :run-data-loading="runDataLoading"
179
+ :product-name="productName"
180
+ :param-status="paramStatus"
181
+ :param-node-name="paramNodeName"
182
+ :daq-window-status="daqWindowStatus"
183
+ :daq-node-ch="daqNodeCh"
184
+ @create="openRecipeCreate"
185
+ @open-product="productOpen = true"
186
+ @apply="doApplyRecipe"
187
+ @edit="openRecipeEdit"
188
+ @history="openRecipeHistory"
189
+ @remove-recipe="dcw.removeRecipe"
190
+ @remove-product="dcw.removeProduct"
191
+ @view-run="doViewRun"
192
+ @close-run="dcw.closeRun"
193
+ @close-run-data="runDataView = null"
194
+ />
195
+
196
+ <!-- 配方编辑弹窗 -->
197
+ <DcwRecipeEditModal
198
+ v-model:open="recipeOpen"
199
+ v-model:form="recipeForm"
200
+ :line-products="lineProducts"
201
+ :line-nodes="lineNodes"
202
+ :line-daq-nodes="lineDaqNodes"
203
+ :line-id="lineId"
204
+ :recipe-editing="recipeEditing"
205
+ :recipe-saving="recipeSaving"
206
+ :recipe-error="recipeError"
207
+ :recipe-stale-note="recipeStaleNote"
208
+ :dcw-template-ref-ch="dcwTemplateRefCh"
209
+ :node-min="nodeMin"
210
+ :node-max="nodeMax"
211
+ :param-status="paramStatus"
212
+ @submit="saveRecipe"
213
+ @close="recipeOpen = false"
214
+ />
215
+
216
+ <!-- 配方版本历史(整体修改变更记录:来源/操作者/原因/参数 diff + 回退) -->
217
+ <DcwRecipeHistoryModal
218
+ v-model:open="verOpen"
219
+ :ver-recipe="verRecipe"
220
+ :ver-rows="verRows"
221
+ :ver-loading="verLoading"
222
+ :ver-msg="verMsg"
223
+ :param-node-name="paramNodeName"
224
+ @revert="doRevert"
225
+ @close="verOpen = false"
226
+ />
227
+
228
+ <!-- 产线数据查询(产品/配方/参数/时间/间隔) -->
229
+ <DcwQueryCard
230
+ v-model:query="query"
231
+ :line-products="lineProducts"
232
+ :visible-recipes="visibleRecipes"
233
+ :line-daq-nodes="lineDaqNodes"
234
+ :daq-param-keys="daqParamKeys"
235
+ :query-busy="queryBusy"
236
+ :query-error="queryError"
237
+ :query-result="queryResult"
238
+ @run="doQuery"
239
+ />
240
+
241
+ <!-- 写历史 -->
242
+ <DcwWriteHistoryCard
243
+ v-if="lineHistory.length"
244
+ :line-history="lineHistory"
245
+ />
246
+
247
+ <!-- 新建产品弹窗 -->
248
+ <DcwProductCreateModal
249
+ v-model:open="productOpen"
250
+ v-model:form="productForm"
251
+ :product-saving="productSaving"
252
+ :product-error="productError"
253
+ @submit="doCreateProduct"
254
+ @close="productOpen = false"
255
+ />
256
+
257
+ <p
258
+ v-if="dcw.error"
259
+ class="err"
260
+ >
261
+ {{ dcw.error }}(<NuxtLink to="/workshop">{{ $t('dcwDetail.k1bhhheq120') }}</NuxtLink>)
262
+ </p>
263
+
264
+ <!-- 参数台账(调控闭环:当前值/配方目标/lastGood 三值对照 + 设定历史 + 优化记录) -->
265
+ <DcwLedgerCard
266
+ v-model:node-id="ledgerNodeId"
267
+ :line-nodes="lineNodes"
268
+ :ledger="ledger"
269
+ @load="loadLedger"
270
+ @rollback="rollbackLedgerNode"
271
+ />
272
+ </div>
273
+ </template>
274
+
275
+ <style scoped>
276
+ /* 共享工具类随标记搬入本组件:scoped 的 data-v 归属不跨组件,
277
+ 凡在多组件出现的规则(.mono/.dim/.inp/.mini-btn/.modal-mask/.banner/.nodes-table/.sec-label/.st-pill 等)
278
+ 在此各持一份逐字相同的副本,以保证每个元素命中的声明集与拆分前一致,同时不引入任何全局选择器。 */
279
+
280
+ .page { padding: 4px; }
281
+
282
+ .banner { padding: 9px 14px; margin: 0 0 12px; font-size: 12.5px; border-radius: var(--radius-chip); }
283
+ .banner.bad { color: var(--tone-danger-dot); background: var(--tone-danger-bg); border: 1px solid color-mix(in srgb, var(--tone-danger-dot) 40%, transparent); }
284
+ .banner.good { color: var(--tone-success-dot); background: var(--tone-success-bg); border: 1px solid color-mix(in srgb, var(--tone-success-dot) 40%, transparent); }
285
+
286
+ .err { margin-top: 14px; font-size: 13px; color: var(--tone-danger-dot); }
287
+
288
+ @media (max-width: 900px) {
289
+ /* ══ 窄屏自适应层(≤900 手持/平板竖,≤640 单列)════════════════════════════
290
+ 375px 下本页的三类实测缺陷:网关总控条右侧三件套不换行(整块顶出画布)、
291
+ 运行控制行的两个 150px 选择器 + 按钮并排超宽、微标签 9~10.5px。 */
292
+ /* 触摸目标:手持命中区 ≥40px(main.css 只在 pointer:coarse 下兜底) */
293
+ .pill-btn {
294
+ min-height: 40px;
295
+ }
296
+ }
297
+ </style>