agentworkshop 0.7.39 → 0.7.40

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 (373) 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/BOt2SP4z.js +1 -0
  7. package/.output/public/_nuxt/BP-NyKVG.js +18 -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/{C_OLzD09.js → C4oW1HsE.js} +1 -1
  12. package/.output/public/_nuxt/CFxtLwjp.js +1 -0
  13. package/.output/public/_nuxt/{Cec0Ua3F.js → CS50LB_l.js} +1 -1
  14. package/.output/public/_nuxt/C_iYD-EB.js +1 -0
  15. package/.output/public/_nuxt/{DAe0h2MB.js → ClILjvWH.js} +1 -1
  16. package/.output/public/_nuxt/CssgYAAL2.js +1 -0
  17. package/.output/public/_nuxt/{CY9LbPCI.js → CzOCSGLe.js} +1 -1
  18. package/.output/public/_nuxt/D8qvkfyY.js +1 -0
  19. package/.output/public/_nuxt/DCn7QZ5N.js +2 -0
  20. package/.output/public/_nuxt/DGIuvyRN2.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/DZshyNLa.js +1 -0
  26. package/.output/public/_nuxt/{45zuyAso.js → D_OTvQza.js} +1 -1
  27. package/.output/public/_nuxt/DcsCcxp4.js +1 -0
  28. package/.output/public/_nuxt/{DUrecWPx.js → Dihnimlk.js} +2 -2
  29. package/.output/public/_nuxt/Dqw1lpr-.js +1 -0
  30. package/.output/public/_nuxt/{CUDwzgLV.js → Dr9v6C0f.js} +9 -9
  31. package/.output/public/_nuxt/{8NMOXZOV.js → Du9ZJtnj.js} +1 -1
  32. package/.output/public/_nuxt/TownView.f-YOdXRs.css +1 -0
  33. package/.output/public/_nuxt/_id_.CM4bIgKY.css +1 -0
  34. package/.output/public/_nuxt/_id_.bNV69Dtf.css +1 -0
  35. package/.output/public/_nuxt/_wsId_.B4WiqkIS.css +1 -0
  36. package/.output/public/_nuxt/agents.ZD0rVdHE.css +1 -0
  37. package/.output/public/_nuxt/aml.BN8ZEW4h.css +1 -0
  38. package/.output/public/_nuxt/builds/latest.json +1 -1
  39. package/.output/public/_nuxt/builds/meta/f4707884-7cf4-4a31-80d2-e3d72b73745f.json +1 -0
  40. package/.output/public/_nuxt/channel-templates.BOtahzPi.css +1 -0
  41. package/.output/public/_nuxt/daq.B0D3dPAc.css +1 -0
  42. package/.output/public/_nuxt/dcw.8Y7FqCVN.css +1 -0
  43. package/.output/public/_nuxt/default.J32SgqFY.css +1 -0
  44. package/.output/public/_nuxt/entry.bdm0tv6M.css +1 -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 +2225 -1445
  61. package/.output/server/chunks/_/nitro.mjs.map +1 -1
  62. package/.output/server/chunks/build/{TownView-jVazYOjN.mjs → TownView-BuLAsmpR.mjs} +288 -206
  63. package/.output/server/chunks/build/TownView-BuLAsmpR.mjs.map +1 -0
  64. package/.output/server/chunks/build/{_id_-CfVosNg3.mjs → _id_-BU1wfOID.mjs} +138 -138
  65. package/.output/server/chunks/build/{_id_-CfVosNg3.mjs.map → _id_-BU1wfOID.mjs.map} +1 -1
  66. package/.output/server/chunks/build/{_id_-Hwr4rZpr.mjs → _id_-BYsEua57.mjs} +33 -32
  67. package/.output/server/chunks/build/_id_-BYsEua57.mjs.map +1 -0
  68. package/.output/server/chunks/build/{_wsId_-BVg3bB77.mjs → _wsId_-BxlDcJHg.mjs} +293 -259
  69. package/.output/server/chunks/build/{_wsId_-BVg3bB77.mjs.map → _wsId_-BxlDcJHg.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-cgyjKmJu.mjs} +188 -122
  78. package/.output/server/chunks/build/daq-cgyjKmJu.mjs.map +1 -0
  79. package/.output/server/chunks/build/{dcw-6vEYVeje.mjs → dcw-CoTxBlAZ.mjs} +45 -45
  80. package/.output/server/chunks/build/{dcw-6vEYVeje.mjs.map → dcw-CoTxBlAZ.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-BSOeZwwI.mjs} +34 -34
  84. package/.output/server/chunks/build/{logs-B-xhuqln.mjs.map → logs-BSOeZwwI.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-DFxjn9Xa.mjs} +33 -17
  88. package/.output/server/chunks/build/pages-DFxjn9Xa.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-qMPql9Se.mjs} +36 -10
  100. package/.output/server/chunks/build/town-qMPql9Se.mjs.map +1 -0
  101. package/.output/server/chunks/build/useDaqStream-CIBaiGAl.mjs +1 -1
  102. package/.output/server/chunks/build/useDcwStream-CBbiYnWe.mjs +1 -1
  103. package/.output/server/chunks/build/useResponsive-BKDMGTHs.mjs +49 -0
  104. package/.output/server/chunks/build/useResponsive-BKDMGTHs.mjs.map +1 -0
  105. package/.output/server/chunks/build/{users-fohSmF-J.mjs → users-Cfd5-l2-.mjs} +6 -6
  106. package/.output/server/chunks/build/{users-fohSmF-J.mjs.map → users-Cfd5-l2-.mjs.map} +1 -1
  107. package/.output/server/chunks/build/{workshop-DX5-ldc4.mjs → workshop-BL5bhfs0.mjs} +15 -15
  108. package/.output/server/chunks/build/{workshop-DX5-ldc4.mjs.map → workshop-BL5bhfs0.mjs.map} +1 -1
  109. package/.output/server/chunks/build/{workspaces-BuydxM-3.mjs → workspaces-Bgz5Ekwp.mjs} +18 -3
  110. package/.output/server/chunks/build/workspaces-Bgz5Ekwp.mjs.map +1 -0
  111. package/.output/server/chunks/routes/api/system/config-groups/_id_.patch.mjs.map +1 -1
  112. package/.output/server/chunks/routes/api/system/index.patch.mjs.map +1 -1
  113. package/.output/server/chunks/routes/api/system/index.post.mjs.map +1 -1
  114. package/.output/server/chunks/routes/api/system/settings/events.get.mjs.map +1 -1
  115. package/.output/server/chunks/routes/api/workshop/agent-tools/invoke.post.mjs +6 -2
  116. package/.output/server/chunks/routes/api/workshop/agent-tools/invoke.post.mjs.map +1 -1
  117. package/.output/server/chunks/routes/api/workshop/aml/datasets/_id_.get.mjs +2 -1
  118. package/.output/server/chunks/routes/api/workshop/aml/datasets/_id_.get.mjs.map +1 -1
  119. package/.output/server/chunks/routes/api/workshop/channel-templates/_id/instantiate.post.mjs +1 -1
  120. package/.output/server/chunks/routes/api/workshop/channels.post.mjs +3 -3
  121. package/.output/server/chunks/routes/api/workshop/daq/index.post.mjs.map +1 -1
  122. package/.output/server/chunks/routes/api/workshop/daq/templates/_key_.delete.mjs.map +1 -1
  123. package/.output/server/chunks/routes/api/workshop/daq/templates/_key_.patch.mjs.map +1 -1
  124. package/.output/server/chunks/routes/api/workshop/dcw/_id/write.post.mjs +3 -2
  125. package/.output/server/chunks/routes/api/workshop/dcw/_id/write.post.mjs.map +1 -1
  126. package/.output/server/chunks/routes/api/workshop/dcw/_id_.delete.mjs +2 -1
  127. package/.output/server/chunks/routes/api/workshop/dcw/_id_.delete.mjs.map +1 -1
  128. package/.output/server/chunks/routes/api/workshop/dcw/index2.post.mjs +8 -6
  129. package/.output/server/chunks/routes/api/workshop/dcw/index2.post.mjs.map +1 -1
  130. package/.output/server/chunks/routes/api/workshop/dcw/index3.post.mjs +5 -5
  131. package/.output/server/chunks/routes/api/workshop/dcw/index3.post.mjs.map +1 -1
  132. package/.output/server/chunks/routes/api/workshop/dcw/index4.get.mjs +14 -4
  133. package/.output/server/chunks/routes/api/workshop/dcw/index4.get.mjs.map +1 -1
  134. package/.output/server/chunks/routes/api/workshop/dcw/index4.post.mjs +4 -4
  135. package/.output/server/chunks/routes/api/workshop/dcw/index4.post.mjs.map +1 -1
  136. package/.output/server/chunks/routes/api/workshop/dcw/index5.get.mjs +4 -3
  137. package/.output/server/chunks/routes/api/workshop/dcw/index5.get.mjs.map +1 -1
  138. package/.output/server/chunks/routes/api/workshop/dcw/index5.post.mjs +31 -0
  139. package/.output/server/chunks/routes/api/workshop/dcw/index5.post.mjs.map +1 -0
  140. package/.output/server/chunks/routes/api/workshop/dcw/index6.get.mjs +28 -0
  141. package/.output/server/chunks/routes/api/workshop/dcw/index6.get.mjs.map +1 -0
  142. package/.output/server/chunks/routes/api/workshop/dcw/lines/_id_.patch.mjs.map +1 -1
  143. package/.output/server/chunks/routes/api/workshop/dcw/params/_id/read.post.mjs +32 -0
  144. package/.output/server/chunks/routes/api/workshop/dcw/params/_id/read.post.mjs.map +1 -0
  145. package/.output/server/chunks/routes/api/workshop/dcw/params/_id/write.post.mjs +34 -0
  146. package/.output/server/chunks/routes/api/workshop/dcw/params/_id/write.post.mjs.map +1 -0
  147. package/.output/server/chunks/routes/api/workshop/dcw/params/_id_.delete.mjs +33 -0
  148. package/.output/server/chunks/routes/api/workshop/dcw/params/_id_.delete.mjs.map +1 -0
  149. package/.output/server/chunks/routes/api/workshop/dcw/params/_id_.patch.mjs +34 -0
  150. package/.output/server/chunks/routes/api/workshop/dcw/params/_id_.patch.mjs.map +1 -0
  151. package/.output/server/chunks/routes/api/workshop/dcw/templates/_key_.delete.mjs +1 -1
  152. package/.output/server/chunks/routes/api/workshop/dcw/templates/_key_.patch.mjs +1 -1
  153. package/.output/server/chunks/routes/api/workshop/harnesses/_id/providers.get.mjs +1 -1
  154. package/.output/server/chunks/routes/api/workshop/harnesses.get.mjs +1 -1
  155. package/.output/server/chunks/routes/api/workshop/hitl/pending.get.mjs +1 -1
  156. package/.output/server/chunks/routes/api/workshop/hitl/respond.post.mjs +1 -1
  157. package/.output/server/chunks/routes/api/workshop/index.put.mjs +1 -1
  158. package/.output/server/chunks/routes/api/workshop/index6.get.mjs +2 -0
  159. package/.output/server/chunks/routes/api/workshop/index6.get.mjs.map +1 -1
  160. package/.output/server/chunks/routes/api/workshop/index9.get.mjs +3 -1
  161. package/.output/server/chunks/routes/api/workshop/index9.get.mjs.map +1 -1
  162. package/.output/server/chunks/routes/api/workshop/plugins/_name/disable.post.mjs +1 -1
  163. package/.output/server/chunks/routes/api/workshop/plugins/_name/enable.post.mjs +1 -1
  164. package/.output/server/chunks/routes/api/workshop/scene/layouts/_channelId_.delete.mjs +1 -1
  165. package/.output/server/chunks/routes/api/workshop/scene/layouts/_channelId_.put.mjs +1 -1
  166. package/.output/server/chunks/routes/api/workshop/workspaces/_id/channel-templates/_tplId_.post.mjs +1 -1
  167. package/.output/server/chunks/routes/renderer.mjs +3 -3
  168. package/.output/server/chunks/virtual/entry.mjs +51 -25
  169. package/.output/server/chunks/virtual/precomputed.mjs +1 -1
  170. package/.output/server/package.json +1 -1
  171. package/README-zh.md +199 -35
  172. package/README.md +739 -591
  173. package/app/app.vue +9 -3
  174. package/app/assets/css/main.css +517 -7
  175. package/app/components/AppHeader.vue +98 -7
  176. package/app/components/AppSidebar.vue +117 -11
  177. package/app/components/AwChart.vue +2 -1
  178. package/app/components/workshop/AgentInspectorDrawer.vue +6 -6
  179. package/app/components/workshop/AgentLanesView.vue +52 -1
  180. package/app/components/workshop/AssetLibrary.vue +4 -2
  181. package/app/components/workshop/ChannelSessionList.vue +4 -2
  182. package/app/components/workshop/Composer.vue +96 -0
  183. package/app/components/workshop/DaqNodeRow.vue +19 -0
  184. package/app/components/workshop/DaqTemplateIcon.vue +33 -0
  185. package/app/components/workshop/DeviceTwinPanel.vue +37 -35
  186. package/app/components/workshop/EventBlock.vue +3 -3
  187. package/app/components/workshop/InspectorPanel.vue +47 -11
  188. package/app/components/workshop/LiveAgentBar.vue +34 -0
  189. package/app/components/workshop/TaskBoardView.vue +83 -33
  190. package/app/components/workshop/TranscriptTimeline.vue +56 -0
  191. package/app/components/workshop/blocks/ClusterError.vue +1 -1
  192. package/app/components/workshop/blocks/ClusterRoute.vue +3 -1
  193. package/app/components/workshop/blocks/ClusterStatus.vue +2 -2
  194. package/app/components/workshop/blocks/ClusterStream.vue +8 -2
  195. package/app/components/workshop/town/ModelPreview3D.vue +1 -1
  196. package/app/components/workshop/town/TownView.vue +507 -82
  197. package/app/composables/useResponsive.ts +88 -0
  198. package/app/composables/useRouteMeta.ts +3 -0
  199. package/app/composables/workshop/useDcwStream.ts +1 -1
  200. package/app/composables/workshop/useVisibleInterval.ts +2 -2
  201. package/app/composables/workshop/useWorkshopApi.ts +1 -1
  202. package/app/layouts/default.vue +46 -2
  203. package/app/pages/aml/index.vue +712 -616
  204. package/app/pages/daq/[id].vue +3 -2
  205. package/app/pages/daq/index.vue +209 -9
  206. package/app/pages/dcw/[id].vue +109 -28
  207. package/app/pages/dcw/index.vue +83 -23
  208. package/app/pages/index.vue +35 -1
  209. package/app/pages/logs/index.vue +147 -13
  210. package/app/pages/monitor.vue +56 -12
  211. package/app/pages/permissions/index.vue +34 -0
  212. package/app/pages/plugins/index.vue +35 -4
  213. package/app/pages/settings.vue +90 -21
  214. package/app/pages/tokens.vue +23 -0
  215. package/app/pages/town.vue +50 -5
  216. package/app/pages/users.vue +23 -0
  217. package/app/pages/workshop/agents.vue +92 -2
  218. package/app/pages/workshop/channel-templates.vue +53 -0
  219. package/app/pages/workshop/index.vue +14 -0
  220. package/app/pages/workshop/teams.vue +66 -6
  221. package/app/pages/workshop/w/[wsId].vue +202 -14
  222. package/app/plugins/aw-plugins.client.ts +13 -8
  223. package/app/stores/app.ts +33 -1
  224. package/app/stores/workshop/user.ts +1 -1
  225. package/app/stores/workshop/workspaces.ts +18 -2
  226. package/app/utils/api-error.ts +1 -1
  227. package/cli/commands/build.mjs +8 -1
  228. package/docker-compose.yml +6 -0
  229. package/i18n/locales/en.ts +2 -0
  230. package/i18n/locales/zh-CN.ts +2 -0
  231. package/nuxt.config.ts +31 -0
  232. package/package.json +9 -1
  233. package/scripts/_dbg-param-map-e2e.ts +242 -0
  234. package/scripts/_dbg-param-map-rest-smoke.mjs +73 -0
  235. package/scripts/_dbg-param-real-scenario.mjs +153 -0
  236. package/scripts/api-live-e2e.mjs +40 -8
  237. package/scripts/capture-walkthrough.mjs +232 -0
  238. package/scripts/render-walkthrough-figure.mjs +46 -0
  239. package/scripts/seed-walkthrough-fixture.mjs +143 -0
  240. package/scripts/test-plugin-hardening.mjs +8 -0
  241. package/scripts/ui/admin-shots.mjs +46 -0
  242. package/scripts/ui/audit-layout.mjs +301 -0
  243. package/scripts/ui/bump-microfont.mjs +39 -0
  244. package/scripts/ui/lib.mjs +198 -0
  245. package/scripts/ui/linkcheck2.mjs +37 -0
  246. package/scripts/ui/live-render-check.mjs +72 -0
  247. package/scripts/ui/md-lint.mjs +80 -0
  248. package/scripts/ui/perf-audit.mjs +132 -0
  249. package/scripts/ui/readme-assets.mjs +30 -0
  250. package/scripts/ui/readme-shots.mjs +42 -0
  251. package/scripts/ui/record.mjs +225 -0
  252. package/scripts/ui/seed-admin.mjs +68 -0
  253. package/scripts/ui/seed-demo.mjs +83 -0
  254. package/scripts/ui/shot-hero.mjs +25 -0
  255. package/scripts/ui/shots.mjs +75 -0
  256. package/scripts/ui/sim-ui-shot.mjs +16 -0
  257. package/scripts/ui/verify-nav.mjs +51 -0
  258. package/scripts/ui/verify-responsive.mjs +285 -0
  259. package/server/api/system/config-groups/[id].patch.ts +1 -1
  260. package/server/api/system/config-groups/index.post.ts +1 -1
  261. package/server/api/system/settings/events.get.ts +1 -1
  262. package/server/api/system/settings/index.patch.ts +1 -1
  263. package/server/api/workshop/agent-tools/invoke.post.ts +16 -2
  264. package/server/api/workshop/aml/datasets/[id].get.ts +8 -1
  265. package/server/api/workshop/daq/infra/reconnect.post.ts +1 -1
  266. package/server/api/workshop/daq/templates/[key].delete.ts +1 -0
  267. package/server/api/workshop/daq/templates/[key].patch.ts +1 -0
  268. package/server/api/workshop/daq/templates/index.post.ts +1 -0
  269. package/server/api/workshop/dcw/[id]/write.post.ts +10 -2
  270. package/server/api/workshop/dcw/[id].delete.ts +5 -2
  271. package/server/api/workshop/dcw/index.get.ts +2 -0
  272. package/server/api/workshop/dcw/lines/[id].patch.ts +1 -1
  273. package/server/api/workshop/dcw/params/[id]/read.post.ts +17 -0
  274. package/server/api/workshop/dcw/params/[id]/write.post.ts +21 -0
  275. package/server/api/workshop/dcw/params/[id].delete.ts +19 -0
  276. package/server/api/workshop/dcw/params/[id].patch.ts +23 -0
  277. package/server/api/workshop/dcw/params/index.get.ts +27 -0
  278. package/server/api/workshop/dcw/params/index.post.ts +25 -0
  279. package/server/api/workshop/permissions/index.get.ts +3 -1
  280. package/server/plugins/aw-plugins.ts +14 -3
  281. package/server/plugins/dev-stability-guard.ts +3 -1
  282. package/server/plugins/system-config.ts +6 -1
  283. package/server/services/system-config.ts +28 -9
  284. package/server/services/workshop/agents/adapters/one-shot-cli-agent.ts +2 -1
  285. package/server/services/workshop/agents/agent-interface.ts +8 -6
  286. package/server/services/workshop/agents/base-agent.ts +18 -4
  287. package/server/services/workshop/agents/claude-agent.ts +7 -3
  288. package/server/services/workshop/agents/codex-agent.ts +3 -3
  289. package/server/services/workshop/agents/dsh-agent.ts +3 -3
  290. package/server/services/workshop/agents/goose-agent.ts +0 -1
  291. package/server/services/workshop/agents/harness-terminal.ts +14 -1
  292. package/server/services/workshop/agents/hermes-agent.ts +4 -2
  293. package/server/services/workshop/agents/host-tool-bridge.ts +5 -1
  294. package/server/services/workshop/agents/industrial-context.ts +4 -1
  295. package/server/services/workshop/agents/industrial-tools.ts +164 -6
  296. package/server/services/workshop/agents/omp-agent.ts +15 -9
  297. package/server/services/workshop/agents/opencode-agent.ts +47 -21
  298. package/server/services/workshop/agents/qwen-agent.ts +10 -5
  299. package/server/services/workshop/aml/entity.ts +3 -1
  300. package/server/services/workshop/aml/python-runtime.ts +3 -2
  301. package/server/services/workshop/daq/bus/mqtt.adapter.ts +8 -4
  302. package/server/services/workshop/daq/daq-controller.ts +18 -3
  303. package/server/services/workshop/daq/daq-runtime.ts +5 -3
  304. package/server/services/workshop/daq/drivers.ts +63 -8
  305. package/server/services/workshop/daq/host-ports.ts +3 -2
  306. package/server/services/workshop/daq/storage/timescale.adapter.ts +3 -1
  307. package/server/services/workshop/db/channel.repo.ts +4 -0
  308. package/server/services/workshop/db/ops.repo.ts +5 -2
  309. package/server/services/workshop/db/retention.ts +8 -3
  310. package/server/services/workshop/dcw/dcw-controller.ts +143 -16
  311. package/server/services/workshop/dcw/dcw-product.repo.ts +38 -1
  312. package/server/services/workshop/dcw/dcw-runtime.ts +3 -2
  313. package/server/services/workshop/dcw/drivers.ts +5 -2
  314. package/server/services/workshop/dcw/param-conversion.ts +78 -0
  315. package/server/services/workshop/dcw/param-limits.ts +142 -0
  316. package/server/services/workshop/dcw/param-map.repo.ts +305 -0
  317. package/server/services/workshop/dcw/recipe-rollback-manager.ts +13 -7
  318. package/server/services/workshop/runtime/agent-runtime.ts +4 -0
  319. package/server/services/workshop/runtime/manager.ts +9 -2
  320. package/server/services/workshop/settings.ts +4 -2
  321. package/server/types/pg.d.ts +49 -0
  322. package/server/utils/stability-severity.ts +13 -2
  323. package/shared/config/groups.mjs +22 -1
  324. package/shared/config/home.d.mts +28 -0
  325. package/shared/dcw-protocol.ts +136 -0
  326. package/uno.config.ts +12 -1
  327. package/.output/public/_nuxt/BFkgkW8u.js +0 -4
  328. package/.output/public/_nuxt/C5gUkRwn.js +0 -1
  329. package/.output/public/_nuxt/CM12FuB42.js +0 -1
  330. package/.output/public/_nuxt/CZiw7sEV.js +0 -1
  331. package/.output/public/_nuxt/Cc_9VzD42.js +0 -1
  332. package/.output/public/_nuxt/CdPzkOMV.js +0 -1
  333. package/.output/public/_nuxt/CmsOtOAA2.js +0 -1
  334. package/.output/public/_nuxt/D1YDxZpZ.js +0 -1
  335. package/.output/public/_nuxt/D20Yamr4.js +0 -1
  336. package/.output/public/_nuxt/DmqknNvV.js +0 -18
  337. package/.output/public/_nuxt/DnUuIR83.js +0 -1
  338. package/.output/public/_nuxt/S_fVQwJK.js +0 -1
  339. package/.output/public/_nuxt/TownView.0oLiQgTC.css +0 -1
  340. package/.output/public/_nuxt/_id_.D-SYuyZb.css +0 -1
  341. package/.output/public/_nuxt/_id_.hma_BU6T.css +0 -1
  342. package/.output/public/_nuxt/_wsId_.B12v3PhY.css +0 -1
  343. package/.output/public/_nuxt/agents.BV70ioCv.css +0 -1
  344. package/.output/public/_nuxt/ahgEJu2R.js +0 -1
  345. package/.output/public/_nuxt/aml.COEKNNqK.css +0 -1
  346. package/.output/public/_nuxt/builds/meta/4457d63f-0866-4cea-b320-04a321f24795.json +0 -1
  347. package/.output/public/_nuxt/channel-templates.C-M5nKcC.css +0 -1
  348. package/.output/public/_nuxt/daq.B3265ZDn.css +0 -1
  349. package/.output/public/_nuxt/dcw.DLYZqEhT.css +0 -1
  350. package/.output/public/_nuxt/default.BXI_fZUi.css +0 -1
  351. package/.output/public/_nuxt/entry.BB-Eeh-J.css +0 -1
  352. package/.output/public/_nuxt/logs.CqFyMrJw.css +0 -1
  353. package/.output/public/_nuxt/monitor.B--1dPzs.css +0 -1
  354. package/.output/public/_nuxt/pages.ooEzrMm9.css +0 -1
  355. package/.output/public/_nuxt/permissions.B1pjGChZ.css +0 -1
  356. package/.output/public/_nuxt/plugins.5e5chZ67.css +0 -1
  357. package/.output/public/_nuxt/pz2JDAM7.js +0 -2
  358. package/.output/public/_nuxt/settings.Dm3M0RLy.css +0 -1
  359. package/.output/public/_nuxt/teams.BC75EGnR.css +0 -1
  360. package/.output/public/_nuxt/tokens.xRb1fSPU.css +0 -1
  361. package/.output/public/_nuxt/users.CXnP2E08.css +0 -1
  362. package/.output/public/_nuxt/workshop.Jk5HxWPE.css +0 -1
  363. package/.output/server/chunks/build/TownView-jVazYOjN.mjs.map +0 -1
  364. package/.output/server/chunks/build/_id_-Hwr4rZpr.mjs.map +0 -1
  365. package/.output/server/chunks/build/agents-Bvin73QY.mjs.map +0 -1
  366. package/.output/server/chunks/build/daq-C03Uu5UE.mjs.map +0 -1
  367. package/.output/server/chunks/build/pages-BO7yZsXA.mjs.map +0 -1
  368. package/.output/server/chunks/build/settings-DoQ2Oq3P.mjs.map +0 -1
  369. package/.output/server/chunks/build/teams-2kz3CusY.mjs.map +0 -1
  370. package/.output/server/chunks/build/town-BOl6hs9B.mjs.map +0 -1
  371. package/.output/server/chunks/build/workspaces-BuydxM-3.mjs.map +0 -1
  372. /package/.output/public/_nuxt/{36oeS8_R2.js → 36oeS8_R.js} +0 -0
  373. /package/.output/public/_nuxt/{CYWVXZTS.js → CYWVXZTS2.js} +0 -0
@@ -1,5 +1,6 @@
1
1
  import { _ as _plugin_vue_export_helper_default, u as useI18n, at as useHttp, b as useUserStore } from '../virtual/entry.mjs';
2
- import { u as useWorkspacesStore } from './workspaces-BuydxM-3.mjs';
2
+ import { u as useResponsive } from './useResponsive-BKDMGTHs.mjs';
3
+ import { u as useWorkspacesStore } from './workspaces-Bgz5Ekwp.mjs';
3
4
  import { a as apiErrorMessage } from './api-error-dul30BYQ.mjs';
4
5
  import { u as useEntitiesStore, a as useWorkshopWs } from './useWorkshopWs-C_I7q9As.mjs';
5
6
  import { s as setInterval, n as nowLocalIso } from './useLocalTime-9a4B-aHv.mjs';
@@ -8,8 +9,8 @@ import { u as useDcwStream } from './useDcwStream-CBbiYnWe.mjs';
8
9
  import { u as useDaqStream } from './useDaqStream-CIBaiGAl.mjs';
9
10
  import { u as useDeviceTwins } from './useDeviceTwins-Yko6nNPF.mjs';
10
11
  import { shallowRef, ref, computed, toValue, watch, nextTick, defineComponent, reactive, mergeProps, unref, readonly, getCurrentScope, onScopeDispose, getCurrentInstance, toRef, customRef, useSSRContext } from 'vue';
11
- import { ssrRenderAttrs, ssrInterpolate, ssrRenderAttr, ssrRenderClass, ssrIncludeBooleanAttr, ssrRenderComponent, ssrRenderList, ssrRenderStyle, ssrLooseContain, ssrLooseEqual } from 'vue/server-renderer';
12
- import { bs as DAQ_TEMPLATES } from '../_/nitro.mjs';
12
+ import { ssrRenderAttrs, ssrRenderClass, ssrInterpolate, ssrRenderAttr, ssrIncludeBooleanAttr, ssrRenderComponent, ssrRenderList, ssrRenderStyle, ssrLooseContain, ssrLooseEqual } from 'vue/server-renderer';
13
+ import { bt as DAQ_TEMPLATES } from '../_/nitro.mjs';
13
14
  import * as THREE from 'three';
14
15
  import { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader.js';
15
16
  import { RoomEnvironment } from 'three/examples/jsm/environments/RoomEnvironment.js';
@@ -579,9 +580,9 @@ var ModelPreview3D_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ d
579
580
  ref: hostRef,
580
581
  class: "model-preview-3d",
581
582
  style: { height: `${__props.height}px` }
582
- }, _attrs))} data-v-9d114165>`);
583
- if (unref(loading)) _push(`<div class="mp-loading" data-v-9d114165><span class="mp-spin" data-v-9d114165></span></div>`);
584
- else if (unref(failed)) _push(`<div class="mp-failed" data-v-9d114165> PREVIEW NA </div>`);
583
+ }, _attrs))} data-v-ed056b0a>`);
584
+ if (unref(loading)) _push(`<div class="mp-loading" data-v-ed056b0a><span class="mp-spin" data-v-ed056b0a></span></div>`);
585
+ else if (unref(failed)) _push(`<div class="mp-failed" data-v-ed056b0a> PREVIEW NA </div>`);
585
586
  else _push(`<!---->`);
586
587
  _push(`</div>`);
587
588
  };
@@ -589,13 +590,13 @@ var ModelPreview3D_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ d
589
590
  });
590
591
  //#endregion
591
592
  //#region app/components/workshop/town/ModelPreview3D.vue
592
- var _sfc_setup$3 = ModelPreview3D_vue_vue_type_script_setup_true_lang_default.setup;
593
+ var _sfc_setup$4 = ModelPreview3D_vue_vue_type_script_setup_true_lang_default.setup;
593
594
  ModelPreview3D_vue_vue_type_script_setup_true_lang_default.setup = (props, ctx) => {
594
595
  const ssrContext = useSSRContext();
595
596
  (ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("components/workshop/town/ModelPreview3D.vue");
596
- return _sfc_setup$3 ? _sfc_setup$3(props, ctx) : void 0;
597
+ return _sfc_setup$4 ? _sfc_setup$4(props, ctx) : void 0;
597
598
  };
598
- var ModelPreview3D_default = /*#__PURE__*/ Object.assign(_plugin_vue_export_helper_default(ModelPreview3D_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-9d114165"]]), { __name: "WorkshopTownModelPreview3D" });
599
+ var ModelPreview3D_default = /*#__PURE__*/ Object.assign(_plugin_vue_export_helper_default(ModelPreview3D_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-ed056b0a"]]), { __name: "WorkshopTownModelPreview3D" });
599
600
  //#endregion
600
601
  //#region app/components/workshop/AssetLibrary.vue?vue&type=script&setup=true&lang.ts
601
602
  var AssetLibrary_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineComponent({
@@ -626,8 +627,8 @@ var AssetLibrary_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ def
626
627
  const deletingId = ref("");
627
628
  const deleteMsg = ref("");
628
629
  return (_ctx, _push, _parent, _attrs) => {
629
- _push(`<aside${ssrRenderAttrs(mergeProps({ class: "asset-lib" }, _attrs))} data-v-effff4e2><div class="lib-head" data-v-effff4e2><span class="head-title" data-v-effff4e2>${ssrInterpolate(_ctx.$t("assetLibrary.k7la4x5001"))}</span><span class="head-hint" data-v-effff4e2>${ssrInterpolate(_ctx.$t("assetLibrary.kulif5b002"))}</span></div><div class="${ssrRenderClass([{ drop: unref(dropActive) }, "upload-box"])}" data-v-effff4e2><label class="upload-row" data-v-effff4e2><input type="file" accept=".glb,.gltf,.obj,.fbx" class="file-input" data-v-effff4e2><span class="upload-name" data-v-effff4e2><span class="i-tabler-plus upload-ico" data-v-effff4e2></span> ${ssrInterpolate(unref(uploadFile)?.name || _ctx.$t("assetLibrary.k1iiort6010"))}</span></label>`);
630
- if (unref(dropActive)) _push(`<span class="drop-hint" data-v-effff4e2><span class="i-tabler-download" data-v-effff4e2></span> ${ssrInterpolate(_ctx.$t("assetLibrary.k5hg6jq003"))}</span>`);
630
+ _push(`<aside${ssrRenderAttrs(mergeProps({ class: "asset-lib" }, _attrs))} data-v-3d6a30ed><div class="lib-head" data-v-3d6a30ed><span class="head-title" data-v-3d6a30ed>${ssrInterpolate(_ctx.$t("assetLibrary.k7la4x5001"))}</span><span class="head-hint" data-v-3d6a30ed>${ssrInterpolate(_ctx.$t("assetLibrary.kulif5b002"))}</span></div><div class="${ssrRenderClass([{ drop: unref(dropActive) }, "upload-box"])}" data-v-3d6a30ed><label class="upload-row" data-v-3d6a30ed><input type="file" accept=".glb,.gltf,.obj,.fbx" class="file-input" data-v-3d6a30ed><span class="upload-name" data-v-3d6a30ed><span class="i-tabler-plus upload-ico" data-v-3d6a30ed></span> ${ssrInterpolate(unref(uploadFile)?.name || _ctx.$t("assetLibrary.k1iiort6010"))}</span></label>`);
631
+ if (unref(dropActive)) _push(`<span class="drop-hint" data-v-3d6a30ed><span class="i-tabler-download" data-v-3d6a30ed></span> ${ssrInterpolate(_ctx.$t("assetLibrary.k5hg6jq003"))}</span>`);
631
632
  else _push(`<!---->`);
632
633
  if (unref(uploadFile)) {
633
634
  _push(`<!--[-->`);
@@ -635,31 +636,31 @@ var AssetLibrary_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ def
635
636
  "local-file": unref(uploadFile),
636
637
  height: 92
637
638
  }, null, _parent));
638
- else _push(`<span class="upload-file-tag" data-v-effff4e2>${ssrInterpolate(unref(uploadFile).name)} (${ssrInterpolate(_ctx.$t("assetLibrary.k1xz5wvk009"))}</span>`);
639
- _push(`<div class="upload-actions" data-v-effff4e2><button class="upload-btn go"${ssrIncludeBooleanAttr(unref(uploading)) ? " disabled" : ""} data-v-effff4e2>${ssrInterpolate(unref(uploading) ? _ctx.$t("assetLibrary.k1ar7n8i005") : _ctx.$t("assetLibrary.k1hhga4h014"))}</button><button class="upload-btn"${ssrIncludeBooleanAttr(unref(uploading)) ? " disabled" : ""} data-v-effff4e2>${ssrInterpolate(_ctx.$t("assetLibrary.k3xdnn004"))}</button></div><!--]-->`);
640
- } else if (unref(uploading)) _push(`<span class="mini-err" data-v-effff4e2>${ssrInterpolate(_ctx.$t("assetLibrary.k1ar7n8i005"))}</span>`);
639
+ else _push(`<span class="upload-file-tag" data-v-3d6a30ed>${ssrInterpolate(unref(uploadFile).name)} (${ssrInterpolate(_ctx.$t("assetLibrary.k1xz5wvk009"))}</span>`);
640
+ _push(`<div class="upload-actions" data-v-3d6a30ed><button class="upload-btn go"${ssrIncludeBooleanAttr(unref(uploading)) ? " disabled" : ""} data-v-3d6a30ed>${ssrInterpolate(unref(uploading) ? _ctx.$t("assetLibrary.k1ar7n8i005") : _ctx.$t("assetLibrary.k1hhga4h014"))}</button><button class="upload-btn"${ssrIncludeBooleanAttr(unref(uploading)) ? " disabled" : ""} data-v-3d6a30ed>${ssrInterpolate(_ctx.$t("assetLibrary.k3xdnn004"))}</button></div><!--]-->`);
641
+ } else if (unref(uploading)) _push(`<span class="mini-err" data-v-3d6a30ed>${ssrInterpolate(_ctx.$t("assetLibrary.k1ar7n8i005"))}</span>`);
641
642
  else _push(`<!---->`);
642
- if (unref(uploadError) && !unref(uploadFile)) _push(`<span class="mini-err" data-v-effff4e2>${ssrInterpolate(unref(uploadError))}</span>`);
643
+ if (unref(uploadError) && !unref(uploadFile)) _push(`<span class="mini-err" data-v-3d6a30ed>${ssrInterpolate(unref(uploadError))}</span>`);
643
644
  else _push(`<!---->`);
644
- _push(`</div><div class="lib-grid" data-v-effff4e2><!--[-->`);
645
+ _push(`</div><div class="lib-grid" data-v-3d6a30ed><!--[-->`);
645
646
  ssrRenderList(unref(deviceModels), (m) => {
646
- _push(`<div class="model-card"${ssrRenderAttr("data-model-id", m.id)} draggable="true"${ssrRenderAttr("title", m.hint || _ctx.$t("assetLibrary.katn7lo015", { p0: m.name }))} data-v-effff4e2>`);
647
+ _push(`<div class="model-card"${ssrRenderAttr("data-model-id", m.id)} draggable="true"${ssrRenderAttr("title", m.hint || _ctx.$t("assetLibrary.katn7lo015", { p0: m.name }))} data-v-3d6a30ed>`);
647
648
  if (isPreviewable(m.file)) _push(ssrRenderComponent(ModelPreview3D_default, {
648
649
  file: m.file,
649
650
  height: 76
650
651
  }, null, _parent));
651
- else _push(`<span class="model-img glb dev" data-v-effff4e2><span class="i-tabler-cpu glb-cube" aria-hidden="true" data-v-effff4e2></span></span>`);
652
- _push(`<span class="model-name" data-v-effff4e2>${ssrInterpolate(m.name)}</span><span class="model-badge" data-v-effff4e2>${ssrInterpolate(_ctx.$t("assetLibrary.k1n32zs0006"))}</span><div class="card-actions" data-v-effff4e2>`);
653
- if (m.file.includes("/assets/game/devices/")) _push(`<button class="card-btn danger"${ssrIncludeBooleanAttr(unref(deletingId) === m.id) ? " disabled" : ""} data-v-effff4e2>${ssrInterpolate(unref(deletingId) === m.id ? "…" : _ctx.$t("assetLibrary.k498l011"))}</button>`);
652
+ else _push(`<span class="model-img glb dev" data-v-3d6a30ed><span class="i-tabler-cpu glb-cube" aria-hidden="true" data-v-3d6a30ed></span></span>`);
653
+ _push(`<span class="model-name" data-v-3d6a30ed>${ssrInterpolate(m.name)}</span><span class="model-badge" data-v-3d6a30ed>${ssrInterpolate(_ctx.$t("assetLibrary.k1n32zs0006"))}</span><div class="card-actions" data-v-3d6a30ed>`);
654
+ if (m.file.includes("/assets/game/devices/")) _push(`<button class="card-btn danger"${ssrIncludeBooleanAttr(unref(deletingId) === m.id) ? " disabled" : ""} data-v-3d6a30ed>${ssrInterpolate(unref(deletingId) === m.id ? "…" : _ctx.$t("assetLibrary.k498l011"))}</button>`);
654
655
  else _push(`<!---->`);
655
656
  _push(`</div></div>`);
656
657
  });
657
658
  _push(`<!--]-->`);
658
- if (!unref(assets).loaded) _push(`<div class="lib-note" data-v-effff4e2><span class="loading-dot" data-v-effff4e2></span> ${ssrInterpolate(_ctx.$t("assetLibrary.k1kq2tmi007"))}</div>`);
659
- else if (unref(deviceModels).length === 0) _push(`<div class="lib-note" data-v-effff4e2>${ssrInterpolate(_ctx.$t("assetLibrary.k15527e1008"))}</div>`);
659
+ if (!unref(assets).loaded) _push(`<div class="lib-note" data-v-3d6a30ed><span class="loading-dot" data-v-3d6a30ed></span> ${ssrInterpolate(_ctx.$t("assetLibrary.k1kq2tmi007"))}</div>`);
660
+ else if (unref(deviceModels).length === 0) _push(`<div class="lib-note" data-v-3d6a30ed>${ssrInterpolate(_ctx.$t("assetLibrary.k15527e1008"))}</div>`);
660
661
  else _push(`<!---->`);
661
662
  _push(`</div>`);
662
- if (unref(deleteMsg)) _push(`<span class="mini-msg" data-v-effff4e2>${ssrInterpolate(unref(deleteMsg))}</span>`);
663
+ if (unref(deleteMsg)) _push(`<span class="mini-msg" data-v-3d6a30ed>${ssrInterpolate(unref(deleteMsg))}</span>`);
663
664
  else _push(`<!---->`);
664
665
  _push(`</aside>`);
665
666
  };
@@ -667,13 +668,54 @@ var AssetLibrary_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ def
667
668
  });
668
669
  //#endregion
669
670
  //#region app/components/workshop/AssetLibrary.vue
670
- var _sfc_setup$2 = AssetLibrary_vue_vue_type_script_setup_true_lang_default.setup;
671
+ var _sfc_setup$3 = AssetLibrary_vue_vue_type_script_setup_true_lang_default.setup;
671
672
  AssetLibrary_vue_vue_type_script_setup_true_lang_default.setup = (props, ctx) => {
672
673
  const ssrContext = useSSRContext();
673
674
  (ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("components/workshop/AssetLibrary.vue");
675
+ return _sfc_setup$3 ? _sfc_setup$3(props, ctx) : void 0;
676
+ };
677
+ var AssetLibrary_default = /*#__PURE__*/ Object.assign(_plugin_vue_export_helper_default(AssetLibrary_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-3d6a30ed"]]), { __name: "WorkshopAssetLibrary" });
678
+ //#endregion
679
+ //#region app/components/workshop/DaqTemplateIcon.vue?vue&type=script&setup=true&lang.ts
680
+ var DaqTemplateIcon_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineComponent({
681
+ __name: "DaqTemplateIcon",
682
+ __ssrInlineRender: true,
683
+ props: { icon: {} },
684
+ setup(__props) {
685
+ /**
686
+ * 数采/智控模板图标 —— 全项目唯一的 SVG 片段注入口。
687
+ *
688
+ * 为什么这里必须用 v-html:DAQ_ICONS 的值是 SVG **绘制片段**(path/circle/rect),
689
+ * 必须按 SVG 命名空间解析成图元,文本插值只会把它们画成字面文本。
690
+ * 为什么是安全的:DAO_ICONS 是编译期静态字面量表 —— 键来自 #shared 协议的图标枚举,
691
+ * 值全部是本文件里手写的字符串,不含用户输入、不含 <script>/on* 事件属性/外部引用。
692
+ * 收敛收益:TownView 原先有 6 处 v-html(各自重复同样的判断),现在只此一处。
693
+ */
694
+ const props = __props;
695
+ /** 数采模板图标(设计稿 ICONS;SVG path 直嵌) */
696
+ const DAQ_ICONS = {
697
+ thermo: "<path d=\"M10 4a2 2 0 0 1 4 0v9a4 4 0 1 1-4 0V4Z\"/><circle cx=\"12\" cy=\"16.5\" r=\"1.6\"/>",
698
+ pressure: "<circle cx=\"12\" cy=\"12\" r=\"8\"/><path d=\"m12 12 3.5-3.5\"/><circle cx=\"12\" cy=\"12\" r=\"1.2\"/>",
699
+ tension: "<circle cx=\"12\" cy=\"10\" r=\"4\"/><path d=\"M4 18.5h16M8 18.5V14M16 18.5V14\"/><path d=\"M2.5 10H8M16 10h5.5\"/>",
700
+ encoder: "<circle cx=\"12\" cy=\"12\" r=\"8\"/><circle cx=\"12\" cy=\"12\" r=\"2\"/><path d=\"M12 4v3M12 17v3M4 12h3M17 12h3\"/>",
701
+ camera: "<rect x=\"3\" y=\"7\" width=\"13\" height=\"10\" rx=\"2\"/><path d=\"m16 11 5-3v8l-5-3\"/><circle cx=\"8\" cy=\"12\" r=\"2.5\"/>",
702
+ gateway: "<rect x=\"8\" y=\"11\" width=\"8\" height=\"10\" rx=\"1.5\"/><circle cx=\"12\" cy=\"5.5\" r=\"1.5\"/><path d=\"M12 10V7M8.5 8.5a5 5 0 0 1 7 0M6 6a8.5 8.5 0 0 1 12 0\"/>"
703
+ };
704
+ const markup = computed(() => DAQ_ICONS[props.icon] ?? DAQ_ICONS.gateway);
705
+ return (_ctx, _push, _parent, _attrs) => {
706
+ _push(`<svg${ssrRenderAttrs(mergeProps({ viewBox: "0 0 24 24" }, _attrs))}>${unref(markup) ?? ""}</svg>`);
707
+ };
708
+ }
709
+ });
710
+ //#endregion
711
+ //#region app/components/workshop/DaqTemplateIcon.vue
712
+ var _sfc_setup$2 = DaqTemplateIcon_vue_vue_type_script_setup_true_lang_default.setup;
713
+ DaqTemplateIcon_vue_vue_type_script_setup_true_lang_default.setup = (props, ctx) => {
714
+ const ssrContext = useSSRContext();
715
+ (ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("components/workshop/DaqTemplateIcon.vue");
674
716
  return _sfc_setup$2 ? _sfc_setup$2(props, ctx) : void 0;
675
717
  };
676
- var AssetLibrary_default = /*#__PURE__*/ Object.assign(_plugin_vue_export_helper_default(AssetLibrary_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-effff4e2"]]), { __name: "WorkshopAssetLibrary" });
718
+ var DaqTemplateIcon_default = Object.assign(DaqTemplateIcon_vue_vue_type_script_setup_true_lang_default, { __name: "WorkshopDaqTemplateIcon" });
677
719
  //#endregion
678
720
  //#region app/components/workshop/DeviceTwinPanel.vue?vue&type=script&setup=true&lang.ts
679
721
  var DeviceTwinPanel_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineComponent({
@@ -725,44 +767,44 @@ var DeviceTwinPanel_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/
725
767
  const dcwErrs = reactive({});
726
768
  const dcwBusy = ref("");
727
769
  return (_ctx, _push, _parent, _attrs) => {
728
- _push(`<aside${ssrRenderAttrs(mergeProps({ class: "twin-panel" }, _attrs))} data-v-2eb2660e><div class="twin-head" data-v-2eb2660e><span class="twin-kicker" data-v-2eb2660e>${ssrInterpolate(_ctx.$t("deviceTwinPanel.k7k6evr002"))}</span><span class="twin-count" data-v-2eb2660e>${ssrInterpolate(unref(twins).twins.length)}</span></div>`);
729
- if (unref(twins).error) _push(`<div class="twin-error" data-v-2eb2660e>${ssrInterpolate(unref(twins).error)}</div>`);
770
+ _push(`<aside${ssrRenderAttrs(mergeProps({ class: "twin-panel" }, _attrs))} data-v-37ad3127><div class="twin-head" data-v-37ad3127><span class="twin-kicker" data-v-37ad3127>${ssrInterpolate(_ctx.$t("deviceTwinPanel.k7k6evr002"))}</span><span class="twin-count" data-v-37ad3127>${ssrInterpolate(unref(twins).twins.length)}</span></div>`);
771
+ if (unref(twins).error) _push(`<div class="twin-error" data-v-37ad3127>${ssrInterpolate(unref(twins).error)}</div>`);
730
772
  else _push(`<!---->`);
731
- if (!unref(twins).loaded) _push(`<div class="twin-empty" data-v-2eb2660e>${ssrInterpolate(_ctx.$t("deviceTwinPanel.kkw7sn5003"))}</div>`);
732
- else if (unref(twins).twins.length === 0) _push(`<div class="twin-empty" data-v-2eb2660e><div class="twin-empty-frame" data-v-2eb2660e><div class="twin-empty-title" data-v-2eb2660e>${ssrInterpolate(_ctx.$t("deviceTwinPanel.k13y2qmg004"))}</div><div class="twin-empty-sub" data-v-2eb2660e>${ssrInterpolate(_ctx.$t("deviceTwinPanel.kotf23l005"))}</div></div></div>`);
773
+ if (!unref(twins).loaded) _push(`<div class="twin-empty" data-v-37ad3127>${ssrInterpolate(_ctx.$t("deviceTwinPanel.kkw7sn5003"))}</div>`);
774
+ else if (unref(twins).twins.length === 0) _push(`<div class="twin-empty" data-v-37ad3127><div class="twin-empty-frame" data-v-37ad3127><div class="twin-empty-title" data-v-37ad3127>${ssrInterpolate(_ctx.$t("deviceTwinPanel.k13y2qmg004"))}</div><div class="twin-empty-sub" data-v-37ad3127>${ssrInterpolate(_ctx.$t("deviceTwinPanel.kotf23l005"))}</div></div></div>`);
733
775
  else {
734
- _push(`<div class="twin-list" data-v-2eb2660e><!--[-->`);
735
- ssrRenderList(unref(twins).twins, (t) => {
736
- _push(`<button class="${ssrRenderClass([{ daq: isDaq(t) }, "twin-card"])}" type="button" data-v-2eb2660e><div class="twin-row" data-v-2eb2660e><span class="twin-model-tag" data-v-2eb2660e>${ssrInterpolate(modelTag(t.modelRef || t.name))}</span><div class="twin-idbar" data-v-2eb2660e><span class="twin-name" data-v-2eb2660e>${ssrInterpolate(t.name)}</span><span class="twin-code" data-v-2eb2660e>${ssrInterpolate(isDaq(t) ? "DAQ" : devNo(t.id))}</span></div><button class="${ssrRenderClass([{ armed: unref(armedId) === t.id }, "twin-del"])}"${ssrIncludeBooleanAttr(unref(busyId) === t.id) ? " disabled" : ""}${ssrRenderAttr("title", unref(armedId) === t.id ? "再次点击确认删除该设备实例" : "删除该设备实例")} data-v-2eb2660e>${ssrInterpolate(unref(armedId) === t.id ? _ctx.$t("deviceTwinPanel.k44653007") : "✕")}</button><span class="${ssrRenderClass([`s-${t.state}`, "twin-state"])}" data-v-2eb2660e><i class="twin-state-dot" style="${ssrRenderStyle({ background: stateColor[t.state] || "var(--hud-dim)" })}" data-v-2eb2660e></i> ${ssrInterpolate(stateLabel[t.state] || t.state)}</span></div>`);
737
- if (Object.keys(t.telemetry).length) {
738
- _push(`<div class="twin-tele" data-v-2eb2660e><!--[-->`);
739
- ssrRenderList(t.telemetry, (v, k) => {
740
- _push(`<span class="tele-item" data-v-2eb2660e><em data-v-2eb2660e>${ssrInterpolate(k)}</em><b data-v-2eb2660e>${ssrInterpolate(fmt(v))}</b></span>`);
776
+ _push(`<div class="twin-list" data-v-37ad3127><!--[-->`);
777
+ ssrRenderList(unref(twins).twins, (tw) => {
778
+ _push(`<button class="${ssrRenderClass([{ daq: isDaq(tw) }, "twin-card"])}" type="button" data-v-37ad3127><div class="twin-row" data-v-37ad3127><span class="twin-model-tag" data-v-37ad3127>${ssrInterpolate(modelTag(tw.modelRef || tw.name))}</span><div class="twin-idbar" data-v-37ad3127><span class="twin-name" data-v-37ad3127>${ssrInterpolate(tw.name)}</span><span class="twin-code" data-v-37ad3127>${ssrInterpolate(isDaq(tw) ? "DAQ" : devNo(tw.id))}</span></div><button class="${ssrRenderClass([{ armed: unref(armedId) === tw.id }, "twin-del"])}"${ssrIncludeBooleanAttr(unref(busyId) === tw.id) ? " disabled" : ""}${ssrRenderAttr("title", unref(armedId) === tw.id ? "再次点击确认删除该设备实例" : "删除该设备实例")} data-v-37ad3127>${ssrInterpolate(unref(armedId) === tw.id ? _ctx.$t("deviceTwinPanel.k44653007") : "✕")}</button><span class="${ssrRenderClass([`s-${tw.state}`, "twin-state"])}" data-v-37ad3127><i class="twin-state-dot" style="${ssrRenderStyle({ background: stateColor[tw.state] || "var(--hud-dim)" })}" data-v-37ad3127></i> ${ssrInterpolate(stateLabel[tw.state] || tw.state)}</span></div>`);
779
+ if (Object.keys(tw.telemetry).length) {
780
+ _push(`<div class="twin-tele" data-v-37ad3127><!--[-->`);
781
+ ssrRenderList(tw.telemetry, (v, k) => {
782
+ _push(`<span class="tele-item" data-v-37ad3127><em data-v-37ad3127>${ssrInterpolate(k)}</em><b data-v-37ad3127>${ssrInterpolate(fmt(v))}</b></span>`);
741
783
  });
742
784
  _push(`<!--]--></div>`);
743
785
  } else _push(`<!---->`);
744
- if (__props.daqLive?.[t.id]?.length) {
745
- _push(`<div class="twin-daq" data-v-2eb2660e><!--[-->`);
746
- ssrRenderList(__props.daqLive[t.id], (d, i) => {
747
- _push(`<span class="${ssrRenderClass([{ alarm: d.alarm }, "daq-item"])}" data-v-2eb2660e><em data-v-2eb2660e>${ssrInterpolate(d.ch)}</em><b data-v-2eb2660e>${ssrInterpolate(d.value)}<i data-v-2eb2660e>${ssrInterpolate(d.unit)}</i></b></span>`);
786
+ if (__props.daqLive?.[tw.id]?.length) {
787
+ _push(`<div class="twin-daq" data-v-37ad3127><!--[-->`);
788
+ ssrRenderList(__props.daqLive[tw.id], (d, i) => {
789
+ _push(`<span class="${ssrRenderClass([{ alarm: d.alarm }, "daq-item"])}" data-v-37ad3127><em data-v-37ad3127>${ssrInterpolate(d.ch)}</em><b data-v-37ad3127>${ssrInterpolate(d.value)}<i data-v-37ad3127>${ssrInterpolate(d.unit)}</i></b></span>`);
748
790
  });
749
791
  _push(`<!--]--></div>`);
750
792
  } else _push(`<!---->`);
751
- if (__props.dcwLive?.[t.id]?.length) {
752
- _push(`<div class="twin-dcw" data-v-2eb2660e><!--[-->`);
753
- ssrRenderList(__props.dcwLive[t.id], (r) => {
754
- _push(`<div class="dcw-item" data-v-2eb2660e><div class="dcw-head" data-v-2eb2660e><em data-v-2eb2660e>${ssrInterpolate(r.ch)}`);
755
- if (r.src === "recipe") _push(`<i class="dcw-src" data-v-2eb2660e>${ssrInterpolate(_ctx.$t("deviceTwinPanel.k48grv006"))}</i>`);
793
+ if (__props.dcwLive?.[tw.id]?.length) {
794
+ _push(`<div class="twin-dcw" data-v-37ad3127><!--[-->`);
795
+ ssrRenderList(__props.dcwLive[tw.id], (r) => {
796
+ _push(`<div class="dcw-item" data-v-37ad3127><div class="dcw-head" data-v-37ad3127><em data-v-37ad3127>${ssrInterpolate(r.ch)}`);
797
+ if (r.src === "recipe") _push(`<i class="dcw-src" data-v-37ad3127>${ssrInterpolate(_ctx.$t("deviceTwinPanel.k48grv006"))}</i>`);
756
798
  else _push(`<!---->`);
757
- _push(`</em><b class="dcw-set" data-v-2eb2660e>${ssrInterpolate(r.value != null ? r.value.toFixed(r.decimals) : "--")}<i data-v-2eb2660e>${ssrInterpolate(r.unit)}</i></b></div>`);
799
+ _push(`</em><b class="dcw-set" data-v-37ad3127>${ssrInterpolate(r.value != null ? r.value.toFixed(r.decimals) : "--")}<i data-v-37ad3127>${ssrInterpolate(r.unit)}</i></b></div>`);
758
800
  if (r.readValue != null || r.lastReadAt) {
759
- _push(`<div class="dcw-act"${ssrRenderAttr("title", _ctx.$t("deviceTwinPanel.k9r7d4e030"))} data-v-2eb2660e><em data-v-2eb2660e>ACT</em><b data-v-2eb2660e>${ssrInterpolate(r.readValue != null ? r.readValue.toFixed(r.decimals) : "--")}<i data-v-2eb2660e>${ssrInterpolate(r.unit)}</i></b>`);
760
- if (r.lastReadAt) _push(`<i class="dcw-act-at" data-v-2eb2660e>${ssrInterpolate(r.lastReadAt.slice(11, 19))}</i>`);
801
+ _push(`<div class="dcw-act"${ssrRenderAttr("title", _ctx.$t("deviceTwinPanel.k9r7d4e030"))} data-v-37ad3127><em data-v-37ad3127>ACT</em><b data-v-37ad3127>${ssrInterpolate(r.readValue != null ? r.readValue.toFixed(r.decimals) : "--")}<i data-v-37ad3127>${ssrInterpolate(r.unit)}</i></b>`);
802
+ if (r.lastReadAt) _push(`<i class="dcw-act-at" data-v-37ad3127>${ssrInterpolate(r.lastReadAt.slice(11, 19))}</i>`);
761
803
  else _push(`<!---->`);
762
804
  _push(`</div>`);
763
805
  } else _push(`<!---->`);
764
- _push(`<div class="dcw-win" data-v-2eb2660e><span${ssrRenderAttr("title", r.src === "recipe" ? "当前运行配方工艺窗口" : "节点全局量程")} data-v-2eb2660e>${ssrInterpolate(dcwWinText(r))}</span></div><div class="dcw-ctrl" data-v-2eb2660e><input${ssrRenderAttr("value", unref(dcwDrafts)[r.id])} type="number" class="ctrl-input"${ssrRenderAttr("step", 10 ** -r.decimals)}${ssrRenderAttr("min", Number.isFinite(r.lo) ? r.lo : void 0)}${ssrRenderAttr("max", Number.isFinite(r.hi) ? r.hi : void 0)}${ssrRenderAttr("placeholder", `${Number.isFinite(r.lo) ? r.lo : ""} ~ ${Number.isFinite(r.hi) ? r.hi : ""}`)} data-v-2eb2660e><button class="ctrl-btn dcw-send"${ssrIncludeBooleanAttr(unref(dcwDrafts)[r.id] == null || unref(dcwDrafts)[r.id] === "" || unref(dcwBusy) === r.id) ? " disabled" : ""}${ssrRenderAttr("title", _ctx.$t("deviceTwinPanel.k1j04u8001"))} data-v-2eb2660e>${ssrInterpolate(unref(dcwBusy) === r.id ? "···" : "SET")}</button></div>`);
765
- if (unref(dcwErrs)[r.id]) _push(`<small class="dcw-err" data-v-2eb2660e>${ssrInterpolate(unref(dcwErrs)[r.id])}</small>`);
806
+ _push(`<div class="dcw-win" data-v-37ad3127><span${ssrRenderAttr("title", r.src === "recipe" ? "当前运行配方工艺窗口" : "节点全局量程")} data-v-37ad3127>${ssrInterpolate(dcwWinText(r))}</span></div><div class="dcw-ctrl" data-v-37ad3127><input${ssrRenderAttr("value", unref(dcwDrafts)[r.id])} type="number" class="ctrl-input"${ssrRenderAttr("step", 10 ** -r.decimals)}${ssrRenderAttr("min", Number.isFinite(r.lo) ? r.lo : void 0)}${ssrRenderAttr("max", Number.isFinite(r.hi) ? r.hi : void 0)}${ssrRenderAttr("placeholder", `${Number.isFinite(r.lo) ? r.lo : ""} ~ ${Number.isFinite(r.hi) ? r.hi : ""}`)} data-v-37ad3127><button class="ctrl-btn dcw-send"${ssrIncludeBooleanAttr(unref(dcwDrafts)[r.id] == null || unref(dcwDrafts)[r.id] === "" || unref(dcwBusy) === r.id) ? " disabled" : ""}${ssrRenderAttr("title", _ctx.$t("deviceTwinPanel.k1j04u8001"))} data-v-37ad3127>${ssrInterpolate(unref(dcwBusy) === r.id ? "···" : "SET")}</button></div>`);
807
+ if (unref(dcwErrs)[r.id]) _push(`<small class="dcw-err" data-v-37ad3127>${ssrInterpolate(unref(dcwErrs)[r.id])}</small>`);
766
808
  else _push(`<!---->`);
767
809
  _push(`</div>`);
768
810
  });
@@ -772,7 +814,7 @@ var DeviceTwinPanel_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/
772
814
  });
773
815
  _push(`<!--]--></div>`);
774
816
  }
775
- if (unref(ctrlMsg)) _push(`<span class="twin-err" data-v-2eb2660e>${ssrInterpolate(unref(ctrlMsg))}</span>`);
817
+ if (unref(ctrlMsg)) _push(`<span class="twin-err" data-v-37ad3127>${ssrInterpolate(unref(ctrlMsg))}</span>`);
776
818
  else _push(`<!---->`);
777
819
  _push(`</aside>`);
778
820
  };
@@ -786,7 +828,7 @@ DeviceTwinPanel_vue_vue_type_script_setup_true_lang_default.setup = (props, ctx)
786
828
  (ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("components/workshop/DeviceTwinPanel.vue");
787
829
  return _sfc_setup$1 ? _sfc_setup$1(props, ctx) : void 0;
788
830
  };
789
- var DeviceTwinPanel_default = /*#__PURE__*/ Object.assign(_plugin_vue_export_helper_default(DeviceTwinPanel_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-2eb2660e"]]), { __name: "WorkshopDeviceTwinPanel" });
831
+ var DeviceTwinPanel_default = /*#__PURE__*/ Object.assign(_plugin_vue_export_helper_default(DeviceTwinPanel_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-37ad3127"]]), { __name: "WorkshopDeviceTwinPanel" });
790
832
  //#endregion
791
833
  //#region app/composables/workshop/useSceneLayouts.ts
792
834
  /**
@@ -1227,6 +1269,18 @@ var TownView_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineC
1227
1269
  const deviceTwins = useDeviceTwins();
1228
1270
  const sceneLayouts = useSceneLayouts();
1229
1271
  useHttp();
1272
+ const { isDesktop } = useResponsive();
1273
+ /** 当前打开的抽屉:'left' | 'right' | null */
1274
+ const sheetOpen = ref(null);
1275
+ /** 窄屏底部坞是否展开(默认收起,舞台优先) */
1276
+ const dockOpen = ref(false);
1277
+ /** 回到桌面档必须清空抽屉状态,否则遮罩会滞留在屏幕上 */
1278
+ watch(isDesktop, (d) => {
1279
+ if (d) {
1280
+ sheetOpen.value = null;
1281
+ dockOpen.value = false;
1282
+ }
1283
+ });
1230
1284
  ref(null);
1231
1285
  /** 当前渲染器(TownScene / TownScene3D 之一) */
1232
1286
  const sceneRef = shallowRef(null);
@@ -1830,22 +1884,17 @@ var TownView_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineC
1830
1884
  /** 数采 → 设备绑定(server 权威:node.deviceBindingId;REST bind 落库 + WS 收敛) */
1831
1885
  const boundDeviceOf = (daqId) => daq.nodeById(daqId)?.deviceIds?.[0] ?? daq.nodeById(daqId)?.deviceBindingId ?? null;
1832
1886
  const daqOfDevice = (deviceId) => deviceId ? daq.nodes.filter((n) => (n.deviceIds ?? (n.deviceBindingId ? [n.deviceBindingId] : [])).includes(deviceId)).map((n) => n.id) : [];
1833
- /** 数采模板图标(设计稿 ICONS;SVG path 直嵌) */
1834
- const DAQ_ICONS = {
1835
- thermo: "<path d=\"M10 4a2 2 0 0 1 4 0v9a4 4 0 1 1-4 0V4Z\"/><circle cx=\"12\" cy=\"16.5\" r=\"1.6\"/>",
1836
- pressure: "<circle cx=\"12\" cy=\"12\" r=\"8\"/><path d=\"m12 12 3.5-3.5\"/><circle cx=\"12\" cy=\"12\" r=\"1.2\"/>",
1837
- tension: "<circle cx=\"12\" cy=\"10\" r=\"4\"/><path d=\"M4 18.5h16M8 18.5V14M16 18.5V14\"/><path d=\"M2.5 10H8M16 10h5.5\"/>",
1838
- encoder: "<circle cx=\"12\" cy=\"12\" r=\"8\"/><circle cx=\"12\" cy=\"12\" r=\"2\"/><path d=\"M12 4v3M12 17v3M4 12h3M17 12h3\"/>",
1839
- camera: "<rect x=\"3\" y=\"7\" width=\"13\" height=\"10\" rx=\"2\"/><path d=\"m16 11 5-3v8l-5-3\"/><circle cx=\"8\" cy=\"12\" r=\"2.5\"/>",
1840
- gateway: "<rect x=\"8\" y=\"11\" width=\"8\" height=\"10\" rx=\"1.5\"/><circle cx=\"12\" cy=\"5.5\" r=\"1.5\"/><path d=\"M12 10V7M8.5 8.5a5 5 0 0 1 7 0M6 6a8.5 8.5 0 0 1 12 0\"/>"
1841
- };
1842
- const daqIcon = (icon) => DAQ_ICONS[icon] ?? DAQ_ICONS.gateway;
1843
1887
  /** bind-pop:添加数采通道 —— 直接选择节点实例绑定(server 权威 deviceBindingId,双向同源)。
1844
1888
  * 列出未绑定 + 绑在他设备的节点(按模板分组,显示当前归属);不再隐式创建/就近复用。 */
1845
1889
  const bindPopOpen = ref(false);
1846
1890
  const dcwBindPopOpen = ref(false);
1847
1891
  /** 弹层高度钳制:top 恰好贴住所属 Inspector 卡片顶缘(不越出面板、不顶到页面顶部) */
1848
1892
  const bindPopMaxH = ref(420);
1893
+ /**
1894
+ * 绑定候选行(数采/智控两个绑定弹层共用)。
1895
+ * tpl 只声明弹层真正读取、且两套模板目录都有的字段:数采侧是 DaqTemplate,
1896
+ * 智控侧是 dcw.templates 的同构投影 —— 后者本就没有 base/amp 等数采专有字段。
1897
+ */
1849
1898
  const daqBindChoices = computed(() => {
1850
1899
  const devId = selected.value?.kind === "device" ? selected.value.id : "";
1851
1900
  const map = {};
@@ -1896,12 +1945,12 @@ var TownView_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineC
1896
1945
  const id = selected.value?.id;
1897
1946
  if (!id) return [];
1898
1947
  return daqOfDevice(id).map((daqId) => {
1899
- const t = sceneTwinById(daqId);
1948
+ const twin = sceneTwinById(daqId);
1900
1949
  const st = daqSim.value.get(daqId);
1901
- const tpl = st?.tpl ?? daqTplById(t?.modelRef ?? "");
1950
+ const tpl = st?.tpl ?? daqTplById(twin?.modelRef ?? "");
1902
1951
  return {
1903
1952
  daqId,
1904
- name: t?.name ?? daqId,
1953
+ name: twin?.name ?? daqId,
1905
1954
  ch: tpl?.ch ?? t("townView.k1ef3cls168"),
1906
1955
  icon: tpl?.icon ?? "gateway",
1907
1956
  value: st ? fmtDaq(st) : "--",
@@ -2322,83 +2371,94 @@ var TownView_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineC
2322
2371
  const navScale = computed(() => Math.min(5, Math.max(.4, camPose.value.dolly)));
2323
2372
  return (_ctx, _push, _parent, _attrs) => {
2324
2373
  const _component_WorkshopAssetLibrary = AssetLibrary_default;
2374
+ const _component_WorkshopDaqTemplateIcon = DaqTemplateIcon_default;
2325
2375
  const _component_WorkshopDeviceTwinPanel = DeviceTwinPanel_default;
2326
- _push(`<div${ssrRenderAttrs(mergeProps({ class: "town-view" }, _attrs))} data-v-5660e131><header class="topnav" data-v-5660e131><div class="brand" data-v-5660e131><svg class="brand-glyph" viewBox="0 0 32 32" fill="none" aria-hidden="true" data-v-5660e131><path d="M16 2.5 27.5 9v14L16 29.5 4.5 23V9L16 2.5Z" stroke="#35e0a0" stroke-width="1.6" data-v-5660e131></path><path d="M16 8.2 22.5 12v8L16 23.8 9.5 20v-8L16 8.2Z" stroke="#41c8f4" stroke-width="1.3" opacity=".85" data-v-5660e131></path><circle cx="16" cy="16" r="2.4" fill="#35e0a0" data-v-5660e131></circle><circle cx="25.5" cy="7.5" r="1.6" fill="#41c8f4" data-v-5660e131></circle></svg><div data-v-5660e131><div class="brand-name" data-v-5660e131> DIGITAL <em data-v-5660e131>TWIN</em></div><div class="brand-sub" data-v-5660e131> AGENTWORKSHOP · ${ssrInterpolate(_ctx.$t("townView.klyi8yg127"))}</div></div></div><nav class="nav-tabs"${ssrRenderAttr("aria-label", _ctx.$t("townView.k1c9jyta001"))} data-v-5660e131><div class="seg" data-v-5660e131><button class="${ssrRenderClass({ on: unref(mode) === "browse" })}" data-v-5660e131>${ssrInterpolate(_ctx.$t("townView.k48dwh027"))}</button><button class="${ssrRenderClass({ on: unref(mode) === "edit" })}" data-v-5660e131>${ssrInterpolate(_ctx.$t("townView.k45eb0028"))}</button></div><button class="nav-action"${ssrIncludeBooleanAttr(unref(mode) !== "edit") ? " disabled" : ""}${ssrRenderAttr("title", unref(mode) === "edit" ? "把全部设备的位置/朝向/缩放写入数据库" : "运行模式只读")} data-v-5660e131>${ssrInterpolate(_ctx.$t("townView.k1b3bk8t029"))}</button>`);
2327
- if (unref(saveState) && unref(saveState).state !== "idle") _push(`<span class="${ssrRenderClass([`s-${unref(saveState).state}`, "save-chip"])}" data-v-5660e131>${ssrInterpolate(unref(saveStateLabel))}</span>`);
2376
+ _push(`<div${ssrRenderAttrs(mergeProps({ class: "town-view" }, _attrs))} data-v-3e78e101><header class="${ssrRenderClass([{ "sheet-on": unref(sheetOpen) }, "topnav"])}" data-v-3e78e101><div class="brand" data-v-3e78e101><svg class="brand-glyph" viewBox="0 0 32 32" fill="none" aria-hidden="true" data-v-3e78e101><path d="M16 2.5 27.5 9v14L16 29.5 4.5 23V9L16 2.5Z" stroke="#35e0a0" stroke-width="1.6" data-v-3e78e101></path><path d="M16 8.2 22.5 12v8L16 23.8 9.5 20v-8L16 8.2Z" stroke="#41c8f4" stroke-width="1.3" opacity=".85" data-v-3e78e101></path><circle cx="16" cy="16" r="2.4" fill="#35e0a0" data-v-3e78e101></circle><circle cx="25.5" cy="7.5" r="1.6" fill="#41c8f4" data-v-3e78e101></circle></svg><div data-v-3e78e101><div class="brand-name" data-v-3e78e101> DIGITAL <em data-v-3e78e101>TWIN</em></div><div class="brand-sub" data-v-3e78e101> AGENTWORKSHOP · ${ssrInterpolate(_ctx.$t("townView.klyi8yg127"))}</div></div></div><nav class="nav-tabs"${ssrRenderAttr("aria-label", _ctx.$t("townView.k1c9jyta001"))} data-v-3e78e101><div class="seg" data-v-3e78e101><button class="${ssrRenderClass({ on: unref(mode) === "browse" })}" data-v-3e78e101>${ssrInterpolate(_ctx.$t("townView.k48dwh027"))}</button><button class="${ssrRenderClass({ on: unref(mode) === "edit" })}" data-v-3e78e101>${ssrInterpolate(_ctx.$t("townView.k45eb0028"))}</button></div><button class="nav-action"${ssrIncludeBooleanAttr(unref(mode) !== "edit") ? " disabled" : ""}${ssrRenderAttr("title", unref(mode) === "edit" ? "把全部设备的位置/朝向/缩放写入数据库" : "运行模式只读")} data-v-3e78e101>${ssrInterpolate(_ctx.$t("townView.k1b3bk8t029"))}</button>`);
2377
+ if (unref(saveState) && unref(saveState).state !== "idle") _push(`<span class="${ssrRenderClass([`s-${unref(saveState).state}`, "save-chip"])}" data-v-3e78e101>${ssrInterpolate(unref(saveStateLabel))}</span>`);
2328
2378
  else _push(`<!---->`);
2329
- _push(`</nav><div class="nav-right" data-v-5660e131><span class="${ssrRenderClass([{ "nav-bell-warn": unref(activeAlarmCount) > 0 }, "nav-chip mono"])}"${ssrRenderAttr("title", _ctx.$t("townView.k1fsi3ir002"))} data-v-5660e131>◉ ${ssrInterpolate(unref(activeAlarmCount))}</span><span class="nav-chip mono" data-v-5660e131>${ssrInterpolate(unref(fps))} FPS</span><div class="avatar-chip"${ssrRenderAttr("title", _ctx.$t("townView.k1demf38003"))} data-v-5660e131><div class="avatar-fallback" data-v-5660e131>${ssrInterpolate((unref(userStore).user?.name ?? "OP").slice(0, 2).toUpperCase())}</div><span data-v-5660e131>${ssrInterpolate(unref(userStore).user?.name || _ctx.$t("townView.k1pub99m139"))}</span></div></div></header><div class="app" data-v-5660e131><aside class="rail rail-left" data-v-5660e131><section class="panel" data-v-5660e131><div class="panel-hd" data-v-5660e131><h3 data-v-5660e131>${ssrInterpolate(_ctx.$t("townView.k1k75lzy030"))}</h3><span class="panel-tag" data-v-5660e131>${ssrInterpolate(unref(deviceModels).length)}</span></div>`);
2379
+ _push(`</nav><div class="nav-right" data-v-3e78e101><span class="${ssrRenderClass([{ "nav-bell-warn": unref(activeAlarmCount) > 0 }, "nav-chip mono"])}"${ssrRenderAttr("title", _ctx.$t("townView.k1fsi3ir002"))} data-v-3e78e101>◉ ${ssrInterpolate(unref(activeAlarmCount))}</span><span class="nav-chip mono nav-fps" data-v-3e78e101>${ssrInterpolate(unref(fps))} FPS</span><div class="avatar-chip nav-user"${ssrRenderAttr("title", _ctx.$t("townView.k1demf38003"))} data-v-3e78e101><div class="avatar-fallback" data-v-3e78e101>${ssrInterpolate((unref(userStore).user?.name ?? "OP").slice(0, 2).toUpperCase())}</div><span data-v-3e78e101>${ssrInterpolate(unref(userStore).user?.name || _ctx.$t("townView.k1pub99m139"))}</span></div><button type="button" class="${ssrRenderClass([{ on: unref(sheetOpen) === "left" }, "sheet-btn"])}" aria-controls="town-rail-left"${ssrRenderAttr("aria-expanded", unref(sheetOpen) === "left" ? "true" : "false")}${ssrRenderAttr("title", _ctx.$t("townView.k1k75lzy030"))} data-v-3e78e101><svg class="sheet-ico" viewBox="0 0 24 24" aria-hidden="true" data-v-3e78e101><path d="M4 6h16M4 12h11M4 18h16" data-v-3e78e101></path></svg><span class="sheet-btn-t" data-v-3e78e101>${ssrInterpolate(_ctx.$t("townView.k1k75lzy030"))}</span></button><button type="button" class="${ssrRenderClass([{ on: unref(sheetOpen) === "right" }, "sheet-btn"])}" aria-controls="town-rail-right"${ssrRenderAttr("aria-expanded", unref(sheetOpen) === "right" ? "true" : "false")}${ssrRenderAttr("title", _ctx.$t("townView.k17dkhgd112"))} data-v-3e78e101><svg class="sheet-ico" viewBox="0 0 24 24" aria-hidden="true" data-v-3e78e101><path d="M20 6H4M20 12H9M20 18H4" data-v-3e78e101></path></svg><span class="sheet-btn-t" data-v-3e78e101>${ssrInterpolate(_ctx.$t("townView.k17dkhgd112"))}</span></button></div></header><div class="app" data-v-3e78e101><aside id="town-rail-left" class="${ssrRenderClass([{ "sheet-open": unref(sheetOpen) === "left" }, "rail rail-left"])}" data-v-3e78e101><div class="sheet-hd" data-v-3e78e101><span class="sheet-grip" aria-hidden="true" data-v-3e78e101></span><span class="sheet-hd-t" data-v-3e78e101>${ssrInterpolate(_ctx.$t("townView.k1k75lzy030"))}</span><button type="button" class="sheet-x" aria-label="关闭" data-v-3e78e101> ✕ </button></div><section class="panel" data-v-3e78e101><div class="panel-hd" data-v-3e78e101><h3 data-v-3e78e101>${ssrInterpolate(_ctx.$t("townView.k1k75lzy030"))}</h3><span class="panel-tag" data-v-3e78e101>${ssrInterpolate(unref(deviceModels).length)}</span></div>`);
2330
2380
  _push(ssrRenderComponent(_component_WorkshopAssetLibrary, { class: "lib-embed" }, null, _parent));
2331
- _push(`</section><section class="panel" data-v-5660e131><div class="panel-hd" data-v-5660e131><h3 data-v-5660e131>${ssrInterpolate(_ctx.$t("townView.k2gwyas031"))}</h3><span class="panel-tag" data-v-5660e131>${ssrInterpolate(unref(daqTwins).length)}</span></div><div class="daq-ctrl" data-v-5660e131><button class="${ssrRenderClass([{ on: unref(daq).controller.running }, "daq-ctl-btn"])}"${ssrRenderAttr("title", unref(daq).controller.running ? "暂停全部采集:停止所有启用节点的采样(节点级启停独立)" : "恢复全部采集:仅启用节点恢复采集(手动停用的保持停用)")} data-v-5660e131>${ssrInterpolate(unref(daq).controller.running ? _ctx.$t("townView.k3w3j8f140") : _ctx.$t("townView.k3n93ed175"))}</button><label class="daq-ctl-cycle mono"${ssrRenderAttr("title", _ctx.$t("townView.khzlyf5004"))} data-v-5660e131>${ssrInterpolate(_ctx.$t("townView.k3xg3w032"))} <input type="number" min="200" max="60000" step="100"${ssrRenderAttr("value", unref(daq).controller.defaultIntervalMs)} data-v-5660e131>ms </label></div><div class="daq-list" data-v-5660e131><!--[-->`);
2381
+ _push(`</section><section class="panel" data-v-3e78e101><div class="panel-hd" data-v-3e78e101><h3 data-v-3e78e101>${ssrInterpolate(_ctx.$t("townView.k2gwyas031"))}</h3><span class="panel-tag" data-v-3e78e101>${ssrInterpolate(unref(daqTwins).length)}</span></div><div class="daq-ctrl" data-v-3e78e101><button class="${ssrRenderClass([{ on: unref(daq).controller.running }, "daq-ctl-btn"])}"${ssrRenderAttr("title", unref(daq).controller.running ? "暂停全部采集:停止所有启用节点的采样(节点级启停独立)" : "恢复全部采集:仅启用节点恢复采集(手动停用的保持停用)")} data-v-3e78e101>${ssrInterpolate(unref(daq).controller.running ? _ctx.$t("townView.k3w3j8f140") : _ctx.$t("townView.k3n93ed175"))}</button><label class="daq-ctl-cycle mono"${ssrRenderAttr("title", _ctx.$t("townView.khzlyf5004"))} data-v-3e78e101>${ssrInterpolate(_ctx.$t("townView.k3xg3w032"))} <input type="number" min="200" max="60000" step="100"${ssrRenderAttr("value", unref(daq).controller.defaultIntervalMs)} data-v-3e78e101>ms </label></div><div class="daq-list" data-v-3e78e101><!--[-->`);
2332
2382
  ssrRenderList(unref(daqTemplates), (tpl) => {
2333
- _push(`<div class="daq-group" data-v-5660e131><div class="${ssrRenderClass([{ open: !!unref(treeOpen)[`daq:${tpl.id}`] }, "daq-card tpl"])}" role="button" tabindex="0"${ssrRenderAttr("title", _ctx.$t("townView.k2tplxp0001", {
2383
+ _push(`<div class="daq-group" data-v-3e78e101><div class="${ssrRenderClass([{ open: !!unref(treeOpen)[`daq:${tpl.id}`] }, "daq-card tpl"])}" role="button" tabindex="0"${ssrRenderAttr("title", _ctx.$t("townView.k2tplxp0001", {
2334
2384
  p0: tpl.name,
2335
2385
  p1: tpl.ch,
2336
2386
  p2: tpl.min,
2337
2387
  p3: tpl.max,
2338
2388
  p4: tpl.unit
2339
- }))} data-v-5660e131><span class="daq-caret" data-v-5660e131>▶</span><span class="daq-ico" data-v-5660e131><svg class="daq-svg" viewBox="0 0 24 24" data-v-5660e131>${daqIcon(tpl.icon) ?? ""}</svg></span><div class="daq-meta" data-v-5660e131><span class="daq-name" data-v-5660e131>${ssrInterpolate(tpl.name)}</span><span class="daq-code" data-v-5660e131>${ssrInterpolate(tpl.code)}</span></div>`);
2340
- if (unref(mode) === "edit") _push(`<button class="daq-add"${ssrRenderAttr("title", _ctx.$t("townView.k2tplxp0002", { p0: tpl.name }))} data-v-5660e131> + </button>`);
2389
+ }))} data-v-3e78e101><span class="daq-caret" data-v-3e78e101>▶</span><span class="daq-ico" data-v-3e78e101>`);
2390
+ _push(ssrRenderComponent(_component_WorkshopDaqTemplateIcon, {
2391
+ class: "daq-svg",
2392
+ icon: tpl.icon
2393
+ }, null, _parent));
2394
+ _push(`</span><div class="daq-meta" data-v-3e78e101><span class="daq-name" data-v-3e78e101>${ssrInterpolate(tpl.name)}</span><span class="daq-code" data-v-3e78e101>${ssrInterpolate(tpl.code)}</span></div>`);
2395
+ if (unref(mode) === "edit") _push(`<button class="daq-add"${ssrRenderAttr("title", _ctx.$t("townView.k2tplxp0002", { p0: tpl.name }))} data-v-3e78e101> + </button>`);
2341
2396
  else _push(`<!---->`);
2342
- _push(`<span class="daq-count" data-v-5660e131>×${ssrInterpolate(unref(daqNodesByTpl).get(tpl.id)?.length ?? 0)}</span></div>`);
2397
+ _push(`<span class="daq-count" data-v-3e78e101>×${ssrInterpolate(unref(daqNodesByTpl).get(tpl.id)?.length ?? 0)}</span></div>`);
2343
2398
  if (unref(treeOpen)[`daq:${tpl.id}`]) {
2344
- _push(`<div class="daq-children" data-v-5660e131><!--[-->`);
2399
+ _push(`<div class="daq-children" data-v-3e78e101><!--[-->`);
2345
2400
  ssrRenderList(unref(daqNodesByTpl).get(tpl.id) ?? [], (n) => {
2346
- _push(`<div class="${ssrRenderClass([{ placed: typeof n.posX === "number" }, "daq-node"])}"${ssrRenderAttr("draggable", unref(mode) === "edit")}${ssrRenderAttr("title", typeof n.posX === "number" ? _ctx.$t("townView.k2tplxp0005") : _ctx.$t("townView.k2tplxp0006"))} data-v-5660e131><span class="${ssrRenderClass([daqLeafState(n), "node-dot"])}" data-v-5660e131></span><div class="daq-meta" data-v-5660e131><span class="daq-name" data-v-5660e131>${ssrInterpolate(n.name)}</span><span class="daq-node-sub" data-v-5660e131><span class="node-val mono" data-v-5660e131>${ssrInterpolate(n.value != null ? `${n.value.toFixed(tpl.decimals)} ${tpl.unit}` : "--")}</span><span class="node-dev" data-v-5660e131>${ssrInterpolate(n.deviceBindingId ? unref(deviceTwins).byId(n.deviceBindingId)?.name ?? _ctx.$t("townView.k3own4q148") : _ctx.$t("townView.k3own4q148"))}</span></span></div>`);
2347
- if (typeof n.posX === "number") _push(`<span class="scene-cur" data-v-5660e131>✓</span>`);
2401
+ _push(`<div class="${ssrRenderClass([{ placed: typeof n.posX === "number" }, "daq-node"])}"${ssrRenderAttr("draggable", unref(mode) === "edit")}${ssrRenderAttr("title", typeof n.posX === "number" ? _ctx.$t("townView.k2tplxp0005") : _ctx.$t("townView.k2tplxp0006"))} data-v-3e78e101><span class="${ssrRenderClass([daqLeafState(n), "node-dot"])}" data-v-3e78e101></span><div class="daq-meta" data-v-3e78e101><span class="daq-name" data-v-3e78e101>${ssrInterpolate(n.name)}</span><span class="daq-node-sub" data-v-3e78e101><span class="node-val mono" data-v-3e78e101>${ssrInterpolate(n.value != null ? `${n.value.toFixed(tpl.decimals)} ${tpl.unit}` : "--")}</span><span class="node-dev" data-v-3e78e101>${ssrInterpolate(n.deviceBindingId ? unref(deviceTwins).byId(n.deviceBindingId)?.name ?? _ctx.$t("townView.k3own4q148") : _ctx.$t("townView.k3own4q148"))}</span></span></div>`);
2402
+ if (typeof n.posX === "number") _push(`<span class="scene-cur" data-v-3e78e101>✓</span>`);
2348
2403
  else _push(`<!---->`);
2349
2404
  _push(`</div>`);
2350
2405
  });
2351
2406
  _push(`<!--]-->`);
2352
- if (!unref(daqNodesByTpl).get(tpl.id)?.length) _push(`<div class="daq-empty-hint" data-v-5660e131>${ssrInterpolate(_ctx.$t("townView.k2tplxp0003"))}</div>`);
2407
+ if (!unref(daqNodesByTpl).get(tpl.id)?.length) _push(`<div class="daq-empty-hint" data-v-3e78e101>${ssrInterpolate(_ctx.$t("townView.k2tplxp0003"))}</div>`);
2353
2408
  else _push(`<!---->`);
2354
2409
  _push(`</div>`);
2355
2410
  } else _push(`<!---->`);
2356
2411
  _push(`</div>`);
2357
2412
  });
2358
- _push(`<!--]--></div></section><section class="panel" data-v-5660e131><div class="panel-hd" data-v-5660e131><h3 data-v-5660e131>${ssrInterpolate(_ctx.$t("townView.km7ayhi033"))}</h3><span class="panel-tag" data-v-5660e131>${ssrInterpolate(unref(dcw).nodes.length)}</span></div><div class="daq-list" data-v-5660e131><!--[-->`);
2413
+ _push(`<!--]--></div></section><section class="panel" data-v-3e78e101><div class="panel-hd" data-v-3e78e101><h3 data-v-3e78e101>${ssrInterpolate(_ctx.$t("townView.km7ayhi033"))}</h3><span class="panel-tag" data-v-3e78e101>${ssrInterpolate(unref(dcw).nodes.length)}</span></div><div class="daq-list" data-v-3e78e101><!--[-->`);
2359
2414
  ssrRenderList(unref(dcwTemplates), (tpl) => {
2360
- _push(`<div class="daq-group" data-v-5660e131><div class="${ssrRenderClass([{ open: !!unref(treeOpen)[`dcw:${tpl.id}`] }, "daq-card tpl"])}" role="button" tabindex="0"${ssrRenderAttr("title", _ctx.$t("townView.k2tplxp0001", {
2415
+ _push(`<div class="daq-group" data-v-3e78e101><div class="${ssrRenderClass([{ open: !!unref(treeOpen)[`dcw:${tpl.id}`] }, "daq-card tpl"])}" role="button" tabindex="0"${ssrRenderAttr("title", _ctx.$t("townView.k2tplxp0001", {
2361
2416
  p0: tpl.name,
2362
2417
  p1: tpl.ch,
2363
2418
  p2: tpl.min,
2364
2419
  p3: tpl.max,
2365
2420
  p4: tpl.unit
2366
- }))} data-v-5660e131><span class="daq-caret" data-v-5660e131>▶</span><span class="daq-ico" data-v-5660e131><svg class="daq-svg" viewBox="0 0 24 24" data-v-5660e131>${daqIcon(tpl.icon) ?? ""}</svg></span><div class="daq-meta" data-v-5660e131><span class="daq-name" data-v-5660e131>${ssrInterpolate(tpl.name)}</span><span class="daq-code" data-v-5660e131>${ssrInterpolate(tpl.code)}</span></div>`);
2367
- if (unref(mode) === "edit") _push(`<button class="daq-add"${ssrRenderAttr("title", _ctx.$t("townView.k2tplxp0002", { p0: tpl.name }))} data-v-5660e131> + </button>`);
2421
+ }))} data-v-3e78e101><span class="daq-caret" data-v-3e78e101>▶</span><span class="daq-ico" data-v-3e78e101>`);
2422
+ _push(ssrRenderComponent(_component_WorkshopDaqTemplateIcon, {
2423
+ class: "daq-svg",
2424
+ icon: tpl.icon
2425
+ }, null, _parent));
2426
+ _push(`</span><div class="daq-meta" data-v-3e78e101><span class="daq-name" data-v-3e78e101>${ssrInterpolate(tpl.name)}</span><span class="daq-code" data-v-3e78e101>${ssrInterpolate(tpl.code)}</span></div>`);
2427
+ if (unref(mode) === "edit") _push(`<button class="daq-add"${ssrRenderAttr("title", _ctx.$t("townView.k2tplxp0002", { p0: tpl.name }))} data-v-3e78e101> + </button>`);
2368
2428
  else _push(`<!---->`);
2369
- _push(`<span class="daq-count" data-v-5660e131>×${ssrInterpolate(unref(dcwNodesByTpl).get(tpl.id)?.length ?? 0)}</span></div>`);
2429
+ _push(`<span class="daq-count" data-v-3e78e101>×${ssrInterpolate(unref(dcwNodesByTpl).get(tpl.id)?.length ?? 0)}</span></div>`);
2370
2430
  if (unref(treeOpen)[`dcw:${tpl.id}`]) {
2371
- _push(`<div class="daq-children" data-v-5660e131><!--[-->`);
2431
+ _push(`<div class="daq-children" data-v-3e78e101><!--[-->`);
2372
2432
  ssrRenderList(unref(dcwNodesByTpl).get(tpl.id) ?? [], (n) => {
2373
- _push(`<div class="${ssrRenderClass([{ placed: typeof n.posX === "number" }, "daq-node"])}"${ssrRenderAttr("draggable", unref(mode) === "edit")}${ssrRenderAttr("title", typeof n.posX === "number" ? _ctx.$t("townView.k2tplxp0005") : _ctx.$t("townView.k2tplxp0006"))} data-v-5660e131><span class="${ssrRenderClass([dcwLeafState(n), "node-dot"])}" data-v-5660e131></span><div class="daq-meta" data-v-5660e131><span class="daq-name" data-v-5660e131>${ssrInterpolate(n.name)}</span><span class="daq-node-sub" data-v-5660e131><span class="node-val mono" data-v-5660e131>${ssrInterpolate(n.value != null ? `${n.value.toFixed(tpl.decimals)} ${tpl.unit}` : "--")}</span><span class="node-dev" data-v-5660e131>${ssrInterpolate(n.deviceBindingId ? unref(deviceTwins).byId(n.deviceBindingId)?.name ?? _ctx.$t("townView.k3own4q148") : _ctx.$t("townView.k3own4q148"))}</span></span></div>`);
2374
- if (typeof n.posX === "number") _push(`<span class="scene-cur" data-v-5660e131>✓</span>`);
2433
+ _push(`<div class="${ssrRenderClass([{ placed: typeof n.posX === "number" }, "daq-node"])}"${ssrRenderAttr("draggable", unref(mode) === "edit")}${ssrRenderAttr("title", typeof n.posX === "number" ? _ctx.$t("townView.k2tplxp0005") : _ctx.$t("townView.k2tplxp0006"))} data-v-3e78e101><span class="${ssrRenderClass([dcwLeafState(n), "node-dot"])}" data-v-3e78e101></span><div class="daq-meta" data-v-3e78e101><span class="daq-name" data-v-3e78e101>${ssrInterpolate(n.name)}</span><span class="daq-node-sub" data-v-3e78e101><span class="node-val mono" data-v-3e78e101>${ssrInterpolate(n.value != null ? `${n.value.toFixed(tpl.decimals)} ${tpl.unit}` : "--")}</span><span class="node-dev" data-v-3e78e101>${ssrInterpolate(n.deviceBindingId ? unref(deviceTwins).byId(n.deviceBindingId)?.name ?? _ctx.$t("townView.k3own4q148") : _ctx.$t("townView.k3own4q148"))}</span></span></div>`);
2434
+ if (typeof n.posX === "number") _push(`<span class="scene-cur" data-v-3e78e101>✓</span>`);
2375
2435
  else _push(`<!---->`);
2376
2436
  _push(`</div>`);
2377
2437
  });
2378
2438
  _push(`<!--]-->`);
2379
- if (!unref(dcwNodesByTpl).get(tpl.id)?.length) _push(`<div class="daq-empty-hint" data-v-5660e131>${ssrInterpolate(_ctx.$t("townView.k2tplxp0003"))}</div>`);
2439
+ if (!unref(dcwNodesByTpl).get(tpl.id)?.length) _push(`<div class="daq-empty-hint" data-v-3e78e101>${ssrInterpolate(_ctx.$t("townView.k2tplxp0003"))}</div>`);
2380
2440
  else _push(`<!---->`);
2381
2441
  _push(`</div>`);
2382
2442
  } else _push(`<!---->`);
2383
2443
  _push(`</div>`);
2384
2444
  });
2385
- _push(`<!--]--></div></section><section class="panel" data-v-5660e131><div class="panel-hd" data-v-5660e131><h3 data-v-5660e131>${ssrInterpolate(_ctx.$t("townView.k1c9n911034"))}</h3><span class="panel-tag" data-v-5660e131>${ssrInterpolate(unref(dockChannels).length)}</span></div><div class="scene-list" data-v-5660e131><!--[-->`);
2445
+ _push(`<!--]--></div></section><section class="panel" data-v-3e78e101><div class="panel-hd" data-v-3e78e101><h3 data-v-3e78e101>${ssrInterpolate(_ctx.$t("townView.k1c9n911034"))}</h3><span class="panel-tag" data-v-3e78e101>${ssrInterpolate(unref(dockChannels).length)}</span></div><div class="scene-list" data-v-3e78e101><!--[-->`);
2386
2446
  ssrRenderList(unref(dockChannels), (ch) => {
2387
- _push(`<div class="${ssrRenderClass([{ active: ch.placed }, "scene-row"])}"${ssrRenderAttr("draggable", !ch.placed && unref(mode) === "edit")}${ssrRenderAttr("data-channel-id", ch.channelId)}${ssrRenderAttr("title", ch.placed ? "已在场景中,点击定位" : "拖拽到场景放置")} data-v-5660e131><span class="scene-ico" style="${ssrRenderStyle({ "--ch": ch.color })}" data-v-5660e131></span><div class="scene-meta-wrap" data-v-5660e131><span class="scene-name" data-v-5660e131>${ssrInterpolate(ch.name)}</span><span class="scene-meta" data-v-5660e131>${ssrInterpolate(ch.agentCount)} ${ssrInterpolate(_ctx.$t("townView.k1brss7t128"))} ${ssrInterpolate(ch.placed ? _ctx.$t("townView.k3n94g3141") : _ctx.$t("townView.k3os7i3176"))}</span></div>`);
2388
- if (ch.placed) _push(`<span class="scene-cur" data-v-5660e131>✓</span>`);
2389
- else _push(`<span class="scene-add" data-v-5660e131>+</span>`);
2447
+ _push(`<div class="${ssrRenderClass([{ active: ch.placed }, "scene-row"])}"${ssrRenderAttr("draggable", !ch.placed && unref(mode) === "edit")}${ssrRenderAttr("data-channel-id", ch.channelId)}${ssrRenderAttr("title", ch.placed ? "已在场景中,点击定位" : "拖拽到场景放置")} data-v-3e78e101><span class="scene-ico" style="${ssrRenderStyle({ "--ch": ch.color })}" data-v-3e78e101></span><div class="scene-meta-wrap" data-v-3e78e101><span class="scene-name" data-v-3e78e101>${ssrInterpolate(ch.name)}</span><span class="scene-meta" data-v-3e78e101>${ssrInterpolate(ch.agentCount)} ${ssrInterpolate(_ctx.$t("townView.k1brss7t128"))} ${ssrInterpolate(ch.placed ? _ctx.$t("townView.k3n94g3141") : _ctx.$t("townView.k3os7i3176"))}</span></div>`);
2448
+ if (ch.placed) _push(`<span class="scene-cur" data-v-3e78e101>✓</span>`);
2449
+ else _push(`<span class="scene-add" data-v-3e78e101>+</span>`);
2390
2450
  _push(`</div>`);
2391
2451
  });
2392
2452
  _push(`<!--]-->`);
2393
- if (unref(dockHint)) _push(`<div class="scene-hint" data-v-5660e131>${ssrInterpolate(unref(dockHint))}</div>`);
2453
+ if (unref(dockHint)) _push(`<div class="scene-hint" data-v-3e78e101>${ssrInterpolate(unref(dockHint))}</div>`);
2394
2454
  else _push(`<!---->`);
2395
- _push(`</div></section></aside><main class="stage-col" data-v-5660e131><div class="stage" data-v-5660e131><div id="town-host" class="town-host" data-v-5660e131></div><div class="stage-vignette" data-v-5660e131></div><div class="stage-top" data-v-5660e131><div class="vp-title" data-v-5660e131><h2 data-v-5660e131>${ssrInterpolate(_ctx.$t("townView.k1b0z4vr035"))}</h2><span class="vp-id" data-v-5660e131>CH · ${ssrInterpolate(unref(activeChannelName) || _ctx.$t("townView.k3lkuz3142"))}</span></div><div class="vp-tools" data-v-5660e131><button class="vp-tool"${ssrRenderAttr("title", _ctx.$t("townView.k18d6wnb005"))} data-v-5660e131><svg class="vp-svg" viewBox="0 0 24 24" data-v-5660e131><circle cx="12" cy="12" r="7" data-v-5660e131></circle><path d="M12 2v4M12 18v4M2 12h4M18 12h4" data-v-5660e131></path></svg></button><button class="${ssrRenderClass([{ on: unref(orbitOn) }, "vp-tool"])}"${ssrRenderAttr("title", _ctx.$t("townView.k1io51dn006"))} data-v-5660e131><svg class="vp-svg" viewBox="0 0 24 24" data-v-5660e131><circle cx="12" cy="12" r="3.2" data-v-5660e131></circle><path d="M20.5 9a10 10 0 0 1 .3 4.5M3.5 15a10 10 0 0 1-.3-4.5" data-v-5660e131></path></svg></button><button class="${ssrRenderClass([{ on: unref(showCallouts) }, "vp-tool"])}"${ssrRenderAttr("title", _ctx.$t("townView.k1sgjlq8007"))} data-v-5660e131><svg class="vp-svg" viewBox="0 0 24 24" data-v-5660e131><path d="M4 8h12l4 4-4 4H4z" data-v-5660e131></path><circle cx="8.5" cy="12" r="1.4" data-v-5660e131></circle></svg></button><button class="vp-tool"${ssrRenderAttr("title", _ctx.$t("townView.k3wuf0008"))} data-v-5660e131><svg class="vp-svg" viewBox="0 0 24 24" data-v-5660e131><path d="M4 9V4h5M20 9V4h-5M4 15v5h5M20 15v5h-5" data-v-5660e131></path></svg></button></div></div><div class="angle-chip" data-v-5660e131><select${ssrRenderAttr("value", unref(viewPreset))}${ssrRenderAttr("aria-label", _ctx.$t("townView.k1k4j5i7009"))} data-v-5660e131><option value="std" data-v-5660e131>${ssrInterpolate(_ctx.$t("townView.kv72860036"))}</option><option value="top" data-v-5660e131> 俯视 · TOP </option><option value="front" data-v-5660e131> 前视 · FRONT </option><option value="side" data-v-5660e131> 侧视 · SIDE </option></select></div>`);
2455
+ _push(`</div></section></aside><main class="stage-col" data-v-3e78e101><div class="stage" data-v-3e78e101><div id="town-host" class="town-host" data-v-3e78e101></div><div class="stage-vignette" data-v-3e78e101></div><div class="stage-top" data-v-3e78e101><div class="vp-title" data-v-3e78e101><h2 data-v-3e78e101>${ssrInterpolate(_ctx.$t("townView.k1b0z4vr035"))}</h2><span class="vp-id" data-v-3e78e101>CH · ${ssrInterpolate(unref(activeChannelName) || _ctx.$t("townView.k3lkuz3142"))}</span></div><div class="vp-tools" data-v-3e78e101><button class="vp-tool"${ssrRenderAttr("title", _ctx.$t("townView.k18d6wnb005"))} data-v-3e78e101><svg class="vp-svg" viewBox="0 0 24 24" data-v-3e78e101><circle cx="12" cy="12" r="7" data-v-3e78e101></circle><path d="M12 2v4M12 18v4M2 12h4M18 12h4" data-v-3e78e101></path></svg></button><button class="${ssrRenderClass([{ on: unref(orbitOn) }, "vp-tool"])}"${ssrRenderAttr("title", _ctx.$t("townView.k1io51dn006"))} data-v-3e78e101><svg class="vp-svg" viewBox="0 0 24 24" data-v-3e78e101><circle cx="12" cy="12" r="3.2" data-v-3e78e101></circle><path d="M20.5 9a10 10 0 0 1 .3 4.5M3.5 15a10 10 0 0 1-.3-4.5" data-v-3e78e101></path></svg></button><button class="${ssrRenderClass([{ on: unref(showCallouts) }, "vp-tool"])}"${ssrRenderAttr("title", _ctx.$t("townView.k1sgjlq8007"))} data-v-3e78e101><svg class="vp-svg" viewBox="0 0 24 24" data-v-3e78e101><path d="M4 8h12l4 4-4 4H4z" data-v-3e78e101></path><circle cx="8.5" cy="12" r="1.4" data-v-3e78e101></circle></svg></button><button class="vp-tool"${ssrRenderAttr("title", _ctx.$t("townView.k3wuf0008"))} data-v-3e78e101><svg class="vp-svg" viewBox="0 0 24 24" data-v-3e78e101><path d="M4 9V4h5M20 9V4h-5M4 15v5h5M20 15v5h-5" data-v-3e78e101></path></svg></button></div></div><div class="angle-chip" data-v-3e78e101><select${ssrRenderAttr("value", unref(viewPreset))}${ssrRenderAttr("aria-label", _ctx.$t("townView.k1k4j5i7009"))} data-v-3e78e101><option value="std" data-v-3e78e101>${ssrInterpolate(_ctx.$t("townView.kv72860036"))}</option><option value="top" data-v-3e78e101> 俯视 · TOP </option><option value="front" data-v-3e78e101> 前视 · FRONT </option><option value="side" data-v-3e78e101> 侧视 · SIDE </option></select></div>`);
2396
2456
  if (unref(showCallouts)) {
2397
- _push(`<!--[--><svg class="leaders" data-v-5660e131><!--[-->`);
2457
+ _push(`<!--[--><svg class="leaders" data-v-3e78e101><!--[-->`);
2398
2458
  ssrRenderList(unref(callouts), (c) => {
2399
- _push(`<g class="${ssrRenderClass({ near: c.near })}" style="${ssrRenderStyle(c.leader ? null : { display: "none" })}" data-v-5660e131><path${ssrRenderAttr("d", `M ${c.x} ${c.y - 8} L ${c.x} ${c.y - 2}`)}${ssrRenderAttr("stroke", c.warn ? "rgba(246,196,83,.8)" : "rgba(65,200,244,.55)")} stroke-width="1.3" fill="none" data-v-5660e131></path><circle${ssrRenderAttr("cx", c.x)}${ssrRenderAttr("cy", c.y)} r="2.6"${ssrRenderAttr("fill", c.warn ? "#f6c453" : "#41c8f4")} data-v-5660e131></circle></g>`);
2459
+ _push(`<g class="${ssrRenderClass({ near: c.near })}" style="${ssrRenderStyle(c.leader ? null : { display: "none" })}" data-v-3e78e101><path${ssrRenderAttr("d", `M ${c.x} ${c.y - 8} L ${c.x} ${c.y - 2}`)}${ssrRenderAttr("stroke", c.warn ? "rgba(246,196,83,.8)" : "rgba(65,200,244,.55)")} stroke-width="1.3" fill="none" data-v-3e78e101></path><circle${ssrRenderAttr("cx", c.x)}${ssrRenderAttr("cy", c.y)} r="2.6"${ssrRenderAttr("fill", c.warn ? "#f6c453" : "#41c8f4")} data-v-3e78e101></circle></g>`);
2400
2460
  });
2401
- _push(`<!--]--></svg><div class="callout-layer" data-v-5660e131><!--[-->`);
2461
+ _push(`<!--]--></svg><div class="callout-layer" data-v-3e78e101><!--[-->`);
2402
2462
  ssrRenderList(unref(callouts), (c) => {
2403
2463
  _push(`<div class="${ssrRenderClass([{
2404
2464
  warn: c.warn,
@@ -2406,12 +2466,12 @@ var TownView_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineC
2406
2466
  }, "callout"])}" style="${ssrRenderStyle({
2407
2467
  left: c.x + "px",
2408
2468
  top: c.y + "px"
2409
- })}"${ssrRenderAttr("title", _ctx.$t("townView.k1ejxiwp010"))} data-v-5660e131><div class="co-label" data-v-5660e131><span class="co-dot" data-v-5660e131></span>${ssrInterpolate(c.label)}</div><div class="co-val" data-v-5660e131>${ssrInterpolate(c.value)}<small data-v-5660e131>${ssrInterpolate(c.unit)}</small></div><div class="co-range" data-v-5660e131>${ssrInterpolate(_ctx.$t("townView.k1faqmjb073"))} ${ssrInterpolate(c.lo.toFixed(Math.min(2, (String(c.lo).split(".")[1] ?? "").length + 1)))} – ${ssrInterpolate(c.hi.toFixed(Math.min(2, (String(c.hi).split(".")[1] ?? "").length + 1)))}</div></div>`);
2469
+ })}"${ssrRenderAttr("title", _ctx.$t("townView.k1ejxiwp010"))} data-v-3e78e101><div class="co-label" data-v-3e78e101><span class="co-dot" data-v-3e78e101></span>${ssrInterpolate(c.label)}</div><div class="co-val" data-v-3e78e101>${ssrInterpolate(c.value)}<small data-v-3e78e101>${ssrInterpolate(c.unit)}</small></div><div class="co-range" data-v-3e78e101>${ssrInterpolate(_ctx.$t("townView.k1faqmjb073"))} ${ssrInterpolate(c.lo.toFixed(Math.min(2, (String(c.lo).split(".")[1] ?? "").length + 1)))} – ${ssrInterpolate(c.hi.toFixed(Math.min(2, (String(c.hi).split(".")[1] ?? "").length + 1)))}</div></div>`);
2410
2470
  });
2411
2471
  _push(`<!--]--></div><!--]-->`);
2412
2472
  } else _push(`<!---->`);
2413
- _push(`<div class="kpi-strip" data-v-5660e131><div class="kpi" data-v-5660e131><span class="kpi-ico c1" data-v-5660e131><svg class="kpi-svg" viewBox="0 0 24 24" data-v-5660e131><path d="M4 8.5 12 4l8 4.5v7L12 20l-8-4.5v-7Z" data-v-5660e131></path><path d="M4 8.5l8 4.5 8-4.5M12 13v7" data-v-5660e131></path></svg></span><div class="kpi-meta" data-v-5660e131><div class="kpi-label" data-v-5660e131>${ssrInterpolate(_ctx.$t("townView.k1k6xemt037"))}</div><div class="kpi-val" data-v-5660e131>${ssrInterpolate(unref(deviceCount))}<small data-v-5660e131>${ssrInterpolate(_ctx.$t("townView.k49lh038"))}</small></div></div></div><div class="kpi" data-v-5660e131><span class="kpi-ico c2" data-v-5660e131><svg class="kpi-svg" viewBox="0 0 24 24" data-v-5660e131><path d="m5 12.5 4.5 4.5L19 7.5" data-v-5660e131></path></svg></span><div class="kpi-meta" data-v-5660e131><div class="kpi-label" data-v-5660e131>${ssrInterpolate(_ctx.$t("townView.k1l1a9t2039"))}</div><div class="kpi-val" data-v-5660e131>${ssrInterpolate(unref(runningCount))}<small data-v-5660e131>${ssrInterpolate(_ctx.$t("townView.k49lh038"))}</small></div></div></div><div class="kpi" data-v-5660e131><span class="kpi-ico c3" data-v-5660e131><svg class="kpi-svg" viewBox="0 0 24 24" data-v-5660e131><path d="M12 3 22 20H2L12 3Z" data-v-5660e131></path><path d="M12 10v4M12 17v.2" data-v-5660e131></path></svg></span><div class="kpi-meta" data-v-5660e131><div class="kpi-label" data-v-5660e131>${ssrInterpolate(_ctx.$t("townView.k1fsi3ir002"))}</div><div class="kpi-val" data-v-5660e131>${ssrInterpolate(unref(activeAlarmCount))}<small data-v-5660e131>${ssrInterpolate(_ctx.$t("townView.k4dfq040"))}</small></div></div></div><div class="kpi" data-v-5660e131><span class="kpi-ico c4" data-v-5660e131><svg class="kpi-svg" viewBox="0 0 24 24" data-v-5660e131><path d="M9.5 14.5 14.5 9.5" data-v-5660e131></path><path d="M11 6.5 12.8 4.7a4 4 0 0 1 5.6 5.6L16.5 12" data-v-5660e131></path><path d="m13 17.5-1.8 1.8a4 4 0 0 1-5.6-5.6L7.5 12" data-v-5660e131></path></svg></span><div class="kpi-meta" data-v-5660e131><div class="kpi-label" data-v-5660e131>${ssrInterpolate(_ctx.$t("townView.k1emsai1041"))}</div><div class="kpi-val" data-v-5660e131>${ssrInterpolate(unref(daqTwins).length)}<small data-v-5660e131>${ssrInterpolate(_ctx.$t("townView.k4l1w042"))}</small></div></div></div><div class="kpi" data-v-5660e131><span class="kpi-ico c5" data-v-5660e131><svg class="kpi-svg" viewBox="0 0 24 24" data-v-5660e131><path d="M5 19a9 9 0 1 1 14 0" data-v-5660e131></path><path d="M12 13l3.5-3.5" data-v-5660e131></path><circle cx="12" cy="13" r="1.4" data-v-5660e131></circle></svg></span><div class="kpi-meta" data-v-5660e131><div class="kpi-label" data-v-5660e131>${ssrInterpolate(_ctx.$t("townView.kbrxdq1043"))}</div><div class="kpi-val" data-v-5660e131>${ssrInterpolate(unref(healthPct))}<small data-v-5660e131>%</small></div></div></div></div>`);
2414
- if (unref(sceneEmpty)) _push(`<div class="empty-hint" data-v-5660e131><b data-v-5660e131>${ssrInterpolate(_ctx.$t("townView.k3rwxjc044"))}</b><span data-v-5660e131>${ssrInterpolate(_ctx.$t("townView.k1sa1eaj045"))}</span></div>`);
2473
+ _push(`<div class="kpi-strip" data-v-3e78e101><div class="kpi" data-v-3e78e101><span class="kpi-ico c1" data-v-3e78e101><svg class="kpi-svg" viewBox="0 0 24 24" data-v-3e78e101><path d="M4 8.5 12 4l8 4.5v7L12 20l-8-4.5v-7Z" data-v-3e78e101></path><path d="M4 8.5l8 4.5 8-4.5M12 13v7" data-v-3e78e101></path></svg></span><div class="kpi-meta" data-v-3e78e101><div class="kpi-label" data-v-3e78e101>${ssrInterpolate(_ctx.$t("townView.k1k6xemt037"))}</div><div class="kpi-val" data-v-3e78e101>${ssrInterpolate(unref(deviceCount))}<small data-v-3e78e101>${ssrInterpolate(_ctx.$t("townView.k49lh038"))}</small></div></div></div><div class="kpi" data-v-3e78e101><span class="kpi-ico c2" data-v-3e78e101><svg class="kpi-svg" viewBox="0 0 24 24" data-v-3e78e101><path d="m5 12.5 4.5 4.5L19 7.5" data-v-3e78e101></path></svg></span><div class="kpi-meta" data-v-3e78e101><div class="kpi-label" data-v-3e78e101>${ssrInterpolate(_ctx.$t("townView.k1l1a9t2039"))}</div><div class="kpi-val" data-v-3e78e101>${ssrInterpolate(unref(runningCount))}<small data-v-3e78e101>${ssrInterpolate(_ctx.$t("townView.k49lh038"))}</small></div></div></div><div class="kpi" data-v-3e78e101><span class="kpi-ico c3" data-v-3e78e101><svg class="kpi-svg" viewBox="0 0 24 24" data-v-3e78e101><path d="M12 3 22 20H2L12 3Z" data-v-3e78e101></path><path d="M12 10v4M12 17v.2" data-v-3e78e101></path></svg></span><div class="kpi-meta" data-v-3e78e101><div class="kpi-label" data-v-3e78e101>${ssrInterpolate(_ctx.$t("townView.k1fsi3ir002"))}</div><div class="kpi-val" data-v-3e78e101>${ssrInterpolate(unref(activeAlarmCount))}<small data-v-3e78e101>${ssrInterpolate(_ctx.$t("townView.k4dfq040"))}</small></div></div></div><div class="kpi" data-v-3e78e101><span class="kpi-ico c4" data-v-3e78e101><svg class="kpi-svg" viewBox="0 0 24 24" data-v-3e78e101><path d="M9.5 14.5 14.5 9.5" data-v-3e78e101></path><path d="M11 6.5 12.8 4.7a4 4 0 0 1 5.6 5.6L16.5 12" data-v-3e78e101></path><path d="m13 17.5-1.8 1.8a4 4 0 0 1-5.6-5.6L7.5 12" data-v-3e78e101></path></svg></span><div class="kpi-meta" data-v-3e78e101><div class="kpi-label" data-v-3e78e101>${ssrInterpolate(_ctx.$t("townView.k1emsai1041"))}</div><div class="kpi-val" data-v-3e78e101>${ssrInterpolate(unref(daqTwins).length)}<small data-v-3e78e101>${ssrInterpolate(_ctx.$t("townView.k4l1w042"))}</small></div></div></div><div class="kpi" data-v-3e78e101><span class="kpi-ico c5" data-v-3e78e101><svg class="kpi-svg" viewBox="0 0 24 24" data-v-3e78e101><path d="M5 19a9 9 0 1 1 14 0" data-v-3e78e101></path><path d="M12 13l3.5-3.5" data-v-3e78e101></path><circle cx="12" cy="13" r="1.4" data-v-3e78e101></circle></svg></span><div class="kpi-meta" data-v-3e78e101><div class="kpi-label" data-v-3e78e101>${ssrInterpolate(_ctx.$t("townView.kbrxdq1043"))}</div><div class="kpi-val" data-v-3e78e101>${ssrInterpolate(unref(healthPct))}<small data-v-3e78e101>%</small></div></div></div></div>`);
2474
+ if (unref(sceneEmpty)) _push(`<div class="empty-hint" data-v-3e78e101><b data-v-3e78e101>${ssrInterpolate(_ctx.$t("townView.k3rwxjc044"))}</b><span data-v-3e78e101>${ssrInterpolate(_ctx.$t("townView.k1sa1eaj045"))}</span></div>`);
2415
2475
  else _push(`<!---->`);
2416
2476
  if (unref(selectedChannel) && unref(boundaryDraft)) {
2417
2477
  _push(`<div class="boundary-panel drag-panel" style="${ssrRenderStyle(unref(panelPos).boundary ? {
@@ -2419,111 +2479,121 @@ var TownView_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineC
2419
2479
  top: unref(panelPos).boundary.y + "px",
2420
2480
  bottom: "auto",
2421
2481
  transform: "none"
2422
- } : void 0)}" data-v-5660e131><div class="bp-title drag-grip"${ssrRenderAttr("title", _ctx.$t("townView.k1d0rl5z011"))} data-v-5660e131><span class="bp-name" data-v-5660e131>${ssrInterpolate(unref(entities).channels[unref(selectedChannel)]?.name ?? unref(selectedChannel).slice(0, 8))}</span><span class="bp-sub" data-v-5660e131>${ssrInterpolate(_ctx.$t("townView.k1mehlxs046"))}</span><div class="bp-tabs" data-v-5660e131><button class="${ssrRenderClass([{ on: unref(channelPanelTab) === "boundary" }, "bp-tab"])}" data-v-5660e131>${ssrInterpolate(_ctx.$t("townView.k489ka047"))}</button><button class="${ssrRenderClass([{ on: unref(channelPanelTab) === "members" }, "bp-tab"])}" data-v-5660e131>${ssrInterpolate(_ctx.$t("townView.k3ztf1129"))} ${ssrInterpolate(unref(channelMembers).length)}</button></div></div>`);
2423
- if (unref(channelPanelTab) === "boundary") _push(`<!--[--><div class="bp-row" data-v-5660e131><span class="bp-label" data-v-5660e131>${ssrInterpolate(_ctx.$t("townView.k3zhy5048"))}</span><div class="bp-seg" data-v-5660e131><button class="${ssrRenderClass([{ on: unref(boundaryDraft).shape === "ellipse" }, "seg-btn"])}" data-v-5660e131>${ssrInterpolate(_ctx.$t("townView.k414bc049"))}</button><button class="${ssrRenderClass([{ on: unref(boundaryDraft).shape === "rect" }, "seg-btn"])}" data-v-5660e131>${ssrInterpolate(_ctx.$t("townView.k43u0g050"))}</button></div></div><div class="bp-row" data-v-5660e131><span class="bp-label" data-v-5660e131>${ssrInterpolate(_ctx.$t("townView.k1fbz4s1051"))}</span><input${ssrRenderAttr("value", unref(boundaryDraft).radiusX)} class="bp-range" type="range" min="80" max="4000" step="8" style="${ssrRenderStyle({ "--fill": sliderPct(unref(boundaryDraft).radiusX, 80, 4e3) })}" data-v-5660e131><span class="bp-val" data-v-5660e131>${ssrInterpolate(Math.round(unref(boundaryDraft).radiusX))}</span></div><div class="bp-row" data-v-5660e131><span class="bp-label" data-v-5660e131>${ssrInterpolate(_ctx.$t("townView.k1ighwgs052"))}</span><input${ssrRenderAttr("value", unref(boundaryDraft).radiusZ)} class="bp-range" type="range" min="60" max="4000" step="8" style="${ssrRenderStyle({ "--fill": sliderPct(unref(boundaryDraft).radiusZ, 60, 4e3) })}" data-v-5660e131><span class="bp-val" data-v-5660e131>${ssrInterpolate(Math.round(unref(boundaryDraft).radiusZ))}</span></div><div class="bp-row" data-v-5660e131><span class="bp-label" data-v-5660e131>${ssrInterpolate(_ctx.$t("townView.k40qab053"))}</span><input${ssrRenderAttr("value", unref(boundaryDraft).rotationY)} class="bp-range" type="range" min="0" max="360" step="5" style="${ssrRenderStyle({ "--fill": sliderPct(unref(boundaryDraft).rotationY ?? 0, 0, 360) })}" data-v-5660e131><span class="bp-val" data-v-5660e131>${ssrInterpolate(Math.round(unref(boundaryDraft).rotationY ?? 0))}°</span></div><!--]-->`);
2482
+ } : void 0)}" data-v-3e78e101><div class="bp-title drag-grip"${ssrRenderAttr("title", _ctx.$t("townView.k1d0rl5z011"))} data-v-3e78e101><span class="bp-name" data-v-3e78e101>${ssrInterpolate(unref(entities).channels[unref(selectedChannel)]?.name ?? unref(selectedChannel).slice(0, 8))}</span><span class="bp-sub" data-v-3e78e101>${ssrInterpolate(_ctx.$t("townView.k1mehlxs046"))}</span><div class="bp-tabs" data-v-3e78e101><button class="${ssrRenderClass([{ on: unref(channelPanelTab) === "boundary" }, "bp-tab"])}" data-v-3e78e101>${ssrInterpolate(_ctx.$t("townView.k489ka047"))}</button><button class="${ssrRenderClass([{ on: unref(channelPanelTab) === "members" }, "bp-tab"])}" data-v-3e78e101>${ssrInterpolate(_ctx.$t("townView.k3ztf1129"))} ${ssrInterpolate(unref(channelMembers).length)}</button></div></div>`);
2483
+ if (unref(channelPanelTab) === "boundary") _push(`<!--[--><div class="bp-row" data-v-3e78e101><span class="bp-label" data-v-3e78e101>${ssrInterpolate(_ctx.$t("townView.k3zhy5048"))}</span><div class="bp-seg" data-v-3e78e101><button class="${ssrRenderClass([{ on: unref(boundaryDraft).shape === "ellipse" }, "seg-btn"])}" data-v-3e78e101>${ssrInterpolate(_ctx.$t("townView.k414bc049"))}</button><button class="${ssrRenderClass([{ on: unref(boundaryDraft).shape === "rect" }, "seg-btn"])}" data-v-3e78e101>${ssrInterpolate(_ctx.$t("townView.k43u0g050"))}</button></div></div><div class="bp-row" data-v-3e78e101><span class="bp-label" data-v-3e78e101>${ssrInterpolate(_ctx.$t("townView.k1fbz4s1051"))}</span><input${ssrRenderAttr("value", unref(boundaryDraft).radiusX)} class="bp-range" type="range" min="80" max="4000" step="8" style="${ssrRenderStyle({ "--fill": sliderPct(unref(boundaryDraft).radiusX, 80, 4e3) })}" data-v-3e78e101><span class="bp-val" data-v-3e78e101>${ssrInterpolate(Math.round(unref(boundaryDraft).radiusX))}</span></div><div class="bp-row" data-v-3e78e101><span class="bp-label" data-v-3e78e101>${ssrInterpolate(_ctx.$t("townView.k1ighwgs052"))}</span><input${ssrRenderAttr("value", unref(boundaryDraft).radiusZ)} class="bp-range" type="range" min="60" max="4000" step="8" style="${ssrRenderStyle({ "--fill": sliderPct(unref(boundaryDraft).radiusZ, 60, 4e3) })}" data-v-3e78e101><span class="bp-val" data-v-3e78e101>${ssrInterpolate(Math.round(unref(boundaryDraft).radiusZ))}</span></div><div class="bp-row" data-v-3e78e101><span class="bp-label" data-v-3e78e101>${ssrInterpolate(_ctx.$t("townView.k40qab053"))}</span><input${ssrRenderAttr("value", unref(boundaryDraft).rotationY)} class="bp-range" type="range" min="0" max="360" step="5" style="${ssrRenderStyle({ "--fill": sliderPct(unref(boundaryDraft).rotationY ?? 0, 0, 360) })}" data-v-3e78e101><span class="bp-val" data-v-3e78e101>${ssrInterpolate(Math.round(unref(boundaryDraft).rotationY ?? 0))}°</span></div><!--]-->`);
2424
2484
  else {
2425
- _push(`<!--[--><div class="bp-hint" data-v-5660e131>${ssrInterpolate(_ctx.$t("townView.kimxls2054"))}</div><div class="member-list" data-v-5660e131><!--[-->`);
2485
+ _push(`<!--[--><div class="bp-hint" data-v-3e78e101>${ssrInterpolate(_ctx.$t("townView.kimxls2054"))}</div><div class="member-list" data-v-3e78e101><!--[-->`);
2426
2486
  ssrRenderList(unref(channelMembers), (m) => {
2427
- _push(`<div class="member-row" data-v-5660e131><span class="member-ava" style="${ssrRenderStyle({ color: hashColor(unref(selectedChannel)) })}" data-v-5660e131>${ssrInterpolate(m.name.charAt(0).toUpperCase())}</span><div class="member-info" data-v-5660e131><span class="member-name" data-v-5660e131>${ssrInterpolate(m.name)}</span><span class="${ssrRenderClass([m.role === "lead" ? "r-lead" : "r-worker", "member-role"])}" data-v-5660e131>${ssrInterpolate(m.role === "lead" ? "Leader" : "Worker")}</span></div><select class="member-select"${ssrRenderAttr("value", (m.modelRef ?? "") || "hero-3d")} data-v-5660e131><!--[-->`);
2487
+ _push(`<div class="member-row" data-v-3e78e101><span class="member-ava" style="${ssrRenderStyle({ color: hashColor(unref(selectedChannel)) })}" data-v-3e78e101>${ssrInterpolate(m.name.charAt(0).toUpperCase())}</span><div class="member-info" data-v-3e78e101><span class="member-name" data-v-3e78e101>${ssrInterpolate(m.name)}</span><span class="${ssrRenderClass([m.role === "lead" ? "r-lead" : "r-worker", "member-role"])}" data-v-3e78e101>${ssrInterpolate(m.role === "lead" ? "Leader" : "Worker")}</span></div><select class="member-select"${ssrRenderAttr("value", (m.modelRef ?? "") || "hero-3d")} data-v-3e78e101><!--[-->`);
2428
2488
  ssrRenderList(unref(agentModels), (model) => {
2429
- _push(`<option${ssrRenderAttr("value", model.id)} data-v-5660e131>${ssrInterpolate(model.name)}</option>`);
2489
+ _push(`<option${ssrRenderAttr("value", model.id)} data-v-3e78e101>${ssrInterpolate(model.name)}</option>`);
2430
2490
  });
2431
2491
  _push(`<!--]--></select></div>`);
2432
2492
  });
2433
2493
  _push(`<!--]-->`);
2434
- if (unref(channelMembers).length === 0) _push(`<div class="bp-hint" data-v-5660e131>${ssrInterpolate(_ctx.$t("townView.k419rbs055"))}</div>`);
2494
+ if (unref(channelMembers).length === 0) _push(`<div class="bp-hint" data-v-3e78e101>${ssrInterpolate(_ctx.$t("townView.k419rbs055"))}</div>`);
2435
2495
  else _push(`<!---->`);
2436
2496
  _push(`</div><!--]-->`);
2437
2497
  }
2438
- _push(`<div class="bp-actions" data-v-5660e131>`);
2439
- if (unref(channelPanelTab) === "boundary") _push(`<button class="bp-btn save" data-v-5660e131>${ssrInterpolate(_ctx.$t("townView.k1b3kp8f056"))}</button>`);
2498
+ _push(`<div class="bp-actions" data-v-3e78e101>`);
2499
+ if (unref(channelPanelTab) === "boundary") _push(`<button class="bp-btn save" data-v-3e78e101>${ssrInterpolate(_ctx.$t("townView.k1b3kp8f056"))}</button>`);
2440
2500
  else _push(`<!---->`);
2441
- _push(`<button class="bp-btn danger" data-v-5660e131>${ssrInterpolate(_ctx.$t("townView.k1hs45qg057"))}</button><button class="bp-btn" data-v-5660e131>${ssrInterpolate(_ctx.$t("townView.k3x62t058"))}</button></div></div>`);
2501
+ _push(`<button class="bp-btn danger" data-v-3e78e101>${ssrInterpolate(_ctx.$t("townView.k1hs45qg057"))}</button><button class="bp-btn" data-v-3e78e101>${ssrInterpolate(_ctx.$t("townView.k3x62t058"))}</button></div></div>`);
2442
2502
  } else _push(`<!---->`);
2443
- if (unref(lastDropText)) _push(`<div class="drop-chip" data-v-5660e131>${ssrInterpolate(unref(lastDropText))}</div>`);
2503
+ if (unref(lastDropText)) _push(`<div class="drop-chip" data-v-3e78e101>${ssrInterpolate(unref(lastDropText))}</div>`);
2444
2504
  else _push(`<!---->`);
2445
- if (unref(errorText)) _push(`<div class="error-chip" data-v-5660e131>${ssrInterpolate(unref(errorText))}</div>`);
2505
+ if (unref(errorText)) _push(`<div class="error-chip" data-v-3e78e101>${ssrInterpolate(unref(errorText))}</div>`);
2446
2506
  else _push(`<!---->`);
2447
- if (!unref(ready)) _push(`<div data-hud="town-loading" class="loading-mask" data-v-5660e131><div class="loading-spinner" data-v-5660e131></div><span class="loading-text" data-v-5660e131>${ssrInterpolate(_ctx.$t("townView.kvjdqfg059"))}</span></div>`);
2507
+ if (!unref(ready)) _push(`<div data-hud="town-loading" class="loading-mask" data-v-3e78e101><div class="loading-spinner" data-v-3e78e101></div><span class="loading-text" data-v-3e78e101>${ssrInterpolate(_ctx.$t("townView.kvjdqfg059"))}</span></div>`);
2448
2508
  else _push(`<!---->`);
2449
- _push(`</div><div class="dock" data-v-5660e131><section class="dock-card" data-v-5660e131><div class="dock-hd" data-v-5660e131><h3 data-v-5660e131>${ssrInterpolate(_ctx.$t("townView.k1c9iq23060"))}</h3><span class="dock-mode" data-v-5660e131>${ssrInterpolate(unref(mode) === "edit" ? _ctx.$t("townView.k1iipfcs143") : _ctx.$t("townView.k1l147w1177"))}</span></div><p class="ctl-sec" data-v-5660e131>${ssrInterpolate(_ctx.$t("townView.secRender"))}</p><div class="ctl-row" data-v-5660e131><span class="ctl-name"${ssrRenderAttr("title", _ctx.$t("townView.qualityTip"))} data-v-5660e131>${ssrInterpolate(_ctx.$t("townView.qualityLabel"))}</span><div class="fps-seg" data-v-5660e131><!--[-->`);
2509
+ _push(`</div><div class="${ssrRenderClass([{ "dock-open": unref(dockOpen) }, "dock"])}" data-v-3e78e101><button type="button" class="dock-toggle" aria-controls="town-dock-controls"${ssrRenderAttr("aria-expanded", unref(dockOpen) ? "true" : "false")} data-v-3e78e101><span class="dock-toggle-t" data-v-3e78e101>${ssrInterpolate(_ctx.$t("townView.k1c9iq23060"))}</span><span class="dock-toggle-hint mono" data-v-3e78e101>${ssrInterpolate(unref(mode) === "edit" ? _ctx.$t("townView.k1iipfcs143") : _ctx.$t("townView.k1l147w1177"))}</span><span class="dock-caret" aria-hidden="true" data-v-3e78e101>▾</span></button><section id="town-dock-controls" class="dock-card" data-v-3e78e101><div class="dock-hd" data-v-3e78e101><h3 data-v-3e78e101>${ssrInterpolate(_ctx.$t("townView.k1c9iq23060"))}</h3><span class="dock-mode" data-v-3e78e101>${ssrInterpolate(unref(mode) === "edit" ? _ctx.$t("townView.k1iipfcs143") : _ctx.$t("townView.k1l147w1177"))}</span></div><p class="ctl-sec" data-v-3e78e101>${ssrInterpolate(_ctx.$t("townView.secRender"))}</p><div class="ctl-row" data-v-3e78e101><span class="ctl-name"${ssrRenderAttr("title", _ctx.$t("townView.qualityTip"))} data-v-3e78e101>${ssrInterpolate(_ctx.$t("townView.qualityLabel"))}</span><div class="fps-seg" data-v-3e78e101><!--[-->`);
2450
2510
  ssrRenderList(QUALITY_OPTIONS, (o) => {
2451
- _push(`<button class="${ssrRenderClass({ on: unref(qualityMode) === o.v })}" data-v-5660e131>${ssrInterpolate(_ctx.$t(o.label))}</button>`);
2511
+ _push(`<button class="${ssrRenderClass({ on: unref(qualityMode) === o.v })}" data-v-3e78e101>${ssrInterpolate(_ctx.$t(o.label))}</button>`);
2452
2512
  });
2453
- _push(`<!--]--></div><span class="ctl-val" data-v-5660e131></span></div><div class="ctl-row" data-v-5660e131><span class="ctl-name"${ssrRenderAttr("title", _ctx.$t("townView.fpsCapTip"))} data-v-5660e131>${ssrInterpolate(_ctx.$t("townView.fpsCapLabel"))}</span><div class="fps-seg" data-v-5660e131><!--[-->`);
2513
+ _push(`<!--]--></div><span class="ctl-val" data-v-3e78e101></span></div><div class="ctl-row" data-v-3e78e101><span class="ctl-name"${ssrRenderAttr("title", _ctx.$t("townView.fpsCapTip"))} data-v-3e78e101>${ssrInterpolate(_ctx.$t("townView.fpsCapLabel"))}</span><div class="fps-seg" data-v-3e78e101><!--[-->`);
2454
2514
  ssrRenderList(FPS_OPTIONS, (o) => {
2455
- _push(`<button class="${ssrRenderClass({ on: unref(fpsCap) === o.v })}" data-v-5660e131>${ssrInterpolate(o.label)}</button>`);
2515
+ _push(`<button class="${ssrRenderClass({ on: unref(fpsCap) === o.v })}" data-v-3e78e101>${ssrInterpolate(o.label)}</button>`);
2456
2516
  });
2457
- _push(`<!--]--></div><span class="ctl-val" data-v-5660e131></span></div><p class="ctl-sec" data-v-5660e131>${ssrInterpolate(_ctx.$t("townView.secEnv"))}</p><div class="ctl-row" data-v-5660e131><span class="ctl-name" data-v-5660e131>${ssrInterpolate(_ctx.$t("townView.k1gizopz061"))}</span><input class="ctl-range" type="range" min="30" max="220"${ssrRenderAttr("value", Math.round(unref(exposure) * 100))} style="${ssrRenderStyle({ "--fill": sliderPct(Math.round(unref(exposure) * 100), 30, 220) })}" data-v-5660e131><span class="ctl-val" data-v-5660e131>${ssrInterpolate(Math.round(unref(exposure) * 100))}%</span></div><div class="ctl-row" data-v-5660e131><span class="ctl-name" data-v-5660e131>${ssrInterpolate(_ctx.$t("townView.k1bcpqto062"))}</span><input class="ctl-range" type="range" min="10" max="100"${ssrRenderAttr("value", Math.round(unref(tintOpacity) * 100))} style="${ssrRenderStyle({ "--fill": sliderPct(Math.round(unref(tintOpacity) * 100), 10, 100) })}" data-v-5660e131><span class="ctl-val" data-v-5660e131>${ssrInterpolate(Math.round(unref(tintOpacity) * 100))}%</span></div><div class="ctl-row" data-v-5660e131><span class="ctl-name" data-v-5660e131>${ssrInterpolate(_ctx.$t("townView.k1bztha1063"))}</span><input class="ctl-range" type="range" min="60" max="120"${ssrRenderAttr("value", unref(threshPct))} style="${ssrRenderStyle({ "--fill": sliderPct(unref(threshPct), 60, 120) })}" data-v-5660e131><span class="ctl-val" data-v-5660e131>${ssrInterpolate(unref(threshPct))}%</span></div><div class="ctl-row" data-v-5660e131><span class="ctl-name"${ssrRenderAttr("title", _ctx.$t("townView.kz71l1f012"))} data-v-5660e131>${ssrInterpolate(_ctx.$t("townView.ka4i1s9064"))}</span><input class="ctl-range" type="range" min="0" max="3000" step="50"${ssrRenderAttr("value", unref(calloutNearDist))} style="${ssrRenderStyle({ "--fill": sliderPct(unref(calloutNearDist), 0, 3e3) })}" data-v-5660e131><span class="ctl-val" data-v-5660e131>${ssrInterpolate(unref(calloutNearDist) === 0 ? _ctx.$t("townView.k493s144") : `${unref(calloutNearDist)}`)}</span></div><p class="ctl-sec" data-v-5660e131>${ssrInterpolate(_ctx.$t("townView.secOps"))}</p><div class="ctl-row" data-v-5660e131><span class="ctl-name" data-v-5660e131>${ssrInterpolate(_ctx.$t("townView.k1idc6pa065"))}</span><button class="${ssrRenderClass([{ on: unref(snap) }, "snap-toggle"])}" data-v-5660e131>${ssrInterpolate(unref(snap) ? _ctx.$t("townView.k4bs5145") : _ctx.$t("townView.k493s144"))}</button><span class="ctl-val" data-v-5660e131></span></div><div class="ctl-btns" data-v-5660e131><button class="btn btn-primary" data-v-5660e131>${ssrInterpolate(_ctx.$t("townView.k1lap9bs024"))}</button><button class="btn btn-ghost"${ssrIncludeBooleanAttr(unref(mode) !== "edit") ? " disabled" : ""}${ssrRenderAttr("title", unref(mode) === "edit" ? _ctx.$t("townView.ksavetip181") : _ctx.$t("townView.krotip182"))} data-v-5660e131>${ssrInterpolate(_ctx.$t("townView.k1b3bk8t029"))}</button><button class="${ssrRenderClass([{ armed: unref(estop) }, "btn btn-danger"])}" data-v-5660e131>${ssrInterpolate(_ctx.$t("townView.k1i046wf066"))}</button></div></section><section class="dock-card" data-v-5660e131><div class="dock-hd" data-v-5660e131><h3 data-v-5660e131>${ssrInterpolate(_ctx.$t("townView.k1kfoef9067"))}</h3><span class="dock-count mono" data-v-5660e131>${ssrInterpolate(unref(daqTwins).length)}</span><div class="${ssrRenderClass([{ expanded: unref(trendExpanded) }, "trend-legend"])}" data-v-5660e131><!--[-->`);
2458
- ssrRenderList(unref(trendChips), (t) => {
2459
- _push(`<button class="${ssrRenderClass([{ off: !trendOn(t.id) }, "lg-chip"])}" data-v-5660e131><span class="lg-dot" style="${ssrRenderStyle({ background: trendColor(t.id) })}" data-v-5660e131></span>${ssrInterpolate(t.name)}</button>`);
2517
+ _push(`<!--]--></div><span class="ctl-val" data-v-3e78e101></span></div><p class="ctl-sec" data-v-3e78e101>${ssrInterpolate(_ctx.$t("townView.secEnv"))}</p><div class="ctl-row" data-v-3e78e101><span class="ctl-name" data-v-3e78e101>${ssrInterpolate(_ctx.$t("townView.k1gizopz061"))}</span><input class="ctl-range" type="range" min="30" max="220"${ssrRenderAttr("value", Math.round(unref(exposure) * 100))} style="${ssrRenderStyle({ "--fill": sliderPct(Math.round(unref(exposure) * 100), 30, 220) })}" data-v-3e78e101><span class="ctl-val" data-v-3e78e101>${ssrInterpolate(Math.round(unref(exposure) * 100))}%</span></div><div class="ctl-row" data-v-3e78e101><span class="ctl-name" data-v-3e78e101>${ssrInterpolate(_ctx.$t("townView.k1bcpqto062"))}</span><input class="ctl-range" type="range" min="10" max="100"${ssrRenderAttr("value", Math.round(unref(tintOpacity) * 100))} style="${ssrRenderStyle({ "--fill": sliderPct(Math.round(unref(tintOpacity) * 100), 10, 100) })}" data-v-3e78e101><span class="ctl-val" data-v-3e78e101>${ssrInterpolate(Math.round(unref(tintOpacity) * 100))}%</span></div><div class="ctl-row" data-v-3e78e101><span class="ctl-name" data-v-3e78e101>${ssrInterpolate(_ctx.$t("townView.k1bztha1063"))}</span><input class="ctl-range" type="range" min="60" max="120"${ssrRenderAttr("value", unref(threshPct))} style="${ssrRenderStyle({ "--fill": sliderPct(unref(threshPct), 60, 120) })}" data-v-3e78e101><span class="ctl-val" data-v-3e78e101>${ssrInterpolate(unref(threshPct))}%</span></div><div class="ctl-row" data-v-3e78e101><span class="ctl-name"${ssrRenderAttr("title", _ctx.$t("townView.kz71l1f012"))} data-v-3e78e101>${ssrInterpolate(_ctx.$t("townView.ka4i1s9064"))}</span><input class="ctl-range" type="range" min="0" max="3000" step="50"${ssrRenderAttr("value", unref(calloutNearDist))} style="${ssrRenderStyle({ "--fill": sliderPct(unref(calloutNearDist), 0, 3e3) })}" data-v-3e78e101><span class="ctl-val" data-v-3e78e101>${ssrInterpolate(unref(calloutNearDist) === 0 ? _ctx.$t("townView.k493s144") : `${unref(calloutNearDist)}`)}</span></div><p class="ctl-sec" data-v-3e78e101>${ssrInterpolate(_ctx.$t("townView.secOps"))}</p><div class="ctl-row" data-v-3e78e101><span class="ctl-name" data-v-3e78e101>${ssrInterpolate(_ctx.$t("townView.k1idc6pa065"))}</span><button class="${ssrRenderClass([{ on: unref(snap) }, "snap-toggle"])}" data-v-3e78e101>${ssrInterpolate(unref(snap) ? _ctx.$t("townView.k4bs5145") : _ctx.$t("townView.k493s144"))}</button><span class="ctl-val" data-v-3e78e101></span></div><div class="ctl-btns" data-v-3e78e101><button class="btn btn-primary" data-v-3e78e101>${ssrInterpolate(_ctx.$t("townView.k1lap9bs024"))}</button><button class="btn btn-ghost"${ssrIncludeBooleanAttr(unref(mode) !== "edit") ? " disabled" : ""}${ssrRenderAttr("title", unref(mode) === "edit" ? _ctx.$t("townView.ksavetip181") : _ctx.$t("townView.krotip182"))} data-v-3e78e101>${ssrInterpolate(_ctx.$t("townView.k1b3bk8t029"))}</button><button class="${ssrRenderClass([{ armed: unref(estop) }, "btn btn-danger"])}" data-v-3e78e101>${ssrInterpolate(_ctx.$t("townView.k1i046wf066"))}</button></div></section><section class="dock-card" data-v-3e78e101><div class="dock-hd" data-v-3e78e101><h3 data-v-3e78e101>${ssrInterpolate(_ctx.$t("townView.k1kfoef9067"))}</h3><span class="dock-count mono" data-v-3e78e101>${ssrInterpolate(unref(daqTwins).length)}</span><div class="${ssrRenderClass([{ expanded: unref(trendExpanded) }, "trend-legend"])}" data-v-3e78e101><!--[-->`);
2518
+ ssrRenderList(unref(trendChips), (chip) => {
2519
+ _push(`<button class="${ssrRenderClass([{ off: !trendOn(chip.id) }, "lg-chip"])}" data-v-3e78e101><span class="lg-dot" style="${ssrRenderStyle({ background: trendColor(chip.id) })}" data-v-3e78e101></span>${ssrInterpolate(chip.name)}</button>`);
2460
2520
  });
2461
2521
  _push(`<!--]-->`);
2462
- if (unref(trendOverflow) > 0) _push(`<button class="lg-chip lg-more mono"${ssrRenderAttr("title", unref(trendExpanded) ? _ctx.$t("townView.trendCollapse") : _ctx.$t("townView.trendExpandAll", { p0: unref(daqTwins).length }))} data-v-5660e131>${ssrInterpolate(unref(trendExpanded) ? _ctx.$t("townView.trendCollapse") : `+${unref(trendOverflow)}`)}</button>`);
2522
+ if (unref(trendOverflow) > 0) _push(`<button class="lg-chip lg-more mono"${ssrRenderAttr("title", unref(trendExpanded) ? _ctx.$t("townView.trendCollapse") : _ctx.$t("townView.trendExpandAll", { p0: unref(daqTwins).length }))} data-v-3e78e101>${ssrInterpolate(unref(trendExpanded) ? _ctx.$t("townView.trendCollapse") : `+${unref(trendOverflow)}`)}</button>`);
2463
2523
  else _push(`<!---->`);
2464
- _push(`</div></div><div class="trend-wrap" data-v-5660e131><canvas class="trend-cv" data-v-5660e131></canvas>`);
2465
- if (!unref(daqTwins).length) _push(`<span class="trend-empty" data-v-5660e131>${ssrInterpolate(_ctx.$t("townView.k1uht2uv068"))}</span>`);
2524
+ _push(`</div></div><div class="trend-wrap" data-v-3e78e101><canvas class="trend-cv" data-v-3e78e101></canvas>`);
2525
+ if (!unref(daqTwins).length) _push(`<span class="trend-empty" data-v-3e78e101>${ssrInterpolate(_ctx.$t("townView.k1uht2uv068"))}</span>`);
2466
2526
  else _push(`<!---->`);
2467
- _push(`</div></section></div></main><aside class="rail rail-right" data-v-5660e131>`);
2527
+ _push(`</div></section></div></main><aside id="town-rail-right" class="${ssrRenderClass([{ "sheet-open": unref(sheetOpen) === "right" }, "rail rail-right"])}" data-v-3e78e101><div class="sheet-hd" data-v-3e78e101><span class="sheet-grip" aria-hidden="true" data-v-3e78e101></span><span class="sheet-hd-t" data-v-3e78e101>${ssrInterpolate(_ctx.$t("townView.k17dkhgd112"))}</span><button type="button" class="sheet-x" aria-label="关闭" data-v-3e78e101> ✕ </button></div>`);
2468
2528
  if (unref(selected)) {
2469
- _push(`<section class="panel inspector" data-v-5660e131><div class="panel-hd" data-v-5660e131><h3 data-v-5660e131>${ssrInterpolate(unref(selected).kind === "device" ? unref(selectedIsDcw) ? _ctx.$t("townView.k1ekqxlt146") : unref(selectedIsDaq) ? _ctx.$t("townView.k1empnnb178") : _ctx.$t("townView.k1k6wg8j185") : unref(selectedAgentRoleLabel))}</h3><button class="mini-btn"${ssrRenderAttr("title", _ctx.$t("townView.k1bsckft013"))} data-v-5660e131> ✕ </button></div><div class="ins-chip-row" data-v-5660e131><span class="ins-chip mono" data-v-5660e131>${ssrInterpolate(unref(selected).id.slice(0, 8))}</span>`);
2470
- if (unref(selected).kind === "device" && unref(selectedIsDaq)) _push(`<span class="ins-chip accent" data-v-5660e131>DAQ</span>`);
2471
- else if (unref(selected).kind === "device" && unref(selectedIsDcw)) _push(`<span class="ins-chip accent" data-v-5660e131>DCW</span>`);
2529
+ _push(`<section class="panel inspector" data-v-3e78e101><div class="panel-hd" data-v-3e78e101><h3 data-v-3e78e101>${ssrInterpolate(unref(selected).kind === "device" ? unref(selectedIsDcw) ? _ctx.$t("townView.k1ekqxlt146") : unref(selectedIsDaq) ? _ctx.$t("townView.k1empnnb178") : _ctx.$t("townView.k1k6wg8j185") : unref(selectedAgentRoleLabel))}</h3><button class="mini-btn"${ssrRenderAttr("title", _ctx.$t("townView.k1bsckft013"))} data-v-3e78e101> ✕ </button></div><div class="ins-chip-row" data-v-3e78e101><span class="ins-chip mono" data-v-3e78e101>${ssrInterpolate(unref(selected).id.slice(0, 8))}</span>`);
2530
+ if (unref(selected).kind === "device" && unref(selectedIsDaq)) _push(`<span class="ins-chip accent" data-v-3e78e101>DAQ</span>`);
2531
+ else if (unref(selected).kind === "device" && unref(selectedIsDcw)) _push(`<span class="ins-chip accent" data-v-3e78e101>DCW</span>`);
2472
2532
  else _push(`<!---->`);
2473
2533
  _push(`</div>`);
2474
2534
  if (unref(selected).kind === "device") {
2475
2535
  _push(`<!--[-->`);
2476
2536
  if (unref(selectedIsDcw)) {
2477
- _push(`<div class="daq-info" data-v-5660e131><div class="daq-info-row" data-v-5660e131><span data-v-5660e131>${ssrInterpolate(_ctx.$t("townView.k1deqh0d069"))}</span><b class="cy" data-v-5660e131>${ssrInterpolate(unref(selectedDcwNode)?.value != null ? unref(selectedDcwNode).value.toFixed(unref(selectedDcwNode).decimals) : "--")} ${ssrInterpolate(unref(selectedDcwNode)?.unit)}</b></div><div class="daq-info-row" data-v-5660e131><span data-v-5660e131>${ssrInterpolate(unref(selectedDcwWindow)?.src === "recipe" ? _ctx.$t("townView.kq2jssk147") : _ctx.$t("townView.k1iwj796179"))}</span><b class="${ssrRenderClass({ amber: unref(selectedDcwWindow)?.src === "recipe" })}" data-v-5660e131>${ssrInterpolate(dcwWinLabel(unref(selectedDcwNode)))}</b></div><div class="daq-info-row" data-v-5660e131><span data-v-5660e131>${ssrInterpolate(_ctx.$t("townView.k1i8rtqt070"))}</span><b data-v-5660e131>${ssrInterpolate(unref(selectedDcwDeviceName) || _ctx.$t("townView.k3own4q148"))}</b></div><div class="daq-bind-bar" data-v-5660e131><input${ssrRenderAttr("value", unref(dcwWriteDrafts)[unref(selected).id])} type="number" class="bind-select"${ssrRenderAttr("step", 10 ** -(unref(selectedDcwNode)?.decimals ?? 2))}${ssrRenderAttr("placeholder", dcwWinInputPh(unref(selectedDcwNode)))} data-v-5660e131><button class="bind-add-btn"${ssrIncludeBooleanAttr(unref(dcwWriteDrafts)[unref(selected).id] == null || unref(dcwWriteDrafts)[unref(selected).id] === "") ? " disabled" : ""} data-v-5660e131>${ssrInterpolate(_ctx.$t("townView.kwrbtn180"))}</button></div>`);
2478
- if (unref(dcwWriteErrs)[unref(selected).id]) _push(`<p class="dcw-err" data-v-5660e131>${ssrInterpolate(unref(dcwWriteErrs)[unref(selected).id])}</p>`);
2537
+ _push(`<div class="daq-info" data-v-3e78e101><div class="daq-info-row" data-v-3e78e101><span data-v-3e78e101>${ssrInterpolate(_ctx.$t("townView.k1deqh0d069"))}</span><b class="cy" data-v-3e78e101>${ssrInterpolate(unref(selectedDcwNode)?.value != null ? unref(selectedDcwNode).value.toFixed(unref(selectedDcwNode).decimals) : "--")} ${ssrInterpolate(unref(selectedDcwNode)?.unit)}</b></div><div class="daq-info-row" data-v-3e78e101><span data-v-3e78e101>${ssrInterpolate(unref(selectedDcwWindow)?.src === "recipe" ? _ctx.$t("townView.kq2jssk147") : _ctx.$t("townView.k1iwj796179"))}</span><b class="${ssrRenderClass({ amber: unref(selectedDcwWindow)?.src === "recipe" })}" data-v-3e78e101>${ssrInterpolate(dcwWinLabel(unref(selectedDcwNode)))}</b></div><div class="daq-info-row" data-v-3e78e101><span data-v-3e78e101>${ssrInterpolate(_ctx.$t("townView.k1i8rtqt070"))}</span><b data-v-3e78e101>${ssrInterpolate(unref(selectedDcwDeviceName) || _ctx.$t("townView.k3own4q148"))}</b></div><div class="daq-bind-bar" data-v-3e78e101><input${ssrRenderAttr("value", unref(dcwWriteDrafts)[unref(selected).id])} type="number" class="bind-select"${ssrRenderAttr("step", 10 ** -(unref(selectedDcwNode)?.decimals ?? 2))}${ssrRenderAttr("placeholder", dcwWinInputPh(unref(selectedDcwNode)))} data-v-3e78e101><button class="bind-add-btn"${ssrIncludeBooleanAttr(unref(dcwWriteDrafts)[unref(selected).id] == null || unref(dcwWriteDrafts)[unref(selected).id] === "") ? " disabled" : ""} data-v-3e78e101>${ssrInterpolate(_ctx.$t("townView.kwrbtn180"))}</button></div>`);
2538
+ if (unref(dcwWriteErrs)[unref(selected).id]) _push(`<p class="dcw-err" data-v-3e78e101>${ssrInterpolate(unref(dcwWriteErrs)[unref(selected).id])}</p>`);
2479
2539
  else _push(`<!---->`);
2480
2540
  if (unref(mode) === "edit") {
2481
- _push(`<div class="daq-bind-bar" data-v-5660e131><select class="bind-select" data-v-5660e131><option value="" data-v-5660e131${ssrIncludeBooleanAttr(Array.isArray(unref(dcwBindPick)) ? ssrLooseContain(unref(dcwBindPick), "") : ssrLooseEqual(unref(dcwBindPick), "")) ? " selected" : ""}>${ssrInterpolate(_ctx.$t("townView.kjo6ekr071"))}</option><!--[-->`);
2541
+ _push(`<div class="daq-bind-bar" data-v-3e78e101><select class="bind-select" data-v-3e78e101><option value="" data-v-3e78e101${ssrIncludeBooleanAttr(Array.isArray(unref(dcwBindPick)) ? ssrLooseContain(unref(dcwBindPick), "") : ssrLooseEqual(unref(dcwBindPick), "")) ? " selected" : ""}>${ssrInterpolate(_ctx.$t("townView.kjo6ekr071"))}</option><!--[-->`);
2482
2542
  ssrRenderList(unref(deviceTwins).twins.filter((x) => !isLegacyDaqTwin(x) && x.id !== (unref(selected)?.id ?? "")), (dv) => {
2483
- _push(`<option${ssrRenderAttr("value", dv.id)} data-v-5660e131${ssrIncludeBooleanAttr(Array.isArray(unref(dcwBindPick)) ? ssrLooseContain(unref(dcwBindPick), dv.id) : ssrLooseEqual(unref(dcwBindPick), dv.id)) ? " selected" : ""}>${ssrInterpolate(dv.name)}</option>`);
2543
+ _push(`<option${ssrRenderAttr("value", dv.id)} data-v-3e78e101${ssrIncludeBooleanAttr(Array.isArray(unref(dcwBindPick)) ? ssrLooseContain(unref(dcwBindPick), dv.id) : ssrLooseEqual(unref(dcwBindPick), dv.id)) ? " selected" : ""}>${ssrInterpolate(dv.name)}</option>`);
2484
2544
  });
2485
- _push(`<!--]--></select><button class="bind-add-btn"${ssrIncludeBooleanAttr(!unref(selectedDcwDeviceName) && !unref(dcwBindPick)) ? " disabled" : ""} data-v-5660e131>${ssrInterpolate(unref(selectedDcwDeviceName) ? _ctx.$t("townView.k479eh149") : _ctx.$t("townView.k452a8102"))}</button></div>`);
2545
+ _push(`<!--]--></select><button class="bind-add-btn"${ssrIncludeBooleanAttr(!unref(selectedDcwDeviceName) && !unref(dcwBindPick)) ? " disabled" : ""} data-v-3e78e101>${ssrInterpolate(unref(selectedDcwDeviceName) ? _ctx.$t("townView.k479eh149") : _ctx.$t("townView.k452a8102"))}</button></div>`);
2486
2546
  } else _push(`<!---->`);
2487
2547
  _push(`</div>`);
2488
2548
  } else if (unref(selectedIsDaq)) {
2489
- _push(`<div class="daq-info" data-v-5660e131><div class="daq-info-row" data-v-5660e131><span data-v-5660e131>${ssrInterpolate(_ctx.$t("townView.k3mv305072"))}</span><b class="cy" data-v-5660e131>${ssrInterpolate(unref(selectedDaqSim) ? fmtDaq(unref(selectedDaqSim)) : "--")} ${ssrInterpolate(unref(selectedDaqSim)?.tpl.unit)}</b></div><div class="daq-info-row" data-v-5660e131><span data-v-5660e131>${ssrInterpolate(_ctx.$t("townView.k1faqmjb073"))}</span><b data-v-5660e131>${ssrInterpolate(unref(selectedDaqSim)?.tpl.min)} ~ ${ssrInterpolate(unref(selectedDaqSim)?.tpl.max)}</b></div><div class="daq-info-row" data-v-5660e131><span data-v-5660e131>${ssrInterpolate(_ctx.$t("townView.k1i8rtqt070"))}</span><b data-v-5660e131>${ssrInterpolate(unref(daqBoundDeviceName) || _ctx.$t("townView.k3own4q148"))}</b></div>`);
2549
+ _push(`<div class="daq-info" data-v-3e78e101><div class="daq-info-row" data-v-3e78e101><span data-v-3e78e101>${ssrInterpolate(_ctx.$t("townView.k3mv305072"))}</span><b class="cy" data-v-3e78e101>${ssrInterpolate(unref(selectedDaqSim) ? fmtDaq(unref(selectedDaqSim)) : "--")} ${ssrInterpolate(unref(selectedDaqSim)?.tpl.unit)}</b></div><div class="daq-info-row" data-v-3e78e101><span data-v-3e78e101>${ssrInterpolate(_ctx.$t("townView.k1faqmjb073"))}</span><b data-v-3e78e101>${ssrInterpolate(unref(selectedDaqSim)?.tpl.min)} ~ ${ssrInterpolate(unref(selectedDaqSim)?.tpl.max)}</b></div><div class="daq-info-row" data-v-3e78e101><span data-v-3e78e101>${ssrInterpolate(_ctx.$t("townView.k1i8rtqt070"))}</span><b data-v-3e78e101>${ssrInterpolate(unref(daqBoundDeviceName) || _ctx.$t("townView.k3own4q148"))}</b></div>`);
2490
2550
  if (unref(mode) === "edit") {
2491
- _push(`<div class="daq-bind-bar" data-v-5660e131><select class="bind-select" data-v-5660e131><option value="" data-v-5660e131${ssrIncludeBooleanAttr(Array.isArray(unref(bindPick)) ? ssrLooseContain(unref(bindPick), "") : ssrLooseEqual(unref(bindPick), "")) ? " selected" : ""}>${ssrInterpolate(_ctx.$t("townView.kjo6ekr071"))}</option><!--[-->`);
2551
+ _push(`<div class="daq-bind-bar" data-v-3e78e101><select class="bind-select" data-v-3e78e101><option value="" data-v-3e78e101${ssrIncludeBooleanAttr(Array.isArray(unref(bindPick)) ? ssrLooseContain(unref(bindPick), "") : ssrLooseEqual(unref(bindPick), "")) ? " selected" : ""}>${ssrInterpolate(_ctx.$t("townView.kjo6ekr071"))}</option><!--[-->`);
2492
2552
  ssrRenderList(unref(deviceTwins).twins.filter((x) => !isLegacyDaqTwin(x) && x.id !== (unref(selected)?.id ?? "")), (dv) => {
2493
- _push(`<option${ssrRenderAttr("value", dv.id)} data-v-5660e131${ssrIncludeBooleanAttr(Array.isArray(unref(bindPick)) ? ssrLooseContain(unref(bindPick), dv.id) : ssrLooseEqual(unref(bindPick), dv.id)) ? " selected" : ""}>${ssrInterpolate(dv.name)}</option>`);
2553
+ _push(`<option${ssrRenderAttr("value", dv.id)} data-v-3e78e101${ssrIncludeBooleanAttr(Array.isArray(unref(bindPick)) ? ssrLooseContain(unref(bindPick), dv.id) : ssrLooseEqual(unref(bindPick), dv.id)) ? " selected" : ""}>${ssrInterpolate(dv.name)}</option>`);
2494
2554
  });
2495
- _push(`<!--]--></select><button class="bind-add-btn"${ssrIncludeBooleanAttr(!unref(daqBoundDeviceName) && !unref(bindPick)) ? " disabled" : ""} data-v-5660e131>${ssrInterpolate(unref(daqBoundDeviceName) ? _ctx.$t("townView.k479eh149") : _ctx.$t("townView.k452a8102"))}</button></div>`);
2555
+ _push(`<!--]--></select><button class="bind-add-btn"${ssrIncludeBooleanAttr(!unref(daqBoundDeviceName) && !unref(bindPick)) ? " disabled" : ""} data-v-3e78e101>${ssrInterpolate(unref(daqBoundDeviceName) ? _ctx.$t("townView.k479eh149") : _ctx.$t("townView.k452a8102"))}</button></div>`);
2496
2556
  } else _push(`<!---->`);
2497
- if (unref(mode) === "edit" && unref(selectedDaqNode)) _push(`<div class="daq-node-ctl" data-v-5660e131><div class="daq-info-row" data-v-5660e131><span data-v-5660e131>${ssrInterpolate(_ctx.$t("townView.k1l6g2ga074"))}</span><span class="daq-th-inputs" data-v-5660e131><input${ssrRenderAttr("value", unref(daqIntervalDraft))} type="number" min="200" max="60000" step="100" class="daq-num" data-v-5660e131><small data-v-5660e131>${ssrInterpolate(_ctx.$t("townView.k1or92b075"))}</small></span></div><div class="daq-info-row" data-v-5660e131><span data-v-5660e131>${ssrInterpolate(_ctx.$t("townView.k3x5tpx076"))}</span><span class="daq-th-inputs" data-v-5660e131><input${ssrRenderAttr("value", unref(selectedDaqNode).warnLow)} type="number" step="any" class="daq-num" data-v-5660e131> ~ <input${ssrRenderAttr("value", unref(selectedDaqNode).warnHigh)} type="number" step="any" class="daq-num" data-v-5660e131></span></div><div class="daq-info-row" data-v-5660e131><span data-v-5660e131>${ssrInterpolate(_ctx.$t("townView.k1hjj0jf077"))}</span><span class="daq-th-inputs" data-v-5660e131><input${ssrRenderAttr("value", unref(selectedDaqNode).min)} type="number" step="any" class="daq-num" data-v-5660e131> ~ <input${ssrRenderAttr("value", unref(selectedDaqNode).max)} type="number" step="any" class="daq-num" data-v-5660e131></span></div><div class="daq-info-row" data-v-5660e131><span data-v-5660e131>${ssrInterpolate(_ctx.$t("townView.k48tki078"))}</span><button class="${ssrRenderClass([{ warn: unref(selectedDaqNode).enabled }, "bind-add-btn"])}" data-v-5660e131>${ssrInterpolate(unref(selectedDaqNode).enabled ? _ctx.$t("townView.k1wv0nyo150") : _ctx.$t("townView.kh1586b180"))}</button></div><div class="daq-info-row" data-v-5660e131><span data-v-5660e131>${ssrInterpolate(_ctx.$t("townView.k3xakp079"))}</span><button class="bind-add-btn danger"${ssrRenderAttr("title", _ctx.$t("townView.kpwutri014"))} data-v-5660e131>${ssrInterpolate(_ctx.$t("townView.k1bpp30k080"))}</button></div></div>`);
2498
- else _push(`<div class="ins-empty" data-v-5660e131>${ssrInterpolate(_ctx.$t("townView.kzk5dfx081"))}</div>`);
2557
+ if (unref(mode) === "edit" && unref(selectedDaqNode)) _push(`<div class="daq-node-ctl" data-v-3e78e101><div class="daq-info-row" data-v-3e78e101><span data-v-3e78e101>${ssrInterpolate(_ctx.$t("townView.k1l6g2ga074"))}</span><span class="daq-th-inputs" data-v-3e78e101><input${ssrRenderAttr("value", unref(daqIntervalDraft))} type="number" min="200" max="60000" step="100" class="daq-num" data-v-3e78e101><small data-v-3e78e101>${ssrInterpolate(_ctx.$t("townView.k1or92b075"))}</small></span></div><div class="daq-info-row" data-v-3e78e101><span data-v-3e78e101>${ssrInterpolate(_ctx.$t("townView.k3x5tpx076"))}</span><span class="daq-th-inputs" data-v-3e78e101><input${ssrRenderAttr("value", unref(selectedDaqNode).warnLow)} type="number" step="any" class="daq-num" data-v-3e78e101> ~ <input${ssrRenderAttr("value", unref(selectedDaqNode).warnHigh)} type="number" step="any" class="daq-num" data-v-3e78e101></span></div><div class="daq-info-row" data-v-3e78e101><span data-v-3e78e101>${ssrInterpolate(_ctx.$t("townView.k1hjj0jf077"))}</span><span class="daq-th-inputs" data-v-3e78e101><input${ssrRenderAttr("value", unref(selectedDaqNode).min)} type="number" step="any" class="daq-num" data-v-3e78e101> ~ <input${ssrRenderAttr("value", unref(selectedDaqNode).max)} type="number" step="any" class="daq-num" data-v-3e78e101></span></div><div class="daq-info-row" data-v-3e78e101><span data-v-3e78e101>${ssrInterpolate(_ctx.$t("townView.k48tki078"))}</span><button class="${ssrRenderClass([{ warn: unref(selectedDaqNode).enabled }, "bind-add-btn"])}" data-v-3e78e101>${ssrInterpolate(unref(selectedDaqNode).enabled ? _ctx.$t("townView.k1wv0nyo150") : _ctx.$t("townView.kh1586b180"))}</button></div><div class="daq-info-row" data-v-3e78e101><span data-v-3e78e101>${ssrInterpolate(_ctx.$t("townView.k3xakp079"))}</span><button class="bind-add-btn danger"${ssrRenderAttr("title", _ctx.$t("townView.kpwutri014"))} data-v-3e78e101>${ssrInterpolate(_ctx.$t("townView.k1bpp30k080"))}</button></div></div>`);
2558
+ else _push(`<div class="ins-empty" data-v-3e78e101>${ssrInterpolate(_ctx.$t("townView.kzk5dfx081"))}</div>`);
2499
2559
  _push(`</div>`);
2500
2560
  } else {
2501
- _push(`<!--[--><div class="obj-row" data-v-5660e131><span class="obj-label" data-v-5660e131>${ssrInterpolate(_ctx.$t("townView.k3xhia082"))}</span><input${ssrRenderAttr("value", unref(objNameDraft))} class="obj-input"${ssrRenderAttr("placeholder", _ctx.$t("townView.k1k6vbaf015"))}${ssrIncludeBooleanAttr(unref(mode) !== "edit") ? " disabled" : ""}${ssrRenderAttr("title", unref(mode) === "edit" ? "设备名称" : "运行模式只读")} data-v-5660e131></div><div class="obj-row" data-v-5660e131><span class="obj-label" data-v-5660e131>${ssrInterpolate(_ctx.$t("townView.k41amp083"))}</span><select class="obj-select"${ssrRenderAttr("value", unref(scene3dRef)?.getDeviceModelRef?.(unref(selected).id) ?? "")}${ssrIncludeBooleanAttr(unref(mode) !== "edit") ? " disabled" : ""} data-v-5660e131><!--[-->`);
2561
+ _push(`<!--[--><div class="obj-row" data-v-3e78e101><span class="obj-label" data-v-3e78e101>${ssrInterpolate(_ctx.$t("townView.k3xhia082"))}</span><input${ssrRenderAttr("value", unref(objNameDraft))} class="obj-input"${ssrRenderAttr("placeholder", _ctx.$t("townView.k1k6vbaf015"))}${ssrIncludeBooleanAttr(unref(mode) !== "edit") ? " disabled" : ""}${ssrRenderAttr("title", unref(mode) === "edit" ? "设备名称" : "运行模式只读")} data-v-3e78e101></div><div class="obj-row" data-v-3e78e101><span class="obj-label" data-v-3e78e101>${ssrInterpolate(_ctx.$t("townView.k41amp083"))}</span><select class="obj-select"${ssrRenderAttr("value", unref(scene3dRef)?.getDeviceModelRef?.(unref(selected).id) ?? "")}${ssrIncludeBooleanAttr(unref(mode) !== "edit") ? " disabled" : ""} data-v-3e78e101><!--[-->`);
2502
2562
  ssrRenderList(unref(deviceModels), (m) => {
2503
- _push(`<option${ssrRenderAttr("value", m.id)} data-v-5660e131>${ssrInterpolate(m.name)}</option>`);
2563
+ _push(`<option${ssrRenderAttr("value", m.id)} data-v-3e78e101>${ssrInterpolate(m.name)}</option>`);
2504
2564
  });
2505
- _push(`<!--]--></select></div><div class="sect-hd" data-v-5660e131>${ssrInterpolate(_ctx.$t("townView.k1vtyk05130"))} ${ssrInterpolate(unref(boundDaqRows).length)} ${ssrInterpolate(_ctx.$t("townView.k3vfpz5138"))}</div><!--[-->`);
2565
+ _push(`<!--]--></select></div><div class="sect-hd" data-v-3e78e101>${ssrInterpolate(_ctx.$t("townView.k1vtyk05130"))} ${ssrInterpolate(unref(boundDaqRows).length)} ${ssrInterpolate(_ctx.$t("townView.k3vfpz5138"))}</div><!--[-->`);
2506
2566
  ssrRenderList(unref(boundDaqRows), (r) => {
2507
- _push(`<div class="bind-row" data-v-5660e131><span class="bind-ico" data-v-5660e131><svg class="bind-svg" viewBox="0 0 24 24" data-v-5660e131>${daqIcon(r.icon) ?? ""}</svg></span><span class="bind-meta" data-v-5660e131><span class="bind-label" data-v-5660e131>${ssrInterpolate(r.ch)}</span><span class="bind-val" data-v-5660e131><b data-v-5660e131>${ssrInterpolate(r.value)}</b> ${ssrInterpolate(r.unit)} · ${ssrInterpolate(r.name)}</span></span><canvas class="bind-spark" width="56" height="20" data-v-5660e131></canvas>`);
2508
- if (unref(mode) === "edit") _push(`<button class="bind-x"${ssrRenderAttr("title", _ctx.$t("townView.k1k73omv016"))} data-v-5660e131> ✕ </button>`);
2567
+ _push(`<div class="bind-row" data-v-3e78e101><span class="bind-ico" data-v-3e78e101>`);
2568
+ _push(ssrRenderComponent(_component_WorkshopDaqTemplateIcon, {
2569
+ class: "bind-svg",
2570
+ icon: r.icon
2571
+ }, null, _parent));
2572
+ _push(`</span><span class="bind-meta" data-v-3e78e101><span class="bind-label" data-v-3e78e101>${ssrInterpolate(r.ch)}</span><span class="bind-val" data-v-3e78e101><b data-v-3e78e101>${ssrInterpolate(r.value)}</b> ${ssrInterpolate(r.unit)} · ${ssrInterpolate(r.name)}</span></span><canvas class="bind-spark" width="56" height="20" data-v-3e78e101></canvas>`);
2573
+ if (unref(mode) === "edit") _push(`<button class="bind-x"${ssrRenderAttr("title", _ctx.$t("townView.k1k73omv016"))} data-v-3e78e101> ✕ </button>`);
2509
2574
  else _push(`<!---->`);
2510
2575
  _push(`</div>`);
2511
2576
  });
2512
2577
  _push(`<!--]-->`);
2513
- if (!unref(boundDaqRows).length) _push(`<div class="ins-empty" data-v-5660e131>${ssrInterpolate(_ctx.$t("townView.kgpuqhb084"))}</div>`);
2578
+ if (!unref(boundDaqRows).length) _push(`<div class="ins-empty" data-v-3e78e101>${ssrInterpolate(_ctx.$t("townView.kgpuqhb084"))}</div>`);
2514
2579
  else _push(`<!---->`);
2515
2580
  if (unref(mode) === "edit") {
2516
- _push(`<div class="bind-add-wrap" data-v-5660e131><button class="bind-add" data-v-5660e131>${ssrInterpolate(_ctx.$t("townView.kvm0lin085"))}</button>`);
2581
+ _push(`<div class="bind-add-wrap" data-v-3e78e101><button class="bind-add" data-v-3e78e101>${ssrInterpolate(_ctx.$t("townView.kvm0lin085"))}</button>`);
2517
2582
  if (unref(bindPopOpen)) {
2518
- _push(`<div class="bind-pop" style="${ssrRenderStyle({ maxHeight: `${unref(bindPopMaxH)}px` })}" data-v-5660e131><!--[-->`);
2583
+ _push(`<div class="bind-pop" style="${ssrRenderStyle({ maxHeight: `${unref(bindPopMaxH)}px` })}" data-v-3e78e101><!--[-->`);
2519
2584
  ssrRenderList(unref(daqTemplates), (tpl) => {
2520
2585
  _push(`<!--[-->`);
2521
2586
  if (unref(daqBindChoices)[tpl.id]?.length) {
2522
- _push(`<div class="bp-group" data-v-5660e131><span class="bp-tpl" data-v-5660e131>${ssrInterpolate(tpl.name)} · ${ssrInterpolate(tpl.ch)}</span><!--[-->`);
2587
+ _push(`<div class="bp-group" data-v-3e78e101><span class="bp-tpl" data-v-3e78e101>${ssrInterpolate(tpl.name)} · ${ssrInterpolate(tpl.ch)}</span><!--[-->`);
2523
2588
  ssrRenderList(unref(daqBindChoices)[tpl.id], (c) => {
2524
- _push(`<button${ssrRenderAttr("data-node-id", c.id)}${ssrRenderAttr("title", c.devName ? _ctx.$t("townView.k2bindr0007", { p0: c.devName }) : _ctx.$t("townView.k2bindr0008"))} data-v-5660e131><svg class="bind-svg" viewBox="0 0 24 24" data-v-5660e131>${daqIcon(c.tpl.icon) ?? ""}</svg><span data-v-5660e131>${ssrInterpolate(c.name)}`);
2525
- if (c.devName) _push(`<i class="bp-cur" data-v-5660e131>→ ${ssrInterpolate(c.devName)}</i>`);
2526
- else if (!c.placed) _push(`<i class="bp-cur" data-v-5660e131>${ssrInterpolate(_ctx.$t("townView.k2bindr0009"))}</i>`);
2589
+ _push(`<button${ssrRenderAttr("data-node-id", c.id)}${ssrRenderAttr("title", c.devName ? _ctx.$t("townView.k2bindr0007", { p0: c.devName }) : _ctx.$t("townView.k2bindr0008"))} data-v-3e78e101>`);
2590
+ _push(ssrRenderComponent(_component_WorkshopDaqTemplateIcon, {
2591
+ class: "bind-svg",
2592
+ icon: c.tpl.icon
2593
+ }, null, _parent));
2594
+ _push(`<span data-v-3e78e101>${ssrInterpolate(c.name)}`);
2595
+ if (c.devName) _push(`<i class="bp-cur" data-v-3e78e101>→ ${ssrInterpolate(c.devName)}</i>`);
2596
+ else if (!c.placed) _push(`<i class="bp-cur" data-v-3e78e101>${ssrInterpolate(_ctx.$t("townView.k2bindr0009"))}</i>`);
2527
2597
  else _push(`<!---->`);
2528
2598
  _push(`</span></button>`);
2529
2599
  });
@@ -2532,40 +2602,50 @@ var TownView_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineC
2532
2602
  _push(`<!--]-->`);
2533
2603
  });
2534
2604
  _push(`<!--]-->`);
2535
- if (!unref(daqBindChoiceCount)) _push(`<div class="bp-empty" data-v-5660e131>${ssrInterpolate(_ctx.$t("townView.k2bindr0010"))}</div>`);
2605
+ if (!unref(daqBindChoiceCount)) _push(`<div class="bp-empty" data-v-3e78e101>${ssrInterpolate(_ctx.$t("townView.k2bindr0010"))}</div>`);
2536
2606
  else _push(`<!---->`);
2537
2607
  _push(`</div>`);
2538
2608
  } else _push(`<!---->`);
2539
2609
  _push(`</div>`);
2540
2610
  } else _push(`<!---->`);
2541
- _push(`<div class="sect-hd" data-v-5660e131>${ssrInterpolate(_ctx.$t("townView.ktzir2t131"))} ${ssrInterpolate(unref(boundDcwRows).length)} ${ssrInterpolate(_ctx.$t("townView.k4l1w042"))}</div><!--[-->`);
2611
+ _push(`<div class="sect-hd" data-v-3e78e101>${ssrInterpolate(_ctx.$t("townView.ktzir2t131"))} ${ssrInterpolate(unref(boundDcwRows).length)} ${ssrInterpolate(_ctx.$t("townView.k4l1w042"))}</div><!--[-->`);
2542
2612
  ssrRenderList(unref(boundDcwRows), (r) => {
2543
- _push(`<div class="dcw-row" data-v-5660e131><div class="dcw-top" data-v-5660e131><span class="bind-ico" data-v-5660e131><svg class="bind-svg" viewBox="0 0 24 24" data-v-5660e131>${daqIcon(r.icon) ?? ""}</svg></span><span class="dcw-id" data-v-5660e131><span class="bind-label" data-v-5660e131>${ssrInterpolate(r.ch)}`);
2544
- if (r.rMin != null || r.rMax != null) _push(`<i class="dcw-tag" data-v-5660e131>${ssrInterpolate(_ctx.$t("townView.k48grv086"))}</i>`);
2613
+ _push(`<div class="dcw-row" data-v-3e78e101><div class="dcw-top" data-v-3e78e101><span class="bind-ico" data-v-3e78e101>`);
2614
+ _push(ssrRenderComponent(_component_WorkshopDaqTemplateIcon, {
2615
+ class: "bind-svg",
2616
+ icon: r.icon
2617
+ }, null, _parent));
2618
+ _push(`</span><span class="dcw-id" data-v-3e78e101><span class="bind-label" data-v-3e78e101>${ssrInterpolate(r.ch)}`);
2619
+ if (r.rMin != null || r.rMax != null) _push(`<i class="dcw-tag" data-v-3e78e101>${ssrInterpolate(_ctx.$t("townView.k48grv086"))}</i>`);
2545
2620
  else _push(`<!---->`);
2546
- _push(`</span><span class="dcw-name" data-v-5660e131>${ssrInterpolate(r.name)}</span></span><span class="dcw-cur" data-v-5660e131><b data-v-5660e131>${ssrInterpolate(r.value != null ? r.value.toFixed(r.decimals) : "--")}</b><i data-v-5660e131>${ssrInterpolate(r.unit)}</i></span>`);
2547
- if (unref(mode) === "edit") _push(`<button class="bind-x"${ssrRenderAttr("title", _ctx.$t("townView.k1k73omv016"))} data-v-5660e131> ✕ </button>`);
2621
+ _push(`</span><span class="dcw-name" data-v-3e78e101>${ssrInterpolate(r.name)}</span></span><span class="dcw-cur" data-v-3e78e101><b data-v-3e78e101>${ssrInterpolate(r.value != null ? r.value.toFixed(r.decimals) : "--")}</b><i data-v-3e78e101>${ssrInterpolate(r.unit)}</i></span>`);
2622
+ if (unref(mode) === "edit") _push(`<button class="bind-x"${ssrRenderAttr("title", _ctx.$t("townView.k1k73omv016"))} data-v-3e78e101> ✕ </button>`);
2548
2623
  else _push(`<!---->`);
2549
- _push(`</div><div class="${ssrRenderClass([{ recipe: r.rMin != null || r.rMax != null }, "dcw-win"])}" data-v-5660e131><em data-v-5660e131>${ssrInterpolate(r.rMin != null || r.rMax != null ? _ctx.$t("townView.k1l3m0hx151") : _ctx.$t("townView.k1bc6rqf181"))}</em><span class="dcw-win-num" data-v-5660e131>${ssrInterpolate(r.rMin ?? "-∞")}</span><span class="dcw-win-track" data-v-5660e131><i style="${ssrRenderStyle({ left: `${dcwMarkPct(r)}%` })}" data-v-5660e131></i></span><span class="dcw-win-num" data-v-5660e131>${ssrInterpolate(r.rMax ?? "+∞")}</span></div><div class="dcw-write" data-v-5660e131><input${ssrRenderAttr("value", unref(dcwWriteDrafts)[r.dcwId])} type="number"${ssrRenderAttr("step", 10 ** -r.decimals)}${ssrRenderAttr("placeholder", `${r.rMin ?? r.gMin} ~ ${r.rMax ?? r.gMax}`)} data-v-5660e131><button class="dcw-send"${ssrIncludeBooleanAttr(unref(dcwWriteDrafts)[r.dcwId] == null || unref(dcwWriteDrafts)[r.dcwId] === "") ? " disabled" : ""}${ssrRenderAttr("title", _ctx.$t("townView.k15t7izc017"))} data-v-5660e131> write </button></div>`);
2550
- if (unref(dcwWriteErrs)[r.dcwId]) _push(`<small class="dcw-err" data-v-5660e131>${ssrInterpolate(unref(dcwWriteErrs)[r.dcwId])}</small>`);
2624
+ _push(`</div><div class="${ssrRenderClass([{ recipe: r.rMin != null || r.rMax != null }, "dcw-win"])}" data-v-3e78e101><em data-v-3e78e101>${ssrInterpolate(r.rMin != null || r.rMax != null ? _ctx.$t("townView.k1l3m0hx151") : _ctx.$t("townView.k1bc6rqf181"))}</em><span class="dcw-win-num" data-v-3e78e101>${ssrInterpolate(r.rMin ?? "-∞")}</span><span class="dcw-win-track" data-v-3e78e101><i style="${ssrRenderStyle({ left: `${dcwMarkPct(r)}%` })}" data-v-3e78e101></i></span><span class="dcw-win-num" data-v-3e78e101>${ssrInterpolate(r.rMax ?? "+∞")}</span></div><div class="dcw-write" data-v-3e78e101><input${ssrRenderAttr("value", unref(dcwWriteDrafts)[r.dcwId])} type="number"${ssrRenderAttr("step", 10 ** -r.decimals)}${ssrRenderAttr("placeholder", `${r.rMin ?? r.gMin} ~ ${r.rMax ?? r.gMax}`)} data-v-3e78e101><button class="dcw-send"${ssrIncludeBooleanAttr(unref(dcwWriteDrafts)[r.dcwId] == null || unref(dcwWriteDrafts)[r.dcwId] === "") ? " disabled" : ""}${ssrRenderAttr("title", _ctx.$t("townView.k15t7izc017"))} data-v-3e78e101> write </button></div>`);
2625
+ if (unref(dcwWriteErrs)[r.dcwId]) _push(`<small class="dcw-err" data-v-3e78e101>${ssrInterpolate(unref(dcwWriteErrs)[r.dcwId])}</small>`);
2551
2626
  else _push(`<!---->`);
2552
2627
  _push(`</div>`);
2553
2628
  });
2554
2629
  _push(`<!--]-->`);
2555
- if (!unref(boundDcwRows).length) _push(`<div class="ins-empty" data-v-5660e131>${ssrInterpolate(_ctx.$t("townView.k10smf24087"))}</div>`);
2630
+ if (!unref(boundDcwRows).length) _push(`<div class="ins-empty" data-v-3e78e101>${ssrInterpolate(_ctx.$t("townView.k10smf24087"))}</div>`);
2556
2631
  else _push(`<!---->`);
2557
2632
  if (unref(mode) === "edit") {
2558
- _push(`<div class="bind-add-wrap" data-v-5660e131><button class="bind-add" data-v-5660e131>${ssrInterpolate(_ctx.$t("townView.kvk1vh5088"))}</button>`);
2633
+ _push(`<div class="bind-add-wrap" data-v-3e78e101><button class="bind-add" data-v-3e78e101>${ssrInterpolate(_ctx.$t("townView.kvk1vh5088"))}</button>`);
2559
2634
  if (unref(dcwBindPopOpen)) {
2560
- _push(`<div class="bind-pop" style="${ssrRenderStyle({ maxHeight: `${unref(bindPopMaxH)}px` })}" data-v-5660e131><!--[-->`);
2635
+ _push(`<div class="bind-pop" style="${ssrRenderStyle({ maxHeight: `${unref(bindPopMaxH)}px` })}" data-v-3e78e101><!--[-->`);
2561
2636
  ssrRenderList(unref(dcwTemplates), (tpl) => {
2562
2637
  _push(`<!--[-->`);
2563
2638
  if (unref(dcwBindChoices)[tpl.id]?.length) {
2564
- _push(`<div class="bp-group" data-v-5660e131><span class="bp-tpl" data-v-5660e131>${ssrInterpolate(tpl.name)} · ${ssrInterpolate(tpl.ch)}</span><!--[-->`);
2639
+ _push(`<div class="bp-group" data-v-3e78e101><span class="bp-tpl" data-v-3e78e101>${ssrInterpolate(tpl.name)} · ${ssrInterpolate(tpl.ch)}</span><!--[-->`);
2565
2640
  ssrRenderList(unref(dcwBindChoices)[tpl.id], (c) => {
2566
- _push(`<button${ssrRenderAttr("data-node-id", c.id)}${ssrRenderAttr("title", c.devName ? _ctx.$t("townView.k2bindr0007", { p0: c.devName }) : _ctx.$t("townView.k2bindr0008"))} data-v-5660e131><svg class="bind-svg" viewBox="0 0 24 24" data-v-5660e131>${daqIcon(c.tpl.icon) ?? ""}</svg><span data-v-5660e131>${ssrInterpolate(c.name)}`);
2567
- if (c.devName) _push(`<i class="bp-cur" data-v-5660e131>→ ${ssrInterpolate(c.devName)}</i>`);
2568
- else if (!c.placed) _push(`<i class="bp-cur" data-v-5660e131>${ssrInterpolate(_ctx.$t("townView.k2bindr0009"))}</i>`);
2641
+ _push(`<button${ssrRenderAttr("data-node-id", c.id)}${ssrRenderAttr("title", c.devName ? _ctx.$t("townView.k2bindr0007", { p0: c.devName }) : _ctx.$t("townView.k2bindr0008"))} data-v-3e78e101>`);
2642
+ _push(ssrRenderComponent(_component_WorkshopDaqTemplateIcon, {
2643
+ class: "bind-svg",
2644
+ icon: c.tpl.icon
2645
+ }, null, _parent));
2646
+ _push(`<span data-v-3e78e101>${ssrInterpolate(c.name)}`);
2647
+ if (c.devName) _push(`<i class="bp-cur" data-v-3e78e101>→ ${ssrInterpolate(c.devName)}</i>`);
2648
+ else if (!c.placed) _push(`<i class="bp-cur" data-v-3e78e101>${ssrInterpolate(_ctx.$t("townView.k2bindr0009"))}</i>`);
2569
2649
  else _push(`<!---->`);
2570
2650
  _push(`</span></button>`);
2571
2651
  });
@@ -2574,121 +2654,123 @@ var TownView_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineC
2574
2654
  _push(`<!--]-->`);
2575
2655
  });
2576
2656
  _push(`<!--]-->`);
2577
- if (!unref(dcwBindChoiceCount)) _push(`<div class="bp-empty" data-v-5660e131>${ssrInterpolate(_ctx.$t("townView.k2bindr0010"))}</div>`);
2657
+ if (!unref(dcwBindChoiceCount)) _push(`<div class="bp-empty" data-v-3e78e101>${ssrInterpolate(_ctx.$t("townView.k2bindr0010"))}</div>`);
2578
2658
  else _push(`<!---->`);
2579
2659
  _push(`</div>`);
2580
2660
  } else _push(`<!---->`);
2581
2661
  _push(`</div>`);
2582
2662
  } else _push(`<!---->`);
2583
- if (unref(mode) === "edit") _push(`<!--[--><div class="sect-hd" data-v-5660e131> 变换 · BLENDER </div><div class="xz-seg" data-v-5660e131><button class="${ssrRenderClass([{ on: unref(tMode) === "translate" }, "seg-btn"])}" data-v-5660e131>${ssrInterpolate(_ctx.$t("townView.k1hg3167089"))}</button><button class="${ssrRenderClass([{ on: unref(tMode) === "rotate" }, "seg-btn"])}" data-v-5660e131>${ssrInterpolate(_ctx.$t("townView.k1enlg7i090"))}</button><button class="${ssrRenderClass([{ on: unref(tMode) === "scale" }, "seg-btn"])}" data-v-5660e131>${ssrInterpolate(_ctx.$t("townView.k1ibjg3j091"))}</button></div><div class="scale-row" data-v-5660e131><span class="scale-min" data-v-5660e131>0.2×</span><input class="scale-range" type="range" min="0.2" max="5" step="0.05"${ssrRenderAttr("value", unref(selected).scale)} data-v-5660e131><span class="scale-max" data-v-5660e131>5×</span></div><div class="scale-val" data-v-5660e131>${ssrInterpolate(Math.round(unref(selected).scale * 100))}% </div><div class="ins-foot" data-v-5660e131><button class="${ssrRenderClass([{ armed: unref(deviceDeleteArmed) === unref(selected).id }, "btn btn-danger ins-del"])}" data-v-5660e131>${ssrInterpolate(unref(deviceDeleteArmed) === unref(selected).id ? _ctx.$t("townView.k1w10xa5152") : _ctx.$t("townView.k121kfef182"))}</button></div><!--]-->`);
2584
- else _push(`<div class="ins-empty" data-v-5660e131>${ssrInterpolate(_ctx.$t("townView.kt0i3y2092"))}</div>`);
2663
+ if (unref(mode) === "edit") _push(`<!--[--><div class="sect-hd" data-v-3e78e101> 变换 · BLENDER </div><div class="xz-seg" data-v-3e78e101><button class="${ssrRenderClass([{ on: unref(tMode) === "translate" }, "seg-btn"])}" data-v-3e78e101>${ssrInterpolate(_ctx.$t("townView.k1hg3167089"))}</button><button class="${ssrRenderClass([{ on: unref(tMode) === "rotate" }, "seg-btn"])}" data-v-3e78e101>${ssrInterpolate(_ctx.$t("townView.k1enlg7i090"))}</button><button class="${ssrRenderClass([{ on: unref(tMode) === "scale" }, "seg-btn"])}" data-v-3e78e101>${ssrInterpolate(_ctx.$t("townView.k1ibjg3j091"))}</button></div><div class="scale-row" data-v-3e78e101><span class="scale-min" data-v-3e78e101>0.2×</span><input class="scale-range" type="range" min="0.2" max="5" step="0.05"${ssrRenderAttr("value", unref(selected).scale)} data-v-3e78e101><span class="scale-max" data-v-3e78e101>5×</span></div><div class="scale-val" data-v-3e78e101>${ssrInterpolate(Math.round(unref(selected).scale * 100))}% </div><div class="ins-foot" data-v-3e78e101><button class="${ssrRenderClass([{ armed: unref(deviceDeleteArmed) === unref(selected).id }, "btn btn-danger ins-del"])}" data-v-3e78e101>${ssrInterpolate(unref(deviceDeleteArmed) === unref(selected).id ? _ctx.$t("townView.k1w10xa5152") : _ctx.$t("townView.k121kfef182"))}</button></div><!--]-->`);
2664
+ else _push(`<div class="ins-empty" data-v-3e78e101>${ssrInterpolate(_ctx.$t("townView.kt0i3y2092"))}</div>`);
2585
2665
  _push(`<!--]-->`);
2586
2666
  }
2587
2667
  _push(`<!--]-->`);
2588
2668
  } else if (unref(selected).kind === "agent") {
2589
- _push(`<!--[--><div class="chat-id-row" data-v-5660e131><span class="chat-badge" style="${ssrRenderStyle({ "--p-acc": unref(agentChatColor) })}" data-v-5660e131>${ssrInterpolate(unref(agentChatTitle).slice(0, 1).toUpperCase())}</span><div class="chat-nameplate" data-v-5660e131><span class="chat-name" data-v-5660e131>${ssrInterpolate(unref(agentChatTitle))}</span><span class="chat-meta" data-v-5660e131><span class="${ssrRenderClass([unref(selectedAgentMeta)?.role === "lead" ? "r-lead" : "r-worker", "chat-role"])}" data-v-5660e131>${ssrInterpolate(unref(selectedAgentRoleTag))}</span><span class="${ssrRenderClass([`s-${unref(selectedAgentMeta)?.state ?? "idle"}`, "chat-state"])}" data-v-5660e131>${ssrInterpolate(unref(agentChatStateLabel))}</span>`);
2590
- if (unref(selectedAgentMeta)?.harness) _push(`<span class="chat-harness" data-v-5660e131>${ssrInterpolate(unref(selectedAgentMeta).harness.toUpperCase())}</span>`);
2669
+ _push(`<!--[--><div class="chat-id-row" data-v-3e78e101><span class="chat-badge" style="${ssrRenderStyle({ "--p-acc": unref(agentChatColor) })}" data-v-3e78e101>${ssrInterpolate(unref(agentChatTitle).slice(0, 1).toUpperCase())}</span><div class="chat-nameplate" data-v-3e78e101><span class="chat-name" data-v-3e78e101>${ssrInterpolate(unref(agentChatTitle))}</span><span class="chat-meta" data-v-3e78e101><span class="${ssrRenderClass([unref(selectedAgentMeta)?.role === "lead" ? "r-lead" : "r-worker", "chat-role"])}" data-v-3e78e101>${ssrInterpolate(unref(selectedAgentRoleTag))}</span><span class="${ssrRenderClass([`s-${unref(selectedAgentMeta)?.state ?? "idle"}`, "chat-state"])}" data-v-3e78e101>${ssrInterpolate(unref(agentChatStateLabel))}</span>`);
2670
+ if (unref(selectedAgentMeta)?.harness) _push(`<span class="chat-harness" data-v-3e78e101>${ssrInterpolate(unref(selectedAgentMeta).harness.toUpperCase())}</span>`);
2591
2671
  else _push(`<!---->`);
2592
- _push(`<span class="chat-count" data-v-5660e131>${ssrInterpolate(unref(agentHistory).length + unref(agentChatRows).length)} ${ssrInterpolate(_ctx.$t("townView.k4dfq040"))}</span></span></div></div><div class="obj-row" data-v-5660e131><span class="obj-label" data-v-5660e131>${ssrInterpolate(_ctx.$t("townView.k41amp083"))}</span><select class="obj-select"${ssrRenderAttr("value", (unref(scene3dRef)?.getAgentModel?.(unref(selected).id) ?? "") || "hero-3d")}${ssrIncludeBooleanAttr(unref(mode) !== "edit") ? " disabled" : ""} data-v-5660e131><!--[-->`);
2672
+ _push(`<span class="chat-count" data-v-3e78e101>${ssrInterpolate(unref(agentHistory).length + unref(agentChatRows).length)} ${ssrInterpolate(_ctx.$t("townView.k4dfq040"))}</span></span></div></div><div class="obj-row" data-v-3e78e101><span class="obj-label" data-v-3e78e101>${ssrInterpolate(_ctx.$t("townView.k41amp083"))}</span><select class="obj-select"${ssrRenderAttr("value", (unref(scene3dRef)?.getAgentModel?.(unref(selected).id) ?? "") || "hero-3d")}${ssrIncludeBooleanAttr(unref(mode) !== "edit") ? " disabled" : ""} data-v-3e78e101><!--[-->`);
2593
2673
  ssrRenderList(unref(agentModels), (m) => {
2594
- _push(`<option${ssrRenderAttr("value", m.id)} data-v-5660e131>${ssrInterpolate(m.name)}</option>`);
2674
+ _push(`<option${ssrRenderAttr("value", m.id)} data-v-3e78e101>${ssrInterpolate(m.name)}</option>`);
2595
2675
  });
2596
- _push(`<!--]--></select></div><div class="obj-sep" data-v-5660e131></div><div class="obj-row" data-v-5660e131><span class="obj-label" data-v-5660e131>${ssrInterpolate(_ctx.$t("townView.k1fix3hb093"))}</span><span class="range-status" data-v-5660e131>${ssrInterpolate(unref(agentRangeStatusText))}</span>`);
2597
- if (unref(mode) === "edit") _push(`<button class="${ssrRenderClass([{ on: unref(agentDrawingRange) }, "obj-mini"])}"${ssrRenderAttr("title", _ctx.$t("townView.k13enoy3018"))} data-v-5660e131>${ssrInterpolate(unref(agentDrawingRange) ? _ctx.$t("townView.k3slzhc153") : _ctx.$t("townView.k1f1xmci183"))}</button>`);
2676
+ _push(`<!--]--></select></div><div class="obj-sep" data-v-3e78e101></div><div class="obj-row" data-v-3e78e101><span class="obj-label" data-v-3e78e101>${ssrInterpolate(_ctx.$t("townView.k1fix3hb093"))}</span><span class="range-status" data-v-3e78e101>${ssrInterpolate(unref(agentRangeStatusText))}</span>`);
2677
+ if (unref(mode) === "edit") _push(`<button class="${ssrRenderClass([{ on: unref(agentDrawingRange) }, "obj-mini"])}"${ssrRenderAttr("title", _ctx.$t("townView.k13enoy3018"))} data-v-3e78e101>${ssrInterpolate(unref(agentDrawingRange) ? _ctx.$t("townView.k3slzhc153") : _ctx.$t("townView.k1f1xmci183"))}</button>`);
2598
2678
  else _push(`<!---->`);
2599
- _push(`</div><div class="obj-sep" data-v-5660e131></div><div class="sect-hd" data-v-5660e131>${ssrInterpolate(_ctx.$t("townView.k1p7nru2094"))}</div><!--[-->`);
2679
+ _push(`</div><div class="obj-sep" data-v-3e78e101></div><div class="sect-hd" data-v-3e78e101>${ssrInterpolate(_ctx.$t("townView.k1p7nru2094"))}</div><!--[-->`);
2600
2680
  ssrRenderList(unref(agentBindings), (b) => {
2601
- _push(`<div class="bind-row" data-v-5660e131><span class="${ssrRenderClass([b.kind === "dcw" ? "accent" : "", "ins-chip"])}" style="${ssrRenderStyle({ "flex": "none" })}" data-v-5660e131>${ssrInterpolate(b.kind === "dcw" ? _ctx.$t("townView.k40ifw097") : _ctx.$t("townView.k40rjw098"))}</span><span class="bind-meta" data-v-5660e131><span class="bind-label" data-v-5660e131>${ssrInterpolate(bindingNodeName(b))}</span><select class="bind-select" style="${ssrRenderStyle({ "margin-top": "3px" })}"${ssrRenderAttr("value", b.mode)}${ssrRenderAttr("title", _ctx.$t("townView.khqvwix019"))} data-v-5660e131><option value="auto" data-v-5660e131>${ssrInterpolate(_ctx.$t("townView.k1io1ylm095"))}</option><option value="manual" data-v-5660e131>${ssrInterpolate(_ctx.$t("townView.k1duyr8q096"))}</option></select></span><button class="bind-x"${ssrRenderAttr("title", _ctx.$t("townView.k1k73omv016"))} data-v-5660e131> ✕ </button></div>`);
2681
+ _push(`<div class="bind-row" data-v-3e78e101><span class="${ssrRenderClass([b.kind === "dcw" ? "accent" : "", "ins-chip"])}" style="${ssrRenderStyle({ "flex": "none" })}" data-v-3e78e101>${ssrInterpolate(b.kind === "dcw" ? _ctx.$t("townView.k40ifw097") : _ctx.$t("townView.k40rjw098"))}</span><span class="bind-meta" data-v-3e78e101><span class="bind-label" data-v-3e78e101>${ssrInterpolate(bindingNodeName(b))}</span><select class="bind-select" style="${ssrRenderStyle({ "margin-top": "3px" })}"${ssrRenderAttr("value", b.mode)}${ssrRenderAttr("title", _ctx.$t("townView.khqvwix019"))} data-v-3e78e101><option value="auto" data-v-3e78e101>${ssrInterpolate(_ctx.$t("townView.k1io1ylm095"))}</option><option value="manual" data-v-3e78e101>${ssrInterpolate(_ctx.$t("townView.k1duyr8q096"))}</option></select></span><button class="bind-x"${ssrRenderAttr("title", _ctx.$t("townView.k1k73omv016"))} data-v-3e78e101> ✕ </button></div>`);
2602
2682
  });
2603
2683
  _push(`<!--]-->`);
2604
- if (!unref(agentBindings).length) _push(`<div class="ins-empty" data-v-5660e131> 未绑定工业节点 —— 绑定后 Agent 可用 dcw_control / daq_query 工具 </div>`);
2684
+ if (!unref(agentBindings).length) _push(`<div class="ins-empty" data-v-3e78e101> 未绑定工业节点 —— 绑定后 Agent 可用 dcw_control / daq_query 工具 </div>`);
2605
2685
  else _push(`<!---->`);
2606
2686
  if (unref(mode) === "edit") {
2607
- _push(`<div class="daq-bind-bar" style="${ssrRenderStyle({ "margin-bottom": "8px" })}" data-v-5660e131><select class="bind-select" style="${ssrRenderStyle({
2687
+ _push(`<div class="daq-bind-bar" style="${ssrRenderStyle({ "margin-bottom": "8px" })}" data-v-3e78e101><select class="bind-select" style="${ssrRenderStyle({
2608
2688
  "flex": "none",
2609
2689
  "width": "62px"
2610
- })}" data-v-5660e131><option value="dcw" data-v-5660e131${ssrIncludeBooleanAttr(Array.isArray(unref(agentBindKind)) ? ssrLooseContain(unref(agentBindKind), "dcw") : ssrLooseEqual(unref(agentBindKind), "dcw")) ? " selected" : ""}>${ssrInterpolate(_ctx.$t("townView.k40ifw097"))}</option><option value="daq" data-v-5660e131${ssrIncludeBooleanAttr(Array.isArray(unref(agentBindKind)) ? ssrLooseContain(unref(agentBindKind), "daq") : ssrLooseEqual(unref(agentBindKind), "daq")) ? " selected" : ""}>${ssrInterpolate(_ctx.$t("townView.k40rjw098"))}</option></select><select class="bind-select" data-v-5660e131><option value="" data-v-5660e131${ssrIncludeBooleanAttr(Array.isArray(unref(agentBindNodeId)) ? ssrLooseContain(unref(agentBindNodeId), "") : ssrLooseEqual(unref(agentBindNodeId), "")) ? " selected" : ""}>${ssrInterpolate(_ctx.$t("townView.kurjldk099"))}</option>`);
2690
+ })}" data-v-3e78e101><option value="dcw" data-v-3e78e101${ssrIncludeBooleanAttr(Array.isArray(unref(agentBindKind)) ? ssrLooseContain(unref(agentBindKind), "dcw") : ssrLooseEqual(unref(agentBindKind), "dcw")) ? " selected" : ""}>${ssrInterpolate(_ctx.$t("townView.k40ifw097"))}</option><option value="daq" data-v-3e78e101${ssrIncludeBooleanAttr(Array.isArray(unref(agentBindKind)) ? ssrLooseContain(unref(agentBindKind), "daq") : ssrLooseEqual(unref(agentBindKind), "daq")) ? " selected" : ""}>${ssrInterpolate(_ctx.$t("townView.k40rjw098"))}</option></select><select class="bind-select" data-v-3e78e101><option value="" data-v-3e78e101${ssrIncludeBooleanAttr(Array.isArray(unref(agentBindNodeId)) ? ssrLooseContain(unref(agentBindNodeId), "") : ssrLooseEqual(unref(agentBindNodeId), "")) ? " selected" : ""}>${ssrInterpolate(_ctx.$t("townView.kurjldk099"))}</option>`);
2611
2691
  if (unref(agentBindKind) === "dcw") {
2612
2692
  _push(`<!--[-->`);
2613
2693
  ssrRenderList(unref(dcw).nodes, (n) => {
2614
- _push(`<option${ssrRenderAttr("value", n.id)} data-v-5660e131${ssrIncludeBooleanAttr(Array.isArray(unref(agentBindNodeId)) ? ssrLooseContain(unref(agentBindNodeId), n.id) : ssrLooseEqual(unref(agentBindNodeId), n.id)) ? " selected" : ""}>${ssrInterpolate(n.name)}</option>`);
2694
+ _push(`<option${ssrRenderAttr("value", n.id)} data-v-3e78e101${ssrIncludeBooleanAttr(Array.isArray(unref(agentBindNodeId)) ? ssrLooseContain(unref(agentBindNodeId), n.id) : ssrLooseEqual(unref(agentBindNodeId), n.id)) ? " selected" : ""}>${ssrInterpolate(n.name)}</option>`);
2615
2695
  });
2616
2696
  _push(`<!--]-->`);
2617
2697
  } else {
2618
2698
  _push(`<!--[-->`);
2619
2699
  ssrRenderList(unref(daq).nodes, (n) => {
2620
- _push(`<option${ssrRenderAttr("value", n.id)} data-v-5660e131${ssrIncludeBooleanAttr(Array.isArray(unref(agentBindNodeId)) ? ssrLooseContain(unref(agentBindNodeId), n.id) : ssrLooseEqual(unref(agentBindNodeId), n.id)) ? " selected" : ""}>${ssrInterpolate(n.name)}</option>`);
2700
+ _push(`<option${ssrRenderAttr("value", n.id)} data-v-3e78e101${ssrIncludeBooleanAttr(Array.isArray(unref(agentBindNodeId)) ? ssrLooseContain(unref(agentBindNodeId), n.id) : ssrLooseEqual(unref(agentBindNodeId), n.id)) ? " selected" : ""}>${ssrInterpolate(n.name)}</option>`);
2621
2701
  });
2622
2702
  _push(`<!--]-->`);
2623
2703
  }
2624
2704
  _push(`</select><select class="bind-select" style="${ssrRenderStyle({
2625
2705
  "flex": "none",
2626
2706
  "width": "76px"
2627
- })}" data-v-5660e131><option value="auto" data-v-5660e131${ssrIncludeBooleanAttr(Array.isArray(unref(agentBindMode)) ? ssrLooseContain(unref(agentBindMode), "auto") : ssrLooseEqual(unref(agentBindMode), "auto")) ? " selected" : ""}>${ssrInterpolate(_ctx.$t("townView.k45kpj100"))}</option><option value="manual" data-v-5660e131${ssrIncludeBooleanAttr(Array.isArray(unref(agentBindMode)) ? ssrLooseContain(unref(agentBindMode), "manual") : ssrLooseEqual(unref(agentBindMode), "manual")) ? " selected" : ""}>${ssrInterpolate(_ctx.$t("townView.k3zul4101"))}</option></select><button class="bind-add-btn"${ssrIncludeBooleanAttr(!unref(agentBindNodeId)) ? " disabled" : ""} data-v-5660e131>${ssrInterpolate(_ctx.$t("townView.k452a8102"))}</button></div>`);
2707
+ })}" data-v-3e78e101><option value="auto" data-v-3e78e101${ssrIncludeBooleanAttr(Array.isArray(unref(agentBindMode)) ? ssrLooseContain(unref(agentBindMode), "auto") : ssrLooseEqual(unref(agentBindMode), "auto")) ? " selected" : ""}>${ssrInterpolate(_ctx.$t("townView.k45kpj100"))}</option><option value="manual" data-v-3e78e101${ssrIncludeBooleanAttr(Array.isArray(unref(agentBindMode)) ? ssrLooseContain(unref(agentBindMode), "manual") : ssrLooseEqual(unref(agentBindMode), "manual")) ? " selected" : ""}>${ssrInterpolate(_ctx.$t("townView.k3zul4101"))}</option></select><button class="bind-add-btn"${ssrIncludeBooleanAttr(!unref(agentBindNodeId)) ? " disabled" : ""} data-v-3e78e101>${ssrInterpolate(_ctx.$t("townView.k452a8102"))}</button></div>`);
2628
2708
  } else _push(`<!---->`);
2629
2709
  if (unref(pendingApprovals).length) {
2630
- _push(`<!--[--><div class="sect-hd" style="${ssrRenderStyle({ "color": "var(--hud-amber)" })}" data-v-5660e131>${ssrInterpolate(_ctx.$t("townView.k1gk2jg7132"))} ${ssrInterpolate(unref(pendingApprovals).length)}</div><!--[-->`);
2710
+ _push(`<!--[--><div class="sect-hd" style="${ssrRenderStyle({ "color": "var(--hud-amber)" })}" data-v-3e78e101>${ssrInterpolate(_ctx.$t("townView.k1gk2jg7132"))} ${ssrInterpolate(unref(pendingApprovals).length)}</div><!--[-->`);
2631
2711
  ssrRenderList(unref(pendingApprovals), (ap) => {
2632
- _push(`<div class="approval-card" data-v-5660e131><div class="approval-detail" data-v-5660e131>${ssrInterpolate(ap.detail)}</div><div class="${ssrRenderClass([{ urgent: approvalRemainingSec(ap) <= 30 }, "approval-ttl"])}" data-v-5660e131> ⏱ ${ssrInterpolate(approvalRemainingSec(ap))}s ${ssrInterpolate(_ctx.$t("townView.hitlAutoReject"))}</div><input${ssrRenderAttr("value", unref(approvalComments)[ap.id])} class="dcw-write input-inline" style="${ssrRenderStyle({
2712
+ _push(`<div class="approval-card" data-v-3e78e101><div class="approval-detail" data-v-3e78e101>${ssrInterpolate(ap.detail)}</div><div class="${ssrRenderClass([{ urgent: approvalRemainingSec(ap) <= 30 }, "approval-ttl"])}" data-v-3e78e101> ⏱ ${ssrInterpolate(approvalRemainingSec(ap))}s ${ssrInterpolate(_ctx.$t("townView.hitlAutoReject"))}</div><input${ssrRenderAttr("value", unref(approvalComments)[ap.id])} class="dcw-write input-inline" style="${ssrRenderStyle({
2633
2713
  "width": "100%",
2634
2714
  "margin-top": "5px"
2635
- })}"${ssrRenderAttr("placeholder", _ctx.$t("townView.keztqrn020"))} data-v-5660e131><div class="daq-bind-bar" style="${ssrRenderStyle({ "margin-top": "5px" })}" data-v-5660e131><button class="bind-add-btn" data-v-5660e131>${ssrInterpolate(_ctx.$t("townView.kslcozu103"))}</button><button class="bind-add-btn danger" data-v-5660e131>${ssrInterpolate(_ctx.$t("townView.k14gu3rd104"))}</button></div></div>`);
2715
+ })}"${ssrRenderAttr("placeholder", _ctx.$t("townView.keztqrn020"))} data-v-3e78e101><div class="daq-bind-bar" style="${ssrRenderStyle({ "margin-top": "5px" })}" data-v-3e78e101><button class="bind-add-btn" data-v-3e78e101>${ssrInterpolate(_ctx.$t("townView.kslcozu103"))}</button><button class="bind-add-btn danger" data-v-3e78e101>${ssrInterpolate(_ctx.$t("townView.k14gu3rd104"))}</button></div></div>`);
2636
2716
  });
2637
2717
  _push(`<!--]--><!--]-->`);
2638
2718
  } else _push(`<!---->`);
2639
- if (unref(agentRangeDraft) && unref(mode) === "edit") _push(`<!--[--><div class="obj-row" data-v-5660e131><span class="obj-label" data-v-5660e131>${ssrInterpolate(_ctx.$t("townView.k3zhy5048"))}</span><div class="bp-seg" data-v-5660e131><button class="${ssrRenderClass([{ on: unref(agentRangeDraft).shape === "ellipse" }, "seg-btn"])}" data-v-5660e131>${ssrInterpolate(_ctx.$t("townView.k414bc049"))}</button><button class="${ssrRenderClass([{ on: unref(agentRangeDraft).shape === "rect" }, "seg-btn"])}" data-v-5660e131>${ssrInterpolate(_ctx.$t("townView.k43u0g050"))}</button></div></div><div class="obj-row" data-v-5660e131><span class="obj-label" data-v-5660e131>${ssrInterpolate(_ctx.$t("townView.k41lwj105"))}</span><input${ssrRenderAttr("value", unref(agentRangeDraft).radiusX)} class="obj-range" type="range" min="40" max="4000" step="8" data-v-5660e131><span class="bp-val" data-v-5660e131>${ssrInterpolate(Math.round(unref(agentRangeDraft).radiusX))}</span></div><div class="obj-row" data-v-5660e131><span class="obj-label" data-v-5660e131>${ssrInterpolate(_ctx.$t("townView.k45bta106"))}</span><input${ssrRenderAttr("value", unref(agentRangeDraft).radiusZ)} class="obj-range" type="range" min="40" max="4000" step="8" data-v-5660e131><span class="bp-val" data-v-5660e131>${ssrInterpolate(Math.round(unref(agentRangeDraft).radiusZ))}</span></div><button class="obj-mini danger" data-v-5660e131>${ssrInterpolate(_ctx.$t("townView.k1w45mzc107"))}</button><!--]-->`);
2640
- else _push(`<div class="ins-empty" data-v-5660e131>${ssrInterpolate(_ctx.$t("townView.k14s8urm108"))}</div>`);
2641
- _push(`<div class="obj-sep" data-v-5660e131></div><div class="sect-hd chat-sect" data-v-5660e131>${ssrInterpolate(_ctx.$t("townView.k1ghjbfc133"))} ${ssrInterpolate(unref(agentChatTitle))} <button class="mini-btn chat-refresh"${ssrRenderAttr("title", _ctx.$t("townView.k15avt7g021"))} data-v-5660e131>${ssrInterpolate(unref(historyLoading) ? "…" : "↻")}</button></div><div class="rpg-lines chat-embed" data-v-5660e131>`);
2642
- if (unref(historyLoading)) _push(`<div class="rpg-note" data-v-5660e131>${ssrInterpolate(_ctx.$t("townView.kkhlx5h109"))}</div>`);
2719
+ if (unref(agentRangeDraft) && unref(mode) === "edit") _push(`<!--[--><div class="obj-row" data-v-3e78e101><span class="obj-label" data-v-3e78e101>${ssrInterpolate(_ctx.$t("townView.k3zhy5048"))}</span><div class="bp-seg" data-v-3e78e101><button class="${ssrRenderClass([{ on: unref(agentRangeDraft).shape === "ellipse" }, "seg-btn"])}" data-v-3e78e101>${ssrInterpolate(_ctx.$t("townView.k414bc049"))}</button><button class="${ssrRenderClass([{ on: unref(agentRangeDraft).shape === "rect" }, "seg-btn"])}" data-v-3e78e101>${ssrInterpolate(_ctx.$t("townView.k43u0g050"))}</button></div></div><div class="obj-row" data-v-3e78e101><span class="obj-label" data-v-3e78e101>${ssrInterpolate(_ctx.$t("townView.k41lwj105"))}</span><input${ssrRenderAttr("value", unref(agentRangeDraft).radiusX)} class="obj-range" type="range" min="40" max="4000" step="8" data-v-3e78e101><span class="bp-val" data-v-3e78e101>${ssrInterpolate(Math.round(unref(agentRangeDraft).radiusX))}</span></div><div class="obj-row" data-v-3e78e101><span class="obj-label" data-v-3e78e101>${ssrInterpolate(_ctx.$t("townView.k45bta106"))}</span><input${ssrRenderAttr("value", unref(agentRangeDraft).radiusZ)} class="obj-range" type="range" min="40" max="4000" step="8" data-v-3e78e101><span class="bp-val" data-v-3e78e101>${ssrInterpolate(Math.round(unref(agentRangeDraft).radiusZ))}</span></div><button class="obj-mini danger" data-v-3e78e101>${ssrInterpolate(_ctx.$t("townView.k1w45mzc107"))}</button><!--]-->`);
2720
+ else _push(`<div class="ins-empty" data-v-3e78e101>${ssrInterpolate(_ctx.$t("townView.k14s8urm108"))}</div>`);
2721
+ _push(`<div class="obj-sep" data-v-3e78e101></div><div class="sect-hd chat-sect" data-v-3e78e101>${ssrInterpolate(_ctx.$t("townView.k1ghjbfc133"))} ${ssrInterpolate(unref(agentChatTitle))} <button class="mini-btn chat-refresh"${ssrRenderAttr("title", _ctx.$t("townView.k15avt7g021"))} data-v-3e78e101>${ssrInterpolate(unref(historyLoading) ? "…" : "↻")}</button></div><div class="rpg-lines chat-embed" data-v-3e78e101>`);
2722
+ if (unref(historyLoading)) _push(`<div class="rpg-note" data-v-3e78e101>${ssrInterpolate(_ctx.$t("townView.kkhlx5h109"))}</div>`);
2643
2723
  else _push(`<!---->`);
2644
2724
  if (unref(agentHistory).length) {
2645
- _push(`<!--[--><div class="rpg-divider" data-v-5660e131>${ssrInterpolate(_ctx.$t("townView.k768cnt134"))} ${ssrInterpolate(unref(agentHistory).length)}</div><!--[-->`);
2725
+ _push(`<!--[--><div class="rpg-divider" data-v-3e78e101>${ssrInterpolate(_ctx.$t("townView.k768cnt134"))} ${ssrInterpolate(unref(agentHistory).length)}</div><!--[-->`);
2646
2726
  ssrRenderList(unref(agentHistory), (r) => {
2647
- _push(`<div class="rpg-line hist" data-v-5660e131><span class="rpg-time" data-v-5660e131>${ssrInterpolate(fmtTime(r.at))}</span><div class="rpg-bubble" data-v-5660e131>`);
2648
- if (chatKindLabel(r.kind)) _push(`<span class="${ssrRenderClass([`k-${r.kind}`, "rpg-kind"])}" data-v-5660e131>${ssrInterpolate(chatKindLabel(r.kind))}</span>`);
2727
+ _push(`<div class="rpg-line hist" data-v-3e78e101><span class="rpg-time" data-v-3e78e101>${ssrInterpolate(fmtTime(r.at))}</span><div class="rpg-bubble" data-v-3e78e101>`);
2728
+ if (chatKindLabel(r.kind)) _push(`<span class="${ssrRenderClass([`k-${r.kind}`, "rpg-kind"])}" data-v-3e78e101>${ssrInterpolate(chatKindLabel(r.kind))}</span>`);
2649
2729
  else _push(`<!---->`);
2650
- _push(`<span class="rpg-text" data-v-5660e131>${ssrInterpolate(r.text)}</span></div></div>`);
2730
+ _push(`<span class="rpg-text" data-v-3e78e101>${ssrInterpolate(r.text)}</span></div></div>`);
2651
2731
  });
2652
2732
  _push(`<!--]--><!--]-->`);
2653
2733
  } else _push(`<!---->`);
2654
- if (unref(agentChatRows).length) _push(`<div class="rpg-divider live" data-v-5660e131>${ssrInterpolate(_ctx.$t("townView.k1cwz73k135"))} ${ssrInterpolate(unref(agentChatRows).length)}</div>`);
2734
+ if (unref(agentChatRows).length) _push(`<div class="rpg-divider live" data-v-3e78e101>${ssrInterpolate(_ctx.$t("townView.k1cwz73k135"))} ${ssrInterpolate(unref(agentChatRows).length)}</div>`);
2655
2735
  else _push(`<!---->`);
2656
2736
  _push(`<!--[-->`);
2657
2737
  ssrRenderList(unref(agentChatRows), (r) => {
2658
- _push(`<div class="rpg-line live" data-v-5660e131><span class="rpg-time" data-v-5660e131>${ssrInterpolate(fmtTime(r.at))}</span><div class="rpg-bubble" data-v-5660e131><span class="rpg-text" data-v-5660e131>${ssrInterpolate(r.text)}</span></div></div>`);
2738
+ _push(`<div class="rpg-line live" data-v-3e78e101><span class="rpg-time" data-v-3e78e101>${ssrInterpolate(fmtTime(r.at))}</span><div class="rpg-bubble" data-v-3e78e101><span class="rpg-text" data-v-3e78e101>${ssrInterpolate(r.text)}</span></div></div>`);
2659
2739
  });
2660
2740
  _push(`<!--]-->`);
2661
- if (unref(selectedAgentMeta)?.state === "busy") _push(`<div class="rpg-typing" data-v-5660e131><span class="ty-dot" data-v-5660e131></span><span class="ty-dot" data-v-5660e131></span><span class="ty-dot" data-v-5660e131></span><span class="ty-label" data-v-5660e131>${ssrInterpolate(_ctx.$t("townView.k3o5tz9110"))}</span></div>`);
2741
+ if (unref(selectedAgentMeta)?.state === "busy") _push(`<div class="rpg-typing" data-v-3e78e101><span class="ty-dot" data-v-3e78e101></span><span class="ty-dot" data-v-3e78e101></span><span class="ty-dot" data-v-3e78e101></span><span class="ty-label" data-v-3e78e101>${ssrInterpolate(_ctx.$t("townView.k3o5tz9110"))}</span></div>`);
2662
2742
  else _push(`<!---->`);
2663
- if (!unref(historyLoading) && !unref(agentHistory).length && !unref(agentChatRows).length) _push(`<div class="rpg-note" data-v-5660e131>${ssrInterpolate(_ctx.$t("townView.k1qkqld7111"))}</div>`);
2743
+ if (!unref(historyLoading) && !unref(agentHistory).length && !unref(agentChatRows).length) _push(`<div class="rpg-note" data-v-3e78e101>${ssrInterpolate(_ctx.$t("townView.k1qkqld7111"))}</div>`);
2664
2744
  else _push(`<!---->`);
2665
2745
  _push(`</div><!--]-->`);
2666
2746
  } else _push(`<!---->`);
2667
2747
  _push(`</section>`);
2668
2748
  } else _push(`<!---->`);
2669
- _push(`<section class="panel" data-v-5660e131><div class="panel-hd" data-v-5660e131><h3 data-v-5660e131>${ssrInterpolate(_ctx.$t("townView.k17dkhgd112"))}</h3></div><div class="health-body" data-v-5660e131><div class="donut-wrap" data-v-5660e131><canvas width="118" height="118" data-v-5660e131></canvas><div class="donut-center" data-v-5660e131><b style="${ssrRenderStyle({ color: unref(healthTone) })}" data-v-5660e131>${ssrInterpolate(unref(healthPct))}%</b><span data-v-5660e131>${ssrInterpolate(_ctx.$t("townView.k7h1nxo113"))}</span></div></div><div class="health-legend" data-v-5660e131><div class="hl-row" data-v-5660e131><span class="hl-dot" style="${ssrRenderStyle({ background: "var(--hud-accent)" })}" data-v-5660e131></span> ${ssrInterpolate(_ctx.$t("townView.k3vp67i114"))} <span class="n" data-v-5660e131>${ssrInterpolate(unref(runningCount))}</span></div><div class="hl-row" data-v-5660e131><span class="hl-dot" style="${ssrRenderStyle({ background: "var(--hud-amber)" })}" data-v-5660e131></span> ${ssrInterpolate(_ctx.$t("townView.k3zcvb115"))} <span class="n" data-v-5660e131>${ssrInterpolate(unref(idleCount))}</span></div><div class="hl-row" data-v-5660e131><span class="hl-dot" style="${ssrRenderStyle({ background: "var(--hud-danger)" })}" data-v-5660e131></span> ${ssrInterpolate(_ctx.$t("townView.k3xmid116"))} <span class="n" data-v-5660e131>${ssrInterpolate(unref(alarmCount))}</span></div><div class="hl-row" data-v-5660e131><span class="hl-dot" style="${ssrRenderStyle({ background: "#3a4a63" })}" data-v-5660e131></span> ${ssrInterpolate(_ctx.$t("townView.statesOffline"))} <span class="n" data-v-5660e131>${ssrInterpolate(unref(offlineCount))}</span></div></div></div></section><section class="panel" data-v-5660e131><div class="panel-hd" data-v-5660e131><h3 data-v-5660e131>${ssrInterpolate(_ctx.$t("townView.k1q247fn117"))}</h3><span class="panel-tag" data-v-5660e131>${ssrInterpolate(unref(deviceTwins).twins.length)}</span></div>`);
2749
+ _push(`<section class="panel" data-v-3e78e101><div class="panel-hd" data-v-3e78e101><h3 data-v-3e78e101>${ssrInterpolate(_ctx.$t("townView.k17dkhgd112"))}</h3></div><div class="health-body" data-v-3e78e101><div class="donut-wrap" data-v-3e78e101><canvas width="118" height="118" data-v-3e78e101></canvas><div class="donut-center" data-v-3e78e101><b style="${ssrRenderStyle({ color: unref(healthTone) })}" data-v-3e78e101>${ssrInterpolate(unref(healthPct))}%</b><span data-v-3e78e101>${ssrInterpolate(_ctx.$t("townView.k7h1nxo113"))}</span></div></div><div class="health-legend" data-v-3e78e101><div class="hl-row" data-v-3e78e101><span class="hl-dot" style="${ssrRenderStyle({ background: "var(--hud-accent)" })}" data-v-3e78e101></span> ${ssrInterpolate(_ctx.$t("townView.k3vp67i114"))} <span class="n" data-v-3e78e101>${ssrInterpolate(unref(runningCount))}</span></div><div class="hl-row" data-v-3e78e101><span class="hl-dot" style="${ssrRenderStyle({ background: "var(--hud-amber)" })}" data-v-3e78e101></span> ${ssrInterpolate(_ctx.$t("townView.k3zcvb115"))} <span class="n" data-v-3e78e101>${ssrInterpolate(unref(idleCount))}</span></div><div class="hl-row" data-v-3e78e101><span class="hl-dot" style="${ssrRenderStyle({ background: "var(--hud-danger)" })}" data-v-3e78e101></span> ${ssrInterpolate(_ctx.$t("townView.k3xmid116"))} <span class="n" data-v-3e78e101>${ssrInterpolate(unref(alarmCount))}</span></div><div class="hl-row" data-v-3e78e101><span class="hl-dot" style="${ssrRenderStyle({ background: "#3a4a63" })}" data-v-3e78e101></span> ${ssrInterpolate(_ctx.$t("townView.statesOffline"))} <span class="n" data-v-3e78e101>${ssrInterpolate(unref(offlineCount))}</span></div></div></div></section><section class="panel" data-v-3e78e101><div class="panel-hd" data-v-3e78e101><h3 data-v-3e78e101>${ssrInterpolate(_ctx.$t("townView.k1q247fn117"))}</h3><span class="panel-tag" data-v-3e78e101>${ssrInterpolate(unref(deviceTwins).twins.length)}</span></div>`);
2670
2750
  _push(ssrRenderComponent(_component_WorkshopDeviceTwinPanel, {
2671
2751
  class: "kd-embed",
2672
2752
  "daq-live": unref(daqLive),
2673
2753
  "dcw-live": unref(dcwLive),
2674
2754
  onFocusDevice
2675
2755
  }, null, _parent));
2676
- _push(`</section><section class="panel" data-v-5660e131><div class="panel-hd" data-v-5660e131><h3 data-v-5660e131>${ssrInterpolate(_ctx.$t("townView.k1cxf749118"))}</h3><span class="panel-tag" data-v-5660e131>${ssrInterpolate(unref(activeAlarmCount))} ${ssrInterpolate(_ctx.$t("townView.k4dfq040"))}</span><button class="mini-btn"${ssrRenderAttr("title", _ctx.$t("townView.k1bkswpz022"))} data-v-5660e131> ✓ </button></div><div class="alarm-list" data-v-5660e131><!--[-->`);
2756
+ _push(`</section><section class="panel" data-v-3e78e101><div class="panel-hd" data-v-3e78e101><h3 data-v-3e78e101>${ssrInterpolate(_ctx.$t("townView.k1cxf749118"))}</h3><span class="panel-tag" data-v-3e78e101>${ssrInterpolate(unref(activeAlarmCount))} ${ssrInterpolate(_ctx.$t("townView.k4dfq040"))}</span><button class="mini-btn"${ssrRenderAttr("title", _ctx.$t("townView.k1bkswpz022"))} data-v-3e78e101> ✓ </button></div><div class="alarm-list" data-v-3e78e101><!--[-->`);
2677
2757
  ssrRenderList(unref(alarms).slice(0, 8), (a) => {
2678
- _push(`<div class="al-row" data-v-5660e131><span class="${ssrRenderClass([a.state === 2 ? "info" : a.state === 1 ? "warn" : "crit", "al-ico"])}" data-v-5660e131><svg class="al-svg" viewBox="0 0 24 24" data-v-5660e131><path d="M12 3 22 20H2L12 3Z" data-v-5660e131></path><path d="M12 10v4M12 17v.2" data-v-5660e131></path></svg></span><div class="al-body" data-v-5660e131><div class="al-txt" data-v-5660e131>${ssrInterpolate(a.txt)}</div><div class="al-src" data-v-5660e131>${ssrInterpolate(a.src)} · ${ssrInterpolate(a.time)}</div></div><button class="${ssrRenderClass([`s${a.state}`, "al-state"])}" data-v-5660e131>${ssrInterpolate(ALARM_STATES[a.state])}</button></div>`);
2758
+ _push(`<div class="al-row" data-v-3e78e101><span class="${ssrRenderClass([a.state === 2 ? "info" : a.state === 1 ? "warn" : "crit", "al-ico"])}" data-v-3e78e101><svg class="al-svg" viewBox="0 0 24 24" data-v-3e78e101><path d="M12 3 22 20H2L12 3Z" data-v-3e78e101></path><path d="M12 10v4M12 17v.2" data-v-3e78e101></path></svg></span><div class="al-body" data-v-3e78e101><div class="al-txt" data-v-3e78e101>${ssrInterpolate(a.txt)}</div><div class="al-src" data-v-3e78e101>${ssrInterpolate(a.src)} · ${ssrInterpolate(a.time)}</div></div><button class="${ssrRenderClass([`s${a.state}`, "al-state"])}" data-v-3e78e101>${ssrInterpolate(ALARM_STATES[a.state])}</button></div>`);
2679
2759
  });
2680
2760
  _push(`<!--]-->`);
2681
- if (!unref(alarms).length) _push(`<div class="rail-empty" data-v-5660e131><svg class="re-ico" viewBox="0 0 24 24" data-v-5660e131><path d="M12 3l7 3v5c0 4.6-3 8.2-7 10-4-1.8-7-5.4-7-10V6l7-3Z" data-v-5660e131></path><path d="m9.2 12.2 2 2 3.6-4" data-v-5660e131></path></svg><span data-v-5660e131>${ssrInterpolate(_ctx.$t("townView.kjz544r119"))}</span></div>`);
2761
+ if (!unref(alarms).length) _push(`<div class="rail-empty" data-v-3e78e101><svg class="re-ico" viewBox="0 0 24 24" data-v-3e78e101><path d="M12 3l7 3v5c0 4.6-3 8.2-7 10-4-1.8-7-5.4-7-10V6l7-3Z" data-v-3e78e101></path><path d="m9.2 12.2 2 2 3.6-4" data-v-3e78e101></path></svg><span data-v-3e78e101>${ssrInterpolate(_ctx.$t("townView.kjz544r119"))}</span></div>`);
2682
2762
  else _push(`<!---->`);
2683
- _push(`</div></section><section class="panel" data-v-5660e131><div class="panel-hd" data-v-5660e131><h3 data-v-5660e131>${ssrInterpolate(_ctx.$t("townView.k1cxdtq2120"))}</h3><span class="panel-tag" data-v-5660e131>${ssrInterpolate(unref(ticker).length)}</span></div><div class="event-list" data-v-5660e131><!--[-->`);
2684
- ssrRenderList([...unref(ticker)].reverse(), (t, i) => {
2685
- _push(`<div class="event-row" data-v-5660e131><span class="ev-time" data-v-5660e131>${ssrInterpolate(fmtTime(t.at))}</span><span class="ev-name"${ssrRenderAttr("title", t.agentName)} data-v-5660e131>${ssrInterpolate(t.agentName)}</span><span class="ev-text"${ssrRenderAttr("title", t.text)} data-v-5660e131>${ssrInterpolate(t.text)}</span></div>`);
2763
+ _push(`</div></section><section class="panel" data-v-3e78e101><div class="panel-hd" data-v-3e78e101><h3 data-v-3e78e101>${ssrInterpolate(_ctx.$t("townView.k1cxdtq2120"))}</h3><span class="panel-tag" data-v-3e78e101>${ssrInterpolate(unref(ticker).length)}</span></div><div class="event-list" data-v-3e78e101><!--[-->`);
2764
+ ssrRenderList([...unref(ticker)].reverse(), (ev, i) => {
2765
+ _push(`<div class="event-row" data-v-3e78e101><span class="ev-time" data-v-3e78e101>${ssrInterpolate(fmtTime(ev.at))}</span><span class="ev-name"${ssrRenderAttr("title", ev.agentName)} data-v-3e78e101>${ssrInterpolate(ev.agentName)}</span><span class="ev-text"${ssrRenderAttr("title", ev.text)} data-v-3e78e101>${ssrInterpolate(ev.text)}</span></div>`);
2686
2766
  });
2687
2767
  _push(`<!--]-->`);
2688
- if (!unref(ticker).length) _push(`<div class="rail-empty" data-v-5660e131><svg class="re-ico" viewBox="0 0 24 24" data-v-5660e131><path d="M3 12h3l2.5-6 4 12L15 12h6" data-v-5660e131></path></svg><span data-v-5660e131>${ssrInterpolate(_ctx.$t("townView.k2uk6ua121"))}</span></div>`);
2768
+ if (!unref(ticker).length) _push(`<div class="rail-empty" data-v-3e78e101><svg class="re-ico" viewBox="0 0 24 24" data-v-3e78e101><path d="M3 12h3l2.5-6 4 12L15 12h6" data-v-3e78e101></path></svg><span data-v-3e78e101>${ssrInterpolate(_ctx.$t("townView.k2uk6ua121"))}</span></div>`);
2769
+ else _push(`<!---->`);
2770
+ _push(`</div></section><section class="panel" data-v-3e78e101><div class="panel-hd" data-v-3e78e101><h3 data-v-3e78e101>${ssrInterpolate(_ctx.$t("townView.kjug2jq122"))}</h3></div><div class="mm-body" data-v-3e78e101><div class="mm-wrap"${ssrRenderAttr("title", _ctx.$t("townView.klfwiqg023"))} data-v-3e78e101><canvas class="nav-cv" data-v-3e78e101></canvas></div><div class="mm-col" data-v-3e78e101><button class="vp-tool"${ssrRenderAttr("title", _ctx.$t("townView.k1lap9bs024"))} data-v-3e78e101><svg class="vp-svg" viewBox="0 0 24 24" data-v-3e78e101><path d="M3 12a9 9 0 1 0 3-6.7M3 4v5h5" data-v-3e78e101></path></svg></button><button class="vp-tool"${ssrRenderAttr("title", _ctx.$t("townView.kav8a8k025"))} data-v-3e78e101><svg class="vp-svg" viewBox="0 0 24 24" data-v-3e78e101><circle cx="11" cy="11" r="6.5" data-v-3e78e101></circle><path d="m16 16 4.5 4.5M8.5 11h5" data-v-3e78e101></path></svg></button><button class="vp-tool"${ssrRenderAttr("title", _ctx.$t("townView.k1u7uce9026"))} data-v-3e78e101><svg class="vp-svg" viewBox="0 0 24 24" data-v-3e78e101><circle cx="11" cy="11" r="6.5" data-v-3e78e101></circle><path d="m16 16 4.5 4.5M8.5 11h5M11 8.5v5" data-v-3e78e101></path></svg></button></div></div><div class="mm-meta mono" data-v-3e78e101>${ssrInterpolate(_ctx.$t("townView.k1gaaodq136"))}${ssrInterpolate(unref(navScale).toFixed(1))} · ${ssrInterpolate(unref(minimap)?.devices?.length ?? 0)} ${ssrInterpolate(_ctx.$t("townView.k47e16126"))}</div></section></aside></div><footer class="statusbar" data-v-3e78e101><span data-v-3e78e101><span class="${ssrRenderClass([{ red: unref(conn).state !== "open" }, "sb-dot"])}" data-v-3e78e101></span>${ssrInterpolate(_ctx.$t("townView.k1i4g246123"))} <b data-v-3e78e101>${ssrInterpolate(unref(conn).state === "open" ? _ctx.$t("townView.k41k5c154") : unref(syncing) ? _ctx.$t("townView.k3lmtk3184") : _ctx.$t("townView.k44c2n186"))}</b></span><span class="sb-stats" data-v-3e78e101>${ssrInterpolate(_ctx.$t("townView.k4a0jt124"))} <b data-v-3e78e101>${ssrInterpolate(unref(blockCount))}</b><i data-v-3e78e101>·</i>${ssrInterpolate(_ctx.$t("townView.k3xdvm125"))} <b data-v-3e78e101>${ssrInterpolate(unref(agentCount))}</b><i data-v-3e78e101>·</i>${ssrInterpolate(_ctx.$t("townView.k47e16126"))} <b data-v-3e78e101>${ssrInterpolate(unref(deviceCount))}</b></span><span class="sb-lat mono" data-v-3e78e101>${ssrInterpolate(unref(fps))} FPS </span><span class="copy" data-v-3e78e101> © 2026 ABO · DIGITAL TWIN · ${ssrInterpolate(_ctx.$t("townView.k1h5gxpf137"))}</span></footer>`);
2771
+ if (unref(sheetOpen)) _push(`<div class="sheet-mask" data-v-3e78e101></div>`);
2689
2772
  else _push(`<!---->`);
2690
- _push(`</div></section><section class="panel" data-v-5660e131><div class="panel-hd" data-v-5660e131><h3 data-v-5660e131>${ssrInterpolate(_ctx.$t("townView.kjug2jq122"))}</h3></div><div class="mm-body" data-v-5660e131><div class="mm-wrap"${ssrRenderAttr("title", _ctx.$t("townView.klfwiqg023"))} data-v-5660e131><canvas class="nav-cv" data-v-5660e131></canvas></div><div class="mm-col" data-v-5660e131><button class="vp-tool"${ssrRenderAttr("title", _ctx.$t("townView.k1lap9bs024"))} data-v-5660e131><svg class="vp-svg" viewBox="0 0 24 24" data-v-5660e131><path d="M3 12a9 9 0 1 0 3-6.7M3 4v5h5" data-v-5660e131></path></svg></button><button class="vp-tool"${ssrRenderAttr("title", _ctx.$t("townView.kav8a8k025"))} data-v-5660e131><svg class="vp-svg" viewBox="0 0 24 24" data-v-5660e131><circle cx="11" cy="11" r="6.5" data-v-5660e131></circle><path d="m16 16 4.5 4.5M8.5 11h5" data-v-5660e131></path></svg></button><button class="vp-tool"${ssrRenderAttr("title", _ctx.$t("townView.k1u7uce9026"))} data-v-5660e131><svg class="vp-svg" viewBox="0 0 24 24" data-v-5660e131><circle cx="11" cy="11" r="6.5" data-v-5660e131></circle><path d="m16 16 4.5 4.5M8.5 11h5M11 8.5v5" data-v-5660e131></path></svg></button></div></div><div class="mm-meta mono" data-v-5660e131>${ssrInterpolate(_ctx.$t("townView.k1gaaodq136"))}${ssrInterpolate(unref(navScale).toFixed(1))} · ${ssrInterpolate(unref(minimap)?.devices?.length ?? 0)} ${ssrInterpolate(_ctx.$t("townView.k47e16126"))}</div></section></aside></div><footer class="statusbar" data-v-5660e131><span data-v-5660e131><span class="${ssrRenderClass([{ red: unref(conn).state !== "open" }, "sb-dot"])}" data-v-5660e131></span>${ssrInterpolate(_ctx.$t("townView.k1i4g246123"))} <b data-v-5660e131>${ssrInterpolate(unref(conn).state === "open" ? _ctx.$t("townView.k41k5c154") : unref(syncing) ? _ctx.$t("townView.k3lmtk3184") : _ctx.$t("townView.k44c2n186"))}</b></span><span class="sb-stats" data-v-5660e131>${ssrInterpolate(_ctx.$t("townView.k4a0jt124"))} <b data-v-5660e131>${ssrInterpolate(unref(blockCount))}</b><i data-v-5660e131>·</i>${ssrInterpolate(_ctx.$t("townView.k3xdvm125"))} <b data-v-5660e131>${ssrInterpolate(unref(agentCount))}</b><i data-v-5660e131>·</i>${ssrInterpolate(_ctx.$t("townView.k47e16126"))} <b data-v-5660e131>${ssrInterpolate(unref(deviceCount))}</b></span><span class="sb-lat mono" data-v-5660e131>${ssrInterpolate(unref(fps))} FPS </span><span class="copy" data-v-5660e131> © 2026 ABO · DIGITAL TWIN · ${ssrInterpolate(_ctx.$t("townView.k1h5gxpf137"))}</span></footer>`);
2691
- if (!unref(ready)) _push(`<div data-hud="town-loading" class="loading-mask" data-v-5660e131><div class="loading-spinner" data-v-5660e131></div><span class="loading-text" data-v-5660e131>${ssrInterpolate(_ctx.$t("townView.kvjdqfg059"))}</span></div>`);
2773
+ if (!unref(ready)) _push(`<div data-hud="town-loading" class="loading-mask" data-v-3e78e101><div class="loading-spinner" data-v-3e78e101></div><span class="loading-text" data-v-3e78e101>${ssrInterpolate(_ctx.$t("townView.kvjdqfg059"))}</span></div>`);
2692
2774
  else _push(`<!---->`);
2693
2775
  _push(`</div>`);
2694
2776
  };
@@ -2702,7 +2784,7 @@ TownView_vue_vue_type_script_setup_true_lang_default.setup = (props, ctx) => {
2702
2784
  (ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("components/workshop/town/TownView.vue");
2703
2785
  return _sfc_setup ? _sfc_setup(props, ctx) : void 0;
2704
2786
  };
2705
- var TownView_default = /*#__PURE__*/ Object.assign(_plugin_vue_export_helper_default(TownView_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-5660e131"]]), { __name: "WorkshopTownView" });
2787
+ var TownView_default = /*#__PURE__*/ Object.assign(_plugin_vue_export_helper_default(TownView_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-3e78e101"]]), { __name: "WorkshopTownView" });
2706
2788
 
2707
2789
  export { TownView_default as T, useStorage as u };
2708
- //# sourceMappingURL=TownView-jVazYOjN.mjs.map
2790
+ //# sourceMappingURL=TownView-BuLAsmpR.mjs.map