agentworkshop 0.7.39 → 0.7.41

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 (405) hide show
  1. package/.AgentWorkShop/prompts/host-tools.json +55 -0
  2. package/.output/.AgentWorkShop/prompts/host-tools.json +55 -0
  3. package/.output/nitro.json +1 -1
  4. package/.output/public/_nuxt/88GOowgO2.js +1 -0
  5. package/.output/public/_nuxt/{BNT8gYU92.js → BC9wjTJK2.js} +2 -2
  6. package/.output/public/_nuxt/{CY9LbPCI.js → BN16aRdQ.js} +1 -1
  7. package/.output/public/_nuxt/BWVhZntO.js +1 -0
  8. package/.output/public/_nuxt/{HBLJ-wei.js → BXxH0UQE.js} +1 -1
  9. package/.output/public/_nuxt/{zIGh7R49.js → BneN7fbu.js} +1 -1
  10. package/.output/public/_nuxt/BsROmY89.js +1 -0
  11. package/.output/public/_nuxt/{DUrecWPx.js → C0ZrS1KL.js} +2 -2
  12. package/.output/public/_nuxt/{C_OLzD09.js → C4oW1HsE.js} +1 -1
  13. package/.output/public/_nuxt/{CUDwzgLV.js → C4s_niy-.js} +9 -9
  14. package/.output/public/_nuxt/CFxtLwjp.js +1 -0
  15. package/.output/public/_nuxt/{Cec0Ua3F.js → CS50LB_l.js} +1 -1
  16. package/.output/public/_nuxt/CssgYAAL2.js +1 -0
  17. package/.output/public/_nuxt/D6mbFA-a.js +1 -0
  18. package/.output/public/_nuxt/D98NH8kG.js +1 -0
  19. package/.output/public/_nuxt/DGIuvyRN2.js +1 -0
  20. package/.output/public/_nuxt/DGbd-UiG.js +1 -0
  21. package/.output/public/_nuxt/{CojCTLKD.js → DGj-WEBg.js} +1 -1
  22. package/.output/public/_nuxt/{DDShH71m.js → DS8qj8EL.js} +1 -1
  23. package/.output/public/_nuxt/DTFCy6h-.js +1 -0
  24. package/.output/public/_nuxt/{DrYV5i68.js → DUjW5Yq5.js} +1 -1
  25. package/.output/public/_nuxt/{45zuyAso.js → D_OTvQza.js} +1 -1
  26. package/.output/public/_nuxt/Dap5PmTL.js +2 -0
  27. package/.output/public/_nuxt/Dqw1lpr-.js +1 -0
  28. package/.output/public/_nuxt/DvLxILQP.js +1 -0
  29. package/.output/public/_nuxt/IREZ1eC2.js +1 -0
  30. package/.output/public/_nuxt/TownView.f-YOdXRs.css +1 -0
  31. package/.output/public/_nuxt/_id_.D9ymtHB5.css +1 -0
  32. package/.output/public/_nuxt/_id_.jf-_8E_c.css +1 -0
  33. package/.output/public/_nuxt/_wsId_.B4WiqkIS.css +1 -0
  34. package/.output/public/_nuxt/agents.ZD0rVdHE.css +1 -0
  35. package/.output/public/_nuxt/aml.BN8ZEW4h.css +1 -0
  36. package/.output/public/_nuxt/builds/latest.json +1 -1
  37. package/.output/public/_nuxt/builds/meta/78a295bb-2072-48a4-8b46-6d545fdae743.json +1 -0
  38. package/.output/public/_nuxt/ca4TJ3Op.js +1 -0
  39. package/.output/public/_nuxt/channel-templates.BOtahzPi.css +1 -0
  40. package/.output/public/_nuxt/daq.DjSgY94l.css +1 -0
  41. package/.output/public/_nuxt/dcw.8Y7FqCVN.css +1 -0
  42. package/.output/public/_nuxt/default.J32SgqFY.css +1 -0
  43. package/.output/public/_nuxt/entry.bdm0tv6M.css +1 -0
  44. package/.output/public/_nuxt/eqq3wWQF.js +18 -0
  45. package/.output/public/_nuxt/logs.BpKzmKsh.css +1 -0
  46. package/.output/public/_nuxt/monitor.D9pe7qN6.css +1 -0
  47. package/.output/public/_nuxt/pages.D7aSDlUI.css +1 -0
  48. package/.output/public/_nuxt/permissions.DwTVlFe6.css +1 -0
  49. package/.output/public/_nuxt/plugins.sb4nDGqr.css +1 -0
  50. package/.output/public/_nuxt/{Cbq-mryP.js → qr6R6Ha1.js} +1 -1
  51. package/.output/public/_nuxt/settings.BTgR-NiE.css +1 -0
  52. package/.output/public/_nuxt/teams.CxnxKVVs.css +1 -0
  53. package/.output/public/_nuxt/tokens.BFY7qv4f.css +1 -0
  54. package/.output/public/_nuxt/{town.DKIAhKnx.css → town.BBXZmeoP.css} +1 -1
  55. package/.output/public/_nuxt/users.DLgZ1D0h.css +1 -0
  56. package/.output/public/_nuxt/workshop.CR_QzeAN.css +1 -0
  57. package/.output/public/_nuxt/{BzHEilTt.js → xh3_vYcu.js} +1 -1
  58. package/.output/public/_nuxt/yF0aYMF1.js +4 -0
  59. package/.output/server/chunks/_/entity.mjs.map +1 -1
  60. package/.output/server/chunks/_/nitro.mjs +2355 -1362
  61. package/.output/server/chunks/_/nitro.mjs.map +1 -1
  62. package/.output/server/chunks/build/{TownView-jVazYOjN.mjs → TownView--otsnr_7.mjs} +290 -208
  63. package/.output/server/chunks/build/TownView--otsnr_7.mjs.map +1 -0
  64. package/.output/server/chunks/build/{_id_-CfVosNg3.mjs → _id_-Brv-JSvr.mjs} +142 -141
  65. package/.output/server/chunks/build/_id_-Brv-JSvr.mjs.map +1 -0
  66. package/.output/server/chunks/build/{_id_-Hwr4rZpr.mjs → _id_-D9pl1OZy.mjs} +38 -36
  67. package/.output/server/chunks/build/_id_-D9pl1OZy.mjs.map +1 -0
  68. package/.output/server/chunks/build/{_wsId_-BVg3bB77.mjs → _wsId_-BASfDf0s.mjs} +295 -261
  69. package/.output/server/chunks/build/{_wsId_-BVg3bB77.mjs.map → _wsId_-BASfDf0s.mjs.map} +1 -1
  70. package/.output/server/chunks/build/{agents-Bvin73QY.mjs → agents-CLQqJF2y.mjs} +21 -27
  71. package/.output/server/chunks/build/agents-CLQqJF2y.mjs.map +1 -0
  72. package/.output/server/chunks/build/{aml-BCSJCdX7.mjs → aml-_7FdFL2p.mjs} +109 -109
  73. package/.output/server/chunks/build/{aml-BCSJCdX7.mjs.map → aml-_7FdFL2p.mjs.map} +1 -1
  74. package/.output/server/chunks/build/api-error-dul30BYQ.mjs.map +1 -1
  75. package/.output/server/chunks/build/{channel-templates-BTq8570n.mjs → channel-templates-p6SZNjlM.mjs} +19 -19
  76. package/.output/server/chunks/build/{channel-templates-BTq8570n.mjs.map → channel-templates-p6SZNjlM.mjs.map} +1 -1
  77. package/.output/server/chunks/build/{daq-C03Uu5UE.mjs → daq-DkMvD8sg.mjs} +193 -126
  78. package/.output/server/chunks/build/daq-DkMvD8sg.mjs.map +1 -0
  79. package/.output/server/chunks/build/{dcw-6vEYVeje.mjs → dcw-C1jgVJkO.mjs} +46 -46
  80. package/.output/server/chunks/build/{dcw-6vEYVeje.mjs.map → dcw-C1jgVJkO.mjs.map} +1 -1
  81. package/.output/server/chunks/build/{default-CZmZFpqH.mjs → default-BE4r0FZN.mjs} +152 -58
  82. package/.output/server/chunks/build/{default-CZmZFpqH.mjs.map → default-BE4r0FZN.mjs.map} +1 -1
  83. package/.output/server/chunks/build/{logs-B-xhuqln.mjs → logs--dByNyhw.mjs} +35 -35
  84. package/.output/server/chunks/build/{logs-B-xhuqln.mjs.map → logs--dByNyhw.mjs.map} +1 -1
  85. package/.output/server/chunks/build/{monitor-CyfDt4nR.mjs → monitor-C0okQaXz.mjs} +33 -33
  86. package/.output/server/chunks/build/{monitor-CyfDt4nR.mjs.map → monitor-C0okQaXz.mjs.map} +1 -1
  87. package/.output/server/chunks/build/{pages-BO7yZsXA.mjs → pages-B0bUWnC6.mjs} +35 -19
  88. package/.output/server/chunks/build/pages-B0bUWnC6.mjs.map +1 -0
  89. package/.output/server/chunks/build/{permissions-B52oOmaO.mjs → permissions-68SsNjex.mjs} +12 -12
  90. package/.output/server/chunks/build/{permissions-B52oOmaO.mjs.map → permissions-68SsNjex.mjs.map} +1 -1
  91. package/.output/server/chunks/build/{plugins-CUWmMdyt.mjs → plugins-lGlUr1lj.mjs} +17 -17
  92. package/.output/server/chunks/build/{plugins-CUWmMdyt.mjs.map → plugins-lGlUr1lj.mjs.map} +1 -1
  93. package/.output/server/chunks/build/{settings-DoQ2Oq3P.mjs → settings-Ddd1qx2Z.mjs} +50 -47
  94. package/.output/server/chunks/build/settings-Ddd1qx2Z.mjs.map +1 -0
  95. package/.output/server/chunks/build/{teams-2kz3CusY.mjs → teams-MEDLZdMn.mjs} +38 -34
  96. package/.output/server/chunks/build/teams-MEDLZdMn.mjs.map +1 -0
  97. package/.output/server/chunks/build/{tokens-BbWLqtVz.mjs → tokens-C7fTM5C2.mjs} +14 -14
  98. package/.output/server/chunks/build/{tokens-BbWLqtVz.mjs.map → tokens-C7fTM5C2.mjs.map} +1 -1
  99. package/.output/server/chunks/build/{town-BOl6hs9B.mjs → town-CoQdblbZ.mjs} +38 -12
  100. package/.output/server/chunks/build/town-CoQdblbZ.mjs.map +1 -0
  101. package/.output/server/chunks/build/{useDaqStream-CIBaiGAl.mjs → useDaqStream-DfCFpb3p.mjs} +9 -3
  102. package/.output/server/chunks/build/useDaqStream-DfCFpb3p.mjs.map +1 -0
  103. package/.output/server/chunks/build/{useDcwStream-CBbiYnWe.mjs → useDcwStream-UPiX-3iO.mjs} +11 -2
  104. package/.output/server/chunks/build/useDcwStream-UPiX-3iO.mjs.map +1 -0
  105. package/.output/server/chunks/build/useResponsive-BKDMGTHs.mjs +49 -0
  106. package/.output/server/chunks/build/useResponsive-BKDMGTHs.mjs.map +1 -0
  107. package/.output/server/chunks/build/{users-fohSmF-J.mjs → users-Cfd5-l2-.mjs} +6 -6
  108. package/.output/server/chunks/build/{users-fohSmF-J.mjs.map → users-Cfd5-l2-.mjs.map} +1 -1
  109. package/.output/server/chunks/build/{workshop-DX5-ldc4.mjs → workshop-BL5bhfs0.mjs} +15 -15
  110. package/.output/server/chunks/build/{workshop-DX5-ldc4.mjs.map → workshop-BL5bhfs0.mjs.map} +1 -1
  111. package/.output/server/chunks/build/{workspaces-BuydxM-3.mjs → workspaces-Bgz5Ekwp.mjs} +18 -3
  112. package/.output/server/chunks/build/workspaces-Bgz5Ekwp.mjs.map +1 -0
  113. package/.output/server/chunks/routes/api/system/config-groups/_id_.patch.mjs.map +1 -1
  114. package/.output/server/chunks/routes/api/system/index.patch.mjs.map +1 -1
  115. package/.output/server/chunks/routes/api/system/index.post.mjs.map +1 -1
  116. package/.output/server/chunks/routes/api/system/settings/events.get.mjs.map +1 -1
  117. package/.output/server/chunks/routes/api/workshop/agent-tools/invoke.post.mjs +6 -2
  118. package/.output/server/chunks/routes/api/workshop/agent-tools/invoke.post.mjs.map +1 -1
  119. package/.output/server/chunks/routes/api/workshop/aml/datasets/_id_.get.mjs +2 -1
  120. package/.output/server/chunks/routes/api/workshop/aml/datasets/_id_.get.mjs.map +1 -1
  121. package/.output/server/chunks/routes/api/workshop/channel-templates/_id/instantiate.post.mjs +1 -1
  122. package/.output/server/chunks/routes/api/workshop/channels.post.mjs +3 -3
  123. package/.output/server/chunks/routes/api/workshop/daq/index.post.mjs.map +1 -1
  124. package/.output/server/chunks/routes/api/workshop/daq/templates/_key_.delete.mjs.map +1 -1
  125. package/.output/server/chunks/routes/api/workshop/daq/templates/_key_.patch.mjs.map +1 -1
  126. package/.output/server/chunks/routes/api/workshop/dcw/_id/write.post.mjs +3 -2
  127. package/.output/server/chunks/routes/api/workshop/dcw/_id/write.post.mjs.map +1 -1
  128. package/.output/server/chunks/routes/api/workshop/dcw/_id_.delete.mjs +2 -1
  129. package/.output/server/chunks/routes/api/workshop/dcw/_id_.delete.mjs.map +1 -1
  130. package/.output/server/chunks/routes/api/workshop/dcw/index2.post.mjs +8 -6
  131. package/.output/server/chunks/routes/api/workshop/dcw/index2.post.mjs.map +1 -1
  132. package/.output/server/chunks/routes/api/workshop/dcw/index3.post.mjs +5 -5
  133. package/.output/server/chunks/routes/api/workshop/dcw/index3.post.mjs.map +1 -1
  134. package/.output/server/chunks/routes/api/workshop/dcw/index4.get.mjs +14 -4
  135. package/.output/server/chunks/routes/api/workshop/dcw/index4.get.mjs.map +1 -1
  136. package/.output/server/chunks/routes/api/workshop/dcw/index4.post.mjs +4 -4
  137. package/.output/server/chunks/routes/api/workshop/dcw/index4.post.mjs.map +1 -1
  138. package/.output/server/chunks/routes/api/workshop/dcw/index5.get.mjs +4 -3
  139. package/.output/server/chunks/routes/api/workshop/dcw/index5.get.mjs.map +1 -1
  140. package/.output/server/chunks/routes/api/workshop/dcw/index5.post.mjs +31 -0
  141. package/.output/server/chunks/routes/api/workshop/dcw/index5.post.mjs.map +1 -0
  142. package/.output/server/chunks/routes/api/workshop/dcw/index6.get.mjs +28 -0
  143. package/.output/server/chunks/routes/api/workshop/dcw/index6.get.mjs.map +1 -0
  144. package/.output/server/chunks/routes/api/workshop/dcw/lines/_id/start.post.mjs +1 -1
  145. package/.output/server/chunks/routes/api/workshop/dcw/lines/_id/stop.post.mjs +1 -1
  146. package/.output/server/chunks/routes/api/workshop/dcw/lines/_id_.patch.mjs.map +1 -1
  147. package/.output/server/chunks/routes/api/workshop/dcw/params/_id/read.post.mjs +32 -0
  148. package/.output/server/chunks/routes/api/workshop/dcw/params/_id/read.post.mjs.map +1 -0
  149. package/.output/server/chunks/routes/api/workshop/dcw/params/_id/write.post.mjs +34 -0
  150. package/.output/server/chunks/routes/api/workshop/dcw/params/_id/write.post.mjs.map +1 -0
  151. package/.output/server/chunks/routes/api/workshop/dcw/params/_id_.delete.mjs +33 -0
  152. package/.output/server/chunks/routes/api/workshop/dcw/params/_id_.delete.mjs.map +1 -0
  153. package/.output/server/chunks/routes/api/workshop/dcw/params/_id_.patch.mjs +34 -0
  154. package/.output/server/chunks/routes/api/workshop/dcw/params/_id_.patch.mjs.map +1 -0
  155. package/.output/server/chunks/routes/api/workshop/dcw/templates/_key_.delete.mjs +1 -1
  156. package/.output/server/chunks/routes/api/workshop/dcw/templates/_key_.patch.mjs +1 -1
  157. package/.output/server/chunks/routes/api/workshop/harnesses/_id/providers.get.mjs +1 -1
  158. package/.output/server/chunks/routes/api/workshop/harnesses.get.mjs +1 -1
  159. package/.output/server/chunks/routes/api/workshop/hitl/pending.get.mjs +1 -1
  160. package/.output/server/chunks/routes/api/workshop/hitl/respond.post.mjs +1 -1
  161. package/.output/server/chunks/routes/api/workshop/index.put.mjs +1 -1
  162. package/.output/server/chunks/routes/api/workshop/index5.get.mjs +3 -1
  163. package/.output/server/chunks/routes/api/workshop/index5.get.mjs.map +1 -1
  164. package/.output/server/chunks/routes/api/workshop/index6.get.mjs +5 -1
  165. package/.output/server/chunks/routes/api/workshop/index6.get.mjs.map +1 -1
  166. package/.output/server/chunks/routes/api/workshop/index9.get.mjs +3 -1
  167. package/.output/server/chunks/routes/api/workshop/index9.get.mjs.map +1 -1
  168. package/.output/server/chunks/routes/api/workshop/plugins/_name/disable.post.mjs +1 -1
  169. package/.output/server/chunks/routes/api/workshop/plugins/_name/enable.post.mjs +1 -1
  170. package/.output/server/chunks/routes/api/workshop/scene/layouts/_channelId_.delete.mjs +1 -1
  171. package/.output/server/chunks/routes/api/workshop/scene/layouts/_channelId_.put.mjs +1 -1
  172. package/.output/server/chunks/routes/api/workshop/workspaces/_id/channel-templates/_tplId_.post.mjs +1 -1
  173. package/.output/server/chunks/routes/renderer.mjs +3 -3
  174. package/.output/server/chunks/virtual/entry.mjs +51 -25
  175. package/.output/server/chunks/virtual/precomputed.mjs +1 -1
  176. package/.output/server/package.json +1 -1
  177. package/README-zh.md +203 -39
  178. package/README.md +739 -591
  179. package/app/app.vue +9 -3
  180. package/app/assets/css/main.css +517 -7
  181. package/app/components/AppHeader.vue +98 -7
  182. package/app/components/AppSidebar.vue +117 -11
  183. package/app/components/AwChart.vue +2 -1
  184. package/app/components/workshop/AgentInspectorDrawer.vue +6 -6
  185. package/app/components/workshop/AgentLanesView.vue +52 -1
  186. package/app/components/workshop/AssetLibrary.vue +4 -2
  187. package/app/components/workshop/ChannelSessionList.vue +4 -2
  188. package/app/components/workshop/Composer.vue +96 -0
  189. package/app/components/workshop/DaqNodeRow.vue +19 -0
  190. package/app/components/workshop/DaqTemplateIcon.vue +33 -0
  191. package/app/components/workshop/DeviceTwinPanel.vue +37 -35
  192. package/app/components/workshop/EventBlock.vue +3 -3
  193. package/app/components/workshop/InspectorPanel.vue +47 -11
  194. package/app/components/workshop/LiveAgentBar.vue +34 -0
  195. package/app/components/workshop/TaskBoardView.vue +83 -33
  196. package/app/components/workshop/TranscriptTimeline.vue +56 -0
  197. package/app/components/workshop/blocks/ClusterError.vue +1 -1
  198. package/app/components/workshop/blocks/ClusterRoute.vue +3 -1
  199. package/app/components/workshop/blocks/ClusterStatus.vue +2 -2
  200. package/app/components/workshop/blocks/ClusterStream.vue +8 -2
  201. package/app/components/workshop/town/ModelPreview3D.vue +1 -1
  202. package/app/components/workshop/town/TownView.vue +507 -82
  203. package/app/composables/useResponsive.ts +88 -0
  204. package/app/composables/useRouteMeta.ts +3 -0
  205. package/app/composables/workshop/useDaqStream.ts +7 -4
  206. package/app/composables/workshop/useDcwStream.ts +8 -2
  207. package/app/composables/workshop/useVisibleInterval.ts +2 -2
  208. package/app/composables/workshop/useWorkshopApi.ts +1 -1
  209. package/app/layouts/default.vue +46 -2
  210. package/app/pages/aml/index.vue +712 -616
  211. package/app/pages/daq/[id].vue +12 -7
  212. package/app/pages/daq/index.vue +216 -13
  213. package/app/pages/dcw/[id].vue +117 -32
  214. package/app/pages/dcw/index.vue +83 -23
  215. package/app/pages/index.vue +35 -1
  216. package/app/pages/logs/index.vue +147 -13
  217. package/app/pages/monitor.vue +56 -12
  218. package/app/pages/permissions/index.vue +34 -0
  219. package/app/pages/plugins/index.vue +35 -4
  220. package/app/pages/settings.vue +90 -21
  221. package/app/pages/tokens.vue +23 -0
  222. package/app/pages/town.vue +50 -5
  223. package/app/pages/users.vue +23 -0
  224. package/app/pages/workshop/agents.vue +92 -2
  225. package/app/pages/workshop/channel-templates.vue +53 -0
  226. package/app/pages/workshop/index.vue +14 -0
  227. package/app/pages/workshop/teams.vue +66 -6
  228. package/app/pages/workshop/w/[wsId].vue +202 -14
  229. package/app/plugins/aw-plugins.client.ts +13 -8
  230. package/app/stores/app.ts +33 -1
  231. package/app/stores/workshop/user.ts +1 -1
  232. package/app/stores/workshop/workspaces.ts +18 -2
  233. package/app/utils/api-error.ts +1 -1
  234. package/cli/commands/build.mjs +8 -1
  235. package/docker-compose.yml +6 -0
  236. package/docs/cli.en.md +2 -2
  237. package/docs/cli.md +2 -2
  238. package/docs/plugins.en.md +33 -1
  239. package/docs/plugins.md +29 -1
  240. package/docs/sdk.en.md +1 -1
  241. package/docs/sdk.md +1 -1
  242. package/i18n/locales/en.ts +2 -0
  243. package/i18n/locales/zh-CN.ts +2 -0
  244. package/nuxt.config.ts +31 -0
  245. package/package.json +11 -2
  246. package/scripts/_dbg-param-map-e2e.ts +242 -0
  247. package/scripts/_dbg-param-map-rest-smoke.mjs +73 -0
  248. package/scripts/_dbg-param-real-scenario.mjs +153 -0
  249. package/scripts/_loop-biax-campaign.mjs +124 -0
  250. package/scripts/api-live-e2e.mjs +40 -8
  251. package/scripts/capture-walkthrough.mjs +232 -0
  252. package/scripts/render-walkthrough-figure.mjs +46 -0
  253. package/scripts/seed-walkthrough-fixture.mjs +143 -0
  254. package/scripts/test-plugin-hardening.mjs +8 -0
  255. package/scripts/test-serial-bridge.mjs +418 -0
  256. package/scripts/ui/admin-shots.mjs +46 -0
  257. package/scripts/ui/audit-layout.mjs +301 -0
  258. package/scripts/ui/bump-microfont.mjs +39 -0
  259. package/scripts/ui/e2e-interactive.mjs +328 -0
  260. package/scripts/ui/lib.mjs +198 -0
  261. package/scripts/ui/linkcheck2.mjs +37 -0
  262. package/scripts/ui/live-render-check.mjs +72 -0
  263. package/scripts/ui/md-lint.mjs +80 -0
  264. package/scripts/ui/perf-audit.mjs +132 -0
  265. package/scripts/ui/readme-assets.mjs +30 -0
  266. package/scripts/ui/readme-shots.mjs +42 -0
  267. package/scripts/ui/record.mjs +225 -0
  268. package/scripts/ui/seed-admin.mjs +68 -0
  269. package/scripts/ui/seed-demo.mjs +83 -0
  270. package/scripts/ui/seed-industrial-demo.mjs +171 -0
  271. package/scripts/ui/shot-hero.mjs +25 -0
  272. package/scripts/ui/shots.mjs +75 -0
  273. package/scripts/ui/sim-ui-shot.mjs +16 -0
  274. package/scripts/ui/verify-nav.mjs +51 -0
  275. package/scripts/ui/verify-responsive.mjs +285 -0
  276. package/server/api/system/config-groups/[id].patch.ts +1 -1
  277. package/server/api/system/config-groups/index.post.ts +1 -1
  278. package/server/api/system/settings/events.get.ts +1 -1
  279. package/server/api/system/settings/index.patch.ts +1 -1
  280. package/server/api/workshop/agent-tools/invoke.post.ts +16 -2
  281. package/server/api/workshop/aml/datasets/[id].get.ts +8 -1
  282. package/server/api/workshop/daq/index.get.ts +3 -1
  283. package/server/api/workshop/daq/infra/reconnect.post.ts +1 -1
  284. package/server/api/workshop/daq/templates/[key].delete.ts +1 -0
  285. package/server/api/workshop/daq/templates/[key].patch.ts +1 -0
  286. package/server/api/workshop/daq/templates/index.post.ts +1 -0
  287. package/server/api/workshop/dcw/[id]/write.post.ts +10 -2
  288. package/server/api/workshop/dcw/[id].delete.ts +5 -2
  289. package/server/api/workshop/dcw/index.get.ts +5 -0
  290. package/server/api/workshop/dcw/lines/[id].patch.ts +1 -1
  291. package/server/api/workshop/dcw/params/[id]/read.post.ts +17 -0
  292. package/server/api/workshop/dcw/params/[id]/write.post.ts +21 -0
  293. package/server/api/workshop/dcw/params/[id].delete.ts +19 -0
  294. package/server/api/workshop/dcw/params/[id].patch.ts +23 -0
  295. package/server/api/workshop/dcw/params/index.get.ts +27 -0
  296. package/server/api/workshop/dcw/params/index.post.ts +25 -0
  297. package/server/api/workshop/permissions/index.get.ts +3 -1
  298. package/server/plugins/aw-plugins.ts +23 -10
  299. package/server/plugins/dev-stability-guard.ts +3 -1
  300. package/server/plugins/system-config.ts +6 -1
  301. package/server/plugins-builtin/serial-bridge/client.mjs +210 -0
  302. package/server/plugins-builtin/serial-bridge/drivers.mjs +409 -0
  303. package/server/plugins-builtin/serial-bridge/i18n.json +62 -0
  304. package/server/plugins-builtin/serial-bridge/index.mjs +247 -0
  305. package/server/plugins-builtin/serial-bridge/lib.mjs +208 -0
  306. package/server/plugins-builtin/serial-bridge/rtu.mjs +168 -0
  307. package/server/services/system-config.ts +28 -9
  308. package/server/services/workshop/agents/adapters/one-shot-cli-agent.ts +2 -1
  309. package/server/services/workshop/agents/agent-interface.ts +8 -6
  310. package/server/services/workshop/agents/base-agent.ts +18 -4
  311. package/server/services/workshop/agents/claude-agent.ts +7 -3
  312. package/server/services/workshop/agents/codex-agent.ts +3 -3
  313. package/server/services/workshop/agents/dsh-agent.ts +3 -3
  314. package/server/services/workshop/agents/goose-agent.ts +0 -1
  315. package/server/services/workshop/agents/harness-terminal.ts +14 -1
  316. package/server/services/workshop/agents/hermes-agent.ts +4 -2
  317. package/server/services/workshop/agents/host-tool-bridge.ts +5 -1
  318. package/server/services/workshop/agents/industrial-context.ts +4 -1
  319. package/server/services/workshop/agents/industrial-tools.ts +164 -6
  320. package/server/services/workshop/agents/omp-agent.ts +15 -9
  321. package/server/services/workshop/agents/opencode-agent.ts +47 -21
  322. package/server/services/workshop/agents/qwen-agent.ts +10 -5
  323. package/server/services/workshop/aml/entity.ts +3 -1
  324. package/server/services/workshop/aml/python-runtime.ts +3 -2
  325. package/server/services/workshop/daq/bus/mqtt.adapter.ts +8 -4
  326. package/server/services/workshop/daq/daq-controller.ts +25 -5
  327. package/server/services/workshop/daq/daq-runtime.ts +5 -3
  328. package/server/services/workshop/daq/drivers.ts +141 -11
  329. package/server/services/workshop/daq/host-ports.ts +3 -2
  330. package/server/services/workshop/daq/storage/timescale.adapter.ts +3 -1
  331. package/server/services/workshop/db/channel.repo.ts +4 -0
  332. package/server/services/workshop/db/ops.repo.ts +5 -2
  333. package/server/services/workshop/db/retention.ts +8 -3
  334. package/server/services/workshop/dcw/dcw-controller.ts +147 -16
  335. package/server/services/workshop/dcw/dcw-product.repo.ts +38 -1
  336. package/server/services/workshop/dcw/dcw-runtime.ts +3 -2
  337. package/server/services/workshop/dcw/drivers.ts +90 -4
  338. package/server/services/workshop/dcw/param-conversion.ts +78 -0
  339. package/server/services/workshop/dcw/param-limits.ts +142 -0
  340. package/server/services/workshop/dcw/param-map.repo.ts +305 -0
  341. package/server/services/workshop/dcw/plugin-bridge.ts +45 -0
  342. package/server/services/workshop/dcw/recipe-rollback-manager.ts +13 -7
  343. package/server/services/workshop/plugins/host.mjs +30 -0
  344. package/server/services/workshop/runtime/agent-runtime.ts +4 -0
  345. package/server/services/workshop/runtime/manager.ts +9 -2
  346. package/server/services/workshop/settings.ts +4 -2
  347. package/server/types/pg.d.ts +49 -0
  348. package/server/utils/stability-severity.ts +13 -2
  349. package/shared/config/groups.mjs +22 -1
  350. package/shared/config/home.d.mts +28 -0
  351. package/shared/daq-protocol.ts +15 -0
  352. package/shared/dcw-protocol.ts +136 -0
  353. package/uno.config.ts +12 -1
  354. package/.output/public/_nuxt/8NMOXZOV.js +0 -1
  355. package/.output/public/_nuxt/BFkgkW8u.js +0 -4
  356. package/.output/public/_nuxt/C5gUkRwn.js +0 -1
  357. package/.output/public/_nuxt/CM12FuB42.js +0 -1
  358. package/.output/public/_nuxt/CZiw7sEV.js +0 -1
  359. package/.output/public/_nuxt/Cc_9VzD42.js +0 -1
  360. package/.output/public/_nuxt/CdPzkOMV.js +0 -1
  361. package/.output/public/_nuxt/CmsOtOAA2.js +0 -1
  362. package/.output/public/_nuxt/D1YDxZpZ.js +0 -1
  363. package/.output/public/_nuxt/D20Yamr4.js +0 -1
  364. package/.output/public/_nuxt/DAe0h2MB.js +0 -1
  365. package/.output/public/_nuxt/DmqknNvV.js +0 -18
  366. package/.output/public/_nuxt/DnUuIR83.js +0 -1
  367. package/.output/public/_nuxt/S_fVQwJK.js +0 -1
  368. package/.output/public/_nuxt/TownView.0oLiQgTC.css +0 -1
  369. package/.output/public/_nuxt/_id_.D-SYuyZb.css +0 -1
  370. package/.output/public/_nuxt/_id_.hma_BU6T.css +0 -1
  371. package/.output/public/_nuxt/_wsId_.B12v3PhY.css +0 -1
  372. package/.output/public/_nuxt/agents.BV70ioCv.css +0 -1
  373. package/.output/public/_nuxt/ahgEJu2R.js +0 -1
  374. package/.output/public/_nuxt/aml.COEKNNqK.css +0 -1
  375. package/.output/public/_nuxt/builds/meta/4457d63f-0866-4cea-b320-04a321f24795.json +0 -1
  376. package/.output/public/_nuxt/channel-templates.C-M5nKcC.css +0 -1
  377. package/.output/public/_nuxt/daq.B3265ZDn.css +0 -1
  378. package/.output/public/_nuxt/dcw.DLYZqEhT.css +0 -1
  379. package/.output/public/_nuxt/default.BXI_fZUi.css +0 -1
  380. package/.output/public/_nuxt/entry.BB-Eeh-J.css +0 -1
  381. package/.output/public/_nuxt/logs.CqFyMrJw.css +0 -1
  382. package/.output/public/_nuxt/monitor.B--1dPzs.css +0 -1
  383. package/.output/public/_nuxt/pages.ooEzrMm9.css +0 -1
  384. package/.output/public/_nuxt/permissions.B1pjGChZ.css +0 -1
  385. package/.output/public/_nuxt/plugins.5e5chZ67.css +0 -1
  386. package/.output/public/_nuxt/pz2JDAM7.js +0 -2
  387. package/.output/public/_nuxt/settings.Dm3M0RLy.css +0 -1
  388. package/.output/public/_nuxt/teams.BC75EGnR.css +0 -1
  389. package/.output/public/_nuxt/tokens.xRb1fSPU.css +0 -1
  390. package/.output/public/_nuxt/users.CXnP2E08.css +0 -1
  391. package/.output/public/_nuxt/workshop.Jk5HxWPE.css +0 -1
  392. package/.output/server/chunks/build/TownView-jVazYOjN.mjs.map +0 -1
  393. package/.output/server/chunks/build/_id_-CfVosNg3.mjs.map +0 -1
  394. package/.output/server/chunks/build/_id_-Hwr4rZpr.mjs.map +0 -1
  395. package/.output/server/chunks/build/agents-Bvin73QY.mjs.map +0 -1
  396. package/.output/server/chunks/build/daq-C03Uu5UE.mjs.map +0 -1
  397. package/.output/server/chunks/build/pages-BO7yZsXA.mjs.map +0 -1
  398. package/.output/server/chunks/build/settings-DoQ2Oq3P.mjs.map +0 -1
  399. package/.output/server/chunks/build/teams-2kz3CusY.mjs.map +0 -1
  400. package/.output/server/chunks/build/town-BOl6hs9B.mjs.map +0 -1
  401. package/.output/server/chunks/build/useDaqStream-CIBaiGAl.mjs.map +0 -1
  402. package/.output/server/chunks/build/useDcwStream-CBbiYnWe.mjs.map +0 -1
  403. package/.output/server/chunks/build/workspaces-BuydxM-3.mjs.map +0 -1
  404. /package/.output/public/_nuxt/{36oeS8_R2.js → 36oeS8_R.js} +0 -0
  405. /package/.output/public/_nuxt/{CYWVXZTS.js → CYWVXZTS2.js} +0 -0
@@ -28,7 +28,18 @@
28
28
  export const SOCKET_NOISE = /ECONNRESET|EPIPE|ECONNABORTED|ETIMEDOUT|ERR_STREAM_PREMATURE_CLOSE|ERR_STREAM_WRITE_AFTER_END/
29
29
 
30
30
  /** 外部设备/上游不可达(运维常态,非程序缺陷) */
31
- export const UPSTREAM_UNREACHABLE = /ECONNREFUSED|ENOTFOUND|EHOSTUNREACH|ENETUNREACH|ERR_SOCKET_CONNECTION_TIMEOUT|UND_ERR_CONNECT_TIMEOUT/
31
+ export const UPSTREAM_UNREACHABLE = /ECONNREFUSED|ENOTFOUND|EHOSTUNREACH|ENETUNREACH|ERR_SOCKET_CONNECTION_TIMEOUT|UND_ERR_CONNECT_TIMEOUT/i
32
+
33
+ /**
34
+ * 人类可读的"设备不可达"文本兜底。
35
+ *
36
+ * 修复动因(实测事故):部分工业驱动库(Modbus/OPC UA 客户端)在链路超时时
37
+ * **不抛 errno code**,只给可读 message("TCP Connection Timed Out")。
38
+ * 旧实现只认 errno token / ERR_SOCKET_CONNECTION_TIMEOUT,该 message 一路落到
39
+ * `fatal` → 整个生产实例 exit 1(实测 13 分钟内即发生一次),与守卫自述的
40
+ * "设备下电/模拟器未启不该带走平台"直接矛盾。
41
+ */
42
+ export const UPSTREAM_UNREACHABLE_TEXT = /TCP Connection Timed Out|connection timed out|connect(?:ion)? timeout|socket hang ?up/i
32
43
 
33
44
  /** SQLite 忙/锁(hardening ST-1) */
34
45
  export const SQLITE_BUSY = /SQLITE_BUSY|SQLITE_LOCKED|database is locked/i
@@ -58,7 +69,7 @@ export function classifyFatalCandidate(reason: unknown): FatalSeverity {
58
69
 
59
70
  if (SOCKET_NOISE.test(text)) return 'socket'
60
71
  if (SQLITE_BUSY.test(text)) return 'db-busy'
61
- if (UPSTREAM_UNREACHABLE.test(text)) return 'upstream'
72
+ if (UPSTREAM_UNREACHABLE.test(text) || UPSTREAM_UNREACHABLE_TEXT.test(text)) return 'upstream'
62
73
  // 引擎边界只看首行:避免 stack 里偶然出现的引擎名把真实错误降级
63
74
  const head = describeReason(reason).split('\n')[0] ?? ''
64
75
  if (ENGINE_BOUNDARY.test(head)) return 'engine'
@@ -47,12 +47,31 @@ export function defaultPluginGroupId(pluginName) {
47
47
 
48
48
  const ID_RE = /^[A-Za-z0-9_-]{1,48}$/
49
49
 
50
+ /**
51
+ * 配置分组(与 server/services/system-config.ts 的 ConfigGroup 同形的数据形状)。
52
+ * order 可为空:持久化条目/插件声明未写 order 时由 mergeGroups 沿用内置声明顺序兜底,
53
+ * 故这里如实声明为可选(消费侧一律按「可能没有 order」处理)。
54
+ * @typedef {object} ConfigGroupDef
55
+ * @property {string} id
56
+ * @property {string} label
57
+ * @property {string} [labelKey]
58
+ * @property {string} description
59
+ * @property {number} [order]
60
+ * @property {boolean} collapsed
61
+ * @property {boolean} collapsible
62
+ * @property {string} icon
63
+ * @property {'builtin' | 'user' | 'plugin'} source
64
+ * @property {string} [plugin] source=plugin 时的插件名
65
+ */
66
+
50
67
  /**
51
68
  * 规范化分组定义。
52
69
  * order 只在「显式给出」或调用方提供 fallbackOrder(新建分组时)才落值 ——
53
70
  * 从磁盘读回的旧条目若没写 order,交给 mergeGroups 沿用内置声明顺序,
54
71
  * 否则会平白跳到列表末尾。
55
- * @returns {{ ok: true, group: object } | { ok: false, error: string }}
72
+ * @param {object} def 待规范化的分组定义(id/label/description/order/collapsed/collapsible/icon/labelKey)
73
+ * @param {{ source?: 'builtin' | 'user' | 'plugin', plugin?: string | null, fallbackOrder?: number }} [opts]
74
+ * @returns {{ ok: true, group: ConfigGroupDef } | { ok: false, error: string }}
56
75
  */
57
76
  export function normalizeGroup(def, { source = 'user', plugin = null, fallbackOrder } = {}) {
58
77
  const d = def ?? {}
@@ -101,6 +120,7 @@ export function saveGroups(groups, groupsPath) {
101
120
  return payload
102
121
  }
103
122
 
123
+ /** @returns {ConfigGroupDef[]} 规范化后的持久化分组(非法条目直接丢弃) */
104
124
  export function readGroups(groupsPath) {
105
125
  if (!existsSync(groupsPath)) return []
106
126
  const out = []
@@ -141,6 +161,7 @@ export function builtinGroupOrder(descriptors = []) {
141
161
  * @param {Array} o.persisted 持久化分组(含管理员定制)
142
162
  * @param {Array} o.pluginGroups 本轮插件声明的分组
143
163
  * @param {Map<string,string>} [o.pluginLabelById] 插件名 → 展示名(用于自动生成组标题)
164
+ * @returns {ConfigGroupDef[]} 有序分组(已按 order、id 排序)
144
165
  */
145
166
  export function mergeGroups({ descriptors = [], persisted = [], pluginGroups = [], pluginLabelById = new Map() } = {}) {
146
167
  const out = new Map()
@@ -11,6 +11,9 @@ export declare function isRepoRoot(dir: string | null | undefined): boolean
11
11
  /** 从指定目录向上找项目检出根;找不到返回 null */
12
12
  export declare function findRepoRoot(startDir?: string): string | null
13
13
 
14
+ /** 从指定目录向上找项目级配置根(<dir>/.AgentWorkShop 真实存在);找不到返回 null */
15
+ export declare function findLocalConfigRoot(startDir?: string): string | null
16
+
14
17
  export interface RunModeInfo {
15
18
  mode: 'repo' | 'home'
16
19
  root: string | null
@@ -36,13 +39,38 @@ export declare function dataDirFor(cwd?: string, env?: NodeJS.ProcessEnv): strin
36
39
  /** 确保数据目录存在 + 旧位置(cwd/data、cwd/server/data)运行时文件迁入配置根(幂等) */
37
40
  export declare function ensureDataDir(cwd?: string, env?: NodeJS.ProcessEnv): string
38
41
 
42
+ export interface AmlRootInfo {
43
+ /** AML 数据根绝对路径 */
44
+ dir: string
45
+ /** 解析来源:AW_AML_DIR > repo 模式检出根 > home 模式配置根 > cwd 兜底 */
46
+ mode: 'env' | 'repo' | 'home' | 'cwd'
47
+ /** mode=repo 时的检出根;其余为 null */
48
+ projectRoot: string | null
49
+ }
50
+
51
+ /** 解析 AML 数据根(AW_AML_DIR > 检出根/aml > 配置根/aml > cwd/aml) */
52
+ export declare function resolveAmlRoot(opts?: {
53
+ cwd?: string
54
+ env?: NodeJS.ProcessEnv
55
+ }): AmlRootInfo
56
+
57
+ /** AML 数据根绝对路径(仅解析,不创建) */
58
+ export declare function amlDirFor(cwd?: string, env?: NodeJS.ProcessEnv): string
59
+
60
+ /** 确保 AML 数据根存在并落标准子目录骨架(幂等);返回该根路径 */
61
+ export declare function ensureAmlDir(cwd?: string, env?: NodeJS.ProcessEnv): string
62
+
39
63
  declare const _default: {
40
64
  HOME_DIRNAME: string
41
65
  awHome: typeof awHome
42
66
  isRepoRoot: typeof isRepoRoot
43
67
  findRepoRoot: typeof findRepoRoot
68
+ findLocalConfigRoot: typeof findLocalConfigRoot
44
69
  resolveRunMode: typeof resolveRunMode
45
70
  dataDirFor: typeof dataDirFor
46
71
  ensureDataDir: typeof ensureDataDir
72
+ resolveAmlRoot: typeof resolveAmlRoot
73
+ amlDirFor: typeof amlDirFor
74
+ ensureAmlDir: typeof ensureAmlDir
47
75
  }
48
76
  export default _default
@@ -351,6 +351,21 @@ export const DAQ_DRIVERS: DaqDriverMeta[] = [
351
351
  export const daqDriverMeta = (kind: DaqDriverKind): DaqDriverMeta | undefined =>
352
352
  DAQ_DRIVERS.find(d => d.kind === kind)
353
353
 
354
+ /**
355
+ * 驱动目录条目(GET /api/workshop/daq `drivers` 字段):内置 DAQ_DRIVERS 与
356
+ * 协议插件自描述(ctx.daq.registerDriver 携带的 meta)合并后的统一形态。
357
+ * kind 放宽为 string —— 插件可注册任意自定义协议 kind。
358
+ */
359
+ export interface DaqDriverCatalogEntry {
360
+ kind: string
361
+ label: string
362
+ status: 'builtin' | 'real' | 'planned'
363
+ /** 连接参数表单 schema(前端动态渲染;插件驱动经 meta.configFields 自描述) */
364
+ configFields: DriverConfigField[]
365
+ /** true = 来自协议插件(前端展示「插件」徽标;热重载/停用随宿主收敛) */
366
+ plugin?: boolean
367
+ }
368
+
354
369
  /** 连接测试结果(REST/前端向导共用) */
355
370
  export interface DriverTestResult {
356
371
  ok: boolean
@@ -322,6 +322,135 @@ export interface AepDcwControllerState {
322
322
  // Product 产品 + Recipe 配方(产品-配方-批次三级隔离)
323
323
  // ============================================================
324
324
 
325
+ // ============================================================
326
+ // 工艺参数映射(Process Parameter Map)—— 参数语义面 ↔ PLC 执行点
327
+ // ============================================================
328
+
329
+ /** 工艺参数写入限界(单侧可空;缺省侧不约束) */
330
+ export interface ParamLimitRange {
331
+ min?: number
332
+ max?: number
333
+ }
334
+
335
+ // ============================================================
336
+ // 工艺参数 → PLC 标准转换模式(映射配置期一次性选定)
337
+ // ============================================================
338
+
339
+ /**
340
+ * 标准转换模式 —— 工程量 ↔ PLC 原始数据的双向换算规约。
341
+ * 配置映射时选定一次,运行期系统按此自动双向换算(下发 encode / 回读 decode),
342
+ * 用户与 Agent 全程只面对工程量纲,不接触寄存器数据格式。
343
+ */
344
+ export interface ParamConversion {
345
+ /**
346
+ * float32 原始值=工程值,float32 寄存器直写(最常见)
347
+ * int16-scaled 线性标定到 int16(1 寄存器):eng∈[engMin,engMax] ↔ raw∈[rawMin,rawMax],
348
+ * 如 0.1 分辨率温度: eng 0~300 ↔ raw 0~3000
349
+ * int32-scaled 线性标定到 int32(2 寄存器),同上
350
+ */
351
+ mode: 'float32' | 'int16-scaled' | 'int32-scaled'
352
+ /** 字节序(缺省 big 大端 AB CD;wordSwap = 字交换) */
353
+ byteOrder?: 'big' | 'little' | 'wordSwap'
354
+ /** 线性标定工程量程(int16/int32-scaled 必填;float32 忽略) */
355
+ engMin?: number
356
+ engMax?: number
357
+ /** 线性标定原始值量程(int16/int32-scaled 必填) */
358
+ rawMin?: number
359
+ rawMax?: number
360
+ }
361
+
362
+ /**
363
+ * 映射接入规格(创建映射时一次性给定):设备连接 + 寄存器 + 标准转换模式。
364
+ * 系统据此自动生成执行节点(驱动配置由转换模式展开,用户不手工拼装)。
365
+ */
366
+ export interface ParamAccessSpec {
367
+ /** 驱动类别(缺省 modbus-tcp) */
368
+ driver?: 'modbus-tcp' | 'modbus-rtu'
369
+ /** 设备地址(PLC/网关 IP) */
370
+ host: string
371
+ /** 端口(modbus-tcp 缺省 502;rtu 网关常见 502/8899/26) */
372
+ port?: number
373
+ /** 从站地址(缺省 1) */
374
+ unitId?: number
375
+ /** 写寄存器地址(4xxxx 保持寄存器;回读同址校验) */
376
+ register: number
377
+ /** 标准转换模式(必选) */
378
+ conversion: ParamConversion
379
+ }
380
+
381
+ /**
382
+ * 工艺参数映射视图 —— 用户/Agent 读写工艺参数的唯一语义面。
383
+ *
384
+ * 一条映射 = 一个工艺参数(key/单位/基准限界) → 一个写控制执行节点。
385
+ * PLC 寻址细节(寄存器地址/数据类型/字节序/工程量换算)全部封装在执行节点的
386
+ * 驱动配置内,参数面只暴露工程量纲 —— 用户与 Agent 永远不直接面对 PLC 寄存器。
387
+ */
388
+ export interface DcwParamView {
389
+ id: string
390
+ /** 参数键(执行节点所属产线内唯一;产品限界与 Agent 语义寻址的稳定标识) */
391
+ key: string
392
+ name: string
393
+ /** 语义模板(分类/图标/Agent 工艺语义) */
394
+ templateRef: string
395
+ unit: string
396
+ decimals: number
397
+ /** 基准写入限界(常驻层,叠加于节点安全量程;null = 该侧不额外约束) */
398
+ min: number | null
399
+ max: number | null
400
+ /** PLC 执行节点(映射目标) */
401
+ nodeId: string
402
+ /** 执行节点所属产线(派生自节点;'' = 未分配) */
403
+ lineId: string
404
+ /** 驱动类别(仅类别;不含寄存器等寻址细节) */
405
+ driver: DcwDriverKind
406
+ enabled: boolean
407
+ /** 当前设定值 / PLC 读数(自执行节点投影) */
408
+ value: number | null
409
+ readValue: number | null
410
+ state: DcwNodeState
411
+ /** 标准转换模式摘要(配置期选定;展示/审计用,运行期换算以执行节点驱动配置为准) */
412
+ conversion?: ParamConversion
413
+ createdAt: string
414
+ }
415
+
416
+ /** 工艺参数映射创建/编辑载荷(nodeId 为映射目标;其余为参数语义面) */
417
+ export interface DcwParamInput {
418
+ key?: string
419
+ name?: string
420
+ templateRef?: string
421
+ unit?: string
422
+ decimals?: number
423
+ min?: number | null
424
+ max?: number | null
425
+ nodeId?: string
426
+ /** 仅创建:给定接入规格时系统自动创建执行节点(连接+寄存器+标准转换模式一键建映射) */
427
+ access?: ParamAccessSpec
428
+ /** 仅创建(access 路径):新执行节点挂载的产线 */
429
+ lineId?: string
430
+ /** 标准转换模式摘要(记录配置期选定的换算规约;展示/审计用) */
431
+ conversion?: ParamConversion
432
+ }
433
+
434
+ /** 单层写入限界(来源标注;min/max null = 该侧不约束) */
435
+ export interface ParamLimitLayer {
436
+ layer: 'node' | 'param' | 'product' | 'recipe'
437
+ /** 人话标签(如 产品「XX」限界) */
438
+ label: string
439
+ min: number | null
440
+ max: number | null
441
+ }
442
+
443
+ /** 有效写入限界(分层展示 + 交集;联锁拒绝信息/参数台账/前端展示共用) */
444
+ export interface ParamLimitsBreakdown {
445
+ nodeId: string
446
+ paramId: string | null
447
+ paramKey: string | null
448
+ /** 生效中的限界层(按 node→param→product→recipe 顺序) */
449
+ layers: ParamLimitLayer[]
450
+ /** 各层交集(最紧有效限界;恒有 node 层兜底) */
451
+ effective: { min: number, max: number }
452
+ }
453
+
325
454
  /** 产品(挂载产线;一个产品可有多个配方) */
326
455
  export interface ProductView {
327
456
  id: string
@@ -329,6 +458,9 @@ export interface ProductView {
329
458
  lineId: string
330
459
  name: string
331
460
  description: string
461
+ /** 产品级工艺参数写入限界(键=工艺参数 key;生产本产品期间生效,与其他层取交集;
462
+ * 用户/Agent/配方下发越界一律拒绝) */
463
+ paramLimits?: Record<string, ParamLimitRange>
332
464
  createdAt: string
333
465
  }
334
466
 
@@ -337,6 +469,8 @@ export interface ProductInput {
337
469
  description?: string
338
470
  /** 所属产线(产线隔离顶层归属) */
339
471
  lineId?: string
472
+ /** 产品级工艺参数写入限界(键=工艺参数 key;仅可收窄不可放宽其他层) */
473
+ paramLimits?: Record<string, ParamLimitRange>
340
474
  }
341
475
 
342
476
  /**
@@ -497,6 +631,8 @@ export interface DcwWriteMeta {
497
631
  taskId?: string
498
632
  /** Agent 判定假设(作业环第 3 步声明) */
499
633
  hypothesis?: string
634
+ /** D8 基准消融臂(仅 AW_BENCH_MODE=1 时被 write() 识别;生产模式恒忽略) */
635
+ benchArm?: 'no-interlock' | 'no-readback' | 'ungated'
500
636
  }
501
637
 
502
638
  /** 参数变更锚点(append-only 账本;参数全量在册的最小单元) */
package/uno.config.ts CHANGED
@@ -13,7 +13,18 @@ import {
13
13
  export default defineConfig({
14
14
  presets: [
15
15
  presetUno(),
16
- presetAttributify(),
16
+ // ⚠️ prefixedOnly:只有 `u:` 开头的属性才当工具类。
17
+ //
18
+ // 不加这个开关时,attributify 会去扫描模板里的**原始文本**,把 Vue 的事件绑定
19
+ // 当成属性工具类:本项目有 64 处 `@blur` / `@change` / `@resize` / `@focus`…
20
+ // 于是 `@blur="mentionOpen = false"` 被解析成 blur 工具类,产物里多出
21
+ // `[blur="..."]` 这种垃圾选择器,以及
22
+ // box-shadow: calc(var(--un-ring-offset-shadow), * -1) var(--un-ring-shadow), …
23
+ // —— 一个**语法都不合法**的值,postcss 直接报 lexical error(实测构建告警)。
24
+ //
25
+ // 本项目模板**没有任何**无前缀 attributify 用法(实测 grep `="~` 与裸工具类属性均为 0),
26
+ // 所以收紧为 prefixedOnly 是零代价的:既消掉告警,也消掉一整类误判。
27
+ presetAttributify({ prefixedOnly: true }),
17
28
  presetIcons({
18
29
  scale: 1.2,
19
30
  warn: true,
@@ -1 +0,0 @@
1
- import{Ht as e,S as t,Ut as n,V as r,Vt as i,W as a,b as ee,d as o,dt as s,f as c,h as l,i as u,m as d,nt as f,pt as p,tt as te,xt as m,y as h,z as ne}from"./CSkxz2NX.js";import{c as g,f as _,l as v,s as re}from"./D6uzXueg.js";import{a as ie}from"./C__m4EhR.js";import{t as ae}from"./BHA40aHa.js";import{n as oe}from"./KZQX7xoM.js";import{t as se}from"./DZtm4l-P2.js";import{t as y}from"./BDNMzG2s2.js";import{t as b}from"./D0ZBQrN_2.js";import{t as ce}from"./D1YDxZpZ.js";import{n as le,t as ue}from"./D20Yamr4.js";import{t as de}from"./C3J6FYKa.js";var fe={key:0,class:`page`},pe={class:`banner bad`},me={key:1,class:`page`},he={class:`aw-page-head`},ge={class:`aw-kicker`},_e={class:`sub`},ve={class:`badges mono`},ye={class:`badge`},be={class:`badge`},xe={class:`badge`},Se={class:`aw-tile ctrl-card`},Ce={class:`ctrl-left`},we=[`title`],Te={class:`ctrl-right`},Ee={class:`ctrl-metrics mono`},De=[`title`],Oe=[`title`],ke=[`title`],Ae={key:1,class:`aw-tile adopt-card`},je={class:`adopt-title`},Me={class:`adopt-list`},Ne=[`onClick`],Pe=[`onClick`],Fe={class:`aw-tile line-card`},Ie={class:`line-status`},Le={class:`line-info`},Re={key:0,class:`mono dim`},ze={key:1,class:`dim`},Be={class:`line-ctl`},Ve={class:`ctl-sel`},He={value:``},Ue=[`value`],We={class:`ctl-sel`},Ge=[`disabled`],Ke={value:``},qe=[`value`,`disabled`],Je=[`disabled`,`title`],Ye=[`disabled`],Xe={key:0,class:`banner bad`,style:{"margin-top":`10px`}},Ze={key:1,class:`banner good`,style:{"margin-top":`10px`}},Qe={class:`modal`},$e={class:`m-title`},et={class:`dim mono`},tt={class:`dim tpl-hint`},nt={class:`tpl-chips`},rt=[`title`],it={class:`mono`},at={class:`sec-label`},ot={class:`f-grid tpl-form`},st={class:`f`},ct=[`placeholder`],lt={class:`f`},ut=[`placeholder`],dt={class:`f`},ft={class:`f`},pt={class:`f`},mt=[`placeholder`],ht={class:`f`},gt=[`placeholder`],_t={class:`f`},vt={class:`f`},yt=[`value`],bt={class:`f`},xt=[`placeholder`],St={key:0,class:`banner good`,style:{"margin-top":`10px`}},Ct={key:1,class:`m-err`},wt={class:`m-actions`},Tt=[`disabled`],Et={class:`modal`},Dt={class:`m-title`},Ot={class:`seg-row`},kt={class:`f-grid`},At={class:`f`},jt=[`value`],Mt={class:`f`},Nt=[`placeholder`],Pt={class:`f`},Ft=[`placeholder`],It={class:`f`},Lt=[`placeholder`],Rt={class:`f-grid cal-form`},zt={class:`f`},Bt={value:`none`},Vt={class:`f`},Ht={style:{display:`flex`,gap:`6px`}},Ut=[`disabled`],Wt=[`disabled`],Gt={class:`f-grid`},Kt={class:`f`},qt=[`value`],Jt={key:0,class:`f-grid driver-form`},Yt={key:0,style:{color:`var(--tone-danger-dot)`,"font-style":`normal`}},Xt=[`onUpdate:modelValue`],Zt=[`value`],Qt=[`onUpdate:modelValue`,`type`,`placeholder`],$t={key:2,class:`hint`},en={class:`test-row`},tn=[`disabled`],nn={class:`f`},rn=[`placeholder`],an={key:1,class:`m-err`},on={class:`m-actions`},sn=[`disabled`],cn={class:`aw-tile table-card`},ln={class:`nodes-table`},un={class:`right`},dn={class:`mono dim`},fn={class:`mono ch`},pn=[`disabled`,`title`,`onClick`],mn={key:0,class:`st-pill paused`},hn={class:`mono val`},gn={key:0,class:`dim`},_n={class:`mono val`},vn=[`title`],yn={key:0,class:`dim`},bn=[`disabled`,`title`,`onClick`],xn={class:`write-row`},Sn=[`onUpdate:modelValue`,`placeholder`,`min`,`max`,`step`,`disabled`,`title`],Cn=[`disabled`,`title`,`onClick`],wn={class:`mono dim`},Tn={class:`mono`},En=[`title`],Dn={class:`right`},On=[`onClick`],kn={key:0},An={colspan:`9`},jn={class:`pane-empty`,style:{"min-height":`120px`}},Mn={class:`pe-sub`},Nn={class:`aw-tile recipe-card`},Pn={class:`recipe-hd`},Fn={class:`panel-tag mono`},In={class:`recipe-sub`},Ln={key:0,class:`product-row`},Rn=[`title`,`onClick`],zn=[`title`,`onClick`],Bn={key:1,class:`dim`,style:{margin:`6px 0 12px`,"font-size":`12px`}},Vn={class:`recipe-grid`},Hn={class:`recipe-name`},Un=[`title`],Wn={class:`dim`},Gn={class:`mono dim`},Kn={key:0,class:`dim desc`},qn={class:`recipe-params mono`},Jn=[`title`],Yn={key:0,class:`chip-stale-tag`},Xn=[`title`],Zn={key:0,class:`chip-stale-tag`},Qn={class:`recipe-actions`},$n=[`onClick`],er=[`onClick`],tr=[`onClick`],nr={key:0,class:`mono`},rr=[`onClick`],ir={key:0,class:`pane-empty`,style:{"grid-column":`1 / -1`}},ar={key:2,class:`banner good`},or=[`disabled`],sr={key:3,class:`runs`},cr={class:`sec-label`},lr={class:`nodes-table`},ur={class:`right`},dr={class:`mono`},fr={class:`mono dim`},pr={class:`right`},mr=[`disabled`,`onClick`],hr=[`onClick`],gr={class:`modal`},_r={class:`m-title`},vr={class:`sec-label`},yr={class:`nodes-table`},br={class:`mono dim`},xr={class:`mono`},Sr={class:`mono`},Cr={class:`mono dim`},wr={class:`mono dim`},Tr={key:0},Er={colspan:`6`,class:`dim`,style:{"text-align":`center`,padding:`12px`}},Dr={class:`sec-label`},Or={class:`nodes-table`},kr={class:`mono`},Ar={class:`mono dim`},jr={class:`mono dim`},Mr={key:0},Nr={colspan:`6`,class:`dim`,style:{"text-align":`center`,padding:`12px`}},Pr={class:`m-actions`},Fr={class:`modal`},Ir={class:`m-title`},Lr={class:`f-grid`},Rr={class:`f`},zr=[`value`],Br={class:`f`},Vr=[`placeholder`],Hr={class:`f`},Ur=[`placeholder`],Wr={class:`sec-label`},Gr={class:`f`},Kr=[`onUpdate:modelValue`],qr=[`value`],Jr={key:0,class:`row-stale`},Yr={class:`f`},Xr=[`onUpdate:modelValue`],Zr={class:`f`},Qr=[`onUpdate:modelValue`,`placeholder`],$r={class:`f`},ei=[`onUpdate:modelValue`,`placeholder`],ti=[`onClick`],ni={class:`sec-label`},ri={class:`f`},ii=[`onUpdate:modelValue`],ai=[`value`],oi={class:`f`},si=[`onUpdate:modelValue`],ci={class:`f`},li=[`onUpdate:modelValue`],ui=[`onClick`],di=[`disabled`,`title`],fi={key:0,class:`m-note`},pi={key:1,class:`m-err`},mi={class:`m-actions`},hi=[`disabled`],gi={class:`modal`,style:{"max-width":`760px`}},_i={class:`modal-head`},vi={key:0,class:`dim`,style:{"margin-left":`8px`,"font-size":`12px`}},yi={key:0,class:`banner good`,style:{margin:`6px 0`}},bi={key:1,class:`dim`},xi={key:2,class:`pane-empty`},Si={class:`ver-head`},Ci={class:`mono ver-v`},wi={class:`mono dim`},Ti={class:`ver-actor`},Ei=[`onClick`],Di={key:0,class:`ver-desc`},Oi={class:`ver-diff mono`},ki={class:`aw-tile query-card`},Ai={class:`sec-label`},ji={class:`q-grid`},Mi={class:`f`},Ni={value:``},Pi=[`value`],Fi={class:`f`},Ii=[`disabled`],Li={value:``},Ri=[`value`],zi={class:`f`},Bi={value:``},Vi=[`value`],Hi={class:`f`},Ui={value:``},Wi=[`value`],Gi={class:`f`},Ki={class:`f`},qi={class:`f q-actions`},Ji=[`disabled`],Yi={key:0,class:`banner bad`,style:{"margin-top":`8px`}},Xi={key:1,class:`q-result`},Zi={class:`nodes-table`},Qi={class:`mono dim`},$i={class:`mono`},ea={class:`mono`},ta={class:`mono`},na={class:`mono dim`},ra={key:6,class:`aw-tile table-card`},ia={class:`sec-label`},aa={class:`nodes-table`},oa={class:`mono dim`},sa={class:`mono`},ca={class:`mono dim`},la={class:`dim`},ua={class:`modal`},da={class:`m-title`},fa={class:`f-grid`},pa={class:`f`},ma=[`placeholder`],ha={class:`f`},ga=[`placeholder`],_a={key:0,class:`m-err`},va={class:`m-actions`},ya=[`disabled`],ba={key:8,class:`err`},xa={class:`aw-tile ledger-card`},Sa={class:`ledger-head`},Ca={value:``},wa=[`value`],Ta={class:`ledger-tri`},Ea={class:`tri-cell`},Da={class:`mono`},Oa={class:`tri-cell`},ka={class:`mono`},Aa={class:`tri-cell`},ja={class:`mono`},Ma={class:`ledger-cols`},Na={class:`ledger-col`},Pa={class:`sec-t`},Fa={class:`ledger-list mono`},Ia={class:`ledger-col`},La={class:`sec-t`},Ra={class:`ledger-list`},za={class:`mono`},Ba=y(t({__name:`[id]`,setup(t){let{t:y}=oe(),Ba=ie(),x=ue(),Va=ce(),Ha=de();Va.load();let S=o(()=>String(Ba.params.id??``)),Ua=o(()=>x.lines.find(e=>e.id===S.value)),C=o(()=>x.lineStateOf(S.value));x.load();let Wa=x.ensureWsFeed();ne(()=>Wa());let Ga=e=>(e.deviceIds??(e.deviceBindingId?[e.deviceBindingId]:[])).map(e=>Ka(e)).join(` / `)||`—`,Ka=e=>e?Ha.twins.find(t=>t.id===e)?.name??e:y(`dcwDetail.k3own4q121`),qa={idle:y(`dcwDetail.k3zgkk122`),writing:y(`dcwDetail.k3l3h80123`),ok:`已 ACK`,error:y(`dcwDetail.k40reu124`),offline:y(`dcwDetail.k44c2n125`)};function Ja(e){let t=e??``;return x.templates.find(e=>e.key===(t.startsWith(`dcw-`)?t.slice(4):t))?.ch??t}function Ya(e){return x.nodeById(e)?.min}function Xa(e){return x.nodeById(e)?.max}let w=o(()=>Va.nodes.filter(e=>e.lineId===S.value)),T=p(``),E=p(null),Za=p(!1);async function Qa(){if(T.value){Za.value=!0;try{E.value=await x.fetchLedger(T.value)}finally{Za.value=!1}}}async function $a(){T.value&&(await x.rollbackNode(T.value),await Qa())}function eo(e){return Va.nodeById(e)?.name??e}let D=o(()=>x.nodes.filter(e=>e.lineId===S.value)),O=o(()=>x.products.filter(e=>e.lineId===S.value)),to=o(()=>x.recipes.filter(e=>e.lineId===S.value)),no=o(()=>x.runs.filter(e=>e.lineId===S.value)),ro=o(()=>{let e=new Set(D.value.map(e=>e.id));return x.history.filter(t=>e.has(t.nodeId))}),io=o(()=>x.nodes.filter(e=>!e.lineId)),ao=o(()=>x.products.filter(e=>!e.lineId));async function oo(e){await x.patchNode(e,{lineId:S.value});let t=x.nodeById(e);t&&(t.lineId=S.value)}async function so(e){await x.updateProduct(e,{lineId:S.value}),await x.load()}let k=s({}),co=p(``),A=p(``),lo=p(``);async function uo(e,t){co.value=e,A.value=``,lo.value=``;try{let n=await x.write(e,t);n.ok?(lo.value=y(`dcwDetail.k1alcbyu182`,{p0:x.nodeById(e)?.name??e,p1:n.message}),k[e]=``):A.value=y(`dcwDetail.kl1e9x9183`,{p0:x.nodeById(e)?.name??e,p1:n.message})}catch(e){A.value=b(e)}finally{co.value=``}}let fo=p(``);async function po(e){fo.value=e,A.value=``;try{await x.readNode(e)}catch(e){A.value=b(e)}finally{fo.value=``}}let mo=p(``);async function ho(e,t){mo.value=e,A.value=``;try{await x.patchNode(e,{enabled:t});let n=x.nodeById(e);n&&(n.enabled=t,t?n.state===`offline`&&(n.state=`idle`):n.state=`offline`)}catch(e){A.value=b(e)}finally{mo.value=``}}let go=p(!1),_o=p(`mock`),vo=p(x.templates[0]?.key??``),j=p(`mock`),yo=p(``),bo=p(null),xo=p(null),M=p({}),N=s({kind:`none`,scale:1,offset:0}),So=p(``),Co=p(!1),P=p(null),wo=p(!1),To=p(``),Eo=o(()=>le.find(e=>e.kind===j.value)),Do=o(()=>Eo.value?.configFields??[]);function Oo(){let e={};for(let t of Do.value)t.default!==void 0&&(e[t.key]=t.default);M.value=e,P.value=null}Oo();async function ko(){Co.value=!0,P.value=null;try{P.value=await x.testDriver(j.value,M.value)}catch(e){P.value={ok:!1,message:b(e)}}finally{Co.value=!1}}async function Ao(){wo.value=!0,To.value=``;try{for(let e of Do.value)if(e.required&&(M.value[e.key]===void 0||M.value[e.key]===``))throw Error(y(`dcwDetail.k8x1un1184`,{p0:e.label}));let e=N.kind===`linear`?{kind:`linear`,scale:Number(N.scale),offset:Number(N.offset)}:void 0;await x.createFromTemplate(`dcw-${vo.value}`,{name:yo.value.trim()||void 0,driver:j.value,driverConfig:{...M.value},transform:e,holdIntervalMs:bo.value,readIntervalMs:xo.value,lineId:S.value,semantics:So.value.trim()||void 0}),go.value=!1,yo.value=``,So.value=``}catch(e){To.value=b(e)}finally{wo.value=!1}}let jo=p(!1),Mo=p(!1),F=p(``),No=p(``);function Po(){jo.value=!0,F.value=``,No.value=``}let I=s({name:``,ch:``,code:``,unit:``,min:``,max:``,decimals:1,icon:`gateway`,semantics:``}),Fo=[{key:`thermo`,label:y(`dcwDetail.k422b8126`)},{key:`pressure`,label:y(`dcwDetail.k3x6ff127`)},{key:`tension`,label:y(`dcwDetail.k3z9xc128`)},{key:`encoder`,label:y(`dcwDetail.kjb3vhs129`)},{key:`camera`,label:y(`dcwDetail.k47atw130`)},{key:`gateway`,label:y(`dcwDetail.k48c07131`)}];async function Io(){Mo.value=!0,F.value=``,No.value=``;try{if(!I.name.trim())throw Error(y(`dcwDetail.k6ugbw2132`));if(I.unit.trim()===``)throw Error(y(`dcwDetail.kx3pg59133`));if(I.min===``||I.max===``)throw Error(y(`dcwDetail.k13awowo134`));let e=await x.createTemplate({name:I.name.trim(),ch:I.ch.trim()||I.name.trim(),code:I.code.trim()||`CUSTOM`,unit:I.unit.trim(),min:Number(I.min),max:Number(I.max),decimals:Number(I.decimals)||0,icon:I.icon,semantics:I.semantics.trim()||void 0});vo.value=e.key,No.value=y(`dcwDetail.ky4e1tr185`,{p0:e.name}),I.name=``,I.ch=``,I.code=``,I.unit=``,I.min=``,I.max=``,I.semantics=``}catch(e){F.value=b(e)}finally{Mo.value=!1}}let L=p(``),R=p(``),z=p(!1),B=p(``),V=p(``),Lo=o(()=>to.value.filter(e=>e.productId===L.value));async function Ro(){z.value=!0,B.value=``,V.value=``;try{if(!R.value)throw Error(y(`dcwDetail.k1b6qe0r135`));await x.startLine(S.value,R.value),B.value=y(`dcwDetail.k17jteb9186`,{p0:C.value.productName,p1:C.value.recipeName,p2:C.value.runId})}catch(e){V.value=b(e)}finally{z.value=!1}}async function zo(){z.value=!0,B.value=``,V.value=``;try{let e=`${C.value.productName??``} · ${C.value.recipeName??``}`;await x.stopLine(S.value),B.value=y(`dcwDetail.kzl49pd187`,{p0:e})}catch(e){V.value=b(e)}finally{z.value=!1}}let Bo=p(!1),Vo=p(!1),Ho=p(``),H=s({name:``,description:``}),U=p(``);async function Uo(){Vo.value=!0,Ho.value=``;try{let e=await x.createProduct({name:H.name.trim(),description:H.description.trim(),lineId:S.value});L.value=e.id,U.value=e.id,Bo.value=!1,H.name=``,H.description=``}catch(e){Ho.value=b(e)}finally{Vo.value=!1}}let Wo=o(()=>U.value?to.value.filter(e=>e.productId===U.value):to.value),Go=e=>x.products.find(t=>t.id===e)?.name??e;function W(e,t){let n=x.nodes.find(t=>t.id===e);return n?n.enabled?t&&n.lineId!==t?{code:`unbound`,label:y(`dcwDetail.staleUnbound`)}:null:{code:`disabled`,label:y(`dcwDetail.staleDisabled`)}:{code:`deleted`,label:y(`dcwDetail.staleDeleted`)}}function Ko(e){return x.nodes.find(t=>t.id===e)?.name??e}function qo(e,t){let n=Va.nodes.find(t=>t.id===e);return n?n.enabled?t&&n.lineId!==t?{code:`unbound`,label:y(`dcwDetail.staleUnbound`)}:null:{code:`disabled`,label:y(`dcwDetail.staleDisabled`)}:{code:`deleted`,label:y(`dcwDetail.staleDeleted`)}}let Jo=p(!1),G=p(null),Yo=p([]),Xo=p(!1),K=p(``);async function Zo(e){G.value=x.recipes.find(t=>t.id===e)??null,Jo.value=!0,K.value=``,Xo.value=!0;try{Yo.value=await x.recipeVersions(e)}catch(e){K.value=b(e)}finally{Xo.value=!1}}let Qo=e=>e===`agent`?`Agent`:y(e===`system`?`dcwDetail.srcSystem`:`dcwDetail.srcUser`);function $o(e,t){if(t===0)return y(`dcwDetail.histInit`);let n=Yo.value[t-1],r=e.params.map(e=>({p:e,old:n.params.find(t=>t.nodeId===e.nodeId)})).filter(({p:e,old:t})=>!t||t.value!==e.value).map(({p:e,old:t})=>`${x.nodes.find(t=>t.id===e.nodeId)?.name??e.nodeId}: ${t?.value??y(`dcwDetail.histAdded`)} → ${e.value}`);return r.length>0?r.join(`;`):y(`dcwDetail.histNoChange`)}async function es(e){if(G.value){K.value=``;try{let t=await x.revertRecipe(G.value.id,{version:e,reason:y(`dcwDetail.revertReasonUi`)});K.value=y(`dcwDetail.revertOk`,{p0:t.version??0}),Yo.value=await x.recipeVersions(G.value.id)}catch(e){K.value=b(e)}}}let q=s({productId:``,recipeId:``,paramKey:``,nodeId:``,lastMin:30,bucketMs:15e3}),J=p(null),ts=p(!1),ns=p(``);async function rs(){ts.value=!0,ns.value=``,J.value=null;try{J.value=await x.queryLine({lineId:S.value,productId:q.productId||void 0,recipeId:q.recipeId||void 0,paramKey:q.paramKey||void 0,nodeId:q.nodeId||void 0,fromMs:Date.now()-q.lastMin*6e4,toMs:Date.now(),bucketMs:q.bucketMs>0?q.bucketMs:void 0,limit:2e3}),J.value.channels.length===0&&(ns.value=y(`dcwDetail.kszv5sq136`))}catch(e){ns.value=b(e)}finally{ts.value=!1}}let is=o(()=>x.templates.map(e=>e.key)),Y=p(!1),as=p(null),os=p(!1),X=p(``),ss=p(``),Z=s({productId:``,name:``,description:``,params:[],daqWindows:[]}),Q=p(null),$=p(null),cs=p(!1);function ls(){as.value=null,X.value=``,Z.productId=U.value||L.value||O.value[0]?.id||``,Z.name=``,Z.description=``,Z.params=[{nodeId:D.value[0]?.id??``,value:``,min:``,max:``}],Z.daqWindows=[],Y.value=!0}function us(e){let t=x.recipes.find(t=>t.id===e);if(!t)return;as.value=e,X.value=``;let n=t.params.filter(e=>x.nodes.some(t=>t.id===e.nodeId)),r=t.params.length-n.length;ss.value=r>0?y(`dcwDetail.staleDropped`,{p0:r}):``,Z.productId=t.productId,Z.name=t.name,Z.description=t.description,Z.params=n.map(e=>({nodeId:e.nodeId,value:e.value,min:e.min??``,max:e.max??``})),Z.daqWindows=(t.daqWindows??[]).map(e=>({nodeId:e.nodeId,min:e.min??``,max:e.max??``})),Y.value=!0}async function ds(){os.value=!0,X.value=``;try{let e={productId:Z.productId,name:Z.name.trim(),description:Z.description.trim(),params:Z.params.filter(e=>e.nodeId&&e.value!==``&&Number.isFinite(Number(e.value))).map(e=>({nodeId:e.nodeId,value:Number(e.value),...e.min!==``&&Number.isFinite(Number(e.min))?{min:Number(e.min)}:{},...e.max!==``&&Number.isFinite(Number(e.max))?{max:Number(e.max)}:{}})),daqWindows:Z.daqWindows.filter(e=>e.nodeId&&(e.min!==``||e.max!==``)).map(e=>({nodeId:e.nodeId,...e.min!==``&&Number.isFinite(Number(e.min))?{min:Number(e.min)}:{},...e.max!==``&&Number.isFinite(Number(e.max))?{max:Number(e.max)}:{}}))};as.value?await x.updateRecipe(as.value,e):await x.createRecipe(e),Y.value=!1}catch(e){X.value=b(e)}finally{os.value=!1}}async function fs(e){Q.value=null,A.value=``;try{let t=await x.applyRecipe(e),n=t.results.filter(e=>e.ok).length;Q.value={runId:t.id,ok:n,total:t.results.length},n<t.results.length&&(A.value=y(`dcwDetail.ks7szkt188`,{p0:t.results.filter(e=>!e.ok).map(e=>e.message).join(`;`)}))}catch(e){A.value=b(e)}}async function ps(e){cs.value=!0;try{let t=await x.runData(e);$.value={runId:e,data:t}}catch(e){A.value=b(e)}finally{cs.value=!1}}function ms(e){let t=e?.value??e?.avg;return t==null?`--`:String(Math.round(t*1e3)/1e3)}return(t,o)=>{let s=ae,p=se;return m(x).loaded&&!Ua.value?(r(),l(`div`,fe,[c(`p`,pe,n(t.$t(`dcwDetail.k19337yp018`)),1),ee(s,{class:`pill-btn`,to:`/dcw`},{default:te(()=>[h(n(t.$t(`dcwDetail.kllwu1c019`)),1)]),_:1})])):(r(),l(`div`,me,[c(`div`,he,[c(`div`,null,[c(`p`,ge,[c(`span`,{class:`line-chip`,style:e({background:Ua.value?.color??`#3aa0ff`})},null,4),h(`AGENTWORKSHOP / LINE / `+n(Ua.value?.name??S.value),1)]),c(`h1`,null,n(Ua.value?.name??t.$t(`dcwDetail.k1b2snna151`))+` · `+n(t.$t(`dcwDetail.k1l0iow1137`)),1),c(`p`,_e,n(Ua.value?.description||t.$t(`dcwDetail.kzcbfki152`)),1)]),c(`div`,ve,[c(`span`,ye,n(t.$t(`dcwDetail.k45uio082`))+` `+n(D.value.length),1),c(`span`,be,n(t.$t(`dcwDetail.k3waz1025`))+` `+n(O.value.length),1),c(`span`,xe,n(t.$t(`dcwDetail.k48grv027`))+` `+n(to.value.length),1)])]),c(`section`,Se,[c(`div`,Ce,[c(`button`,{class:i([`aw-pill`,{running:m(x).controller.running}]),title:t.$t(`dcwDetail.k1snap154`),onClick:o[0]||=e=>m(x).startStop(m(x).controller.running?`pause`:`resume`)},[c(`span`,{class:i(m(x).controller.running?`i-tabler-player-pause`:`i-tabler-player-play`)},null,2),h(` `+n(m(x).controller.running?t.$t(`dcwDetail.kplrsg153`):t.$t(`dcwDetail.knxgni9169`)),1)],10,we)]),c(`div`,Te,[c(`span`,Ee,[c(`span`,null,n(t.$t(`dcwDetail.k45uio082`))+` `+n(m(x).controller.nodesOnline)+`/`+n(m(x).controller.nodesTotal),1),o[55]||=c(`span`,{class:`sep`},`·`,-1),c(`span`,{title:t.$t(`dcwDetail.kd3ygmn001`)},n(t.$t(`dcwDetail.k3wtib138`))+` `+n(m(x).controller.writesTotal),9,De),o[56]||=c(`span`,{class:`sep`},`·`,-1),c(`span`,{class:i({warn:m(x).controller.writesFailed>0}),title:t.$t(`dcwDetail.kd3znl0002`)},n(t.$t(`dcwDetail.k3yit7139`))+` `+n(m(x).controller.writesFailed),11,Oe)]),c(`button`,{class:`aw-pill outline`,title:t.$t(`dcwDetail.kc4ixly003`),onClick:Po},[o[57]||=c(`span`,{class:`i-tabler-template`},null,-1),h(` `+n(t.$t(`dcwDetail.k1972dx9020`)),1)],8,ke),c(`button`,{class:`aw-pill add-btn`,onClick:o[1]||=e=>go.value=!0},[o[58]||=c(`span`,{class:`i-tabler-plus`},null,-1),h(` `+n(t.$t(`dcwDetail.k1976uns021`)),1)])])]),A.value||lo.value?(r(),l(`p`,{key:0,class:i([`banner`,A.value?`bad`:`good`])},n(A.value||lo.value),3)):d(``,!0),io.value.length||ao.value.length?(r(),l(`section`,Ae,[c(`b`,je,n(t.$t(`dcwDetail.kaebkky022`)),1),c(`div`,Me,[(r(!0),l(u,null,a(io.value,e=>(r(),l(`span`,{key:e.id,class:`adopt-chip`},[h(n(e.name)+` `,1),c(`button`,{class:`mini-btn`,onClick:t=>oo(e.id)},n(t.$t(`dcwDetail.kyjp9fg023`)),9,Ne)]))),128)),(r(!0),l(u,null,a(ao.value,e=>(r(),l(`span`,{key:e.id,class:`adopt-chip`},[h(n(e.name)+`(`+n(t.$t(`dcwDetail.k3km252140`)),1),c(`button`,{class:`mini-btn`,onClick:t=>so(e.id)},n(t.$t(`dcwDetail.kyjp9fg023`)),9,Pe)]))),128))])])):d(``,!0),c(`section`,Fe,[c(`div`,Ie,[c(`span`,{class:i([`line-dot`,{on:C.value.active}])},null,2),c(`div`,Le,[c(`b`,null,n(C.value.active?t.$t(`dcwDetail.k1pxrhx0154`):t.$t(`dcwDetail.k1b2hxmx170`)),1),C.value.active?(r(),l(`small`,Re,n(C.value.productName)+` · `+n(C.value.recipeName)+` · `+n(t.$t(`dcwDetail.k400lb075`))+` `+n(C.value.runId)+` · `+n(t.$t(`dcwDetail.k3zkt2166`))+` `+n(C.value.startedAt?.slice(11,19))+` `+n(t.$t(`dcwDetail.k69vag8168`))+` `+n(C.value.taggedSamples)+` `+n(t.$t(`dcwDetail.k4118o085`)),1)):(r(),l(`small`,ze,n(t.$t(`dcwDetail.k19pof14024`)),1))])]),c(`div`,Be,[c(`label`,Ve,[c(`span`,null,n(t.$t(`dcwDetail.k3waz1025`)),1),f(c(`select`,{"onUpdate:modelValue":o[2]||=e=>L.value=e,class:`inp`,onChange:o[3]||=e=>R.value=``},[c(`option`,He,n(t.$t(`dcwDetail.kuisodh026`)),1),(r(!0),l(u,null,a(O.value,e=>(r(),l(`option`,{key:e.id,value:e.id},n(e.name),9,Ue))),128))],544),[[g,L.value]])]),c(`label`,We,[c(`span`,null,n(t.$t(`dcwDetail.k48grv027`)),1),f(c(`select`,{"onUpdate:modelValue":o[4]||=e=>R.value=e,class:`inp`,disabled:!L.value},[c(`option`,Ke,n(t.$t(`dcwDetail.kutxzsz028`)),1),(r(!0),l(u,null,a(Lo.value,e=>(r(),l(`option`,{key:e.id,value:e.id,disabled:e.params.length===0},n(e.name)+n(e.params.length===0?t.$t(`dcwDetail.k1hicmch155`):t.$t(`dcwDetail.k1lzfi4g180`,{p0:e.params.length})),9,qe))),128))],8,Ge),[[g,R.value]])]),C.value.active?(r(),l(`button`,{key:1,class:`pill-btn stop`,disabled:z.value,onClick:zo},n(t.$t(`dcwDetail.k1xyhd2y030`)),9,Ye)):(r(),l(`button`,{key:0,class:`pill-btn`,disabled:z.value||!R.value,title:R.value?`下发配方参数并开始打标数据采集`:`开跑前必须先设定配方`,onClick:Ro},n(t.$t(`dcwDetail.kfb8vml029`)),9,Je))]),V.value?(r(),l(`p`,Xe,n(V.value),1)):d(``,!0),B.value?(r(),l(`p`,Ze,n(B.value),1)):d(``,!0)]),jo.value?(r(),l(`div`,{key:2,class:`modal-mask`,onClick:o[15]||=_(e=>jo.value=!1,[`self`])},[c(`div`,Qe,[c(`h3`,$e,[h(n(t.$t(`dcwDetail.k1x4vam0031`))+` `,1),c(`small`,et,n(t.$t(`dcwDetail.k3x23c141`))+` `+n(m(x).templates.filter(e=>e.builtin).length)+` · `+n(t.$t(`dcwDetail.k3t616a142`))+` `+n(m(x).templates.filter(e=>!e.builtin).length),1)]),c(`p`,tt,n(t.$t(`dcwDetail.ke1iyud032`)),1),c(`div`,nt,[(r(!0),l(u,null,a(m(x).templates,e=>(r(),l(`span`,{key:e.key,class:`tpl-chip`,title:`${e.code} · ${e.min}~${e.max} ${e.unit}${e.semantics?` · ${e.semantics}`:``}`},[h(n(e.name)+` `,1),c(`small`,it,n(e.min)+`~`+n(e.max)+n(e.unit),1),c(`em`,{class:i([`tpl-tag`,{builtin:e.builtin}])},n(e.builtin?t.$t(`dcwDetail.k3x23c141`):t.$t(`dcwDetail.k3t616a142`)),3)],8,rt))),128))]),c(`p`,at,n(t.$t(`dcwDetail.k169eb4s033`)),1),c(`div`,ot,[c(`label`,st,[c(`span`,null,[h(n(t.$t(`dcwDetail.k1f55q76034`)),1),o[59]||=c(`em`,null,`*`,-1)]),f(c(`input`,{"onUpdate:modelValue":o[5]||=e=>I.name=e,class:`inp`,placeholder:t.$t(`dcwDetail.k1tooi3o004`)},null,8,ct),[[v,I.name]])]),c(`label`,lt,[c(`span`,null,n(t.$t(`dcwDetail.k1bqk219035`)),1),f(c(`input`,{"onUpdate:modelValue":o[6]||=e=>I.ch=e,class:`inp`,placeholder:t.$t(`dcwDetail.k698qz0005`)},null,8,ut),[[v,I.ch]])]),c(`label`,dt,[c(`span`,null,n(t.$t(`dcwDetail.k1ayxrqb036`)),1),f(c(`input`,{"onUpdate:modelValue":o[7]||=e=>I.code=e,class:`inp`,placeholder:`如 MOTOR · I`},null,512),[[v,I.code]])]),c(`label`,ft,[c(`span`,null,[h(n(t.$t(`dcwDetail.k3x4ef037`)),1),o[60]||=c(`em`,null,`*`,-1)]),f(c(`input`,{"onUpdate:modelValue":o[8]||=e=>I.unit=e,class:`inp`,placeholder:`如 A`},null,512),[[v,I.unit]])]),c(`label`,pt,[c(`span`,null,[h(n(t.$t(`dcwDetail.k1l9jv5m038`)),1),o[61]||=c(`em`,null,`*`,-1)]),f(c(`input`,{"onUpdate:modelValue":o[9]||=e=>I.min=e,type:`number`,class:`inp`,placeholder:t.$t(`dcwDetail.kxz9174006`)},null,8,mt),[[v,I.min,void 0,{number:!0}]])]),c(`label`,ht,[c(`span`,null,[h(n(t.$t(`dcwDetail.k1l9jv4p039`)),1),o[62]||=c(`em`,null,`*`,-1)]),f(c(`input`,{"onUpdate:modelValue":o[10]||=e=>I.max=e,type:`number`,class:`inp`,placeholder:t.$t(`dcwDetail.kxz9167007`)},null,8,gt),[[v,I.max,void 0,{number:!0}]])]),c(`label`,_t,[c(`span`,null,n(t.$t(`dcwDetail.k3mxmcx040`)),1),f(c(`input`,{"onUpdate:modelValue":o[11]||=e=>I.decimals=e,type:`number`,min:`0`,max:`4`,class:`inp`},null,512),[[v,I.decimals,void 0,{number:!0}]])]),c(`label`,vt,[c(`span`,null,n(t.$t(`dcwDetail.k3xx56041`)),1),f(c(`select`,{"onUpdate:modelValue":o[12]||=e=>I.icon=e,class:`inp`},[(r(),l(u,null,a(Fo,e=>c(`option`,{key:e.key,value:e.key},n(e.label),9,yt)),64))],512),[[g,I.icon]])])]),c(`label`,bt,[c(`span`,null,n(t.$t(`dcwDetail.knjmyfr042`)),1),f(c(`textarea`,{"onUpdate:modelValue":o[13]||=e=>I.semantics=e,class:`inp`,rows:`2`,placeholder:t.$t(`dcwDetail.k1qdnfzc008`)},null,8,xt),[[v,I.semantics]])]),No.value?(r(),l(`p`,St,n(No.value),1)):d(``,!0),F.value?(r(),l(`p`,Ct,n(F.value),1)):d(``,!0),c(`div`,wt,[c(`button`,{class:`aw-pill outline`,onClick:o[14]||=e=>jo.value=!1},n(t.$t(`dcwDetail.k3x62t043`)),1),c(`button`,{class:`pill-btn`,disabled:Mo.value||!I.name.trim()||I.unit.trim()===``||I.min===``||I.max===``,onClick:Io},n(Mo.value?t.$t(`dcwDetail.k1bg4759156`):t.$t(`dcwDetail.k1bg9nga171`)),9,Tt)])])])):d(``,!0),go.value?(r(),l(`div`,{key:3,class:`modal-mask`,onClick:o[28]||=_(e=>go.value=!1,[`self`])},[c(`div`,Et,[c(`h3`,Dt,n(t.$t(`dcwDetail.k1976uns021`)),1),c(`div`,Ot,[c(`button`,{class:i([`seg`,{on:_o.value===`mock`}]),onClick:o[16]||=e=>_o.value=`mock`},` Mock 模拟 PLC `,2),c(`button`,{class:i([`seg`,{on:_o.value===`real`}]),onClick:o[17]||=e=>_o.value=`real`},n(t.$t(`dcwDetail.kyj8fen044`)),3)]),c(`div`,kt,[c(`label`,At,[c(`span`,null,n(t.$t(`dcwDetail.k1ejzwqp045`)),1),f(c(`select`,{"onUpdate:modelValue":o[18]||=e=>vo.value=e,class:`inp`},[(r(!0),l(u,null,a(m(x).templates,e=>(r(),l(`option`,{key:e.key,value:e.key},n(e.name)+` · `+n(e.ch)+`(`+n(e.min)+`~`+n(e.max)+` `+n(e.unit)+`)`+n(e.builtin?``:t.$t(`dcwDetail.kr45rk9157`)),9,jt))),128))],512),[[g,vo.value]])]),c(`label`,Mt,[c(`span`,null,n(t.$t(`dcwDetail.k1ce2k1y046`)),1),f(c(`input`,{"onUpdate:modelValue":o[19]||=e=>yo.value=e,class:`inp`,placeholder:t.$t(`dcwDetail.kgpxzy3009`)},null,8,Nt),[[v,yo.value]])]),c(`label`,Pt,[c(`span`,null,n(t.$t(`dcwDetail.k1vyb8im047`)),1),f(c(`input`,{"onUpdate:modelValue":o[20]||=e=>bo.value=e,type:`number`,min:`0`,max:`3600000`,step:`500`,class:`inp`,placeholder:t.$t(`dcwDetail.kb1srz0010`)},null,8,Ft),[[v,bo.value,void 0,{number:!0}]])]),c(`label`,It,[c(`span`,null,n(t.$t(`dcwDetail.k9r7d4e016`)),1),f(c(`input`,{"onUpdate:modelValue":o[21]||=e=>xo.value=e,type:`number`,min:`0`,max:`3600000`,step:`500`,class:`inp`,placeholder:t.$t(`dcwDetail.k9r7d4e017`)},null,8,Lt),[[v,xo.value,void 0,{number:!0}]])])]),c(`div`,Rt,[c(`label`,zt,[c(`span`,null,n(t.$t(`dcwDetail.kiune1f048`)),1),f(c(`select`,{"onUpdate:modelValue":o[22]||=e=>N.kind=e,class:`inp`},[c(`option`,Bt,n(t.$t(`dcwDetail.kkzy0k049`)),1),o[63]||=c(`option`,{value:`linear`},` 线性标定:PLC值 = (物理值 - offset) / scale `,-1)],512),[[g,N.kind]])]),c(`label`,Vt,[o[64]||=c(`span`,null,`scale / offset`,-1),c(`div`,Ht,[f(c(`input`,{"onUpdate:modelValue":o[23]||=e=>N.scale=e,type:`number`,step:`0.1`,class:`inp`,disabled:N.kind!==`linear`,title:`decoder 斜率(≠0):物理值 = scale × PLC值 + offset;下发时自动取逆`},null,8,Ut),[[v,N.scale,void 0,{number:!0}]]),f(c(`input`,{"onUpdate:modelValue":o[24]||=e=>N.offset=e,type:`number`,step:`0.1`,class:`inp`,disabled:N.kind!==`linear`,title:`decoder 截距`},null,8,Wt),[[v,N.offset,void 0,{number:!0}]])])])]),_o.value===`real`?(r(),l(u,{key:0},[c(`div`,Gt,[c(`label`,Kt,[c(`span`,null,n(t.$t(`dcwDetail.k1kt87rx050`)),1),f(c(`select`,{"onUpdate:modelValue":o[25]||=e=>j.value=e,class:`inp`},[(r(!0),l(u,null,a(m(le).filter(e=>e.status!==`builtin`),e=>(r(),l(`option`,{key:e.kind,value:e.kind},n(e.label),9,qt))),128))],512),[[g,j.value]])])]),Do.value.length?(r(),l(`div`,Jt,[(r(!0),l(u,null,a(Do.value,e=>(r(),l(`label`,{key:e.key,class:`f`},[c(`span`,null,[h(n(e.label),1),e.required?(r(),l(`em`,Yt,`*`)):d(``,!0)]),e.type===`select`?f((r(),l(`select`,{key:0,"onUpdate:modelValue":t=>M.value[e.key]=t,class:`inp`},[(r(!0),l(u,null,a(e.options,e=>(r(),l(`option`,{key:e.value,value:e.value},n(e.label),9,Zt))),128))],8,Xt)),[[g,M.value[e.key]]]):f((r(),l(`input`,{key:1,"onUpdate:modelValue":t=>M.value[e.key]=t,type:e.type===`number`?`number`:`text`,placeholder:e.placeholder,class:`inp`},null,8,Qt)),[[re,M.value[e.key]]]),e.hint?(r(),l(`small`,$t,n(e.hint),1)):d(``,!0)]))),128))])):d(``,!0),c(`div`,en,[c(`button`,{class:`pill-btn outline`,disabled:Co.value,onClick:ko},n(Co.value?t.$t(`dcwDetail.k1fsh720158`):t.$t(`dcwDetail.k1fstglk172`)),9,tn),P.value?(r(),l(`span`,{key:0,class:i([`test-result`,P.value.ok?`good`:`bad`])},n(P.value.ok?`✓`:`✗`)+` `+n(P.value.message),3)):d(``,!0)])],64)):d(``,!0),c(`label`,nn,[c(`span`,null,n(t.$t(`dcwDetail.k1hgizn7051`)),1),f(c(`textarea`,{"onUpdate:modelValue":o[26]||=e=>So.value=e,class:`inp`,rows:`2`,placeholder:t.$t(`dcwDetail.k12bnyt9011`)},null,8,rn),[[v,So.value]])]),To.value?(r(),l(`p`,an,n(To.value),1)):d(``,!0),c(`div`,on,[c(`button`,{class:`aw-pill outline`,onClick:o[27]||=e=>go.value=!1},n(t.$t(`dcwDetail.k3xdnn052`)),1),c(`button`,{class:`aw-pill`,disabled:wo.value,onClick:Ao},n(wo.value?t.$t(`dcwDetail.k1bg4759156`):t.$t(`dcwDetail.k1bge46t173`)),9,sn)])])])):d(``,!0),ee(p,{spinning:!m(x).loaded&&!m(x).error},{default:te(()=>[c(`section`,cn,[c(`table`,ln,[c(`thead`,null,[c(`tr`,null,[c(`th`,null,n(t.$t(`dcwDetail.k1e2dtkt053`)),1),c(`th`,null,n(t.$t(`dcwDetail.k403cy054`)),1),c(`th`,null,n(t.$t(`dcwDetail.k42w8s055`)),1),c(`th`,null,n(t.$t(`dcwDetail.k1deqh0d056`)),1),c(`th`,null,n(t.$t(`dcwDetail.k9r7d4e018`)),1),c(`th`,null,n(t.$t(`dcwDetail.k1k79ec9057`)),1),c(`th`,null,n(t.$t(`dcwDetail.k1dexou6058`)),1),c(`th`,null,n(t.$t(`dcwDetail.k1b1nnaa059`)),1),c(`th`,null,n(t.$t(`dcwDetail.k1i8rtqt060`)),1),c(`th`,un,n(t.$t(`dcwDetail.k40aa6061`)),1)])]),c(`tbody`,null,[(r(!0),l(u,null,a(D.value,e=>(r(),l(`tr`,{key:e.id,class:i({"node-paused":!e.enabled})},[c(`td`,null,[c(`span`,dn,n(e.id.slice(0,8)),1),c(`b`,null,n(e.name),1),c(`small`,fn,n(Ja(e.templateRef)),1)]),c(`td`,null,[c(`button`,{class:i([`ctrl-toggle`,{on:e.enabled}]),disabled:mo.value===e.id,title:e.enabled?`暂停该节点控制:下发将被拒绝`:`开启该节点控制:恢复可下发`,onClick:t=>ho(e.id,!e.enabled)},[o[65]||=c(`span`,{class:`ct-dot`},null,-1),h(` `+n(e.enabled?t.$t(`dcwDetail.k3o3ib3159`):t.$t(`dcwDetail.k3n93ed062`)),1)],10,pn)]),c(`td`,null,[e.enabled?(r(),l(`span`,{key:1,class:i([`st-pill`,e.state])},n(qa[e.state]??e.state),3)):(r(),l(`span`,mn,n(t.$t(`dcwDetail.k3n93ed062`)),1))]),c(`td`,hn,[h(n(e.value==null?`--`:e.value.toFixed(e.decimals))+` `,1),c(`small`,null,n(e.unit),1),e.lastAckAt?(r(),l(`small`,gn,` · `+n(e.lastAckAt.slice(11,19)),1)):d(``,!0)]),c(`td`,_n,[c(`span`,{title:e.lastReadError??t.$t(`dcwDetail.k9r7d4e019`),class:i({"read-stale":e.lastReadError})},n(e.readValue==null?`--`:e.readValue.toFixed(e.decimals)),11,vn),c(`small`,null,n(e.unit),1),e.lastReadAt?(r(),l(`small`,yn,` · `+n(e.lastReadAt.slice(11,19)),1)):d(``,!0),c(`button`,{class:`mini-btn read-btn`,disabled:fo.value===e.id,title:t.$t(`dcwDetail.k9r7d4e020`),onClick:t=>po(e.id)},n(fo.value===e.id?`···`:t.$t(`dcwDetail.k9r7d4e021`)),9,bn)]),c(`td`,null,[c(`div`,xn,[f(c(`input`,{"onUpdate:modelValue":t=>k[e.id]=t,type:`number`,class:`inp write-inp mono`,placeholder:`${e.min}~${e.max}`,min:e.min,max:e.max,step:10**-e.decimals,disabled:!e.enabled,title:e.enabled?``:`当前节点暂停:开启控制后方可设定`},null,8,Sn),[[v,k[e.id],void 0,{number:!0}]]),c(`button`,{class:`mini-btn write-btn`,disabled:!e.enabled||co.value===e.id||k[e.id]==null||k[e.id]===``,title:e.enabled?`下发设定值`:`当前节点暂停:开启控制后方可设定`,onClick:t=>uo(e.id,Number(k[e.id]))},n(co.value===e.id?t.$t(`dcwDetail.k3l3h80123`):t.$t(`dcwDetail.k3w6td174`)),9,Cn)])]),c(`td`,wn,n(e.min)+` ~ `+n(e.max)+` `+n(e.unit),1),c(`td`,Tn,[h(n(e.holdIntervalMs==null?t.$t(`dcwDetail.k3zul4160`):`${e.holdIntervalMs}ms`)+` `,1),c(`small`,{class:`dim`,title:t.$t(`dcwDetail.k9r7d4e016`)},`· `+n(e.readIntervalMs===0?t.$t(`dcwDetail.k9r7d4e022`):e.readIntervalMs==null?t.$t(`dcwDetail.k9r7d4e023`):`${e.readIntervalMs}ms`),9,En)]),c(`td`,null,n(Ga(e)),1),c(`td`,Dn,[c(`button`,{class:`mini-btn danger`,onClick:t=>m(x).removeNode(e.id)},n(t.$t(`dcwDetail.k3xakp063`)),9,On)])],2))),128)),m(x).loaded&&D.value.length===0?(r(),l(`tr`,kn,[c(`td`,An,[c(`div`,jn,[c(`p`,Mn,n(t.$t(`dcwDetail.k1wtecyw064`)),1)])])])):d(``,!0)])])])]),_:1},8,[`spinning`]),c(`section`,Nn,[c(`div`,Pn,[c(`h3`,null,n(t.$t(`dcwDetail.k1j8w3hd065`)),1),c(`span`,Fn,n(O.value.length)+` `+n(t.$t(`dcwDetail.k1av3wgs143`))+` `+n(Wo.value.length)+` `+n(t.$t(`dcwDetail.k48grv027`)),1),c(`button`,{class:`pill-btn`,style:{"margin-left":`auto`},onClick:ls},n(t.$t(`dcwDetail.k1akm6dc066`)),1),c(`button`,{class:`mini-btn`,onClick:o[29]||=e=>Bo.value=!0},n(t.$t(`dcwDetail.k1aka0ki067`)),1)]),c(`p`,In,n(t.$t(`dcwDetail.k6bl2q8068`)),1),O.value.length?(r(),l(`div`,Ln,[c(`button`,{class:i([`prod-chip`,{on:U.value===``}]),onClick:o[30]||=e=>U.value=``},n(t.$t(`dcwDetail.k3x4t1069`)),3),(r(!0),l(u,null,a(O.value,e=>(r(),l(`button`,{key:e.id,class:i([`prod-chip`,{on:U.value===e.id}]),title:e.description,onClick:t=>U.value=e.id},[h(n(e.name)+` `,1),c(`span`,{class:`prod-del`,title:t.$t(`dcwDetail.k1bpfjgx012`),onClick:_(t=>m(x).removeProduct(e.id),[`stop`])},`×`,8,zn)],10,Rn))),128))])):(r(),l(`p`,Bn,n(t.$t(`dcwDetail.knov3zg070`)),1)),c(`div`,Vn,[(r(!0),l(u,null,a(Wo.value,e=>(r(),l(`div`,{key:e.id,class:`recipe-item`},[c(`div`,Hn,[c(`b`,null,n(e.name),1),e.version?(r(),l(`span`,{key:0,class:`param-chip mono`,title:m(y)(`dcwDetail.histTitle`)},`v`+n(e.version),9,Un)):d(``,!0),c(`small`,Wn,n(Go(e.productId)),1),c(`small`,Gn,n(e.id),1)]),e.description?(r(),l(`p`,Kn,n(e.description),1)):d(``,!0),c(`div`,qn,[(r(!0),l(u,null,a(e.params,(t,a)=>(r(),l(`span`,{key:a,class:i([`param-chip`,{stale:W(t.nodeId,e.lineId)}]),title:W(t.nodeId,e.lineId)?.label??``},[h(n(Ko(t.nodeId))+` = `+n(t.value),1),W(t.nodeId,e.lineId)?(r(),l(`span`,Yn,n(W(t.nodeId,e.lineId).label),1)):d(``,!0)],10,Jn))),128)),(r(!0),l(u,null,a(e.daqWindows,(a,ee)=>(r(),l(`span`,{key:`w-${ee}`,class:i([`param-chip daqwin`,{stale:qo(a.nodeId,e.lineId)}]),title:qo(a.nodeId,e.lineId)?.label??t.$t(`dcwDetail.k1l11api013`)},[h(` ◎ `+n(eo(a.nodeId))+` ∈ [`+n(a.min??`-∞`)+`, `+n(a.max??`+∞`)+`]`,1),qo(a.nodeId,e.lineId)?(r(),l(`span`,Zn,n(qo(a.nodeId,e.lineId).label),1)):d(``,!0)],10,Xn))),128))]),c(`div`,Qn,[c(`button`,{class:`pill-btn`,onClick:t=>fs(e.id)},n(t.$t(`dcwDetail.k1497qvr071`)),9,$n),c(`button`,{class:`mini-btn`,onClick:t=>us(e.id)},n(t.$t(`dcwDetail.k45eb0072`)),9,er),c(`button`,{class:`mini-btn`,onClick:t=>Zo(e.id)},[h(n(m(y)(`dcwDetail.histBtn`)),1),e.version?(r(),l(`span`,nr,`·v`+n(e.version),1)):d(``,!0)],8,tr),c(`button`,{class:`mini-btn danger`,onClick:t=>m(x).removeRecipe(e.id)},n(t.$t(`dcwDetail.k3xakp063`)),9,rr)])]))),128)),Wo.value.length===0?(r(),l(`div`,ir,n(t.$t(`dcwDetail.keko1xy073`)),1)):d(``,!0)]),Q.value?(r(),l(`div`,ar,[h(n(t.$t(`dcwDetail.k1l3hrvp144`))+` `+n(Q.value.runId)+` `+n(t.$t(`dcwDetail.k1g3lh2v167`))+n(Q.value.ok)+`/`+n(Q.value.total)+` `+n(t.$t(`dcwDetail.k1bqci06149`))+` `,1),c(`button`,{class:`mini-btn`,style:{"margin-left":`10px`},disabled:cs.value,onClick:o[31]||=e=>ps(Q.value.runId)},n(cs.value?t.$t(`dcwDetail.k1br0ij9161`):t.$t(`dcwDetail.kxwei5175`)),9,or)])):d(``,!0),no.value.length?(r(),l(`div`,sr,[c(`p`,cr,n(t.$t(`dcwDetail.k1rjer8d074`)),1),c(`table`,lr,[c(`thead`,null,[c(`tr`,null,[c(`th`,null,n(t.$t(`dcwDetail.k400lb075`)),1),c(`th`,null,n(t.$t(`dcwDetail.k48grv027`)),1),c(`th`,null,n(t.$t(`dcwDetail.k4497j076`)),1),c(`th`,null,n(t.$t(`dcwDetail.k1bqhtmu077`)),1),c(`th`,ur,n(t.$t(`dcwDetail.k40aa6061`)),1)])]),c(`tbody`,null,[(r(!0),l(u,null,a([...no.value].reverse().slice(0,8),e=>(r(),l(`tr`,{key:e.id},[c(`td`,dr,n(e.id),1),c(`td`,null,n(e.recipeName),1),c(`td`,fr,n(e.startedAt.slice(5,19))+` ~ `+n(e.endedAt?e.endedAt.slice(5,19):t.$t(`dcwDetail.k3vpfg9162`)),1),c(`td`,null,[c(`span`,{class:i([`st-pill`,e.results.every(e=>e.ok)?`ok`:`warn`])},n(e.results.filter(e=>e.ok).length)+`/`+n(e.results.length),3)]),c(`td`,pr,[c(`button`,{class:`mini-btn`,disabled:cs.value,onClick:t=>ps(e.id)},n(t.$t(`dcwDetail.k1dzwrdp078`)),9,mr),e.endedAt?d(``,!0):(r(),l(`button`,{key:0,class:`mini-btn`,onClick:t=>m(x).closeRun(e.id)},n(t.$t(`dcwDetail.k1blr7y7079`)),9,hr))])]))),128))])])])):d(``,!0),$.value?(r(),l(`div`,{key:4,class:`modal-mask`,onClick:o[33]||=_(e=>$.value=null,[`self`])},[c(`div`,gr,[c(`h3`,_r,n(t.$t(`dcwDetail.k11lq94k145`))+` `+n($.value.data.run.recipeName)+`(`+n($.value.runId)+`) `,1),c(`p`,vr,n(t.$t(`dcwDetail.k1me41w8080`)),1),c(`table`,yr,[c(`thead`,null,[c(`tr`,null,[c(`th`,null,n(t.$t(`dcwDetail.k48hde081`)),1),c(`th`,null,n(t.$t(`dcwDetail.k45uio082`)),1),c(`th`,null,n(t.$t(`dcwDetail.k40t11083`)),1),c(`th`,null,n(t.$t(`dcwDetail.k3xuaw084`)),1),o[66]||=c(`th`,null,`min ~ max`,-1),c(`th`,null,n(t.$t(`dcwDetail.k4118o085`)),1)])]),c(`tbody`,null,[(r(!0),l(u,null,a($.value.data.daq,e=>(r(),l(`tr`,{key:e.nodeId},[c(`td`,null,[h(n(e.ch),1),c(`small`,br,n(e.unit),1)]),c(`td`,null,n(e.nodeName),1),c(`td`,xr,n(e.latest),1),c(`td`,Sr,n(e.avg),1),c(`td`,Cr,n(e.min)+` ~ `+n(e.max),1),c(`td`,wr,n(e.cnt),1)]))),128)),$.value.data.daq.length===0?(r(),l(`tr`,Tr,[c(`td`,Er,n(t.$t(`dcwDetail.kd457ry086`)),1)])):d(``,!0)])]),c(`p`,Dr,n(t.$t(`dcwDetail.k12b7cxs087`)),1),c(`table`,Or,[c(`thead`,null,[c(`tr`,null,[c(`th`,null,n(t.$t(`dcwDetail.k3xbjr088`)),1),c(`th`,null,n(t.$t(`dcwDetail.k45uio082`)),1),c(`th`,null,n(t.$t(`dcwDetail.k3ncbsh089`)),1),c(`th`,null,n(t.$t(`dcwDetail.k3lh3mz090`)),1),c(`th`,null,n(t.$t(`dcwDetail.k454pg091`)),1),c(`th`,null,n(t.$t(`dcwDetail.k40ieu092`)),1)])]),c(`tbody`,null,[(r(!0),l(u,null,a($.value.data.writes,(e,a)=>(r(),l(`tr`,{key:a},[c(`td`,null,n(e.param),1),c(`td`,null,n(e.nodeName),1),c(`td`,kr,n(e.eng),1),c(`td`,Ar,n(e.raw),1),c(`td`,null,[c(`span`,{class:i([`st-pill`,e.ok?`ok`:`alarm`])},n(e.ok?`ACK`:t.$t(`dcwDetail.k3yit7139`)),3)]),c(`td`,jr,n(e.at.slice(5,19)),1)]))),128)),$.value.data.writes.length===0?(r(),l(`tr`,Mr,[c(`td`,Nr,n(t.$t(`dcwDetail.knzcp8i093`)),1)])):d(``,!0)])]),c(`div`,Pr,[c(`button`,{class:`aw-pill outline`,onClick:o[32]||=e=>$.value=null},n(t.$t(`dcwDetail.k3x62t043`)),1)])])])):d(``,!0)]),Y.value?(r(),l(`div`,{key:4,class:`modal-mask`,onClick:o[40]||=_(e=>Y.value=!1,[`self`])},[c(`div`,Fr,[c(`h3`,Ir,n(as.value?t.$t(`dcwDetail.k1iiwk0i163`):t.$t(`dcwDetail.k1efq0r9176`)),1),c(`div`,Lr,[c(`label`,Rr,[c(`span`,null,[h(n(t.$t(`dcwDetail.k1dw4fzf094`)),1),o[67]||=c(`em`,null,`*`,-1)]),f(c(`select`,{"onUpdate:modelValue":o[34]||=e=>Z.productId=e,class:`inp`},[(r(!0),l(u,null,a(O.value,e=>(r(),l(`option`,{key:e.id,value:e.id},n(e.name),9,zr))),128))],512),[[g,Z.productId]])]),c(`label`,Br,[c(`span`,null,[h(n(t.$t(`dcwDetail.k1l3f8so095`)),1),o[68]||=c(`em`,null,`*`,-1)]),f(c(`input`,{"onUpdate:modelValue":o[35]||=e=>Z.name=e,class:`inp`,placeholder:t.$t(`dcwDetail.k12c11vm014`)},null,8,Vr),[[v,Z.name]])]),c(`label`,Hr,[c(`span`,null,n(t.$t(`dcwDetail.k40gkk096`)),1),f(c(`input`,{"onUpdate:modelValue":o[36]||=e=>Z.description=e,class:`inp`,placeholder:t.$t(`dcwDetail.k1hxx8hy015`)},null,8,Ur),[[v,Z.description]])])]),c(`p`,Wr,n(t.$t(`dcwDetail.ka1kfgh097`)),1),(r(!0),l(u,null,a(Z.params,(e,i)=>(r(),l(`div`,{key:i,class:`param-row`},[c(`label`,Gr,[c(`span`,null,n(t.$t(`dcwDetail.k1e2dtkt053`)),1),f(c(`select`,{"onUpdate:modelValue":t=>e.nodeId=t,class:`inp`},[(r(!0),l(u,null,a(D.value,e=>(r(),l(`option`,{key:e.id,value:e.id},n(e.name)+`(`+n(Ja(e.templateRef))+` · `+n(e.min)+`~`+n(e.max)+` `+n(e.unit)+`) `,9,qr))),128))],8,Kr),[[g,e.nodeId]]),W(e.nodeId,S.value)?(r(),l(`span`,Jr,n(W(e.nodeId,S.value).label),1)):d(``,!0)]),c(`label`,Yr,[c(`span`,null,[h(n(t.$t(`dcwDetail.k3renp2098`)),1),o[69]||=c(`em`,null,`*`,-1)]),f(c(`input`,{"onUpdate:modelValue":t=>e.value=t,type:`number`,class:`inp`,step:.1},null,8,Xr),[[v,e.value,void 0,{number:!0}]])]),c(`label`,Zr,[c(`span`,null,n(t.$t(`dcwDetail.k134rw3b146`))+n(Ya(e.nodeId)??`-`)+`)`,1),f(c(`input`,{"onUpdate:modelValue":t=>e.min=t,type:`number`,class:`inp`,step:.1,placeholder:t.$t(`dcwDetail.k5vew9z016`)},null,8,Qr),[[v,e.min,void 0,{number:!0}]])]),c(`label`,$r,[c(`span`,null,n(t.$t(`dcwDetail.khrv911147`))+n(Xa(e.nodeId)??`-`)+`)`,1),f(c(`input`,{"onUpdate:modelValue":t=>e.max=t,type:`number`,class:`inp`,step:.1,placeholder:t.$t(`dcwDetail.kzoh5pr017`)},null,8,ei),[[v,e.max,void 0,{number:!0}]])]),c(`button`,{class:`mini-btn danger param-del`,onClick:e=>Z.params.splice(i,1)},n(t.$t(`dcwDetail.k44idg099`)),9,ti)]))),128)),c(`button`,{class:`mini-btn`,onClick:o[37]||=e=>Z.params.push({nodeId:D.value[0]?.id??``,value:``,min:``,max:``})},n(t.$t(`dcwDetail.k1broh7h100`)),1),c(`p`,ni,n(t.$t(`dcwDetail.k1h5gues101`)),1),(r(!0),l(u,null,a(Z.daqWindows,(e,i)=>(r(),l(`div`,{key:`dw-${i}`,class:`param-row`},[c(`label`,ri,[c(`span`,null,n(t.$t(`dcwDetail.k1empnnb102`)),1),f(c(`select`,{"onUpdate:modelValue":t=>e.nodeId=t,class:`inp`},[(r(!0),l(u,null,a(w.value,e=>(r(),l(`option`,{key:e.id,value:e.id},n(e.name)+`(`+n(e.min)+`~`+n(e.max)+` `+n(e.unit)+`) `,9,ai))),128))],8,ii),[[g,e.nodeId]])]),c(`label`,oi,[c(`span`,null,n(t.$t(`dcwDetail.kqm08ap103`)),1),f(c(`input`,{"onUpdate:modelValue":t=>e.min=t,type:`number`,class:`inp`,step:.1},null,8,si),[[v,e.min,void 0,{number:!0}]])]),c(`label`,ci,[c(`span`,null,n(t.$t(`dcwDetail.kpypf8g104`)),1),f(c(`input`,{"onUpdate:modelValue":t=>e.max=t,type:`number`,class:`inp`,step:.1},null,8,li),[[v,e.max,void 0,{number:!0}]])]),c(`button`,{class:`mini-btn danger param-del`,onClick:e=>Z.daqWindows.splice(i,1)},n(t.$t(`dcwDetail.k44idg099`)),9,ui)]))),128)),c(`button`,{class:`mini-btn`,disabled:w.value.length===0,title:w.value.length===0?`本产线暂无数采节点`:``,onClick:o[38]||=e=>Z.daqWindows.push({nodeId:w.value[0]?.id??``,min:``,max:``})},n(t.$t(`dcwDetail.kv1de1p105`)),9,di),ss.value?(r(),l(`p`,fi,n(ss.value),1)):d(``,!0),X.value?(r(),l(`p`,pi,n(X.value),1)):d(``,!0),c(`div`,mi,[c(`button`,{class:`aw-pill outline`,onClick:o[39]||=e=>Y.value=!1},n(t.$t(`dcwDetail.k3xdnn052`)),1),c(`button`,{class:`pill-btn`,disabled:os.value,onClick:ds},n(os.value?t.$t(`dcwDetail.k1b38d59164`):t.$t(`dcwDetail.k1b3kwg0177`)),9,hi)])])])):d(``,!0),Jo.value?(r(),l(`div`,{key:5,class:`modal-mask`,onClick:o[42]||=_(e=>Jo.value=!1,[`self`])},[c(`div`,gi,[c(`div`,_i,[c(`h3`,null,[h(n(m(y)(`dcwDetail.histTitle`)),1),G.value?(r(),l(`span`,vi,n(G.value.name)+` · v`+n(G.value.version),1)):d(``,!0)]),c(`button`,{class:`mini-btn`,onClick:o[41]||=e=>Jo.value=!1},` ✕ `)]),K.value?(r(),l(`p`,yi,n(K.value),1)):d(``,!0),Xo.value?(r(),l(`p`,bi,n(m(y)(`dcwDetail.histLoading`)),1)):Yo.value.length===0?(r(),l(`div`,xi,n(m(y)(`dcwDetail.histEmpty`)),1)):(r(!0),l(u,{key:3},a(Yo.value,(e,t)=>(r(),l(`div`,{key:e.version,class:i([`ver-row`,{cur:e.current}])},[c(`div`,Si,[c(`span`,Ci,`v`+n(e.version),1),c(`span`,{class:i([`ver-src`,e.by??(e.current?`cur`:``)])},n(e.current?m(y)(`dcwDetail.histCurrent`):Qo(e.by)),3),c(`span`,wi,n(e.at.slice(0,19).replace(`T`,` `)),1),c(`span`,Ti,n(e.actorName||`—`),1),e.current?d(``,!0):(r(),l(`button`,{key:0,class:`mini-btn`,onClick:t=>es(e.version)},n(m(y)(`dcwDetail.revertTo`)),9,Ei))]),e.description?(r(),l(`p`,Di,n(e.description),1)):d(``,!0),c(`p`,Oi,n($o(e,t)),1)],2))),128))])])):d(``,!0),c(`section`,ki,[c(`p`,Ai,n(t.$t(`dcwDetail.k1us3jse106`)),1),c(`div`,ji,[c(`label`,Mi,[c(`span`,null,n(t.$t(`dcwDetail.k3waz1025`)),1),f(c(`select`,{"onUpdate:modelValue":o[43]||=e=>q.productId=e,class:`inp`,onChange:o[44]||=e=>q.recipeId=``},[c(`option`,Ni,n(t.$t(`dcwDetail.k1bkl1jx107`)),1),(r(!0),l(u,null,a(O.value,e=>(r(),l(`option`,{key:e.id,value:e.id},n(e.name),9,Pi))),128))],544),[[g,q.productId]])]),c(`label`,Fi,[c(`span`,null,n(t.$t(`dcwDetail.k48grv027`)),1),f(c(`select`,{"onUpdate:modelValue":o[45]||=e=>q.recipeId=e,class:`inp`,disabled:!q.productId},[c(`option`,Li,n(t.$t(`dcwDetail.k1bkx7cr108`)),1),(r(!0),l(u,null,a(Wo.value,e=>(r(),l(`option`,{key:e.id,value:e.id},n(e.name),9,Ri))),128))],8,Ii),[[g,q.recipeId]])]),c(`label`,zi,[c(`span`,null,n(t.$t(`dcwDetail.k1demcae109`)),1),f(c(`select`,{"onUpdate:modelValue":o[46]||=e=>q.paramKey=e,class:`inp`},[c(`option`,Bi,n(t.$t(`dcwDetail.k1bkx7ya110`)),1),(r(!0),l(u,null,a(is.value,e=>(r(),l(`option`,{key:e,value:e},n(e),9,Vi))),128))],512),[[g,q.paramKey]])]),c(`label`,Hi,[c(`span`,null,n(t.$t(`dcwDetail.k45uio082`)),1),f(c(`select`,{"onUpdate:modelValue":o[47]||=e=>q.nodeId=e,class:`inp`},[c(`option`,Ui,n(t.$t(`dcwDetail.k1bkul3k111`)),1),(r(!0),l(u,null,a(w.value,e=>(r(),l(`option`,{key:e.id,value:e.id},n(e.name),9,Wi))),128))],512),[[g,q.nodeId]])]),c(`label`,Gi,[c(`span`,null,n(t.$t(`dcwDetail.kx2ojn0112`)),1),f(c(`input`,{"onUpdate:modelValue":o[48]||=e=>q.lastMin=e,type:`number`,min:`1`,max:`10080`,class:`inp`},null,512),[[v,q.lastMin,void 0,{number:!0}]])]),c(`label`,Ki,[c(`span`,null,n(t.$t(`dcwDetail.kjvnvn4113`)),1),f(c(`input`,{"onUpdate:modelValue":o[49]||=e=>q.bucketMs=e,type:`number`,min:`1000`,step:`500`,class:`inp`},null,512),[[v,q.bucketMs,void 0,{number:!0}]])]),c(`div`,qi,[c(`button`,{class:`pill-btn`,disabled:ts.value,onClick:rs},n(ts.value?t.$t(`dcwDetail.k1eyx09r165`):t.$t(`dcwDetail.k416ek178`)),9,Ji)])]),ns.value?(r(),l(`p`,Yi,n(ns.value),1)):d(``,!0),J.value?(r(),l(`div`,Xi,[c(`table`,Zi,[c(`thead`,null,[c(`tr`,null,[c(`th`,null,n(t.$t(`dcwDetail.k48hde081`)),1),c(`th`,null,n(t.$t(`dcwDetail.k45uio082`)),1),c(`th`,null,n(t.$t(`dcwDetail.k42kcu114`)),1),c(`th`,null,n(t.$t(`dcwDetail.k49ujb115`)),1),c(`th`,null,n(t.$t(`dcwDetail.k40pvw116`)),1),c(`th`,null,n(t.$t(`dcwDetail.k3xho3117`)),1)])]),c(`tbody`,null,[(r(!0),l(u,null,a(J.value.channels,e=>(r(),l(`tr`,{key:e.nodeId},[c(`td`,null,[h(n(e.ch),1),c(`small`,Qi,n(e.unit),1)]),c(`td`,null,n(e.nodeName),1),c(`td`,$i,n(e.points.length),1),c(`td`,ea,n(ms(e.points[0])),1),c(`td`,ta,n(ms(e.points[e.points.length-1])),1),c(`td`,na,n(new Date(e.points[0]?.at??0).toLocaleTimeString())+` ~ `+n(new Date(e.points[e.points.length-1]?.at??0).toLocaleTimeString()),1)]))),128))])])])):d(``,!0)]),ro.value.length?(r(),l(`section`,ra,[c(`p`,ia,n(t.$t(`dcwDetail.kw7ym9b148`))+` `+n(ro.value.length)+` `+n(t.$t(`dcwDetail.k40bfz150`)),1),c(`table`,aa,[c(`tbody`,null,[(r(!0),l(u,null,a(ro.value.slice(0,12),e=>(r(),l(`tr`,{key:e.id},[c(`td`,oa,n(e.at.slice(5,19)),1),c(`td`,null,n(e.param),1),c(`td`,null,n(e.nodeName),1),c(`td`,sa,n(e.eng),1),c(`td`,ca,` raw `+n(e.raw??`-`),1),c(`td`,null,[c(`span`,{class:i([`st-pill`,e.ok?`ok`:`alarm`])},n(e.ok?`ACK`:t.$t(`dcwDetail.k3yit7139`)),3)]),c(`td`,la,n(e.recipeRunId?t.$t(`dcwDetail.k6vgks7181`,{p0:e.recipeRunId}):`手动`),1)]))),128))])])])):d(``,!0),Bo.value?(r(),l(`div`,{key:7,class:`modal-mask`,onClick:o[53]||=_(e=>Bo.value=!1,[`self`])},[c(`div`,ua,[c(`h3`,da,n(t.$t(`dcwDetail.k1efduyf118`)),1),c(`div`,fa,[c(`label`,pa,[c(`span`,null,[h(n(t.$t(`dcwDetail.k1avjrl6119`)),1),o[70]||=c(`em`,null,`*`,-1)]),f(c(`input`,{"onUpdate:modelValue":o[50]||=e=>H.name=e,class:`inp`,placeholder:t.$t(`dcwDetail.k12c11vm014`)},null,8,ma),[[v,H.name]])]),c(`label`,ha,[c(`span`,null,n(t.$t(`dcwDetail.k40gkk096`)),1),f(c(`input`,{"onUpdate:modelValue":o[51]||=e=>H.description=e,class:`inp`,placeholder:t.$t(`dcwDetail.k1hxx8hy015`)},null,8,ga),[[v,H.description]])])]),Ho.value?(r(),l(`p`,_a,n(Ho.value),1)):d(``,!0),c(`div`,va,[c(`button`,{class:`aw-pill outline`,onClick:o[52]||=e=>Bo.value=!1},n(t.$t(`dcwDetail.k3xdnn052`)),1),c(`button`,{class:`pill-btn`,disabled:Vo.value,onClick:Uo},n(Vo.value?t.$t(`dcwDetail.k1bg4759156`):t.$t(`dcwDetail.k1bg4kn6179`)),9,ya)])])])):d(``,!0),m(x).error?(r(),l(`p`,ba,[h(n(m(x).error)+`(`,1),ee(s,{to:`/workshop`},{default:te(()=>[h(n(t.$t(`dcwDetail.k1bhhheq120`)),1)]),_:1}),o[71]||=h(`) `,-1)])):d(``,!0),c(`section`,xa,[c(`div`,Sa,[c(`b`,null,n(t.$t(`dcwDetail.k1ledgt001`)),1),f(c(`select`,{"onUpdate:modelValue":o[54]||=e=>T.value=e,class:`inp`,onChange:Qa},[c(`option`,Ca,n(t.$t(`dcwDetail.k1ledgs001`)),1),(r(!0),l(u,null,a(D.value,e=>(r(),l(`option`,{key:e.id,value:e.id},n(e.name),9,wa))),128))],544),[[g,T.value]])]),E.value?(r(),l(u,{key:0},[c(`div`,Ta,[c(`div`,Ea,[c(`small`,null,n(t.$t(`dcwDetail.k1ledgv001`)),1),c(`b`,Da,n(E.value.current??`--`),1)]),c(`div`,Oa,[c(`small`,null,n(t.$t(`dcwDetail.k1ledgv002`)),1),c(`b`,ka,n(E.value.recipeTarget??`--`),1)]),c(`div`,Aa,[c(`small`,null,n(t.$t(`dcwDetail.k1ledgv003`)),1),c(`b`,ja,n(E.value.lastGood??`--`),1)]),c(`button`,{class:`mini-btn`,onClick:Qa},n(t.$t(`dcwDetail.k1ledga001`)),1),c(`button`,{class:`mini-btn danger`,onClick:$a},n(t.$t(`dcwDetail.k1ledga002`)),1)]),c(`div`,Ma,[c(`div`,Na,[c(`small`,Pa,n(t.$t(`dcwDetail.k1ledgh001`)),1),c(`ul`,Fa,[(r(!0),l(u,null,a(E.value.journal,e=>(r(),l(`li`,{key:e.id},n(e.at.slice(5,16).replace(`T`,` `))+` [`+n(e.source)+`] `+n(e.prevValue??`?`)+` → `+n(e.newValue),1))),128))])]),c(`div`,Ia,[c(`small`,La,n(t.$t(`dcwDetail.k1ledgr001`)),1),c(`ul`,Ra,[(r(!0),l(u,null,a(E.value.records,e=>(r(),l(`li`,{key:e.id,class:`ledger-rec`},[c(`span`,{class:i([`rec-st`,e.status])},n(e.status),3),c(`span`,za,n(e.params[0]?.from??`?`)+` → `+n(e.params[0]?.to),1),c(`small`,null,n(e.judge?`${e.judge.verdict}(${e.judge.by})`:e.status===`open`?`open`:e.closedBy??``),1)]))),128))])])])],64)):d(``,!0)])]))}}}),[[`__scopeId`,`data-v-5d264577`]]);export{Ba as default};
@@ -1,4 +0,0 @@
1
- const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./BU83-NnX.js","./CSkxz2NX.js","./D6uzXueg.js","./4sIEbgcl.js"])))=>i.map(i=>d[i]);
2
- import{a as e}from"./BU83-NnX.js";import{$ as t,Ht as n,P as r,R as ee,S as i,Ut as a,V as o,Vt as s,W as c,d as l,dt as te,f as u,h as d,i as f,m as p,nt as m,pt as h,y as g}from"./CSkxz2NX.js";import{c as ne,d as re,f as _,l as v}from"./D6uzXueg.js";import{n as ie}from"./DtYHUi5Z.js";import{t as ae}from"./HclGiUj8.js";import{n as oe}from"./KZQX7xoM.js";import{t as se}from"./CWoJjWmZ.js";import{t as y}from"./BDNMzG2s2.js";import{t as b}from"./D0ZBQrN_2.js";import{t as ce}from"./BNT8gYU92.js";import{t as x}from"./36oeS8_R2.js";import{t as le}from"./CNs_Ozdc2.js";import{t as ue}from"./CM12FuB42.js";import{t as de}from"./BDmh31hl.js";function S(){let e=h(new Map),t=h(null),n=h(null),r=h(null);function ee(t){let n=e.value.get(t.jobId),r=new Map(e.value);r.set(t.jobId,{jobId:t.jobId,datasetId:t.datasetId||n?.datasetId||``,lineId:t.lineId??n?.lineId??``,status:t.status,stage:t.stage,progress:t.progress,purpose:t.purpose??n?.purpose,note:t.note,at:new Date().toISOString()}),e.value=r}function i(e){if(e.type===`aml.job`){let n=e.payload;if(!n?.jobId)return;t.value=n,ee(n)}else if(e.type===`aml.dataset`){let t=e.payload;if(!t?.datasetId)return;n.value=t}else if(e.type===`aml.model`){let t=e.payload;if(!t?.modelId)return;r.value=t}}let a=0,o=null;function s(){a=Math.max(0,a-1),a===0&&o&&(o(),o=null)}function c(){a++,o||=x().subscribe(i);let e=!1;return()=>{e||(e=!0,s())}}function l(){s()}return{jobs:e,lastJob:t,lastDataset:n,lastModel:r,ensure:c,dispose:l}}var fe=`__amlStream`;function pe(){let e=globalThis;return e[fe]||(e[fe]=S()),e[fe]}var me={class:`page`},he={class:`aw-page-head`},ge={class:`sub`},_e={class:`badges mono`},ve=[`title`],ye=[`title`],be={key:0,class:`infra-banner`},xe={class:`txt`},Se={class:`mono`},Ce={key:1,class:`aw-tile ov-card`},we={class:`ov-row mono`},Te={class:`ov-item`},Ee={class:`ov-item`},De={class:`ov-item`},Oe={class:`ov-item`},ke=[`title`],Ae={key:2,class:`err`},je={key:3,class:`aw-tile zone env-zone`},Me={class:`zone-head`},Ne={class:`zone-actions`},Pe=[`disabled`],Fe={key:0,class:`infra-banner`},Ie={class:`txt`},Le={class:`mono`},Re={class:`env-grid`},ze={class:`ec-head`},Be={class:`ec-state`},Ve={key:0,class:`ec-detail mono`},He={key:1,class:`ec-detail`},Ue={class:`ec-actions`},We=[`disabled`,`title`],Ge={class:`ec-head`},Ke={class:`ec-state`},qe={class:`ec-detail mono`},Je={class:`ec-actions`},Ye=[`disabled`,`title`],Xe=[`disabled`],Ze={class:`env-card`},Qe={class:`ec-head`},$e={class:`ec-detail mono`},et={class:`ec-detail dim`},tt={class:`ec-detail`},nt={class:`mono`},rt={class:`dim`},it={class:`ec-head`},at={key:0,class:`ec-state`},ot={key:0,class:`ec-detail mono`},st={key:1,class:`ec-issues mono`},ct=[`title`],lt={class:`tag`},ut={class:`ec-actions`},dt={key:1,class:`env-task`},ft={class:`et-head mono`},pt={class:`dim`},mt={key:0,class:`dim`},ht={class:`et-log mono`},gt={key:0,class:`err`},_t={class:`aw-tile zone`},vt={class:`zone-head`},yt={class:`mono cnt`},bt={class:`zone-actions`},xt={key:0,class:`tbl`},St={class:`num`},Ct={class:`num`},wt=[`onClick`],Tt={class:`mono dim`},Et={class:`mono`},Dt={class:`mono`},Ot={class:`mono num`},kt={class:`mono num`},At={key:0,class:`note-edit`},jt=[`placeholder`,`onKeyup`],Mt=[`onClick`],Nt={key:1,class:`note-text`},Pt=[`title`],Ft=[`title`,`onClick`],It=[`title`,`onClick`],Lt={key:0,class:`detail-row`},Rt={colspan:`7`},zt={key:0,class:`dim pad`},Bt={key:1,class:`err pad`},Vt={key:2,class:`det-grid`},Ht={class:`det-title`},Ut={class:`sub-tbl`},Wt={class:`num`},Gt={class:`num`},Kt={class:`num`},qt={class:`num`},Jt={class:`num`},Yt={class:`mono`},Xt={class:`role-chip`},Zt={class:`mono num`},Qt={class:`mono num`},$t={class:`mono num`},en={class:`mono num`},tn={class:`mono num`},nn={class:`det-title`},rn={key:0,class:`sub-tbl`},an={class:`num`},on={class:`num`},sn={class:`mono`},cn={class:`mono`},ln={class:`mono num`},un={class:`mono num`},dn={key:1,class:`dim`},fn={class:`det-title`},pn={class:`mono dim run-line`},mn={key:3,class:`dim pad`},hn={key:1,class:`empty`},gn={class:`aw-tile zone`},_n={class:`zone-head`},vn={class:`mono cnt`},yn=[`title`],bn={key:0,class:`tbl`},xn={class:`prog-th`},Sn={class:`right`},Cn=[`onClick`],wn={class:`mono`},Tn={class:`mono dim`},En={class:`mono dim`},Dn={class:`mono dim`},On={class:`prog-cell`},kn={class:`prog`},An={class:`mono prog-num`},jn={class:`mono dim`},Mn={class:`right acts`},Nn=[`disabled`,`onClick`],Pn=[`disabled`,`onClick`],Fn=[`title`,`onClick`],In={key:0,class:`detail-row`},Ln={colspan:`8`},Rn={key:0,class:`dim pad`},zn={key:1,class:`err pad`},Bn={key:2,class:`det-grid`},Vn={class:`det-title`},Hn={key:0,class:`sub-tbl`},Un={class:`num`},Wn={class:`num`},Gn={class:`mono gate-id`},Kn={class:`dim`},qn={class:`mono num`},Jn={class:`mono num dim`},Yn={class:`dim gate-detail`},Xn={key:1,class:`dim`},Zn={key:2,class:`mono dim gate-detail`},Qn={key:3,class:`err gate-detail`},$n={class:`det-title`},er={key:0,class:`mono live-hint`},tr={class:`logs`},nr={key:1,class:`empty`},rr={class:`aw-tile zone`},ir={class:`zone-head`},ar={class:`mono cnt`},or={class:`zone-actions`},sr={value:``},cr=[`value`],lr=[`disabled`],ur={key:0,class:`tbl`},dr=[`title`],fr=[`title`],pr={class:`mono`},mr={key:0,class:`best-tag`},hr={class:`mono dim`},gr={class:`note-cell`},_r=[`title`],vr={class:`mono dim`},yr={class:`mono num`},br={class:`mono num`},xr={key:1,class:`empty`},Sr={key:2,class:`err pad`},Cr={class:`aw-tile zone`},wr={class:`zone-head`},Tr={class:`mono cnt`},Er={key:0,class:`tbl`},Dr=[`title`],Or={class:`right`},kr={class:`mono`},Ar={class:`mono dim`},jr={class:`mono dim`},Mr={class:`mono dim`},Nr={class:`mono dim`},Pr={key:0,class:`note-edit`},Fr=[`placeholder`,`onKeyup`],Ir=[`onClick`],Lr={key:1,class:`note-text`},Rr=[`title`],zr=[`title`,`onClick`],Br={class:`right acts`},Vr=[`disabled`,`onClick`],Hr={key:0,class:`dim`},Ur=[`title`,`onClick`],Wr={key:1,class:`empty`},Gr={class:`aw-tile zone`},Kr={class:`zone-head`},qr={value:``},Jr=[`value`],Yr={key:0,class:`pc-body`},Xr={class:`det-title`},Zr={class:`io-grid mono`},Qr={class:`io-item`},$r={class:`io-item`},ei={class:`io-item`},ti=[`title`],ni=[`title`],ri=[`title`],ii={class:`pc-form`},ai={class:`pc-field`},oi=[`placeholder`],si={class:`pc-side`},ci={class:`pc-field`},li={class:`pc-field`},ui=[`disabled`],di={class:`hint dim`},fi={key:0,class:`err`},pi={class:`det-title`},mi={class:`sub-tbl`},hi={class:`num`},gi={class:`num`},_i={key:0,class:`dim`},vi={class:`mono num`},yi={class:`mono num dim`},bi={class:`mono dim gate-detail`},xi={key:1,class:`empty`},Si={key:1,class:`empty`},Ci={class:`modal`},wi={class:`m-title`},Ti={class:`f-grid`},Ei={class:`f`},Di={class:`f`},Oi={class:`f`},ki={class:`sec-label`},Ai={class:`node-rows`},ji=[`onUpdate:modelValue`,`placeholder`],Mi=[`onUpdate:modelValue`],Ni={value:`control`},Pi={value:`feature`},Fi={value:`target`},Ii=[`disabled`,`onClick`],Li={class:`f-grid`},Ri={class:`f`},zi={class:`f`},Bi={class:`f`},Vi={class:`f`},Hi={class:`f`},Ui={class:`f`},Wi={class:`f`},Gi={value:`mpc_surrogate`},Ki={value:`quality_predict`},qi={class:`f wide`},Ji=[`placeholder`],Yi={key:0,class:`m-err`},Xi={class:`m-actions`},Zi=[`disabled`],Qi=y(i({__name:`index`,setup(i){let{t:y}=oe();le({layout:`default`}),ie({title:()=>y(`aml.k1amlx160`)});function x(e,t){return de({base:`/api/workshop/aml`,path:e,init:t})}let S=pe(),fe=ce(),Qi=null,$i=null;ee(()=>{fe.ensureConnected(),Qi=S.ensure(),D(),pa(),xa(),N(),V(),J(),(O.value?.task?.status??E.value?.env?.task?.status)===`running`&&(k.value=!0,ga()),ue(()=>{D(),V()},8e3,{bgMs:3e4}),$i=se(()=>{let e=W.value;if(!e||document.hidden)return;let t=H.value.find(t=>t.id===e);t&&T(t.status)&&Ra(e)},5e3)}),r(()=>{Qi?.(),$i&&clearInterval($i),ha()}),t(()=>S.lastJob.value,e=>{e&&na(e.status)&&V()}),t(()=>S.lastModel.value,()=>{J()}),t(()=>S.lastDataset.value,()=>{N()});function ea(e){if(!e)return`--`;let t=new Date(e);return Number.isFinite(t.getTime())?`${String(t.getMonth()+1).padStart(2,`0`)}-${String(t.getDate()).padStart(2,`0`)} ${String(t.getHours()).padStart(2,`0`)}:${String(t.getMinutes()).padStart(2,`0`)}`:`--`}function C(e,t=4){return e==null||!Number.isFinite(e)?`--`:String(Number(e.toFixed(t)))}function ta(e,t=1){return e==null||!Number.isFinite(e)?`--`:`${(e*100).toFixed(t)}%`}function w(e){return e.length>12?`${e.slice(0,10)}…`:e}function T(e){return e===`queued`||e===`provisioning`||e===`training`||e===`evaluating`}function na(e){return e===`done`||e===`failed`||e===`cancelled`||e===`timeout`||e===`interrupted`}function ra(e){return e===`failed`||e===`timeout`||e===`interrupted`}function ia(e){let t={queued:`aml.k1amlx100`,provisioning:`aml.k1amlx101`,training:`aml.k1amlx102`,evaluating:`aml.k1amlx103`,done:`aml.k1amlx104`,failed:`aml.k1amlx105`,cancelled:`aml.k1amlx106`,timeout:`aml.k1amlx107`,interrupted:`aml.k1amlx108`};return t[e]?y(t[e]):e}function aa(e){let t={running:`aml.k1amlx119`,gates_passed:`aml.k1amlx080`,gates_failed:`aml.k1amlx081`,failed:`aml.k1amlx105`};return t[e]?y(t[e]):e}let E=h(null),oa=h(``);async function D(){try{E.value=await x(``),oa.value=``}catch(e){oa.value=b(e)}}let sa=l(()=>{let e=E.value?.runtime;return e?e.python.ok?e.python.version??y(`aml.k1amlx004`):y(`aml.k1amlx005`):`--`}),ca=l(()=>E.value?E.value.runtime.venvReady?y(`aml.k1amlx007`):y(`aml.k1amlx008`):`--`),O=h(null),la=h(!1),k=h(!1),ua=h(!1),da=l(()=>{let e=O.value?.uv??E.value?.env?.uv;return e?e.ok?e.version??y(`aml.k1amlx164`):y(`aml.k1amlx165`):`--`}),fa=l(()=>{let e=(O.value?.uv??E.value?.env?.uv)?.source;return e?{config:`aml.python.uvBin`,project:`./aml/tools`,state:`./aml/runtime/uv.json`,path:`PATH`}[e]??e:``});async function pa(){try{O.value=await x(`/env`)}catch{}}let ma=null;function ha(){ma!=null&&(clearInterval(ma),ma=null)}function ga(){ha(),ma=se(()=>{(async()=>{await pa(),await D(),(O.value?.task==null||O.value.task.status!==`running`)&&(ha(),k.value=!1)})()},1500)}async function _a(t,n){k.value=!0,ua.value=!0;try{await x(t,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify(n??{})}),await pa(),ga()}catch(t){k.value=!1,e.error(`${y(`aml.k1amlx203`)}:${b(t)}`)}}async function va(){await _a(`/env/uv`)}async function ya(e=!1){await _a(`/env/venv`,{force:e})}async function ba(){k.value=!0;try{O.value=await x(`/env/recheck`,{method:`POST`,headers:{"content-type":`application/json`},body:`{}`}),await D()}catch(t){e.error(`${y(`aml.k1amlx203`)}:${b(t)}`)}finally{k.value=!1}}let A=h(null);async function xa(){try{A.value=await x(`/entities`)}catch{}}async function Sa(){try{let t=await x(`/entities/prune`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({dryRun:!1})});e.success(`${y(`aml.k1amlx188`)}:${t.removed.length}`),await xa()}catch(t){e.error(`${y(`aml.k1amlx203`)}:${b(t)}`)}}function Ca(){D(),pa(),xa(),N(),V(),J()}let j=h([]),M=h(``);async function N(){try{let e=await x(`/datasets`);j.value=e.datasets}catch{}}let wa=h(``),P=h(``);function Ta(e,t){wa.value=e,P.value=t??``}function F(){wa.value=``,P.value=``}async function Ea(t,n){try{await x(`/${t}/${n}`,{method:`PATCH`,headers:{"content-type":`application/json`},body:JSON.stringify({note:P.value})}),e.success(y(`aml.k1amlx192`)),F(),t===`datasets`?await N():await J()}catch(t){e.error(`${y(`aml.k1amlx203`)}:${b(t)}`)}}async function Da(t,n,r){if(await Oa(r))try{await x(`/${t}/${n}`,{method:`DELETE`}),e.success(y(`aml.k1amlx193`)),t===`datasets`?await N():t===`models`?await J():await V(),await D(),await xa()}catch(t){e.error(`${y(`aml.k1amlx203`)}:${b(t)}`)}}async function Oa(e){try{let{Modal:t}=await ae(async()=>{let{Modal:e}=await import(`./BU83-NnX.js`).then(e=>e.t);return{Modal:e}},__vite__mapDeps([0,1,2,3]),import.meta.url);return await new Promise(n=>{t.confirm({title:e,okText:y(`aml.k1amlx190`),cancelText:y(`aml.k1amlx202`),onOk:()=>n(!0),onCancel:()=>n(!1)})})}catch{return!0}}let I=te({});async function ka(e){if(M.value=M.value===e?``:e,M.value&&!I[e]){I[e]={loading:!0,error:``,report:null};try{let t=await x(`/datasets/${e}`);I[e]={loading:!1,error:``,report:t.report}}catch(t){I[e]={loading:!1,error:b(t),report:null}}}}let L=h(!1),Aa=h(!1),R=h(``),z=te({lineId:``,productId:``,recipeId:``,beatMs:5e3,historySteps:60,horizonSteps:30,valRatio:.15,testRatio:.15,seed:7,purpose:`mpc_surrogate`,note:``}),B=te([{nodeId:``,role:`control`},{nodeId:``,role:`target`}]);function ja(){R.value=``,L.value=!0}function Ma(){B.push({nodeId:``,role:`feature`})}function Na(e){B.splice(e,1)}async function Pa(){R.value=``;let t=B.filter(e=>e.nodeId.trim()).map(e=>({nodeId:e.nodeId.trim(),role:e.role}));if(!z.lineId.trim()||!z.productId.trim()||!z.recipeId.trim()){R.value=y(`aml.k1amlx161`);return}if(t.length<2||!t.some(e=>e.role===`target`)){R.value=y(`aml.k1amlx054`);return}Aa.value=!0;try{let n=await x(`/datasets`,{method:`POST`,body:JSON.stringify({lineId:z.lineId.trim(),productId:z.productId.trim(),recipeId:z.recipeId.trim(),nodes:t,beatMs:Number(z.beatMs),window:{historySteps:Number(z.historySteps),horizonSteps:Number(z.horizonSteps)},split:{valRatio:Number(z.valRatio),testRatio:Number(z.testRatio),seed:Number(z.seed)},purpose:z.purpose,note:z.note.trim()||void 0})});e.success(y(`aml.k1amlx073`,{p0:w(n.dataset.id),p1:n.dataset.rowCount})),L.value=!1,await N()}catch(e){R.value=b(e)}finally{Aa.value=!1}}let Fa=h([]);async function V(){try{let e=await x(`/jobs`);Fa.value=e.jobs}catch{}}let H=l(()=>Fa.value.map(e=>{let t=S.jobs.value.get(e.id);return t?{...e,status:t.status||e.status,stage:t.stage||e.stage,progress:t.progress??e.progress,live:!0}:e})),U=te({}),W=h(``);async function Ia(e){return(await x(`/jobs/${e}/logs?lines=120`)).logs}async function La(e){if(W.value=W.value===e?``:e,W.value&&!U[e]){U[e]={loading:!0,error:``,metrics:null,gates:null,logs:[]};try{let[t,n]=await Promise.all([x(`/jobs/${e}`),Ia(e)]);U[e]={loading:!1,error:``,metrics:t.metrics,gates:t.gates,logs:n}}catch(t){U[e]={loading:!1,error:b(t),metrics:null,gates:null,logs:[]}}}}async function Ra(e){let t=U[e];if(t)try{t.logs=await Ia(e)}catch{}}let za=h(``),Ba=h(``);async function Va(t){if(za.value!==t){za.value=t;return}za.value=``,Ba.value=t;try{await x(`/jobs/${t}/cancel`,{method:`POST`,body:JSON.stringify({})}),e.success(y(`aml.k1amlx097`,{p0:w(t)})),await V()}catch(t){e.error(b(t))}finally{Ba.value=``}}let Ha=h(``),Ua=h(``);async function Wa(t){if(Ha.value!==t){Ha.value=t;return}Ha.value=``,Ua.value=t;try{await x(`/jobs/${t}/retry`,{method:`POST`,body:JSON.stringify({})}),e.success(y(`aml.k1amlx098`,{p0:w(t)})),await V()}catch(t){e.error(b(t))}finally{Ua.value=``}}let G=h(``),K=h([]),Ga=h(!1),Ka=h(``);async function qa(){if(!G.value){K.value=[];return}Ga.value=!0,Ka.value=``;try{let e=await x(`/experiments?datasetId=${encodeURIComponent(G.value)}`);K.value=e.experiments}catch(e){Ka.value=b(e)}finally{Ga.value=!1}}let Ja=l(()=>{let e=null;for(let t of K.value){let n=t.metrics?.oneStepTest?.nrmse;t.status===`gates_passed`&&n!=null&&Number.isFinite(n)&&(e==null||n<e.nrmse)&&(e={id:t.id,nrmse:n})}return e?.id??``}),q=h([]);async function J(){try{let e=await x(`/models`);q.value=e.models}catch{}}let Ya=h(``),Xa=h(``);function Za(e){return e.stage===`candidate`?[{to:`shadow`,key:`aml.k1amlx128`},{to:`production`,key:`aml.k1amlx129`}]:e.stage===`shadow`?[{to:`production`,key:`aml.k1amlx129`},{to:`retired`,key:`aml.k1amlx130`}]:e.stage===`production`?[{to:`retired`,key:`aml.k1amlx130`}]:[]}async function Qa(t,n){let r=`${t.id}:${n}`;if(Ya.value!==r){Ya.value=r;return}Ya.value=``,Xa.value=r;try{let r=await x(`/models/${t.id}/promote`,{method:`POST`,body:JSON.stringify({toStage:n})});r.ok&&e.success(y(`aml.k1amlx132`,{p0:r.from??t.stage,p1:n})),await Promise.all([J(),D()])}catch(t){e.error(b(t))}finally{Xa.value=``}}let $a=l(()=>q.value.filter(e=>e.stage===`production`)),eo=h(``),Y=l(()=>q.value.find(e=>e.id===eo.value)??null),to=h(``),X=h(``),Z=h(null),no=h(!1),Q=h(``),$=h(null);function ro(){e.info(y(`aml.k1amlx146`))}function io(e){let t=e.trim();if(!t)return null;try{let e=JSON.parse(t);return!Array.isArray(e)||e.length===0?null:e.every(e=>Array.isArray(e)&&e.length>0&&e.every(e=>typeof e==`number`&&Number.isFinite(e)))?e:null}catch{return null}}async function ao(){Q.value=``,$.value=null;let t=Y.value;if(!t)return;let n=io(to.value);if(!n){Q.value=y(`aml.k1amlx153`);return}let r=X.value.trim()?io(X.value):void 0;if(X.value.trim()&&!r){Q.value=y(`aml.k1amlx153`);return}no.value=!0;try{let ee=typeof Z.value==`number`&&Number.isFinite(Z.value)?Z.value:void 0,i=await x(`/models/${t.id}/predict`,{method:`POST`,body:JSON.stringify({history:n,controls:r,steps:ee})});$.value=i.prediction,e.success(y(`aml.k1amlx154`,{p0:i.prediction.forecast.length,p1:i.prediction.targetNodes.length}))}catch(e){Q.value=b(e)}finally{no.value=!1}}return(e,t)=>(o(),d(`div`,me,[u(`div`,he,[u(`div`,null,[t[28]||=u(`p`,{class:`aw-kicker`},` AGENTWORKSHOP / AML STUDIO `,-1),u(`h1`,null,a(e.$t(`aml.k1amlx001`)),1),u(`p`,ge,a(e.$t(`aml.k1amlx002`)),1)]),u(`div`,_e,[u(`span`,{class:s([`badge`,{bad:E.value!=null&&!E.value.runtime.python.ok}]),title:E.value?.runtime.python.reason??``},`PYTHON · `+a(sa.value),11,ve),u(`span`,{class:s([`badge`,{bad:E.value!=null&&!E.value.runtime.venvReady}])},`VENV · `+a(ca.value),3),u(`span`,{class:s([`badge`,{bad:O.value!=null&&!O.value.uv.ok}]),title:O.value?.uv.reason??O.value?.uv.path??``},`UV · `+a(da.value),11,ye)])]),E.value!=null&&!E.value.runtime.python.ok?(o(),d(`div`,be,[t[29]||=u(`span`,{class:`i-tabler-alert-triangle`},null,-1),u(`span`,xe,[g(a(e.$t(`aml.k1amlx014`)),1),u(`b`,Se,a(E.value.runtime.python.reason??``),1)])])):p(``,!0),E.value?(o(),d(`section`,Ce,[u(`div`,we,[u(`span`,{class:s([`ov-item`,E.value.runtime.python.ok?`ok`:`bad`])},[u(`span`,{class:s(E.value.runtime.python.ok?`i-tabler-circle-check`:`i-tabler-alert-triangle`)},null,2),g(` `+a(e.$t(`aml.k1amlx003`))+` · `+a(sa.value),1)],2),u(`span`,{class:s([`ov-item`,{ok:E.value.runtime.venvReady}])},a(e.$t(`aml.k1amlx006`))+` · `+a(ca.value),3),u(`span`,Te,[g(a(e.$t(`aml.k1amlx009`))+` `,1),u(`b`,null,a(E.value.runtime.queued),1)]),u(`span`,Ee,[g(a(e.$t(`aml.k1amlx010`))+` `,1),u(`b`,null,a(E.value.runtime.running),1)]),t[30]||=u(`span`,{class:`sep`},`·`,-1),u(`span`,De,[g(a(e.$t(`aml.k1amlx011`))+` `,1),u(`b`,null,a(E.value.counts.datasets),1)]),u(`span`,Oe,[g(a(e.$t(`aml.k1amlx012`))+` `,1),u(`b`,null,a(E.value.counts.models),1)]),u(`span`,{class:`ov-item accent`,title:e.$t(`aml.k1amlx013`)},[g(a(e.$t(`aml.k1amlx013`))+` `,1),u(`b`,null,a(E.value.counts.productions),1)],8,ke),u(`button`,{class:`mini-btn reload`,onClick:Ca},a(e.$t(`aml.k1amlx017`)),1)])])):oa.value?(o(),d(`p`,Ae,a(e.$t(`aml.k1amlx015`))+`:`+a(oa.value),1)):p(``,!0),O.value?(o(),d(`section`,je,[u(`div`,Me,[u(`h2`,null,a(e.$t(`aml.k1amlx162`)),1),u(`div`,Ne,[u(`button`,{class:`mini-btn`,disabled:k.value,onClick:ba},a(e.$t(`aml.k1amlx175`)),9,Pe),u(`button`,{class:`mini-btn`,onClick:t[0]||=e=>la.value=!la.value},a(la.value?e.$t(`aml.k1amlx181`):e.$t(`aml.k1amlx180`)),1)])]),O.value.preflight.canRunJobs?p(``,!0):(o(),d(`div`,Fe,[t[31]||=u(`span`,{class:`i-tabler-alert-triangle`},null,-1),u(`span`,Ie,[g(a(e.$t(`aml.k1amlx178`))+`:`,1),u(`b`,Le,a(O.value.preflight.blockers.join(` / `)),1)])])),u(`div`,Re,[u(`div`,{class:s([`env-card`,O.value.uv.ok?`ok`:`bad`])},[u(`div`,ze,[u(`span`,{class:s(O.value.uv.ok?`i-tabler-circle-check`:`i-tabler-alert-triangle`)},null,2),u(`b`,null,a(e.$t(`aml.k1amlx163`)),1),u(`span`,Be,a(da.value),1)]),O.value.uv.ok?(o(),d(`p`,Ve,[g(a(O.value.uv.path),1),fa.value?(o(),d(f,{key:0},[g(` · `+a(fa.value),1)],64)):p(``,!0)])):(o(),d(`p`,He,a(e.$t(`aml.k1amlx177`)),1)),u(`div`,Ue,[O.value.uv.ok?p(``,!0):(o(),d(`button`,{key:0,class:`mini-btn primary`,disabled:k.value,title:e.$t(`aml.k1amlx176`),onClick:va},[t[32]||=u(`span`,{class:`i-tabler-download`},null,-1),g(` `+a(O.value.task?.kind===`install-uv`&&O.value.task.status===`running`?e.$t(`aml.k1amlx167`):e.$t(`aml.k1amlx166`)),1)],8,We))])],2),u(`div`,{class:s([`env-card`,O.value.venv.ready?`ok`:`bad`])},[u(`div`,Ge,[u(`span`,{class:s(O.value.venv.ready?`i-tabler-circle-check`:`i-tabler-alert-triangle`)},null,2),u(`b`,null,a(e.$t(`aml.k1amlx168`)),1),u(`span`,Ke,a(O.value.venv.ready?e.$t(`aml.k1amlx007`):e.$t(`aml.k1amlx008`)),1)]),u(`p`,qe,[g(a(O.value.venv.dir)+` `,1),O.value.venv.ready?(o(),d(f,{key:0},[g(` · `+a(O.value.venv.sizeMb)+` MB `,1)],64)):p(``,!0)]),u(`div`,Je,[u(`button`,{class:`mini-btn primary`,disabled:k.value||!O.value.python.ok,title:O.value.python.ok?``:O.value.python.reason??``,onClick:t[1]||=e=>ya(!1)},[t[33]||=u(`span`,{class:`i-tabler-plus`},null,-1),g(` `+a(O.value.task?.kind===`create-venv`&&O.value.task.status===`running`?e.$t(`aml.k1amlx170`):e.$t(`aml.k1amlx168`)),1)],8,Ye),O.value.venv.ready?(o(),d(`button`,{key:0,class:`mini-btn`,disabled:k.value,onClick:t[2]||=e=>ya(!0)},a(e.$t(`aml.k1amlx169`)),9,Xe)):p(``,!0)])],2),u(`div`,Ze,[u(`div`,Qe,[t[34]||=u(`span`,{class:`i-tabler-folder`},null,-1),u(`b`,null,a(e.$t(`aml.k1amlx171`)),1)]),u(`p`,$e,a(O.value.amlRoot),1),u(`p`,et,a(e.$t(`aml.k1amlx201`)),1),u(`p`,tt,[g(a(e.$t(`aml.k1amlx174`))+`: `,1),u(`b`,nt,a(O.value.disk.usedMb)+` / `+a(O.value.disk.quotaMb)+` MB`,1),u(`span`,rt,` · `+a(O.value.amlRootSource),1)])]),u(`div`,{class:s([`env-card`,A.value==null?``:A.value.ok?`ok`:`bad`])},[u(`div`,it,[u(`span`,{class:s(A.value?.ok===!1?`i-tabler-alert-triangle`:`i-tabler-database`)},null,2),u(`b`,null,a(e.$t(`aml.k1amlx182`)),1),A.value?(o(),d(`span`,at,a(A.value.ok?e.$t(`aml.k1amlx183`):e.$t(`aml.k1amlx184`)),1)):p(``,!0)]),A.value?(o(),d(`p`,ot,a(e.$t(`aml.k1amlx011`))+` `+a(A.value.counts.datasets)+`/`+a(A.value.entities.datasets)+` · `+a(e.$t(`aml.k1amlx010`))+` `+a(A.value.counts.jobs)+`/`+a(A.value.entities.jobs)+` · `+a(e.$t(`aml.k1amlx012`))+` `+a(A.value.counts.models)+`/`+a(A.value.entities.models),1)):p(``,!0),A.value&&A.value.issues.length>0?(o(),d(`ul`,st,[(o(!0),d(f,null,c(A.value.issues.slice(0,5),t=>(o(),d(`li`,{key:`${t.kind}:${t.id}:${t.problem}`,title:t.detail},[u(`span`,lt,a(t.problem===`entity_missing`?e.$t(`aml.k1amlx185`):t.problem===`orphan_dir`?e.$t(`aml.k1amlx186`):e.$t(`aml.k1amlx187`)),1),g(` `+a(t.kind)+` `+a(w(t.id)),1)],8,ct))),128))])):p(``,!0),u(`div`,ut,[A.value&&A.value.issues.some(e=>e.problem===`orphan_dir`)?(o(),d(`button`,{key:0,class:`mini-btn`,onClick:Sa},[t[35]||=u(`span`,{class:`i-tabler-trash`},null,-1),g(` `+a(e.$t(`aml.k1amlx188`)),1)])):p(``,!0)])],2)]),O.value.task&&la.value?(o(),d(`div`,dt,[u(`div`,ft,[u(`span`,{class:s(O.value.task.status===`running`?`i-tabler-loader-2 spin`:O.value.task.status===`done`?`i-tabler-circle-check`:`i-tabler-alert-triangle`)},null,2),u(`b`,null,a(O.value.task.kind),1),u(`span`,pt,a(O.value.task.status),1),O.value.task.status===`running`?(o(),d(`span`,mt,`· `+a(e.$t(`aml.k1amlx179`)),1)):p(``,!0)]),u(`pre`,ht,a(O.value.task.log.slice(-40).join(`
3
- `)),1),O.value.task.error?(o(),d(`p`,gt,a(O.value.task.error),1)):p(``,!0)])):p(``,!0)])):p(``,!0),u(`section`,_t,[u(`div`,vt,[u(`h2`,null,[t[36]||=u(`span`,{class:`i-tabler-database`},null,-1),g(` `+a(e.$t(`aml.k1amlx016`))+` `,1),u(`b`,yt,a(j.value.length),1)]),u(`div`,bt,[u(`button`,{class:`mini-btn`,onClick:t[3]||=e=>N()},a(e.$t(`aml.k1amlx017`)),1),u(`button`,{class:`pill-btn`,onClick:ja},[t[37]||=u(`span`,{class:`i-tabler-plus`},null,-1),g(` `+a(e.$t(`aml.k1amlx018`)),1)])])]),j.value.length?(o(),d(`table`,xt,[u(`thead`,null,[u(`tr`,null,[u(`th`,null,a(e.$t(`aml.k1amlx020`)),1),u(`th`,null,a(e.$t(`aml.k1amlx021`)),1),u(`th`,null,a(e.$t(`aml.k1amlx022`)),1),u(`th`,St,a(e.$t(`aml.k1amlx023`)),1),u(`th`,Ct,a(e.$t(`aml.k1amlx024`)),1),u(`th`,null,a(e.$t(`aml.k1amlx025`)),1),u(`th`,null,a(e.$t(`aml.k1amlx026`)),1)])]),u(`tbody`,null,[(o(!0),d(f,null,c(j.value,n=>(o(),d(f,{key:n.id},[u(`tr`,{class:s([`row-main`,{open:M.value===n.id}]),onClick:e=>ka(n.id)},[u(`td`,Tt,a(ea(n.createdAt)),1),u(`td`,Et,a(w(n.productId)),1),u(`td`,Dt,a(w(n.recipeId)),1),u(`td`,Ot,a(n.rowCount),1),u(`td`,kt,a(n.runIds.length),1),u(`td`,null,[g(a(n.createdBy),1),u(`small`,{class:s([`kind`,n.createdByKind])},a(n.createdByKind===`agent`?`Agent`:e.$t(`aml.k1amlx049`)),3)]),u(`td`,{class:`note-cell`,onClick:t[5]||=_(()=>{},[`stop`])},[wa.value===n.id?(o(),d(`div`,At,[m(u(`input`,{"onUpdate:modelValue":t[4]||=e=>P.value=e,placeholder:e.$t(`aml.k1amlx189`),onKeyup:[re(e=>Ea(`datasets`,n.id),[`enter`]),re(F,[`esc`])]},null,40,jt),[[v,P.value]]),u(`button`,{class:`mini-btn`,onClick:e=>Ea(`datasets`,n.id)},a(e.$t(`aml.k1amlx191`)),9,Mt),u(`button`,{class:`mini-btn`,onClick:F},a(e.$t(`aml.k1amlx202`)),1)])):(o(),d(`span`,Nt,[u(`span`,{class:`note`,title:n.note},a(n.note||`--`),9,Pt),u(`span`,{class:`i-tabler-pencil edit-i`,title:e.$t(`aml.k1amlx189`),onClick:e=>Ta(n.id,n.note)},null,8,Ft),u(`span`,{class:`i-tabler-trash edit-i`,title:e.$t(`aml.k1amlx190`),onClick:t=>Da(`datasets`,n.id,e.$t(`aml.k1amlx198`))},null,8,It)]))])],10,wt),M.value===n.id?(o(),d(`tr`,Lt,[u(`td`,Rt,[I[n.id]?.loading?(o(),d(`div`,zt,a(e.$t(`aml.k1amlx030`)),1)):I[n.id]?.error?(o(),d(`div`,Bt,a(e.$t(`aml.k1amlx031`))+`:`+a(I[n.id]?.error),1)):I[n.id]?.report?(o(),d(`div`,Vt,[u(`div`,null,[u(`p`,Ht,a(e.$t(`aml.k1amlx027`)),1),u(`table`,Ut,[u(`thead`,null,[u(`tr`,null,[u(`th`,null,a(e.$t(`aml.k1amlx033`)),1),u(`th`,null,a(e.$t(`aml.k1amlx034`)),1),u(`th`,Wt,a(e.$t(`aml.k1amlx035`)),1),u(`th`,Gt,a(e.$t(`aml.k1amlx036`)),1),u(`th`,Kt,a(e.$t(`aml.k1amlx037`)),1),u(`th`,qt,a(e.$t(`aml.k1amlx038`)),1),u(`th`,Jt,a(e.$t(`aml.k1amlx039`)),1)])]),u(`tbody`,null,[(o(!0),d(f,null,c(I[n.id]?.report?.nodeSummaries,e=>(o(),d(`tr`,{key:e.nodeId},[u(`td`,Yt,a(e.nodeId),1),u(`td`,null,[u(`small`,Xt,a(e.role),1)]),u(`td`,Zt,a(ta(e.cleanedRatio)),1),u(`td`,Qt,a(ta(e.missingRatio)),1),u(`td`,$t,a(C(e.mean,3)),1),u(`td`,en,a(C(e.std,3)),1),u(`td`,tn,a(C(e.min,2))+`~`+a(C(e.max,2)),1)]))),128))])])]),u(`div`,null,[u(`p`,nn,a(e.$t(`aml.k1amlx028`)),1),I[n.id]?.report?.lagEstimates.length?(o(),d(`table`,rn,[u(`thead`,null,[u(`tr`,null,[u(`th`,null,a(e.$t(`aml.k1amlx040`)),1),u(`th`,null,a(e.$t(`aml.k1amlx041`)),1),u(`th`,an,a(e.$t(`aml.k1amlx042`)),1),u(`th`,on,a(e.$t(`aml.k1amlx043`)),1)])]),u(`tbody`,null,[(o(!0),d(f,null,c(I[n.id]?.report?.lagEstimates,e=>(o(),d(`tr`,{key:`${e.controlId}->${e.targetId}`},[u(`td`,sn,a(e.controlId),1),u(`td`,cn,a(e.targetId),1),u(`td`,ln,a(e.lagSteps),1),u(`td`,un,a(C(e.corr,3)),1)]))),128))])])):(o(),d(`p`,dn,a(e.$t(`aml.k1amlx032`)),1)),u(`p`,fn,a(e.$t(`aml.k1amlx029`)),1),u(`p`,pn,[g(a(e.$t(`aml.k1amlx044`))+` `,1),u(`b`,null,a(I[n.id]?.report?.runsUsed.length??0),1),g(` · `+a(e.$t(`aml.k1amlx045`))+` `,1),u(`b`,null,a(I[n.id]?.report?.runsDropped.length??0),1),g(` · `+a(e.$t(`aml.k1amlx046`))+` `,1),u(`b`,null,a(I[n.id]?.report?.windowCount.train)+`/`+a(I[n.id]?.report?.windowCount.val)+`/`+a(I[n.id]?.report?.windowCount.test),1)]),(o(!0),d(f,null,c(I[n.id]?.report?.runsDropped,e=>(o(),d(`p`,{key:e.runId,class:`mono drop-line`},` ✗ `+a(w(e.runId))+` — `+a(e.reason),1))),128))])])):(o(),d(`p`,mn,a(e.$t(`aml.k1amlx047`)),1))])])):p(``,!0)],64))),128))])])):(o(),d(`p`,hn,a(e.$t(`aml.k1amlx019`)),1))]),u(`section`,gn,[u(`div`,_n,[u(`h2`,null,[t[38]||=u(`span`,{class:`i-tabler-brain`},null,-1),g(` `+a(e.$t(`aml.k1amlx074`))+` `,1),u(`b`,vn,a(H.value.length),1),H.value.some(e=>T(e.status))?(o(),d(`span`,{key:0,class:`live-dot`,title:e.$t(`aml.k1amlx091`)},null,8,yn)):p(``,!0)]),u(`button`,{class:`mini-btn`,onClick:t[6]||=e=>V()},a(e.$t(`aml.k1amlx017`)),1)]),H.value.length?(o(),d(`table`,bn,[u(`thead`,null,[u(`tr`,null,[u(`th`,null,a(e.$t(`aml.k1amlx076`)),1),u(`th`,null,a(e.$t(`aml.k1amlx011`)),1),u(`th`,null,a(e.$t(`aml.k1amlx066`)),1),u(`th`,null,a(e.$t(`aml.k1amlx077`)),1),u(`th`,null,a(e.$t(`aml.k1amlx078`)),1),u(`th`,xn,a(e.$t(`aml.k1amlx079`)),1),u(`th`,null,a(e.$t(`aml.k1amlx020`)),1),u(`th`,Sn,a(e.$t(`aml.k1amlx127`)),1)])]),u(`tbody`,null,[(o(!0),d(f,null,c(H.value,t=>(o(),d(f,{key:t.id},[u(`tr`,{class:s([`row-main`,{open:W.value===t.id}]),onClick:e=>La(t.id)},[u(`td`,wn,a(w(t.id)),1),u(`td`,Tn,a(w(t.datasetId)),1),u(`td`,En,a(t.purpose),1),u(`td`,null,[u(`span`,{class:s([`st-pill`,t.status])},a(ia(t.status)),3)]),u(`td`,Dn,a(t.stage||`--`),1),u(`td`,On,[u(`span`,kn,[u(`i`,{style:n({width:`${Math.max(0,Math.min(100,t.progress))}%`}),class:s({done:t.status===`done`,bad:t.status===`failed`})},null,6)]),u(`span`,An,a(Math.round(t.progress))+`%`,1)]),u(`td`,jn,a(ea(t.createdAt)),1),u(`td`,Mn,[T(t.status)?(o(),d(`button`,{key:0,class:`mini-btn danger`,disabled:Ba.value===t.id,onClick:_(e=>Va(t.id),[`stop`])},a(za.value===t.id?e.$t(`aml.k1amlx094`):Ba.value===t.id?e.$t(`aml.k1amlx093`):e.$t(`aml.k1amlx071`)),9,Nn)):p(``,!0),ra(t.status)?(o(),d(`button`,{key:1,class:`mini-btn`,disabled:Ua.value===t.id,onClick:_(e=>Wa(t.id),[`stop`])},a(Ha.value===t.id?e.$t(`aml.k1amlx096`):e.$t(`aml.k1amlx095`)),9,Pn)):p(``,!0),T(t.status)?p(``,!0):(o(),d(`span`,{key:2,class:`i-tabler-trash edit-i`,title:e.$t(`aml.k1amlx190`),onClick:_(n=>Da(`jobs`,t.id,e.$t(`aml.k1amlx200`)),[`stop`])},null,8,Fn))])],10,Cn),W.value===t.id?(o(),d(`tr`,In,[u(`td`,Ln,[U[t.id]?.loading?(o(),d(`div`,Rn,a(e.$t(`aml.k1amlx030`)),1)):U[t.id]?.error?(o(),d(`div`,zn,a(U[t.id]?.error),1)):(o(),d(`div`,Bn,[u(`div`,null,[u(`p`,Vn,a(e.$t(`aml.k1amlx083`)),1),U[t.id]?.gates?.checks.length?(o(),d(`table`,Hn,[u(`thead`,null,[u(`tr`,null,[u(`th`,null,a(e.$t(`aml.k1amlx084`)),1),u(`th`,Un,a(e.$t(`aml.k1amlx085`)),1),u(`th`,Wn,a(e.$t(`aml.k1amlx086`)),1),u(`th`,null,a(e.$t(`aml.k1amlx118`)),1)])]),u(`tbody`,null,[(o(!0),d(f,null,c(U[t.id]?.gates?.checks,t=>(o(),d(`tr`,{key:t.id},[u(`td`,null,[u(`b`,Gn,a(t.id),1),u(`small`,Kn,a(t.name),1)]),u(`td`,qn,a(C(t.value)),1),u(`td`,Jn,a(C(t.threshold)),1),u(`td`,null,[u(`span`,{class:s([`verdict`,t.pass?`pass`:`fail`])},a(t.pass?e.$t(`aml.k1amlx087`):e.$t(`aml.k1amlx088`)),3),u(`small`,Yn,a(t.detail),1)])]))),128))])])):(o(),d(`p`,Xn,a(e.$t(`aml.k1amlx082`)),1)),U[t.id]?.metrics?.oneStepTest?(o(),d(`p`,Zn,[g(a(e.$t(`aml.k1amlx099`))+`: `+a(e.$t(`aml.k1amlx116`))+` `+a(C(U[t.id]?.metrics?.oneStepTest?.nrmse))+` `,1),U[t.id]?.metrics?.rolloutTest?(o(),d(f,{key:0},[g(` · `+a(e.$t(`aml.k1amlx117`))+` `+a(C(U[t.id]?.metrics?.rolloutTest?.nrmse)),1)],64)):p(``,!0)])):p(``,!0),t.error?(o(),d(`p`,Qn,a(e.$t(`aml.k1amlx092`))+`:`+a(t.error),1)):p(``,!0)]),u(`div`,null,[u(`p`,$n,[g(a(e.$t(`aml.k1amlx089`))+` `,1),T(t.status)?(o(),d(`span`,er,a(e.$t(`aml.k1amlx091`)),1)):p(``,!0)]),u(`pre`,tr,a((U[t.id]?.logs??[]).join(`
4
- `)||e.$t(`aml.k1amlx090`)),1)])]))])])):p(``,!0)],64))),128))])])):(o(),d(`p`,nr,a(e.$t(`aml.k1amlx075`)),1))]),u(`section`,rr,[u(`div`,ir,[u(`h2`,null,[t[39]||=u(`span`,{class:`i-tabler-trophy`},null,-1),g(` `+a(e.$t(`aml.k1amlx109`))+` `,1),u(`b`,ar,a(K.value.length),1)]),u(`div`,or,[m(u(`select`,{"onUpdate:modelValue":t[7]||=e=>G.value=e,class:`inp-sel`,onChange:qa},[u(`option`,sr,a(e.$t(`aml.k1amlx111`)),1),(o(!0),d(f,null,c(j.value,e=>(o(),d(`option`,{key:e.id,value:e.id},a(w(e.id))+` · `+a(w(e.recipeId)),9,cr))),128))],544),[[ne,G.value]]),u(`button`,{class:`mini-btn`,disabled:!G.value,onClick:qa},a(e.$t(`aml.k1amlx017`)),9,lr)])]),K.value.length?(o(),d(`table`,ur,[u(`thead`,null,[u(`tr`,null,[u(`th`,null,a(e.$t(`aml.k1amlx113`)),1),u(`th`,null,a(e.$t(`aml.k1amlx020`)),1),u(`th`,null,a(e.$t(`aml.k1amlx114`)),1),u(`th`,null,a(e.$t(`aml.k1amlx115`)),1),u(`th`,{class:`num`,title:e.$t(`aml.k1amlx121`)},a(e.$t(`aml.k1amlx116`)),9,dr),u(`th`,{class:`num`,title:e.$t(`aml.k1amlx122`)},a(e.$t(`aml.k1amlx117`)),9,fr),u(`th`,null,a(e.$t(`aml.k1amlx118`)),1)])]),u(`tbody`,null,[(o(!0),d(f,null,c(K.value,t=>(o(),d(`tr`,{key:t.id,class:s({best:t.id===Ja.value})},[u(`td`,pr,[t.id===Ja.value?(o(),d(`span`,mr,a(e.$t(`aml.k1amlx120`)),1)):p(``,!0),g(` `+a(w(t.id)),1)]),u(`td`,hr,a(ea(t.createdAt)),1),u(`td`,gr,[u(`span`,{class:`note`,title:t.changeNote},a(t.changeNote||`--`),9,_r)]),u(`td`,vr,a(t.parentExperimentId?w(t.parentExperimentId):`--`),1),u(`td`,yr,a(C(t.metrics?.oneStepTest?.nrmse)),1),u(`td`,br,a(C(t.metrics?.rolloutTest?.nrmse)),1),u(`td`,null,[u(`span`,{class:s([`st-pill`,t.status])},a(aa(t.status)),3)])],2))),128))])])):(o(),d(`p`,xr,a(G.value?e.$t(`aml.k1amlx112`):e.$t(`aml.k1amlx110`)),1)),Ka.value?(o(),d(`p`,Sr,a(Ka.value),1)):p(``,!0)]),u(`section`,Cr,[u(`div`,wr,[u(`h2`,null,[t[40]||=u(`span`,{class:`i-tabler-cube-3d-sphere`},null,-1),g(` `+a(e.$t(`aml.k1amlx123`))+` `,1),u(`b`,Tr,a(q.value.length),1)]),u(`button`,{class:`mini-btn`,onClick:t[8]||=e=>J()},a(e.$t(`aml.k1amlx017`)),1)]),q.value.length?(o(),d(`table`,Er,[u(`thead`,null,[u(`tr`,null,[u(`th`,null,a(e.$t(`aml.k1amlx125`)),1),u(`th`,null,a(e.$t(`aml.k1amlx021`)),1),u(`th`,null,a(e.$t(`aml.k1amlx022`)),1),u(`th`,null,a(e.$t(`aml.k1amlx078`)),1),u(`th`,{title:e.$t(`aml.k1amlx126`)},a(e.$t(`aml.k1amlx099`)),9,Dr),u(`th`,null,a(e.$t(`aml.k1amlx020`)),1),u(`th`,null,a(e.$t(`aml.k1amlx026`)),1),u(`th`,Or,a(e.$t(`aml.k1amlx127`)),1)])]),u(`tbody`,null,[(o(!0),d(f,null,c(q.value,n=>(o(),d(`tr`,{key:n.id},[u(`td`,kr,a(w(n.id)),1),u(`td`,Ar,a(w(n.productId)),1),u(`td`,jr,a(w(n.recipeId)),1),u(`td`,null,[u(`span`,{class:s([`stage-pill`,n.stage])},a(n.stage),3)]),u(`td`,Mr,a(e.$t(`aml.k1amlx116`))+` `+a(C(n.metrics?.oneStepTest?.nrmse))+` · `+a(e.$t(`aml.k1amlx117`))+` `+a(C(n.metrics?.rolloutTest?.nrmse)),1),u(`td`,Nr,a(ea(n.createdAt)),1),u(`td`,{class:`note-cell`,onClick:t[10]||=_(()=>{},[`stop`])},[wa.value===n.id?(o(),d(`div`,Pr,[m(u(`input`,{"onUpdate:modelValue":t[9]||=e=>P.value=e,placeholder:e.$t(`aml.k1amlx189`),onKeyup:[re(e=>Ea(`models`,n.id),[`enter`]),re(F,[`esc`])]},null,40,Fr),[[v,P.value]]),u(`button`,{class:`mini-btn`,onClick:e=>Ea(`models`,n.id)},a(e.$t(`aml.k1amlx191`)),9,Ir),u(`button`,{class:`mini-btn`,onClick:F},a(e.$t(`aml.k1amlx202`)),1)])):(o(),d(`span`,Lr,[u(`span`,{class:`note`,title:n.note},a(n.note||`--`),9,Rr),u(`span`,{class:`i-tabler-pencil edit-i`,title:e.$t(`aml.k1amlx189`),onClick:e=>Ta(n.id,n.note)},null,8,zr)]))]),u(`td`,Br,[(o(!0),d(f,null,c(Za(n),t=>(o(),d(`button`,{key:t.to,class:s([`mini-btn`,{danger:t.to===`retired`}]),disabled:Xa.value===`${n.id}:${t.to}`,onClick:e=>Qa(n,t.to)},a(Ya.value===`${n.id}:${t.to}`?e.$t(`aml.k1amlx131`):e.$t(t.key)),11,Vr))),128)),Za(n).length===0?(o(),d(`span`,Hr,`--`)):p(``,!0),u(`span`,{class:`i-tabler-trash edit-i`,title:e.$t(`aml.k1amlx190`),onClick:t=>Da(`models`,n.id,e.$t(`aml.k1amlx199`))},null,8,Ur)])]))),128))])])):(o(),d(`p`,Wr,a(e.$t(`aml.k1amlx124`)),1))]),u(`section`,Gr,[u(`div`,Kr,[u(`h2`,null,[t[41]||=u(`span`,{class:`i-tabler-chart-line`},null,-1),g(` `+a(e.$t(`aml.k1amlx133`)),1)]),$a.value.length?m((o(),d(`select`,{key:0,"onUpdate:modelValue":t[11]||=e=>eo.value=e,class:`inp-sel`},[u(`option`,qr,a(e.$t(`aml.k1amlx134`)),1),(o(!0),d(f,null,c($a.value,e=>(o(),d(`option`,{key:e.id,value:e.id},a(w(e.id))+` · `+a(w(e.recipeId)),9,Jr))),128))],512)),[[ne,eo.value]]):p(``,!0)]),$a.value.length?(o(),d(f,{key:0},[Y.value?.ioSpec?(o(),d(`div`,Yr,[u(`p`,Xr,a(e.$t(`aml.k1amlx136`)),1),u(`div`,Zr,[u(`span`,Qr,[g(a(e.$t(`aml.k1amlx140`))+` `,1),u(`b`,null,a(Y.value.ioSpec.historySteps),1)]),u(`span`,$r,[g(a(e.$t(`aml.k1amlx141`))+` `,1),u(`b`,null,a(Y.value.ioSpec.horizonSteps),1)]),u(`span`,ei,[g(a(e.$t(`aml.k1amlx142`))+` `,1),u(`b`,null,a(Y.value.ioSpec.beatMs)+`ms`,1)]),u(`span`,{class:`io-item`,title:Y.value.ioSpec.allNodes.join(`, `)},[g(a(e.$t(`aml.k1amlx137`))+`(`+a(Y.value.ioSpec.allNodes.length)+`) `,1),u(`b`,null,a(Y.value.ioSpec.allNodes.map(e=>w(e)).join(`, `)),1)],8,ti),u(`span`,{class:`io-item`,title:Y.value.ioSpec.controlNodes.join(`, `)},[g(a(e.$t(`aml.k1amlx138`))+` `,1),u(`b`,null,a(Y.value.ioSpec.controlNodes.map(e=>w(e)).join(`, `)),1)],8,ni),u(`span`,{class:`io-item`,title:Y.value.ioSpec.targetNodes.join(`, `)},[g(a(e.$t(`aml.k1amlx139`))+` `,1),u(`b`,null,a(Y.value.ioSpec.targetNodes.map(e=>w(e)).join(`, `)),1)],8,ri)]),u(`div`,ii,[u(`label`,ai,[u(`span`,null,a(e.$t(`aml.k1amlx143`)),1),m(u(`textarea`,{"onUpdate:modelValue":t[12]||=e=>to.value=e,class:`inp area`,rows:`5`,placeholder:e.$t(`aml.k1amlx144`)},null,8,oi),[[v,to.value]])]),u(`div`,si,[u(`button`,{class:`ghost-btn`,onClick:ro},[t[42]||=u(`span`,{class:`i-tabler-download`},null,-1),g(` `+a(e.$t(`aml.k1amlx145`)),1)]),u(`label`,ci,[u(`span`,null,a(e.$t(`aml.k1amlx156`)),1),m(u(`textarea`,{"onUpdate:modelValue":t[13]||=e=>X.value=e,class:`inp area`,rows:`3`,placeholder:`[[…]]`},null,512),[[v,X.value]])]),u(`label`,li,[u(`span`,null,a(e.$t(`aml.k1amlx147`)),1),m(u(`input`,{"onUpdate:modelValue":t[14]||=e=>Z.value=e,type:`number`,min:`1`,class:`inp`},null,512),[[v,Z.value,void 0,{number:!0}]])]),u(`button`,{class:`pill-btn`,disabled:no.value||!to.value.trim(),onClick:ao},a(no.value?e.$t(`aml.k1amlx149`):e.$t(`aml.k1amlx148`)),9,ui)])]),u(`p`,di,a(e.$t(`aml.k1amlx146`)),1),Q.value?(o(),d(`p`,fi,a(Q.value),1)):p(``,!0),$.value?(o(),d(f,{key:1},[u(`p`,pi,a(e.$t(`aml.k1amlx150`)),1),u(`table`,mi,[u(`thead`,null,[u(`tr`,null,[u(`th`,hi,a(e.$t(`aml.k1amlx151`)),1),u(`th`,gi,a(e.$t(`aml.k1amlx152`)),1),(o(!0),d(f,null,c($.value.targetNodes,(t,n)=>(o(),d(`th`,{key:t,class:`num`},[g(a(w(t)),1),n===0?(o(),d(`small`,_i,` (`+a(e.$t(`aml.k1amlx041`))+`)`,1)):p(``,!0)]))),128))])]),u(`tbody`,null,[(o(!0),d(f,null,c($.value.forecast,(e,t)=>(o(),d(`tr`,{key:t},[u(`td`,vi,a(t+1),1),u(`td`,yi,a(C((t+1)*$.value.beatMs/1e3,1)),1),(o(!0),d(f,null,c(e,(e,t)=>(o(),d(`td`,{key:t,class:`mono num`},a(C(e,3)),1))),128))]))),128))])]),u(`p`,bi,a(e.$t(`aml.k1amlx155`))+`:`+a($.value.assumptions),1)],64)):p(``,!0)])):(o(),d(`p`,xi,a(e.$t(`aml.k1amlx134`)),1))],64)):(o(),d(`p`,Si,a(e.$t(`aml.k1amlx135`)),1))]),L.value?(o(),d(`div`,{key:4,class:`modal-mask`,onClick:t[27]||=_(e=>L.value=!1,[`self`])},[u(`div`,Ci,[u(`h3`,wi,a(e.$t(`aml.k1amlx050`)),1),u(`div`,Ti,[u(`label`,Ei,[u(`span`,null,[g(a(e.$t(`aml.k1amlx051`)),1),t[43]||=u(`em`,null,`*`,-1)]),m(u(`input`,{"onUpdate:modelValue":t[15]||=e=>z.lineId=e,class:`inp`,placeholder:`line-ov-01`},null,512),[[v,z.lineId]])]),u(`label`,Di,[u(`span`,null,[g(a(e.$t(`aml.k1amlx052`)),1),t[44]||=u(`em`,null,`*`,-1)]),m(u(`input`,{"onUpdate:modelValue":t[16]||=e=>z.productId=e,class:`inp`},null,512),[[v,z.productId]])]),u(`label`,Oi,[u(`span`,null,[g(a(e.$t(`aml.k1amlx053`)),1),t[45]||=u(`em`,null,`*`,-1)]),m(u(`input`,{"onUpdate:modelValue":t[17]||=e=>z.recipeId=e,class:`inp`},null,512),[[v,z.recipeId]])])]),u(`p`,ki,a(e.$t(`aml.k1amlx054`)),1),u(`div`,Ai,[(o(!0),d(f,null,c(B,(t,n)=>(o(),d(`div`,{key:n,class:`node-row`},[m(u(`input`,{"onUpdate:modelValue":e=>t.nodeId=e,class:`inp grow`,placeholder:e.$t(`aml.k1amlx056`)},null,8,ji),[[v,t.nodeId]]),m(u(`select`,{"onUpdate:modelValue":e=>t.role=e,class:`inp sel`},[u(`option`,Ni,a(e.$t(`aml.k1amlx057`)),1),u(`option`,Pi,a(e.$t(`aml.k1amlx058`)),1),u(`option`,Fi,a(e.$t(`aml.k1amlx059`)),1)],8,Mi),[[ne,t.role]]),u(`button`,{class:`mini-btn danger`,disabled:B.length<=1,onClick:e=>Na(n)},` ✕ `,8,Ii)]))),128)),u(`button`,{class:`mini-btn`,onClick:Ma},[t[46]||=u(`span`,{class:`i-tabler-plus`},null,-1),g(` `+a(e.$t(`aml.k1amlx055`)),1)])]),u(`div`,Li,[u(`label`,Ri,[u(`span`,null,a(e.$t(`aml.k1amlx060`)),1),m(u(`input`,{"onUpdate:modelValue":t[18]||=e=>z.beatMs=e,type:`number`,min:`1000`,step:`500`,class:`inp`},null,512),[[v,z.beatMs,void 0,{number:!0}]])]),u(`label`,zi,[u(`span`,null,a(e.$t(`aml.k1amlx061`)),1),m(u(`input`,{"onUpdate:modelValue":t[19]||=e=>z.historySteps=e,type:`number`,min:`1`,class:`inp`},null,512),[[v,z.historySteps,void 0,{number:!0}]])]),u(`label`,Bi,[u(`span`,null,a(e.$t(`aml.k1amlx062`)),1),m(u(`input`,{"onUpdate:modelValue":t[20]||=e=>z.horizonSteps=e,type:`number`,min:`1`,class:`inp`},null,512),[[v,z.horizonSteps,void 0,{number:!0}]])]),u(`label`,Vi,[u(`span`,null,a(e.$t(`aml.k1amlx063`)),1),m(u(`input`,{"onUpdate:modelValue":t[21]||=e=>z.valRatio=e,type:`number`,min:`0`,max:`0.8`,step:`0.05`,class:`inp`},null,512),[[v,z.valRatio,void 0,{number:!0}]])]),u(`label`,Hi,[u(`span`,null,a(e.$t(`aml.k1amlx064`)),1),m(u(`input`,{"onUpdate:modelValue":t[22]||=e=>z.testRatio=e,type:`number`,min:`0`,max:`0.8`,step:`0.05`,class:`inp`},null,512),[[v,z.testRatio,void 0,{number:!0}]])]),u(`label`,Ui,[u(`span`,null,a(e.$t(`aml.k1amlx065`)),1),m(u(`input`,{"onUpdate:modelValue":t[23]||=e=>z.seed=e,type:`number`,class:`inp`},null,512),[[v,z.seed,void 0,{number:!0}]])]),u(`label`,Wi,[u(`span`,null,a(e.$t(`aml.k1amlx066`)),1),m(u(`select`,{"onUpdate:modelValue":t[24]||=e=>z.purpose=e,class:`inp`},[u(`option`,Gi,a(e.$t(`aml.k1amlx067`)),1),u(`option`,Ki,a(e.$t(`aml.k1amlx068`)),1)],512),[[ne,z.purpose]])]),u(`label`,qi,[u(`span`,null,a(e.$t(`aml.k1amlx026`)),1),m(u(`input`,{"onUpdate:modelValue":t[25]||=e=>z.note=e,class:`inp`,placeholder:e.$t(`aml.k1amlx069`)},null,8,Ji),[[v,z.note]])])]),R.value?(o(),d(`p`,Yi,a(R.value),1)):p(``,!0),u(`div`,Xi,[u(`button`,{class:`ghost-btn`,onClick:t[26]||=e=>L.value=!1},a(e.$t(`aml.k1amlx071`)),1),u(`button`,{class:`pill-btn`,disabled:Aa.value,onClick:Pa},a(Aa.value?e.$t(`aml.k1amlx070`):e.$t(`aml.k1amlx072`)),9,Zi)])])])):p(``,!0)]))}}),[[`__scopeId`,`data-v-e7c763e8`]]);export{Qi as default};
@@ -1 +0,0 @@
1
- import{a as e}from"./BU83-NnX.js";import{w as t}from"./DdD9mCHM.js";import{$ as n,Ht as r,R as i,S as a,Ut as o,V as s,Vt as c,W as l,b as u,ct as ee,d,dt as te,f,h as p,i as m,m as h,nt as g,p as _,pt as v,tt as y,xt as b,y as x}from"./CSkxz2NX.js";import{d as S,f as C,l as ne,u as w}from"./D6uzXueg.js";import{n as re,t as ie}from"./BzHEilTt.js";import{n as ae}from"./KZQX7xoM.js";import{t as oe}from"./aWWIh8YL.js";import{t as se}from"./DBHNsT1Y.js";import{t as ce}from"./DzbFpZRk.js";import{t as le}from"./BYhEUx8t.js";import{t as ue}from"./CYWVXZTS.js";import{n as de,r as fe,t as pe}from"./DHFrCUxA2.js";import{t as me}from"./DZtm4l-P2.js";import{t as he}from"./CClOy-Hz2.js";import{t as ge}from"./DIaZ2PTo2.js";import{t as _e}from"./DeyBFhKH2.js";import{t as T}from"./BDNMzG2s2.js";import{t as E}from"./D0ZBQrN_2.js";import{t as ve}from"./BN6iuJEg2.js";import{t as ye}from"./zq5t1vyX.js";var be={class:`settings-page`},xe={class:`aw-page-head`},Se={class:`aw-kicker`},Ce={class:`aw-stamp`},we={class:`settings-layout`},Te={class:`settings-nav`},Ee=[`onClick`],De={class:`settings-body`},Oe={class:`section-title`},ke={class:`section-desc`},Ae={class:`set-row`},je={class:`set-text`},Me={class:`set-title`},Ne={class:`set-sub`},Pe={class:`color-swatches`},Fe=[`title`,`onClick`],Ie={class:`swatch-label`},Le={key:0,class:`i-tabler-check swatch-check`},Re={class:`toggle-row`},ze={class:`set-text`},Be={class:`set-title`},Ve={class:`set-sub`},He=[`aria-checked`],Ue={class:`toggle-row`},We={class:`set-text`},Ge={class:`set-title`},Ke={class:`set-sub`},qe={class:`section-title`},Je={class:`section-desc`},Ye={class:`rt-groups-bar`},Xe=[`title`],Ze={class:`rt-groups-count`},Qe={key:1,class:`rt-group-form`},$e=[`disabled`],et=[`role`,`tabindex`,`onClick`,`onKeydown`],tt=[`onKeydown`],nt=[`onClick`],rt={key:3,class:`rt-group-title`},it={class:`rt-group-badge`},at={class:`rt-group-fields`},ot={key:4,class:`rt-group-desc`},st=[`disabled`,`title`,`onClick`],ct=[`disabled`,`title`,`onClick`],lt=[`disabled`,`title`,`onClick`],ut=[`disabled`,`title`,`onClick`],dt=[`disabled`,`title`,`onClick`],ft={class:`rt-group-body`},pt={key:0,class:`rt-group-empty`},mt={class:`rt-main`},ht={class:`rt-title`},gt={class:`rt-sub`},_t={class:`rt-ctrl`},vt={key:3,class:`rt-color`},yt=[`value`,`onInput`],bt=[`title`,`onClick`],xt={class:`rt-actions`},St=[`disabled`],Ct={class:`rt-path aw-mono`},wt={class:`rt-group-title plugin-group-title`},Tt={class:`section-desc`},Et={key:2,class:`identity-note`},Dt={class:`plugin-main`},Ot={class:`rt-title`},kt={class:`aw-mono`},At={key:0,class:`rt-tag`},jt={key:1,class:`rt-tag src-runtime`},Mt={key:2,class:`rt-tag restart`},Nt={class:`rt-sub`},Pt={class:`rt-ctrl`},Ft={key:0,class:`plugin-health faint`},It=[`onClick`],Lt=[`aria-checked`,`disabled`,`onClick`],Rt={key:0,class:`identity-note`},zt={class:`section-title`},Bt={class:`section-desc`},Vt={class:`aw-mono`},Ht={class:`identity-note`},Ut=`aw.settings.groups.collapsed`,Wt=T(a({__name:`settings`,setup(a){let{t:T,locale:Wt,locales:Gt,setLocale:Kt}=ae(),D=re(),O=ie(),qt=t().public,k=ge(),A=ve(),j=v(`appearance`),M=_e(),N=v({}),P=v(new Set),F=v(!1),I=v(null);function L(){N.value={...M.effective},P.value=new Set}n(()=>M.loaded,e=>{e&&L()},{immediate:!0}),n(()=>M.effective,()=>{P.value.size===0&&L()},{deep:!0});function R(e){P.value.add(e),I.value=null}async function Jt(){if(P.value.size){F.value=!0,I.value=null;try{let e={};for(let t of P.value)e[t]=N.value[t];let t=await M.patch(e);L();let n=t.restartRequired??[];I.value=n.length?{type:`warning`,text:T(`settings.runtime.restartNotice`,{keys:n.join(`, `)})}:{type:`success`,text:T(`settings.runtime.savedLive`)}}catch(e){I.value={type:`error`,text:e?.response?.data?.message||e?.message||String(e)}}finally{F.value=!1}}}async function Yt(e){try{await M.patch({[e]:null}),P.value.delete(e),N.value[e]=M.effective[e],I.value={type:`success`,text:T(`settings.runtime.keyReset`,{key:e})}}catch(e){I.value={type:`error`,text:e?.response?.data?.message||e?.message||String(e)}}}async function Xt(){try{await M.resetAll(),L(),I.value={type:`success`,text:T(`settings.runtime.resetAllDone`)}}catch(e){I.value={type:`error`,text:e?.response?.data?.message||e?.message||String(e)}}}let Zt={server:`settings.runtime.groupServer`,app:`settings.runtime.groupApp`,api:`settings.runtime.groupApi`,theme:`settings.runtime.groupTheme`,i18n:`settings.runtime.groupI18n`,security:`settings.runtime.groupSecurity`,daq:`settings.runtime.groupDaq`,memory:`settings.runtime.groupMemory`,omp:`settings.runtime.groupOmp`,harness:`settings.runtime.groupHarness`,dcw:`settings.runtime.groupDcw`,workshop:`settings.runtime.groupWorkshop`,backup:`settings.runtime.groupBackup`,retention:`settings.runtime.groupRetention`,log:`settings.runtime.groupLog`,plugins:`settings.runtime.groupPlugins`};function Qt(e){if(e.labelKey&&T(e.labelKey)!==e.labelKey)return T(e.labelKey);if(e.label&&e.label!==e.id)return e.label;let t=Zt[e.id];return t?T(t):e.label||e.id}function $t(e){return e.source===`plugin`?e.plugin?`${T(`settings.groups.srcPlugin`)}: ${e.plugin}`:T(`settings.groups.srcPlugin`):e.source===`user`?T(`settings.groups.srcUser`):T(`settings.groups.srcBuiltin`)}function en(e){return e===`runtime`?`src-runtime`:e===`env`?`src-env`:`src-yaml`}function tn(e){let t=e.labelKey;return t&&T(t)!==t?T(t):e.label}let z=v({});function nn(){try{z.value=JSON.parse(localStorage.getItem(Ut)??`{}`)??{}}catch{z.value={}}}function rn(){try{localStorage.setItem(Ut,JSON.stringify(z.value))}catch{}}function B(e){let t=z.value[e.id];return t===void 0?e.collapsed:t}function V(e){e.collapsible&&(z.value={...z.value,[e.id]:!B(e)},rn())}function an(){let e=M.groups.filter(e=>e.collapsible),t=e.some(e=>!B(e)),n={...z.value};for(let r of e)n[r.id]=t;z.value=n,rn()}let on=d(()=>M.groups.filter(e=>e.collapsible).some(e=>!B(e))),H=d(()=>k.isAdmin),U=v(!1),W=te({label:``,description:``,collapsed:!1}),G=v(``),K=v(``),q=v(``);async function sn(){if(W.label.trim()){G.value=`create`;try{await M.createGroup({label:W.label.trim(),description:W.description.trim(),collapsed:W.collapsed}),U.value=!1,W.label=``,W.description=``,W.collapsed=!1,e.success(T(`settings.groups.created`))}catch(t){e.error(E(t,T(`settings.groups.createFail`)))}finally{G.value=``}}}function cn(e){K.value=e.id,q.value=e.label}async function ln(t){let n=q.value.trim();if(K.value=``,n){G.value=t;try{await M.updateGroup(t,{label:n}),e.success(T(`settings.groups.renamed`))}catch(t){e.error(E(t,T(`settings.groups.updateFail`)))}finally{G.value=``}}}async function un(t,n){let r=[...M.groups],i=r.findIndex(e=>e.id===t),a=i+n;if(i<0||a<0||a>=r.length)return;let o=r[i],s=r[a];G.value=t;try{let e=[...r];e.splice(i,1),e.splice(a,0,o);let t=(a+1)*10,n=(i+1)*10;await M.updateGroup(o.id,{order:t}),await M.updateGroup(s.id,{order:n})}catch(t){e.error(E(t,T(`settings.groups.updateFail`)))}finally{G.value=``}}async function dn(t){G.value=t.id;try{await M.updateGroup(t.id,{collapsed:!t.collapsed})}catch(t){e.error(E(t,T(`settings.groups.updateFail`)))}finally{G.value=``}}async function fn(t){let n=t.fieldCount??0;if(n>0){e.warning(T(`settings.groups.deleteHasFields`,{p0:Qt(t),p1:n}));return}G.value=t.id;try{await M.deleteGroup(t.id),e.success(T(`settings.groups.deleted`))}catch(t){e.error(E(t,T(`settings.groups.deleteFail`)))}finally{G.value=``}}let J=v([]),Y=v(!1),pn=v(!1),X=v(new Set),Z=v({}),mn=e=>(e.routes??[]).some(e=>String(e.path||``).endsWith(`/health`));async function hn(){Y.value=!0;try{let e=await A.listPlugins(),t=e?.plugins??e?.data?.plugins??[];J.value=Array.isArray(t)?t:[],pn.value=!0}catch(t){e.error(E(t,T(`plugins.loadFail`)))}finally{Y.value=!1}}async function gn(t,n){if(!X.value.has(t.name)){X.value.add(t.name);try{n?await A.enablePlugin(t.name):await A.disablePlugin(t.name),t.enabled=n,e.success(T(n?`plugins.enabled`:`plugins.disabled`))}catch(t){e.error(E(t,T(`plugins.adminRequired`)))}finally{X.value.delete(t.name)}}}async function _n(e){if(mn(e)){Z.value={...Z.value,[e.name]:`checking`};try{let t=await A.pluginHealth(e.name);Z.value={...Z.value,[e.name]:vn(e.name,t)}}catch(t){Z.value={...Z.value,[e.name]:{ok:!1,reason:E(t,T(`plugins.loadFail`))}}}}}function vn(e,t){if(e===`rag-bridge`){let e=t.backend,n=t.web,r=!!e?.ok&&!!n?.ok,i=e?.ok?n?.error||n?.status||`web`:e?.error||e?.status||`backend`;return r?{ok:!0}:{ok:!1,reason:i}}if(e===`diag-bridge`){let e=t.remote;return e?.status===`ok`?{ok:!0}:{ok:!1,reason:e?.status||`remote`}}return{ok:!0}}function yn(e){return Z.value[e]===`checking`}function Q(e){let t=Z.value[e];return t&&t!==`checking`?t:null}function bn(e){return X.value.has(e)}n(j,e=>{e===`runtime`&&!pn.value&&!Y.value&&k.isLoggedIn&&hn()},{immediate:!0}),i(nn);let $=String(qt.primaryColor),xn=[{value:$,label:T(`settings.accentInk`)},{value:`#c9963f`,label:T(`settings.accentStone`)},{value:`#44615a`,label:T(`settings.accentMoss`)},{value:`#3f6094`,label:T(`settings.accentSlate`)},{value:`#6b5aa0`,label:T(`settings.accentPlum`)},{value:`#9c5744`,label:T(`settings.accentClay`)}],Sn=d(()=>D.accent??$);function Cn(t){D.setAccent(t===$?null:t),e.success(T(`settings.accentApplied`))}function wn(){D.setAccent(null),e.success(T(`settings.accentReset`))}let Tn=d(()=>Gt.value.map(e=>({label:e.name,value:e.code}))),En=e=>{e!=null&&(localStorage.setItem(`aw.locale`,String(e)),Kt(String(e)),window.location.reload())},Dn=d(()=>[{label:T(`home.fields.name`),value:O.name},{label:T(`home.fields.version`),value:`v${O.version}`},{label:T(`home.fields.mode`),value:O.mode},{label:T(`home.fields.apiBase`),value:`${O.apiBase} (${qt.apiTimeout}ms)`},{label:T(`home.fields.primary`),value:$},{label:`i18n`,value:Wt.value}]),On=d(()=>[{key:`appearance`,icon:`i-tabler-palette`,label:T(`settings.theme`)},{key:`runtime`,icon:`i-tabler-settings`,label:T(`settings.runtimeTab`)},{key:`system`,icon:`i-tabler-server-2`,label:T(`settings.systemTab`)}]);return(e,t)=>{let n=oe,i=ce,a=se,d=ue,te=pe,v=he,re=me,ie=ye,ae=fe,ge=de,_e=le;return s(),p(`div`,be,[f(`div`,xe,[f(`div`,null,[f(`p`,Se,o(b(T)(`menu.system`))+` / settings `,1),f(`h1`,null,o(b(T)(`settings.title`)),1)]),f(`span`,Ce,`v`+o(b(O).version),1)]),u(_e,{bordered:!1,class:`settings-card`},{default:y(()=>[f(`div`,we,[f(`div`,Te,[(s(!0),p(m,null,l(b(On),e=>(s(),p(`button`,{key:e.key,class:c([`nav-item`,{active:b(j)===e.key}]),onClick:t=>j.value=e.key},[f(`span`,{class:c(e.icon)},null,2),f(`span`,null,o(e.label),1)],10,Ee))),128))]),f(`div`,De,[g(f(`div`,null,[f(`h3`,Oe,o(b(T)(`settings.theme`)),1),f(`p`,ke,o(b(T)(`settings.appearanceDesc`)),1),f(`div`,Ae,[f(`div`,je,[f(`div`,Me,o(b(T)(`settings.primaryColor`)),1),f(`div`,Ne,o(b(T)(`settings.accentDesc`)),1)])]),f(`div`,Pe,[(s(),p(m,null,l(xn,e=>f(`button`,{key:e.value,class:c([`swatch`,{on:b(Sn).toLowerCase()===e.value.toLowerCase()}]),style:r({"--sw":e.value}),title:e.label,onClick:t=>Cn(e.value)},[t[10]||=f(`span`,{class:`swatch-dot`},null,-1),f(`span`,Ie,o(e.label),1),b(Sn).toLowerCase()===e.value.toLowerCase()?(s(),p(`span`,Le)):h(``,!0)],14,Fe)),64))]),f(`button`,{class:`aw-pill outline reset-btn`,onClick:wn},[t[11]||=f(`span`,{class:`i-tabler-rotate`},null,-1),x(` `+o(b(T)(`settings.accentResetAction`)),1)]),f(`div`,Re,[f(`div`,ze,[f(`div`,Be,o(b(D).isDark?b(T)(`common.dark`):b(T)(`common.light`)),1),f(`div`,Ve,o(b(T)(`settings.darkDesc`)),1)]),f(`button`,{class:c([`switch`,{on:b(D).isDark}]),role:`switch`,"aria-checked":b(D).isDark,onClick:t[0]||=e=>b(D).toggleDark()},[...t[12]||=[f(`span`,{class:`knob`},null,-1)]],10,He)]),f(`div`,Ue,[f(`div`,We,[f(`div`,Ge,o(b(T)(`header.language`)),1),f(`div`,Ke,o(b(T)(`settings.languageDesc`)),1)]),u(n,{value:b(Wt),options:b(Tn),style:{width:`140px`},onChange:En},null,8,[`value`,`options`])])],512),[[w,b(j)===`appearance`]]),g(f(`div`,null,[f(`h3`,qe,o(b(T)(`settings.runtimeTab`)),1),f(`p`,Je,o(b(T)(`settings.runtime.desc`)),1),b(I)?(s(),_(i,{key:0,type:b(I).type,"show-icon":``,class:`rt-notice`,message:b(I).text},null,8,[`type`,`message`])):h(``,!0),f(`div`,Ye,[f(`button`,{class:`aw-pill outline rt-groups-toggle`,title:b(T)(`settings.groups.toggleAll`),onClick:an},[f(`span`,{class:c(b(on)?`i-tabler-chevrons-up`:`i-tabler-chevrons-down`)},null,2),x(` `+o(b(on)?b(T)(`settings.groups.collapseAll`):b(T)(`settings.groups.expandAll`)),1)],8,Xe),f(`span`,Ze,o(b(T)(`settings.groups.count`,{p0:b(M).groups.length})),1),b(H)?(s(),p(`button`,{key:0,class:`aw-pill outline rt-groups-add`,onClick:t[1]||=e=>U.value=!b(U)},[t[13]||=f(`span`,{class:`i-tabler-plus`},null,-1),x(` `+o(b(T)(`settings.groups.newGroup`)),1)])):h(``,!0)]),b(H)&&b(U)?(s(),p(`div`,Qe,[u(a,{value:b(W).label,"onUpdate:value":t[2]||=e=>b(W).label=e,placeholder:b(T)(`settings.groups.namePlaceholder`),style:{width:`220px`},onPressEnter:sn},null,8,[`value`,`placeholder`]),u(a,{value:b(W).description,"onUpdate:value":t[3]||=e=>b(W).description=e,placeholder:b(T)(`settings.groups.descPlaceholder`),style:{width:`320px`},onPressEnter:sn},null,8,[`value`,`placeholder`]),u(d,{checked:b(W).collapsed,"onUpdate:checked":t[4]||=e=>b(W).collapsed=e},{default:y(()=>[x(o(b(T)(`settings.groups.defaultCollapsed`)),1)]),_:1},8,[`checked`]),f(`button`,{class:`aw-pill primary`,disabled:!b(W).label.trim()||b(G)===`create`,onClick:sn},o(b(G)===`create`?`…`:b(T)(`settings.groups.create`)),9,$e),f(`button`,{class:`aw-pill outline`,onClick:t[5]||=e=>U.value=!1},o(b(T)(`settings.groups.cancel`)),1)])):h(``,!0),(s(!0),p(m,null,l(b(M).groups,e=>(s(),p(`section`,{key:e.id,class:c([`rt-group`,{collapsed:B(e),"grp-plugin":e.source===`plugin`}])},[f(`header`,{class:`rt-group-head`,role:e.collapsible?`button`:void 0,tabindex:e.collapsible?0:void 0,onClick:t=>V(e),onKeydown:[S(C(t=>V(e),[`prevent`]),[`enter`]),S(C(t=>V(e),[`prevent`]),[`space`])]},[e.collapsible?(s(),p(`span`,{key:0,class:c([`rt-caret`,B(e)?`i-tabler-chevron-right`:`i-tabler-chevron-down`])},null,2)):h(``,!0),e.icon?(s(),p(`span`,{key:1,class:c([`rt-group-icon`,e.icon])},null,2)):h(``,!0),b(K)===e.id?(s(),p(m,{key:2},[g(f(`input`,{"onUpdate:modelValue":t[6]||=e=>ee(q)?q.value=e:null,class:`rt-rename aw-mono`,onClick:t[7]||=C(()=>{},[`stop`]),onKeydown:[S(C(t=>ln(e.id),[`prevent`]),[`enter`]),t[8]||=S(C(e=>K.value=``,[`prevent`]),[`esc`])]},null,40,tt),[[ne,b(q)]]),f(`button`,{class:`mini-btn`,onClick:C(t=>ln(e.id),[`stop`])},o(b(T)(`settings.groups.ok`)),9,nt)],64)):(s(),p(`h4`,rt,o(Qt(e)),1)),f(`span`,it,o($t(e)),1),f(`span`,at,o(b(T)(`settings.groups.fields`,{p0:e.fieldCount??0})),1),e.description?(s(),p(`span`,ot,o(e.description),1)):h(``,!0),b(H)&&e.source!==`plugin`?(s(),p(`span`,{key:5,class:`rt-group-ops`,onClick:t[9]||=C(()=>{},[`stop`])},[f(`button`,{class:`mini-btn`,disabled:b(G)===e.id,title:b(T)(`settings.groups.moveUp`),onClick:t=>un(e.id,-1)},[...t[14]||=[f(`span`,{class:`i-tabler-arrow-up`},null,-1)]],8,st),f(`button`,{class:`mini-btn`,disabled:b(G)===e.id,title:b(T)(`settings.groups.moveDown`),onClick:t=>un(e.id,1)},[...t[15]||=[f(`span`,{class:`i-tabler-arrow-down`},null,-1)]],8,ct),f(`button`,{class:`mini-btn`,disabled:b(G)===e.id,title:b(T)(`settings.groups.rename`),onClick:t=>cn(e)},[...t[16]||=[f(`span`,{class:`i-tabler-pencil`},null,-1)]],8,lt),f(`button`,{class:`mini-btn`,disabled:b(G)===e.id,title:b(T)(`settings.groups.defaultCollapsed`),onClick:t=>dn(e)},[f(`span`,{class:c(e.collapsed?`i-tabler-fold`:`i-tabler-unfold`)},null,2)],8,ut),e.source===`user`?(s(),p(`button`,{key:0,class:`mini-btn`,disabled:b(G)===e.id,title:b(T)(`settings.groups.delete`),onClick:t=>fn(e)},[...t[17]||=[f(`span`,{class:`i-tabler-trash`},null,-1)]],8,dt)):h(``,!0)])):h(``,!0)],40,et),g(f(`div`,ft,[e.fieldCount??0?h(``,!0):(s(),p(`p`,pt,o(b(T)(`settings.groups.emptyHint`)),1)),(s(!0),p(m,null,l(b(M).fieldsOf(e.id),e=>(s(),p(`div`,{key:e.key,class:`rt-row`},[f(`div`,mt,[f(`div`,ht,[x(o(tn(e))+` `,1),f(`span`,{class:c([`rt-tag`,en(b(M).sourceOf(e.key))])},o(b(M).sourceOf(e.key)),3),f(`span`,{class:c([`rt-tag`,e.applies])},o(e.applies===`live`?b(T)(`settings.runtime.live`):b(T)(`settings.runtime.restart`)),3)]),f(`div`,gt,o(e.description),1)]),f(`div`,_t,[e.type===`number`?(s(),_(te,{key:0,value:b(N)[e.key],"onUpdate:value":t=>b(N)[e.key]=t,min:e.min,max:e.max,onChange:t=>R(e.key)},null,8,[`value`,`onUpdate:value`,`min`,`max`,`onChange`])):e.type===`boolean`?(s(),_(v,{key:1,checked:b(N)[e.key],"onUpdate:checked":t=>b(N)[e.key]=t,onChange:t=>R(e.key)},null,8,[`checked`,`onUpdate:checked`,`onChange`])):e.type===`select`?(s(),_(n,{key:2,value:b(N)[e.key],"onUpdate:value":t=>b(N)[e.key]=t,style:{width:`160px`},options:(e.options??[]).map(e=>({label:e,value:e})),onChange:t=>R(e.key)},null,8,[`value`,`onUpdate:value`,`options`,`onChange`])):e.type===`color`?(s(),p(`span`,vt,[f(`input`,{type:`color`,value:String(b(N)[e.key]??`#35e0a0`),onInput:t=>{b(N)[e.key]=t.target.value,R(e.key)}},null,40,yt),u(a,{value:String(b(N)[e.key]??``),style:{width:`110px`},class:`aw-mono`,onChange:t=>{b(N)[e.key]=t.target.value,R(e.key)}},null,8,[`value`,`onChange`])])):(s(),_(a,{key:4,value:b(N)[e.key],"onUpdate:value":t=>b(N)[e.key]=t,style:{width:`220px`},onChange:t=>R(e.key)},null,8,[`value`,`onUpdate:value`,`onChange`])),f(`button`,{class:`aw-pill outline rt-reset`,title:b(T)(`settings.runtime.resetKey`),onClick:t=>Yt(e.key)},[...t[18]||=[f(`span`,{class:`i-tabler-rotate`},null,-1)]],8,bt)])]))),128))],512),[[w,!B(e)]])],2))),128)),f(`div`,xt,[f(`button`,{class:`aw-pill primary`,disabled:!b(P).size||b(F),onClick:Jt},[t[19]||=f(`span`,{class:`i-tabler-device-floppy`},null,-1),x(` `+o(b(F)?`…`:b(T)(`settings.runtime.save`)),1)],8,St),f(`button`,{class:`aw-pill outline`,onClick:Xt},o(b(T)(`settings.runtime.resetAll`)),1),f(`span`,Ct,o(b(M).settingsPath),1)]),f(`h4`,wt,o(b(T)(`plugins.title`)),1),f(`p`,Tt,o(b(T)(`plugins.desc`)),1),b(k).isLoggedIn?(s(),_(re,{key:3,spinning:b(Y)},{default:y(()=>[(s(!0),p(m,null,l(b(J),e=>(s(),p(`div`,{key:e.name,class:c([`plugin-row`,{off:e.enabled===!1}])},[f(`div`,Dt,[f(`div`,Ot,[f(`span`,kt,o(e.name),1),e.version?(s(),p(`span`,At,`v`+o(e.version),1)):h(``,!0),e.builtin?(s(),p(`span`,jt,o(b(T)(`plugins.builtin`)),1)):h(``,!0),e.error?(s(),p(`span`,Mt,o(e.error),1)):h(``,!0)]),f(`div`,Nt,o(e.description||`—`),1)]),f(`div`,Pt,[yn(e.name)?(s(),p(`span`,Ft,[t[20]||=f(`span`,{class:`i-tabler-loader-2 spin`},null,-1),x(` `+o(b(T)(`plugins.healthChecking`)),1)])):Q(e.name)?(s(),p(`span`,{key:1,class:c([`plugin-health`,Q(e.name).ok?`ok`:`bad`])},[f(`span`,{class:c(Q(e.name).ok?`i-tabler-circle-check`:`i-tabler-alert-circle`)},null,2),x(` `+o(Q(e.name).ok?b(T)(`plugins.healthOk`):`${b(T)(`plugins.healthBad`)}: ${Q(e.name).reason??``}`),1)],2)):h(``,!0),mn(e)?(s(),p(`button`,{key:2,class:`aw-pill outline rt-reset`,onClick:t=>_n(e)},[t[21]||=f(`span`,{class:`i-tabler-heartbeat`},null,-1),x(` `+o(b(T)(`plugins.healthCheck`)),1)],8,It)):h(``,!0),f(`button`,{class:c([`switch`,{on:e.enabled!==!1}]),role:`switch`,"aria-checked":e.enabled!==!1,disabled:bn(e.name),onClick:t=>gn(e,e.enabled===!1)},[...t[22]||=[f(`span`,{class:`knob`},null,-1)]],10,Lt)])],2))),128)),b(J).length===0&&!b(Y)?(s(),p(`div`,Rt,o(b(T)(`plugins.empty`)),1)):h(``,!0)]),_:1},8,[`spinning`])):(s(),p(`div`,Et,o(b(T)(`plugins.needLogin`)),1)),b(J).length?(s(),_(ie,{key:4,"slot-name":`settings.plugins`})):h(``,!0)],512),[[w,b(j)===`runtime`]]),g(f(`div`,null,[f(`h3`,zt,o(b(T)(`settings.systemTab`)),1),f(`p`,Bt,o(b(T)(`settings.systemDesc`)),1),u(ge,{bordered:``,column:1,size:`small`},{default:y(()=>[(s(!0),p(m,null,l(b(Dn),e=>(s(),_(ae,{key:e.label,label:e.label},{default:y(()=>[f(`span`,Vt,o(e.value),1)]),_:2},1032,[`label`]))),128))]),_:1}),f(`p`,Ht,o(b(k).isLoggedIn?`${b(T)(`settings.identity`)}: ${b(k).user?.name} (${b(k).user?.role})`:b(T)(`settings.identityGuest`)),1)],512),[[w,b(j)===`system`]])])])]),_:1})])}}}),[[`__scopeId`,`data-v-f677a83e`]]);export{Wt as default};
@@ -1 +0,0 @@
1
- import{ut as e}from"./CSkxz2NX.js";import{t}from"./CWoJjWmZ.js";function n(n,r,i={}){let a=i.bgMs===void 0?r*3:i.bgMs,o=null;function s(e){c(),e>0&&(o=t(n,e))}function c(){o&&=(clearInterval(o),null)}function l(){document.hidden?s(a):(s(r),n())}s(document.hidden?a:r),document.addEventListener(`visibilitychange`,l),e(()=>{c(),document.removeEventListener(`visibilitychange`,l)})}export{n as t};