agentworkshop 0.6.1 → 0.7.1

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 (537) hide show
  1. package/.AgentWorkShop/prompts/host-tools.json +17 -0
  2. package/.env.example +37 -0
  3. package/.output/.AgentWorkShop/prompts/host-tools.json +17 -0
  4. package/.output/nitro.json +1 -1
  5. package/.output/public/_nuxt/{Bc_mM2cU.js → BH0Z05CS.js} +1 -1
  6. package/.output/public/_nuxt/Bxgaym6j.js +1 -0
  7. package/.output/public/_nuxt/{DRlJ2-4p.js → By-LNp3k.js} +1 -1
  8. package/.output/public/_nuxt/{C2QSTAWf.js → Bz40vyZS.js} +1 -1
  9. package/.output/public/_nuxt/{CwS_UHeH.js → CS8R0_J3.js} +1 -1
  10. package/.output/public/_nuxt/{ClptO7LA.js → CUxV8Bw_.js} +1 -1
  11. package/.output/public/_nuxt/CXmkVXS5.js +1 -0
  12. package/.output/public/_nuxt/DC-QMEk1.js +2 -0
  13. package/.output/public/_nuxt/{C-Y5ydB6.js → Dgp2wK2U.js} +6 -6
  14. package/.output/public/_nuxt/{Ck6tznoQ.js → DjqcbFBE.js} +1 -1
  15. package/.output/public/_nuxt/{B0haAGoq.js → GP2wXyuY.js} +1 -1
  16. package/.output/public/_nuxt/TownView.Bt33bo1M.css +1 -0
  17. package/.output/public/_nuxt/{MhK4buEJ.js → XVB9_zwP.js} +1 -1
  18. package/.output/public/_nuxt/_id_.BeqSLvl_.css +1 -0
  19. package/.output/public/_nuxt/builds/latest.json +1 -1
  20. package/.output/public/_nuxt/builds/meta/0f65fbec-c4c0-45de-9c50-bb41ada375e5.json +1 -0
  21. package/.output/public/_nuxt/{Bq_KKxCg.js → i_MKObHo.js} +1 -1
  22. package/.output/public/_nuxt/settings.DeRNNUcP.css +1 -0
  23. package/.output/public/_nuxt/{CclO6GyL.js → tpDMVY5w.js} +1 -1
  24. package/.output/public/_nuxt/{C0FogB-p.js → zwdqvGN_.js} +1 -1
  25. package/.output/server/chunks/_/nitro.mjs +2674 -2347
  26. package/.output/server/chunks/_/nitro.mjs.map +1 -1
  27. package/.output/server/chunks/build/{TownView-D9yCQe1T.mjs → TownView-BkHxMiwZ.mjs} +168 -159
  28. package/.output/server/chunks/build/{TownView-D9yCQe1T.mjs.map → TownView-BkHxMiwZ.mjs.map} +1 -1
  29. package/.output/server/chunks/build/{_id_-xR3AChMO.mjs → _id_-Bna1_JuB.mjs} +5 -4
  30. package/.output/server/chunks/build/_id_-Bna1_JuB.mjs.map +1 -0
  31. package/.output/server/chunks/build/{_id_-CmKAEFHV.mjs → _id_-GnRJPykX.mjs} +161 -119
  32. package/.output/server/chunks/build/_id_-GnRJPykX.mjs.map +1 -0
  33. package/.output/server/chunks/build/{_wsId_-C45nVrl-.mjs → _wsId_-CzLDGT_V.mjs} +6 -5
  34. package/.output/server/chunks/build/{_wsId_-C45nVrl-.mjs.map → _wsId_-CzLDGT_V.mjs.map} +1 -1
  35. package/.output/server/chunks/build/agents-D4l1icvn.mjs +1 -0
  36. package/.output/server/chunks/build/agents-D4l1icvn.mjs.map +1 -1
  37. package/.output/server/chunks/build/channel-templates-DqjtC-R0.mjs +1 -0
  38. package/.output/server/chunks/build/channel-templates-DqjtC-R0.mjs.map +1 -1
  39. package/.output/server/chunks/build/{daq-Boz_dlAQ.mjs → daq-D_W59QOe.mjs} +6 -5
  40. package/.output/server/chunks/build/daq-D_W59QOe.mjs.map +1 -0
  41. package/.output/server/chunks/build/{dcw-wTRwBAUi.mjs → dcw-BTM5YU-B.mjs} +3 -2
  42. package/.output/server/chunks/build/dcw-BTM5YU-B.mjs.map +1 -0
  43. package/.output/server/chunks/build/default-Dt6xLdpd.mjs +1 -0
  44. package/.output/server/chunks/build/{logs-Cdi-eXlN.mjs → logs-CUQt1z7D.mjs} +4 -3
  45. package/.output/server/chunks/build/logs-CUQt1z7D.mjs.map +1 -0
  46. package/.output/server/chunks/build/monitor-yNoV98rf.mjs +1 -0
  47. package/.output/server/chunks/build/{pages-bWKy0ZsA.mjs → pages-DR2bzczM.mjs} +4 -3
  48. package/.output/server/chunks/build/pages-DR2bzczM.mjs.map +1 -0
  49. package/.output/server/chunks/build/plugins-B-ZNey0Z.mjs +1 -0
  50. package/.output/server/chunks/build/plugins-B-ZNey0Z.mjs.map +1 -1
  51. package/.output/server/chunks/build/{settings-C3T5hR2A.mjs → settings-Cr06lbRy.mjs} +26 -18
  52. package/.output/server/chunks/build/settings-Cr06lbRy.mjs.map +1 -0
  53. package/.output/server/chunks/build/teams-QR3BBF7A.mjs +1 -0
  54. package/.output/server/chunks/build/teams-QR3BBF7A.mjs.map +1 -1
  55. package/.output/server/chunks/build/tokens-DFvr_TLj.mjs +1 -0
  56. package/.output/server/chunks/build/tokens-DFvr_TLj.mjs.map +1 -1
  57. package/.output/server/chunks/build/{town-CKg6Qxba.mjs → town-BN4vQPb8.mjs} +6 -5
  58. package/.output/server/chunks/build/town-BN4vQPb8.mjs.map +1 -0
  59. package/.output/server/chunks/build/town-BUqRobze.mjs +1 -0
  60. package/.output/server/chunks/build/town-BUqRobze.mjs.map +1 -1
  61. package/.output/server/chunks/build/{useDaqStream-zHEptJQ_.mjs → useDaqStream-hwkhJHFU.mjs} +2 -2
  62. package/.output/server/chunks/build/{useDaqStream-zHEptJQ_.mjs.map → useDaqStream-hwkhJHFU.mjs.map} +1 -1
  63. package/.output/server/chunks/build/{useDcwStream-BkWDGaWp.mjs → useDcwStream-Bdew_yrr.mjs} +16 -1
  64. package/.output/server/chunks/build/useDcwStream-Bdew_yrr.mjs.map +1 -0
  65. package/.output/server/chunks/build/{useDeviceTwins-NhtXqSkU.mjs → useDeviceTwins-C6EBg9oN.mjs} +2 -2
  66. package/.output/server/chunks/build/{useDeviceTwins-NhtXqSkU.mjs.map → useDeviceTwins-C6EBg9oN.mjs.map} +1 -1
  67. package/.output/server/chunks/build/{useOpsLog-CU64VDg5.mjs → useOpsLog-DdCqKVVG.mjs} +2 -2
  68. package/.output/server/chunks/build/{useOpsLog-CU64VDg5.mjs.map → useOpsLog-DdCqKVVG.mjs.map} +1 -1
  69. package/.output/server/chunks/build/users-4FZ0yFUO.mjs +1 -0
  70. package/.output/server/chunks/build/users-4FZ0yFUO.mjs.map +1 -1
  71. package/.output/server/chunks/build/workshop-CLhwe5eo.mjs +1 -0
  72. package/.output/server/chunks/build/workshop-CLhwe5eo.mjs.map +1 -1
  73. package/.output/server/chunks/routes/api/health.get.mjs +1 -0
  74. package/.output/server/chunks/routes/api/health.get.mjs.map +1 -1
  75. package/.output/server/chunks/routes/api/index.get.mjs +1 -0
  76. package/.output/server/chunks/routes/api/index.get.mjs.map +1 -1
  77. package/.output/server/chunks/routes/api/index.post.mjs +1 -0
  78. package/.output/server/chunks/routes/api/index.post.mjs.map +1 -1
  79. package/.output/server/chunks/routes/api/mcp/workshop.mjs +1 -0
  80. package/.output/server/chunks/routes/api/mcp/workshop.mjs.map +1 -1
  81. package/.output/server/chunks/routes/api/metrics.mjs +1 -0
  82. package/.output/server/chunks/routes/api/metrics.mjs.map +1 -1
  83. package/.output/server/chunks/routes/api/plugins/_name/_...path_.mjs +1 -0
  84. package/.output/server/chunks/routes/api/plugins/_name/_...path_.mjs.map +1 -1
  85. package/.output/server/chunks/routes/api/plugins/client/_name_.get.mjs +1 -0
  86. package/.output/server/chunks/routes/api/plugins/client/_name_.get.mjs.map +1 -1
  87. package/.output/server/chunks/routes/api/plugins/manifest.get.mjs +1 -0
  88. package/.output/server/chunks/routes/api/plugins/manifest.get.mjs.map +1 -1
  89. package/.output/server/chunks/routes/api/system/config.get.mjs +1 -0
  90. package/.output/server/chunks/routes/api/system/config.get.mjs.map +1 -1
  91. package/.output/server/chunks/routes/api/system/index.get.mjs +1 -0
  92. package/.output/server/chunks/routes/api/system/index.get.mjs.map +1 -1
  93. package/.output/server/chunks/routes/api/system/index.patch.mjs +1 -0
  94. package/.output/server/chunks/routes/api/system/index.patch.mjs.map +1 -1
  95. package/.output/server/chunks/routes/api/system/monitor/terminal/ws.mjs +1 -0
  96. package/.output/server/chunks/routes/api/system/monitor/terminal/ws.mjs.map +1 -1
  97. package/.output/server/chunks/routes/api/system/monitor/terminate.post.mjs +1 -0
  98. package/.output/server/chunks/routes/api/system/monitor/terminate.post.mjs.map +1 -1
  99. package/.output/server/chunks/routes/api/system/monitor.get.mjs +1 -0
  100. package/.output/server/chunks/routes/api/system/monitor.get.mjs.map +1 -1
  101. package/.output/server/chunks/routes/api/system/settings/events.get.mjs +1 -0
  102. package/.output/server/chunks/routes/api/system/settings/events.get.mjs.map +1 -1
  103. package/.output/server/chunks/routes/api/system/settings/reset.post.mjs +1 -0
  104. package/.output/server/chunks/routes/api/system/settings/reset.post.mjs.map +1 -1
  105. package/.output/server/chunks/routes/api/users/_id_.delete.mjs +1 -0
  106. package/.output/server/chunks/routes/api/users/_id_.delete.mjs.map +1 -1
  107. package/.output/server/chunks/routes/api/users/_id_.get.mjs +1 -0
  108. package/.output/server/chunks/routes/api/users/_id_.get.mjs.map +1 -1
  109. package/.output/server/chunks/routes/api/users/_id_.put.mjs +1 -0
  110. package/.output/server/chunks/routes/api/users/_id_.put.mjs.map +1 -1
  111. package/.output/server/chunks/routes/api/users/index.get.mjs +1 -0
  112. package/.output/server/chunks/routes/api/users/index.get.mjs.map +1 -1
  113. package/.output/server/chunks/routes/api/users/index.post.mjs +1 -0
  114. package/.output/server/chunks/routes/api/users/index.post.mjs.map +1 -1
  115. package/.output/server/chunks/routes/api/users/login.post.mjs +1 -0
  116. package/.output/server/chunks/routes/api/users/login.post.mjs.map +1 -1
  117. package/.output/server/chunks/routes/api/users/logout.post.mjs +1 -0
  118. package/.output/server/chunks/routes/api/users/logout.post.mjs.map +1 -1
  119. package/.output/server/chunks/routes/api/users/me.get.mjs +1 -0
  120. package/.output/server/chunks/routes/api/users/me.get.mjs.map +1 -1
  121. package/.output/server/chunks/routes/api/users/register.post.mjs +1 -0
  122. package/.output/server/chunks/routes/api/users/register.post.mjs.map +1 -1
  123. package/.output/server/chunks/routes/api/users/tokens/_id/token.get.mjs +1 -0
  124. package/.output/server/chunks/routes/api/users/tokens/_id/token.get.mjs.map +1 -1
  125. package/.output/server/chunks/routes/api/users/tokens/_id_.delete.mjs +1 -0
  126. package/.output/server/chunks/routes/api/users/tokens/_id_.delete.mjs.map +1 -1
  127. package/.output/server/chunks/routes/api/users/tokens/_id_.patch.mjs +1 -0
  128. package/.output/server/chunks/routes/api/users/tokens/_id_.patch.mjs.map +1 -1
  129. package/.output/server/chunks/routes/api/workshop/_...path_.mjs +1 -0
  130. package/.output/server/chunks/routes/api/workshop/_...path_.mjs.map +1 -1
  131. package/.output/server/chunks/routes/api/workshop/a2a/_agentId/index.get.mjs +1 -0
  132. package/.output/server/chunks/routes/api/workshop/a2a/_agentId/index.get.mjs.map +1 -1
  133. package/.output/server/chunks/routes/api/workshop/a2a/_agentId/index.post.mjs +1 -0
  134. package/.output/server/chunks/routes/api/workshop/a2a/_agentId/index.post.mjs.map +1 -1
  135. package/.output/server/chunks/routes/api/workshop/a2a/send.post.mjs +1 -0
  136. package/.output/server/chunks/routes/api/workshop/a2a/send.post.mjs.map +1 -1
  137. package/.output/server/chunks/routes/api/workshop/agent-tools/approvals/_id/decide.post.mjs +1 -0
  138. package/.output/server/chunks/routes/api/workshop/agent-tools/approvals/_id/decide.post.mjs.map +1 -1
  139. package/.output/server/chunks/routes/api/workshop/agent-tools/bindings/_id_.delete.mjs +1 -0
  140. package/.output/server/chunks/routes/api/workshop/agent-tools/bindings/_id_.delete.mjs.map +1 -1
  141. package/.output/server/chunks/routes/api/workshop/agent-tools/bindings/_id_.patch.mjs +1 -0
  142. package/.output/server/chunks/routes/api/workshop/agent-tools/bindings/_id_.patch.mjs.map +1 -1
  143. package/.output/server/chunks/routes/api/workshop/agent-tools/index.get.mjs +1 -0
  144. package/.output/server/chunks/routes/api/workshop/agent-tools/index.get.mjs.map +1 -1
  145. package/.output/server/chunks/routes/api/workshop/agent-tools/index.post.mjs +1 -0
  146. package/.output/server/chunks/routes/api/workshop/agent-tools/index.post.mjs.map +1 -1
  147. package/.output/server/chunks/routes/api/workshop/agent-tools/index2.get.mjs +1 -0
  148. package/.output/server/chunks/routes/api/workshop/agent-tools/index2.get.mjs.map +1 -1
  149. package/.output/server/chunks/routes/api/workshop/agent-tools/invoke.post.mjs +1 -0
  150. package/.output/server/chunks/routes/api/workshop/agent-tools/invoke.post.mjs.map +1 -1
  151. package/.output/server/chunks/routes/api/workshop/agents/_id_.delete.mjs +1 -0
  152. package/.output/server/chunks/routes/api/workshop/agents/_id_.delete.mjs.map +1 -1
  153. package/.output/server/chunks/routes/api/workshop/agents/_id_.get.mjs +1 -0
  154. package/.output/server/chunks/routes/api/workshop/agents/_id_.get.mjs.map +1 -1
  155. package/.output/server/chunks/routes/api/workshop/agents/_id_.patch.mjs +1 -0
  156. package/.output/server/chunks/routes/api/workshop/agents/_id_.patch.mjs.map +1 -1
  157. package/.output/server/chunks/routes/api/workshop/agents/subscribe.post.mjs +1 -0
  158. package/.output/server/chunks/routes/api/workshop/agents/subscribe.post.mjs.map +1 -1
  159. package/.output/server/chunks/routes/api/workshop/approvals/_id/decide.post.mjs +1 -0
  160. package/.output/server/chunks/routes/api/workshop/approvals/_id/decide.post.mjs.map +1 -1
  161. package/.output/server/chunks/routes/api/workshop/assets/character/_id_.delete.mjs +1 -0
  162. package/.output/server/chunks/routes/api/workshop/assets/character/_id_.delete.mjs.map +1 -1
  163. package/.output/server/chunks/routes/api/workshop/assets/devices/_id_.delete.mjs +1 -0
  164. package/.output/server/chunks/routes/api/workshop/assets/devices/_id_.delete.mjs.map +1 -1
  165. package/.output/server/chunks/routes/api/workshop/assets/index.get.mjs +1 -0
  166. package/.output/server/chunks/routes/api/workshop/assets/index.get.mjs.map +1 -1
  167. package/.output/server/chunks/routes/api/workshop/assets/index.post.mjs +1 -0
  168. package/.output/server/chunks/routes/api/workshop/assets/index.post.mjs.map +1 -1
  169. package/.output/server/chunks/routes/api/workshop/assets/index2.get.mjs +1 -0
  170. package/.output/server/chunks/routes/api/workshop/assets/index2.get.mjs.map +1 -1
  171. package/.output/server/chunks/routes/api/workshop/assets/index2.post.mjs +1 -0
  172. package/.output/server/chunks/routes/api/workshop/assets/index2.post.mjs.map +1 -1
  173. package/.output/server/chunks/routes/api/workshop/audit.get.mjs +1 -0
  174. package/.output/server/chunks/routes/api/workshop/audit.get.mjs.map +1 -1
  175. package/.output/server/chunks/routes/api/workshop/caller.mjs +1 -0
  176. package/.output/server/chunks/routes/api/workshop/caller.mjs.map +1 -1
  177. package/.output/server/chunks/routes/api/workshop/channel-templates/_id/instantiate.post.mjs +1 -0
  178. package/.output/server/chunks/routes/api/workshop/channel-templates/_id/instantiate.post.mjs.map +1 -1
  179. package/.output/server/chunks/routes/api/workshop/channel-templates/_id_.delete.mjs +1 -0
  180. package/.output/server/chunks/routes/api/workshop/channel-templates/_id_.delete.mjs.map +1 -1
  181. package/.output/server/chunks/routes/api/workshop/channel-templates/_id_.get.mjs +1 -0
  182. package/.output/server/chunks/routes/api/workshop/channel-templates/_id_.get.mjs.map +1 -1
  183. package/.output/server/chunks/routes/api/workshop/channel-templates/_id_.patch.mjs +1 -0
  184. package/.output/server/chunks/routes/api/workshop/channel-templates/_id_.patch.mjs.map +1 -1
  185. package/.output/server/chunks/routes/api/workshop/channel-templates/from-channel.post.mjs +1 -0
  186. package/.output/server/chunks/routes/api/workshop/channel-templates/from-channel.post.mjs.map +1 -1
  187. package/.output/server/chunks/routes/api/workshop/channels/_id/activate.post.mjs +1 -0
  188. package/.output/server/chunks/routes/api/workshop/channels/_id/activate.post.mjs.map +1 -1
  189. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/index.get.mjs +1 -0
  190. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/index.get.mjs.map +1 -1
  191. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/index.post.mjs +1 -0
  192. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/index.post.mjs.map +1 -1
  193. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/memories/_memoryId_.delete.mjs +1 -0
  194. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/memories/_memoryId_.delete.mjs.map +1 -1
  195. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/memories/search.post.mjs +1 -0
  196. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/memories/search.post.mjs.map +1 -1
  197. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/model.patch.mjs +1 -0
  198. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/model.patch.mjs.map +1 -1
  199. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/position.patch.mjs +1 -0
  200. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/position.patch.mjs.map +1 -1
  201. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/range.patch.mjs +1 -0
  202. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/range.patch.mjs.map +1 -1
  203. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/stop.post.mjs +1 -0
  204. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/stop.post.mjs.map +1 -1
  205. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId_.delete.mjs +1 -0
  206. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId_.delete.mjs.map +1 -1
  207. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId_.patch.mjs +1 -0
  208. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId_.patch.mjs.map +1 -1
  209. package/.output/server/chunks/routes/api/workshop/channels/_id/events.get.mjs +1 -0
  210. package/.output/server/chunks/routes/api/workshop/channels/_id/events.get.mjs.map +1 -1
  211. package/.output/server/chunks/routes/api/workshop/channels/_id/index.get.mjs +1 -0
  212. package/.output/server/chunks/routes/api/workshop/channels/_id/index.get.mjs.map +1 -1
  213. package/.output/server/chunks/routes/api/workshop/channels/_id/index.post.mjs +1 -0
  214. package/.output/server/chunks/routes/api/workshop/channels/_id/index.post.mjs.map +1 -1
  215. package/.output/server/chunks/routes/api/workshop/channels/_id/index2.get.mjs +1 -0
  216. package/.output/server/chunks/routes/api/workshop/channels/_id/index2.get.mjs.map +1 -1
  217. package/.output/server/chunks/routes/api/workshop/channels/_id/index2.post.mjs +1 -0
  218. package/.output/server/chunks/routes/api/workshop/channels/_id/index2.post.mjs.map +1 -1
  219. package/.output/server/chunks/routes/api/workshop/channels/_id/index3.get.mjs +1 -0
  220. package/.output/server/chunks/routes/api/workshop/channels/_id/index3.get.mjs.map +1 -1
  221. package/.output/server/chunks/routes/api/workshop/channels/_id/index3.post.mjs +1 -0
  222. package/.output/server/chunks/routes/api/workshop/channels/_id/index3.post.mjs.map +1 -1
  223. package/.output/server/chunks/routes/api/workshop/channels/_id/index4.get.mjs +1 -0
  224. package/.output/server/chunks/routes/api/workshop/channels/_id/index4.get.mjs.map +1 -1
  225. package/.output/server/chunks/routes/api/workshop/channels/_id/index4.post.mjs +1 -0
  226. package/.output/server/chunks/routes/api/workshop/channels/_id/index4.post.mjs.map +1 -1
  227. package/.output/server/chunks/routes/api/workshop/channels/_id/memories/_memoryId_.delete.mjs +1 -0
  228. package/.output/server/chunks/routes/api/workshop/channels/_id/memories/_memoryId_.delete.mjs.map +1 -1
  229. package/.output/server/chunks/routes/api/workshop/channels/_id/queue.get.mjs +1 -0
  230. package/.output/server/chunks/routes/api/workshop/channels/_id/queue.get.mjs.map +1 -1
  231. package/.output/server/chunks/routes/api/workshop/channels/_id/terminals.get.mjs +1 -0
  232. package/.output/server/chunks/routes/api/workshop/channels/_id/terminals.get.mjs.map +1 -1
  233. package/.output/server/chunks/routes/api/workshop/channels/_id_.delete.mjs +1 -0
  234. package/.output/server/chunks/routes/api/workshop/channels/_id_.delete.mjs.map +1 -1
  235. package/.output/server/chunks/routes/api/workshop/channels/index.get.mjs +1 -0
  236. package/.output/server/chunks/routes/api/workshop/channels/index.get.mjs.map +1 -1
  237. package/.output/server/chunks/routes/api/workshop/channels/index.patch.mjs +1 -0
  238. package/.output/server/chunks/routes/api/workshop/channels/index.patch.mjs.map +1 -1
  239. package/.output/server/chunks/routes/api/workshop/channels.get.mjs +1 -0
  240. package/.output/server/chunks/routes/api/workshop/channels.get.mjs.map +1 -1
  241. package/.output/server/chunks/routes/api/workshop/channels.post.mjs +1 -0
  242. package/.output/server/chunks/routes/api/workshop/channels.post.mjs.map +1 -1
  243. package/.output/server/chunks/routes/api/workshop/daq/_id/bind.post.mjs +1 -0
  244. package/.output/server/chunks/routes/api/workshop/daq/_id/bind.post.mjs.map +1 -1
  245. package/.output/server/chunks/routes/api/workshop/daq/_id/frames/content.get.mjs +1 -0
  246. package/.output/server/chunks/routes/api/workshop/daq/_id/frames/content.get.mjs.map +1 -1
  247. package/.output/server/chunks/routes/api/workshop/daq/_id/frames.get.mjs +1 -0
  248. package/.output/server/chunks/routes/api/workshop/daq/_id/frames.get.mjs.map +1 -1
  249. package/.output/server/chunks/routes/api/workshop/daq/_id/samples.get.mjs +1 -0
  250. package/.output/server/chunks/routes/api/workshop/daq/_id/samples.get.mjs.map +1 -1
  251. package/.output/server/chunks/routes/api/workshop/daq/_id/test.post.mjs +1 -0
  252. package/.output/server/chunks/routes/api/workshop/daq/_id/test.post.mjs.map +1 -1
  253. package/.output/server/chunks/routes/api/workshop/daq/_id_.delete.mjs +1 -0
  254. package/.output/server/chunks/routes/api/workshop/daq/_id_.delete.mjs.map +1 -1
  255. package/.output/server/chunks/routes/api/workshop/daq/_id_.patch.mjs +1 -0
  256. package/.output/server/chunks/routes/api/workshop/daq/_id_.patch.mjs.map +1 -1
  257. package/.output/server/chunks/routes/api/workshop/daq/alarms/_id/ack.post.mjs +1 -0
  258. package/.output/server/chunks/routes/api/workshop/daq/alarms/_id/ack.post.mjs.map +1 -1
  259. package/.output/server/chunks/routes/api/workshop/daq/alarms.get.mjs +1 -0
  260. package/.output/server/chunks/routes/api/workshop/daq/alarms.get.mjs.map +1 -1
  261. package/.output/server/chunks/routes/api/workshop/daq/controller.post.mjs +1 -0
  262. package/.output/server/chunks/routes/api/workshop/daq/controller.post.mjs.map +1 -1
  263. package/.output/server/chunks/routes/api/workshop/daq/index.post.mjs +1 -0
  264. package/.output/server/chunks/routes/api/workshop/daq/index.post.mjs.map +1 -1
  265. package/.output/server/chunks/routes/api/workshop/daq/infra/reconnect.post.mjs +1 -0
  266. package/.output/server/chunks/routes/api/workshop/daq/infra/reconnect.post.mjs.map +1 -1
  267. package/.output/server/chunks/routes/api/workshop/daq/infra.get.mjs +1 -0
  268. package/.output/server/chunks/routes/api/workshop/daq/infra.get.mjs.map +1 -1
  269. package/.output/server/chunks/routes/api/workshop/daq/templates/_key_.delete.mjs +1 -0
  270. package/.output/server/chunks/routes/api/workshop/daq/templates/_key_.delete.mjs.map +1 -1
  271. package/.output/server/chunks/routes/api/workshop/daq/templates/_key_.patch.mjs +1 -0
  272. package/.output/server/chunks/routes/api/workshop/daq/templates/_key_.patch.mjs.map +1 -1
  273. package/.output/server/chunks/routes/api/workshop/daq/test-driver.post.mjs +1 -0
  274. package/.output/server/chunks/routes/api/workshop/daq/test-driver.post.mjs.map +1 -1
  275. package/.output/server/chunks/routes/api/workshop/dcw/_id/bind.post.mjs +1 -0
  276. package/.output/server/chunks/routes/api/workshop/dcw/_id/bind.post.mjs.map +1 -1
  277. package/.output/server/chunks/routes/api/workshop/dcw/_id/param-ledger.get.mjs +1 -0
  278. package/.output/server/chunks/routes/api/workshop/dcw/_id/param-ledger.get.mjs.map +1 -1
  279. package/.output/server/chunks/routes/api/workshop/dcw/_id/read.post.mjs +31 -0
  280. package/.output/server/chunks/routes/api/workshop/dcw/_id/read.post.mjs.map +1 -0
  281. package/.output/server/chunks/routes/api/workshop/dcw/_id/test.post.mjs +1 -0
  282. package/.output/server/chunks/routes/api/workshop/dcw/_id/test.post.mjs.map +1 -1
  283. package/.output/server/chunks/routes/api/workshop/dcw/_id/write.post.mjs +1 -0
  284. package/.output/server/chunks/routes/api/workshop/dcw/_id/write.post.mjs.map +1 -1
  285. package/.output/server/chunks/routes/api/workshop/dcw/_id_.delete.mjs +1 -0
  286. package/.output/server/chunks/routes/api/workshop/dcw/_id_.delete.mjs.map +1 -1
  287. package/.output/server/chunks/routes/api/workshop/dcw/_id_.patch.mjs +1 -0
  288. package/.output/server/chunks/routes/api/workshop/dcw/_id_.patch.mjs.map +1 -1
  289. package/.output/server/chunks/routes/api/workshop/dcw/controller.post.mjs +1 -0
  290. package/.output/server/chunks/routes/api/workshop/dcw/controller.post.mjs.map +1 -1
  291. package/.output/server/chunks/routes/api/workshop/dcw/index.get.mjs +1 -0
  292. package/.output/server/chunks/routes/api/workshop/dcw/index.get.mjs.map +1 -1
  293. package/.output/server/chunks/routes/api/workshop/dcw/index.post.mjs +1 -0
  294. package/.output/server/chunks/routes/api/workshop/dcw/index.post.mjs.map +1 -1
  295. package/.output/server/chunks/routes/api/workshop/dcw/index2.get.mjs +1 -0
  296. package/.output/server/chunks/routes/api/workshop/dcw/index2.get.mjs.map +1 -1
  297. package/.output/server/chunks/routes/api/workshop/dcw/index2.post.mjs +1 -0
  298. package/.output/server/chunks/routes/api/workshop/dcw/index2.post.mjs.map +1 -1
  299. package/.output/server/chunks/routes/api/workshop/dcw/index3.get.mjs +1 -0
  300. package/.output/server/chunks/routes/api/workshop/dcw/index3.get.mjs.map +1 -1
  301. package/.output/server/chunks/routes/api/workshop/dcw/index3.post.mjs +1 -0
  302. package/.output/server/chunks/routes/api/workshop/dcw/index3.post.mjs.map +1 -1
  303. package/.output/server/chunks/routes/api/workshop/dcw/index4.get.mjs +1 -0
  304. package/.output/server/chunks/routes/api/workshop/dcw/index4.get.mjs.map +1 -1
  305. package/.output/server/chunks/routes/api/workshop/dcw/index4.post.mjs +1 -0
  306. package/.output/server/chunks/routes/api/workshop/dcw/index4.post.mjs.map +1 -1
  307. package/.output/server/chunks/routes/api/workshop/dcw/index5.get.mjs +1 -0
  308. package/.output/server/chunks/routes/api/workshop/dcw/index5.get.mjs.map +1 -1
  309. package/.output/server/chunks/routes/api/workshop/dcw/journal/node/_nodeId/rollback.post.mjs +1 -0
  310. package/.output/server/chunks/routes/api/workshop/dcw/journal/node/_nodeId/rollback.post.mjs.map +1 -1
  311. package/.output/server/chunks/routes/api/workshop/dcw/line/query.get.mjs +1 -0
  312. package/.output/server/chunks/routes/api/workshop/dcw/line/query.get.mjs.map +1 -1
  313. package/.output/server/chunks/routes/api/workshop/dcw/lines/_id/start.post.mjs +1 -0
  314. package/.output/server/chunks/routes/api/workshop/dcw/lines/_id/start.post.mjs.map +1 -1
  315. package/.output/server/chunks/routes/api/workshop/dcw/lines/_id/stop.post.mjs +1 -0
  316. package/.output/server/chunks/routes/api/workshop/dcw/lines/_id/stop.post.mjs.map +1 -1
  317. package/.output/server/chunks/routes/api/workshop/dcw/lines/_id_.delete.mjs +1 -0
  318. package/.output/server/chunks/routes/api/workshop/dcw/lines/_id_.delete.mjs.map +1 -1
  319. package/.output/server/chunks/routes/api/workshop/dcw/lines/_id_.patch.mjs +1 -0
  320. package/.output/server/chunks/routes/api/workshop/dcw/lines/_id_.patch.mjs.map +1 -1
  321. package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id/judge.post.mjs +1 -0
  322. package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id/judge.post.mjs.map +1 -1
  323. package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id/rollback.post.mjs +1 -0
  324. package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id/rollback.post.mjs.map +1 -1
  325. package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id/series.get.mjs +1 -0
  326. package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id/series.get.mjs.map +1 -1
  327. package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id_.get.mjs +1 -0
  328. package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id_.get.mjs.map +1 -1
  329. package/.output/server/chunks/routes/api/workshop/dcw/products/_id_.delete.mjs +1 -0
  330. package/.output/server/chunks/routes/api/workshop/dcw/products/_id_.delete.mjs.map +1 -1
  331. package/.output/server/chunks/routes/api/workshop/dcw/products/_id_.patch.mjs +1 -0
  332. package/.output/server/chunks/routes/api/workshop/dcw/products/_id_.patch.mjs.map +1 -1
  333. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/apply.post.mjs +1 -0
  334. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/apply.post.mjs.map +1 -1
  335. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/mark-good.post.mjs +1 -0
  336. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/mark-good.post.mjs.map +1 -1
  337. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/rollback-good.post.mjs +1 -0
  338. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/rollback-good.post.mjs.map +1 -1
  339. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id_.delete.mjs +1 -0
  340. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id_.delete.mjs.map +1 -1
  341. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id_.patch.mjs +1 -0
  342. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id_.patch.mjs.map +1 -1
  343. package/.output/server/chunks/routes/api/workshop/dcw/runs/_id/close.post.mjs +1 -0
  344. package/.output/server/chunks/routes/api/workshop/dcw/runs/_id/close.post.mjs.map +1 -1
  345. package/.output/server/chunks/routes/api/workshop/dcw/runs/_id/data.get.mjs +1 -0
  346. package/.output/server/chunks/routes/api/workshop/dcw/runs/_id/data.get.mjs.map +1 -1
  347. package/.output/server/chunks/routes/api/workshop/dcw/runs/_id/rollback.post.mjs +1 -0
  348. package/.output/server/chunks/routes/api/workshop/dcw/runs/_id/rollback.post.mjs.map +1 -1
  349. package/.output/server/chunks/routes/api/workshop/dcw/templates/_key_.delete.mjs +1 -0
  350. package/.output/server/chunks/routes/api/workshop/dcw/templates/_key_.delete.mjs.map +1 -1
  351. package/.output/server/chunks/routes/api/workshop/dcw/templates/_key_.patch.mjs +1 -0
  352. package/.output/server/chunks/routes/api/workshop/dcw/templates/_key_.patch.mjs.map +1 -1
  353. package/.output/server/chunks/routes/api/workshop/dcw/test-driver.post.mjs +1 -0
  354. package/.output/server/chunks/routes/api/workshop/dcw/test-driver.post.mjs.map +1 -1
  355. package/.output/server/chunks/routes/api/workshop/device-twins/_id/control.post.mjs +1 -0
  356. package/.output/server/chunks/routes/api/workshop/device-twins/_id/control.post.mjs.map +1 -1
  357. package/.output/server/chunks/routes/api/workshop/device-twins/_id/telemetry.post.mjs +1 -0
  358. package/.output/server/chunks/routes/api/workshop/device-twins/_id/telemetry.post.mjs.map +1 -1
  359. package/.output/server/chunks/routes/api/workshop/device-twins/_id_.delete.mjs +1 -0
  360. package/.output/server/chunks/routes/api/workshop/device-twins/_id_.delete.mjs.map +1 -1
  361. package/.output/server/chunks/routes/api/workshop/device-twins/_id_.patch.mjs +1 -0
  362. package/.output/server/chunks/routes/api/workshop/device-twins/_id_.patch.mjs.map +1 -1
  363. package/.output/server/chunks/routes/api/workshop/fs/dirs.get.mjs +1 -0
  364. package/.output/server/chunks/routes/api/workshop/fs/dirs.get.mjs.map +1 -1
  365. package/.output/server/chunks/routes/api/workshop/index.get.mjs +1 -0
  366. package/.output/server/chunks/routes/api/workshop/index.get.mjs.map +1 -1
  367. package/.output/server/chunks/routes/api/workshop/index.post.mjs +1 -0
  368. package/.output/server/chunks/routes/api/workshop/index.post.mjs.map +1 -1
  369. package/.output/server/chunks/routes/api/workshop/index10.get.mjs +1 -0
  370. package/.output/server/chunks/routes/api/workshop/index10.get.mjs.map +1 -1
  371. package/.output/server/chunks/routes/api/workshop/index2.get.mjs +1 -0
  372. package/.output/server/chunks/routes/api/workshop/index2.get.mjs.map +1 -1
  373. package/.output/server/chunks/routes/api/workshop/index2.post.mjs +1 -0
  374. package/.output/server/chunks/routes/api/workshop/index2.post.mjs.map +1 -1
  375. package/.output/server/chunks/routes/api/workshop/index3.get.mjs +1 -0
  376. package/.output/server/chunks/routes/api/workshop/index3.get.mjs.map +1 -1
  377. package/.output/server/chunks/routes/api/workshop/index3.post.mjs +1 -0
  378. package/.output/server/chunks/routes/api/workshop/index3.post.mjs.map +1 -1
  379. package/.output/server/chunks/routes/api/workshop/index4.get.mjs +1 -0
  380. package/.output/server/chunks/routes/api/workshop/index4.get.mjs.map +1 -1
  381. package/.output/server/chunks/routes/api/workshop/index4.post.mjs +1 -0
  382. package/.output/server/chunks/routes/api/workshop/index4.post.mjs.map +1 -1
  383. package/.output/server/chunks/routes/api/workshop/index5.get.mjs +1 -0
  384. package/.output/server/chunks/routes/api/workshop/index5.get.mjs.map +1 -1
  385. package/.output/server/chunks/routes/api/workshop/index5.post.mjs +1 -0
  386. package/.output/server/chunks/routes/api/workshop/index5.post.mjs.map +1 -1
  387. package/.output/server/chunks/routes/api/workshop/index6.get.mjs +1 -0
  388. package/.output/server/chunks/routes/api/workshop/index6.get.mjs.map +1 -1
  389. package/.output/server/chunks/routes/api/workshop/index6.post.mjs +1 -0
  390. package/.output/server/chunks/routes/api/workshop/index6.post.mjs.map +1 -1
  391. package/.output/server/chunks/routes/api/workshop/index7.get.mjs +1 -0
  392. package/.output/server/chunks/routes/api/workshop/index7.get.mjs.map +1 -1
  393. package/.output/server/chunks/routes/api/workshop/index7.post.mjs +1 -0
  394. package/.output/server/chunks/routes/api/workshop/index7.post.mjs.map +1 -1
  395. package/.output/server/chunks/routes/api/workshop/index8.get.mjs +1 -0
  396. package/.output/server/chunks/routes/api/workshop/index8.get.mjs.map +1 -1
  397. package/.output/server/chunks/routes/api/workshop/index8.post.mjs +1 -0
  398. package/.output/server/chunks/routes/api/workshop/index8.post.mjs.map +1 -1
  399. package/.output/server/chunks/routes/api/workshop/index9.get.mjs +1 -0
  400. package/.output/server/chunks/routes/api/workshop/index9.get.mjs.map +1 -1
  401. package/.output/server/chunks/routes/api/workshop/mailbox/all.get.mjs +1 -0
  402. package/.output/server/chunks/routes/api/workshop/mailbox/all.get.mjs.map +1 -1
  403. package/.output/server/chunks/routes/api/workshop/mailbox.get.mjs +1 -0
  404. package/.output/server/chunks/routes/api/workshop/mailbox.get.mjs.map +1 -1
  405. package/.output/server/chunks/routes/api/workshop/memories/maintenance.post.mjs +1 -0
  406. package/.output/server/chunks/routes/api/workshop/memories/maintenance.post.mjs.map +1 -1
  407. package/.output/server/chunks/routes/api/workshop/plugins/_name/disable.post.mjs +1 -0
  408. package/.output/server/chunks/routes/api/workshop/plugins/_name/disable.post.mjs.map +1 -1
  409. package/.output/server/chunks/routes/api/workshop/plugins/_name/enable.post.mjs +1 -0
  410. package/.output/server/chunks/routes/api/workshop/plugins/_name/enable.post.mjs.map +1 -1
  411. package/.output/server/chunks/routes/api/workshop/plugins/index.get.mjs +1 -0
  412. package/.output/server/chunks/routes/api/workshop/plugins/index.get.mjs.map +1 -1
  413. package/.output/server/chunks/routes/api/workshop/runtime.get.mjs +1 -0
  414. package/.output/server/chunks/routes/api/workshop/runtime.get.mjs.map +1 -1
  415. package/.output/server/chunks/routes/api/workshop/scene/layouts/_channelId_.delete.mjs +1 -0
  416. package/.output/server/chunks/routes/api/workshop/scene/layouts/_channelId_.delete.mjs.map +1 -1
  417. package/.output/server/chunks/routes/api/workshop/scene/layouts/_channelId_.put.mjs +1 -0
  418. package/.output/server/chunks/routes/api/workshop/scene/layouts/_channelId_.put.mjs.map +1 -1
  419. package/.output/server/chunks/routes/api/workshop/scene/layouts.get.mjs +1 -0
  420. package/.output/server/chunks/routes/api/workshop/scene/layouts.get.mjs.map +1 -1
  421. package/.output/server/chunks/routes/api/workshop/tasks/_id/complete.post.mjs +1 -0
  422. package/.output/server/chunks/routes/api/workshop/tasks/_id/complete.post.mjs.map +1 -1
  423. package/.output/server/chunks/routes/api/workshop/tasks/_id/dispatch.post.mjs +1 -0
  424. package/.output/server/chunks/routes/api/workshop/tasks/_id/dispatch.post.mjs.map +1 -1
  425. package/.output/server/chunks/routes/api/workshop/tasks/_id/index.post.mjs +1 -0
  426. package/.output/server/chunks/routes/api/workshop/tasks/_id/index.post.mjs.map +1 -1
  427. package/.output/server/chunks/routes/api/workshop/tasks/_id/report.post.mjs +1 -0
  428. package/.output/server/chunks/routes/api/workshop/tasks/_id/report.post.mjs.map +1 -1
  429. package/.output/server/chunks/routes/api/workshop/tasks/_id/retry.post.mjs +1 -0
  430. package/.output/server/chunks/routes/api/workshop/tasks/_id/retry.post.mjs.map +1 -1
  431. package/.output/server/chunks/routes/api/workshop/tasks/_id_.get.mjs +1 -0
  432. package/.output/server/chunks/routes/api/workshop/tasks/_id_.get.mjs.map +1 -1
  433. package/.output/server/chunks/routes/api/workshop/tasks.get.mjs +1 -0
  434. package/.output/server/chunks/routes/api/workshop/tasks.get.mjs.map +1 -1
  435. package/.output/server/chunks/routes/api/workshop/teams/_id/deploy.post.mjs +1 -0
  436. package/.output/server/chunks/routes/api/workshop/teams/_id/deploy.post.mjs.map +1 -1
  437. package/.output/server/chunks/routes/api/workshop/teams/_id/index.get.mjs +1 -0
  438. package/.output/server/chunks/routes/api/workshop/teams/_id/index.get.mjs.map +1 -1
  439. package/.output/server/chunks/routes/api/workshop/teams/_id/index.post.mjs +1 -0
  440. package/.output/server/chunks/routes/api/workshop/teams/_id/index.post.mjs.map +1 -1
  441. package/.output/server/chunks/routes/api/workshop/teams/_id/members/_agentId_.delete.mjs +1 -0
  442. package/.output/server/chunks/routes/api/workshop/teams/_id/members/_agentId_.delete.mjs.map +1 -1
  443. package/.output/server/chunks/routes/api/workshop/teams/_id_.delete.mjs +1 -0
  444. package/.output/server/chunks/routes/api/workshop/teams/_id_.delete.mjs.map +1 -1
  445. package/.output/server/chunks/routes/api/workshop/teams/_id_.get.mjs +1 -0
  446. package/.output/server/chunks/routes/api/workshop/teams/_id_.get.mjs.map +1 -1
  447. package/.output/server/chunks/routes/api/workshop/teams/_id_.patch.mjs +1 -0
  448. package/.output/server/chunks/routes/api/workshop/teams/_id_.patch.mjs.map +1 -1
  449. package/.output/server/chunks/routes/api/workshop/users/me.get.mjs +1 -0
  450. package/.output/server/chunks/routes/api/workshop/users/me.get.mjs.map +1 -1
  451. package/.output/server/chunks/routes/api/workshop/users/register.post.mjs +1 -0
  452. package/.output/server/chunks/routes/api/workshop/users/register.post.mjs.map +1 -1
  453. package/.output/server/chunks/routes/api/workshop/workspaces/_id/channel-templates/_tplId_.post.mjs +1 -0
  454. package/.output/server/chunks/routes/api/workshop/workspaces/_id/channel-templates/_tplId_.post.mjs.map +1 -1
  455. package/.output/server/chunks/routes/api/workshop/workspaces/_id/channels/_channelId_.delete.mjs +1 -0
  456. package/.output/server/chunks/routes/api/workshop/workspaces/_id/channels/_channelId_.delete.mjs.map +1 -1
  457. package/.output/server/chunks/routes/api/workshop/workspaces/_id/channels/_channelId_.post.mjs +1 -0
  458. package/.output/server/chunks/routes/api/workshop/workspaces/_id/channels/_channelId_.post.mjs.map +1 -1
  459. package/.output/server/chunks/routes/api/workshop/workspaces/index.delete.mjs +1 -0
  460. package/.output/server/chunks/routes/api/workshop/workspaces/index.delete.mjs.map +1 -1
  461. package/.output/server/chunks/routes/renderer.mjs +1 -1
  462. package/.output/server/chunks/virtual/entry.mjs +287 -85
  463. package/.output/server/chunks/virtual/precomputed.mjs +1 -1
  464. package/.output/server/index.mjs +1 -0
  465. package/.output/server/package.json +1 -1
  466. package/README-zh.md +434 -430
  467. package/README.md +5 -1
  468. package/app/components/workshop/DeviceTwinPanel.vue +34 -0
  469. package/app/components/workshop/town/TownView.vue +5 -0
  470. package/app/composables/workshop/useDcwStream.ts +15 -1
  471. package/app/config/schema.ts +54 -0
  472. package/app/pages/dcw/[id].vue +57 -0
  473. package/app/pages/settings.vue +2 -1
  474. package/config.yml +58 -1
  475. package/i18n/dicts/_en.json +56 -2
  476. package/i18n/dicts/dcwDetail.json +9 -1
  477. package/i18n/dicts/deviceTwinPanel.json +2 -1
  478. package/i18n/dicts/settings.json +48 -1
  479. package/i18n/locales/en.ts +139 -38
  480. package/i18n/locales/zh-CN.ts +139 -38
  481. package/package.json +1 -1
  482. package/scripts/_dbg-agent-dcw-rw.ts +131 -0
  483. package/scripts/_dbg-config-smoke.ts +28 -0
  484. package/scripts/_dbg-dcw-read-rest.mjs +103 -0
  485. package/scripts/_dbg-dcw-read-toolface.ts +13 -0
  486. package/scripts/_dbg-dcw-read-ui.mjs +74 -0
  487. package/scripts/_dbg-plugin-ui-wizard.mjs +125 -0
  488. package/scripts/test-config-precedence.ts +124 -0
  489. package/scripts/test-dcw-read.ts +153 -0
  490. package/server/api/workshop/dcw/[id]/read.post.ts +18 -0
  491. package/server/api/workshop/ws.ts +6 -4
  492. package/server/data/daqs.json +55 -9
  493. package/server/data/dcw-rollback.json +221 -1
  494. package/server/data/dcw-runs.json +41 -18
  495. package/server/data/dcw-writes.json +264 -0
  496. package/server/data/dcws.json +646 -4
  497. package/server/data/line-runs.json +12 -1
  498. package/server/plugins/backup.ts +7 -5
  499. package/server/plugins/retention.ts +59 -57
  500. package/server/plugins/workshop.ts +5 -4
  501. package/server/services/workshop/agents/industrial-tools.ts +50 -1
  502. package/server/services/workshop/agents/omp-agent.ts +10 -8
  503. package/server/services/workshop/agents/tool-approvals.ts +175 -174
  504. package/server/services/workshop/daq/alarm-notify.ts +102 -100
  505. package/server/services/workshop/daq/bus/mqtt.adapter.ts +14 -15
  506. package/server/services/workshop/daq/storage/sqlite.adapter.ts +5 -4
  507. package/server/services/workshop/daq/storage/timescale.adapter.ts +5 -4
  508. package/server/services/workshop/db/retention.ts +49 -50
  509. package/server/services/workshop/dcw/dcw-controller.ts +56 -1
  510. package/server/services/workshop/dcw/dcw-node.ts +233 -200
  511. package/server/services/workshop/dcw/dcw-runtime.ts +46 -9
  512. package/server/services/workshop/dcw/drivers.ts +98 -0
  513. package/server/services/workshop/dcw/recipe-rollback-manager.ts +16 -15
  514. package/server/services/workshop/logger.ts +65 -58
  515. package/server/services/workshop/runtime/embedding-provider.ts +9 -5
  516. package/server/services/workshop/runtime/manager.ts +16 -7
  517. package/server/services/workshop/runtime/memory.ts +14 -7
  518. package/server/services/workshop/settings.ts +143 -0
  519. package/shared/config/engine.mjs +14 -2
  520. package/shared/config/schema.json +48 -1
  521. package/shared/dcw-protocol.ts +21 -0
  522. package/.output/public/_nuxt/BD9D9pl4.js +0 -1
  523. package/.output/public/_nuxt/BxD8Fg_Z.js +0 -2
  524. package/.output/public/_nuxt/CwcOEM8m.js +0 -1
  525. package/.output/public/_nuxt/TownView.CI2Wpzty.css +0 -1
  526. package/.output/public/_nuxt/_id_.Ci4u30cR.css +0 -1
  527. package/.output/public/_nuxt/builds/meta/221de779-a113-4232-b9a1-31a614f5e3c7.json +0 -1
  528. package/.output/public/_nuxt/settings.BG0K9_MG.css +0 -1
  529. package/.output/server/chunks/build/_id_-CmKAEFHV.mjs.map +0 -1
  530. package/.output/server/chunks/build/_id_-xR3AChMO.mjs.map +0 -1
  531. package/.output/server/chunks/build/daq-Boz_dlAQ.mjs.map +0 -1
  532. package/.output/server/chunks/build/dcw-wTRwBAUi.mjs.map +0 -1
  533. package/.output/server/chunks/build/logs-Cdi-eXlN.mjs.map +0 -1
  534. package/.output/server/chunks/build/pages-bWKy0ZsA.mjs.map +0 -1
  535. package/.output/server/chunks/build/settings-C3T5hR2A.mjs.map +0 -1
  536. package/.output/server/chunks/build/town-CKg6Qxba.mjs.map +0 -1
  537. package/.output/server/chunks/build/useDcwStream-BkWDGaWp.mjs.map +0 -1
@@ -3,9 +3,9 @@ import { u as useUserStore } from './user-Dk-ytEUV.mjs';
3
3
  import { u as useWorkspacesStore } from './workspaces-IfORCDJE.mjs';
4
4
  import { s as setInterval } from './interval-WlxgjTzO.mjs';
5
5
  import { u as useTownBus } from './useTownBus-D9SoIsAN.mjs';
6
- import { u as useDcwStream } from './useDcwStream-BkWDGaWp.mjs';
7
- import { u as useDaqStream } from './useDaqStream-zHEptJQ_.mjs';
8
- import { u as useDeviceTwins } from './useDeviceTwins-NhtXqSkU.mjs';
6
+ import { u as useDcwStream } from './useDcwStream-Bdew_yrr.mjs';
7
+ import { u as useDaqStream } from './useDaqStream-hwkhJHFU.mjs';
8
+ import { u as useDeviceTwins } from './useDeviceTwins-C6EBg9oN.mjs';
9
9
  import { u as useEntitiesStore, a as useWorkshopWs } from './useWorkshopWs-xcdeiSmJ.mjs';
10
10
  import { shallowRef, ref, computed, toValue, watch, nextTick, defineComponent, reactive, mergeProps, unref, readonly, getCurrentScope, onScopeDispose, getCurrentInstance, toRef, customRef, useSSRContext } from 'vue';
11
11
  import { ssrRenderAttrs, ssrInterpolate, ssrRenderAttr, ssrRenderClass, ssrIncludeBooleanAttr, ssrRenderComponent, ssrRenderList, ssrRenderStyle, ssrLooseContain, ssrLooseEqual } from 'vue/server-renderer';
@@ -698,37 +698,44 @@ var DeviceTwinPanel_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/
698
698
  const dcwErrs = reactive({});
699
699
  const dcwBusy = ref("");
700
700
  return (_ctx, _push, _parent, _attrs) => {
701
- _push(`<aside${ssrRenderAttrs(mergeProps({ class: "twin-panel" }, _attrs))} data-v-9a00109c><div class="twin-head" data-v-9a00109c><span class="twin-kicker" data-v-9a00109c>${ssrInterpolate(_ctx.$t("deviceTwinPanel.k7k6evr002"))}</span><span class="twin-count" data-v-9a00109c>${ssrInterpolate(unref(twins).twins.length)}</span></div>`);
702
- if (unref(twins).error) _push(`<div class="twin-error" data-v-9a00109c>${ssrInterpolate(unref(twins).error)}</div>`);
701
+ _push(`<aside${ssrRenderAttrs(mergeProps({ class: "twin-panel" }, _attrs))} data-v-15ec18ea><div class="twin-head" data-v-15ec18ea><span class="twin-kicker" data-v-15ec18ea>${ssrInterpolate(_ctx.$t("deviceTwinPanel.k7k6evr002"))}</span><span class="twin-count" data-v-15ec18ea>${ssrInterpolate(unref(twins).twins.length)}</span></div>`);
702
+ if (unref(twins).error) _push(`<div class="twin-error" data-v-15ec18ea>${ssrInterpolate(unref(twins).error)}</div>`);
703
703
  else _push(`<!---->`);
704
- if (!unref(twins).loaded) _push(`<div class="twin-empty" data-v-9a00109c>${ssrInterpolate(_ctx.$t("deviceTwinPanel.kkw7sn5003"))}</div>`);
705
- else if (unref(twins).twins.length === 0) _push(`<div class="twin-empty" data-v-9a00109c><div class="twin-empty-frame" data-v-9a00109c><div class="twin-empty-title" data-v-9a00109c>${ssrInterpolate(_ctx.$t("deviceTwinPanel.k13y2qmg004"))}</div><div class="twin-empty-sub" data-v-9a00109c>${ssrInterpolate(_ctx.$t("deviceTwinPanel.kotf23l005"))}</div></div></div>`);
704
+ if (!unref(twins).loaded) _push(`<div class="twin-empty" data-v-15ec18ea>${ssrInterpolate(_ctx.$t("deviceTwinPanel.kkw7sn5003"))}</div>`);
705
+ else if (unref(twins).twins.length === 0) _push(`<div class="twin-empty" data-v-15ec18ea><div class="twin-empty-frame" data-v-15ec18ea><div class="twin-empty-title" data-v-15ec18ea>${ssrInterpolate(_ctx.$t("deviceTwinPanel.k13y2qmg004"))}</div><div class="twin-empty-sub" data-v-15ec18ea>${ssrInterpolate(_ctx.$t("deviceTwinPanel.kotf23l005"))}</div></div></div>`);
706
706
  else {
707
- _push(`<div class="twin-list" data-v-9a00109c><!--[-->`);
707
+ _push(`<div class="twin-list" data-v-15ec18ea><!--[-->`);
708
708
  ssrRenderList(unref(twins).twins, (t) => {
709
- _push(`<button class="${ssrRenderClass([{ daq: isDaq(t) }, "twin-card"])}" type="button" data-v-9a00109c><div class="twin-row" data-v-9a00109c><span class="twin-model-tag" data-v-9a00109c>${ssrInterpolate(modelTag(t.modelRef || t.name))}</span><div class="twin-idbar" data-v-9a00109c><span class="twin-name" data-v-9a00109c>${ssrInterpolate(t.name)}</span><span class="twin-code" data-v-9a00109c>${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-9a00109c>${ssrInterpolate(unref(armedId) === t.id ? _ctx.$t("deviceTwinPanel.k44653007") : "✕")}</button><span class="${ssrRenderClass([`s-${t.state}`, "twin-state"])}" data-v-9a00109c><i class="twin-state-dot" style="${ssrRenderStyle({ background: stateColor[t.state] || "var(--hud-dim)" })}" data-v-9a00109c></i> ${ssrInterpolate(stateLabel[t.state] || t.state)}</span></div>`);
709
+ _push(`<button class="${ssrRenderClass([{ daq: isDaq(t) }, "twin-card"])}" type="button" data-v-15ec18ea><div class="twin-row" data-v-15ec18ea><span class="twin-model-tag" data-v-15ec18ea>${ssrInterpolate(modelTag(t.modelRef || t.name))}</span><div class="twin-idbar" data-v-15ec18ea><span class="twin-name" data-v-15ec18ea>${ssrInterpolate(t.name)}</span><span class="twin-code" data-v-15ec18ea>${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-15ec18ea>${ssrInterpolate(unref(armedId) === t.id ? _ctx.$t("deviceTwinPanel.k44653007") : "✕")}</button><span class="${ssrRenderClass([`s-${t.state}`, "twin-state"])}" data-v-15ec18ea><i class="twin-state-dot" style="${ssrRenderStyle({ background: stateColor[t.state] || "var(--hud-dim)" })}" data-v-15ec18ea></i> ${ssrInterpolate(stateLabel[t.state] || t.state)}</span></div>`);
710
710
  if (Object.keys(t.telemetry).length) {
711
- _push(`<div class="twin-tele" data-v-9a00109c><!--[-->`);
711
+ _push(`<div class="twin-tele" data-v-15ec18ea><!--[-->`);
712
712
  ssrRenderList(t.telemetry, (v, k) => {
713
- _push(`<span class="tele-item" data-v-9a00109c><em data-v-9a00109c>${ssrInterpolate(k)}</em><b data-v-9a00109c>${ssrInterpolate(fmt(v))}</b></span>`);
713
+ _push(`<span class="tele-item" data-v-15ec18ea><em data-v-15ec18ea>${ssrInterpolate(k)}</em><b data-v-15ec18ea>${ssrInterpolate(fmt(v))}</b></span>`);
714
714
  });
715
715
  _push(`<!--]--></div>`);
716
716
  } else _push(`<!---->`);
717
717
  if (__props.daqLive?.[t.id]?.length) {
718
- _push(`<div class="twin-daq" data-v-9a00109c><!--[-->`);
718
+ _push(`<div class="twin-daq" data-v-15ec18ea><!--[-->`);
719
719
  ssrRenderList(__props.daqLive[t.id], (d, i) => {
720
- _push(`<span class="${ssrRenderClass([{ alarm: d.alarm }, "daq-item"])}" data-v-9a00109c><em data-v-9a00109c>${ssrInterpolate(d.ch)}</em><b data-v-9a00109c>${ssrInterpolate(d.value)}<i data-v-9a00109c>${ssrInterpolate(d.unit)}</i></b></span>`);
720
+ _push(`<span class="${ssrRenderClass([{ alarm: d.alarm }, "daq-item"])}" data-v-15ec18ea><em data-v-15ec18ea>${ssrInterpolate(d.ch)}</em><b data-v-15ec18ea>${ssrInterpolate(d.value)}<i data-v-15ec18ea>${ssrInterpolate(d.unit)}</i></b></span>`);
721
721
  });
722
722
  _push(`<!--]--></div>`);
723
723
  } else _push(`<!---->`);
724
724
  if (__props.dcwLive?.[t.id]?.length) {
725
- _push(`<div class="twin-dcw" data-v-9a00109c><!--[-->`);
725
+ _push(`<div class="twin-dcw" data-v-15ec18ea><!--[-->`);
726
726
  ssrRenderList(__props.dcwLive[t.id], (r) => {
727
- _push(`<div class="dcw-item" data-v-9a00109c><div class="dcw-head" data-v-9a00109c><em data-v-9a00109c>${ssrInterpolate(r.ch)}`);
728
- if (r.src === "recipe") _push(`<i class="dcw-src" data-v-9a00109c>${ssrInterpolate(_ctx.$t("deviceTwinPanel.k48grv006"))}</i>`);
727
+ _push(`<div class="dcw-item" data-v-15ec18ea><div class="dcw-head" data-v-15ec18ea><em data-v-15ec18ea>${ssrInterpolate(r.ch)}`);
728
+ if (r.src === "recipe") _push(`<i class="dcw-src" data-v-15ec18ea>${ssrInterpolate(_ctx.$t("deviceTwinPanel.k48grv006"))}</i>`);
729
729
  else _push(`<!---->`);
730
- _push(`</em><b class="dcw-set" data-v-9a00109c>${ssrInterpolate(r.value != null ? r.value.toFixed(r.decimals) : "--")}<i data-v-9a00109c>${ssrInterpolate(r.unit)}</i></b></div><div class="dcw-win" data-v-9a00109c><span${ssrRenderAttr("title", r.src === "recipe" ? "当前运行配方工艺窗口" : "节点全局量程")} data-v-9a00109c>${ssrInterpolate(dcwWinText(r))}</span></div><div class="dcw-ctrl" data-v-9a00109c><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-9a00109c><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-9a00109c>${ssrInterpolate(unref(dcwBusy) === r.id ? "···" : "SET")}</button></div>`);
731
- if (unref(dcwErrs)[r.id]) _push(`<small class="dcw-err" data-v-9a00109c>${ssrInterpolate(unref(dcwErrs)[r.id])}</small>`);
730
+ _push(`</em><b class="dcw-set" data-v-15ec18ea>${ssrInterpolate(r.value != null ? r.value.toFixed(r.decimals) : "--")}<i data-v-15ec18ea>${ssrInterpolate(r.unit)}</i></b></div>`);
731
+ if (r.readValue != null || r.lastReadAt) {
732
+ _push(`<div class="dcw-act"${ssrRenderAttr("title", _ctx.$t("deviceTwinPanel.k9r7d4e030"))} data-v-15ec18ea><em data-v-15ec18ea>ACT</em><b data-v-15ec18ea>${ssrInterpolate(r.readValue != null ? r.readValue.toFixed(r.decimals) : "--")}<i data-v-15ec18ea>${ssrInterpolate(r.unit)}</i></b>`);
733
+ if (r.lastReadAt) _push(`<i class="dcw-act-at" data-v-15ec18ea>${ssrInterpolate(r.lastReadAt.slice(11, 19))}</i>`);
734
+ else _push(`<!---->`);
735
+ _push(`</div>`);
736
+ } else _push(`<!---->`);
737
+ _push(`<div class="dcw-win" data-v-15ec18ea><span${ssrRenderAttr("title", r.src === "recipe" ? "当前运行配方工艺窗口" : "节点全局量程")} data-v-15ec18ea>${ssrInterpolate(dcwWinText(r))}</span></div><div class="dcw-ctrl" data-v-15ec18ea><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-15ec18ea><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-15ec18ea>${ssrInterpolate(unref(dcwBusy) === r.id ? "···" : "SET")}</button></div>`);
738
+ if (unref(dcwErrs)[r.id]) _push(`<small class="dcw-err" data-v-15ec18ea>${ssrInterpolate(unref(dcwErrs)[r.id])}</small>`);
732
739
  else _push(`<!---->`);
733
740
  _push(`</div>`);
734
741
  });
@@ -738,7 +745,7 @@ var DeviceTwinPanel_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/
738
745
  });
739
746
  _push(`<!--]--></div>`);
740
747
  }
741
- if (unref(ctrlMsg)) _push(`<span class="twin-err" data-v-9a00109c>${ssrInterpolate(unref(ctrlMsg))}</span>`);
748
+ if (unref(ctrlMsg)) _push(`<span class="twin-err" data-v-15ec18ea>${ssrInterpolate(unref(ctrlMsg))}</span>`);
742
749
  else _push(`<!---->`);
743
750
  _push(`</aside>`);
744
751
  };
@@ -752,7 +759,7 @@ DeviceTwinPanel_vue_vue_type_script_setup_true_lang_default.setup = (props, ctx)
752
759
  (ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("components/workshop/DeviceTwinPanel.vue");
753
760
  return _sfc_setup$1 ? _sfc_setup$1(props, ctx) : void 0;
754
761
  };
755
- var DeviceTwinPanel_default = /*#__PURE__*/ Object.assign(_plugin_vue_export_helper_default(DeviceTwinPanel_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-9a00109c"]]), { __name: "WorkshopDeviceTwinPanel" });
762
+ var DeviceTwinPanel_default = /*#__PURE__*/ Object.assign(_plugin_vue_export_helper_default(DeviceTwinPanel_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-15ec18ea"]]), { __name: "WorkshopDeviceTwinPanel" });
756
763
  //#endregion
757
764
  //#region app/composables/workshop/useSceneLayouts.ts
758
765
  /**
@@ -2042,6 +2049,8 @@ var TownView_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineC
2042
2049
  name: n.name,
2043
2050
  unit: n.unit,
2044
2051
  value: n.value,
2052
+ readValue: n.readValue,
2053
+ lastReadAt: n.lastReadAt,
2045
2054
  decimals: n.decimals,
2046
2055
  lo: w.lo,
2047
2056
  hi: w.hi,
@@ -2286,82 +2295,82 @@ var TownView_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineC
2286
2295
  return (_ctx, _push, _parent, _attrs) => {
2287
2296
  const _component_WorkshopAssetLibrary = AssetLibrary_default;
2288
2297
  const _component_WorkshopDeviceTwinPanel = DeviceTwinPanel_default;
2289
- _push(`<div${ssrRenderAttrs(mergeProps({ class: "town-view" }, _attrs))} data-v-771c2c29><header class="topnav" data-v-771c2c29><div class="brand" data-v-771c2c29><svg class="brand-glyph" viewBox="0 0 32 32" fill="none" aria-hidden="true" data-v-771c2c29><path d="M16 2.5 27.5 9v14L16 29.5 4.5 23V9L16 2.5Z" stroke="#35e0a0" stroke-width="1.6" data-v-771c2c29></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-771c2c29></path><circle cx="16" cy="16" r="2.4" fill="#35e0a0" data-v-771c2c29></circle><circle cx="25.5" cy="7.5" r="1.6" fill="#41c8f4" data-v-771c2c29></circle></svg><div data-v-771c2c29><div class="brand-name" data-v-771c2c29> DIGITAL <em data-v-771c2c29>TWIN</em></div><div class="brand-sub" data-v-771c2c29> AGENTWORKSHOP · ${ssrInterpolate(_ctx.$t("townView.klyi8yg127"))}</div></div></div><nav class="nav-tabs"${ssrRenderAttr("aria-label", _ctx.$t("townView.k1c9jyta001"))} data-v-771c2c29><div class="seg" data-v-771c2c29><button class="${ssrRenderClass({ on: unref(mode) === "browse" })}" data-v-771c2c29>${ssrInterpolate(_ctx.$t("townView.k48dwh027"))}</button><button class="${ssrRenderClass({ on: unref(mode) === "edit" })}" data-v-771c2c29>${ssrInterpolate(_ctx.$t("townView.k45eb0028"))}</button></div><button class="nav-action"${ssrIncludeBooleanAttr(unref(mode) !== "edit") ? " disabled" : ""}${ssrRenderAttr("title", unref(mode) === "edit" ? "把全部设备的位置/朝向/缩放写入数据库" : "运行模式只读")} data-v-771c2c29>${ssrInterpolate(_ctx.$t("townView.k1b3bk8t029"))}</button>`);
2290
- if (unref(saveState) && unref(saveState).state !== "idle") _push(`<span class="${ssrRenderClass([`s-${unref(saveState).state}`, "save-chip"])}" data-v-771c2c29>${ssrInterpolate(unref(saveStateLabel))}</span>`);
2298
+ _push(`<div${ssrRenderAttrs(mergeProps({ class: "town-view" }, _attrs))} data-v-ee250387><header class="topnav" data-v-ee250387><div class="brand" data-v-ee250387><svg class="brand-glyph" viewBox="0 0 32 32" fill="none" aria-hidden="true" data-v-ee250387><path d="M16 2.5 27.5 9v14L16 29.5 4.5 23V9L16 2.5Z" stroke="#35e0a0" stroke-width="1.6" data-v-ee250387></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-ee250387></path><circle cx="16" cy="16" r="2.4" fill="#35e0a0" data-v-ee250387></circle><circle cx="25.5" cy="7.5" r="1.6" fill="#41c8f4" data-v-ee250387></circle></svg><div data-v-ee250387><div class="brand-name" data-v-ee250387> DIGITAL <em data-v-ee250387>TWIN</em></div><div class="brand-sub" data-v-ee250387> AGENTWORKSHOP · ${ssrInterpolate(_ctx.$t("townView.klyi8yg127"))}</div></div></div><nav class="nav-tabs"${ssrRenderAttr("aria-label", _ctx.$t("townView.k1c9jyta001"))} data-v-ee250387><div class="seg" data-v-ee250387><button class="${ssrRenderClass({ on: unref(mode) === "browse" })}" data-v-ee250387>${ssrInterpolate(_ctx.$t("townView.k48dwh027"))}</button><button class="${ssrRenderClass({ on: unref(mode) === "edit" })}" data-v-ee250387>${ssrInterpolate(_ctx.$t("townView.k45eb0028"))}</button></div><button class="nav-action"${ssrIncludeBooleanAttr(unref(mode) !== "edit") ? " disabled" : ""}${ssrRenderAttr("title", unref(mode) === "edit" ? "把全部设备的位置/朝向/缩放写入数据库" : "运行模式只读")} data-v-ee250387>${ssrInterpolate(_ctx.$t("townView.k1b3bk8t029"))}</button>`);
2299
+ if (unref(saveState) && unref(saveState).state !== "idle") _push(`<span class="${ssrRenderClass([`s-${unref(saveState).state}`, "save-chip"])}" data-v-ee250387>${ssrInterpolate(unref(saveStateLabel))}</span>`);
2291
2300
  else _push(`<!---->`);
2292
- _push(`</nav><div class="nav-right" data-v-771c2c29><span class="${ssrRenderClass([{ "nav-bell-warn": unref(activeAlarmCount) > 0 }, "nav-chip mono"])}"${ssrRenderAttr("title", _ctx.$t("townView.k1fsi3ir002"))} data-v-771c2c29>◉ ${ssrInterpolate(unref(activeAlarmCount))}</span><span class="nav-chip mono" data-v-771c2c29>${ssrInterpolate(unref(fps))} FPS</span><div class="avatar-chip"${ssrRenderAttr("title", _ctx.$t("townView.k1demf38003"))} data-v-771c2c29><div class="avatar-fallback" data-v-771c2c29>${ssrInterpolate((unref(userStore).user?.name ?? "OP").slice(0, 2).toUpperCase())}</div><span data-v-771c2c29>${ssrInterpolate(unref(userStore).user?.name || _ctx.$t("townView.k1pub99m139"))}</span></div></div></header><div class="app" data-v-771c2c29><aside class="rail rail-left" data-v-771c2c29><section class="panel" data-v-771c2c29><div class="panel-hd" data-v-771c2c29><h3 data-v-771c2c29>${ssrInterpolate(_ctx.$t("townView.k1k75lzy030"))}</h3><span class="panel-tag" data-v-771c2c29>${ssrInterpolate(unref(deviceModels).length)}</span></div>`);
2301
+ _push(`</nav><div class="nav-right" data-v-ee250387><span class="${ssrRenderClass([{ "nav-bell-warn": unref(activeAlarmCount) > 0 }, "nav-chip mono"])}"${ssrRenderAttr("title", _ctx.$t("townView.k1fsi3ir002"))} data-v-ee250387>◉ ${ssrInterpolate(unref(activeAlarmCount))}</span><span class="nav-chip mono" data-v-ee250387>${ssrInterpolate(unref(fps))} FPS</span><div class="avatar-chip"${ssrRenderAttr("title", _ctx.$t("townView.k1demf38003"))} data-v-ee250387><div class="avatar-fallback" data-v-ee250387>${ssrInterpolate((unref(userStore).user?.name ?? "OP").slice(0, 2).toUpperCase())}</div><span data-v-ee250387>${ssrInterpolate(unref(userStore).user?.name || _ctx.$t("townView.k1pub99m139"))}</span></div></div></header><div class="app" data-v-ee250387><aside class="rail rail-left" data-v-ee250387><section class="panel" data-v-ee250387><div class="panel-hd" data-v-ee250387><h3 data-v-ee250387>${ssrInterpolate(_ctx.$t("townView.k1k75lzy030"))}</h3><span class="panel-tag" data-v-ee250387>${ssrInterpolate(unref(deviceModels).length)}</span></div>`);
2293
2302
  _push(ssrRenderComponent(_component_WorkshopAssetLibrary, { class: "lib-embed" }, null, _parent));
2294
- _push(`</section><section class="panel" data-v-771c2c29><div class="panel-hd" data-v-771c2c29><h3 data-v-771c2c29>${ssrInterpolate(_ctx.$t("townView.k2gwyas031"))}</h3><span class="panel-tag" data-v-771c2c29>${ssrInterpolate(unref(daqTwins).length)}</span></div><div class="daq-ctrl" data-v-771c2c29><button class="${ssrRenderClass([{ on: unref(daq).controller.running }, "daq-ctl-btn"])}"${ssrRenderAttr("title", unref(daq).controller.running ? "暂停全部采集:停止所有启用节点的采样(节点级启停独立)" : "恢复全部采集:仅启用节点恢复采集(手动停用的保持停用)")} data-v-771c2c29>${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-771c2c29>${ssrInterpolate(_ctx.$t("townView.k3xg3w032"))} <input type="number" min="200" max="60000" step="100"${ssrRenderAttr("value", unref(daq).controller.defaultIntervalMs)} data-v-771c2c29>ms </label></div><div class="daq-list" data-v-771c2c29><!--[-->`);
2303
+ _push(`</section><section class="panel" data-v-ee250387><div class="panel-hd" data-v-ee250387><h3 data-v-ee250387>${ssrInterpolate(_ctx.$t("townView.k2gwyas031"))}</h3><span class="panel-tag" data-v-ee250387>${ssrInterpolate(unref(daqTwins).length)}</span></div><div class="daq-ctrl" data-v-ee250387><button class="${ssrRenderClass([{ on: unref(daq).controller.running }, "daq-ctl-btn"])}"${ssrRenderAttr("title", unref(daq).controller.running ? "暂停全部采集:停止所有启用节点的采样(节点级启停独立)" : "恢复全部采集:仅启用节点恢复采集(手动停用的保持停用)")} data-v-ee250387>${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-ee250387>${ssrInterpolate(_ctx.$t("townView.k3xg3w032"))} <input type="number" min="200" max="60000" step="100"${ssrRenderAttr("value", unref(daq).controller.defaultIntervalMs)} data-v-ee250387>ms </label></div><div class="daq-list" data-v-ee250387><!--[-->`);
2295
2304
  ssrRenderList(unref(daqTemplates), (tpl) => {
2296
- _push(`<div class="daq-group" data-v-771c2c29><div class="${ssrRenderClass([{ open: !!unref(treeOpen)[`daq:${tpl.id}`] }, "daq-card tpl"])}" role="button" tabindex="0"${ssrRenderAttr("title", _ctx.$t("townView.k2tplxp0001", {
2305
+ _push(`<div class="daq-group" data-v-ee250387><div class="${ssrRenderClass([{ open: !!unref(treeOpen)[`daq:${tpl.id}`] }, "daq-card tpl"])}" role="button" tabindex="0"${ssrRenderAttr("title", _ctx.$t("townView.k2tplxp0001", {
2297
2306
  p0: tpl.name,
2298
2307
  p1: tpl.ch,
2299
2308
  p2: tpl.min,
2300
2309
  p3: tpl.max,
2301
2310
  p4: tpl.unit
2302
- }))} data-v-771c2c29><span class="daq-caret" data-v-771c2c29>▶</span><span class="daq-ico" data-v-771c2c29><svg class="daq-svg" viewBox="0 0 24 24" data-v-771c2c29>${daqIcon(tpl.icon) ?? ""}</svg></span><div class="daq-meta" data-v-771c2c29><span class="daq-name" data-v-771c2c29>${ssrInterpolate(tpl.name)}</span><span class="daq-code" data-v-771c2c29>${ssrInterpolate(tpl.code)}</span></div>`);
2303
- if (unref(mode) === "edit") _push(`<button class="daq-add"${ssrRenderAttr("title", _ctx.$t("townView.k2tplxp0002", { p0: tpl.name }))} data-v-771c2c29> + </button>`);
2311
+ }))} data-v-ee250387><span class="daq-caret" data-v-ee250387>▶</span><span class="daq-ico" data-v-ee250387><svg class="daq-svg" viewBox="0 0 24 24" data-v-ee250387>${daqIcon(tpl.icon) ?? ""}</svg></span><div class="daq-meta" data-v-ee250387><span class="daq-name" data-v-ee250387>${ssrInterpolate(tpl.name)}</span><span class="daq-code" data-v-ee250387>${ssrInterpolate(tpl.code)}</span></div>`);
2312
+ if (unref(mode) === "edit") _push(`<button class="daq-add"${ssrRenderAttr("title", _ctx.$t("townView.k2tplxp0002", { p0: tpl.name }))} data-v-ee250387> + </button>`);
2304
2313
  else _push(`<!---->`);
2305
- _push(`<span class="daq-count" data-v-771c2c29>×${ssrInterpolate(unref(daqNodesByTpl).get(tpl.id)?.length ?? 0)}</span></div>`);
2314
+ _push(`<span class="daq-count" data-v-ee250387>×${ssrInterpolate(unref(daqNodesByTpl).get(tpl.id)?.length ?? 0)}</span></div>`);
2306
2315
  if (unref(treeOpen)[`daq:${tpl.id}`]) {
2307
- _push(`<div class="daq-children" data-v-771c2c29><!--[-->`);
2316
+ _push(`<div class="daq-children" data-v-ee250387><!--[-->`);
2308
2317
  ssrRenderList(unref(daqNodesByTpl).get(tpl.id) ?? [], (n) => {
2309
- _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-771c2c29><span class="${ssrRenderClass([daqLeafState(n), "node-dot"])}" data-v-771c2c29></span><div class="daq-meta" data-v-771c2c29><span class="daq-name" data-v-771c2c29>${ssrInterpolate(n.name)}</span><span class="daq-node-sub" data-v-771c2c29><span class="node-val mono" data-v-771c2c29>${ssrInterpolate(n.value != null ? `${n.value.toFixed(tpl.decimals)} ${tpl.unit}` : "--")}</span><span class="node-dev" data-v-771c2c29>${ssrInterpolate(n.deviceBindingId ? unref(deviceTwins).byId(n.deviceBindingId)?.name ?? _ctx.$t("townView.k3own4q148") : _ctx.$t("townView.k3own4q148"))}</span></span></div>`);
2310
- if (typeof n.posX === "number") _push(`<span class="scene-cur" data-v-771c2c29>✓</span>`);
2318
+ _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-ee250387><span class="${ssrRenderClass([daqLeafState(n), "node-dot"])}" data-v-ee250387></span><div class="daq-meta" data-v-ee250387><span class="daq-name" data-v-ee250387>${ssrInterpolate(n.name)}</span><span class="daq-node-sub" data-v-ee250387><span class="node-val mono" data-v-ee250387>${ssrInterpolate(n.value != null ? `${n.value.toFixed(tpl.decimals)} ${tpl.unit}` : "--")}</span><span class="node-dev" data-v-ee250387>${ssrInterpolate(n.deviceBindingId ? unref(deviceTwins).byId(n.deviceBindingId)?.name ?? _ctx.$t("townView.k3own4q148") : _ctx.$t("townView.k3own4q148"))}</span></span></div>`);
2319
+ if (typeof n.posX === "number") _push(`<span class="scene-cur" data-v-ee250387>✓</span>`);
2311
2320
  else _push(`<!---->`);
2312
2321
  _push(`</div>`);
2313
2322
  });
2314
2323
  _push(`<!--]-->`);
2315
- if (!unref(daqNodesByTpl).get(tpl.id)?.length) _push(`<div class="daq-empty-hint" data-v-771c2c29>${ssrInterpolate(_ctx.$t("townView.k2tplxp0003"))}</div>`);
2324
+ if (!unref(daqNodesByTpl).get(tpl.id)?.length) _push(`<div class="daq-empty-hint" data-v-ee250387>${ssrInterpolate(_ctx.$t("townView.k2tplxp0003"))}</div>`);
2316
2325
  else _push(`<!---->`);
2317
2326
  _push(`</div>`);
2318
2327
  } else _push(`<!---->`);
2319
2328
  _push(`</div>`);
2320
2329
  });
2321
- _push(`<!--]--></div></section><section class="panel" data-v-771c2c29><div class="panel-hd" data-v-771c2c29><h3 data-v-771c2c29>${ssrInterpolate(_ctx.$t("townView.km7ayhi033"))}</h3><span class="panel-tag" data-v-771c2c29>${ssrInterpolate(unref(dcw).nodes.length)}</span></div><div class="daq-list" data-v-771c2c29><!--[-->`);
2330
+ _push(`<!--]--></div></section><section class="panel" data-v-ee250387><div class="panel-hd" data-v-ee250387><h3 data-v-ee250387>${ssrInterpolate(_ctx.$t("townView.km7ayhi033"))}</h3><span class="panel-tag" data-v-ee250387>${ssrInterpolate(unref(dcw).nodes.length)}</span></div><div class="daq-list" data-v-ee250387><!--[-->`);
2322
2331
  ssrRenderList(unref(dcwTemplates), (tpl) => {
2323
- _push(`<div class="daq-group" data-v-771c2c29><div class="${ssrRenderClass([{ open: !!unref(treeOpen)[`dcw:${tpl.id}`] }, "daq-card tpl"])}" role="button" tabindex="0"${ssrRenderAttr("title", _ctx.$t("townView.k2tplxp0001", {
2332
+ _push(`<div class="daq-group" data-v-ee250387><div class="${ssrRenderClass([{ open: !!unref(treeOpen)[`dcw:${tpl.id}`] }, "daq-card tpl"])}" role="button" tabindex="0"${ssrRenderAttr("title", _ctx.$t("townView.k2tplxp0001", {
2324
2333
  p0: tpl.name,
2325
2334
  p1: tpl.ch,
2326
2335
  p2: tpl.min,
2327
2336
  p3: tpl.max,
2328
2337
  p4: tpl.unit
2329
- }))} data-v-771c2c29><span class="daq-caret" data-v-771c2c29>▶</span><span class="daq-ico" data-v-771c2c29><svg class="daq-svg" viewBox="0 0 24 24" data-v-771c2c29>${daqIcon(tpl.icon) ?? ""}</svg></span><div class="daq-meta" data-v-771c2c29><span class="daq-name" data-v-771c2c29>${ssrInterpolate(tpl.name)}</span><span class="daq-code" data-v-771c2c29>${ssrInterpolate(tpl.code)}</span></div>`);
2330
- if (unref(mode) === "edit") _push(`<button class="daq-add"${ssrRenderAttr("title", _ctx.$t("townView.k2tplxp0002", { p0: tpl.name }))} data-v-771c2c29> + </button>`);
2338
+ }))} data-v-ee250387><span class="daq-caret" data-v-ee250387>▶</span><span class="daq-ico" data-v-ee250387><svg class="daq-svg" viewBox="0 0 24 24" data-v-ee250387>${daqIcon(tpl.icon) ?? ""}</svg></span><div class="daq-meta" data-v-ee250387><span class="daq-name" data-v-ee250387>${ssrInterpolate(tpl.name)}</span><span class="daq-code" data-v-ee250387>${ssrInterpolate(tpl.code)}</span></div>`);
2339
+ if (unref(mode) === "edit") _push(`<button class="daq-add"${ssrRenderAttr("title", _ctx.$t("townView.k2tplxp0002", { p0: tpl.name }))} data-v-ee250387> + </button>`);
2331
2340
  else _push(`<!---->`);
2332
- _push(`<span class="daq-count" data-v-771c2c29>×${ssrInterpolate(unref(dcwNodesByTpl).get(tpl.id)?.length ?? 0)}</span></div>`);
2341
+ _push(`<span class="daq-count" data-v-ee250387>×${ssrInterpolate(unref(dcwNodesByTpl).get(tpl.id)?.length ?? 0)}</span></div>`);
2333
2342
  if (unref(treeOpen)[`dcw:${tpl.id}`]) {
2334
- _push(`<div class="daq-children" data-v-771c2c29><!--[-->`);
2343
+ _push(`<div class="daq-children" data-v-ee250387><!--[-->`);
2335
2344
  ssrRenderList(unref(dcwNodesByTpl).get(tpl.id) ?? [], (n) => {
2336
- _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-771c2c29><span class="${ssrRenderClass([dcwLeafState(n), "node-dot"])}" data-v-771c2c29></span><div class="daq-meta" data-v-771c2c29><span class="daq-name" data-v-771c2c29>${ssrInterpolate(n.name)}</span><span class="daq-node-sub" data-v-771c2c29><span class="node-val mono" data-v-771c2c29>${ssrInterpolate(n.value != null ? `${n.value.toFixed(tpl.decimals)} ${tpl.unit}` : "--")}</span><span class="node-dev" data-v-771c2c29>${ssrInterpolate(n.deviceBindingId ? unref(deviceTwins).byId(n.deviceBindingId)?.name ?? _ctx.$t("townView.k3own4q148") : _ctx.$t("townView.k3own4q148"))}</span></span></div>`);
2337
- if (typeof n.posX === "number") _push(`<span class="scene-cur" data-v-771c2c29>✓</span>`);
2345
+ _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-ee250387><span class="${ssrRenderClass([dcwLeafState(n), "node-dot"])}" data-v-ee250387></span><div class="daq-meta" data-v-ee250387><span class="daq-name" data-v-ee250387>${ssrInterpolate(n.name)}</span><span class="daq-node-sub" data-v-ee250387><span class="node-val mono" data-v-ee250387>${ssrInterpolate(n.value != null ? `${n.value.toFixed(tpl.decimals)} ${tpl.unit}` : "--")}</span><span class="node-dev" data-v-ee250387>${ssrInterpolate(n.deviceBindingId ? unref(deviceTwins).byId(n.deviceBindingId)?.name ?? _ctx.$t("townView.k3own4q148") : _ctx.$t("townView.k3own4q148"))}</span></span></div>`);
2346
+ if (typeof n.posX === "number") _push(`<span class="scene-cur" data-v-ee250387>✓</span>`);
2338
2347
  else _push(`<!---->`);
2339
2348
  _push(`</div>`);
2340
2349
  });
2341
2350
  _push(`<!--]-->`);
2342
- if (!unref(dcwNodesByTpl).get(tpl.id)?.length) _push(`<div class="daq-empty-hint" data-v-771c2c29>${ssrInterpolate(_ctx.$t("townView.k2tplxp0003"))}</div>`);
2351
+ if (!unref(dcwNodesByTpl).get(tpl.id)?.length) _push(`<div class="daq-empty-hint" data-v-ee250387>${ssrInterpolate(_ctx.$t("townView.k2tplxp0003"))}</div>`);
2343
2352
  else _push(`<!---->`);
2344
2353
  _push(`</div>`);
2345
2354
  } else _push(`<!---->`);
2346
2355
  _push(`</div>`);
2347
2356
  });
2348
- _push(`<!--]--></div></section><section class="panel" data-v-771c2c29><div class="panel-hd" data-v-771c2c29><h3 data-v-771c2c29>${ssrInterpolate(_ctx.$t("townView.k1c9n911034"))}</h3><span class="panel-tag" data-v-771c2c29>${ssrInterpolate(unref(dockChannels).length)}</span></div><div class="scene-list" data-v-771c2c29><!--[-->`);
2357
+ _push(`<!--]--></div></section><section class="panel" data-v-ee250387><div class="panel-hd" data-v-ee250387><h3 data-v-ee250387>${ssrInterpolate(_ctx.$t("townView.k1c9n911034"))}</h3><span class="panel-tag" data-v-ee250387>${ssrInterpolate(unref(dockChannels).length)}</span></div><div class="scene-list" data-v-ee250387><!--[-->`);
2349
2358
  ssrRenderList(unref(dockChannels), (ch) => {
2350
- _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-771c2c29><span class="scene-ico" style="${ssrRenderStyle({ "--ch": ch.color })}" data-v-771c2c29></span><div class="scene-meta-wrap" data-v-771c2c29><span class="scene-name" data-v-771c2c29>${ssrInterpolate(ch.name)}</span><span class="scene-meta" data-v-771c2c29>${ssrInterpolate(ch.agentCount)} ${ssrInterpolate(_ctx.$t("townView.k1brss7t128"))} ${ssrInterpolate(ch.placed ? _ctx.$t("townView.k3n94g3141") : _ctx.$t("townView.k3os7i3176"))}</span></div>`);
2351
- if (ch.placed) _push(`<span class="scene-cur" data-v-771c2c29>✓</span>`);
2352
- else _push(`<span class="scene-add" data-v-771c2c29>+</span>`);
2359
+ _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-ee250387><span class="scene-ico" style="${ssrRenderStyle({ "--ch": ch.color })}" data-v-ee250387></span><div class="scene-meta-wrap" data-v-ee250387><span class="scene-name" data-v-ee250387>${ssrInterpolate(ch.name)}</span><span class="scene-meta" data-v-ee250387>${ssrInterpolate(ch.agentCount)} ${ssrInterpolate(_ctx.$t("townView.k1brss7t128"))} ${ssrInterpolate(ch.placed ? _ctx.$t("townView.k3n94g3141") : _ctx.$t("townView.k3os7i3176"))}</span></div>`);
2360
+ if (ch.placed) _push(`<span class="scene-cur" data-v-ee250387>✓</span>`);
2361
+ else _push(`<span class="scene-add" data-v-ee250387>+</span>`);
2353
2362
  _push(`</div>`);
2354
2363
  });
2355
2364
  _push(`<!--]-->`);
2356
- if (unref(dockHint)) _push(`<div class="scene-hint" data-v-771c2c29>${ssrInterpolate(unref(dockHint))}</div>`);
2365
+ if (unref(dockHint)) _push(`<div class="scene-hint" data-v-ee250387>${ssrInterpolate(unref(dockHint))}</div>`);
2357
2366
  else _push(`<!---->`);
2358
- _push(`</div></section></aside><main class="stage-col" data-v-771c2c29><div class="stage" data-v-771c2c29><div id="town-host" class="town-host" data-v-771c2c29></div><div class="stage-vignette" data-v-771c2c29></div><div class="stage-top" data-v-771c2c29><div class="vp-title" data-v-771c2c29><h2 data-v-771c2c29>${ssrInterpolate(_ctx.$t("townView.k1b0z4vr035"))}</h2><span class="vp-id" data-v-771c2c29>CH · ${ssrInterpolate(unref(activeChannelName) || _ctx.$t("townView.k3lkuz3142"))}</span></div><div class="vp-tools" data-v-771c2c29><button class="vp-tool"${ssrRenderAttr("title", _ctx.$t("townView.k18d6wnb005"))} data-v-771c2c29><svg class="vp-svg" viewBox="0 0 24 24" data-v-771c2c29><circle cx="12" cy="12" r="7" data-v-771c2c29></circle><path d="M12 2v4M12 18v4M2 12h4M18 12h4" data-v-771c2c29></path></svg></button><button class="${ssrRenderClass([{ on: unref(orbitOn) }, "vp-tool"])}"${ssrRenderAttr("title", _ctx.$t("townView.k1io51dn006"))} data-v-771c2c29><svg class="vp-svg" viewBox="0 0 24 24" data-v-771c2c29><circle cx="12" cy="12" r="3.2" data-v-771c2c29></circle><path d="M20.5 9a10 10 0 0 1 .3 4.5M3.5 15a10 10 0 0 1-.3-4.5" data-v-771c2c29></path></svg></button><button class="${ssrRenderClass([{ on: unref(showCallouts) }, "vp-tool"])}"${ssrRenderAttr("title", _ctx.$t("townView.k1sgjlq8007"))} data-v-771c2c29><svg class="vp-svg" viewBox="0 0 24 24" data-v-771c2c29><path d="M4 8h12l4 4-4 4H4z" data-v-771c2c29></path><circle cx="8.5" cy="12" r="1.4" data-v-771c2c29></circle></svg></button><button class="vp-tool"${ssrRenderAttr("title", _ctx.$t("townView.k3wuf0008"))} data-v-771c2c29><svg class="vp-svg" viewBox="0 0 24 24" data-v-771c2c29><path d="M4 9V4h5M20 9V4h-5M4 15v5h5M20 15v5h-5" data-v-771c2c29></path></svg></button></div></div><div class="angle-chip" data-v-771c2c29><select${ssrRenderAttr("value", unref(viewPreset))}${ssrRenderAttr("aria-label", _ctx.$t("townView.k1k4j5i7009"))} data-v-771c2c29><option value="std" data-v-771c2c29>${ssrInterpolate(_ctx.$t("townView.kv72860036"))}</option><option value="top" data-v-771c2c29> 俯视 · TOP </option><option value="front" data-v-771c2c29> 前视 · FRONT </option><option value="side" data-v-771c2c29> 侧视 · SIDE </option></select></div>`);
2367
+ _push(`</div></section></aside><main class="stage-col" data-v-ee250387><div class="stage" data-v-ee250387><div id="town-host" class="town-host" data-v-ee250387></div><div class="stage-vignette" data-v-ee250387></div><div class="stage-top" data-v-ee250387><div class="vp-title" data-v-ee250387><h2 data-v-ee250387>${ssrInterpolate(_ctx.$t("townView.k1b0z4vr035"))}</h2><span class="vp-id" data-v-ee250387>CH · ${ssrInterpolate(unref(activeChannelName) || _ctx.$t("townView.k3lkuz3142"))}</span></div><div class="vp-tools" data-v-ee250387><button class="vp-tool"${ssrRenderAttr("title", _ctx.$t("townView.k18d6wnb005"))} data-v-ee250387><svg class="vp-svg" viewBox="0 0 24 24" data-v-ee250387><circle cx="12" cy="12" r="7" data-v-ee250387></circle><path d="M12 2v4M12 18v4M2 12h4M18 12h4" data-v-ee250387></path></svg></button><button class="${ssrRenderClass([{ on: unref(orbitOn) }, "vp-tool"])}"${ssrRenderAttr("title", _ctx.$t("townView.k1io51dn006"))} data-v-ee250387><svg class="vp-svg" viewBox="0 0 24 24" data-v-ee250387><circle cx="12" cy="12" r="3.2" data-v-ee250387></circle><path d="M20.5 9a10 10 0 0 1 .3 4.5M3.5 15a10 10 0 0 1-.3-4.5" data-v-ee250387></path></svg></button><button class="${ssrRenderClass([{ on: unref(showCallouts) }, "vp-tool"])}"${ssrRenderAttr("title", _ctx.$t("townView.k1sgjlq8007"))} data-v-ee250387><svg class="vp-svg" viewBox="0 0 24 24" data-v-ee250387><path d="M4 8h12l4 4-4 4H4z" data-v-ee250387></path><circle cx="8.5" cy="12" r="1.4" data-v-ee250387></circle></svg></button><button class="vp-tool"${ssrRenderAttr("title", _ctx.$t("townView.k3wuf0008"))} data-v-ee250387><svg class="vp-svg" viewBox="0 0 24 24" data-v-ee250387><path d="M4 9V4h5M20 9V4h-5M4 15v5h5M20 15v5h-5" data-v-ee250387></path></svg></button></div></div><div class="angle-chip" data-v-ee250387><select${ssrRenderAttr("value", unref(viewPreset))}${ssrRenderAttr("aria-label", _ctx.$t("townView.k1k4j5i7009"))} data-v-ee250387><option value="std" data-v-ee250387>${ssrInterpolate(_ctx.$t("townView.kv72860036"))}</option><option value="top" data-v-ee250387> 俯视 · TOP </option><option value="front" data-v-ee250387> 前视 · FRONT </option><option value="side" data-v-ee250387> 侧视 · SIDE </option></select></div>`);
2359
2368
  if (unref(showCallouts)) {
2360
- _push(`<!--[--><svg class="leaders" data-v-771c2c29><!--[-->`);
2369
+ _push(`<!--[--><svg class="leaders" data-v-ee250387><!--[-->`);
2361
2370
  ssrRenderList(unref(callouts), (c) => {
2362
- _push(`<g class="${ssrRenderClass({ near: c.near })}" style="${ssrRenderStyle(c.leader ? null : { display: "none" })}" data-v-771c2c29><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-771c2c29></path><circle${ssrRenderAttr("cx", c.x)}${ssrRenderAttr("cy", c.y)} r="2.6"${ssrRenderAttr("fill", c.warn ? "#f6c453" : "#41c8f4")} data-v-771c2c29></circle></g>`);
2371
+ _push(`<g class="${ssrRenderClass({ near: c.near })}" style="${ssrRenderStyle(c.leader ? null : { display: "none" })}" data-v-ee250387><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-ee250387></path><circle${ssrRenderAttr("cx", c.x)}${ssrRenderAttr("cy", c.y)} r="2.6"${ssrRenderAttr("fill", c.warn ? "#f6c453" : "#41c8f4")} data-v-ee250387></circle></g>`);
2363
2372
  });
2364
- _push(`<!--]--></svg><div class="callout-layer" data-v-771c2c29><!--[-->`);
2373
+ _push(`<!--]--></svg><div class="callout-layer" data-v-ee250387><!--[-->`);
2365
2374
  ssrRenderList(unref(callouts), (c) => {
2366
2375
  _push(`<div class="${ssrRenderClass([{
2367
2376
  warn: c.warn,
@@ -2369,12 +2378,12 @@ var TownView_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineC
2369
2378
  }, "callout"])}" style="${ssrRenderStyle({
2370
2379
  left: c.x + "px",
2371
2380
  top: c.y + "px"
2372
- })}"${ssrRenderAttr("title", _ctx.$t("townView.k1ejxiwp010"))} data-v-771c2c29><div class="co-label" data-v-771c2c29><span class="co-dot" data-v-771c2c29></span>${ssrInterpolate(c.label)}</div><div class="co-val" data-v-771c2c29>${ssrInterpolate(c.value)}<small data-v-771c2c29>${ssrInterpolate(c.unit)}</small></div><div class="co-range" data-v-771c2c29>${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>`);
2381
+ })}"${ssrRenderAttr("title", _ctx.$t("townView.k1ejxiwp010"))} data-v-ee250387><div class="co-label" data-v-ee250387><span class="co-dot" data-v-ee250387></span>${ssrInterpolate(c.label)}</div><div class="co-val" data-v-ee250387>${ssrInterpolate(c.value)}<small data-v-ee250387>${ssrInterpolate(c.unit)}</small></div><div class="co-range" data-v-ee250387>${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>`);
2373
2382
  });
2374
2383
  _push(`<!--]--></div><!--]-->`);
2375
2384
  } else _push(`<!---->`);
2376
- _push(`<div class="kpi-strip" data-v-771c2c29><div class="kpi" data-v-771c2c29><span class="kpi-ico c1" data-v-771c2c29><svg class="kpi-svg" viewBox="0 0 24 24" data-v-771c2c29><path d="M4 8.5 12 4l8 4.5v7L12 20l-8-4.5v-7Z" data-v-771c2c29></path><path d="M4 8.5l8 4.5 8-4.5M12 13v7" data-v-771c2c29></path></svg></span><div class="kpi-meta" data-v-771c2c29><div class="kpi-label" data-v-771c2c29>${ssrInterpolate(_ctx.$t("townView.k1k6xemt037"))}</div><div class="kpi-val" data-v-771c2c29>${ssrInterpolate(unref(deviceCount))}<small data-v-771c2c29>${ssrInterpolate(_ctx.$t("townView.k49lh038"))}</small></div></div></div><div class="kpi" data-v-771c2c29><span class="kpi-ico c2" data-v-771c2c29><svg class="kpi-svg" viewBox="0 0 24 24" data-v-771c2c29><path d="m5 12.5 4.5 4.5L19 7.5" data-v-771c2c29></path></svg></span><div class="kpi-meta" data-v-771c2c29><div class="kpi-label" data-v-771c2c29>${ssrInterpolate(_ctx.$t("townView.k1l1a9t2039"))}</div><div class="kpi-val" data-v-771c2c29>${ssrInterpolate(unref(runningCount))}<small data-v-771c2c29>${ssrInterpolate(_ctx.$t("townView.k49lh038"))}</small></div></div></div><div class="kpi" data-v-771c2c29><span class="kpi-ico c3" data-v-771c2c29><svg class="kpi-svg" viewBox="0 0 24 24" data-v-771c2c29><path d="M12 3 22 20H2L12 3Z" data-v-771c2c29></path><path d="M12 10v4M12 17v.2" data-v-771c2c29></path></svg></span><div class="kpi-meta" data-v-771c2c29><div class="kpi-label" data-v-771c2c29>${ssrInterpolate(_ctx.$t("townView.k1fsi3ir002"))}</div><div class="kpi-val" data-v-771c2c29>${ssrInterpolate(unref(activeAlarmCount))}<small data-v-771c2c29>${ssrInterpolate(_ctx.$t("townView.k4dfq040"))}</small></div></div></div><div class="kpi" data-v-771c2c29><span class="kpi-ico c4" data-v-771c2c29><svg class="kpi-svg" viewBox="0 0 24 24" data-v-771c2c29><path d="M9.5 14.5 14.5 9.5" data-v-771c2c29></path><path d="M11 6.5 12.8 4.7a4 4 0 0 1 5.6 5.6L16.5 12" data-v-771c2c29></path><path d="m13 17.5-1.8 1.8a4 4 0 0 1-5.6-5.6L7.5 12" data-v-771c2c29></path></svg></span><div class="kpi-meta" data-v-771c2c29><div class="kpi-label" data-v-771c2c29>${ssrInterpolate(_ctx.$t("townView.k1emsai1041"))}</div><div class="kpi-val" data-v-771c2c29>${ssrInterpolate(unref(daqTwins).length)}<small data-v-771c2c29>${ssrInterpolate(_ctx.$t("townView.k4l1w042"))}</small></div></div></div><div class="kpi" data-v-771c2c29><span class="kpi-ico c5" data-v-771c2c29><svg class="kpi-svg" viewBox="0 0 24 24" data-v-771c2c29><path d="M5 19a9 9 0 1 1 14 0" data-v-771c2c29></path><path d="M12 13l3.5-3.5" data-v-771c2c29></path><circle cx="12" cy="13" r="1.4" data-v-771c2c29></circle></svg></span><div class="kpi-meta" data-v-771c2c29><div class="kpi-label" data-v-771c2c29>${ssrInterpolate(_ctx.$t("townView.kbrxdq1043"))}</div><div class="kpi-val" data-v-771c2c29>${ssrInterpolate(unref(healthPct))}<small data-v-771c2c29>%</small></div></div></div></div>`);
2377
- if (unref(sceneEmpty)) _push(`<div class="empty-hint" data-v-771c2c29><b data-v-771c2c29>${ssrInterpolate(_ctx.$t("townView.k3rwxjc044"))}</b><span data-v-771c2c29>${ssrInterpolate(_ctx.$t("townView.k1sa1eaj045"))}</span></div>`);
2385
+ _push(`<div class="kpi-strip" data-v-ee250387><div class="kpi" data-v-ee250387><span class="kpi-ico c1" data-v-ee250387><svg class="kpi-svg" viewBox="0 0 24 24" data-v-ee250387><path d="M4 8.5 12 4l8 4.5v7L12 20l-8-4.5v-7Z" data-v-ee250387></path><path d="M4 8.5l8 4.5 8-4.5M12 13v7" data-v-ee250387></path></svg></span><div class="kpi-meta" data-v-ee250387><div class="kpi-label" data-v-ee250387>${ssrInterpolate(_ctx.$t("townView.k1k6xemt037"))}</div><div class="kpi-val" data-v-ee250387>${ssrInterpolate(unref(deviceCount))}<small data-v-ee250387>${ssrInterpolate(_ctx.$t("townView.k49lh038"))}</small></div></div></div><div class="kpi" data-v-ee250387><span class="kpi-ico c2" data-v-ee250387><svg class="kpi-svg" viewBox="0 0 24 24" data-v-ee250387><path d="m5 12.5 4.5 4.5L19 7.5" data-v-ee250387></path></svg></span><div class="kpi-meta" data-v-ee250387><div class="kpi-label" data-v-ee250387>${ssrInterpolate(_ctx.$t("townView.k1l1a9t2039"))}</div><div class="kpi-val" data-v-ee250387>${ssrInterpolate(unref(runningCount))}<small data-v-ee250387>${ssrInterpolate(_ctx.$t("townView.k49lh038"))}</small></div></div></div><div class="kpi" data-v-ee250387><span class="kpi-ico c3" data-v-ee250387><svg class="kpi-svg" viewBox="0 0 24 24" data-v-ee250387><path d="M12 3 22 20H2L12 3Z" data-v-ee250387></path><path d="M12 10v4M12 17v.2" data-v-ee250387></path></svg></span><div class="kpi-meta" data-v-ee250387><div class="kpi-label" data-v-ee250387>${ssrInterpolate(_ctx.$t("townView.k1fsi3ir002"))}</div><div class="kpi-val" data-v-ee250387>${ssrInterpolate(unref(activeAlarmCount))}<small data-v-ee250387>${ssrInterpolate(_ctx.$t("townView.k4dfq040"))}</small></div></div></div><div class="kpi" data-v-ee250387><span class="kpi-ico c4" data-v-ee250387><svg class="kpi-svg" viewBox="0 0 24 24" data-v-ee250387><path d="M9.5 14.5 14.5 9.5" data-v-ee250387></path><path d="M11 6.5 12.8 4.7a4 4 0 0 1 5.6 5.6L16.5 12" data-v-ee250387></path><path d="m13 17.5-1.8 1.8a4 4 0 0 1-5.6-5.6L7.5 12" data-v-ee250387></path></svg></span><div class="kpi-meta" data-v-ee250387><div class="kpi-label" data-v-ee250387>${ssrInterpolate(_ctx.$t("townView.k1emsai1041"))}</div><div class="kpi-val" data-v-ee250387>${ssrInterpolate(unref(daqTwins).length)}<small data-v-ee250387>${ssrInterpolate(_ctx.$t("townView.k4l1w042"))}</small></div></div></div><div class="kpi" data-v-ee250387><span class="kpi-ico c5" data-v-ee250387><svg class="kpi-svg" viewBox="0 0 24 24" data-v-ee250387><path d="M5 19a9 9 0 1 1 14 0" data-v-ee250387></path><path d="M12 13l3.5-3.5" data-v-ee250387></path><circle cx="12" cy="13" r="1.4" data-v-ee250387></circle></svg></span><div class="kpi-meta" data-v-ee250387><div class="kpi-label" data-v-ee250387>${ssrInterpolate(_ctx.$t("townView.kbrxdq1043"))}</div><div class="kpi-val" data-v-ee250387>${ssrInterpolate(unref(healthPct))}<small data-v-ee250387>%</small></div></div></div></div>`);
2386
+ if (unref(sceneEmpty)) _push(`<div class="empty-hint" data-v-ee250387><b data-v-ee250387>${ssrInterpolate(_ctx.$t("townView.k3rwxjc044"))}</b><span data-v-ee250387>${ssrInterpolate(_ctx.$t("townView.k1sa1eaj045"))}</span></div>`);
2378
2387
  else _push(`<!---->`);
2379
2388
  if (unref(selectedChannel) && unref(boundaryDraft)) {
2380
2389
  _push(`<div class="boundary-panel drag-panel" style="${ssrRenderStyle(unref(panelPos).boundary ? {
@@ -2382,111 +2391,111 @@ var TownView_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineC
2382
2391
  top: unref(panelPos).boundary.y + "px",
2383
2392
  bottom: "auto",
2384
2393
  transform: "none"
2385
- } : void 0)}" data-v-771c2c29><div class="bp-title drag-grip"${ssrRenderAttr("title", _ctx.$t("townView.k1d0rl5z011"))} data-v-771c2c29><span class="bp-name" data-v-771c2c29>${ssrInterpolate(unref(entities).channels[unref(selectedChannel)]?.name ?? unref(selectedChannel).slice(0, 8))}</span><span class="bp-sub" data-v-771c2c29>${ssrInterpolate(_ctx.$t("townView.k1mehlxs046"))}</span><div class="bp-tabs" data-v-771c2c29><button class="${ssrRenderClass([{ on: unref(channelPanelTab) === "boundary" }, "bp-tab"])}" data-v-771c2c29>${ssrInterpolate(_ctx.$t("townView.k489ka047"))}</button><button class="${ssrRenderClass([{ on: unref(channelPanelTab) === "members" }, "bp-tab"])}" data-v-771c2c29>${ssrInterpolate(_ctx.$t("townView.k3ztf1129"))} ${ssrInterpolate(unref(channelMembers).length)}</button></div></div>`);
2386
- if (unref(channelPanelTab) === "boundary") _push(`<!--[--><div class="bp-row" data-v-771c2c29><span class="bp-label" data-v-771c2c29>${ssrInterpolate(_ctx.$t("townView.k3zhy5048"))}</span><div class="bp-seg" data-v-771c2c29><button class="${ssrRenderClass([{ on: unref(boundaryDraft).shape === "ellipse" }, "seg-btn"])}" data-v-771c2c29>${ssrInterpolate(_ctx.$t("townView.k414bc049"))}</button><button class="${ssrRenderClass([{ on: unref(boundaryDraft).shape === "rect" }, "seg-btn"])}" data-v-771c2c29>${ssrInterpolate(_ctx.$t("townView.k43u0g050"))}</button></div></div><div class="bp-row" data-v-771c2c29><span class="bp-label" data-v-771c2c29>${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-771c2c29><span class="bp-val" data-v-771c2c29>${ssrInterpolate(Math.round(unref(boundaryDraft).radiusX))}</span></div><div class="bp-row" data-v-771c2c29><span class="bp-label" data-v-771c2c29>${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-771c2c29><span class="bp-val" data-v-771c2c29>${ssrInterpolate(Math.round(unref(boundaryDraft).radiusZ))}</span></div><div class="bp-row" data-v-771c2c29><span class="bp-label" data-v-771c2c29>${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-771c2c29><span class="bp-val" data-v-771c2c29>${ssrInterpolate(Math.round(unref(boundaryDraft).rotationY ?? 0))}°</span></div><!--]-->`);
2394
+ } : void 0)}" data-v-ee250387><div class="bp-title drag-grip"${ssrRenderAttr("title", _ctx.$t("townView.k1d0rl5z011"))} data-v-ee250387><span class="bp-name" data-v-ee250387>${ssrInterpolate(unref(entities).channels[unref(selectedChannel)]?.name ?? unref(selectedChannel).slice(0, 8))}</span><span class="bp-sub" data-v-ee250387>${ssrInterpolate(_ctx.$t("townView.k1mehlxs046"))}</span><div class="bp-tabs" data-v-ee250387><button class="${ssrRenderClass([{ on: unref(channelPanelTab) === "boundary" }, "bp-tab"])}" data-v-ee250387>${ssrInterpolate(_ctx.$t("townView.k489ka047"))}</button><button class="${ssrRenderClass([{ on: unref(channelPanelTab) === "members" }, "bp-tab"])}" data-v-ee250387>${ssrInterpolate(_ctx.$t("townView.k3ztf1129"))} ${ssrInterpolate(unref(channelMembers).length)}</button></div></div>`);
2395
+ if (unref(channelPanelTab) === "boundary") _push(`<!--[--><div class="bp-row" data-v-ee250387><span class="bp-label" data-v-ee250387>${ssrInterpolate(_ctx.$t("townView.k3zhy5048"))}</span><div class="bp-seg" data-v-ee250387><button class="${ssrRenderClass([{ on: unref(boundaryDraft).shape === "ellipse" }, "seg-btn"])}" data-v-ee250387>${ssrInterpolate(_ctx.$t("townView.k414bc049"))}</button><button class="${ssrRenderClass([{ on: unref(boundaryDraft).shape === "rect" }, "seg-btn"])}" data-v-ee250387>${ssrInterpolate(_ctx.$t("townView.k43u0g050"))}</button></div></div><div class="bp-row" data-v-ee250387><span class="bp-label" data-v-ee250387>${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-ee250387><span class="bp-val" data-v-ee250387>${ssrInterpolate(Math.round(unref(boundaryDraft).radiusX))}</span></div><div class="bp-row" data-v-ee250387><span class="bp-label" data-v-ee250387>${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-ee250387><span class="bp-val" data-v-ee250387>${ssrInterpolate(Math.round(unref(boundaryDraft).radiusZ))}</span></div><div class="bp-row" data-v-ee250387><span class="bp-label" data-v-ee250387>${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-ee250387><span class="bp-val" data-v-ee250387>${ssrInterpolate(Math.round(unref(boundaryDraft).rotationY ?? 0))}°</span></div><!--]-->`);
2387
2396
  else {
2388
- _push(`<!--[--><div class="bp-hint" data-v-771c2c29>${ssrInterpolate(_ctx.$t("townView.kimxls2054"))}</div><div class="member-list" data-v-771c2c29><!--[-->`);
2397
+ _push(`<!--[--><div class="bp-hint" data-v-ee250387>${ssrInterpolate(_ctx.$t("townView.kimxls2054"))}</div><div class="member-list" data-v-ee250387><!--[-->`);
2389
2398
  ssrRenderList(unref(channelMembers), (m) => {
2390
- _push(`<div class="member-row" data-v-771c2c29><span class="member-ava" style="${ssrRenderStyle({ color: hashColor(unref(selectedChannel)) })}" data-v-771c2c29>${ssrInterpolate(m.name.charAt(0).toUpperCase())}</span><div class="member-info" data-v-771c2c29><span class="member-name" data-v-771c2c29>${ssrInterpolate(m.name)}</span><span class="${ssrRenderClass([m.role === "lead" ? "r-lead" : "r-worker", "member-role"])}" data-v-771c2c29>${ssrInterpolate(m.role === "lead" ? "Leader" : "Worker")}</span></div><select class="member-select"${ssrRenderAttr("value", (m.modelRef ?? "") || "hero-3d")} data-v-771c2c29><!--[-->`);
2399
+ _push(`<div class="member-row" data-v-ee250387><span class="member-ava" style="${ssrRenderStyle({ color: hashColor(unref(selectedChannel)) })}" data-v-ee250387>${ssrInterpolate(m.name.charAt(0).toUpperCase())}</span><div class="member-info" data-v-ee250387><span class="member-name" data-v-ee250387>${ssrInterpolate(m.name)}</span><span class="${ssrRenderClass([m.role === "lead" ? "r-lead" : "r-worker", "member-role"])}" data-v-ee250387>${ssrInterpolate(m.role === "lead" ? "Leader" : "Worker")}</span></div><select class="member-select"${ssrRenderAttr("value", (m.modelRef ?? "") || "hero-3d")} data-v-ee250387><!--[-->`);
2391
2400
  ssrRenderList(unref(agentModels), (model) => {
2392
- _push(`<option${ssrRenderAttr("value", model.id)} data-v-771c2c29>${ssrInterpolate(model.name)}</option>`);
2401
+ _push(`<option${ssrRenderAttr("value", model.id)} data-v-ee250387>${ssrInterpolate(model.name)}</option>`);
2393
2402
  });
2394
2403
  _push(`<!--]--></select></div>`);
2395
2404
  });
2396
2405
  _push(`<!--]-->`);
2397
- if (unref(channelMembers).length === 0) _push(`<div class="bp-hint" data-v-771c2c29>${ssrInterpolate(_ctx.$t("townView.k419rbs055"))}</div>`);
2406
+ if (unref(channelMembers).length === 0) _push(`<div class="bp-hint" data-v-ee250387>${ssrInterpolate(_ctx.$t("townView.k419rbs055"))}</div>`);
2398
2407
  else _push(`<!---->`);
2399
2408
  _push(`</div><!--]-->`);
2400
2409
  }
2401
- _push(`<div class="bp-actions" data-v-771c2c29>`);
2402
- if (unref(channelPanelTab) === "boundary") _push(`<button class="bp-btn save" data-v-771c2c29>${ssrInterpolate(_ctx.$t("townView.k1b3kp8f056"))}</button>`);
2410
+ _push(`<div class="bp-actions" data-v-ee250387>`);
2411
+ if (unref(channelPanelTab) === "boundary") _push(`<button class="bp-btn save" data-v-ee250387>${ssrInterpolate(_ctx.$t("townView.k1b3kp8f056"))}</button>`);
2403
2412
  else _push(`<!---->`);
2404
- _push(`<button class="bp-btn danger" data-v-771c2c29>${ssrInterpolate(_ctx.$t("townView.k1hs45qg057"))}</button><button class="bp-btn" data-v-771c2c29>${ssrInterpolate(_ctx.$t("townView.k3x62t058"))}</button></div></div>`);
2413
+ _push(`<button class="bp-btn danger" data-v-ee250387>${ssrInterpolate(_ctx.$t("townView.k1hs45qg057"))}</button><button class="bp-btn" data-v-ee250387>${ssrInterpolate(_ctx.$t("townView.k3x62t058"))}</button></div></div>`);
2405
2414
  } else _push(`<!---->`);
2406
- if (unref(lastDropText)) _push(`<div class="drop-chip" data-v-771c2c29>${ssrInterpolate(unref(lastDropText))}</div>`);
2415
+ if (unref(lastDropText)) _push(`<div class="drop-chip" data-v-ee250387>${ssrInterpolate(unref(lastDropText))}</div>`);
2407
2416
  else _push(`<!---->`);
2408
- if (unref(errorText)) _push(`<div class="error-chip" data-v-771c2c29>${ssrInterpolate(unref(errorText))}</div>`);
2417
+ if (unref(errorText)) _push(`<div class="error-chip" data-v-ee250387>${ssrInterpolate(unref(errorText))}</div>`);
2409
2418
  else _push(`<!---->`);
2410
- if (!unref(ready)) _push(`<div data-hud="town-loading" class="loading-mask" data-v-771c2c29><div class="loading-spinner" data-v-771c2c29></div><span class="loading-text" data-v-771c2c29>${ssrInterpolate(_ctx.$t("townView.kvjdqfg059"))}</span></div>`);
2419
+ if (!unref(ready)) _push(`<div data-hud="town-loading" class="loading-mask" data-v-ee250387><div class="loading-spinner" data-v-ee250387></div><span class="loading-text" data-v-ee250387>${ssrInterpolate(_ctx.$t("townView.kvjdqfg059"))}</span></div>`);
2411
2420
  else _push(`<!---->`);
2412
- _push(`</div><div class="dock" data-v-771c2c29><section class="dock-card" data-v-771c2c29><div class="dock-hd" data-v-771c2c29><h3 data-v-771c2c29>${ssrInterpolate(_ctx.$t("townView.k1c9iq23060"))}</h3><span class="dock-mode" data-v-771c2c29>${ssrInterpolate(unref(mode) === "edit" ? _ctx.$t("townView.k1iipfcs143") : _ctx.$t("townView.k1l147w1177"))}</span></div><p class="ctl-sec" data-v-771c2c29>${ssrInterpolate(_ctx.$t("townView.secRender"))}</p><div class="ctl-row" data-v-771c2c29><span class="ctl-name"${ssrRenderAttr("title", _ctx.$t("townView.qualityTip"))} data-v-771c2c29>${ssrInterpolate(_ctx.$t("townView.qualityLabel"))}</span><div class="fps-seg" data-v-771c2c29><!--[-->`);
2421
+ _push(`</div><div class="dock" data-v-ee250387><section class="dock-card" data-v-ee250387><div class="dock-hd" data-v-ee250387><h3 data-v-ee250387>${ssrInterpolate(_ctx.$t("townView.k1c9iq23060"))}</h3><span class="dock-mode" data-v-ee250387>${ssrInterpolate(unref(mode) === "edit" ? _ctx.$t("townView.k1iipfcs143") : _ctx.$t("townView.k1l147w1177"))}</span></div><p class="ctl-sec" data-v-ee250387>${ssrInterpolate(_ctx.$t("townView.secRender"))}</p><div class="ctl-row" data-v-ee250387><span class="ctl-name"${ssrRenderAttr("title", _ctx.$t("townView.qualityTip"))} data-v-ee250387>${ssrInterpolate(_ctx.$t("townView.qualityLabel"))}</span><div class="fps-seg" data-v-ee250387><!--[-->`);
2413
2422
  ssrRenderList(QUALITY_OPTIONS, (o) => {
2414
- _push(`<button class="${ssrRenderClass({ on: unref(qualityMode) === o.v })}" data-v-771c2c29>${ssrInterpolate(_ctx.$t(o.label))}</button>`);
2423
+ _push(`<button class="${ssrRenderClass({ on: unref(qualityMode) === o.v })}" data-v-ee250387>${ssrInterpolate(_ctx.$t(o.label))}</button>`);
2415
2424
  });
2416
- _push(`<!--]--></div><span class="ctl-val" data-v-771c2c29></span></div><div class="ctl-row" data-v-771c2c29><span class="ctl-name"${ssrRenderAttr("title", _ctx.$t("townView.fpsCapTip"))} data-v-771c2c29>${ssrInterpolate(_ctx.$t("townView.fpsCapLabel"))}</span><div class="fps-seg" data-v-771c2c29><!--[-->`);
2425
+ _push(`<!--]--></div><span class="ctl-val" data-v-ee250387></span></div><div class="ctl-row" data-v-ee250387><span class="ctl-name"${ssrRenderAttr("title", _ctx.$t("townView.fpsCapTip"))} data-v-ee250387>${ssrInterpolate(_ctx.$t("townView.fpsCapLabel"))}</span><div class="fps-seg" data-v-ee250387><!--[-->`);
2417
2426
  ssrRenderList(FPS_OPTIONS, (o) => {
2418
- _push(`<button class="${ssrRenderClass({ on: unref(fpsCap) === o.v })}" data-v-771c2c29>${ssrInterpolate(o.label)}</button>`);
2427
+ _push(`<button class="${ssrRenderClass({ on: unref(fpsCap) === o.v })}" data-v-ee250387>${ssrInterpolate(o.label)}</button>`);
2419
2428
  });
2420
- _push(`<!--]--></div><span class="ctl-val" data-v-771c2c29></span></div><p class="ctl-sec" data-v-771c2c29>${ssrInterpolate(_ctx.$t("townView.secEnv"))}</p><div class="ctl-row" data-v-771c2c29><span class="ctl-name" data-v-771c2c29>${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-771c2c29><span class="ctl-val" data-v-771c2c29>${ssrInterpolate(Math.round(unref(exposure) * 100))}%</span></div><div class="ctl-row" data-v-771c2c29><span class="ctl-name" data-v-771c2c29>${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-771c2c29><span class="ctl-val" data-v-771c2c29>${ssrInterpolate(Math.round(unref(tintOpacity) * 100))}%</span></div><div class="ctl-row" data-v-771c2c29><span class="ctl-name" data-v-771c2c29>${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-771c2c29><span class="ctl-val" data-v-771c2c29>${ssrInterpolate(unref(threshPct))}%</span></div><div class="ctl-row" data-v-771c2c29><span class="ctl-name"${ssrRenderAttr("title", _ctx.$t("townView.kz71l1f012"))} data-v-771c2c29>${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-771c2c29><span class="ctl-val" data-v-771c2c29>${ssrInterpolate(unref(calloutNearDist) === 0 ? _ctx.$t("townView.k493s144") : `${unref(calloutNearDist)}`)}</span></div><p class="ctl-sec" data-v-771c2c29>${ssrInterpolate(_ctx.$t("townView.secOps"))}</p><div class="ctl-row" data-v-771c2c29><span class="ctl-name" data-v-771c2c29>${ssrInterpolate(_ctx.$t("townView.k1idc6pa065"))}</span><button class="${ssrRenderClass([{ on: unref(snap) }, "snap-toggle"])}" data-v-771c2c29>${ssrInterpolate(unref(snap) ? _ctx.$t("townView.k4bs5145") : _ctx.$t("townView.k493s144"))}</button><span class="ctl-val" data-v-771c2c29></span></div><div class="ctl-btns" data-v-771c2c29><button class="btn btn-primary" data-v-771c2c29>${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-771c2c29>${ssrInterpolate(_ctx.$t("townView.k1b3bk8t029"))}</button><button class="${ssrRenderClass([{ armed: unref(estop) }, "btn btn-danger"])}" data-v-771c2c29>${ssrInterpolate(_ctx.$t("townView.k1i046wf066"))}</button></div></section><section class="dock-card" data-v-771c2c29><div class="dock-hd" data-v-771c2c29><h3 data-v-771c2c29>${ssrInterpolate(_ctx.$t("townView.k1kfoef9067"))}</h3><span class="dock-count mono" data-v-771c2c29>${ssrInterpolate(unref(daqTwins).length)}</span><div class="${ssrRenderClass([{ expanded: unref(trendExpanded) }, "trend-legend"])}" data-v-771c2c29><!--[-->`);
2429
+ _push(`<!--]--></div><span class="ctl-val" data-v-ee250387></span></div><p class="ctl-sec" data-v-ee250387>${ssrInterpolate(_ctx.$t("townView.secEnv"))}</p><div class="ctl-row" data-v-ee250387><span class="ctl-name" data-v-ee250387>${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-ee250387><span class="ctl-val" data-v-ee250387>${ssrInterpolate(Math.round(unref(exposure) * 100))}%</span></div><div class="ctl-row" data-v-ee250387><span class="ctl-name" data-v-ee250387>${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-ee250387><span class="ctl-val" data-v-ee250387>${ssrInterpolate(Math.round(unref(tintOpacity) * 100))}%</span></div><div class="ctl-row" data-v-ee250387><span class="ctl-name" data-v-ee250387>${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-ee250387><span class="ctl-val" data-v-ee250387>${ssrInterpolate(unref(threshPct))}%</span></div><div class="ctl-row" data-v-ee250387><span class="ctl-name"${ssrRenderAttr("title", _ctx.$t("townView.kz71l1f012"))} data-v-ee250387>${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-ee250387><span class="ctl-val" data-v-ee250387>${ssrInterpolate(unref(calloutNearDist) === 0 ? _ctx.$t("townView.k493s144") : `${unref(calloutNearDist)}`)}</span></div><p class="ctl-sec" data-v-ee250387>${ssrInterpolate(_ctx.$t("townView.secOps"))}</p><div class="ctl-row" data-v-ee250387><span class="ctl-name" data-v-ee250387>${ssrInterpolate(_ctx.$t("townView.k1idc6pa065"))}</span><button class="${ssrRenderClass([{ on: unref(snap) }, "snap-toggle"])}" data-v-ee250387>${ssrInterpolate(unref(snap) ? _ctx.$t("townView.k4bs5145") : _ctx.$t("townView.k493s144"))}</button><span class="ctl-val" data-v-ee250387></span></div><div class="ctl-btns" data-v-ee250387><button class="btn btn-primary" data-v-ee250387>${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-ee250387>${ssrInterpolate(_ctx.$t("townView.k1b3bk8t029"))}</button><button class="${ssrRenderClass([{ armed: unref(estop) }, "btn btn-danger"])}" data-v-ee250387>${ssrInterpolate(_ctx.$t("townView.k1i046wf066"))}</button></div></section><section class="dock-card" data-v-ee250387><div class="dock-hd" data-v-ee250387><h3 data-v-ee250387>${ssrInterpolate(_ctx.$t("townView.k1kfoef9067"))}</h3><span class="dock-count mono" data-v-ee250387>${ssrInterpolate(unref(daqTwins).length)}</span><div class="${ssrRenderClass([{ expanded: unref(trendExpanded) }, "trend-legend"])}" data-v-ee250387><!--[-->`);
2421
2430
  ssrRenderList(unref(trendChips), (t) => {
2422
- _push(`<button class="${ssrRenderClass([{ off: !trendOn(t.id) }, "lg-chip"])}" data-v-771c2c29><span class="lg-dot" style="${ssrRenderStyle({ background: trendColor(t.id) })}" data-v-771c2c29></span>${ssrInterpolate(t.name)}</button>`);
2431
+ _push(`<button class="${ssrRenderClass([{ off: !trendOn(t.id) }, "lg-chip"])}" data-v-ee250387><span class="lg-dot" style="${ssrRenderStyle({ background: trendColor(t.id) })}" data-v-ee250387></span>${ssrInterpolate(t.name)}</button>`);
2423
2432
  });
2424
2433
  _push(`<!--]-->`);
2425
- 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-771c2c29>${ssrInterpolate(unref(trendExpanded) ? _ctx.$t("townView.trendCollapse") : `+${unref(trendOverflow)}`)}</button>`);
2434
+ 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-ee250387>${ssrInterpolate(unref(trendExpanded) ? _ctx.$t("townView.trendCollapse") : `+${unref(trendOverflow)}`)}</button>`);
2426
2435
  else _push(`<!---->`);
2427
- _push(`</div></div><div class="trend-wrap" data-v-771c2c29><canvas class="trend-cv" data-v-771c2c29></canvas>`);
2428
- if (!unref(daqTwins).length) _push(`<span class="trend-empty" data-v-771c2c29>${ssrInterpolate(_ctx.$t("townView.k1uht2uv068"))}</span>`);
2436
+ _push(`</div></div><div class="trend-wrap" data-v-ee250387><canvas class="trend-cv" data-v-ee250387></canvas>`);
2437
+ if (!unref(daqTwins).length) _push(`<span class="trend-empty" data-v-ee250387>${ssrInterpolate(_ctx.$t("townView.k1uht2uv068"))}</span>`);
2429
2438
  else _push(`<!---->`);
2430
- _push(`</div></section></div></main><aside class="rail rail-right" data-v-771c2c29>`);
2439
+ _push(`</div></section></div></main><aside class="rail rail-right" data-v-ee250387>`);
2431
2440
  if (unref(selected)) {
2432
- _push(`<section class="panel inspector" data-v-771c2c29><div class="panel-hd" data-v-771c2c29><h3 data-v-771c2c29>${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-771c2c29> ✕ </button></div><div class="ins-chip-row" data-v-771c2c29><span class="ins-chip mono" data-v-771c2c29>${ssrInterpolate(unref(selected).id.slice(0, 8))}</span>`);
2433
- if (unref(selected).kind === "device" && unref(selectedIsDaq)) _push(`<span class="ins-chip accent" data-v-771c2c29>DAQ</span>`);
2434
- else if (unref(selected).kind === "device" && unref(selectedIsDcw)) _push(`<span class="ins-chip accent" data-v-771c2c29>DCW</span>`);
2441
+ _push(`<section class="panel inspector" data-v-ee250387><div class="panel-hd" data-v-ee250387><h3 data-v-ee250387>${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-ee250387> ✕ </button></div><div class="ins-chip-row" data-v-ee250387><span class="ins-chip mono" data-v-ee250387>${ssrInterpolate(unref(selected).id.slice(0, 8))}</span>`);
2442
+ if (unref(selected).kind === "device" && unref(selectedIsDaq)) _push(`<span class="ins-chip accent" data-v-ee250387>DAQ</span>`);
2443
+ else if (unref(selected).kind === "device" && unref(selectedIsDcw)) _push(`<span class="ins-chip accent" data-v-ee250387>DCW</span>`);
2435
2444
  else _push(`<!---->`);
2436
2445
  _push(`</div>`);
2437
2446
  if (unref(selected).kind === "device") {
2438
2447
  _push(`<!--[-->`);
2439
2448
  if (unref(selectedIsDcw)) {
2440
- _push(`<div class="daq-info" data-v-771c2c29><div class="daq-info-row" data-v-771c2c29><span data-v-771c2c29>${ssrInterpolate(_ctx.$t("townView.k1deqh0d069"))}</span><b class="cy" data-v-771c2c29>${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-771c2c29><span data-v-771c2c29>${ssrInterpolate(unref(selectedDcwWindow)?.src === "recipe" ? _ctx.$t("townView.kq2jssk147") : _ctx.$t("townView.k1iwj796179"))}</span><b class="${ssrRenderClass({ amber: unref(selectedDcwWindow)?.src === "recipe" })}" data-v-771c2c29>${ssrInterpolate(dcwWinLabel(unref(selectedDcwNode)))}</b></div><div class="daq-info-row" data-v-771c2c29><span data-v-771c2c29>${ssrInterpolate(_ctx.$t("townView.k1i8rtqt070"))}</span><b data-v-771c2c29>${ssrInterpolate(unref(selectedDcwDeviceName) || _ctx.$t("townView.k3own4q148"))}</b></div><div class="daq-bind-bar" data-v-771c2c29><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-771c2c29><button class="bind-add-btn"${ssrIncludeBooleanAttr(unref(dcwWriteDrafts)[unref(selected).id] == null || unref(dcwWriteDrafts)[unref(selected).id] === "") ? " disabled" : ""} data-v-771c2c29>${ssrInterpolate(_ctx.$t("townView.kwrbtn180"))}</button></div>`);
2441
- if (unref(dcwWriteErrs)[unref(selected).id]) _push(`<p class="dcw-err" data-v-771c2c29>${ssrInterpolate(unref(dcwWriteErrs)[unref(selected).id])}</p>`);
2449
+ _push(`<div class="daq-info" data-v-ee250387><div class="daq-info-row" data-v-ee250387><span data-v-ee250387>${ssrInterpolate(_ctx.$t("townView.k1deqh0d069"))}</span><b class="cy" data-v-ee250387>${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-ee250387><span data-v-ee250387>${ssrInterpolate(unref(selectedDcwWindow)?.src === "recipe" ? _ctx.$t("townView.kq2jssk147") : _ctx.$t("townView.k1iwj796179"))}</span><b class="${ssrRenderClass({ amber: unref(selectedDcwWindow)?.src === "recipe" })}" data-v-ee250387>${ssrInterpolate(dcwWinLabel(unref(selectedDcwNode)))}</b></div><div class="daq-info-row" data-v-ee250387><span data-v-ee250387>${ssrInterpolate(_ctx.$t("townView.k1i8rtqt070"))}</span><b data-v-ee250387>${ssrInterpolate(unref(selectedDcwDeviceName) || _ctx.$t("townView.k3own4q148"))}</b></div><div class="daq-bind-bar" data-v-ee250387><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-ee250387><button class="bind-add-btn"${ssrIncludeBooleanAttr(unref(dcwWriteDrafts)[unref(selected).id] == null || unref(dcwWriteDrafts)[unref(selected).id] === "") ? " disabled" : ""} data-v-ee250387>${ssrInterpolate(_ctx.$t("townView.kwrbtn180"))}</button></div>`);
2450
+ if (unref(dcwWriteErrs)[unref(selected).id]) _push(`<p class="dcw-err" data-v-ee250387>${ssrInterpolate(unref(dcwWriteErrs)[unref(selected).id])}</p>`);
2442
2451
  else _push(`<!---->`);
2443
2452
  if (unref(mode) === "edit") {
2444
- _push(`<div class="daq-bind-bar" data-v-771c2c29><select class="bind-select" data-v-771c2c29><option value="" data-v-771c2c29${ssrIncludeBooleanAttr(Array.isArray(unref(dcwBindPick)) ? ssrLooseContain(unref(dcwBindPick), "") : ssrLooseEqual(unref(dcwBindPick), "")) ? " selected" : ""}>${ssrInterpolate(_ctx.$t("townView.kjo6ekr071"))}</option><!--[-->`);
2453
+ _push(`<div class="daq-bind-bar" data-v-ee250387><select class="bind-select" data-v-ee250387><option value="" data-v-ee250387${ssrIncludeBooleanAttr(Array.isArray(unref(dcwBindPick)) ? ssrLooseContain(unref(dcwBindPick), "") : ssrLooseEqual(unref(dcwBindPick), "")) ? " selected" : ""}>${ssrInterpolate(_ctx.$t("townView.kjo6ekr071"))}</option><!--[-->`);
2445
2454
  ssrRenderList(unref(deviceTwins).twins.filter((x) => !isLegacyDaqTwin(x) && x.id !== (unref(selected)?.id ?? "")), (dv) => {
2446
- _push(`<option${ssrRenderAttr("value", dv.id)} data-v-771c2c29${ssrIncludeBooleanAttr(Array.isArray(unref(dcwBindPick)) ? ssrLooseContain(unref(dcwBindPick), dv.id) : ssrLooseEqual(unref(dcwBindPick), dv.id)) ? " selected" : ""}>${ssrInterpolate(dv.name)}</option>`);
2455
+ _push(`<option${ssrRenderAttr("value", dv.id)} data-v-ee250387${ssrIncludeBooleanAttr(Array.isArray(unref(dcwBindPick)) ? ssrLooseContain(unref(dcwBindPick), dv.id) : ssrLooseEqual(unref(dcwBindPick), dv.id)) ? " selected" : ""}>${ssrInterpolate(dv.name)}</option>`);
2447
2456
  });
2448
- _push(`<!--]--></select><button class="bind-add-btn"${ssrIncludeBooleanAttr(!unref(selectedDcwDeviceName) && !unref(dcwBindPick)) ? " disabled" : ""} data-v-771c2c29>${ssrInterpolate(unref(selectedDcwDeviceName) ? _ctx.$t("townView.k479eh149") : _ctx.$t("townView.k452a8102"))}</button></div>`);
2457
+ _push(`<!--]--></select><button class="bind-add-btn"${ssrIncludeBooleanAttr(!unref(selectedDcwDeviceName) && !unref(dcwBindPick)) ? " disabled" : ""} data-v-ee250387>${ssrInterpolate(unref(selectedDcwDeviceName) ? _ctx.$t("townView.k479eh149") : _ctx.$t("townView.k452a8102"))}</button></div>`);
2449
2458
  } else _push(`<!---->`);
2450
2459
  _push(`</div>`);
2451
2460
  } else if (unref(selectedIsDaq)) {
2452
- _push(`<div class="daq-info" data-v-771c2c29><div class="daq-info-row" data-v-771c2c29><span data-v-771c2c29>${ssrInterpolate(_ctx.$t("townView.k3mv305072"))}</span><b class="cy" data-v-771c2c29>${ssrInterpolate(unref(selectedDaqSim) ? fmtDaq(unref(selectedDaqSim)) : "--")} ${ssrInterpolate(unref(selectedDaqSim)?.tpl.unit)}</b></div><div class="daq-info-row" data-v-771c2c29><span data-v-771c2c29>${ssrInterpolate(_ctx.$t("townView.k1faqmjb073"))}</span><b data-v-771c2c29>${ssrInterpolate(unref(selectedDaqSim)?.tpl.min)} ~ ${ssrInterpolate(unref(selectedDaqSim)?.tpl.max)}</b></div><div class="daq-info-row" data-v-771c2c29><span data-v-771c2c29>${ssrInterpolate(_ctx.$t("townView.k1i8rtqt070"))}</span><b data-v-771c2c29>${ssrInterpolate(unref(daqBoundDeviceName) || _ctx.$t("townView.k3own4q148"))}</b></div>`);
2461
+ _push(`<div class="daq-info" data-v-ee250387><div class="daq-info-row" data-v-ee250387><span data-v-ee250387>${ssrInterpolate(_ctx.$t("townView.k3mv305072"))}</span><b class="cy" data-v-ee250387>${ssrInterpolate(unref(selectedDaqSim) ? fmtDaq(unref(selectedDaqSim)) : "--")} ${ssrInterpolate(unref(selectedDaqSim)?.tpl.unit)}</b></div><div class="daq-info-row" data-v-ee250387><span data-v-ee250387>${ssrInterpolate(_ctx.$t("townView.k1faqmjb073"))}</span><b data-v-ee250387>${ssrInterpolate(unref(selectedDaqSim)?.tpl.min)} ~ ${ssrInterpolate(unref(selectedDaqSim)?.tpl.max)}</b></div><div class="daq-info-row" data-v-ee250387><span data-v-ee250387>${ssrInterpolate(_ctx.$t("townView.k1i8rtqt070"))}</span><b data-v-ee250387>${ssrInterpolate(unref(daqBoundDeviceName) || _ctx.$t("townView.k3own4q148"))}</b></div>`);
2453
2462
  if (unref(mode) === "edit") {
2454
- _push(`<div class="daq-bind-bar" data-v-771c2c29><select class="bind-select" data-v-771c2c29><option value="" data-v-771c2c29${ssrIncludeBooleanAttr(Array.isArray(unref(bindPick)) ? ssrLooseContain(unref(bindPick), "") : ssrLooseEqual(unref(bindPick), "")) ? " selected" : ""}>${ssrInterpolate(_ctx.$t("townView.kjo6ekr071"))}</option><!--[-->`);
2463
+ _push(`<div class="daq-bind-bar" data-v-ee250387><select class="bind-select" data-v-ee250387><option value="" data-v-ee250387${ssrIncludeBooleanAttr(Array.isArray(unref(bindPick)) ? ssrLooseContain(unref(bindPick), "") : ssrLooseEqual(unref(bindPick), "")) ? " selected" : ""}>${ssrInterpolate(_ctx.$t("townView.kjo6ekr071"))}</option><!--[-->`);
2455
2464
  ssrRenderList(unref(deviceTwins).twins.filter((x) => !isLegacyDaqTwin(x) && x.id !== (unref(selected)?.id ?? "")), (dv) => {
2456
- _push(`<option${ssrRenderAttr("value", dv.id)} data-v-771c2c29${ssrIncludeBooleanAttr(Array.isArray(unref(bindPick)) ? ssrLooseContain(unref(bindPick), dv.id) : ssrLooseEqual(unref(bindPick), dv.id)) ? " selected" : ""}>${ssrInterpolate(dv.name)}</option>`);
2465
+ _push(`<option${ssrRenderAttr("value", dv.id)} data-v-ee250387${ssrIncludeBooleanAttr(Array.isArray(unref(bindPick)) ? ssrLooseContain(unref(bindPick), dv.id) : ssrLooseEqual(unref(bindPick), dv.id)) ? " selected" : ""}>${ssrInterpolate(dv.name)}</option>`);
2457
2466
  });
2458
- _push(`<!--]--></select><button class="bind-add-btn"${ssrIncludeBooleanAttr(!unref(daqBoundDeviceName) && !unref(bindPick)) ? " disabled" : ""} data-v-771c2c29>${ssrInterpolate(unref(daqBoundDeviceName) ? _ctx.$t("townView.k479eh149") : _ctx.$t("townView.k452a8102"))}</button></div>`);
2467
+ _push(`<!--]--></select><button class="bind-add-btn"${ssrIncludeBooleanAttr(!unref(daqBoundDeviceName) && !unref(bindPick)) ? " disabled" : ""} data-v-ee250387>${ssrInterpolate(unref(daqBoundDeviceName) ? _ctx.$t("townView.k479eh149") : _ctx.$t("townView.k452a8102"))}</button></div>`);
2459
2468
  } else _push(`<!---->`);
2460
- if (unref(mode) === "edit" && unref(selectedDaqNode)) _push(`<div class="daq-node-ctl" data-v-771c2c29><div class="daq-info-row" data-v-771c2c29><span data-v-771c2c29>${ssrInterpolate(_ctx.$t("townView.k1l6g2ga074"))}</span><span class="daq-th-inputs" data-v-771c2c29><input${ssrRenderAttr("value", unref(daqIntervalDraft))} type="number" min="200" max="60000" step="100" class="daq-num" data-v-771c2c29><small data-v-771c2c29>${ssrInterpolate(_ctx.$t("townView.k1or92b075"))}</small></span></div><div class="daq-info-row" data-v-771c2c29><span data-v-771c2c29>${ssrInterpolate(_ctx.$t("townView.k3x5tpx076"))}</span><span class="daq-th-inputs" data-v-771c2c29><input${ssrRenderAttr("value", unref(selectedDaqNode).warnLow)} type="number" step="any" class="daq-num" data-v-771c2c29> ~ <input${ssrRenderAttr("value", unref(selectedDaqNode).warnHigh)} type="number" step="any" class="daq-num" data-v-771c2c29></span></div><div class="daq-info-row" data-v-771c2c29><span data-v-771c2c29>${ssrInterpolate(_ctx.$t("townView.k1hjj0jf077"))}</span><span class="daq-th-inputs" data-v-771c2c29><input${ssrRenderAttr("value", unref(selectedDaqNode).min)} type="number" step="any" class="daq-num" data-v-771c2c29> ~ <input${ssrRenderAttr("value", unref(selectedDaqNode).max)} type="number" step="any" class="daq-num" data-v-771c2c29></span></div><div class="daq-info-row" data-v-771c2c29><span data-v-771c2c29>${ssrInterpolate(_ctx.$t("townView.k48tki078"))}</span><button class="${ssrRenderClass([{ warn: unref(selectedDaqNode).enabled }, "bind-add-btn"])}" data-v-771c2c29>${ssrInterpolate(unref(selectedDaqNode).enabled ? _ctx.$t("townView.k1wv0nyo150") : _ctx.$t("townView.kh1586b180"))}</button></div><div class="daq-info-row" data-v-771c2c29><span data-v-771c2c29>${ssrInterpolate(_ctx.$t("townView.k3xakp079"))}</span><button class="bind-add-btn danger"${ssrRenderAttr("title", _ctx.$t("townView.kpwutri014"))} data-v-771c2c29>${ssrInterpolate(_ctx.$t("townView.k1bpp30k080"))}</button></div></div>`);
2461
- else _push(`<div class="ins-empty" data-v-771c2c29>${ssrInterpolate(_ctx.$t("townView.kzk5dfx081"))}</div>`);
2469
+ if (unref(mode) === "edit" && unref(selectedDaqNode)) _push(`<div class="daq-node-ctl" data-v-ee250387><div class="daq-info-row" data-v-ee250387><span data-v-ee250387>${ssrInterpolate(_ctx.$t("townView.k1l6g2ga074"))}</span><span class="daq-th-inputs" data-v-ee250387><input${ssrRenderAttr("value", unref(daqIntervalDraft))} type="number" min="200" max="60000" step="100" class="daq-num" data-v-ee250387><small data-v-ee250387>${ssrInterpolate(_ctx.$t("townView.k1or92b075"))}</small></span></div><div class="daq-info-row" data-v-ee250387><span data-v-ee250387>${ssrInterpolate(_ctx.$t("townView.k3x5tpx076"))}</span><span class="daq-th-inputs" data-v-ee250387><input${ssrRenderAttr("value", unref(selectedDaqNode).warnLow)} type="number" step="any" class="daq-num" data-v-ee250387> ~ <input${ssrRenderAttr("value", unref(selectedDaqNode).warnHigh)} type="number" step="any" class="daq-num" data-v-ee250387></span></div><div class="daq-info-row" data-v-ee250387><span data-v-ee250387>${ssrInterpolate(_ctx.$t("townView.k1hjj0jf077"))}</span><span class="daq-th-inputs" data-v-ee250387><input${ssrRenderAttr("value", unref(selectedDaqNode).min)} type="number" step="any" class="daq-num" data-v-ee250387> ~ <input${ssrRenderAttr("value", unref(selectedDaqNode).max)} type="number" step="any" class="daq-num" data-v-ee250387></span></div><div class="daq-info-row" data-v-ee250387><span data-v-ee250387>${ssrInterpolate(_ctx.$t("townView.k48tki078"))}</span><button class="${ssrRenderClass([{ warn: unref(selectedDaqNode).enabled }, "bind-add-btn"])}" data-v-ee250387>${ssrInterpolate(unref(selectedDaqNode).enabled ? _ctx.$t("townView.k1wv0nyo150") : _ctx.$t("townView.kh1586b180"))}</button></div><div class="daq-info-row" data-v-ee250387><span data-v-ee250387>${ssrInterpolate(_ctx.$t("townView.k3xakp079"))}</span><button class="bind-add-btn danger"${ssrRenderAttr("title", _ctx.$t("townView.kpwutri014"))} data-v-ee250387>${ssrInterpolate(_ctx.$t("townView.k1bpp30k080"))}</button></div></div>`);
2470
+ else _push(`<div class="ins-empty" data-v-ee250387>${ssrInterpolate(_ctx.$t("townView.kzk5dfx081"))}</div>`);
2462
2471
  _push(`</div>`);
2463
2472
  } else {
2464
- _push(`<!--[--><div class="obj-row" data-v-771c2c29><span class="obj-label" data-v-771c2c29>${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-771c2c29></div><div class="obj-row" data-v-771c2c29><span class="obj-label" data-v-771c2c29>${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-771c2c29><!--[-->`);
2473
+ _push(`<!--[--><div class="obj-row" data-v-ee250387><span class="obj-label" data-v-ee250387>${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-ee250387></div><div class="obj-row" data-v-ee250387><span class="obj-label" data-v-ee250387>${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-ee250387><!--[-->`);
2465
2474
  ssrRenderList(unref(deviceModels), (m) => {
2466
- _push(`<option${ssrRenderAttr("value", m.id)} data-v-771c2c29>${ssrInterpolate(m.name)}</option>`);
2475
+ _push(`<option${ssrRenderAttr("value", m.id)} data-v-ee250387>${ssrInterpolate(m.name)}</option>`);
2467
2476
  });
2468
- _push(`<!--]--></select></div><div class="sect-hd" data-v-771c2c29>${ssrInterpolate(_ctx.$t("townView.k1vtyk05130"))} ${ssrInterpolate(unref(boundDaqRows).length)} ${ssrInterpolate(_ctx.$t("townView.k3vfpz5138"))}</div><!--[-->`);
2477
+ _push(`<!--]--></select></div><div class="sect-hd" data-v-ee250387>${ssrInterpolate(_ctx.$t("townView.k1vtyk05130"))} ${ssrInterpolate(unref(boundDaqRows).length)} ${ssrInterpolate(_ctx.$t("townView.k3vfpz5138"))}</div><!--[-->`);
2469
2478
  ssrRenderList(unref(boundDaqRows), (r) => {
2470
- _push(`<div class="bind-row" data-v-771c2c29><span class="bind-ico" data-v-771c2c29><svg class="bind-svg" viewBox="0 0 24 24" data-v-771c2c29>${daqIcon(r.icon) ?? ""}</svg></span><span class="bind-meta" data-v-771c2c29><span class="bind-label" data-v-771c2c29>${ssrInterpolate(r.ch)}</span><span class="bind-val" data-v-771c2c29><b data-v-771c2c29>${ssrInterpolate(r.value)}</b> ${ssrInterpolate(r.unit)} · ${ssrInterpolate(r.name)}</span></span><canvas class="bind-spark" width="56" height="20" data-v-771c2c29></canvas>`);
2471
- if (unref(mode) === "edit") _push(`<button class="bind-x"${ssrRenderAttr("title", _ctx.$t("townView.k1k73omv016"))} data-v-771c2c29> ✕ </button>`);
2479
+ _push(`<div class="bind-row" data-v-ee250387><span class="bind-ico" data-v-ee250387><svg class="bind-svg" viewBox="0 0 24 24" data-v-ee250387>${daqIcon(r.icon) ?? ""}</svg></span><span class="bind-meta" data-v-ee250387><span class="bind-label" data-v-ee250387>${ssrInterpolate(r.ch)}</span><span class="bind-val" data-v-ee250387><b data-v-ee250387>${ssrInterpolate(r.value)}</b> ${ssrInterpolate(r.unit)} · ${ssrInterpolate(r.name)}</span></span><canvas class="bind-spark" width="56" height="20" data-v-ee250387></canvas>`);
2480
+ if (unref(mode) === "edit") _push(`<button class="bind-x"${ssrRenderAttr("title", _ctx.$t("townView.k1k73omv016"))} data-v-ee250387> ✕ </button>`);
2472
2481
  else _push(`<!---->`);
2473
2482
  _push(`</div>`);
2474
2483
  });
2475
2484
  _push(`<!--]-->`);
2476
- if (!unref(boundDaqRows).length) _push(`<div class="ins-empty" data-v-771c2c29>${ssrInterpolate(_ctx.$t("townView.kgpuqhb084"))}</div>`);
2485
+ if (!unref(boundDaqRows).length) _push(`<div class="ins-empty" data-v-ee250387>${ssrInterpolate(_ctx.$t("townView.kgpuqhb084"))}</div>`);
2477
2486
  else _push(`<!---->`);
2478
2487
  if (unref(mode) === "edit") {
2479
- _push(`<div class="bind-add-wrap" data-v-771c2c29><button class="bind-add" data-v-771c2c29>${ssrInterpolate(_ctx.$t("townView.kvm0lin085"))}</button>`);
2488
+ _push(`<div class="bind-add-wrap" data-v-ee250387><button class="bind-add" data-v-ee250387>${ssrInterpolate(_ctx.$t("townView.kvm0lin085"))}</button>`);
2480
2489
  if (unref(bindPopOpen)) {
2481
- _push(`<div class="bind-pop" style="${ssrRenderStyle({ maxHeight: `${unref(bindPopMaxH)}px` })}" data-v-771c2c29><!--[-->`);
2490
+ _push(`<div class="bind-pop" style="${ssrRenderStyle({ maxHeight: `${unref(bindPopMaxH)}px` })}" data-v-ee250387><!--[-->`);
2482
2491
  ssrRenderList(unref(daqTemplates), (tpl) => {
2483
2492
  _push(`<!--[-->`);
2484
2493
  if (unref(daqBindChoices)[tpl.id]?.length) {
2485
- _push(`<div class="bp-group" data-v-771c2c29><span class="bp-tpl" data-v-771c2c29>${ssrInterpolate(tpl.name)} · ${ssrInterpolate(tpl.ch)}</span><!--[-->`);
2494
+ _push(`<div class="bp-group" data-v-ee250387><span class="bp-tpl" data-v-ee250387>${ssrInterpolate(tpl.name)} · ${ssrInterpolate(tpl.ch)}</span><!--[-->`);
2486
2495
  ssrRenderList(unref(daqBindChoices)[tpl.id], (c) => {
2487
- _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-771c2c29><svg class="bind-svg" viewBox="0 0 24 24" data-v-771c2c29>${daqIcon(c.tpl.icon) ?? ""}</svg><span data-v-771c2c29>${ssrInterpolate(c.name)}`);
2488
- if (c.devName) _push(`<i class="bp-cur" data-v-771c2c29>→ ${ssrInterpolate(c.devName)}</i>`);
2489
- else if (!c.placed) _push(`<i class="bp-cur" data-v-771c2c29>${ssrInterpolate(_ctx.$t("townView.k2bindr0009"))}</i>`);
2496
+ _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-ee250387><svg class="bind-svg" viewBox="0 0 24 24" data-v-ee250387>${daqIcon(c.tpl.icon) ?? ""}</svg><span data-v-ee250387>${ssrInterpolate(c.name)}`);
2497
+ if (c.devName) _push(`<i class="bp-cur" data-v-ee250387>→ ${ssrInterpolate(c.devName)}</i>`);
2498
+ else if (!c.placed) _push(`<i class="bp-cur" data-v-ee250387>${ssrInterpolate(_ctx.$t("townView.k2bindr0009"))}</i>`);
2490
2499
  else _push(`<!---->`);
2491
2500
  _push(`</span></button>`);
2492
2501
  });
@@ -2495,40 +2504,40 @@ var TownView_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineC
2495
2504
  _push(`<!--]-->`);
2496
2505
  });
2497
2506
  _push(`<!--]-->`);
2498
- if (!unref(daqBindChoiceCount)) _push(`<div class="bp-empty" data-v-771c2c29>${ssrInterpolate(_ctx.$t("townView.k2bindr0010"))}</div>`);
2507
+ if (!unref(daqBindChoiceCount)) _push(`<div class="bp-empty" data-v-ee250387>${ssrInterpolate(_ctx.$t("townView.k2bindr0010"))}</div>`);
2499
2508
  else _push(`<!---->`);
2500
2509
  _push(`</div>`);
2501
2510
  } else _push(`<!---->`);
2502
2511
  _push(`</div>`);
2503
2512
  } else _push(`<!---->`);
2504
- _push(`<div class="sect-hd" data-v-771c2c29>${ssrInterpolate(_ctx.$t("townView.ktzir2t131"))} ${ssrInterpolate(unref(boundDcwRows).length)} ${ssrInterpolate(_ctx.$t("townView.k4l1w042"))}</div><!--[-->`);
2513
+ _push(`<div class="sect-hd" data-v-ee250387>${ssrInterpolate(_ctx.$t("townView.ktzir2t131"))} ${ssrInterpolate(unref(boundDcwRows).length)} ${ssrInterpolate(_ctx.$t("townView.k4l1w042"))}</div><!--[-->`);
2505
2514
  ssrRenderList(unref(boundDcwRows), (r) => {
2506
- _push(`<div class="dcw-row" data-v-771c2c29><div class="dcw-top" data-v-771c2c29><span class="bind-ico" data-v-771c2c29><svg class="bind-svg" viewBox="0 0 24 24" data-v-771c2c29>${daqIcon(r.icon) ?? ""}</svg></span><span class="dcw-id" data-v-771c2c29><span class="bind-label" data-v-771c2c29>${ssrInterpolate(r.ch)}`);
2507
- if (r.rMin != null || r.rMax != null) _push(`<i class="dcw-tag" data-v-771c2c29>${ssrInterpolate(_ctx.$t("townView.k48grv086"))}</i>`);
2515
+ _push(`<div class="dcw-row" data-v-ee250387><div class="dcw-top" data-v-ee250387><span class="bind-ico" data-v-ee250387><svg class="bind-svg" viewBox="0 0 24 24" data-v-ee250387>${daqIcon(r.icon) ?? ""}</svg></span><span class="dcw-id" data-v-ee250387><span class="bind-label" data-v-ee250387>${ssrInterpolate(r.ch)}`);
2516
+ if (r.rMin != null || r.rMax != null) _push(`<i class="dcw-tag" data-v-ee250387>${ssrInterpolate(_ctx.$t("townView.k48grv086"))}</i>`);
2508
2517
  else _push(`<!---->`);
2509
- _push(`</span><span class="dcw-name" data-v-771c2c29>${ssrInterpolate(r.name)}</span></span><span class="dcw-cur" data-v-771c2c29><b data-v-771c2c29>${ssrInterpolate(r.value != null ? r.value.toFixed(r.decimals) : "--")}</b><i data-v-771c2c29>${ssrInterpolate(r.unit)}</i></span>`);
2510
- if (unref(mode) === "edit") _push(`<button class="bind-x"${ssrRenderAttr("title", _ctx.$t("townView.k1k73omv016"))} data-v-771c2c29> ✕ </button>`);
2518
+ _push(`</span><span class="dcw-name" data-v-ee250387>${ssrInterpolate(r.name)}</span></span><span class="dcw-cur" data-v-ee250387><b data-v-ee250387>${ssrInterpolate(r.value != null ? r.value.toFixed(r.decimals) : "--")}</b><i data-v-ee250387>${ssrInterpolate(r.unit)}</i></span>`);
2519
+ if (unref(mode) === "edit") _push(`<button class="bind-x"${ssrRenderAttr("title", _ctx.$t("townView.k1k73omv016"))} data-v-ee250387> ✕ </button>`);
2511
2520
  else _push(`<!---->`);
2512
- _push(`</div><div class="${ssrRenderClass([{ recipe: r.rMin != null || r.rMax != null }, "dcw-win"])}" data-v-771c2c29><em data-v-771c2c29>${ssrInterpolate(r.rMin != null || r.rMax != null ? _ctx.$t("townView.k1l3m0hx151") : _ctx.$t("townView.k1bc6rqf181"))}</em><span class="dcw-win-num" data-v-771c2c29>${ssrInterpolate(r.rMin ?? "-∞")}</span><span class="dcw-win-track" data-v-771c2c29><i style="${ssrRenderStyle({ left: `${dcwMarkPct(r)}%` })}" data-v-771c2c29></i></span><span class="dcw-win-num" data-v-771c2c29>${ssrInterpolate(r.rMax ?? "+∞")}</span></div><div class="dcw-write" data-v-771c2c29><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-771c2c29><button class="dcw-send"${ssrIncludeBooleanAttr(unref(dcwWriteDrafts)[r.dcwId] == null || unref(dcwWriteDrafts)[r.dcwId] === "") ? " disabled" : ""}${ssrRenderAttr("title", _ctx.$t("townView.k15t7izc017"))} data-v-771c2c29> write </button></div>`);
2513
- if (unref(dcwWriteErrs)[r.dcwId]) _push(`<small class="dcw-err" data-v-771c2c29>${ssrInterpolate(unref(dcwWriteErrs)[r.dcwId])}</small>`);
2521
+ _push(`</div><div class="${ssrRenderClass([{ recipe: r.rMin != null || r.rMax != null }, "dcw-win"])}" data-v-ee250387><em data-v-ee250387>${ssrInterpolate(r.rMin != null || r.rMax != null ? _ctx.$t("townView.k1l3m0hx151") : _ctx.$t("townView.k1bc6rqf181"))}</em><span class="dcw-win-num" data-v-ee250387>${ssrInterpolate(r.rMin ?? "-∞")}</span><span class="dcw-win-track" data-v-ee250387><i style="${ssrRenderStyle({ left: `${dcwMarkPct(r)}%` })}" data-v-ee250387></i></span><span class="dcw-win-num" data-v-ee250387>${ssrInterpolate(r.rMax ?? "+∞")}</span></div><div class="dcw-write" data-v-ee250387><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-ee250387><button class="dcw-send"${ssrIncludeBooleanAttr(unref(dcwWriteDrafts)[r.dcwId] == null || unref(dcwWriteDrafts)[r.dcwId] === "") ? " disabled" : ""}${ssrRenderAttr("title", _ctx.$t("townView.k15t7izc017"))} data-v-ee250387> write </button></div>`);
2522
+ if (unref(dcwWriteErrs)[r.dcwId]) _push(`<small class="dcw-err" data-v-ee250387>${ssrInterpolate(unref(dcwWriteErrs)[r.dcwId])}</small>`);
2514
2523
  else _push(`<!---->`);
2515
2524
  _push(`</div>`);
2516
2525
  });
2517
2526
  _push(`<!--]-->`);
2518
- if (!unref(boundDcwRows).length) _push(`<div class="ins-empty" data-v-771c2c29>${ssrInterpolate(_ctx.$t("townView.k10smf24087"))}</div>`);
2527
+ if (!unref(boundDcwRows).length) _push(`<div class="ins-empty" data-v-ee250387>${ssrInterpolate(_ctx.$t("townView.k10smf24087"))}</div>`);
2519
2528
  else _push(`<!---->`);
2520
2529
  if (unref(mode) === "edit") {
2521
- _push(`<div class="bind-add-wrap" data-v-771c2c29><button class="bind-add" data-v-771c2c29>${ssrInterpolate(_ctx.$t("townView.kvk1vh5088"))}</button>`);
2530
+ _push(`<div class="bind-add-wrap" data-v-ee250387><button class="bind-add" data-v-ee250387>${ssrInterpolate(_ctx.$t("townView.kvk1vh5088"))}</button>`);
2522
2531
  if (unref(dcwBindPopOpen)) {
2523
- _push(`<div class="bind-pop" style="${ssrRenderStyle({ maxHeight: `${unref(bindPopMaxH)}px` })}" data-v-771c2c29><!--[-->`);
2532
+ _push(`<div class="bind-pop" style="${ssrRenderStyle({ maxHeight: `${unref(bindPopMaxH)}px` })}" data-v-ee250387><!--[-->`);
2524
2533
  ssrRenderList(unref(dcwTemplates), (tpl) => {
2525
2534
  _push(`<!--[-->`);
2526
2535
  if (unref(dcwBindChoices)[tpl.id]?.length) {
2527
- _push(`<div class="bp-group" data-v-771c2c29><span class="bp-tpl" data-v-771c2c29>${ssrInterpolate(tpl.name)} · ${ssrInterpolate(tpl.ch)}</span><!--[-->`);
2536
+ _push(`<div class="bp-group" data-v-ee250387><span class="bp-tpl" data-v-ee250387>${ssrInterpolate(tpl.name)} · ${ssrInterpolate(tpl.ch)}</span><!--[-->`);
2528
2537
  ssrRenderList(unref(dcwBindChoices)[tpl.id], (c) => {
2529
- _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-771c2c29><svg class="bind-svg" viewBox="0 0 24 24" data-v-771c2c29>${daqIcon(c.tpl.icon) ?? ""}</svg><span data-v-771c2c29>${ssrInterpolate(c.name)}`);
2530
- if (c.devName) _push(`<i class="bp-cur" data-v-771c2c29>→ ${ssrInterpolate(c.devName)}</i>`);
2531
- else if (!c.placed) _push(`<i class="bp-cur" data-v-771c2c29>${ssrInterpolate(_ctx.$t("townView.k2bindr0009"))}</i>`);
2538
+ _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-ee250387><svg class="bind-svg" viewBox="0 0 24 24" data-v-ee250387>${daqIcon(c.tpl.icon) ?? ""}</svg><span data-v-ee250387>${ssrInterpolate(c.name)}`);
2539
+ if (c.devName) _push(`<i class="bp-cur" data-v-ee250387>→ ${ssrInterpolate(c.devName)}</i>`);
2540
+ else if (!c.placed) _push(`<i class="bp-cur" data-v-ee250387>${ssrInterpolate(_ctx.$t("townView.k2bindr0009"))}</i>`);
2532
2541
  else _push(`<!---->`);
2533
2542
  _push(`</span></button>`);
2534
2543
  });
@@ -2537,121 +2546,121 @@ var TownView_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineC
2537
2546
  _push(`<!--]-->`);
2538
2547
  });
2539
2548
  _push(`<!--]-->`);
2540
- if (!unref(dcwBindChoiceCount)) _push(`<div class="bp-empty" data-v-771c2c29>${ssrInterpolate(_ctx.$t("townView.k2bindr0010"))}</div>`);
2549
+ if (!unref(dcwBindChoiceCount)) _push(`<div class="bp-empty" data-v-ee250387>${ssrInterpolate(_ctx.$t("townView.k2bindr0010"))}</div>`);
2541
2550
  else _push(`<!---->`);
2542
2551
  _push(`</div>`);
2543
2552
  } else _push(`<!---->`);
2544
2553
  _push(`</div>`);
2545
2554
  } else _push(`<!---->`);
2546
- if (unref(mode) === "edit") _push(`<!--[--><div class="sect-hd" data-v-771c2c29> 变换 · BLENDER </div><div class="xz-seg" data-v-771c2c29><button class="${ssrRenderClass([{ on: unref(tMode) === "translate" }, "seg-btn"])}" data-v-771c2c29>${ssrInterpolate(_ctx.$t("townView.k1hg3167089"))}</button><button class="${ssrRenderClass([{ on: unref(tMode) === "rotate" }, "seg-btn"])}" data-v-771c2c29>${ssrInterpolate(_ctx.$t("townView.k1enlg7i090"))}</button><button class="${ssrRenderClass([{ on: unref(tMode) === "scale" }, "seg-btn"])}" data-v-771c2c29>${ssrInterpolate(_ctx.$t("townView.k1ibjg3j091"))}</button></div><div class="scale-row" data-v-771c2c29><span class="scale-min" data-v-771c2c29>0.2×</span><input class="scale-range" type="range" min="0.2" max="5" step="0.05"${ssrRenderAttr("value", unref(selected).scale)} data-v-771c2c29><span class="scale-max" data-v-771c2c29>5×</span></div><div class="scale-val" data-v-771c2c29>${ssrInterpolate(Math.round(unref(selected).scale * 100))}% </div><div class="ins-foot" data-v-771c2c29><button class="${ssrRenderClass([{ armed: unref(deviceDeleteArmed) === unref(selected).id }, "btn btn-danger ins-del"])}" data-v-771c2c29>${ssrInterpolate(unref(deviceDeleteArmed) === unref(selected).id ? _ctx.$t("townView.k1w10xa5152") : _ctx.$t("townView.k121kfef182"))}</button></div><!--]-->`);
2547
- else _push(`<div class="ins-empty" data-v-771c2c29>${ssrInterpolate(_ctx.$t("townView.kt0i3y2092"))}</div>`);
2555
+ if (unref(mode) === "edit") _push(`<!--[--><div class="sect-hd" data-v-ee250387> 变换 · BLENDER </div><div class="xz-seg" data-v-ee250387><button class="${ssrRenderClass([{ on: unref(tMode) === "translate" }, "seg-btn"])}" data-v-ee250387>${ssrInterpolate(_ctx.$t("townView.k1hg3167089"))}</button><button class="${ssrRenderClass([{ on: unref(tMode) === "rotate" }, "seg-btn"])}" data-v-ee250387>${ssrInterpolate(_ctx.$t("townView.k1enlg7i090"))}</button><button class="${ssrRenderClass([{ on: unref(tMode) === "scale" }, "seg-btn"])}" data-v-ee250387>${ssrInterpolate(_ctx.$t("townView.k1ibjg3j091"))}</button></div><div class="scale-row" data-v-ee250387><span class="scale-min" data-v-ee250387>0.2×</span><input class="scale-range" type="range" min="0.2" max="5" step="0.05"${ssrRenderAttr("value", unref(selected).scale)} data-v-ee250387><span class="scale-max" data-v-ee250387>5×</span></div><div class="scale-val" data-v-ee250387>${ssrInterpolate(Math.round(unref(selected).scale * 100))}% </div><div class="ins-foot" data-v-ee250387><button class="${ssrRenderClass([{ armed: unref(deviceDeleteArmed) === unref(selected).id }, "btn btn-danger ins-del"])}" data-v-ee250387>${ssrInterpolate(unref(deviceDeleteArmed) === unref(selected).id ? _ctx.$t("townView.k1w10xa5152") : _ctx.$t("townView.k121kfef182"))}</button></div><!--]-->`);
2556
+ else _push(`<div class="ins-empty" data-v-ee250387>${ssrInterpolate(_ctx.$t("townView.kt0i3y2092"))}</div>`);
2548
2557
  _push(`<!--]-->`);
2549
2558
  }
2550
2559
  _push(`<!--]-->`);
2551
2560
  } else if (unref(selected).kind === "agent") {
2552
- _push(`<!--[--><div class="chat-id-row" data-v-771c2c29><span class="chat-badge" style="${ssrRenderStyle({ "--p-acc": unref(agentChatColor) })}" data-v-771c2c29>${ssrInterpolate(unref(agentChatTitle).slice(0, 1).toUpperCase())}</span><div class="chat-nameplate" data-v-771c2c29><span class="chat-name" data-v-771c2c29>${ssrInterpolate(unref(agentChatTitle))}</span><span class="chat-meta" data-v-771c2c29><span class="${ssrRenderClass([unref(selectedAgentMeta)?.role === "lead" ? "r-lead" : "r-worker", "chat-role"])}" data-v-771c2c29>${ssrInterpolate(unref(selectedAgentRoleTag))}</span><span class="${ssrRenderClass([`s-${unref(selectedAgentMeta)?.state ?? "idle"}`, "chat-state"])}" data-v-771c2c29>${ssrInterpolate(unref(agentChatStateLabel))}</span>`);
2553
- if (unref(selectedAgentMeta)?.harness) _push(`<span class="chat-harness" data-v-771c2c29>${ssrInterpolate(unref(selectedAgentMeta).harness.toUpperCase())}</span>`);
2561
+ _push(`<!--[--><div class="chat-id-row" data-v-ee250387><span class="chat-badge" style="${ssrRenderStyle({ "--p-acc": unref(agentChatColor) })}" data-v-ee250387>${ssrInterpolate(unref(agentChatTitle).slice(0, 1).toUpperCase())}</span><div class="chat-nameplate" data-v-ee250387><span class="chat-name" data-v-ee250387>${ssrInterpolate(unref(agentChatTitle))}</span><span class="chat-meta" data-v-ee250387><span class="${ssrRenderClass([unref(selectedAgentMeta)?.role === "lead" ? "r-lead" : "r-worker", "chat-role"])}" data-v-ee250387>${ssrInterpolate(unref(selectedAgentRoleTag))}</span><span class="${ssrRenderClass([`s-${unref(selectedAgentMeta)?.state ?? "idle"}`, "chat-state"])}" data-v-ee250387>${ssrInterpolate(unref(agentChatStateLabel))}</span>`);
2562
+ if (unref(selectedAgentMeta)?.harness) _push(`<span class="chat-harness" data-v-ee250387>${ssrInterpolate(unref(selectedAgentMeta).harness.toUpperCase())}</span>`);
2554
2563
  else _push(`<!---->`);
2555
- _push(`<span class="chat-count" data-v-771c2c29>${ssrInterpolate(unref(agentHistory).length + unref(agentChatRows).length)} ${ssrInterpolate(_ctx.$t("townView.k4dfq040"))}</span></span></div></div><div class="obj-row" data-v-771c2c29><span class="obj-label" data-v-771c2c29>${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-771c2c29><!--[-->`);
2564
+ _push(`<span class="chat-count" data-v-ee250387>${ssrInterpolate(unref(agentHistory).length + unref(agentChatRows).length)} ${ssrInterpolate(_ctx.$t("townView.k4dfq040"))}</span></span></div></div><div class="obj-row" data-v-ee250387><span class="obj-label" data-v-ee250387>${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-ee250387><!--[-->`);
2556
2565
  ssrRenderList(unref(agentModels), (m) => {
2557
- _push(`<option${ssrRenderAttr("value", m.id)} data-v-771c2c29>${ssrInterpolate(m.name)}</option>`);
2566
+ _push(`<option${ssrRenderAttr("value", m.id)} data-v-ee250387>${ssrInterpolate(m.name)}</option>`);
2558
2567
  });
2559
- _push(`<!--]--></select></div><div class="obj-sep" data-v-771c2c29></div><div class="obj-row" data-v-771c2c29><span class="obj-label" data-v-771c2c29>${ssrInterpolate(_ctx.$t("townView.k1fix3hb093"))}</span><span class="range-status" data-v-771c2c29>${ssrInterpolate(unref(agentRangeStatusText))}</span>`);
2560
- if (unref(mode) === "edit") _push(`<button class="${ssrRenderClass([{ on: unref(agentDrawingRange) }, "obj-mini"])}"${ssrRenderAttr("title", _ctx.$t("townView.k13enoy3018"))} data-v-771c2c29>${ssrInterpolate(unref(agentDrawingRange) ? _ctx.$t("townView.k3slzhc153") : _ctx.$t("townView.k1f1xmci183"))}</button>`);
2568
+ _push(`<!--]--></select></div><div class="obj-sep" data-v-ee250387></div><div class="obj-row" data-v-ee250387><span class="obj-label" data-v-ee250387>${ssrInterpolate(_ctx.$t("townView.k1fix3hb093"))}</span><span class="range-status" data-v-ee250387>${ssrInterpolate(unref(agentRangeStatusText))}</span>`);
2569
+ if (unref(mode) === "edit") _push(`<button class="${ssrRenderClass([{ on: unref(agentDrawingRange) }, "obj-mini"])}"${ssrRenderAttr("title", _ctx.$t("townView.k13enoy3018"))} data-v-ee250387>${ssrInterpolate(unref(agentDrawingRange) ? _ctx.$t("townView.k3slzhc153") : _ctx.$t("townView.k1f1xmci183"))}</button>`);
2561
2570
  else _push(`<!---->`);
2562
- _push(`</div><div class="obj-sep" data-v-771c2c29></div><div class="sect-hd" data-v-771c2c29>${ssrInterpolate(_ctx.$t("townView.k1p7nru2094"))}</div><!--[-->`);
2571
+ _push(`</div><div class="obj-sep" data-v-ee250387></div><div class="sect-hd" data-v-ee250387>${ssrInterpolate(_ctx.$t("townView.k1p7nru2094"))}</div><!--[-->`);
2563
2572
  ssrRenderList(unref(agentBindings), (b) => {
2564
- _push(`<div class="bind-row" data-v-771c2c29><span class="${ssrRenderClass([b.kind === "dcw" ? "accent" : "", "ins-chip"])}" style="${ssrRenderStyle({ "flex": "none" })}" data-v-771c2c29>${ssrInterpolate(b.kind === "dcw" ? _ctx.$t("townView.k40ifw097") : _ctx.$t("townView.k40rjw098"))}</span><span class="bind-meta" data-v-771c2c29><span class="bind-label" data-v-771c2c29>${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-771c2c29><option value="auto" data-v-771c2c29>${ssrInterpolate(_ctx.$t("townView.k1io1ylm095"))}</option><option value="manual" data-v-771c2c29>${ssrInterpolate(_ctx.$t("townView.k1duyr8q096"))}</option></select></span><button class="bind-x"${ssrRenderAttr("title", _ctx.$t("townView.k1k73omv016"))} data-v-771c2c29> ✕ </button></div>`);
2573
+ _push(`<div class="bind-row" data-v-ee250387><span class="${ssrRenderClass([b.kind === "dcw" ? "accent" : "", "ins-chip"])}" style="${ssrRenderStyle({ "flex": "none" })}" data-v-ee250387>${ssrInterpolate(b.kind === "dcw" ? _ctx.$t("townView.k40ifw097") : _ctx.$t("townView.k40rjw098"))}</span><span class="bind-meta" data-v-ee250387><span class="bind-label" data-v-ee250387>${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-ee250387><option value="auto" data-v-ee250387>${ssrInterpolate(_ctx.$t("townView.k1io1ylm095"))}</option><option value="manual" data-v-ee250387>${ssrInterpolate(_ctx.$t("townView.k1duyr8q096"))}</option></select></span><button class="bind-x"${ssrRenderAttr("title", _ctx.$t("townView.k1k73omv016"))} data-v-ee250387> ✕ </button></div>`);
2565
2574
  });
2566
2575
  _push(`<!--]-->`);
2567
- if (!unref(agentBindings).length) _push(`<div class="ins-empty" data-v-771c2c29> 未绑定工业节点 —— 绑定后 Agent 可用 dcw_control / daq_query 工具 </div>`);
2576
+ if (!unref(agentBindings).length) _push(`<div class="ins-empty" data-v-ee250387> 未绑定工业节点 —— 绑定后 Agent 可用 dcw_control / daq_query 工具 </div>`);
2568
2577
  else _push(`<!---->`);
2569
2578
  if (unref(mode) === "edit") {
2570
- _push(`<div class="daq-bind-bar" style="${ssrRenderStyle({ "margin-bottom": "8px" })}" data-v-771c2c29><select class="bind-select" style="${ssrRenderStyle({
2579
+ _push(`<div class="daq-bind-bar" style="${ssrRenderStyle({ "margin-bottom": "8px" })}" data-v-ee250387><select class="bind-select" style="${ssrRenderStyle({
2571
2580
  "flex": "none",
2572
2581
  "width": "62px"
2573
- })}" data-v-771c2c29><option value="dcw" data-v-771c2c29${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-771c2c29${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-771c2c29><option value="" data-v-771c2c29${ssrIncludeBooleanAttr(Array.isArray(unref(agentBindNodeId)) ? ssrLooseContain(unref(agentBindNodeId), "") : ssrLooseEqual(unref(agentBindNodeId), "")) ? " selected" : ""}>${ssrInterpolate(_ctx.$t("townView.kurjldk099"))}</option>`);
2582
+ })}" data-v-ee250387><option value="dcw" data-v-ee250387${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-ee250387${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-ee250387><option value="" data-v-ee250387${ssrIncludeBooleanAttr(Array.isArray(unref(agentBindNodeId)) ? ssrLooseContain(unref(agentBindNodeId), "") : ssrLooseEqual(unref(agentBindNodeId), "")) ? " selected" : ""}>${ssrInterpolate(_ctx.$t("townView.kurjldk099"))}</option>`);
2574
2583
  if (unref(agentBindKind) === "dcw") {
2575
2584
  _push(`<!--[-->`);
2576
2585
  ssrRenderList(unref(dcw).nodes, (n) => {
2577
- _push(`<option${ssrRenderAttr("value", n.id)} data-v-771c2c29${ssrIncludeBooleanAttr(Array.isArray(unref(agentBindNodeId)) ? ssrLooseContain(unref(agentBindNodeId), n.id) : ssrLooseEqual(unref(agentBindNodeId), n.id)) ? " selected" : ""}>${ssrInterpolate(n.name)}</option>`);
2586
+ _push(`<option${ssrRenderAttr("value", n.id)} data-v-ee250387${ssrIncludeBooleanAttr(Array.isArray(unref(agentBindNodeId)) ? ssrLooseContain(unref(agentBindNodeId), n.id) : ssrLooseEqual(unref(agentBindNodeId), n.id)) ? " selected" : ""}>${ssrInterpolate(n.name)}</option>`);
2578
2587
  });
2579
2588
  _push(`<!--]-->`);
2580
2589
  } else {
2581
2590
  _push(`<!--[-->`);
2582
2591
  ssrRenderList(unref(daq).nodes, (n) => {
2583
- _push(`<option${ssrRenderAttr("value", n.id)} data-v-771c2c29${ssrIncludeBooleanAttr(Array.isArray(unref(agentBindNodeId)) ? ssrLooseContain(unref(agentBindNodeId), n.id) : ssrLooseEqual(unref(agentBindNodeId), n.id)) ? " selected" : ""}>${ssrInterpolate(n.name)}</option>`);
2592
+ _push(`<option${ssrRenderAttr("value", n.id)} data-v-ee250387${ssrIncludeBooleanAttr(Array.isArray(unref(agentBindNodeId)) ? ssrLooseContain(unref(agentBindNodeId), n.id) : ssrLooseEqual(unref(agentBindNodeId), n.id)) ? " selected" : ""}>${ssrInterpolate(n.name)}</option>`);
2584
2593
  });
2585
2594
  _push(`<!--]-->`);
2586
2595
  }
2587
2596
  _push(`</select><select class="bind-select" style="${ssrRenderStyle({
2588
2597
  "flex": "none",
2589
2598
  "width": "76px"
2590
- })}" data-v-771c2c29><option value="auto" data-v-771c2c29${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-771c2c29${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-771c2c29>${ssrInterpolate(_ctx.$t("townView.k452a8102"))}</button></div>`);
2599
+ })}" data-v-ee250387><option value="auto" data-v-ee250387${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-ee250387${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-ee250387>${ssrInterpolate(_ctx.$t("townView.k452a8102"))}</button></div>`);
2591
2600
  } else _push(`<!---->`);
2592
2601
  if (unref(pendingApprovals).length) {
2593
- _push(`<!--[--><div class="sect-hd" style="${ssrRenderStyle({ "color": "var(--hud-amber)" })}" data-v-771c2c29>${ssrInterpolate(_ctx.$t("townView.k1gk2jg7132"))} ${ssrInterpolate(unref(pendingApprovals).length)}</div><!--[-->`);
2602
+ _push(`<!--[--><div class="sect-hd" style="${ssrRenderStyle({ "color": "var(--hud-amber)" })}" data-v-ee250387>${ssrInterpolate(_ctx.$t("townView.k1gk2jg7132"))} ${ssrInterpolate(unref(pendingApprovals).length)}</div><!--[-->`);
2594
2603
  ssrRenderList(unref(pendingApprovals), (ap) => {
2595
- _push(`<div class="approval-card" data-v-771c2c29><div class="approval-detail" data-v-771c2c29>${ssrInterpolate(ap.detail)}</div><div class="${ssrRenderClass([{ urgent: approvalRemainingSec(ap) <= 30 }, "approval-ttl"])}" data-v-771c2c29> ⏱ ${ssrInterpolate(approvalRemainingSec(ap))}s ${ssrInterpolate(_ctx.$t("townView.hitlAutoReject"))}</div><input${ssrRenderAttr("value", unref(approvalComments)[ap.id])} class="dcw-write input-inline" style="${ssrRenderStyle({
2604
+ _push(`<div class="approval-card" data-v-ee250387><div class="approval-detail" data-v-ee250387>${ssrInterpolate(ap.detail)}</div><div class="${ssrRenderClass([{ urgent: approvalRemainingSec(ap) <= 30 }, "approval-ttl"])}" data-v-ee250387> ⏱ ${ssrInterpolate(approvalRemainingSec(ap))}s ${ssrInterpolate(_ctx.$t("townView.hitlAutoReject"))}</div><input${ssrRenderAttr("value", unref(approvalComments)[ap.id])} class="dcw-write input-inline" style="${ssrRenderStyle({
2596
2605
  "width": "100%",
2597
2606
  "margin-top": "5px"
2598
- })}"${ssrRenderAttr("placeholder", _ctx.$t("townView.keztqrn020"))} data-v-771c2c29><div class="daq-bind-bar" style="${ssrRenderStyle({ "margin-top": "5px" })}" data-v-771c2c29><button class="bind-add-btn" data-v-771c2c29>${ssrInterpolate(_ctx.$t("townView.kslcozu103"))}</button><button class="bind-add-btn danger" data-v-771c2c29>${ssrInterpolate(_ctx.$t("townView.k14gu3rd104"))}</button></div></div>`);
2607
+ })}"${ssrRenderAttr("placeholder", _ctx.$t("townView.keztqrn020"))} data-v-ee250387><div class="daq-bind-bar" style="${ssrRenderStyle({ "margin-top": "5px" })}" data-v-ee250387><button class="bind-add-btn" data-v-ee250387>${ssrInterpolate(_ctx.$t("townView.kslcozu103"))}</button><button class="bind-add-btn danger" data-v-ee250387>${ssrInterpolate(_ctx.$t("townView.k14gu3rd104"))}</button></div></div>`);
2599
2608
  });
2600
2609
  _push(`<!--]--><!--]-->`);
2601
2610
  } else _push(`<!---->`);
2602
- if (unref(agentRangeDraft) && unref(mode) === "edit") _push(`<!--[--><div class="obj-row" data-v-771c2c29><span class="obj-label" data-v-771c2c29>${ssrInterpolate(_ctx.$t("townView.k3zhy5048"))}</span><div class="bp-seg" data-v-771c2c29><button class="${ssrRenderClass([{ on: unref(agentRangeDraft).shape === "ellipse" }, "seg-btn"])}" data-v-771c2c29>${ssrInterpolate(_ctx.$t("townView.k414bc049"))}</button><button class="${ssrRenderClass([{ on: unref(agentRangeDraft).shape === "rect" }, "seg-btn"])}" data-v-771c2c29>${ssrInterpolate(_ctx.$t("townView.k43u0g050"))}</button></div></div><div class="obj-row" data-v-771c2c29><span class="obj-label" data-v-771c2c29>${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-771c2c29><span class="bp-val" data-v-771c2c29>${ssrInterpolate(Math.round(unref(agentRangeDraft).radiusX))}</span></div><div class="obj-row" data-v-771c2c29><span class="obj-label" data-v-771c2c29>${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-771c2c29><span class="bp-val" data-v-771c2c29>${ssrInterpolate(Math.round(unref(agentRangeDraft).radiusZ))}</span></div><button class="obj-mini danger" data-v-771c2c29>${ssrInterpolate(_ctx.$t("townView.k1w45mzc107"))}</button><!--]-->`);
2603
- else _push(`<div class="ins-empty" data-v-771c2c29>${ssrInterpolate(_ctx.$t("townView.k14s8urm108"))}</div>`);
2604
- _push(`<div class="obj-sep" data-v-771c2c29></div><div class="sect-hd chat-sect" data-v-771c2c29>${ssrInterpolate(_ctx.$t("townView.k1ghjbfc133"))} ${ssrInterpolate(unref(agentChatTitle))} <button class="mini-btn chat-refresh"${ssrRenderAttr("title", _ctx.$t("townView.k15avt7g021"))} data-v-771c2c29>${ssrInterpolate(unref(historyLoading) ? "…" : "↻")}</button></div><div class="rpg-lines chat-embed" data-v-771c2c29>`);
2605
- if (unref(historyLoading)) _push(`<div class="rpg-note" data-v-771c2c29>${ssrInterpolate(_ctx.$t("townView.kkhlx5h109"))}</div>`);
2611
+ if (unref(agentRangeDraft) && unref(mode) === "edit") _push(`<!--[--><div class="obj-row" data-v-ee250387><span class="obj-label" data-v-ee250387>${ssrInterpolate(_ctx.$t("townView.k3zhy5048"))}</span><div class="bp-seg" data-v-ee250387><button class="${ssrRenderClass([{ on: unref(agentRangeDraft).shape === "ellipse" }, "seg-btn"])}" data-v-ee250387>${ssrInterpolate(_ctx.$t("townView.k414bc049"))}</button><button class="${ssrRenderClass([{ on: unref(agentRangeDraft).shape === "rect" }, "seg-btn"])}" data-v-ee250387>${ssrInterpolate(_ctx.$t("townView.k43u0g050"))}</button></div></div><div class="obj-row" data-v-ee250387><span class="obj-label" data-v-ee250387>${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-ee250387><span class="bp-val" data-v-ee250387>${ssrInterpolate(Math.round(unref(agentRangeDraft).radiusX))}</span></div><div class="obj-row" data-v-ee250387><span class="obj-label" data-v-ee250387>${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-ee250387><span class="bp-val" data-v-ee250387>${ssrInterpolate(Math.round(unref(agentRangeDraft).radiusZ))}</span></div><button class="obj-mini danger" data-v-ee250387>${ssrInterpolate(_ctx.$t("townView.k1w45mzc107"))}</button><!--]-->`);
2612
+ else _push(`<div class="ins-empty" data-v-ee250387>${ssrInterpolate(_ctx.$t("townView.k14s8urm108"))}</div>`);
2613
+ _push(`<div class="obj-sep" data-v-ee250387></div><div class="sect-hd chat-sect" data-v-ee250387>${ssrInterpolate(_ctx.$t("townView.k1ghjbfc133"))} ${ssrInterpolate(unref(agentChatTitle))} <button class="mini-btn chat-refresh"${ssrRenderAttr("title", _ctx.$t("townView.k15avt7g021"))} data-v-ee250387>${ssrInterpolate(unref(historyLoading) ? "…" : "↻")}</button></div><div class="rpg-lines chat-embed" data-v-ee250387>`);
2614
+ if (unref(historyLoading)) _push(`<div class="rpg-note" data-v-ee250387>${ssrInterpolate(_ctx.$t("townView.kkhlx5h109"))}</div>`);
2606
2615
  else _push(`<!---->`);
2607
2616
  if (unref(agentHistory).length) {
2608
- _push(`<!--[--><div class="rpg-divider" data-v-771c2c29>${ssrInterpolate(_ctx.$t("townView.k768cnt134"))} ${ssrInterpolate(unref(agentHistory).length)}</div><!--[-->`);
2617
+ _push(`<!--[--><div class="rpg-divider" data-v-ee250387>${ssrInterpolate(_ctx.$t("townView.k768cnt134"))} ${ssrInterpolate(unref(agentHistory).length)}</div><!--[-->`);
2609
2618
  ssrRenderList(unref(agentHistory), (r) => {
2610
- _push(`<div class="rpg-line hist" data-v-771c2c29><span class="rpg-time" data-v-771c2c29>${ssrInterpolate(fmtTime(r.at))}</span><div class="rpg-bubble" data-v-771c2c29>`);
2611
- if (chatKindLabel(r.kind)) _push(`<span class="${ssrRenderClass([`k-${r.kind}`, "rpg-kind"])}" data-v-771c2c29>${ssrInterpolate(chatKindLabel(r.kind))}</span>`);
2619
+ _push(`<div class="rpg-line hist" data-v-ee250387><span class="rpg-time" data-v-ee250387>${ssrInterpolate(fmtTime(r.at))}</span><div class="rpg-bubble" data-v-ee250387>`);
2620
+ if (chatKindLabel(r.kind)) _push(`<span class="${ssrRenderClass([`k-${r.kind}`, "rpg-kind"])}" data-v-ee250387>${ssrInterpolate(chatKindLabel(r.kind))}</span>`);
2612
2621
  else _push(`<!---->`);
2613
- _push(`<span class="rpg-text" data-v-771c2c29>${ssrInterpolate(r.text)}</span></div></div>`);
2622
+ _push(`<span class="rpg-text" data-v-ee250387>${ssrInterpolate(r.text)}</span></div></div>`);
2614
2623
  });
2615
2624
  _push(`<!--]--><!--]-->`);
2616
2625
  } else _push(`<!---->`);
2617
- if (unref(agentChatRows).length) _push(`<div class="rpg-divider live" data-v-771c2c29>${ssrInterpolate(_ctx.$t("townView.k1cwz73k135"))} ${ssrInterpolate(unref(agentChatRows).length)}</div>`);
2626
+ if (unref(agentChatRows).length) _push(`<div class="rpg-divider live" data-v-ee250387>${ssrInterpolate(_ctx.$t("townView.k1cwz73k135"))} ${ssrInterpolate(unref(agentChatRows).length)}</div>`);
2618
2627
  else _push(`<!---->`);
2619
2628
  _push(`<!--[-->`);
2620
2629
  ssrRenderList(unref(agentChatRows), (r) => {
2621
- _push(`<div class="rpg-line live" data-v-771c2c29><span class="rpg-time" data-v-771c2c29>${ssrInterpolate(fmtTime(r.at))}</span><div class="rpg-bubble" data-v-771c2c29><span class="rpg-text" data-v-771c2c29>${ssrInterpolate(r.text)}</span></div></div>`);
2630
+ _push(`<div class="rpg-line live" data-v-ee250387><span class="rpg-time" data-v-ee250387>${ssrInterpolate(fmtTime(r.at))}</span><div class="rpg-bubble" data-v-ee250387><span class="rpg-text" data-v-ee250387>${ssrInterpolate(r.text)}</span></div></div>`);
2622
2631
  });
2623
2632
  _push(`<!--]-->`);
2624
- if (unref(selectedAgentMeta)?.state === "busy") _push(`<div class="rpg-typing" data-v-771c2c29><span class="ty-dot" data-v-771c2c29></span><span class="ty-dot" data-v-771c2c29></span><span class="ty-dot" data-v-771c2c29></span><span class="ty-label" data-v-771c2c29>${ssrInterpolate(_ctx.$t("townView.k3o5tz9110"))}</span></div>`);
2633
+ if (unref(selectedAgentMeta)?.state === "busy") _push(`<div class="rpg-typing" data-v-ee250387><span class="ty-dot" data-v-ee250387></span><span class="ty-dot" data-v-ee250387></span><span class="ty-dot" data-v-ee250387></span><span class="ty-label" data-v-ee250387>${ssrInterpolate(_ctx.$t("townView.k3o5tz9110"))}</span></div>`);
2625
2634
  else _push(`<!---->`);
2626
- if (!unref(historyLoading) && !unref(agentHistory).length && !unref(agentChatRows).length) _push(`<div class="rpg-note" data-v-771c2c29>${ssrInterpolate(_ctx.$t("townView.k1qkqld7111"))}</div>`);
2635
+ if (!unref(historyLoading) && !unref(agentHistory).length && !unref(agentChatRows).length) _push(`<div class="rpg-note" data-v-ee250387>${ssrInterpolate(_ctx.$t("townView.k1qkqld7111"))}</div>`);
2627
2636
  else _push(`<!---->`);
2628
2637
  _push(`</div><!--]-->`);
2629
2638
  } else _push(`<!---->`);
2630
2639
  _push(`</section>`);
2631
2640
  } else _push(`<!---->`);
2632
- _push(`<section class="panel" data-v-771c2c29><div class="panel-hd" data-v-771c2c29><h3 data-v-771c2c29>${ssrInterpolate(_ctx.$t("townView.k17dkhgd112"))}</h3></div><div class="health-body" data-v-771c2c29><div class="donut-wrap" data-v-771c2c29><canvas width="118" height="118" data-v-771c2c29></canvas><div class="donut-center" data-v-771c2c29><b style="${ssrRenderStyle({ color: unref(healthTone) })}" data-v-771c2c29>${ssrInterpolate(unref(healthPct))}%</b><span data-v-771c2c29>${ssrInterpolate(_ctx.$t("townView.k7h1nxo113"))}</span></div></div><div class="health-legend" data-v-771c2c29><div class="hl-row" data-v-771c2c29><span class="hl-dot" style="${ssrRenderStyle({ background: "var(--hud-accent)" })}" data-v-771c2c29></span> ${ssrInterpolate(_ctx.$t("townView.k3vp67i114"))} <span class="n" data-v-771c2c29>${ssrInterpolate(unref(runningCount))}</span></div><div class="hl-row" data-v-771c2c29><span class="hl-dot" style="${ssrRenderStyle({ background: "var(--hud-amber)" })}" data-v-771c2c29></span> ${ssrInterpolate(_ctx.$t("townView.k3zcvb115"))} <span class="n" data-v-771c2c29>${ssrInterpolate(unref(idleCount))}</span></div><div class="hl-row" data-v-771c2c29><span class="hl-dot" style="${ssrRenderStyle({ background: "var(--hud-danger)" })}" data-v-771c2c29></span> ${ssrInterpolate(_ctx.$t("townView.k3xmid116"))} <span class="n" data-v-771c2c29>${ssrInterpolate(unref(alarmCount))}</span></div><div class="hl-row" data-v-771c2c29><span class="hl-dot" style="${ssrRenderStyle({ background: "#3a4a63" })}" data-v-771c2c29></span> ${ssrInterpolate(_ctx.$t("townView.statesOffline"))} <span class="n" data-v-771c2c29>${ssrInterpolate(unref(offlineCount))}</span></div></div></div></section><section class="panel" data-v-771c2c29><div class="panel-hd" data-v-771c2c29><h3 data-v-771c2c29>${ssrInterpolate(_ctx.$t("townView.k1q247fn117"))}</h3><span class="panel-tag" data-v-771c2c29>${ssrInterpolate(unref(deviceTwins).twins.length)}</span></div>`);
2641
+ _push(`<section class="panel" data-v-ee250387><div class="panel-hd" data-v-ee250387><h3 data-v-ee250387>${ssrInterpolate(_ctx.$t("townView.k17dkhgd112"))}</h3></div><div class="health-body" data-v-ee250387><div class="donut-wrap" data-v-ee250387><canvas width="118" height="118" data-v-ee250387></canvas><div class="donut-center" data-v-ee250387><b style="${ssrRenderStyle({ color: unref(healthTone) })}" data-v-ee250387>${ssrInterpolate(unref(healthPct))}%</b><span data-v-ee250387>${ssrInterpolate(_ctx.$t("townView.k7h1nxo113"))}</span></div></div><div class="health-legend" data-v-ee250387><div class="hl-row" data-v-ee250387><span class="hl-dot" style="${ssrRenderStyle({ background: "var(--hud-accent)" })}" data-v-ee250387></span> ${ssrInterpolate(_ctx.$t("townView.k3vp67i114"))} <span class="n" data-v-ee250387>${ssrInterpolate(unref(runningCount))}</span></div><div class="hl-row" data-v-ee250387><span class="hl-dot" style="${ssrRenderStyle({ background: "var(--hud-amber)" })}" data-v-ee250387></span> ${ssrInterpolate(_ctx.$t("townView.k3zcvb115"))} <span class="n" data-v-ee250387>${ssrInterpolate(unref(idleCount))}</span></div><div class="hl-row" data-v-ee250387><span class="hl-dot" style="${ssrRenderStyle({ background: "var(--hud-danger)" })}" data-v-ee250387></span> ${ssrInterpolate(_ctx.$t("townView.k3xmid116"))} <span class="n" data-v-ee250387>${ssrInterpolate(unref(alarmCount))}</span></div><div class="hl-row" data-v-ee250387><span class="hl-dot" style="${ssrRenderStyle({ background: "#3a4a63" })}" data-v-ee250387></span> ${ssrInterpolate(_ctx.$t("townView.statesOffline"))} <span class="n" data-v-ee250387>${ssrInterpolate(unref(offlineCount))}</span></div></div></div></section><section class="panel" data-v-ee250387><div class="panel-hd" data-v-ee250387><h3 data-v-ee250387>${ssrInterpolate(_ctx.$t("townView.k1q247fn117"))}</h3><span class="panel-tag" data-v-ee250387>${ssrInterpolate(unref(deviceTwins).twins.length)}</span></div>`);
2633
2642
  _push(ssrRenderComponent(_component_WorkshopDeviceTwinPanel, {
2634
2643
  class: "kd-embed",
2635
2644
  "daq-live": unref(daqLive),
2636
2645
  "dcw-live": unref(dcwLive),
2637
2646
  onFocusDevice
2638
2647
  }, null, _parent));
2639
- _push(`</section><section class="panel" data-v-771c2c29><div class="panel-hd" data-v-771c2c29><h3 data-v-771c2c29>${ssrInterpolate(_ctx.$t("townView.k1cxf749118"))}</h3><span class="panel-tag" data-v-771c2c29>${ssrInterpolate(unref(activeAlarmCount))} ${ssrInterpolate(_ctx.$t("townView.k4dfq040"))}</span><button class="mini-btn"${ssrRenderAttr("title", _ctx.$t("townView.k1bkswpz022"))} data-v-771c2c29> ✓ </button></div><div class="alarm-list" data-v-771c2c29><!--[-->`);
2648
+ _push(`</section><section class="panel" data-v-ee250387><div class="panel-hd" data-v-ee250387><h3 data-v-ee250387>${ssrInterpolate(_ctx.$t("townView.k1cxf749118"))}</h3><span class="panel-tag" data-v-ee250387>${ssrInterpolate(unref(activeAlarmCount))} ${ssrInterpolate(_ctx.$t("townView.k4dfq040"))}</span><button class="mini-btn"${ssrRenderAttr("title", _ctx.$t("townView.k1bkswpz022"))} data-v-ee250387> ✓ </button></div><div class="alarm-list" data-v-ee250387><!--[-->`);
2640
2649
  ssrRenderList(unref(alarms).slice(0, 8), (a) => {
2641
- _push(`<div class="al-row" data-v-771c2c29><span class="${ssrRenderClass([a.state === 2 ? "info" : a.state === 1 ? "warn" : "crit", "al-ico"])}" data-v-771c2c29><svg class="al-svg" viewBox="0 0 24 24" data-v-771c2c29><path d="M12 3 22 20H2L12 3Z" data-v-771c2c29></path><path d="M12 10v4M12 17v.2" data-v-771c2c29></path></svg></span><div class="al-body" data-v-771c2c29><div class="al-txt" data-v-771c2c29>${ssrInterpolate(a.txt)}</div><div class="al-src" data-v-771c2c29>${ssrInterpolate(a.src)} · ${ssrInterpolate(a.time)}</div></div><button class="${ssrRenderClass([`s${a.state}`, "al-state"])}" data-v-771c2c29>${ssrInterpolate(ALARM_STATES[a.state])}</button></div>`);
2650
+ _push(`<div class="al-row" data-v-ee250387><span class="${ssrRenderClass([a.state === 2 ? "info" : a.state === 1 ? "warn" : "crit", "al-ico"])}" data-v-ee250387><svg class="al-svg" viewBox="0 0 24 24" data-v-ee250387><path d="M12 3 22 20H2L12 3Z" data-v-ee250387></path><path d="M12 10v4M12 17v.2" data-v-ee250387></path></svg></span><div class="al-body" data-v-ee250387><div class="al-txt" data-v-ee250387>${ssrInterpolate(a.txt)}</div><div class="al-src" data-v-ee250387>${ssrInterpolate(a.src)} · ${ssrInterpolate(a.time)}</div></div><button class="${ssrRenderClass([`s${a.state}`, "al-state"])}" data-v-ee250387>${ssrInterpolate(ALARM_STATES[a.state])}</button></div>`);
2642
2651
  });
2643
2652
  _push(`<!--]-->`);
2644
- if (!unref(alarms).length) _push(`<div class="rail-empty" data-v-771c2c29><svg class="re-ico" viewBox="0 0 24 24" data-v-771c2c29><path d="M12 3l7 3v5c0 4.6-3 8.2-7 10-4-1.8-7-5.4-7-10V6l7-3Z" data-v-771c2c29></path><path d="m9.2 12.2 2 2 3.6-4" data-v-771c2c29></path></svg><span data-v-771c2c29>${ssrInterpolate(_ctx.$t("townView.kjz544r119"))}</span></div>`);
2653
+ if (!unref(alarms).length) _push(`<div class="rail-empty" data-v-ee250387><svg class="re-ico" viewBox="0 0 24 24" data-v-ee250387><path d="M12 3l7 3v5c0 4.6-3 8.2-7 10-4-1.8-7-5.4-7-10V6l7-3Z" data-v-ee250387></path><path d="m9.2 12.2 2 2 3.6-4" data-v-ee250387></path></svg><span data-v-ee250387>${ssrInterpolate(_ctx.$t("townView.kjz544r119"))}</span></div>`);
2645
2654
  else _push(`<!---->`);
2646
- _push(`</div></section><section class="panel" data-v-771c2c29><div class="panel-hd" data-v-771c2c29><h3 data-v-771c2c29>${ssrInterpolate(_ctx.$t("townView.k1cxdtq2120"))}</h3><span class="panel-tag" data-v-771c2c29>${ssrInterpolate(unref(ticker).length)}</span></div><div class="event-list" data-v-771c2c29><!--[-->`);
2655
+ _push(`</div></section><section class="panel" data-v-ee250387><div class="panel-hd" data-v-ee250387><h3 data-v-ee250387>${ssrInterpolate(_ctx.$t("townView.k1cxdtq2120"))}</h3><span class="panel-tag" data-v-ee250387>${ssrInterpolate(unref(ticker).length)}</span></div><div class="event-list" data-v-ee250387><!--[-->`);
2647
2656
  ssrRenderList([...unref(ticker)].reverse(), (t, i) => {
2648
- _push(`<div class="event-row" data-v-771c2c29><span class="ev-time" data-v-771c2c29>${ssrInterpolate(fmtTime(t.at))}</span><span class="ev-name"${ssrRenderAttr("title", t.agentName)} data-v-771c2c29>${ssrInterpolate(t.agentName)}</span><span class="ev-text"${ssrRenderAttr("title", t.text)} data-v-771c2c29>${ssrInterpolate(t.text)}</span></div>`);
2657
+ _push(`<div class="event-row" data-v-ee250387><span class="ev-time" data-v-ee250387>${ssrInterpolate(fmtTime(t.at))}</span><span class="ev-name"${ssrRenderAttr("title", t.agentName)} data-v-ee250387>${ssrInterpolate(t.agentName)}</span><span class="ev-text"${ssrRenderAttr("title", t.text)} data-v-ee250387>${ssrInterpolate(t.text)}</span></div>`);
2649
2658
  });
2650
2659
  _push(`<!--]-->`);
2651
- if (!unref(ticker).length) _push(`<div class="rail-empty" data-v-771c2c29><svg class="re-ico" viewBox="0 0 24 24" data-v-771c2c29><path d="M3 12h3l2.5-6 4 12L15 12h6" data-v-771c2c29></path></svg><span data-v-771c2c29>${ssrInterpolate(_ctx.$t("townView.k2uk6ua121"))}</span></div>`);
2660
+ if (!unref(ticker).length) _push(`<div class="rail-empty" data-v-ee250387><svg class="re-ico" viewBox="0 0 24 24" data-v-ee250387><path d="M3 12h3l2.5-6 4 12L15 12h6" data-v-ee250387></path></svg><span data-v-ee250387>${ssrInterpolate(_ctx.$t("townView.k2uk6ua121"))}</span></div>`);
2652
2661
  else _push(`<!---->`);
2653
- _push(`</div></section><section class="panel" data-v-771c2c29><div class="panel-hd" data-v-771c2c29><h3 data-v-771c2c29>${ssrInterpolate(_ctx.$t("townView.kjug2jq122"))}</h3></div><div class="mm-body" data-v-771c2c29><div class="mm-wrap"${ssrRenderAttr("title", _ctx.$t("townView.klfwiqg023"))} data-v-771c2c29><canvas class="nav-cv" data-v-771c2c29></canvas></div><div class="mm-col" data-v-771c2c29><button class="vp-tool"${ssrRenderAttr("title", _ctx.$t("townView.k1lap9bs024"))} data-v-771c2c29><svg class="vp-svg" viewBox="0 0 24 24" data-v-771c2c29><path d="M3 12a9 9 0 1 0 3-6.7M3 4v5h5" data-v-771c2c29></path></svg></button><button class="vp-tool"${ssrRenderAttr("title", _ctx.$t("townView.kav8a8k025"))} data-v-771c2c29><svg class="vp-svg" viewBox="0 0 24 24" data-v-771c2c29><circle cx="11" cy="11" r="6.5" data-v-771c2c29></circle><path d="m16 16 4.5 4.5M8.5 11h5" data-v-771c2c29></path></svg></button><button class="vp-tool"${ssrRenderAttr("title", _ctx.$t("townView.k1u7uce9026"))} data-v-771c2c29><svg class="vp-svg" viewBox="0 0 24 24" data-v-771c2c29><circle cx="11" cy="11" r="6.5" data-v-771c2c29></circle><path d="m16 16 4.5 4.5M8.5 11h5M11 8.5v5" data-v-771c2c29></path></svg></button></div></div><div class="mm-meta mono" data-v-771c2c29>${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-771c2c29><span data-v-771c2c29><span class="${ssrRenderClass([{ red: unref(conn).state !== "open" }, "sb-dot"])}" data-v-771c2c29></span>${ssrInterpolate(_ctx.$t("townView.k1i4g246123"))} <b data-v-771c2c29>${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-771c2c29>${ssrInterpolate(_ctx.$t("townView.k4a0jt124"))} <b data-v-771c2c29>${ssrInterpolate(unref(blockCount))}</b><i data-v-771c2c29>·</i>${ssrInterpolate(_ctx.$t("townView.k3xdvm125"))} <b data-v-771c2c29>${ssrInterpolate(unref(agentCount))}</b><i data-v-771c2c29>·</i>${ssrInterpolate(_ctx.$t("townView.k47e16126"))} <b data-v-771c2c29>${ssrInterpolate(unref(deviceCount))}</b></span><span class="sb-lat mono" data-v-771c2c29>${ssrInterpolate(unref(fps))} FPS </span><span class="copy" data-v-771c2c29> © 2026 ABO · DIGITAL TWIN · ${ssrInterpolate(_ctx.$t("townView.k1h5gxpf137"))}</span></footer>`);
2654
- if (!unref(ready)) _push(`<div data-hud="town-loading" class="loading-mask" data-v-771c2c29><div class="loading-spinner" data-v-771c2c29></div><span class="loading-text" data-v-771c2c29>${ssrInterpolate(_ctx.$t("townView.kvjdqfg059"))}</span></div>`);
2662
+ _push(`</div></section><section class="panel" data-v-ee250387><div class="panel-hd" data-v-ee250387><h3 data-v-ee250387>${ssrInterpolate(_ctx.$t("townView.kjug2jq122"))}</h3></div><div class="mm-body" data-v-ee250387><div class="mm-wrap"${ssrRenderAttr("title", _ctx.$t("townView.klfwiqg023"))} data-v-ee250387><canvas class="nav-cv" data-v-ee250387></canvas></div><div class="mm-col" data-v-ee250387><button class="vp-tool"${ssrRenderAttr("title", _ctx.$t("townView.k1lap9bs024"))} data-v-ee250387><svg class="vp-svg" viewBox="0 0 24 24" data-v-ee250387><path d="M3 12a9 9 0 1 0 3-6.7M3 4v5h5" data-v-ee250387></path></svg></button><button class="vp-tool"${ssrRenderAttr("title", _ctx.$t("townView.kav8a8k025"))} data-v-ee250387><svg class="vp-svg" viewBox="0 0 24 24" data-v-ee250387><circle cx="11" cy="11" r="6.5" data-v-ee250387></circle><path d="m16 16 4.5 4.5M8.5 11h5" data-v-ee250387></path></svg></button><button class="vp-tool"${ssrRenderAttr("title", _ctx.$t("townView.k1u7uce9026"))} data-v-ee250387><svg class="vp-svg" viewBox="0 0 24 24" data-v-ee250387><circle cx="11" cy="11" r="6.5" data-v-ee250387></circle><path d="m16 16 4.5 4.5M8.5 11h5M11 8.5v5" data-v-ee250387></path></svg></button></div></div><div class="mm-meta mono" data-v-ee250387>${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-ee250387><span data-v-ee250387><span class="${ssrRenderClass([{ red: unref(conn).state !== "open" }, "sb-dot"])}" data-v-ee250387></span>${ssrInterpolate(_ctx.$t("townView.k1i4g246123"))} <b data-v-ee250387>${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-ee250387>${ssrInterpolate(_ctx.$t("townView.k4a0jt124"))} <b data-v-ee250387>${ssrInterpolate(unref(blockCount))}</b><i data-v-ee250387>·</i>${ssrInterpolate(_ctx.$t("townView.k3xdvm125"))} <b data-v-ee250387>${ssrInterpolate(unref(agentCount))}</b><i data-v-ee250387>·</i>${ssrInterpolate(_ctx.$t("townView.k47e16126"))} <b data-v-ee250387>${ssrInterpolate(unref(deviceCount))}</b></span><span class="sb-lat mono" data-v-ee250387>${ssrInterpolate(unref(fps))} FPS </span><span class="copy" data-v-ee250387> © 2026 ABO · DIGITAL TWIN · ${ssrInterpolate(_ctx.$t("townView.k1h5gxpf137"))}</span></footer>`);
2663
+ if (!unref(ready)) _push(`<div data-hud="town-loading" class="loading-mask" data-v-ee250387><div class="loading-spinner" data-v-ee250387></div><span class="loading-text" data-v-ee250387>${ssrInterpolate(_ctx.$t("townView.kvjdqfg059"))}</span></div>`);
2655
2664
  else _push(`<!---->`);
2656
2665
  _push(`</div>`);
2657
2666
  };
@@ -2665,7 +2674,7 @@ TownView_vue_vue_type_script_setup_true_lang_default.setup = (props, ctx) => {
2665
2674
  (ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("components/workshop/town/TownView.vue");
2666
2675
  return _sfc_setup ? _sfc_setup(props, ctx) : void 0;
2667
2676
  };
2668
- var TownView_default = /*#__PURE__*/ Object.assign(_plugin_vue_export_helper_default(TownView_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-771c2c29"]]), { __name: "WorkshopTownView" });
2677
+ var TownView_default = /*#__PURE__*/ Object.assign(_plugin_vue_export_helper_default(TownView_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-ee250387"]]), { __name: "WorkshopTownView" });
2669
2678
 
2670
2679
  export { TownView_default as T, useStorage as u };
2671
- //# sourceMappingURL=TownView-D9yCQe1T.mjs.map
2680
+ //# sourceMappingURL=TownView-BkHxMiwZ.mjs.map