agentworkshop 0.5.1 → 0.5.3

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 (1429) hide show
  1. package/.output/.AgentWorkShop/prompts/host-tools.json +631 -0
  2. package/.output/.AgentWorkShop/prompts/lead-supervise.md +42 -0
  3. package/.output/.AgentWorkShop/prompts/mode-goal.md +26 -0
  4. package/.output/.AgentWorkShop/prompts/mode-loop.md +10 -0
  5. package/.output/.AgentWorkShop/prompts/mode-pipeline.md +16 -0
  6. package/.output/.AgentWorkShop/prompts/peer-lead-roster.md +3 -0
  7. package/.output/.AgentWorkShop/prompts/peer-message.md +14 -0
  8. package/.output/.AgentWorkShop/prompts/peer-reply-optional.md +2 -0
  9. package/.output/.AgentWorkShop/prompts/peer-reply-required.md +8 -0
  10. package/.output/.AgentWorkShop/prompts/scenario-default.md +11 -0
  11. package/.output/.AgentWorkShop/prompts/system-manual.md +18 -0
  12. package/.output/.AgentWorkShop/prompts/team-roster.md +9 -0
  13. package/.output/.AgentWorkShop/prompts/worker-workflow.md +19 -0
  14. package/.output/nitro.json +15 -0
  15. package/.output/public/_nuxt/2LwEn9gX.js +2 -0
  16. package/.output/public/_nuxt/36oeS8_R2.js +1 -0
  17. package/.output/public/_nuxt/7ZABjMRh2.js +1 -0
  18. package/.output/public/_nuxt/9X0fVBD7.js +57 -0
  19. package/.output/public/_nuxt/B-PgoIPN.js +1 -0
  20. package/.output/public/_nuxt/B0haAGoq.js +1 -0
  21. package/.output/public/_nuxt/B3__nfxM.js +1 -0
  22. package/.output/public/_nuxt/B4GHHF6d2.js +13 -0
  23. package/.output/public/_nuxt/B6M2WJWm2.js +1 -0
  24. package/.output/public/_nuxt/B7V9IfTL.js +1 -0
  25. package/.output/public/_nuxt/B9aPoQvt.js +17 -0
  26. package/.output/public/_nuxt/BBrRELH32.js +2 -0
  27. package/.output/public/_nuxt/BCipft_k2.js +1 -0
  28. package/.output/public/_nuxt/BDUjyaF4.js +42 -0
  29. package/.output/public/_nuxt/BE5QyG5J2.js +1 -0
  30. package/.output/public/_nuxt/BF9XPEuw.js +1 -0
  31. package/.output/public/_nuxt/BFYNhG9S.js +13 -0
  32. package/.output/public/_nuxt/BFjGV-RV2.js +4108 -0
  33. package/.output/public/_nuxt/BGkumHZ32.js +102 -0
  34. package/.output/public/_nuxt/BJvGPTpC.js +1 -0
  35. package/.output/public/_nuxt/BSCpFtzG.js +3 -0
  36. package/.output/public/_nuxt/BSSUlJnx2.js +1 -0
  37. package/.output/public/_nuxt/BUNGEK2z.js +18 -0
  38. package/.output/public/_nuxt/BUcmySDa2.js +209 -0
  39. package/.output/public/_nuxt/BUxYN2mw.js +1 -0
  40. package/.output/public/_nuxt/BbQornXa.js +1 -0
  41. package/.output/public/_nuxt/Bc_mM2cU.js +1 -0
  42. package/.output/public/_nuxt/BdKzfJiM.js +2 -0
  43. package/.output/public/_nuxt/BeIfu4N3.js +3 -0
  44. package/.output/public/_nuxt/BfGc7TJp.js +1 -0
  45. package/.output/public/_nuxt/Bi6AiCuP.js +1 -0
  46. package/.output/public/_nuxt/Bok1DRqh.js +19 -0
  47. package/.output/public/_nuxt/Bq_KKxCg.js +1 -0
  48. package/.output/public/_nuxt/BrIJiJSN.js +18 -0
  49. package/.output/public/_nuxt/Bsc69G4x.js +24 -0
  50. package/.output/public/_nuxt/Bxh5nf8j.js +1 -0
  51. package/.output/public/_nuxt/ByGNWgAr.js +23 -0
  52. package/.output/public/_nuxt/C9f8QMp12.js +1 -0
  53. package/.output/public/_nuxt/CE2ynNi9.js +1 -0
  54. package/.output/public/_nuxt/CNs_Ozdc2.js +1 -0
  55. package/.output/public/_nuxt/CWDzKGtj.js +1 -0
  56. package/.output/public/_nuxt/CWKEp1wx2.js +2 -0
  57. package/.output/public/_nuxt/CXLI50Sq.js +1 -0
  58. package/.output/public/_nuxt/C_gFA2H_2.js +1 -0
  59. package/.output/public/_nuxt/Ce1zyNYu.js +1 -0
  60. package/.output/public/_nuxt/CfIXY-ET.js +75 -0
  61. package/.output/public/_nuxt/ChEKFMxj.js +1 -0
  62. package/.output/public/_nuxt/ClptO7LA.js +1 -0
  63. package/.output/public/_nuxt/Cno6kYiO2.js +1 -0
  64. package/.output/public/_nuxt/CrFGZYVB2.js +7 -0
  65. package/.output/public/_nuxt/D-Ne4C9a.js +1 -0
  66. package/.output/public/_nuxt/D0C5Q0di.js +1 -0
  67. package/.output/public/_nuxt/D5KJ7_0V.js +1 -0
  68. package/.output/public/_nuxt/D8DDDzV62.js +1 -0
  69. package/.output/public/_nuxt/D95h62Jn.js +1 -0
  70. package/.output/public/_nuxt/DEHNjlTq2.js +1 -0
  71. package/.output/public/_nuxt/DEkQ0qQ02.js +1 -0
  72. package/.output/public/_nuxt/DIOBYJe3.js +1 -0
  73. package/.output/public/_nuxt/DNJSkm3Q.js +1 -0
  74. package/.output/public/_nuxt/DP6bdyIp.js +1 -0
  75. package/.output/public/_nuxt/DPDqAD1e.js +2 -0
  76. package/.output/public/_nuxt/DRlJ2-4p.js +1 -0
  77. package/.output/public/_nuxt/DRq09ZmT.js +1 -0
  78. package/.output/public/_nuxt/DSBfvCi5.js +19 -0
  79. package/.output/public/_nuxt/DVNYfGsj.js +1 -0
  80. package/.output/public/_nuxt/DVQAz9WI.js +3 -0
  81. package/.output/public/_nuxt/DXK1U43I.js +1 -0
  82. package/.output/public/_nuxt/DYWgGHNo.js +7 -0
  83. package/.output/public/_nuxt/DdPeifHR.js +3 -0
  84. package/.output/public/_nuxt/Dm5mD6XT.js +1 -0
  85. package/.output/public/_nuxt/HWXLx5Hz.js +9 -0
  86. package/.output/public/_nuxt/HclGiUj8.js +1 -0
  87. package/.output/public/_nuxt/NIM0Wglj2.js +1 -0
  88. package/.output/public/_nuxt/OmpTerminalPanel.Bc9GjNU5.css +1 -0
  89. package/.output/public/_nuxt/OwJ1LJkF.js +31 -0
  90. package/.output/public/_nuxt/PQLnLxYe.js +1 -0
  91. package/.output/public/_nuxt/RYFtK4qZ2.js +1 -0
  92. package/.output/public/_nuxt/R_WxTozV2.js +1 -0
  93. package/.output/public/_nuxt/TownView.CI2Wpzty.css +1 -0
  94. package/.output/public/_nuxt/W1E3-5ML.js +14 -0
  95. package/.output/public/_nuxt/Z8k0uMSI.js +5 -0
  96. package/.output/public/_nuxt/_id_.CbiF5PrV.css +1 -0
  97. package/.output/public/_nuxt/_id_.Ci4u30cR.css +1 -0
  98. package/.output/public/_nuxt/_wsId_.DET_GinP.css +1 -0
  99. package/.output/public/_nuxt/agents.BJwgTLFZ.css +1 -0
  100. package/.output/public/_nuxt/builds/latest.json +1 -0
  101. package/.output/public/_nuxt/builds/meta/fb769eda-b1db-437b-adc7-ecf71eb3b30b.json +1 -0
  102. package/.output/public/_nuxt/channel-templates.lkqEYlWY.css +1 -0
  103. package/.output/public/_nuxt/dObsRdSQ.js +1 -0
  104. package/.output/public/_nuxt/dRAyjbJ6.js +14 -0
  105. package/.output/public/_nuxt/daq.m1dxZaD-.css +1 -0
  106. package/.output/public/_nuxt/dcw.C46dGiF_.css +1 -0
  107. package/.output/public/_nuxt/default.iGJy9dP-.css +1 -0
  108. package/.output/public/_nuxt/dt2tKE95.js +4 -0
  109. package/.output/public/_nuxt/eHGLpQSg2.js +1 -0
  110. package/.output/public/_nuxt/eb-garamond-cyrillic-400-italic.BGIwiowF.woff2 +0 -0
  111. package/.output/public/_nuxt/eb-garamond-cyrillic-400-italic.BZInx2ys.woff +0 -0
  112. package/.output/public/_nuxt/eb-garamond-cyrillic-400-normal.C0kVTdou.woff +0 -0
  113. package/.output/public/_nuxt/eb-garamond-cyrillic-400-normal.DDLP67lu.woff2 +0 -0
  114. package/.output/public/_nuxt/eb-garamond-cyrillic-ext-400-italic.Bz1w3xqM.woff2 +0 -0
  115. package/.output/public/_nuxt/eb-garamond-cyrillic-ext-400-italic.CYS3phfl.woff +0 -0
  116. package/.output/public/_nuxt/eb-garamond-cyrillic-ext-400-normal.DG8lny6_.woff +0 -0
  117. package/.output/public/_nuxt/eb-garamond-cyrillic-ext-400-normal.o8fRvAFQ.woff2 +0 -0
  118. package/.output/public/_nuxt/eb-garamond-greek-400-italic.BamGE6QP.woff +0 -0
  119. package/.output/public/_nuxt/eb-garamond-greek-400-italic.Dqr5KC66.woff2 +0 -0
  120. package/.output/public/_nuxt/eb-garamond-greek-400-normal.CVAbzS9p.woff2 +0 -0
  121. package/.output/public/_nuxt/eb-garamond-greek-400-normal.d4JlP2QH.woff +0 -0
  122. package/.output/public/_nuxt/eb-garamond-greek-ext-400-italic.BL1XYHtS.woff +0 -0
  123. package/.output/public/_nuxt/eb-garamond-greek-ext-400-italic.CHZOQEtG.woff2 +0 -0
  124. package/.output/public/_nuxt/eb-garamond-greek-ext-400-normal.BaZl8BIK.woff +0 -0
  125. package/.output/public/_nuxt/eb-garamond-greek-ext-400-normal.K8pwR3tn.woff2 +0 -0
  126. package/.output/public/_nuxt/eb-garamond-latin-400-italic.CDFyLPXJ.woff +0 -0
  127. package/.output/public/_nuxt/eb-garamond-latin-400-italic.DSEbMgZu.woff2 +0 -0
  128. package/.output/public/_nuxt/eb-garamond-latin-400-normal.BCNrxLz_.woff2 +0 -0
  129. package/.output/public/_nuxt/eb-garamond-latin-400-normal.maQnHeKB.woff +0 -0
  130. package/.output/public/_nuxt/eb-garamond-latin-ext-400-italic.DUSsnRSD.woff +0 -0
  131. package/.output/public/_nuxt/eb-garamond-latin-ext-400-italic.V7s3nWfX.woff2 +0 -0
  132. package/.output/public/_nuxt/eb-garamond-latin-ext-400-normal.B4EmgUmt.woff +0 -0
  133. package/.output/public/_nuxt/eb-garamond-latin-ext-400-normal.o4A__6QZ.woff2 +0 -0
  134. package/.output/public/_nuxt/eb-garamond-vietnamese-400-italic.DQ8HKnks.woff2 +0 -0
  135. package/.output/public/_nuxt/eb-garamond-vietnamese-400-italic.ORtyMVfw.woff +0 -0
  136. package/.output/public/_nuxt/eb-garamond-vietnamese-400-normal.CLvJdMEL.woff2 +0 -0
  137. package/.output/public/_nuxt/eb-garamond-vietnamese-400-normal.ifvNSiWx.woff +0 -0
  138. package/.output/public/_nuxt/entry.DjhxLu-f.css +1 -0
  139. package/.output/public/_nuxt/geist-cyrillic-ext-wght-normal.DjL33-gN.woff2 +0 -0
  140. package/.output/public/_nuxt/geist-cyrillic-wght-normal.BEAKL7Jp.woff2 +0 -0
  141. package/.output/public/_nuxt/geist-latin-ext-wght-normal.DC-KSUi6.woff2 +0 -0
  142. package/.output/public/_nuxt/geist-latin-wght-normal.BgDaEnEv.woff2 +0 -0
  143. package/.output/public/_nuxt/geist-mono-cyrillic-ext-wght-normal.X_5orZeX.woff2 +0 -0
  144. package/.output/public/_nuxt/geist-mono-cyrillic-wght-normal.DiZS0aHC.woff2 +0 -0
  145. package/.output/public/_nuxt/geist-mono-latin-ext-wght-normal.Bwz-egvJ.woff2 +0 -0
  146. package/.output/public/_nuxt/geist-mono-latin-wght-normal.XN7g48iV.woff2 +0 -0
  147. package/.output/public/_nuxt/geist-mono-symbols2-wght-normal.CO5SzqOn.woff2 +0 -0
  148. package/.output/public/_nuxt/geist-mono-vietnamese-wght-normal.DadHysG0.woff2 +0 -0
  149. package/.output/public/_nuxt/geist-vietnamese-wght-normal.6IgcOCM7.woff2 +0 -0
  150. package/.output/public/_nuxt/ibm-plex-mono-cyrillic-400-normal.BSMlKf0J.woff2 +0 -0
  151. package/.output/public/_nuxt/ibm-plex-mono-cyrillic-400-normal.CEL4l2ZJ.woff +0 -0
  152. package/.output/public/_nuxt/ibm-plex-mono-cyrillic-500-normal.Ael50iVv.woff +0 -0
  153. package/.output/public/_nuxt/ibm-plex-mono-cyrillic-500-normal.Bq9vWWag.woff2 +0 -0
  154. package/.output/public/_nuxt/ibm-plex-mono-cyrillic-600-normal.CTOM6hUh.woff2 +0 -0
  155. package/.output/public/_nuxt/ibm-plex-mono-cyrillic-600-normal.fLZuRloM.woff +0 -0
  156. package/.output/public/_nuxt/ibm-plex-mono-cyrillic-ext-400-normal.DMdlQ8Kv.woff +0 -0
  157. package/.output/public/_nuxt/ibm-plex-mono-cyrillic-ext-400-normal.xuaO2J-f.woff2 +0 -0
  158. package/.output/public/_nuxt/ibm-plex-mono-cyrillic-ext-500-normal.BIfNGwUT.woff +0 -0
  159. package/.output/public/_nuxt/ibm-plex-mono-cyrillic-ext-500-normal.BqneJy0T.woff2 +0 -0
  160. package/.output/public/_nuxt/ibm-plex-mono-cyrillic-ext-600-normal.9HEixskS.woff +0 -0
  161. package/.output/public/_nuxt/ibm-plex-mono-cyrillic-ext-600-normal.V-xxqcpd.woff2 +0 -0
  162. package/.output/public/_nuxt/ibm-plex-mono-latin-400-normal.CvHOgSBP.woff +0 -0
  163. package/.output/public/_nuxt/ibm-plex-mono-latin-400-normal.DMJ8VG8y.woff2 +0 -0
  164. package/.output/public/_nuxt/ibm-plex-mono-latin-500-normal.CB9ihrfo.woff +0 -0
  165. package/.output/public/_nuxt/ibm-plex-mono-latin-500-normal.DSY6xOcd.woff2 +0 -0
  166. package/.output/public/_nuxt/ibm-plex-mono-latin-600-normal.BgSNZQsw.woff2 +0 -0
  167. package/.output/public/_nuxt/ibm-plex-mono-latin-600-normal.DWFSQ4vo.woff +0 -0
  168. package/.output/public/_nuxt/ibm-plex-mono-latin-ext-400-normal.BmRBH3aV.woff2 +0 -0
  169. package/.output/public/_nuxt/ibm-plex-mono-latin-ext-400-normal.D3D2R8hC.woff +0 -0
  170. package/.output/public/_nuxt/ibm-plex-mono-latin-ext-500-normal.CAhNIIs5.woff2 +0 -0
  171. package/.output/public/_nuxt/ibm-plex-mono-latin-ext-500-normal.CZ70TYgx.woff +0 -0
  172. package/.output/public/_nuxt/ibm-plex-mono-latin-ext-600-normal.D38SheWl.woff2 +0 -0
  173. package/.output/public/_nuxt/ibm-plex-mono-latin-ext-600-normal.DmB0ttJJ.woff +0 -0
  174. package/.output/public/_nuxt/ibm-plex-mono-vietnamese-400-normal.BulugwFq.woff2 +0 -0
  175. package/.output/public/_nuxt/ibm-plex-mono-vietnamese-400-normal.DDuiU_S-.woff +0 -0
  176. package/.output/public/_nuxt/ibm-plex-mono-vietnamese-500-normal.C8zxqsMH.woff +0 -0
  177. package/.output/public/_nuxt/ibm-plex-mono-vietnamese-500-normal.DZ4AoWbu.woff2 +0 -0
  178. package/.output/public/_nuxt/ibm-plex-mono-vietnamese-600-normal.D2EvbN8M.woff2 +0 -0
  179. package/.output/public/_nuxt/ibm-plex-mono-vietnamese-600-normal.iLQfcSjf.woff +0 -0
  180. package/.output/public/_nuxt/kZl6yT-12.js +1 -0
  181. package/.output/public/_nuxt/lO5tpDZ5.js +1 -0
  182. package/.output/public/_nuxt/logs.DaIsHWZE.css +1 -0
  183. package/.output/public/_nuxt/monitor.41fCD6TB.css +1 -0
  184. package/.output/public/_nuxt/pRQri7vQ2.js +4 -0
  185. package/.output/public/_nuxt/pages.CytEOfUs.css +1 -0
  186. package/.output/public/_nuxt/plugins.FTm0PcEe.css +1 -0
  187. package/.output/public/_nuxt/rzGB_ojX.js +32 -0
  188. package/.output/public/_nuxt/settings.BANibAnV.css +1 -0
  189. package/.output/public/_nuxt/teams.B8JNbUZg.css +1 -0
  190. package/.output/public/_nuxt/tokens.CWOTXM-Z.css +1 -0
  191. package/.output/public/_nuxt/town.BLrD9-WH.css +1 -0
  192. package/.output/public/_nuxt/town.C_DsNW0J.css +1 -0
  193. package/.output/public/_nuxt/uBbDCfTz.js +1 -0
  194. package/.output/public/_nuxt/ubPfs9mQ.js +1 -0
  195. package/.output/public/_nuxt/users.D8lcLE62.css +1 -0
  196. package/.output/public/_nuxt/workshop.B98sHiJq.css +1 -0
  197. package/.output/public/assets/game/character/bot.png +0 -0
  198. package/.output/public/assets/game/character/device-3d.glb +0 -0
  199. package/.output/public/assets/game/character/hero-3d.glb +0 -0
  200. package/.output/public/assets/game/character/hero-anime-1.glb +0 -0
  201. package/.output/public/assets/game/character/hero-anime-2.glb +0 -0
  202. package/.output/public/assets/game/character/hero-anime-3.glb +0 -0
  203. package/.output/public/assets/game/character/hero-anime-4.glb +0 -0
  204. package/.output/public/assets/game/character/knight.png +0 -0
  205. package/.output/public/assets/game/character/mage.png +0 -0
  206. package/.output/public/assets/game/coin.png +0 -0
  207. package/.output/public/assets/game/devices/agv.glb +0 -0
  208. package/.output/public/assets/game/devices/caster.glb +0 -0
  209. package/.output/public/assets/game/devices/device-console.glb +0 -0
  210. package/.output/public/assets/game/devices/device-robot-arm.glb +0 -0
  211. package/.output/public/assets/game/devices/device-scanner.glb +0 -0
  212. package/.output/public/assets/game/devices/extruder.glb +0 -0
  213. package/.output/public/assets/game/devices/mdo.glb +0 -0
  214. package/.output/public/assets/game/devices/power-cabinet.glb +0 -0
  215. package/.output/public/assets/game/devices/pump.glb +0 -0
  216. package/.output/public/assets/game/devices/tdo.glb +0 -0
  217. package/.output/public/assets/game/devices/thickness-scanner.glb +0 -0
  218. package/.output/public/assets/game/devices/winder.glb +0 -0
  219. package/.output/public/assets/game/npc/boltnu-sheet.png +0 -0
  220. package/.output/public/assets/game/npc/fluttaflap-sheet.png +0 -0
  221. package/.output/public/assets/game/npc/rockitten-sheet.png +0 -0
  222. package/.output/public/assets/game/npc/tux-sheet.png +0 -0
  223. package/.output/public/assets/game/player/misa-back-walk.000.png +0 -0
  224. package/.output/public/assets/game/player/misa-back-walk.001.png +0 -0
  225. package/.output/public/assets/game/player/misa-back-walk.002.png +0 -0
  226. package/.output/public/assets/game/player/misa-back-walk.003.png +0 -0
  227. package/.output/public/assets/game/player/misa-back.png +0 -0
  228. package/.output/public/assets/game/player/misa-front-walk.000.png +0 -0
  229. package/.output/public/assets/game/player/misa-front-walk.001.png +0 -0
  230. package/.output/public/assets/game/player/misa-front-walk.002.png +0 -0
  231. package/.output/public/assets/game/player/misa-front-walk.003.png +0 -0
  232. package/.output/public/assets/game/player/misa-front.png +0 -0
  233. package/.output/public/assets/game/player/misa-left-walk.000.png +0 -0
  234. package/.output/public/assets/game/player/misa-left-walk.001.png +0 -0
  235. package/.output/public/assets/game/player/misa-left-walk.002.png +0 -0
  236. package/.output/public/assets/game/player/misa-left-walk.003.png +0 -0
  237. package/.output/public/assets/game/player/misa-left.png +0 -0
  238. package/.output/public/assets/game/player/misa-right-walk.000.png +0 -0
  239. package/.output/public/assets/game/player/misa-right-walk.001.png +0 -0
  240. package/.output/public/assets/game/player/misa-right-walk.002.png +0 -0
  241. package/.output/public/assets/game/player/misa-right-walk.003.png +0 -0
  242. package/.output/public/assets/game/player/misa-right.png +0 -0
  243. package/.output/public/assets/game/player-sheet.png +0 -0
  244. package/.output/public/assets/game/tuxemon-town.json +1 -0
  245. package/.output/public/assets/game/tuxmon-sample-32px-extruded.png +0 -0
  246. package/.output/public/assets/game/wuwa/scene-map.png +0 -0
  247. package/.output/public/assets/game/wuwa/world-far.png +0 -0
  248. package/.output/public/assets/game/wuwa/world-middle.png +0 -0
  249. package/.output/public/assets/game/wuwa/world-near.png +0 -0
  250. package/.output/public/assets/game/wuwa/wu-aura.png +0 -0
  251. package/.output/public/assets/game/wuwa/wu-lead.png +0 -0
  252. package/.output/public/assets/game/wuwa/wu-ring.png +0 -0
  253. package/.output/public/assets/game/wuwa/wu-slash.png +0 -0
  254. package/.output/public/assets/game/wuwa/wu-worker-0.png +0 -0
  255. package/.output/public/assets/game/wuwa/wu-worker-1.png +0 -0
  256. package/.output/public/assets/game/wuwa/wu-worker-2.png +0 -0
  257. package/.output/public/favicon.svg +14 -0
  258. package/.output/public/scene/background/cyber-town-background.svg +110 -0
  259. package/.output/server/chunks/_/LeftOutlined.mjs +23 -0
  260. package/.output/server/chunks/_/LeftOutlined.mjs.map +1 -0
  261. package/.output/server/chunks/_/SearchOutlined.mjs +5141 -0
  262. package/.output/server/chunks/_/SearchOutlined.mjs.map +1 -0
  263. package/.output/server/chunks/_/character-asset.repo.mjs +86 -0
  264. package/.output/server/chunks/_/character-asset.repo.mjs.map +1 -0
  265. package/.output/server/chunks/_/error-500.mjs +20 -0
  266. package/.output/server/chunks/_/error-500.mjs.map +1 -0
  267. package/.output/server/chunks/_/host-bindings.mjs +53 -0
  268. package/.output/server/chunks/_/host-bindings.mjs.map +1 -0
  269. package/.output/server/chunks/_/nitro.mjs +26962 -0
  270. package/.output/server/chunks/_/nitro.mjs.map +1 -0
  271. package/.output/server/chunks/_/scene-layout.repo.mjs +72 -0
  272. package/.output/server/chunks/_/scene-layout.repo.mjs.map +1 -0
  273. package/.output/server/chunks/_/user.schema.mjs +36 -0
  274. package/.output/server/chunks/_/user.schema.mjs.map +1 -0
  275. package/.output/server/chunks/build/Col-D7fjGDF6.mjs +338 -0
  276. package/.output/server/chunks/build/Col-D7fjGDF6.mjs.map +1 -0
  277. package/.output/server/chunks/build/OmpTerminalPanel-CZnxR3M_.mjs +915 -0
  278. package/.output/server/chunks/build/OmpTerminalPanel-CZnxR3M_.mjs.map +1 -0
  279. package/.output/server/chunks/build/TownView-DYlUNRZe.mjs +2671 -0
  280. package/.output/server/chunks/build/TownView-DYlUNRZe.mjs.map +1 -0
  281. package/.output/server/chunks/build/_id_-BOhG2yz8.mjs +659 -0
  282. package/.output/server/chunks/build/_id_-BOhG2yz8.mjs.map +1 -0
  283. package/.output/server/chunks/build/_id_-CuyMYmhY.mjs +312 -0
  284. package/.output/server/chunks/build/_id_-CuyMYmhY.mjs.map +1 -0
  285. package/.output/server/chunks/build/_wsId_-B5f5BdW2.mjs +9324 -0
  286. package/.output/server/chunks/build/_wsId_-B5f5BdW2.mjs.map +1 -0
  287. package/.output/server/chunks/build/agents-BVaxN75W.mjs +934 -0
  288. package/.output/server/chunks/build/agents-BVaxN75W.mjs.map +1 -0
  289. package/.output/server/chunks/build/alert-gH-s7yIh.mjs +264 -0
  290. package/.output/server/chunks/build/alert-gH-s7yIh.mjs.map +1 -0
  291. package/.output/server/chunks/build/button-BhbX5ACI.mjs +1938 -0
  292. package/.output/server/chunks/build/button-BhbX5ACI.mjs.map +1 -0
  293. package/.output/server/chunks/build/card-l4BbX67w.mjs +955 -0
  294. package/.output/server/chunks/build/card-l4BbX67w.mjs.map +1 -0
  295. package/.output/server/chunks/build/channel-templates-D1K2IKrE.mjs +832 -0
  296. package/.output/server/chunks/build/channel-templates-D1K2IKrE.mjs.map +1 -0
  297. package/.output/server/chunks/build/checkbox-BF11p3dH.mjs +439 -0
  298. package/.output/server/chunks/build/checkbox-BF11p3dH.mjs.map +1 -0
  299. package/.output/server/chunks/build/client-only-CFTHwakk.mjs +43 -0
  300. package/.output/server/chunks/build/client-only-CFTHwakk.mjs.map +1 -0
  301. package/.output/server/chunks/build/connection-Dc0fn6yd.mjs +120 -0
  302. package/.output/server/chunks/build/connection-Dc0fn6yd.mjs.map +1 -0
  303. package/.output/server/chunks/build/daq-ObtN1TQ4.mjs +1066 -0
  304. package/.output/server/chunks/build/daq-ObtN1TQ4.mjs.map +1 -0
  305. package/.output/server/chunks/build/dcw-fINr-He1.mjs +243 -0
  306. package/.output/server/chunks/build/dcw-fINr-He1.mjs.map +1 -0
  307. package/.output/server/chunks/build/default-CVVO40Jj.mjs +1209 -0
  308. package/.output/server/chunks/build/default-CVVO40Jj.mjs.map +1 -0
  309. package/.output/server/chunks/build/drawer-CVValqoh.mjs +836 -0
  310. package/.output/server/chunks/build/drawer-CVValqoh.mjs.map +1 -0
  311. package/.output/server/chunks/build/dropdown-ByCsEWlQ.mjs +14 -0
  312. package/.output/server/chunks/build/dropdown-ByCsEWlQ.mjs.map +1 -0
  313. package/.output/server/chunks/build/dropdown-Dex8PXu6.mjs +558 -0
  314. package/.output/server/chunks/build/dropdown-Dex8PXu6.mjs.map +1 -0
  315. package/.output/server/chunks/build/initDefaultProps-DIbWwP4R.mjs +21 -0
  316. package/.output/server/chunks/build/initDefaultProps-DIbWwP4R.mjs.map +1 -0
  317. package/.output/server/chunks/build/input--KMeLYqZ.mjs +2617 -0
  318. package/.output/server/chunks/build/input--KMeLYqZ.mjs.map +1 -0
  319. package/.output/server/chunks/build/input-number-BBlRoAJ7.mjs +1521 -0
  320. package/.output/server/chunks/build/input-number-BBlRoAJ7.mjs.map +1 -0
  321. package/.output/server/chunks/build/interval-Bt11uRPw.mjs +9 -0
  322. package/.output/server/chunks/build/interval-Bt11uRPw.mjs.map +1 -0
  323. package/.output/server/chunks/build/isNumeric-CP7q_yhz.mjs +7 -0
  324. package/.output/server/chunks/build/isNumeric-CP7q_yhz.mjs.map +1 -0
  325. package/.output/server/chunks/build/logs-DqNgCJAn.mjs +188 -0
  326. package/.output/server/chunks/build/logs-DqNgCJAn.mjs.map +1 -0
  327. package/.output/server/chunks/build/menu-xN-SXb9Q.mjs +1950 -0
  328. package/.output/server/chunks/build/menu-xN-SXb9Q.mjs.map +1 -0
  329. package/.output/server/chunks/build/modal-DrCOcjrl.mjs +1272 -0
  330. package/.output/server/chunks/build/modal-DrCOcjrl.mjs.map +1 -0
  331. package/.output/server/chunks/build/monitor-CTZLwbdw.mjs +2329 -0
  332. package/.output/server/chunks/build/monitor-CTZLwbdw.mjs.map +1 -0
  333. package/.output/server/chunks/build/pages-DC52d7z7.mjs +470 -0
  334. package/.output/server/chunks/build/pages-DC52d7z7.mjs.map +1 -0
  335. package/.output/server/chunks/build/plugins-DVQty7qG.mjs +231 -0
  336. package/.output/server/chunks/build/plugins-DVQty7qG.mjs.map +1 -0
  337. package/.output/server/chunks/build/popconfirm-C5H1Qoh3.mjs +342 -0
  338. package/.output/server/chunks/build/popconfirm-C5H1Qoh3.mjs.map +1 -0
  339. package/.output/server/chunks/build/responsiveObserve-CS0UB6wQ.mjs +78 -0
  340. package/.output/server/chunks/build/responsiveObserve-CS0UB6wQ.mjs.map +1 -0
  341. package/.output/server/chunks/build/select-D7H2ysgT.mjs +3923 -0
  342. package/.output/server/chunks/build/select-D7H2ysgT.mjs.map +1 -0
  343. package/.output/server/chunks/build/settings-BeergncK.mjs +557 -0
  344. package/.output/server/chunks/build/settings-BeergncK.mjs.map +1 -0
  345. package/.output/server/chunks/build/space-DCwIlnkI.mjs +197 -0
  346. package/.output/server/chunks/build/space-DCwIlnkI.mjs.map +1 -0
  347. package/.output/server/chunks/build/spin-HVY81X_L.mjs +358 -0
  348. package/.output/server/chunks/build/spin-HVY81X_L.mjs.map +1 -0
  349. package/.output/server/chunks/build/switch-VC0m9ede.mjs +377 -0
  350. package/.output/server/chunks/build/switch-VC0m9ede.mjs.map +1 -0
  351. package/.output/server/chunks/build/table-BksLg3Q_.mjs +8883 -0
  352. package/.output/server/chunks/build/table-BksLg3Q_.mjs.map +1 -0
  353. package/.output/server/chunks/build/tabs-CzUfD3iX.mjs +1925 -0
  354. package/.output/server/chunks/build/tabs-CzUfD3iX.mjs.map +1 -0
  355. package/.output/server/chunks/build/tag-oQI3VtqM.mjs +1157 -0
  356. package/.output/server/chunks/build/tag-oQI3VtqM.mjs.map +1 -0
  357. package/.output/server/chunks/build/teams-CFeDlHDh.mjs +910 -0
  358. package/.output/server/chunks/build/teams-CFeDlHDh.mjs.map +1 -0
  359. package/.output/server/chunks/build/tokens-CBAUbOce.mjs +818 -0
  360. package/.output/server/chunks/build/tokens-CBAUbOce.mjs.map +1 -0
  361. package/.output/server/chunks/build/town-BUqRobze.mjs +48 -0
  362. package/.output/server/chunks/build/town-BUqRobze.mjs.map +1 -0
  363. package/.output/server/chunks/build/town-BxH-XXth.mjs +94 -0
  364. package/.output/server/chunks/build/town-BxH-XXth.mjs.map +1 -0
  365. package/.output/server/chunks/build/useDaqStream-CwORhsD7.mjs +310 -0
  366. package/.output/server/chunks/build/useDaqStream-CwORhsD7.mjs.map +1 -0
  367. package/.output/server/chunks/build/useDcwStream-BkWDGaWp.mjs +450 -0
  368. package/.output/server/chunks/build/useDcwStream-BkWDGaWp.mjs.map +1 -0
  369. package/.output/server/chunks/build/useDeviceTwins-NhtXqSkU.mjs +127 -0
  370. package/.output/server/chunks/build/useDeviceTwins-NhtXqSkU.mjs.map +1 -0
  371. package/.output/server/chunks/build/useOpsLog-CU64VDg5.mjs +124 -0
  372. package/.output/server/chunks/build/useOpsLog-CU64VDg5.mjs.map +1 -0
  373. package/.output/server/chunks/build/useSiteConfig-Cc-ABesl.mjs +27 -0
  374. package/.output/server/chunks/build/useSiteConfig-Cc-ABesl.mjs.map +1 -0
  375. package/.output/server/chunks/build/useTownBus-D9SoIsAN.mjs +25 -0
  376. package/.output/server/chunks/build/useTownBus-D9SoIsAN.mjs.map +1 -0
  377. package/.output/server/chunks/build/useWorkshopApi-5er8_EHZ.mjs +4786 -0
  378. package/.output/server/chunks/build/useWorkshopApi-5er8_EHZ.mjs.map +1 -0
  379. package/.output/server/chunks/build/useWorkshopWs-Dwr_1Q8f.mjs +1068 -0
  380. package/.output/server/chunks/build/useWorkshopWs-Dwr_1Q8f.mjs.map +1 -0
  381. package/.output/server/chunks/build/user-CpVY4OAA.mjs +140 -0
  382. package/.output/server/chunks/build/user-CpVY4OAA.mjs.map +1 -0
  383. package/.output/server/chunks/build/users-BMs4s_6K.mjs +558 -0
  384. package/.output/server/chunks/build/users-BMs4s_6K.mjs.map +1 -0
  385. package/.output/server/chunks/build/workshop-CJAyZ5zS.mjs +917 -0
  386. package/.output/server/chunks/build/workshop-CJAyZ5zS.mjs.map +1 -0
  387. package/.output/server/chunks/build/workspaces-Dq-1zvu9.mjs +125 -0
  388. package/.output/server/chunks/build/workspaces-Dq-1zvu9.mjs.map +1 -0
  389. package/.output/server/chunks/routes/api/health.get.mjs +40 -0
  390. package/.output/server/chunks/routes/api/health.get.mjs.map +1 -0
  391. package/.output/server/chunks/routes/api/index.get.mjs +27 -0
  392. package/.output/server/chunks/routes/api/index.get.mjs.map +1 -0
  393. package/.output/server/chunks/routes/api/index.post.mjs +27 -0
  394. package/.output/server/chunks/routes/api/index.post.mjs.map +1 -0
  395. package/.output/server/chunks/routes/api/mcp/workshop.mjs +498 -0
  396. package/.output/server/chunks/routes/api/mcp/workshop.mjs.map +1 -0
  397. package/.output/server/chunks/routes/api/metrics.mjs +66 -0
  398. package/.output/server/chunks/routes/api/metrics.mjs.map +1 -0
  399. package/.output/server/chunks/routes/api/plugins/_name/_...path_.mjs +33 -0
  400. package/.output/server/chunks/routes/api/plugins/_name/_...path_.mjs.map +1 -0
  401. package/.output/server/chunks/routes/api/plugins/client/_name_.get.mjs +30 -0
  402. package/.output/server/chunks/routes/api/plugins/client/_name_.get.mjs.map +1 -0
  403. package/.output/server/chunks/routes/api/plugins/manifest.get.mjs +22 -0
  404. package/.output/server/chunks/routes/api/plugins/manifest.get.mjs.map +1 -0
  405. package/.output/server/chunks/routes/api/system/config.get.mjs +24 -0
  406. package/.output/server/chunks/routes/api/system/config.get.mjs.map +1 -0
  407. package/.output/server/chunks/routes/api/system/index.get.mjs +24 -0
  408. package/.output/server/chunks/routes/api/system/index.get.mjs.map +1 -0
  409. package/.output/server/chunks/routes/api/system/index.patch.mjs +30 -0
  410. package/.output/server/chunks/routes/api/system/index.patch.mjs.map +1 -0
  411. package/.output/server/chunks/routes/api/system/monitor/terminal/ws.mjs +148 -0
  412. package/.output/server/chunks/routes/api/system/monitor/terminal/ws.mjs.map +1 -0
  413. package/.output/server/chunks/routes/api/system/monitor/terminate.post.mjs +41 -0
  414. package/.output/server/chunks/routes/api/system/monitor/terminate.post.mjs.map +1 -0
  415. package/.output/server/chunks/routes/api/system/monitor.get.mjs +24 -0
  416. package/.output/server/chunks/routes/api/system/monitor.get.mjs.map +1 -0
  417. package/.output/server/chunks/routes/api/system/settings/events.get.mjs +35 -0
  418. package/.output/server/chunks/routes/api/system/settings/events.get.mjs.map +1 -0
  419. package/.output/server/chunks/routes/api/system/settings/reset.post.mjs +24 -0
  420. package/.output/server/chunks/routes/api/system/settings/reset.post.mjs.map +1 -0
  421. package/.output/server/chunks/routes/api/users/_id_.delete.mjs +26 -0
  422. package/.output/server/chunks/routes/api/users/_id_.delete.mjs.map +1 -0
  423. package/.output/server/chunks/routes/api/users/_id_.get.mjs +26 -0
  424. package/.output/server/chunks/routes/api/users/_id_.get.mjs.map +1 -0
  425. package/.output/server/chunks/routes/api/users/_id_.put.mjs +29 -0
  426. package/.output/server/chunks/routes/api/users/_id_.put.mjs.map +1 -0
  427. package/.output/server/chunks/routes/api/users/index.get.mjs +23 -0
  428. package/.output/server/chunks/routes/api/users/index.get.mjs.map +1 -0
  429. package/.output/server/chunks/routes/api/users/index.post.mjs +26 -0
  430. package/.output/server/chunks/routes/api/users/index.post.mjs.map +1 -0
  431. package/.output/server/chunks/routes/api/users/login.post.mjs +25 -0
  432. package/.output/server/chunks/routes/api/users/login.post.mjs.map +1 -0
  433. package/.output/server/chunks/routes/api/users/logout.post.mjs +23 -0
  434. package/.output/server/chunks/routes/api/users/logout.post.mjs.map +1 -0
  435. package/.output/server/chunks/routes/api/users/me.get.mjs +23 -0
  436. package/.output/server/chunks/routes/api/users/me.get.mjs.map +1 -0
  437. package/.output/server/chunks/routes/api/users/register.post.mjs +25 -0
  438. package/.output/server/chunks/routes/api/users/register.post.mjs.map +1 -0
  439. package/.output/server/chunks/routes/api/users/tokens/_id/token.get.mjs +25 -0
  440. package/.output/server/chunks/routes/api/users/tokens/_id/token.get.mjs.map +1 -0
  441. package/.output/server/chunks/routes/api/users/tokens/_id_.delete.mjs +25 -0
  442. package/.output/server/chunks/routes/api/users/tokens/_id_.delete.mjs.map +1 -0
  443. package/.output/server/chunks/routes/api/users/tokens/_id_.patch.mjs +28 -0
  444. package/.output/server/chunks/routes/api/users/tokens/_id_.patch.mjs.map +1 -0
  445. package/.output/server/chunks/routes/api/workshop/_...path_.mjs +22 -0
  446. package/.output/server/chunks/routes/api/workshop/_...path_.mjs.map +1 -0
  447. package/.output/server/chunks/routes/api/workshop/a2a/_agentId/index.get.mjs +61 -0
  448. package/.output/server/chunks/routes/api/workshop/a2a/_agentId/index.get.mjs.map +1 -0
  449. package/.output/server/chunks/routes/api/workshop/a2a/_agentId/index.post.mjs +333 -0
  450. package/.output/server/chunks/routes/api/workshop/a2a/_agentId/index.post.mjs.map +1 -0
  451. package/.output/server/chunks/routes/api/workshop/a2a/send.post.mjs +35 -0
  452. package/.output/server/chunks/routes/api/workshop/a2a/send.post.mjs.map +1 -0
  453. package/.output/server/chunks/routes/api/workshop/agent-tools/approvals/_id/decide.post.mjs +30 -0
  454. package/.output/server/chunks/routes/api/workshop/agent-tools/approvals/_id/decide.post.mjs.map +1 -0
  455. package/.output/server/chunks/routes/api/workshop/agent-tools/bindings/_id_.delete.mjs +31 -0
  456. package/.output/server/chunks/routes/api/workshop/agent-tools/bindings/_id_.delete.mjs.map +1 -0
  457. package/.output/server/chunks/routes/api/workshop/agent-tools/bindings/_id_.patch.mjs +27 -0
  458. package/.output/server/chunks/routes/api/workshop/agent-tools/bindings/_id_.patch.mjs.map +1 -0
  459. package/.output/server/chunks/routes/api/workshop/agent-tools/index.get.mjs +29 -0
  460. package/.output/server/chunks/routes/api/workshop/agent-tools/index.get.mjs.map +1 -0
  461. package/.output/server/chunks/routes/api/workshop/agent-tools/index.post.mjs +32 -0
  462. package/.output/server/chunks/routes/api/workshop/agent-tools/index.post.mjs.map +1 -0
  463. package/.output/server/chunks/routes/api/workshop/agent-tools/index2.get.mjs +26 -0
  464. package/.output/server/chunks/routes/api/workshop/agent-tools/index2.get.mjs.map +1 -0
  465. package/.output/server/chunks/routes/api/workshop/agent-tools/invoke.post.mjs +38 -0
  466. package/.output/server/chunks/routes/api/workshop/agent-tools/invoke.post.mjs.map +1 -0
  467. package/.output/server/chunks/routes/api/workshop/agents/_id_.delete.mjs +30 -0
  468. package/.output/server/chunks/routes/api/workshop/agents/_id_.delete.mjs.map +1 -0
  469. package/.output/server/chunks/routes/api/workshop/agents/_id_.get.mjs +29 -0
  470. package/.output/server/chunks/routes/api/workshop/agents/_id_.get.mjs.map +1 -0
  471. package/.output/server/chunks/routes/api/workshop/agents/_id_.patch.mjs +38 -0
  472. package/.output/server/chunks/routes/api/workshop/agents/_id_.patch.mjs.map +1 -0
  473. package/.output/server/chunks/routes/api/workshop/agents/subscribe.post.mjs +30 -0
  474. package/.output/server/chunks/routes/api/workshop/agents/subscribe.post.mjs.map +1 -0
  475. package/.output/server/chunks/routes/api/workshop/approvals/_id/decide.post.mjs +38 -0
  476. package/.output/server/chunks/routes/api/workshop/approvals/_id/decide.post.mjs.map +1 -0
  477. package/.output/server/chunks/routes/api/workshop/assets/character/_id_.delete.mjs +38 -0
  478. package/.output/server/chunks/routes/api/workshop/assets/character/_id_.delete.mjs.map +1 -0
  479. package/.output/server/chunks/routes/api/workshop/assets/devices/_id_.delete.mjs +47 -0
  480. package/.output/server/chunks/routes/api/workshop/assets/devices/_id_.delete.mjs.map +1 -0
  481. package/.output/server/chunks/routes/api/workshop/assets/index.get.mjs +28 -0
  482. package/.output/server/chunks/routes/api/workshop/assets/index.get.mjs.map +1 -0
  483. package/.output/server/chunks/routes/api/workshop/assets/index.post.mjs +81 -0
  484. package/.output/server/chunks/routes/api/workshop/assets/index.post.mjs.map +1 -0
  485. package/.output/server/chunks/routes/api/workshop/assets/index2.get.mjs +81 -0
  486. package/.output/server/chunks/routes/api/workshop/assets/index2.get.mjs.map +1 -0
  487. package/.output/server/chunks/routes/api/workshop/assets/index2.post.mjs +56 -0
  488. package/.output/server/chunks/routes/api/workshop/assets/index2.post.mjs.map +1 -0
  489. package/.output/server/chunks/routes/api/workshop/audit.get.mjs +55 -0
  490. package/.output/server/chunks/routes/api/workshop/audit.get.mjs.map +1 -0
  491. package/.output/server/chunks/routes/api/workshop/caller.mjs +107 -0
  492. package/.output/server/chunks/routes/api/workshop/caller.mjs.map +1 -0
  493. package/.output/server/chunks/routes/api/workshop/channel-templates/_id/instantiate.post.mjs +37 -0
  494. package/.output/server/chunks/routes/api/workshop/channel-templates/_id/instantiate.post.mjs.map +1 -0
  495. package/.output/server/chunks/routes/api/workshop/channel-templates/_id_.delete.mjs +30 -0
  496. package/.output/server/chunks/routes/api/workshop/channel-templates/_id_.delete.mjs.map +1 -0
  497. package/.output/server/chunks/routes/api/workshop/channel-templates/_id_.get.mjs +29 -0
  498. package/.output/server/chunks/routes/api/workshop/channel-templates/_id_.get.mjs.map +1 -0
  499. package/.output/server/chunks/routes/api/workshop/channel-templates/_id_.patch.mjs +55 -0
  500. package/.output/server/chunks/routes/api/workshop/channel-templates/_id_.patch.mjs.map +1 -0
  501. package/.output/server/chunks/routes/api/workshop/channel-templates/from-channel.post.mjs +39 -0
  502. package/.output/server/chunks/routes/api/workshop/channel-templates/from-channel.post.mjs.map +1 -0
  503. package/.output/server/chunks/routes/api/workshop/channels/_id/activate.post.mjs +29 -0
  504. package/.output/server/chunks/routes/api/workshop/channels/_id/activate.post.mjs.map +1 -0
  505. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/index.get.mjs +36 -0
  506. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/index.get.mjs.map +1 -0
  507. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/index.post.mjs +52 -0
  508. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/index.post.mjs.map +1 -0
  509. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/memories/_memoryId_.delete.mjs +37 -0
  510. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/memories/_memoryId_.delete.mjs.map +1 -0
  511. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/memories/search.post.mjs +46 -0
  512. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/memories/search.post.mjs.map +1 -0
  513. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/model.patch.mjs +42 -0
  514. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/model.patch.mjs.map +1 -0
  515. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/position.patch.mjs +40 -0
  516. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/position.patch.mjs.map +1 -0
  517. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/range.patch.mjs +59 -0
  518. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/range.patch.mjs.map +1 -0
  519. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/stop.post.mjs +33 -0
  520. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/stop.post.mjs.map +1 -0
  521. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId_.delete.mjs +32 -0
  522. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId_.delete.mjs.map +1 -0
  523. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId_.patch.mjs +37 -0
  524. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId_.patch.mjs.map +1 -0
  525. package/.output/server/chunks/routes/api/workshop/channels/_id/events.get.mjs +58 -0
  526. package/.output/server/chunks/routes/api/workshop/channels/_id/events.get.mjs.map +1 -0
  527. package/.output/server/chunks/routes/api/workshop/channels/_id/index.get.mjs +34 -0
  528. package/.output/server/chunks/routes/api/workshop/channels/_id/index.get.mjs.map +1 -0
  529. package/.output/server/chunks/routes/api/workshop/channels/_id/index.post.mjs +62 -0
  530. package/.output/server/chunks/routes/api/workshop/channels/_id/index.post.mjs.map +1 -0
  531. package/.output/server/chunks/routes/api/workshop/channels/_id/index2.get.mjs +35 -0
  532. package/.output/server/chunks/routes/api/workshop/channels/_id/index2.get.mjs.map +1 -0
  533. package/.output/server/chunks/routes/api/workshop/channels/_id/index2.post.mjs +47 -0
  534. package/.output/server/chunks/routes/api/workshop/channels/_id/index2.post.mjs.map +1 -0
  535. package/.output/server/chunks/routes/api/workshop/channels/_id/index3.get.mjs +49 -0
  536. package/.output/server/chunks/routes/api/workshop/channels/_id/index3.get.mjs.map +1 -0
  537. package/.output/server/chunks/routes/api/workshop/channels/_id/index3.post.mjs +74 -0
  538. package/.output/server/chunks/routes/api/workshop/channels/_id/index3.post.mjs.map +1 -0
  539. package/.output/server/chunks/routes/api/workshop/channels/_id/index4.get.mjs +30 -0
  540. package/.output/server/chunks/routes/api/workshop/channels/_id/index4.get.mjs.map +1 -0
  541. package/.output/server/chunks/routes/api/workshop/channels/_id/index4.post.mjs +84 -0
  542. package/.output/server/chunks/routes/api/workshop/channels/_id/index4.post.mjs.map +1 -0
  543. package/.output/server/chunks/routes/api/workshop/channels/_id/memories/_memoryId_.delete.mjs +36 -0
  544. package/.output/server/chunks/routes/api/workshop/channels/_id/memories/_memoryId_.delete.mjs.map +1 -0
  545. package/.output/server/chunks/routes/api/workshop/channels/_id/queue.get.mjs +31 -0
  546. package/.output/server/chunks/routes/api/workshop/channels/_id/queue.get.mjs.map +1 -0
  547. package/.output/server/chunks/routes/api/workshop/channels/_id/terminals.get.mjs +27 -0
  548. package/.output/server/chunks/routes/api/workshop/channels/_id/terminals.get.mjs.map +1 -0
  549. package/.output/server/chunks/routes/api/workshop/channels/_id_.delete.mjs +29 -0
  550. package/.output/server/chunks/routes/api/workshop/channels/_id_.delete.mjs.map +1 -0
  551. package/.output/server/chunks/routes/api/workshop/channels/index.get.mjs +29 -0
  552. package/.output/server/chunks/routes/api/workshop/channels/index.get.mjs.map +1 -0
  553. package/.output/server/chunks/routes/api/workshop/channels/index.patch.mjs +37 -0
  554. package/.output/server/chunks/routes/api/workshop/channels/index.patch.mjs.map +1 -0
  555. package/.output/server/chunks/routes/api/workshop/channels.get.mjs +24 -0
  556. package/.output/server/chunks/routes/api/workshop/channels.get.mjs.map +1 -0
  557. package/.output/server/chunks/routes/api/workshop/channels.post.mjs +53 -0
  558. package/.output/server/chunks/routes/api/workshop/channels.post.mjs.map +1 -0
  559. package/.output/server/chunks/routes/api/workshop/daq/_id/bind.post.mjs +30 -0
  560. package/.output/server/chunks/routes/api/workshop/daq/_id/bind.post.mjs.map +1 -0
  561. package/.output/server/chunks/routes/api/workshop/daq/_id/samples.get.mjs +34 -0
  562. package/.output/server/chunks/routes/api/workshop/daq/_id/samples.get.mjs.map +1 -0
  563. package/.output/server/chunks/routes/api/workshop/daq/_id/test.post.mjs +29 -0
  564. package/.output/server/chunks/routes/api/workshop/daq/_id/test.post.mjs.map +1 -0
  565. package/.output/server/chunks/routes/api/workshop/daq/_id_.delete.mjs +41 -0
  566. package/.output/server/chunks/routes/api/workshop/daq/_id_.delete.mjs.map +1 -0
  567. package/.output/server/chunks/routes/api/workshop/daq/_id_.patch.mjs +42 -0
  568. package/.output/server/chunks/routes/api/workshop/daq/_id_.patch.mjs.map +1 -0
  569. package/.output/server/chunks/routes/api/workshop/daq/alarms/_id/ack.post.mjs +26 -0
  570. package/.output/server/chunks/routes/api/workshop/daq/alarms/_id/ack.post.mjs.map +1 -0
  571. package/.output/server/chunks/routes/api/workshop/daq/alarms.get.mjs +27 -0
  572. package/.output/server/chunks/routes/api/workshop/daq/alarms.get.mjs.map +1 -0
  573. package/.output/server/chunks/routes/api/workshop/daq/controller.post.mjs +53 -0
  574. package/.output/server/chunks/routes/api/workshop/daq/controller.post.mjs.map +1 -0
  575. package/.output/server/chunks/routes/api/workshop/daq/index.post.mjs +28 -0
  576. package/.output/server/chunks/routes/api/workshop/daq/index.post.mjs.map +1 -0
  577. package/.output/server/chunks/routes/api/workshop/daq/infra/reconnect.post.mjs +29 -0
  578. package/.output/server/chunks/routes/api/workshop/daq/infra/reconnect.post.mjs.map +1 -0
  579. package/.output/server/chunks/routes/api/workshop/daq/infra.get.mjs +24 -0
  580. package/.output/server/chunks/routes/api/workshop/daq/infra.get.mjs.map +1 -0
  581. package/.output/server/chunks/routes/api/workshop/daq/templates/_key_.delete.mjs +28 -0
  582. package/.output/server/chunks/routes/api/workshop/daq/templates/_key_.delete.mjs.map +1 -0
  583. package/.output/server/chunks/routes/api/workshop/daq/templates/_key_.patch.mjs +29 -0
  584. package/.output/server/chunks/routes/api/workshop/daq/templates/_key_.patch.mjs.map +1 -0
  585. package/.output/server/chunks/routes/api/workshop/daq/test-driver.post.mjs +30 -0
  586. package/.output/server/chunks/routes/api/workshop/daq/test-driver.post.mjs.map +1 -0
  587. package/.output/server/chunks/routes/api/workshop/dcw/_id/bind.post.mjs +29 -0
  588. package/.output/server/chunks/routes/api/workshop/dcw/_id/bind.post.mjs.map +1 -0
  589. package/.output/server/chunks/routes/api/workshop/dcw/_id/param-ledger.get.mjs +27 -0
  590. package/.output/server/chunks/routes/api/workshop/dcw/_id/param-ledger.get.mjs.map +1 -0
  591. package/.output/server/chunks/routes/api/workshop/dcw/_id/test.post.mjs +27 -0
  592. package/.output/server/chunks/routes/api/workshop/dcw/_id/test.post.mjs.map +1 -0
  593. package/.output/server/chunks/routes/api/workshop/dcw/_id/write.post.mjs +29 -0
  594. package/.output/server/chunks/routes/api/workshop/dcw/_id/write.post.mjs.map +1 -0
  595. package/.output/server/chunks/routes/api/workshop/dcw/_id_.delete.mjs +37 -0
  596. package/.output/server/chunks/routes/api/workshop/dcw/_id_.delete.mjs.map +1 -0
  597. package/.output/server/chunks/routes/api/workshop/dcw/_id_.patch.mjs +29 -0
  598. package/.output/server/chunks/routes/api/workshop/dcw/_id_.patch.mjs.map +1 -0
  599. package/.output/server/chunks/routes/api/workshop/dcw/controller.post.mjs +46 -0
  600. package/.output/server/chunks/routes/api/workshop/dcw/controller.post.mjs.map +1 -0
  601. package/.output/server/chunks/routes/api/workshop/dcw/index.get.mjs +33 -0
  602. package/.output/server/chunks/routes/api/workshop/dcw/index.get.mjs.map +1 -0
  603. package/.output/server/chunks/routes/api/workshop/dcw/index.post.mjs +40 -0
  604. package/.output/server/chunks/routes/api/workshop/dcw/index.post.mjs.map +1 -0
  605. package/.output/server/chunks/routes/api/workshop/dcw/index2.get.mjs +26 -0
  606. package/.output/server/chunks/routes/api/workshop/dcw/index2.get.mjs.map +1 -0
  607. package/.output/server/chunks/routes/api/workshop/dcw/index2.post.mjs +27 -0
  608. package/.output/server/chunks/routes/api/workshop/dcw/index2.post.mjs.map +1 -0
  609. package/.output/server/chunks/routes/api/workshop/dcw/index3.get.mjs +35 -0
  610. package/.output/server/chunks/routes/api/workshop/dcw/index3.get.mjs.map +1 -0
  611. package/.output/server/chunks/routes/api/workshop/dcw/index3.post.mjs +27 -0
  612. package/.output/server/chunks/routes/api/workshop/dcw/index3.post.mjs.map +1 -0
  613. package/.output/server/chunks/routes/api/workshop/dcw/index4.get.mjs +25 -0
  614. package/.output/server/chunks/routes/api/workshop/dcw/index4.get.mjs.map +1 -0
  615. package/.output/server/chunks/routes/api/workshop/dcw/index4.post.mjs +27 -0
  616. package/.output/server/chunks/routes/api/workshop/dcw/index4.post.mjs.map +1 -0
  617. package/.output/server/chunks/routes/api/workshop/dcw/index5.get.mjs +24 -0
  618. package/.output/server/chunks/routes/api/workshop/dcw/index5.get.mjs.map +1 -0
  619. package/.output/server/chunks/routes/api/workshop/dcw/journal/node/_nodeId/rollback.post.mjs +30 -0
  620. package/.output/server/chunks/routes/api/workshop/dcw/journal/node/_nodeId/rollback.post.mjs.map +1 -0
  621. package/.output/server/chunks/routes/api/workshop/dcw/line/query.get.mjs +41 -0
  622. package/.output/server/chunks/routes/api/workshop/dcw/line/query.get.mjs.map +1 -0
  623. package/.output/server/chunks/routes/api/workshop/dcw/lines/_id/start.post.mjs +45 -0
  624. package/.output/server/chunks/routes/api/workshop/dcw/lines/_id/start.post.mjs.map +1 -0
  625. package/.output/server/chunks/routes/api/workshop/dcw/lines/_id/stop.post.mjs +44 -0
  626. package/.output/server/chunks/routes/api/workshop/dcw/lines/_id/stop.post.mjs.map +1 -0
  627. package/.output/server/chunks/routes/api/workshop/dcw/lines/_id_.delete.mjs +43 -0
  628. package/.output/server/chunks/routes/api/workshop/dcw/lines/_id_.delete.mjs.map +1 -0
  629. package/.output/server/chunks/routes/api/workshop/dcw/lines/_id_.patch.mjs +27 -0
  630. package/.output/server/chunks/routes/api/workshop/dcw/lines/_id_.patch.mjs.map +1 -0
  631. package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id/judge.post.mjs +32 -0
  632. package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id/judge.post.mjs.map +1 -0
  633. package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id/rollback.post.mjs +35 -0
  634. package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id/rollback.post.mjs.map +1 -0
  635. package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id/series.get.mjs +29 -0
  636. package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id/series.get.mjs.map +1 -0
  637. package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id_.get.mjs +29 -0
  638. package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id_.get.mjs.map +1 -0
  639. package/.output/server/chunks/routes/api/workshop/dcw/products/_id_.delete.mjs +28 -0
  640. package/.output/server/chunks/routes/api/workshop/dcw/products/_id_.delete.mjs.map +1 -0
  641. package/.output/server/chunks/routes/api/workshop/dcw/products/_id_.patch.mjs +28 -0
  642. package/.output/server/chunks/routes/api/workshop/dcw/products/_id_.patch.mjs.map +1 -0
  643. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/apply.post.mjs +47 -0
  644. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/apply.post.mjs.map +1 -0
  645. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/mark-good.post.mjs +31 -0
  646. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/mark-good.post.mjs.map +1 -0
  647. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/rollback-good.post.mjs +29 -0
  648. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/rollback-good.post.mjs.map +1 -0
  649. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id_.delete.mjs +27 -0
  650. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id_.delete.mjs.map +1 -0
  651. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id_.patch.mjs +28 -0
  652. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id_.patch.mjs.map +1 -0
  653. package/.output/server/chunks/routes/api/workshop/dcw/runs/_id/close.post.mjs +27 -0
  654. package/.output/server/chunks/routes/api/workshop/dcw/runs/_id/close.post.mjs.map +1 -0
  655. package/.output/server/chunks/routes/api/workshop/dcw/runs/_id/data.get.mjs +27 -0
  656. package/.output/server/chunks/routes/api/workshop/dcw/runs/_id/data.get.mjs.map +1 -0
  657. package/.output/server/chunks/routes/api/workshop/dcw/runs/_id/rollback.post.mjs +29 -0
  658. package/.output/server/chunks/routes/api/workshop/dcw/runs/_id/rollback.post.mjs.map +1 -0
  659. package/.output/server/chunks/routes/api/workshop/dcw/templates/_key_.delete.mjs +27 -0
  660. package/.output/server/chunks/routes/api/workshop/dcw/templates/_key_.delete.mjs.map +1 -0
  661. package/.output/server/chunks/routes/api/workshop/dcw/templates/_key_.patch.mjs +28 -0
  662. package/.output/server/chunks/routes/api/workshop/dcw/templates/_key_.patch.mjs.map +1 -0
  663. package/.output/server/chunks/routes/api/workshop/dcw/test-driver.post.mjs +27 -0
  664. package/.output/server/chunks/routes/api/workshop/dcw/test-driver.post.mjs.map +1 -0
  665. package/.output/server/chunks/routes/api/workshop/device-twins/_id/control.post.mjs +30 -0
  666. package/.output/server/chunks/routes/api/workshop/device-twins/_id/control.post.mjs.map +1 -0
  667. package/.output/server/chunks/routes/api/workshop/device-twins/_id/telemetry.post.mjs +29 -0
  668. package/.output/server/chunks/routes/api/workshop/device-twins/_id/telemetry.post.mjs.map +1 -0
  669. package/.output/server/chunks/routes/api/workshop/device-twins/_id_.delete.mjs +32 -0
  670. package/.output/server/chunks/routes/api/workshop/device-twins/_id_.delete.mjs.map +1 -0
  671. package/.output/server/chunks/routes/api/workshop/device-twins/_id_.patch.mjs +36 -0
  672. package/.output/server/chunks/routes/api/workshop/device-twins/_id_.patch.mjs.map +1 -0
  673. package/.output/server/chunks/routes/api/workshop/fs/dirs.get.mjs +43 -0
  674. package/.output/server/chunks/routes/api/workshop/fs/dirs.get.mjs.map +1 -0
  675. package/.output/server/chunks/routes/api/workshop/index.get.mjs +25 -0
  676. package/.output/server/chunks/routes/api/workshop/index.get.mjs.map +1 -0
  677. package/.output/server/chunks/routes/api/workshop/index.post.mjs +38 -0
  678. package/.output/server/chunks/routes/api/workshop/index.post.mjs.map +1 -0
  679. package/.output/server/chunks/routes/api/workshop/index10.get.mjs +24 -0
  680. package/.output/server/chunks/routes/api/workshop/index10.get.mjs.map +1 -0
  681. package/.output/server/chunks/routes/api/workshop/index2.get.mjs +31 -0
  682. package/.output/server/chunks/routes/api/workshop/index2.get.mjs.map +1 -0
  683. package/.output/server/chunks/routes/api/workshop/index2.post.mjs +68 -0
  684. package/.output/server/chunks/routes/api/workshop/index2.post.mjs.map +1 -0
  685. package/.output/server/chunks/routes/api/workshop/index3.get.mjs +25 -0
  686. package/.output/server/chunks/routes/api/workshop/index3.get.mjs.map +1 -0
  687. package/.output/server/chunks/routes/api/workshop/index3.post.mjs +41 -0
  688. package/.output/server/chunks/routes/api/workshop/index3.post.mjs.map +1 -0
  689. package/.output/server/chunks/routes/api/workshop/index4.get.mjs +47 -0
  690. package/.output/server/chunks/routes/api/workshop/index4.get.mjs.map +1 -0
  691. package/.output/server/chunks/routes/api/workshop/index4.post.mjs +29 -0
  692. package/.output/server/chunks/routes/api/workshop/index4.post.mjs.map +1 -0
  693. package/.output/server/chunks/routes/api/workshop/index5.get.mjs +36 -0
  694. package/.output/server/chunks/routes/api/workshop/index5.get.mjs.map +1 -0
  695. package/.output/server/chunks/routes/api/workshop/index5.post.mjs +40 -0
  696. package/.output/server/chunks/routes/api/workshop/index5.post.mjs.map +1 -0
  697. package/.output/server/chunks/routes/api/workshop/index6.get.mjs +26 -0
  698. package/.output/server/chunks/routes/api/workshop/index6.get.mjs.map +1 -0
  699. package/.output/server/chunks/routes/api/workshop/index6.post.mjs +43 -0
  700. package/.output/server/chunks/routes/api/workshop/index6.post.mjs.map +1 -0
  701. package/.output/server/chunks/routes/api/workshop/index7.get.mjs +40 -0
  702. package/.output/server/chunks/routes/api/workshop/index7.get.mjs.map +1 -0
  703. package/.output/server/chunks/routes/api/workshop/index7.post.mjs +36 -0
  704. package/.output/server/chunks/routes/api/workshop/index7.post.mjs.map +1 -0
  705. package/.output/server/chunks/routes/api/workshop/index8.get.mjs +30 -0
  706. package/.output/server/chunks/routes/api/workshop/index8.get.mjs.map +1 -0
  707. package/.output/server/chunks/routes/api/workshop/index8.post.mjs +27 -0
  708. package/.output/server/chunks/routes/api/workshop/index8.post.mjs.map +1 -0
  709. package/.output/server/chunks/routes/api/workshop/index9.get.mjs +25 -0
  710. package/.output/server/chunks/routes/api/workshop/index9.get.mjs.map +1 -0
  711. package/.output/server/chunks/routes/api/workshop/mailbox/all.get.mjs +31 -0
  712. package/.output/server/chunks/routes/api/workshop/mailbox/all.get.mjs.map +1 -0
  713. package/.output/server/chunks/routes/api/workshop/mailbox.get.mjs +27 -0
  714. package/.output/server/chunks/routes/api/workshop/mailbox.get.mjs.map +1 -0
  715. package/.output/server/chunks/routes/api/workshop/memories/maintenance.post.mjs +25 -0
  716. package/.output/server/chunks/routes/api/workshop/memories/maintenance.post.mjs.map +1 -0
  717. package/.output/server/chunks/routes/api/workshop/plugins/_name/disable.post.mjs +33 -0
  718. package/.output/server/chunks/routes/api/workshop/plugins/_name/disable.post.mjs.map +1 -0
  719. package/.output/server/chunks/routes/api/workshop/plugins/_name/enable.post.mjs +33 -0
  720. package/.output/server/chunks/routes/api/workshop/plugins/_name/enable.post.mjs.map +1 -0
  721. package/.output/server/chunks/routes/api/workshop/plugins/index.get.mjs +28 -0
  722. package/.output/server/chunks/routes/api/workshop/plugins/index.get.mjs.map +1 -0
  723. package/.output/server/chunks/routes/api/workshop/runtime.get.mjs +24 -0
  724. package/.output/server/chunks/routes/api/workshop/runtime.get.mjs.map +1 -0
  725. package/.output/server/chunks/routes/api/workshop/scene/layouts/_channelId_.delete.mjs +32 -0
  726. package/.output/server/chunks/routes/api/workshop/scene/layouts/_channelId_.delete.mjs.map +1 -0
  727. package/.output/server/chunks/routes/api/workshop/scene/layouts/_channelId_.put.mjs +39 -0
  728. package/.output/server/chunks/routes/api/workshop/scene/layouts/_channelId_.put.mjs.map +1 -0
  729. package/.output/server/chunks/routes/api/workshop/scene/layouts.get.mjs +25 -0
  730. package/.output/server/chunks/routes/api/workshop/scene/layouts.get.mjs.map +1 -0
  731. package/.output/server/chunks/routes/api/workshop/tasks/_id/complete.post.mjs +37 -0
  732. package/.output/server/chunks/routes/api/workshop/tasks/_id/complete.post.mjs.map +1 -0
  733. package/.output/server/chunks/routes/api/workshop/tasks/_id/dispatch.post.mjs +39 -0
  734. package/.output/server/chunks/routes/api/workshop/tasks/_id/dispatch.post.mjs.map +1 -0
  735. package/.output/server/chunks/routes/api/workshop/tasks/_id/index.post.mjs +36 -0
  736. package/.output/server/chunks/routes/api/workshop/tasks/_id/index.post.mjs.map +1 -0
  737. package/.output/server/chunks/routes/api/workshop/tasks/_id/report.post.mjs +44 -0
  738. package/.output/server/chunks/routes/api/workshop/tasks/_id/report.post.mjs.map +1 -0
  739. package/.output/server/chunks/routes/api/workshop/tasks/_id/retry.post.mjs +36 -0
  740. package/.output/server/chunks/routes/api/workshop/tasks/_id/retry.post.mjs.map +1 -0
  741. package/.output/server/chunks/routes/api/workshop/tasks/_id_.get.mjs +37 -0
  742. package/.output/server/chunks/routes/api/workshop/tasks/_id_.get.mjs.map +1 -0
  743. package/.output/server/chunks/routes/api/workshop/tasks.get.mjs +24 -0
  744. package/.output/server/chunks/routes/api/workshop/tasks.get.mjs.map +1 -0
  745. package/.output/server/chunks/routes/api/workshop/teams/_id/deploy.post.mjs +42 -0
  746. package/.output/server/chunks/routes/api/workshop/teams/_id/deploy.post.mjs.map +1 -0
  747. package/.output/server/chunks/routes/api/workshop/teams/_id/index.get.mjs +29 -0
  748. package/.output/server/chunks/routes/api/workshop/teams/_id/index.get.mjs.map +1 -0
  749. package/.output/server/chunks/routes/api/workshop/teams/_id/index.post.mjs +39 -0
  750. package/.output/server/chunks/routes/api/workshop/teams/_id/index.post.mjs.map +1 -0
  751. package/.output/server/chunks/routes/api/workshop/teams/_id/members/_agentId_.delete.mjs +30 -0
  752. package/.output/server/chunks/routes/api/workshop/teams/_id/members/_agentId_.delete.mjs.map +1 -0
  753. package/.output/server/chunks/routes/api/workshop/teams/_id_.delete.mjs +30 -0
  754. package/.output/server/chunks/routes/api/workshop/teams/_id_.delete.mjs.map +1 -0
  755. package/.output/server/chunks/routes/api/workshop/teams/_id_.get.mjs +29 -0
  756. package/.output/server/chunks/routes/api/workshop/teams/_id_.get.mjs.map +1 -0
  757. package/.output/server/chunks/routes/api/workshop/teams/_id_.patch.mjs +40 -0
  758. package/.output/server/chunks/routes/api/workshop/teams/_id_.patch.mjs.map +1 -0
  759. package/.output/server/chunks/routes/api/workshop/users/me.get.mjs +35 -0
  760. package/.output/server/chunks/routes/api/workshop/users/me.get.mjs.map +1 -0
  761. package/.output/server/chunks/routes/api/workshop/users/register.post.mjs +37 -0
  762. package/.output/server/chunks/routes/api/workshop/users/register.post.mjs.map +1 -0
  763. package/.output/server/chunks/routes/api/workshop/workspaces/_id/channel-templates/_tplId_.post.mjs +39 -0
  764. package/.output/server/chunks/routes/api/workshop/workspaces/_id/channel-templates/_tplId_.post.mjs.map +1 -0
  765. package/.output/server/chunks/routes/api/workshop/workspaces/_id/channels/_channelId_.delete.mjs +27 -0
  766. package/.output/server/chunks/routes/api/workshop/workspaces/_id/channels/_channelId_.delete.mjs.map +1 -0
  767. package/.output/server/chunks/routes/api/workshop/workspaces/_id/channels/_channelId_.post.mjs +27 -0
  768. package/.output/server/chunks/routes/api/workshop/workspaces/_id/channels/_channelId_.post.mjs.map +1 -0
  769. package/.output/server/chunks/routes/api/workshop/workspaces/index.delete.mjs +26 -0
  770. package/.output/server/chunks/routes/api/workshop/workspaces/index.delete.mjs.map +1 -0
  771. package/.output/server/chunks/routes/renderer.mjs +392 -0
  772. package/.output/server/chunks/routes/renderer.mjs.map +1 -0
  773. package/.output/server/chunks/virtual/_virtual_spa-template.mjs +4 -0
  774. package/.output/server/chunks/virtual/_virtual_spa-template.mjs.map +1 -0
  775. package/.output/server/chunks/virtual/entry.mjs +18401 -0
  776. package/.output/server/chunks/virtual/entry.mjs.map +1 -0
  777. package/.output/server/chunks/virtual/precomputed.mjs +4 -0
  778. package/.output/server/chunks/virtual/precomputed.mjs.map +1 -0
  779. package/.output/server/index.mjs +5561 -0
  780. package/.output/server/index.mjs.map +1 -0
  781. package/.output/server/node_modules/.nitro/@vue/devtools-api@6.6.4/lib/cjs/api/api.js +2 -0
  782. package/.output/server/node_modules/.nitro/@vue/devtools-api@6.6.4/lib/cjs/api/app.js +2 -0
  783. package/.output/server/node_modules/.nitro/@vue/devtools-api@6.6.4/lib/cjs/api/component.js +2 -0
  784. package/.output/server/node_modules/.nitro/@vue/devtools-api@6.6.4/lib/cjs/api/context.js +2 -0
  785. package/.output/server/node_modules/.nitro/@vue/devtools-api@6.6.4/lib/cjs/api/hooks.js +2 -0
  786. package/.output/server/node_modules/.nitro/@vue/devtools-api@6.6.4/lib/cjs/api/index.js +22 -0
  787. package/.output/server/node_modules/.nitro/@vue/devtools-api@6.6.4/lib/cjs/api/util.js +2 -0
  788. package/.output/server/node_modules/.nitro/@vue/devtools-api@6.6.4/lib/cjs/const.js +5 -0
  789. package/.output/server/node_modules/.nitro/@vue/devtools-api@6.6.4/lib/cjs/env.js +17 -0
  790. package/.output/server/node_modules/.nitro/@vue/devtools-api@6.6.4/lib/cjs/index.js +45 -0
  791. package/.output/server/node_modules/.nitro/@vue/devtools-api@6.6.4/lib/cjs/plugin.js +2 -0
  792. package/.output/server/node_modules/.nitro/@vue/devtools-api@6.6.4/lib/cjs/proxy.js +111 -0
  793. package/.output/server/node_modules/.nitro/@vue/devtools-api@6.6.4/lib/cjs/time.js +28 -0
  794. package/.output/server/node_modules/.nitro/@vue/devtools-api@6.6.4/package.json +37 -0
  795. package/.output/server/node_modules/.nitro/@vue/devtools-api@7.7.10/dist/index.cjs +42 -0
  796. package/.output/server/node_modules/.nitro/@vue/devtools-api@7.7.10/package.json +32 -0
  797. package/.output/server/node_modules/.nitro/hookable@5.5.3/dist/index.cjs +299 -0
  798. package/.output/server/node_modules/.nitro/hookable@5.5.3/package.json +49 -0
  799. package/.output/server/node_modules/.nitro/hookable@6.1.1/dist/index.mjs +257 -0
  800. package/.output/server/node_modules/.nitro/hookable@6.1.1/package.json +53 -0
  801. package/.output/server/node_modules/@adonisjs/hash/build/chunk-7RS6HCBK.js +36 -0
  802. package/.output/server/node_modules/@adonisjs/hash/build/chunk-JSA56AE7.js +26 -0
  803. package/.output/server/node_modules/@adonisjs/hash/build/chunk-JSBRDJBE.js +30 -0
  804. package/.output/server/node_modules/@adonisjs/hash/build/chunk-RHMXMP27.js +202 -0
  805. package/.output/server/node_modules/@adonisjs/hash/build/chunk-WB54OA6N.js +193 -0
  806. package/.output/server/node_modules/@adonisjs/hash/build/index.js +9 -0
  807. package/.output/server/node_modules/@adonisjs/hash/build/src/drivers/scrypt.js +9 -0
  808. package/.output/server/node_modules/@adonisjs/hash/package.json +150 -0
  809. package/.output/server/node_modules/@ant-design/colors/dist/index.js +255 -0
  810. package/.output/server/node_modules/@ant-design/colors/package.json +53 -0
  811. package/.output/server/node_modules/@babel/parser/lib/index.js +14611 -0
  812. package/.output/server/node_modules/@babel/parser/package.json +50 -0
  813. package/.output/server/node_modules/@ctrl/tinycolor/dist/conversion.js +250 -0
  814. package/.output/server/node_modules/@ctrl/tinycolor/dist/css-color-names.js +157 -0
  815. package/.output/server/node_modules/@ctrl/tinycolor/dist/format-input.js +189 -0
  816. package/.output/server/node_modules/@ctrl/tinycolor/dist/from-ratio.js +30 -0
  817. package/.output/server/node_modules/@ctrl/tinycolor/dist/index.js +512 -0
  818. package/.output/server/node_modules/@ctrl/tinycolor/dist/interfaces.js +2 -0
  819. package/.output/server/node_modules/@ctrl/tinycolor/dist/public_api.js +28 -0
  820. package/.output/server/node_modules/@ctrl/tinycolor/dist/random.js +282 -0
  821. package/.output/server/node_modules/@ctrl/tinycolor/dist/readability.js +86 -0
  822. package/.output/server/node_modules/@ctrl/tinycolor/dist/to-ms-filter.js +20 -0
  823. package/.output/server/node_modules/@ctrl/tinycolor/dist/util.js +92 -0
  824. package/.output/server/node_modules/@ctrl/tinycolor/package.json +80 -0
  825. package/.output/server/node_modules/@modelcontextprotocol/sdk/dist/esm/experimental/tasks/helpers.js +64 -0
  826. package/.output/server/node_modules/@modelcontextprotocol/sdk/dist/esm/experimental/tasks/interfaces.js +16 -0
  827. package/.output/server/node_modules/@modelcontextprotocol/sdk/dist/esm/experimental/tasks/mcp-server.js +32 -0
  828. package/.output/server/node_modules/@modelcontextprotocol/sdk/dist/esm/experimental/tasks/server.js +246 -0
  829. package/.output/server/node_modules/@modelcontextprotocol/sdk/dist/esm/package.json +1 -0
  830. package/.output/server/node_modules/@modelcontextprotocol/sdk/dist/esm/server/completable.js +41 -0
  831. package/.output/server/node_modules/@modelcontextprotocol/sdk/dist/esm/server/index.js +429 -0
  832. package/.output/server/node_modules/@modelcontextprotocol/sdk/dist/esm/server/mcp.js +917 -0
  833. package/.output/server/node_modules/@modelcontextprotocol/sdk/dist/esm/server/sseKeepAlive.js +13 -0
  834. package/.output/server/node_modules/@modelcontextprotocol/sdk/dist/esm/server/webStandardStreamableHttp.js +949 -0
  835. package/.output/server/node_modules/@modelcontextprotocol/sdk/dist/esm/server/zod-compat.js +228 -0
  836. package/.output/server/node_modules/@modelcontextprotocol/sdk/dist/esm/server/zod-json-schema-compat.js +51 -0
  837. package/.output/server/node_modules/@modelcontextprotocol/sdk/dist/esm/shared/mediaType.js +57 -0
  838. package/.output/server/node_modules/@modelcontextprotocol/sdk/dist/esm/shared/protocol.js +1107 -0
  839. package/.output/server/node_modules/@modelcontextprotocol/sdk/dist/esm/shared/toolNameValidation.js +92 -0
  840. package/.output/server/node_modules/@modelcontextprotocol/sdk/dist/esm/shared/uriTemplate.js +239 -0
  841. package/.output/server/node_modules/@modelcontextprotocol/sdk/dist/esm/types.js +2065 -0
  842. package/.output/server/node_modules/@modelcontextprotocol/sdk/dist/esm/validation/ajv-provider.js +87 -0
  843. package/.output/server/node_modules/@modelcontextprotocol/sdk/package.json +165 -0
  844. package/.output/server/node_modules/@phc/format/index.js +229 -0
  845. package/.output/server/node_modules/@phc/format/package.json +60 -0
  846. package/.output/server/node_modules/@poppinss/exception/build/index.js +44 -0
  847. package/.output/server/node_modules/@poppinss/exception/package.json +109 -0
  848. package/.output/server/node_modules/@poppinss/object-builder/build/index.js +49 -0
  849. package/.output/server/node_modules/@poppinss/object-builder/package.json +112 -0
  850. package/.output/server/node_modules/@poppinss/string/build/index.js +2 -0
  851. package/.output/server/node_modules/@poppinss/string/build/string-DVIVpZLG.js +737 -0
  852. package/.output/server/node_modules/@poppinss/string/package.json +131 -0
  853. package/.output/server/node_modules/@poppinss/utils/build/chunk-2KG3PWR4.js +17 -0
  854. package/.output/server/node_modules/@poppinss/utils/build/chunk-4V5ON6P7.js +7 -0
  855. package/.output/server/node_modules/@poppinss/utils/build/chunk-EJKUJ44Y.js +12 -0
  856. package/.output/server/node_modules/@poppinss/utils/build/chunk-H54AK3PI.js +7 -0
  857. package/.output/server/node_modules/@poppinss/utils/build/chunk-XHQBV7AF.js +39 -0
  858. package/.output/server/node_modules/@poppinss/utils/build/index.js +365 -0
  859. package/.output/server/node_modules/@poppinss/utils/build/lodash/main.cjs +39 -0
  860. package/.output/server/node_modules/@poppinss/utils/package.json +153 -0
  861. package/.output/server/node_modules/@vue/compiler-core/dist/compiler-core.cjs.prod.js +6801 -0
  862. package/.output/server/node_modules/@vue/compiler-core/package.json +58 -0
  863. package/.output/server/node_modules/@vue/compiler-dom/dist/compiler-dom.cjs.prod.js +692 -0
  864. package/.output/server/node_modules/@vue/compiler-dom/package.json +57 -0
  865. package/.output/server/node_modules/@vue/compiler-ssr/dist/compiler-ssr.cjs.js +1420 -0
  866. package/.output/server/node_modules/@vue/compiler-ssr/package.json +34 -0
  867. package/.output/server/node_modules/@vue/devtools-kit/dist/index.cjs +6781 -0
  868. package/.output/server/node_modules/@vue/devtools-kit/package.json +45 -0
  869. package/.output/server/node_modules/@vue/devtools-shared/dist/index.cjs +378 -0
  870. package/.output/server/node_modules/@vue/devtools-shared/package.json +35 -0
  871. package/.output/server/node_modules/@vue/reactivity/dist/reactivity.cjs.prod.js +1903 -0
  872. package/.output/server/node_modules/@vue/reactivity/package.json +55 -0
  873. package/.output/server/node_modules/@vue/runtime-core/dist/runtime-core.cjs.prod.js +6976 -0
  874. package/.output/server/node_modules/@vue/runtime-core/package.json +52 -0
  875. package/.output/server/node_modules/@vue/runtime-dom/dist/runtime-dom.cjs.prod.js +1841 -0
  876. package/.output/server/node_modules/@vue/runtime-dom/package.json +60 -0
  877. package/.output/server/node_modules/@vue/server-renderer/dist/server-renderer.cjs.prod.js +904 -0
  878. package/.output/server/node_modules/@vue/server-renderer/package.json +53 -0
  879. package/.output/server/node_modules/@vue/shared/dist/shared.cjs.prod.js +609 -0
  880. package/.output/server/node_modules/@vue/shared/package.json +47 -0
  881. package/.output/server/node_modules/@xterm/addon-fit/lib/addon-fit.js +2 -0
  882. package/.output/server/node_modules/@xterm/addon-fit/package.json +26 -0
  883. package/.output/server/node_modules/@xterm/xterm/lib/xterm.js +2 -0
  884. package/.output/server/node_modules/@xterm/xterm/package.json +111 -0
  885. package/.output/server/node_modules/agent-base/dist/src/index.js +203 -0
  886. package/.output/server/node_modules/agent-base/dist/src/promisify.js +18 -0
  887. package/.output/server/node_modules/agent-base/package.json +64 -0
  888. package/.output/server/node_modules/ajv/dist/ajv.js +50 -0
  889. package/.output/server/node_modules/ajv/dist/compile/codegen/code.js +156 -0
  890. package/.output/server/node_modules/ajv/dist/compile/codegen/index.js +697 -0
  891. package/.output/server/node_modules/ajv/dist/compile/codegen/scope.js +143 -0
  892. package/.output/server/node_modules/ajv/dist/compile/errors.js +123 -0
  893. package/.output/server/node_modules/ajv/dist/compile/index.js +242 -0
  894. package/.output/server/node_modules/ajv/dist/compile/names.js +28 -0
  895. package/.output/server/node_modules/ajv/dist/compile/ref_error.js +12 -0
  896. package/.output/server/node_modules/ajv/dist/compile/resolve.js +155 -0
  897. package/.output/server/node_modules/ajv/dist/compile/rules.js +26 -0
  898. package/.output/server/node_modules/ajv/dist/compile/util.js +178 -0
  899. package/.output/server/node_modules/ajv/dist/compile/validate/applicability.js +19 -0
  900. package/.output/server/node_modules/ajv/dist/compile/validate/boolSchema.js +50 -0
  901. package/.output/server/node_modules/ajv/dist/compile/validate/dataType.js +203 -0
  902. package/.output/server/node_modules/ajv/dist/compile/validate/defaults.js +35 -0
  903. package/.output/server/node_modules/ajv/dist/compile/validate/index.js +520 -0
  904. package/.output/server/node_modules/ajv/dist/compile/validate/keyword.js +124 -0
  905. package/.output/server/node_modules/ajv/dist/compile/validate/subschema.js +81 -0
  906. package/.output/server/node_modules/ajv/dist/core.js +618 -0
  907. package/.output/server/node_modules/ajv/dist/refs/data.json +13 -0
  908. package/.output/server/node_modules/ajv/dist/refs/json-schema-draft-07.json +151 -0
  909. package/.output/server/node_modules/ajv/dist/runtime/equal.js +7 -0
  910. package/.output/server/node_modules/ajv/dist/runtime/ucs2length.js +24 -0
  911. package/.output/server/node_modules/ajv/dist/runtime/uri.js +6 -0
  912. package/.output/server/node_modules/ajv/dist/runtime/validation_error.js +11 -0
  913. package/.output/server/node_modules/ajv/dist/vocabularies/applicator/additionalItems.js +49 -0
  914. package/.output/server/node_modules/ajv/dist/vocabularies/applicator/additionalProperties.js +106 -0
  915. package/.output/server/node_modules/ajv/dist/vocabularies/applicator/allOf.js +23 -0
  916. package/.output/server/node_modules/ajv/dist/vocabularies/applicator/anyOf.js +12 -0
  917. package/.output/server/node_modules/ajv/dist/vocabularies/applicator/contains.js +95 -0
  918. package/.output/server/node_modules/ajv/dist/vocabularies/applicator/dependencies.js +85 -0
  919. package/.output/server/node_modules/ajv/dist/vocabularies/applicator/if.js +66 -0
  920. package/.output/server/node_modules/ajv/dist/vocabularies/applicator/index.js +44 -0
  921. package/.output/server/node_modules/ajv/dist/vocabularies/applicator/items.js +52 -0
  922. package/.output/server/node_modules/ajv/dist/vocabularies/applicator/items2020.js +30 -0
  923. package/.output/server/node_modules/ajv/dist/vocabularies/applicator/not.js +26 -0
  924. package/.output/server/node_modules/ajv/dist/vocabularies/applicator/oneOf.js +60 -0
  925. package/.output/server/node_modules/ajv/dist/vocabularies/applicator/patternProperties.js +75 -0
  926. package/.output/server/node_modules/ajv/dist/vocabularies/applicator/prefixItems.js +12 -0
  927. package/.output/server/node_modules/ajv/dist/vocabularies/applicator/properties.js +54 -0
  928. package/.output/server/node_modules/ajv/dist/vocabularies/applicator/propertyNames.js +38 -0
  929. package/.output/server/node_modules/ajv/dist/vocabularies/applicator/thenElse.js +13 -0
  930. package/.output/server/node_modules/ajv/dist/vocabularies/code.js +131 -0
  931. package/.output/server/node_modules/ajv/dist/vocabularies/core/id.js +10 -0
  932. package/.output/server/node_modules/ajv/dist/vocabularies/core/index.js +16 -0
  933. package/.output/server/node_modules/ajv/dist/vocabularies/core/ref.js +122 -0
  934. package/.output/server/node_modules/ajv/dist/vocabularies/discriminator/index.js +104 -0
  935. package/.output/server/node_modules/ajv/dist/vocabularies/discriminator/types.js +9 -0
  936. package/.output/server/node_modules/ajv/dist/vocabularies/draft7.js +17 -0
  937. package/.output/server/node_modules/ajv/dist/vocabularies/format/format.js +92 -0
  938. package/.output/server/node_modules/ajv/dist/vocabularies/format/index.js +6 -0
  939. package/.output/server/node_modules/ajv/dist/vocabularies/metadata.js +18 -0
  940. package/.output/server/node_modules/ajv/dist/vocabularies/validation/const.js +25 -0
  941. package/.output/server/node_modules/ajv/dist/vocabularies/validation/enum.js +48 -0
  942. package/.output/server/node_modules/ajv/dist/vocabularies/validation/index.js +33 -0
  943. package/.output/server/node_modules/ajv/dist/vocabularies/validation/limitItems.js +24 -0
  944. package/.output/server/node_modules/ajv/dist/vocabularies/validation/limitLength.js +27 -0
  945. package/.output/server/node_modules/ajv/dist/vocabularies/validation/limitNumber.js +27 -0
  946. package/.output/server/node_modules/ajv/dist/vocabularies/validation/limitProperties.js +24 -0
  947. package/.output/server/node_modules/ajv/dist/vocabularies/validation/multipleOf.js +26 -0
  948. package/.output/server/node_modules/ajv/dist/vocabularies/validation/pattern.js +33 -0
  949. package/.output/server/node_modules/ajv/dist/vocabularies/validation/required.js +79 -0
  950. package/.output/server/node_modules/ajv/dist/vocabularies/validation/uniqueItems.js +64 -0
  951. package/.output/server/node_modules/ajv/package.json +126 -0
  952. package/.output/server/node_modules/ajv-formats/dist/formats.js +208 -0
  953. package/.output/server/node_modules/ajv-formats/dist/index.js +37 -0
  954. package/.output/server/node_modules/ajv-formats/dist/limit.js +69 -0
  955. package/.output/server/node_modules/ajv-formats/package.json +74 -0
  956. package/.output/server/node_modules/asynckit/index.js +6 -0
  957. package/.output/server/node_modules/asynckit/lib/abort.js +29 -0
  958. package/.output/server/node_modules/asynckit/lib/async.js +34 -0
  959. package/.output/server/node_modules/asynckit/lib/defer.js +26 -0
  960. package/.output/server/node_modules/asynckit/lib/iterate.js +75 -0
  961. package/.output/server/node_modules/asynckit/lib/state.js +37 -0
  962. package/.output/server/node_modules/asynckit/lib/terminator.js +29 -0
  963. package/.output/server/node_modules/asynckit/package.json +63 -0
  964. package/.output/server/node_modules/asynckit/parallel.js +43 -0
  965. package/.output/server/node_modules/asynckit/serial.js +17 -0
  966. package/.output/server/node_modules/asynckit/serialOrdered.js +75 -0
  967. package/.output/server/node_modules/axios/index.js +45 -0
  968. package/.output/server/node_modules/axios/lib/adapters/adapters.js +132 -0
  969. package/.output/server/node_modules/axios/lib/adapters/fetch.js +643 -0
  970. package/.output/server/node_modules/axios/lib/adapters/http.js +1406 -0
  971. package/.output/server/node_modules/axios/lib/adapters/xhr.js +228 -0
  972. package/.output/server/node_modules/axios/lib/axios.js +89 -0
  973. package/.output/server/node_modules/axios/lib/cancel/CancelToken.js +135 -0
  974. package/.output/server/node_modules/axios/lib/cancel/CanceledError.js +22 -0
  975. package/.output/server/node_modules/axios/lib/cancel/isCancel.js +5 -0
  976. package/.output/server/node_modules/axios/lib/core/Axios.js +301 -0
  977. package/.output/server/node_modules/axios/lib/core/AxiosError.js +219 -0
  978. package/.output/server/node_modules/axios/lib/core/AxiosHeaders.js +474 -0
  979. package/.output/server/node_modules/axios/lib/core/InterceptorManager.js +72 -0
  980. package/.output/server/node_modules/axios/lib/core/buildFullPath.js +88 -0
  981. package/.output/server/node_modules/axios/lib/core/dispatchRequest.js +89 -0
  982. package/.output/server/node_modules/axios/lib/core/mergeConfig.js +174 -0
  983. package/.output/server/node_modules/axios/lib/core/setFormDataHeaders.js +27 -0
  984. package/.output/server/node_modules/axios/lib/core/settle.js +27 -0
  985. package/.output/server/node_modules/axios/lib/core/transformData.js +28 -0
  986. package/.output/server/node_modules/axios/lib/defaults/index.js +177 -0
  987. package/.output/server/node_modules/axios/lib/defaults/transitional.js +10 -0
  988. package/.output/server/node_modules/axios/lib/env/data.js +1 -0
  989. package/.output/server/node_modules/axios/lib/helpers/AxiosTransformStream.js +156 -0
  990. package/.output/server/node_modules/axios/lib/helpers/AxiosURLSearchParams.js +59 -0
  991. package/.output/server/node_modules/axios/lib/helpers/Http2Sessions.js +119 -0
  992. package/.output/server/node_modules/axios/lib/helpers/HttpStatusCode.js +78 -0
  993. package/.output/server/node_modules/axios/lib/helpers/ZlibHeaderTransformStream.js +29 -0
  994. package/.output/server/node_modules/axios/lib/helpers/bind.js +14 -0
  995. package/.output/server/node_modules/axios/lib/helpers/buildURL.js +69 -0
  996. package/.output/server/node_modules/axios/lib/helpers/callbackify.js +18 -0
  997. package/.output/server/node_modules/axios/lib/helpers/combineURLs.js +23 -0
  998. package/.output/server/node_modules/axios/lib/helpers/composeSignals.js +68 -0
  999. package/.output/server/node_modules/axios/lib/helpers/cookies.js +64 -0
  1000. package/.output/server/node_modules/axios/lib/helpers/estimateDataURLDecodedBytes.js +166 -0
  1001. package/.output/server/node_modules/axios/lib/helpers/formDataToJSON.js +125 -0
  1002. package/.output/server/node_modules/axios/lib/helpers/formDataToStream.js +119 -0
  1003. package/.output/server/node_modules/axios/lib/helpers/fromDataURI.js +68 -0
  1004. package/.output/server/node_modules/axios/lib/helpers/isAbsoluteURL.js +19 -0
  1005. package/.output/server/node_modules/axios/lib/helpers/isAxiosError.js +14 -0
  1006. package/.output/server/node_modules/axios/lib/helpers/isURLSameOrigin.js +16 -0
  1007. package/.output/server/node_modules/axios/lib/helpers/parseHeaders.js +71 -0
  1008. package/.output/server/node_modules/axios/lib/helpers/parseProtocol.js +6 -0
  1009. package/.output/server/node_modules/axios/lib/helpers/progressEventReducer.js +54 -0
  1010. package/.output/server/node_modules/axios/lib/helpers/readBlob.js +15 -0
  1011. package/.output/server/node_modules/axios/lib/helpers/resolveConfig.js +105 -0
  1012. package/.output/server/node_modules/axios/lib/helpers/sanitizeHeaderValue.js +60 -0
  1013. package/.output/server/node_modules/axios/lib/helpers/shouldBypassProxy.js +329 -0
  1014. package/.output/server/node_modules/axios/lib/helpers/speedometer.js +55 -0
  1015. package/.output/server/node_modules/axios/lib/helpers/spread.js +28 -0
  1016. package/.output/server/node_modules/axios/lib/helpers/throttle.js +44 -0
  1017. package/.output/server/node_modules/axios/lib/helpers/toFormData.js +286 -0
  1018. package/.output/server/node_modules/axios/lib/helpers/toURLEncodedForm.js +19 -0
  1019. package/.output/server/node_modules/axios/lib/helpers/trackStream.js +89 -0
  1020. package/.output/server/node_modules/axios/lib/helpers/validator.js +112 -0
  1021. package/.output/server/node_modules/axios/lib/platform/common/utils.js +52 -0
  1022. package/.output/server/node_modules/axios/lib/platform/index.js +7 -0
  1023. package/.output/server/node_modules/axios/lib/platform/node/classes/Buffer.js +11 -0
  1024. package/.output/server/node_modules/axios/lib/platform/node/classes/FormData.js +3 -0
  1025. package/.output/server/node_modules/axios/lib/platform/node/classes/URLSearchParams.js +4 -0
  1026. package/.output/server/node_modules/axios/lib/platform/node/index.js +37 -0
  1027. package/.output/server/node_modules/axios/lib/utils.js +1029 -0
  1028. package/.output/server/node_modules/axios/package.json +203 -0
  1029. package/.output/server/node_modules/birpc/dist/index.cjs +296 -0
  1030. package/.output/server/node_modules/birpc/package.json +57 -0
  1031. package/.output/server/node_modules/call-bind-apply-helpers/actualApply.js +10 -0
  1032. package/.output/server/node_modules/call-bind-apply-helpers/functionApply.js +4 -0
  1033. package/.output/server/node_modules/call-bind-apply-helpers/functionCall.js +4 -0
  1034. package/.output/server/node_modules/call-bind-apply-helpers/index.js +15 -0
  1035. package/.output/server/node_modules/call-bind-apply-helpers/package.json +85 -0
  1036. package/.output/server/node_modules/call-bind-apply-helpers/reflectApply.js +4 -0
  1037. package/.output/server/node_modules/case-anything/dist/core.js +242 -0
  1038. package/.output/server/node_modules/case-anything/dist/index.js +1 -0
  1039. package/.output/server/node_modules/case-anything/dist/utils.js +90 -0
  1040. package/.output/server/node_modules/case-anything/package.json +61 -0
  1041. package/.output/server/node_modules/combined-stream/lib/combined_stream.js +208 -0
  1042. package/.output/server/node_modules/combined-stream/package.json +25 -0
  1043. package/.output/server/node_modules/content-type/index.js +225 -0
  1044. package/.output/server/node_modules/content-type/package.json +42 -0
  1045. package/.output/server/node_modules/debug/package.json +64 -0
  1046. package/.output/server/node_modules/debug/src/browser.js +272 -0
  1047. package/.output/server/node_modules/debug/src/common.js +292 -0
  1048. package/.output/server/node_modules/debug/src/index.js +10 -0
  1049. package/.output/server/node_modules/debug/src/node.js +263 -0
  1050. package/.output/server/node_modules/delayed-stream/lib/delayed_stream.js +107 -0
  1051. package/.output/server/node_modules/delayed-stream/package.json +27 -0
  1052. package/.output/server/node_modules/devalue/index.js +17 -0
  1053. package/.output/server/node_modules/devalue/package.json +39 -0
  1054. package/.output/server/node_modules/devalue/src/base64.js +60 -0
  1055. package/.output/server/node_modules/devalue/src/constants.js +12 -0
  1056. package/.output/server/node_modules/devalue/src/operations.js +193 -0
  1057. package/.output/server/node_modules/devalue/src/parse.js +270 -0
  1058. package/.output/server/node_modules/devalue/src/stringify.js +428 -0
  1059. package/.output/server/node_modules/devalue/src/uneval.js +582 -0
  1060. package/.output/server/node_modules/devalue/src/utils.js +185 -0
  1061. package/.output/server/node_modules/dunder-proto/get.js +30 -0
  1062. package/.output/server/node_modules/dunder-proto/package.json +76 -0
  1063. package/.output/server/node_modules/entities/dist/commonjs/decode-codepoint.js +77 -0
  1064. package/.output/server/node_modules/entities/dist/commonjs/decode.js +568 -0
  1065. package/.output/server/node_modules/entities/dist/commonjs/generated/decode-data-html.js +7 -0
  1066. package/.output/server/node_modules/entities/dist/commonjs/generated/decode-data-xml.js +7 -0
  1067. package/.output/server/node_modules/entities/dist/commonjs/internal/bin-trie-flags.js +21 -0
  1068. package/.output/server/node_modules/entities/dist/commonjs/internal/decode-shared.js +31 -0
  1069. package/.output/server/node_modules/entities/dist/commonjs/package.json +3 -0
  1070. package/.output/server/node_modules/entities/package.json +120 -0
  1071. package/.output/server/node_modules/es-define-property/index.js +14 -0
  1072. package/.output/server/node_modules/es-define-property/package.json +81 -0
  1073. package/.output/server/node_modules/es-errors/eval.js +4 -0
  1074. package/.output/server/node_modules/es-errors/index.js +4 -0
  1075. package/.output/server/node_modules/es-errors/package.json +80 -0
  1076. package/.output/server/node_modules/es-errors/range.js +4 -0
  1077. package/.output/server/node_modules/es-errors/ref.js +4 -0
  1078. package/.output/server/node_modules/es-errors/syntax.js +4 -0
  1079. package/.output/server/node_modules/es-errors/type.js +4 -0
  1080. package/.output/server/node_modules/es-errors/uri.js +4 -0
  1081. package/.output/server/node_modules/es-object-atoms/index.js +4 -0
  1082. package/.output/server/node_modules/es-object-atoms/package.json +79 -0
  1083. package/.output/server/node_modules/es-set-tostringtag/index.js +35 -0
  1084. package/.output/server/node_modules/es-set-tostringtag/package.json +78 -0
  1085. package/.output/server/node_modules/estree-walker/dist/umd/estree-walker.js +344 -0
  1086. package/.output/server/node_modules/estree-walker/package.json +37 -0
  1087. package/.output/server/node_modules/fast-deep-equal/index.js +46 -0
  1088. package/.output/server/node_modules/fast-deep-equal/package.json +61 -0
  1089. package/.output/server/node_modules/fast-uri/index.js +459 -0
  1090. package/.output/server/node_modules/fast-uri/lib/schemes.js +267 -0
  1091. package/.output/server/node_modules/fast-uri/lib/utils.js +443 -0
  1092. package/.output/server/node_modules/fast-uri/package.json +68 -0
  1093. package/.output/server/node_modules/flattie/dist/index.mjs +25 -0
  1094. package/.output/server/node_modules/flattie/package.json +48 -0
  1095. package/.output/server/node_modules/follow-redirects/debug.js +15 -0
  1096. package/.output/server/node_modules/follow-redirects/index.js +709 -0
  1097. package/.output/server/node_modules/follow-redirects/package.json +58 -0
  1098. package/.output/server/node_modules/form-data/lib/form_data.js +506 -0
  1099. package/.output/server/node_modules/form-data/lib/populate.js +10 -0
  1100. package/.output/server/node_modules/form-data/package.json +82 -0
  1101. package/.output/server/node_modules/function-bind/implementation.js +84 -0
  1102. package/.output/server/node_modules/function-bind/index.js +5 -0
  1103. package/.output/server/node_modules/function-bind/package.json +87 -0
  1104. package/.output/server/node_modules/get-intrinsic/index.js +378 -0
  1105. package/.output/server/node_modules/get-intrinsic/package.json +97 -0
  1106. package/.output/server/node_modules/get-proto/Object.getPrototypeOf.js +6 -0
  1107. package/.output/server/node_modules/get-proto/Reflect.getPrototypeOf.js +4 -0
  1108. package/.output/server/node_modules/get-proto/index.js +27 -0
  1109. package/.output/server/node_modules/get-proto/package.json +81 -0
  1110. package/.output/server/node_modules/gopd/gOPD.js +4 -0
  1111. package/.output/server/node_modules/gopd/index.js +15 -0
  1112. package/.output/server/node_modules/gopd/package.json +77 -0
  1113. package/.output/server/node_modules/has-flag/index.js +8 -0
  1114. package/.output/server/node_modules/has-flag/package.json +46 -0
  1115. package/.output/server/node_modules/has-symbols/index.js +14 -0
  1116. package/.output/server/node_modules/has-symbols/package.json +111 -0
  1117. package/.output/server/node_modules/has-symbols/shams.js +45 -0
  1118. package/.output/server/node_modules/has-tostringtag/package.json +108 -0
  1119. package/.output/server/node_modules/has-tostringtag/shams.js +8 -0
  1120. package/.output/server/node_modules/hasown/index.js +8 -0
  1121. package/.output/server/node_modules/hasown/package.json +91 -0
  1122. package/.output/server/node_modules/https-proxy-agent/dist/agent.js +177 -0
  1123. package/.output/server/node_modules/https-proxy-agent/dist/index.js +14 -0
  1124. package/.output/server/node_modules/https-proxy-agent/dist/parse-proxy-response.js +66 -0
  1125. package/.output/server/node_modules/https-proxy-agent/package.json +56 -0
  1126. package/.output/server/node_modules/jose/dist/webapi/index.js +32 -0
  1127. package/.output/server/node_modules/jose/dist/webapi/jwe/compact/decrypt.js +9 -0
  1128. package/.output/server/node_modules/jose/dist/webapi/jwe/compact/encrypt.js +27 -0
  1129. package/.output/server/node_modules/jose/dist/webapi/jwe/flattened/decrypt.js +11 -0
  1130. package/.output/server/node_modules/jose/dist/webapi/jwe/flattened/encrypt.js +72 -0
  1131. package/.output/server/node_modules/jose/dist/webapi/jwe/general/decrypt.js +51 -0
  1132. package/.output/server/node_modules/jose/dist/webapi/jwe/general/encrypt.js +166 -0
  1133. package/.output/server/node_modules/jose/dist/webapi/jwk/embedded.js +19 -0
  1134. package/.output/server/node_modules/jose/dist/webapi/jwk/thumbprint.js +68 -0
  1135. package/.output/server/node_modules/jose/dist/webapi/jwks/local.js +78 -0
  1136. package/.output/server/node_modules/jose/dist/webapi/jwks/remote.js +170 -0
  1137. package/.output/server/node_modules/jose/dist/webapi/jws/compact/sign.js +21 -0
  1138. package/.output/server/node_modules/jose/dist/webapi/jws/compact/verify.js +9 -0
  1139. package/.output/server/node_modules/jose/dist/webapi/jws/flattened/sign.js +31 -0
  1140. package/.output/server/node_modules/jose/dist/webapi/jws/flattened/verify.js +24 -0
  1141. package/.output/server/node_modules/jose/dist/webapi/jws/general/sign.js +74 -0
  1142. package/.output/server/node_modules/jose/dist/webapi/jws/general/verify.js +44 -0
  1143. package/.output/server/node_modules/jose/dist/webapi/jwt/decrypt.js +23 -0
  1144. package/.output/server/node_modules/jose/dist/webapi/jwt/encrypt.js +101 -0
  1145. package/.output/server/node_modules/jose/dist/webapi/jwt/sign.js +51 -0
  1146. package/.output/server/node_modules/jose/dist/webapi/jwt/unsecured.js +64 -0
  1147. package/.output/server/node_modules/jose/dist/webapi/jwt/verify.js +15 -0
  1148. package/.output/server/node_modules/jose/dist/webapi/key/export.js +44 -0
  1149. package/.output/server/node_modules/jose/dist/webapi/key/generate_key_pair.js +48 -0
  1150. package/.output/server/node_modules/jose/dist/webapi/key/generate_secret.js +40 -0
  1151. package/.output/server/node_modules/jose/dist/webapi/key/import.js +57 -0
  1152. package/.output/server/node_modules/jose/dist/webapi/lib/asn1.js +174 -0
  1153. package/.output/server/node_modules/jose/dist/webapi/lib/base64.js +22 -0
  1154. package/.output/server/node_modules/jose/dist/webapi/lib/buffer_utils.js +44 -0
  1155. package/.output/server/node_modules/jose/dist/webapi/lib/content_encryption.js +142 -0
  1156. package/.output/server/node_modules/jose/dist/webapi/lib/crypto_key.js +28 -0
  1157. package/.output/server/node_modules/jose/dist/webapi/lib/deflate.js +44 -0
  1158. package/.output/server/node_modules/jose/dist/webapi/lib/helpers.js +42 -0
  1159. package/.output/server/node_modules/jose/dist/webapi/lib/invalid_key_input.js +26 -0
  1160. package/.output/server/node_modules/jose/dist/webapi/lib/is_key_like.js +17 -0
  1161. package/.output/server/node_modules/jose/dist/webapi/lib/jwe_algorithms.js +107 -0
  1162. package/.output/server/node_modules/jose/dist/webapi/lib/jwe_decrypt.js +186 -0
  1163. package/.output/server/node_modules/jose/dist/webapi/lib/jwe_encrypt.js +110 -0
  1164. package/.output/server/node_modules/jose/dist/webapi/lib/jwk_to_key.js +17 -0
  1165. package/.output/server/node_modules/jose/dist/webapi/lib/jws_algorithms.js +73 -0
  1166. package/.output/server/node_modules/jose/dist/webapi/lib/jws_sign.js +74 -0
  1167. package/.output/server/node_modules/jose/dist/webapi/lib/jws_verify.js +107 -0
  1168. package/.output/server/node_modules/jose/dist/webapi/lib/jwt_claims_set.js +197 -0
  1169. package/.output/server/node_modules/jose/dist/webapi/lib/key.js +132 -0
  1170. package/.output/server/node_modules/jose/dist/webapi/lib/key_algorithm.js +10 -0
  1171. package/.output/server/node_modules/jose/dist/webapi/lib/key_descriptor.js +7 -0
  1172. package/.output/server/node_modules/jose/dist/webapi/lib/key_management.js +256 -0
  1173. package/.output/server/node_modules/jose/dist/webapi/lib/options.js +48 -0
  1174. package/.output/server/node_modules/jose/dist/webapi/lib/signing.js +26 -0
  1175. package/.output/server/node_modules/jose/dist/webapi/lib/type_checks.js +35 -0
  1176. package/.output/server/node_modules/jose/dist/webapi/util/base64url.js +39 -0
  1177. package/.output/server/node_modules/jose/dist/webapi/util/decode_jwt.js +32 -0
  1178. package/.output/server/node_modules/jose/dist/webapi/util/decode_protected_header.js +24 -0
  1179. package/.output/server/node_modules/jose/dist/webapi/util/errors.js +99 -0
  1180. package/.output/server/node_modules/jose/package.json +198 -0
  1181. package/.output/server/node_modules/js-yaml/dist/js-yaml.mjs +3074 -0
  1182. package/.output/server/node_modules/js-yaml/package.json +83 -0
  1183. package/.output/server/node_modules/json-schema-traverse/index.js +93 -0
  1184. package/.output/server/node_modules/json-schema-traverse/package.json +43 -0
  1185. package/.output/server/node_modules/math-intrinsics/abs.js +4 -0
  1186. package/.output/server/node_modules/math-intrinsics/floor.js +4 -0
  1187. package/.output/server/node_modules/math-intrinsics/isNaN.js +6 -0
  1188. package/.output/server/node_modules/math-intrinsics/max.js +4 -0
  1189. package/.output/server/node_modules/math-intrinsics/min.js +4 -0
  1190. package/.output/server/node_modules/math-intrinsics/package.json +86 -0
  1191. package/.output/server/node_modules/math-intrinsics/pow.js +4 -0
  1192. package/.output/server/node_modules/math-intrinsics/round.js +4 -0
  1193. package/.output/server/node_modules/math-intrinsics/sign.js +11 -0
  1194. package/.output/server/node_modules/mime-db/db.json +8519 -0
  1195. package/.output/server/node_modules/mime-db/index.js +12 -0
  1196. package/.output/server/node_modules/mime-db/package.json +60 -0
  1197. package/.output/server/node_modules/mime-types/index.js +188 -0
  1198. package/.output/server/node_modules/mime-types/package.json +44 -0
  1199. package/.output/server/node_modules/ms/index.js +162 -0
  1200. package/.output/server/node_modules/ms/package.json +38 -0
  1201. package/.output/server/node_modules/nostics/dist/formatters/ansi.mjs +19 -0
  1202. package/.output/server/node_modules/nostics/dist/index.mjs +187 -0
  1203. package/.output/server/node_modules/nostics/package.json +125 -0
  1204. package/.output/server/node_modules/oauth4webapi/build/index.js +2506 -0
  1205. package/.output/server/node_modules/oauth4webapi/package.json +105 -0
  1206. package/.output/server/node_modules/openid-client/build/index.js +1357 -0
  1207. package/.output/server/node_modules/openid-client/package.json +122 -0
  1208. package/.output/server/node_modules/perfect-debounce/dist/index.cjs +59 -0
  1209. package/.output/server/node_modules/perfect-debounce/package.json +44 -0
  1210. package/.output/server/node_modules/pinia/dist/pinia.prod.cjs +719 -0
  1211. package/.output/server/node_modules/pinia/package.json +94 -0
  1212. package/.output/server/node_modules/pluralize/package.json +40 -0
  1213. package/.output/server/node_modules/pluralize/pluralize.js +503 -0
  1214. package/.output/server/node_modules/proxy-from-env/index.js +103 -0
  1215. package/.output/server/node_modules/proxy-from-env/package.json +46 -0
  1216. package/.output/server/node_modules/safe-stable-stringify/esm/package.json +4 -0
  1217. package/.output/server/node_modules/safe-stable-stringify/esm/wrapper.js +6 -0
  1218. package/.output/server/node_modules/safe-stable-stringify/index.js +625 -0
  1219. package/.output/server/node_modules/safe-stable-stringify/package.json +65 -0
  1220. package/.output/server/node_modules/secure-json-parse/index.js +161 -0
  1221. package/.output/server/node_modules/secure-json-parse/package.json +74 -0
  1222. package/.output/server/node_modules/slugify/package.json +42 -0
  1223. package/.output/server/node_modules/slugify/slugify.js +69 -0
  1224. package/.output/server/node_modules/source-map-js/lib/array-set.js +121 -0
  1225. package/.output/server/node_modules/source-map-js/lib/base64-vlq.js +140 -0
  1226. package/.output/server/node_modules/source-map-js/lib/base64.js +67 -0
  1227. package/.output/server/node_modules/source-map-js/lib/binary-search.js +111 -0
  1228. package/.output/server/node_modules/source-map-js/lib/mapping-list.js +79 -0
  1229. package/.output/server/node_modules/source-map-js/lib/quick-sort.js +132 -0
  1230. package/.output/server/node_modules/source-map-js/lib/source-map-consumer.js +1188 -0
  1231. package/.output/server/node_modules/source-map-js/lib/source-map-generator.js +444 -0
  1232. package/.output/server/node_modules/source-map-js/lib/source-node.js +413 -0
  1233. package/.output/server/node_modules/source-map-js/lib/util.js +594 -0
  1234. package/.output/server/node_modules/source-map-js/package.json +71 -0
  1235. package/.output/server/node_modules/source-map-js/source-map.js +8 -0
  1236. package/.output/server/node_modules/supports-color/index.js +135 -0
  1237. package/.output/server/node_modules/supports-color/package.json +53 -0
  1238. package/.output/server/node_modules/three/build/three.cjs +80028 -0
  1239. package/.output/server/node_modules/three/build/three.core.js +60007 -0
  1240. package/.output/server/node_modules/three/build/three.module.js +19610 -0
  1241. package/.output/server/node_modules/three/examples/jsm/environments/RoomEnvironment.js +185 -0
  1242. package/.output/server/node_modules/three/examples/jsm/loaders/GLTFLoader.js +4860 -0
  1243. package/.output/server/node_modules/three/examples/jsm/utils/BufferGeometryUtils.js +1501 -0
  1244. package/.output/server/node_modules/three/examples/jsm/utils/SkeletonUtils.js +496 -0
  1245. package/.output/server/node_modules/three/package.json +123 -0
  1246. package/.output/server/node_modules/ufo/dist/index.mjs +645 -0
  1247. package/.output/server/node_modules/ufo/package.json +48 -0
  1248. package/.output/server/node_modules/unhead/dist/client.mjs +22 -0
  1249. package/.output/server/node_modules/unhead/dist/index.mjs +52 -0
  1250. package/.output/server/node_modules/unhead/dist/legacy.mjs +33 -0
  1251. package/.output/server/node_modules/unhead/dist/minify.mjs +172 -0
  1252. package/.output/server/node_modules/unhead/dist/parser.mjs +518 -0
  1253. package/.output/server/node_modules/unhead/dist/plugins.mjs +631 -0
  1254. package/.output/server/node_modules/unhead/dist/scripts.node.mjs +6 -0
  1255. package/.output/server/node_modules/unhead/dist/server.mjs +99 -0
  1256. package/.output/server/node_modules/unhead/dist/shared/unhead.10KEJHqy.mjs +184 -0
  1257. package/.output/server/node_modules/unhead/dist/shared/unhead.BCcw-xUY.mjs +19 -0
  1258. package/.output/server/node_modules/unhead/dist/shared/unhead.BEmVMkeA.mjs +673 -0
  1259. package/.output/server/node_modules/unhead/dist/shared/unhead.BGFxPGPQ.mjs +47 -0
  1260. package/.output/server/node_modules/unhead/dist/shared/unhead.BTzUdyNs.mjs +194 -0
  1261. package/.output/server/node_modules/unhead/dist/shared/unhead.Bb4d5b9h.mjs +67 -0
  1262. package/.output/server/node_modules/unhead/dist/shared/unhead.Bf_fPVYA.mjs +6 -0
  1263. package/.output/server/node_modules/unhead/dist/shared/unhead.Bm4Y6XQI.mjs +17 -0
  1264. package/.output/server/node_modules/unhead/dist/shared/unhead.BuspQZgK.mjs +231 -0
  1265. package/.output/server/node_modules/unhead/dist/shared/unhead.CGPOfp5O.mjs +32 -0
  1266. package/.output/server/node_modules/unhead/dist/shared/unhead.CHEy9ana.mjs +7 -0
  1267. package/.output/server/node_modules/unhead/dist/shared/unhead.CTjuIdzk.mjs +27 -0
  1268. package/.output/server/node_modules/unhead/dist/shared/unhead.D7HkBzZn.mjs +59 -0
  1269. package/.output/server/node_modules/unhead/dist/shared/unhead.DNKiVLV7.mjs +400 -0
  1270. package/.output/server/node_modules/unhead/dist/shared/unhead.JIneUUHd.mjs +264 -0
  1271. package/.output/server/node_modules/unhead/dist/shared/unhead.q9F_9EzH.mjs +588 -0
  1272. package/.output/server/node_modules/unhead/dist/shared/unhead.sGLr_XKf.mjs +201 -0
  1273. package/.output/server/node_modules/unhead/dist/stream/client.mjs +28 -0
  1274. package/.output/server/node_modules/unhead/dist/stream/iife.mjs +2 -0
  1275. package/.output/server/node_modules/unhead/dist/stream/server.mjs +264 -0
  1276. package/.output/server/node_modules/unhead/dist/utils.mjs +7 -0
  1277. package/.output/server/node_modules/unhead/package.json +179 -0
  1278. package/.output/server/node_modules/vue/dist/vue.cjs.js +80 -0
  1279. package/.output/server/node_modules/vue/dist/vue.cjs.prod.js +66 -0
  1280. package/.output/server/node_modules/vue/index.js +7 -0
  1281. package/.output/server/node_modules/vue/index.mjs +1 -0
  1282. package/.output/server/node_modules/vue/package.json +112 -0
  1283. package/.output/server/node_modules/vue/server-renderer/index.mjs +1 -0
  1284. package/.output/server/node_modules/vue-bundle-renderer/dist/runtime.mjs +278 -0
  1285. package/.output/server/node_modules/vue-bundle-renderer/package.json +54 -0
  1286. package/.output/server/node_modules/vue-router/dist/devtools-EWN81iOl.mjs +1220 -0
  1287. package/.output/server/node_modules/vue-router/dist/vue-router.mjs +1557 -0
  1288. package/.output/server/node_modules/vue-router/package.json +153 -0
  1289. package/.output/server/node_modules/vue-router/vue-router.node.mjs +2 -0
  1290. package/.output/server/node_modules/zod/index.js +4 -0
  1291. package/.output/server/node_modules/zod/package.json +118 -0
  1292. package/.output/server/node_modules/zod/v3/ZodError.js +133 -0
  1293. package/.output/server/node_modules/zod/v3/errors.js +9 -0
  1294. package/.output/server/node_modules/zod/v3/external.js +6 -0
  1295. package/.output/server/node_modules/zod/v3/helpers/errorUtil.js +6 -0
  1296. package/.output/server/node_modules/zod/v3/helpers/parseUtil.js +109 -0
  1297. package/.output/server/node_modules/zod/v3/helpers/typeAliases.js +1 -0
  1298. package/.output/server/node_modules/zod/v3/helpers/util.js +133 -0
  1299. package/.output/server/node_modules/zod/v3/index.js +4 -0
  1300. package/.output/server/node_modules/zod/v3/locales/en.js +109 -0
  1301. package/.output/server/node_modules/zod/v3/types.js +3693 -0
  1302. package/.output/server/node_modules/zod/v4/classic/checks.js +1 -0
  1303. package/.output/server/node_modules/zod/v4/classic/coerce.js +17 -0
  1304. package/.output/server/node_modules/zod/v4/classic/compat.js +27 -0
  1305. package/.output/server/node_modules/zod/v4/classic/errors.js +41 -0
  1306. package/.output/server/node_modules/zod/v4/classic/external.js +18 -0
  1307. package/.output/server/node_modules/zod/v4/classic/index.js +4 -0
  1308. package/.output/server/node_modules/zod/v4/classic/iso.js +30 -0
  1309. package/.output/server/node_modules/zod/v4/classic/parse.js +6 -0
  1310. package/.output/server/node_modules/zod/v4/classic/schemas.js +1006 -0
  1311. package/.output/server/node_modules/zod/v4/core/api.js +906 -0
  1312. package/.output/server/node_modules/zod/v4/core/checks.js +565 -0
  1313. package/.output/server/node_modules/zod/v4/core/core.js +61 -0
  1314. package/.output/server/node_modules/zod/v4/core/doc.js +35 -0
  1315. package/.output/server/node_modules/zod/v4/core/errors.js +195 -0
  1316. package/.output/server/node_modules/zod/v4/core/function.js +75 -0
  1317. package/.output/server/node_modules/zod/v4/core/index.js +15 -0
  1318. package/.output/server/node_modules/zod/v4/core/json-schema.js +1 -0
  1319. package/.output/server/node_modules/zod/v4/core/parse.js +57 -0
  1320. package/.output/server/node_modules/zod/v4/core/regexes.js +95 -0
  1321. package/.output/server/node_modules/zod/v4/core/registries.js +51 -0
  1322. package/.output/server/node_modules/zod/v4/core/schemas.js +1717 -0
  1323. package/.output/server/node_modules/zod/v4/core/to-json-schema.js +849 -0
  1324. package/.output/server/node_modules/zod/v4/core/util.js +493 -0
  1325. package/.output/server/node_modules/zod/v4/core/versions.js +5 -0
  1326. package/.output/server/node_modules/zod/v4/index.js +3 -0
  1327. package/.output/server/node_modules/zod/v4/locales/ar.js +116 -0
  1328. package/.output/server/node_modules/zod/v4/locales/az.js +115 -0
  1329. package/.output/server/node_modules/zod/v4/locales/be.js +164 -0
  1330. package/.output/server/node_modules/zod/v4/locales/ca.js +118 -0
  1331. package/.output/server/node_modules/zod/v4/locales/cs.js +135 -0
  1332. package/.output/server/node_modules/zod/v4/locales/de.js +116 -0
  1333. package/.output/server/node_modules/zod/v4/locales/en.js +117 -0
  1334. package/.output/server/node_modules/zod/v4/locales/eo.js +116 -0
  1335. package/.output/server/node_modules/zod/v4/locales/es.js +117 -0
  1336. package/.output/server/node_modules/zod/v4/locales/fa.js +122 -0
  1337. package/.output/server/node_modules/zod/v4/locales/fi.js +122 -0
  1338. package/.output/server/node_modules/zod/v4/locales/fr-CA.js +117 -0
  1339. package/.output/server/node_modules/zod/v4/locales/fr.js +116 -0
  1340. package/.output/server/node_modules/zod/v4/locales/he.js +117 -0
  1341. package/.output/server/node_modules/zod/v4/locales/hu.js +117 -0
  1342. package/.output/server/node_modules/zod/v4/locales/id.js +116 -0
  1343. package/.output/server/node_modules/zod/v4/locales/index.js +39 -0
  1344. package/.output/server/node_modules/zod/v4/locales/it.js +117 -0
  1345. package/.output/server/node_modules/zod/v4/locales/ja.js +115 -0
  1346. package/.output/server/node_modules/zod/v4/locales/kh.js +117 -0
  1347. package/.output/server/node_modules/zod/v4/locales/ko.js +121 -0
  1348. package/.output/server/node_modules/zod/v4/locales/mk.js +118 -0
  1349. package/.output/server/node_modules/zod/v4/locales/ms.js +116 -0
  1350. package/.output/server/node_modules/zod/v4/locales/nl.js +117 -0
  1351. package/.output/server/node_modules/zod/v4/locales/no.js +116 -0
  1352. package/.output/server/node_modules/zod/v4/locales/ota.js +117 -0
  1353. package/.output/server/node_modules/zod/v4/locales/pl.js +117 -0
  1354. package/.output/server/node_modules/zod/v4/locales/ps.js +122 -0
  1355. package/.output/server/node_modules/zod/v4/locales/pt.js +116 -0
  1356. package/.output/server/node_modules/zod/v4/locales/ru.js +164 -0
  1357. package/.output/server/node_modules/zod/v4/locales/sl.js +117 -0
  1358. package/.output/server/node_modules/zod/v4/locales/sv.js +118 -0
  1359. package/.output/server/node_modules/zod/v4/locales/ta.js +117 -0
  1360. package/.output/server/node_modules/zod/v4/locales/th.js +117 -0
  1361. package/.output/server/node_modules/zod/v4/locales/tr.js +115 -0
  1362. package/.output/server/node_modules/zod/v4/locales/ua.js +117 -0
  1363. package/.output/server/node_modules/zod/v4/locales/ur.js +117 -0
  1364. package/.output/server/node_modules/zod/v4/locales/vi.js +116 -0
  1365. package/.output/server/node_modules/zod/v4/locales/zh-CN.js +116 -0
  1366. package/.output/server/node_modules/zod/v4/locales/zh-TW.js +117 -0
  1367. package/.output/server/node_modules/zod/v4/mini/checks.js +1 -0
  1368. package/.output/server/node_modules/zod/v4/mini/coerce.js +17 -0
  1369. package/.output/server/node_modules/zod/v4/mini/external.js +13 -0
  1370. package/.output/server/node_modules/zod/v4/mini/index.js +3 -0
  1371. package/.output/server/node_modules/zod/v4/mini/iso.js +30 -0
  1372. package/.output/server/node_modules/zod/v4/mini/parse.js +1 -0
  1373. package/.output/server/node_modules/zod/v4/mini/schemas.js +732 -0
  1374. package/.output/server/node_modules/zod/v4-mini/index.js +1 -0
  1375. package/.output/server/node_modules/zod-to-json-schema/dist/esm/Options.js +46 -0
  1376. package/.output/server/node_modules/zod-to-json-schema/dist/esm/Refs.js +22 -0
  1377. package/.output/server/node_modules/zod-to-json-schema/dist/esm/errorMessages.js +14 -0
  1378. package/.output/server/node_modules/zod-to-json-schema/dist/esm/getRelativePath.js +8 -0
  1379. package/.output/server/node_modules/zod-to-json-schema/dist/esm/index.js +40 -0
  1380. package/.output/server/node_modules/zod-to-json-schema/dist/esm/package.json +1 -0
  1381. package/.output/server/node_modules/zod-to-json-schema/dist/esm/parseDef.js +62 -0
  1382. package/.output/server/node_modules/zod-to-json-schema/dist/esm/parseTypes.js +1 -0
  1383. package/.output/server/node_modules/zod-to-json-schema/dist/esm/parsers/any.js +17 -0
  1384. package/.output/server/node_modules/zod-to-json-schema/dist/esm/parsers/array.js +26 -0
  1385. package/.output/server/node_modules/zod-to-json-schema/dist/esm/parsers/bigint.js +49 -0
  1386. package/.output/server/node_modules/zod-to-json-schema/dist/esm/parsers/boolean.js +5 -0
  1387. package/.output/server/node_modules/zod-to-json-schema/dist/esm/parsers/branded.js +4 -0
  1388. package/.output/server/node_modules/zod-to-json-schema/dist/esm/parsers/catch.js +4 -0
  1389. package/.output/server/node_modules/zod-to-json-schema/dist/esm/parsers/date.js +46 -0
  1390. package/.output/server/node_modules/zod-to-json-schema/dist/esm/parsers/default.js +7 -0
  1391. package/.output/server/node_modules/zod-to-json-schema/dist/esm/parsers/effects.js +7 -0
  1392. package/.output/server/node_modules/zod-to-json-schema/dist/esm/parsers/enum.js +6 -0
  1393. package/.output/server/node_modules/zod-to-json-schema/dist/esm/parsers/intersection.js +52 -0
  1394. package/.output/server/node_modules/zod-to-json-schema/dist/esm/parsers/literal.js +21 -0
  1395. package/.output/server/node_modules/zod-to-json-schema/dist/esm/parsers/map.js +26 -0
  1396. package/.output/server/node_modules/zod-to-json-schema/dist/esm/parsers/nativeEnum.js +16 -0
  1397. package/.output/server/node_modules/zod-to-json-schema/dist/esm/parsers/never.js +11 -0
  1398. package/.output/server/node_modules/zod-to-json-schema/dist/esm/parsers/null.js +10 -0
  1399. package/.output/server/node_modules/zod-to-json-schema/dist/esm/parsers/nullable.js +33 -0
  1400. package/.output/server/node_modules/zod-to-json-schema/dist/esm/parsers/number.js +52 -0
  1401. package/.output/server/node_modules/zod-to-json-schema/dist/esm/parsers/object.js +72 -0
  1402. package/.output/server/node_modules/zod-to-json-schema/dist/esm/parsers/optional.js +21 -0
  1403. package/.output/server/node_modules/zod-to-json-schema/dist/esm/parsers/pipeline.js +20 -0
  1404. package/.output/server/node_modules/zod-to-json-schema/dist/esm/parsers/promise.js +4 -0
  1405. package/.output/server/node_modules/zod-to-json-schema/dist/esm/parsers/readonly.js +4 -0
  1406. package/.output/server/node_modules/zod-to-json-schema/dist/esm/parsers/record.js +61 -0
  1407. package/.output/server/node_modules/zod-to-json-schema/dist/esm/parsers/set.js +20 -0
  1408. package/.output/server/node_modules/zod-to-json-schema/dist/esm/parsers/string.js +352 -0
  1409. package/.output/server/node_modules/zod-to-json-schema/dist/esm/parsers/tuple.js +32 -0
  1410. package/.output/server/node_modules/zod-to-json-schema/dist/esm/parsers/undefined.js +6 -0
  1411. package/.output/server/node_modules/zod-to-json-schema/dist/esm/parsers/union.js +80 -0
  1412. package/.output/server/node_modules/zod-to-json-schema/dist/esm/parsers/unknown.js +4 -0
  1413. package/.output/server/node_modules/zod-to-json-schema/dist/esm/selectParser.js +105 -0
  1414. package/.output/server/node_modules/zod-to-json-schema/dist/esm/zodToJsonSchema.js +87 -0
  1415. package/.output/server/node_modules/zod-to-json-schema/package.json +85 -0
  1416. package/.output/server/package.json +93 -0
  1417. package/cli/core/context.mjs +8 -4
  1418. package/package.json +2 -1
  1419. package/scripts/_dbg-full-feature-e2e.mjs +1 -1
  1420. package/server/data/daqs.json +75 -75
  1421. package/server/data/dcw-lines.json +14 -0
  1422. package/server/data/dcw-products.json +14 -0
  1423. package/server/data/dcw-rollback.json +222 -1
  1424. package/server/data/dcw-runs.json +54 -36
  1425. package/server/data/dcw-writes.json +96 -0
  1426. package/server/data/dcws.json +42 -0
  1427. package/server/data/line-runs.json +22 -22
  1428. package/server/services/workshop/agents/node-bindings.repo.ts +2 -2
  1429. package/shared/config/home.mjs +60 -15
@@ -0,0 +1,2671 @@
1
+ import { _ as _plugin_vue_export_helper_default, u as useI18n, a0 as useHttp } from '../virtual/entry.mjs';
2
+ import { u as useUserStore } from './user-CpVY4OAA.mjs';
3
+ import { u as useWorkspacesStore } from './workspaces-Dq-1zvu9.mjs';
4
+ import { s as setInterval } from './interval-Bt11uRPw.mjs';
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-CwORhsD7.mjs';
8
+ import { u as useDeviceTwins } from './useDeviceTwins-NhtXqSkU.mjs';
9
+ import { u as useEntitiesStore, a as useWorkshopWs } from './useWorkshopWs-Dwr_1Q8f.mjs';
10
+ import { shallowRef, ref, computed, toValue, watch, nextTick, defineComponent, reactive, mergeProps, unref, readonly, getCurrentScope, onScopeDispose, getCurrentInstance, toRef, customRef, useSSRContext } from 'vue';
11
+ import { ssrRenderAttrs, ssrInterpolate, ssrRenderAttr, ssrRenderClass, ssrIncludeBooleanAttr, ssrRenderComponent, ssrRenderList, ssrRenderStyle, ssrLooseContain, ssrLooseEqual } from 'vue/server-renderer';
12
+ import { aT as DAQ_TEMPLATES } from '../_/nitro.mjs';
13
+ import * as THREE from 'three';
14
+ import { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader.js';
15
+ import { RoomEnvironment } from 'three/examples/jsm/environments/RoomEnvironment.js';
16
+
17
+ function hashHue(id) {
18
+ if (!id) return 200;
19
+ let h = 0;
20
+ for (const c of id) h = (h * 31 + c.charCodeAt(0)) % 360;
21
+ return h;
22
+ }
23
+ const CHANNEL_HUES = [16, 40, 158, 178, 195, 212, 235, 262];
24
+ function channelColorCss(channelId) {
25
+ const h = CHANNEL_HUES[hashHue(channelId) % CHANNEL_HUES.length];
26
+ return `hsl(${h}, 52%, 60%)`;
27
+ }
28
+
29
+ function partsToText(parts) {
30
+ return parts.map((p) => {
31
+ var _a;
32
+ return "text" in p ? (_a = p.text) != null ? _a : "" : "data" in p ? JSON.stringify(p.data) : "";
33
+ }).join("\n").trim();
34
+ }
35
+ const truncate = (s, n) => s.length > n ? `${s.slice(0, n)}\u2026` : s;
36
+ function artifactName(a) {
37
+ var _a, _b;
38
+ return ((_a = a.name) == null ? void 0 : _a.trim()) ? a.name : ((_b = a.artifactId) != null ? _b : "").slice(0, 6);
39
+ }
40
+ function eventToBubble(e) {
41
+ var _a, _b, _c, _d, _e, _f;
42
+ switch (e.type) {
43
+ case "agent.message": {
44
+ const msg = e.payload;
45
+ const t = partsToText((_a = msg.parts) != null ? _a : []);
46
+ return t ? { channelId: e.channelId, agentId: e.agentId, kind: "info", text: truncate(t, 220), ttlMs: 3600 } : null;
47
+ }
48
+ case "agent.status.message": {
49
+ const text = String((_b = e.payload.text) != null ? _b : "");
50
+ if (!text) return null;
51
+ return { channelId: e.channelId, agentId: e.agentId, kind: "info", text: truncate(text, 220), ttlMs: 2600 };
52
+ }
53
+ case "a2a.message": {
54
+ const msg = e.payload;
55
+ const t = partsToText((_c = msg.parts) != null ? _c : []);
56
+ return t ? { channelId: e.channelId, agentId: e.agentId, kind: "info", text: truncate(t, 200), ttlMs: 3200 } : null;
57
+ }
58
+ case "a2a.artifact": {
59
+ const p = e.payload;
60
+ const a = p == null ? void 0 : p.artifact;
61
+ if (!a) return null;
62
+ const body = partsToText((_d = a.parts) != null ? _d : []);
63
+ return {
64
+ channelId: e.channelId,
65
+ agentId: e.agentId,
66
+ kind: "artifact",
67
+ text: `\u4EA4\u4ED8\u300C${artifactName(a)}\u300D${body ? ` \xB7 ${truncate(body, 120)}` : ""}`,
68
+ ttlMs: 3200
69
+ };
70
+ }
71
+ case "error": {
72
+ const p = e.payload;
73
+ return { channelId: e.channelId, agentId: e.agentId, kind: "error", text: `\u26A0 ${(_e = p.code) != null ? _e : "ERROR"} ${truncate((_f = p.message) != null ? _f : "", 160)}`, ttlMs: 4200 };
74
+ }
75
+ default:
76
+ return null;
77
+ }
78
+ }
79
+ function mapEnvelopeToIntent(e) {
80
+ const bubble = eventToBubble(e);
81
+ switch (e.type) {
82
+ case "agent.status":
83
+ case "agent.member":
84
+ case "task.status":
85
+ case "task.progress":
86
+ return { channelId: e.channelId, agentId: e.agentId, bubble: bubble != null ? bubble : void 0 };
87
+ case "agent.message":
88
+ case "agent.status.message":
89
+ case "a2a.message":
90
+ case "a2a.artifact":
91
+ case "error":
92
+ return { channelId: e.channelId, agentId: e.agentId, bubble: bubble != null ? bubble : void 0 };
93
+ default:
94
+ return null;
95
+ }
96
+ }
97
+
98
+ //#region app/composables/workshop/useCharacterAssets.ts
99
+ /**
100
+ * useCharacterAssets —— 角色模型库(前端注册表 + REST 拉取/上传/绑定)。
101
+ *
102
+ * 职责:
103
+ * - 拉取服务端资产清单(GET /api/workshop/assets/character)并 merge 内置约定模型;
104
+ * - 上传新模型(POST /api/workshop/assets/character,multipart);
105
+ * - 删除模型(引删保护 DELETE):仍被绑定 → 提示 used>0;
106
+ * - 绑定模型到某 Agent(PATCH /api/workshop/channels/:cid/agents/:agentId/model)。
107
+ * 单例挂 globalThis,跨组件安全;store 为 reactive(异步加载完成后驱动组件重渲染)。
108
+ */
109
+ var GLOBAL_KEY$1 = "__characterAssets";
110
+ function fromApi(a) {
111
+ return {
112
+ id: a.id,
113
+ name: a.name,
114
+ file: a.file,
115
+ frames: a.sheet?.frames ?? 4,
116
+ frameWidth: a.sheet?.frameWidth ?? 48,
117
+ frameHeight: a.sheet?.frameHeight ?? 88,
118
+ kind: a.kind === "glb" ? "glb" : a.kind === "dev" ? "dev" : "sheet",
119
+ builtin: a.author === "system",
120
+ applied: (a.appliedTo?.length ?? 0) > 0
121
+ };
122
+ }
123
+ function createStore$1() {
124
+ const models = [];
125
+ const builtins = [
126
+ {
127
+ id: "knight",
128
+ name: "灰羽骑士",
129
+ file: "/assets/game/character/knight.png",
130
+ frames: 4,
131
+ frameWidth: 48,
132
+ frameHeight: 88,
133
+ kind: "sheet",
134
+ builtin: true,
135
+ applied: false
136
+ },
137
+ {
138
+ id: "mage",
139
+ name: "紫晶法师",
140
+ file: "/assets/game/character/mage.png",
141
+ frames: 4,
142
+ frameWidth: 48,
143
+ frameHeight: 88,
144
+ kind: "sheet",
145
+ builtin: true,
146
+ applied: false
147
+ },
148
+ {
149
+ id: "bot",
150
+ name: "青枢机械",
151
+ file: "/assets/game/character/bot.png",
152
+ frames: 4,
153
+ frameWidth: 48,
154
+ frameHeight: 88,
155
+ kind: "sheet",
156
+ builtin: true,
157
+ applied: false
158
+ },
159
+ {
160
+ id: "hero-3d",
161
+ name: "标准员工模型",
162
+ file: "/assets/game/character/hero-3d.glb",
163
+ frames: 1,
164
+ frameWidth: 0,
165
+ frameHeight: 0,
166
+ kind: "glb",
167
+ builtin: true,
168
+ applied: false,
169
+ hint: "默认员工 3D 模型"
170
+ },
171
+ {
172
+ id: "device-3d",
173
+ name: "工业泵设备",
174
+ file: "/assets/game/character/device-3d.glb",
175
+ frames: 1,
176
+ frameWidth: 0,
177
+ frameHeight: 0,
178
+ kind: "dev",
179
+ builtin: true,
180
+ applied: false,
181
+ hint: "数字孪生实体模型(拖入场景生成设备)"
182
+ }
183
+ ];
184
+ const deviceFallbacks = [];
185
+ try {
186
+ const deviceModules = /* #__PURE__ */ Object.assign({});
187
+ for (const [key, url] of Object.entries(deviceModules)) {
188
+ const base = key.split("/").pop() ?? "";
189
+ const id = "dev-folder-" + base.replace(/\.glb$/i, "");
190
+ const servedFile = url.replace(/^\/public\//, "/");
191
+ deviceFallbacks.push({
192
+ id,
193
+ name: base.replace(/\.glb$/i, "").replace(/[-_]/g, " "),
194
+ file: servedFile,
195
+ frames: 1,
196
+ frameWidth: 0,
197
+ frameHeight: 0,
198
+ kind: "dev",
199
+ builtin: true,
200
+ applied: false,
201
+ hint: "设备实体(拖入场景生成数字孪生)"
202
+ });
203
+ }
204
+ } catch {}
205
+ const headers = (json = true) => {
206
+ const h = {};
207
+ if (json) h["content-type"] = "application/json";
208
+ return h;
209
+ };
210
+ const store = reactive({
211
+ models,
212
+ loaded: false,
213
+ loading: false,
214
+ error: "",
215
+ async load() {
216
+ if (store.loading || store.loaded) return;
217
+ store.loading = true;
218
+ try {
219
+ const [charRes, scanRes] = await Promise.allSettled([fetch("/api/workshop/assets/character", { headers: headers() }), fetch("/api/workshop/assets/devices", { headers: headers() })]);
220
+ const charJson = charRes.status === "fulfilled" ? await charRes.value.json().catch(() => ({})) : {};
221
+ const scanJson = scanRes.status === "fulfilled" ? await scanRes.value.json().catch(() => ({})) : {};
222
+ const apiAssets = charJson?.data?.assets ?? [];
223
+ const scannedDevices = (scanJson?.data?.devices ?? []).map((d) => ({
224
+ id: d.id,
225
+ name: d.name,
226
+ file: d.file,
227
+ frames: 1,
228
+ frameWidth: 0,
229
+ frameHeight: 0,
230
+ kind: "dev",
231
+ builtin: true,
232
+ applied: false,
233
+ hint: "设备实体(拖入场景生成数字孪生)",
234
+ hFactor: typeof d.defaultScale === "number" && d.defaultScale > 0 ? d.defaultScale : 1
235
+ }));
236
+ const builtinFiles = new Set(builtins.map((b) => b.file));
237
+ const scannedCharacters = (scanJson?.data?.characters ?? []).filter((d) => !builtinFiles.has(d.file)).map((d) => ({
238
+ id: d.id,
239
+ name: d.name,
240
+ file: d.file,
241
+ frames: 1,
242
+ frameWidth: 0,
243
+ frameHeight: 0,
244
+ kind: "glb",
245
+ builtin: true,
246
+ applied: false,
247
+ hint: "角色 3D 模型(在频道成员管理中设置)"
248
+ }));
249
+ const merged = [];
250
+ const seen = /* @__PURE__ */ new Set();
251
+ for (const a of apiAssets) {
252
+ merged.push(fromApi(a));
253
+ seen.add(a.id);
254
+ }
255
+ for (const d of scannedDevices) {
256
+ if (seen.has(d.id)) continue;
257
+ merged.push(d);
258
+ seen.add(d.id);
259
+ }
260
+ for (const c of scannedCharacters) {
261
+ if (seen.has(c.id)) continue;
262
+ merged.push(c);
263
+ seen.add(c.id);
264
+ }
265
+ for (const b of builtins) if (!seen.has(b.id)) merged.push(b);
266
+ for (const d of deviceFallbacks) if (!seen.has(d.id)) merged.push(d);
267
+ store.models.splice(0, store.models.length, ...merged);
268
+ store.loaded = true;
269
+ store.error = "";
270
+ } catch (err) {
271
+ store.loaded = false;
272
+ store.error = err instanceof Error ? err.message : String(err);
273
+ } finally {
274
+ store.loading = false;
275
+ }
276
+ },
277
+ byId(id) {
278
+ return models.find((m) => m.id === id);
279
+ },
280
+ async upload(file, opts) {
281
+ const fd = new FormData();
282
+ fd.append("file", file);
283
+ fd.append("name", opts.name ?? file.name.replace(/\.[^.]+$/, ""));
284
+ fd.append("workspaceId", opts.workspaceId ?? "");
285
+ fd.append("kind", opts.kind ?? "sheet");
286
+ fd.append("frameWidth", String(opts.frameWidth ?? 48));
287
+ fd.append("frameHeight", String(opts.frameHeight ?? 88));
288
+ fd.append("frames", String(opts.frames ?? 4));
289
+ const res = await fetch("/api/workshop/assets/character", {
290
+ method: "POST",
291
+ headers: headers(false),
292
+ body: fd
293
+ });
294
+ const json = await res.json().catch(() => ({}));
295
+ if (!res.ok || !json?.data?.asset) throw new Error(json?.message ?? "上传失败");
296
+ store.loaded = false;
297
+ await store.load();
298
+ return fromApi(json.data.asset);
299
+ },
300
+ async remove(id) {
301
+ const res = await fetch(`/api/workshop/assets/character/${id}`, {
302
+ method: "DELETE",
303
+ headers: headers()
304
+ });
305
+ const json = await res.json().catch(() => ({}));
306
+ if (!res.ok) throw new Error(json?.message ?? "删除失败");
307
+ store.loaded = false;
308
+ await store.load();
309
+ return { used: json?.data?.used ?? 0 };
310
+ },
311
+ async uploadDevice(file, name) {
312
+ const fd = new FormData();
313
+ fd.append("file", file);
314
+ if (name) fd.append("name", name);
315
+ const res = await fetch("/api/workshop/assets/devices", {
316
+ method: "POST",
317
+ headers: headers(false),
318
+ body: fd
319
+ });
320
+ const json = await res.json().catch(() => ({}));
321
+ if (!res.ok || !json?.data?.asset) throw new Error(json?.message ?? "设备模型上传失败");
322
+ store.loaded = false;
323
+ await store.load();
324
+ const a = json.data.asset;
325
+ return {
326
+ id: a.id,
327
+ name: a.name,
328
+ file: a.file,
329
+ frames: 1,
330
+ frameWidth: 0,
331
+ frameHeight: 0,
332
+ kind: "dev",
333
+ builtin: false,
334
+ applied: false,
335
+ hint: "设备实体(拖入场景生成数字孪生)"
336
+ };
337
+ },
338
+ async removeDevice(id) {
339
+ const key = id.replace(/^dev-folder-/, "");
340
+ const res = await fetch(`/api/workshop/assets/devices/${encodeURIComponent(key)}`, {
341
+ method: "DELETE",
342
+ headers: headers()
343
+ });
344
+ const json = await res.json().catch(() => ({}));
345
+ if (!res.ok) throw new Error(json?.message ?? "设备模型删除失败");
346
+ store.loaded = false;
347
+ await store.load();
348
+ },
349
+ async bind(channelId, agentId, modelRef) {
350
+ const res = await fetch(`/api/workshop/channels/${channelId}/agents/${agentId}/model`, {
351
+ method: "PATCH",
352
+ headers: headers(),
353
+ body: JSON.stringify({ modelRef })
354
+ });
355
+ const json = await res.json().catch(() => ({}));
356
+ if (!res.ok) throw new Error(json?.message ?? "绑定失败");
357
+ }
358
+ });
359
+ return store;
360
+ }
361
+ function useCharacterAssets() {
362
+ const g = globalThis;
363
+ if (!g[GLOBAL_KEY$1]) g[GLOBAL_KEY$1] = createStore$1();
364
+ const store = g[GLOBAL_KEY$1];
365
+ store.load();
366
+ return store;
367
+ }
368
+ //#endregion
369
+ //#region app/components/workshop/town/ModelPreview3D.vue?vue&type=script&setup=true&lang.ts
370
+ var ModelPreview3D_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineComponent({
371
+ __name: "ModelPreview3D",
372
+ __ssrInlineRender: true,
373
+ props: {
374
+ file: { default: "" },
375
+ localFile: { default: null },
376
+ height: { default: 64 }
377
+ },
378
+ setup(__props) {
379
+ /**
380
+ * ModelPreview3D —— 设备模型 GLB 实时 3D 缩略预览(共享渲染器版)。
381
+ *
382
+ * 关键设计:模型库有 12+ 张卡,浏览器 WebGL 活动上下文上限 ~16 —— 每卡独立
383
+ * WebGLRenderer 会让排在后面的卡(薄膜双拉系列)上下文被驱逐 → 黑块。
384
+ * 这里改为模块级共享单渲染器:一个 offscreen WebGL canvas + 单 rAF 循环,
385
+ * 逐槽位渲染后 drawImage 到各卡自己的 2D canvas。上下文恒为 1,GPU 占用受控。
386
+ */
387
+ const props = __props;
388
+ const hostRef = ref(null);
389
+ const failed = ref(false);
390
+ const loading = ref(false);
391
+ const rigGlobal = globalThis;
392
+ let objectUrl = "";
393
+ function acquireRig() {
394
+ if (rigGlobal.__modelPreviewRig) return rigGlobal.__modelPreviewRig;
395
+ const renderer = new THREE.WebGLRenderer({
396
+ alpha: true,
397
+ antialias: false,
398
+ powerPreference: "low-power"
399
+ });
400
+ renderer.setPixelRatio(Math.min((void 0).devicePixelRatio, 1.5));
401
+ renderer.toneMapping = THREE.ACESFilmicToneMapping;
402
+ renderer.toneMappingExposure = 1.15;
403
+ const rig = {
404
+ renderer,
405
+ slots: /* @__PURE__ */ new Set(),
406
+ raf: 0,
407
+ clock: new THREE.Clock()
408
+ };
409
+ const tick = () => {
410
+ rig.raf = requestAnimationFrame(tick);
411
+ const dt = rig.clock.getDelta();
412
+ for (const s of rig.slots) {
413
+ if (!s.canvas.isConnected && s.canvas.width === 0) continue;
414
+ if (s.group) s.group.rotation.y += dt * s.speed;
415
+ rig.renderer.setSize(s.w, s.h, false);
416
+ rig.renderer.render(s.scene, s.camera);
417
+ s.ctx.clearRect(0, 0, s.w, s.h);
418
+ s.ctx.drawImage(rig.renderer.domElement, 0, 0, s.w, s.h);
419
+ }
420
+ };
421
+ tick();
422
+ rigGlobal.__modelPreviewRig = rig;
423
+ return rig;
424
+ }
425
+ function releaseRig() {
426
+ const rig = rigGlobal.__modelPreviewRig;
427
+ if (!rig || rig.slots.size > 0) return;
428
+ cancelAnimationFrame(rig.raf);
429
+ rig.renderer.dispose();
430
+ rig.renderer.domElement.remove();
431
+ delete rigGlobal.__modelPreviewRig;
432
+ }
433
+ function buildLighting(scene) {
434
+ try {
435
+ const pmrem = new THREE.PMREMGenerator(rigGlobal.__modelPreviewRig.renderer);
436
+ scene.environment = pmrem.fromScene(new RoomEnvironment(), .04).texture;
437
+ scene.environmentIntensity = .55;
438
+ pmrem.dispose();
439
+ } catch {}
440
+ scene.add(new THREE.HemisphereLight(14674431, 3813157, 1.3));
441
+ const key = new THREE.DirectionalLight(16773855, 2.2);
442
+ key.position.set(3, 4, 2);
443
+ scene.add(key);
444
+ const rim = new THREE.DirectionalLight(4311284, 1);
445
+ rim.position.set(-3, 1, -2.5);
446
+ scene.add(rim);
447
+ }
448
+ function fitObject(obj) {
449
+ const box = new THREE.Box3().setFromObject(obj);
450
+ const size = new THREE.Vector3();
451
+ box.getSize(size);
452
+ const center = box.getCenter(new THREE.Vector3());
453
+ const s = 2 / (Math.max(size.x, Math.max(size.y, size.z)) || 1);
454
+ obj.scale.setScalar(s);
455
+ obj.position.set(-center.x * s, -center.y * s, -center.z * s);
456
+ }
457
+ let slot = null;
458
+ function mountScene(source) {
459
+ if (!hostRef.value || failed.value) return;
460
+ const el = hostRef.value;
461
+ const w = el.clientWidth || 120;
462
+ const h = props.height || 64;
463
+ const rig = acquireRig();
464
+ const canvas = (void 0).createElement("canvas");
465
+ canvas.style.width = "100%";
466
+ canvas.style.height = `${h}px`;
467
+ canvas.width = Math.max(2, Math.round(w * Math.min((void 0).devicePixelRatio, 1.5)));
468
+ canvas.height = Math.max(2, Math.round(h * Math.min((void 0).devicePixelRatio, 1.5)));
469
+ const ctx = canvas.getContext("2d");
470
+ if (!ctx) {
471
+ failed.value = true;
472
+ return;
473
+ }
474
+ el.appendChild(canvas);
475
+ const scene = new THREE.Scene();
476
+ buildLighting(scene);
477
+ const camera = new THREE.PerspectiveCamera(38, w / h, .1, 100);
478
+ camera.position.set(2.4, 1.8, 3.1);
479
+ camera.lookAt(0, 0, 0);
480
+ const group = new THREE.Group();
481
+ scene.add(group);
482
+ slot = {
483
+ canvas,
484
+ ctx,
485
+ scene,
486
+ camera,
487
+ group,
488
+ w: canvas.width,
489
+ h: canvas.height,
490
+ speed: .6
491
+ };
492
+ rig.slots.add(slot);
493
+ loading.value = true;
494
+ new GLTFLoader().load(source, (glt) => {
495
+ const obj = glt.scene;
496
+ if (!slot) return;
497
+ obj.traverse((c) => {
498
+ const m = c;
499
+ if (m.isMesh) {
500
+ m.castShadow = false;
501
+ m.receiveShadow = false;
502
+ }
503
+ });
504
+ fitObject(obj);
505
+ slot.group.add(obj);
506
+ loading.value = false;
507
+ }, void 0, () => {
508
+ loading.value = false;
509
+ failed.value = true;
510
+ });
511
+ }
512
+ function dispose() {
513
+ if (objectUrl) URL.revokeObjectURL(objectUrl);
514
+ objectUrl = "";
515
+ if (slot) {
516
+ rigGlobal.__modelPreviewRig?.slots.delete(slot);
517
+ slot.scene.traverse((c) => {
518
+ const mesh = c;
519
+ if (mesh.isMesh) {
520
+ mesh.geometry?.dispose();
521
+ const mats = Array.isArray(mesh.material) ? mesh.material : [mesh.material];
522
+ for (const mat of mats) {
523
+ for (const key of Object.keys(mat)) {
524
+ const v = mat[key];
525
+ if (v && v.isTexture) v.dispose();
526
+ }
527
+ mat?.dispose();
528
+ }
529
+ }
530
+ });
531
+ slot.canvas.remove();
532
+ slot = null;
533
+ releaseRig();
534
+ }
535
+ }
536
+ function startLoad() {
537
+ failed.value = false;
538
+ if (props.localFile) {
539
+ objectUrl = URL.createObjectURL(props.localFile);
540
+ mountScene(objectUrl);
541
+ return;
542
+ }
543
+ if (props.file) mountScene(props.file);
544
+ }
545
+ watch(() => [props.file, props.localFile], () => {
546
+ dispose();
547
+ if (props.localFile ?? (props.file ? props.file : null)) nextTick(() => startLoad());
548
+ });
549
+ return (_ctx, _push, _parent, _attrs) => {
550
+ _push(`<div${ssrRenderAttrs(mergeProps({
551
+ ref_key: "hostRef",
552
+ ref: hostRef,
553
+ class: "model-preview-3d",
554
+ style: { height: `${__props.height}px` }
555
+ }, _attrs))} data-v-b29ffdbe>`);
556
+ if (unref(loading)) _push(`<div class="mp-loading" data-v-b29ffdbe><span class="mp-spin" data-v-b29ffdbe></span></div>`);
557
+ else if (unref(failed)) _push(`<div class="mp-failed" data-v-b29ffdbe> PREVIEW NA </div>`);
558
+ else _push(`<!---->`);
559
+ _push(`</div>`);
560
+ };
561
+ }
562
+ });
563
+ //#endregion
564
+ //#region app/components/workshop/town/ModelPreview3D.vue
565
+ var _sfc_setup$3 = ModelPreview3D_vue_vue_type_script_setup_true_lang_default.setup;
566
+ ModelPreview3D_vue_vue_type_script_setup_true_lang_default.setup = (props, ctx) => {
567
+ const ssrContext = useSSRContext();
568
+ (ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("components/workshop/town/ModelPreview3D.vue");
569
+ return _sfc_setup$3 ? _sfc_setup$3(props, ctx) : void 0;
570
+ };
571
+ var ModelPreview3D_default = /*#__PURE__*/ Object.assign(_plugin_vue_export_helper_default(ModelPreview3D_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-b29ffdbe"]]), { __name: "WorkshopTownModelPreview3D" });
572
+ //#endregion
573
+ //#region app/components/workshop/AssetLibrary.vue?vue&type=script&setup=true&lang.ts
574
+ var AssetLibrary_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineComponent({
575
+ __name: "AssetLibrary",
576
+ __ssrInlineRender: true,
577
+ setup(__props) {
578
+ /**
579
+ * 设备模型库(Asset Library)面板 —— 只列举「设备/实体」3D 模型,支持上传/删除。
580
+ *
581
+ * 交互:
582
+ * - 仅展示 kind === 'dev' 的模型(扫描 public/assets/game/devices + 用户上传);
583
+ * character 角色模型不出现在模型库 —— 在频道成员管理中为成员设置。
584
+ * - 每张模型卡可拖拽:拖起把 assetId 写入 dataTransfer,落到孪生场景 →
585
+ * TownScene3D.dropModelOnWorld() 在落点生成一个设备实例(数字孪生)。
586
+ * - 上传:选择 .glb/.gltf/.obj/.fbx → POST /api/workshop/assets/devices,写入 devices 目录。
587
+ * - 删除:删除对应模型文件(仅限 devices 目录内)。
588
+ */
589
+ const { t } = useI18n();
590
+ const assets = useCharacterAssets();
591
+ /** 侧边模型库:展示所有设备实体模型(含内置模型、设备目录扫描与用户上传)。 */
592
+ const deviceModels = computed(() => assets.models.filter((m) => m.kind === "dev"));
593
+ /** 可 3D 预览的格式(glb/gltf);obj/fbx 保持占位图标 */
594
+ const isPreviewable = (name) => /\.(glb|gltf)$/i.test(name);
595
+ const uploading = ref(false);
596
+ const uploadError = ref("");
597
+ const uploadFile = ref(null);
598
+ const dropActive = ref(false);
599
+ const deletingId = ref("");
600
+ const deleteMsg = ref("");
601
+ return (_ctx, _push, _parent, _attrs) => {
602
+ _push(`<aside${ssrRenderAttrs(mergeProps({ class: "asset-lib" }, _attrs))} data-v-c83e9503><div class="lib-head" data-v-c83e9503><span class="head-title" data-v-c83e9503>${ssrInterpolate(_ctx.$t("assetLibrary.k7la4x5001"))}</span><span class="head-hint" data-v-c83e9503>${ssrInterpolate(_ctx.$t("assetLibrary.kulif5b002"))}</span></div><div class="${ssrRenderClass([{ drop: unref(dropActive) }, "upload-box"])}" data-v-c83e9503><label class="upload-row" data-v-c83e9503><input type="file" accept=".glb,.gltf,.obj,.fbx" class="file-input" data-v-c83e9503><span class="upload-name" data-v-c83e9503><span class="i-tabler-plus upload-ico" data-v-c83e9503></span> ${ssrInterpolate(unref(uploadFile)?.name || _ctx.$t("assetLibrary.k1iiort6010"))}</span></label>`);
603
+ if (unref(dropActive)) _push(`<span class="drop-hint" data-v-c83e9503><span class="i-tabler-download" data-v-c83e9503></span> ${ssrInterpolate(_ctx.$t("assetLibrary.k5hg6jq003"))}</span>`);
604
+ else _push(`<!---->`);
605
+ if (unref(uploadFile)) {
606
+ _push(`<!--[-->`);
607
+ if (isPreviewable(unref(uploadFile).name)) _push(ssrRenderComponent(ModelPreview3D_default, {
608
+ "local-file": unref(uploadFile),
609
+ height: 92
610
+ }, null, _parent));
611
+ else _push(`<span class="upload-file-tag" data-v-c83e9503>${ssrInterpolate(unref(uploadFile).name)} (${ssrInterpolate(_ctx.$t("assetLibrary.k1xz5wvk009"))}</span>`);
612
+ _push(`<div class="upload-actions" data-v-c83e9503><button class="upload-btn go"${ssrIncludeBooleanAttr(unref(uploading)) ? " disabled" : ""} data-v-c83e9503>${ssrInterpolate(unref(uploading) ? _ctx.$t("assetLibrary.k1ar7n8i005") : _ctx.$t("assetLibrary.k1hhga4h014"))}</button><button class="upload-btn"${ssrIncludeBooleanAttr(unref(uploading)) ? " disabled" : ""} data-v-c83e9503>${ssrInterpolate(_ctx.$t("assetLibrary.k3xdnn004"))}</button></div><!--]-->`);
613
+ } else if (unref(uploading)) _push(`<span class="mini-err" data-v-c83e9503>${ssrInterpolate(_ctx.$t("assetLibrary.k1ar7n8i005"))}</span>`);
614
+ else _push(`<!---->`);
615
+ if (unref(uploadError) && !unref(uploadFile)) _push(`<span class="mini-err" data-v-c83e9503>${ssrInterpolate(unref(uploadError))}</span>`);
616
+ else _push(`<!---->`);
617
+ _push(`</div><div class="lib-grid" data-v-c83e9503><!--[-->`);
618
+ ssrRenderList(unref(deviceModels), (m) => {
619
+ _push(`<div class="model-card"${ssrRenderAttr("data-model-id", m.id)} draggable="true"${ssrRenderAttr("title", m.hint || _ctx.$t("assetLibrary.katn7lo015", { p0: m.name }))} data-v-c83e9503>`);
620
+ if (isPreviewable(m.file)) _push(ssrRenderComponent(ModelPreview3D_default, {
621
+ file: m.file,
622
+ height: 76
623
+ }, null, _parent));
624
+ else _push(`<span class="model-img glb dev" data-v-c83e9503><span class="i-tabler-cpu glb-cube" aria-hidden="true" data-v-c83e9503></span></span>`);
625
+ _push(`<span class="model-name" data-v-c83e9503>${ssrInterpolate(m.name)}</span><span class="model-badge" data-v-c83e9503>${ssrInterpolate(_ctx.$t("assetLibrary.k1n32zs0006"))}</span><div class="card-actions" data-v-c83e9503>`);
626
+ if (m.file.includes("/assets/game/devices/")) _push(`<button class="card-btn danger"${ssrIncludeBooleanAttr(unref(deletingId) === m.id) ? " disabled" : ""} data-v-c83e9503>${ssrInterpolate(unref(deletingId) === m.id ? "…" : _ctx.$t("assetLibrary.k498l011"))}</button>`);
627
+ else _push(`<!---->`);
628
+ _push(`</div></div>`);
629
+ });
630
+ _push(`<!--]-->`);
631
+ if (!unref(assets).loaded) _push(`<div class="lib-note" data-v-c83e9503><span class="loading-dot" data-v-c83e9503></span> ${ssrInterpolate(_ctx.$t("assetLibrary.k1kq2tmi007"))}</div>`);
632
+ else if (unref(deviceModels).length === 0) _push(`<div class="lib-note" data-v-c83e9503>${ssrInterpolate(_ctx.$t("assetLibrary.k15527e1008"))}</div>`);
633
+ else _push(`<!---->`);
634
+ _push(`</div>`);
635
+ if (unref(deleteMsg)) _push(`<span class="mini-msg" data-v-c83e9503>${ssrInterpolate(unref(deleteMsg))}</span>`);
636
+ else _push(`<!---->`);
637
+ _push(`</aside>`);
638
+ };
639
+ }
640
+ });
641
+ //#endregion
642
+ //#region app/components/workshop/AssetLibrary.vue
643
+ var _sfc_setup$2 = AssetLibrary_vue_vue_type_script_setup_true_lang_default.setup;
644
+ AssetLibrary_vue_vue_type_script_setup_true_lang_default.setup = (props, ctx) => {
645
+ const ssrContext = useSSRContext();
646
+ (ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("components/workshop/AssetLibrary.vue");
647
+ return _sfc_setup$2 ? _sfc_setup$2(props, ctx) : void 0;
648
+ };
649
+ var AssetLibrary_default = /*#__PURE__*/ Object.assign(_plugin_vue_export_helper_default(AssetLibrary_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-c83e9503"]]), { __name: "WorkshopAssetLibrary" });
650
+ //#endregion
651
+ //#region app/components/workshop/DeviceTwinPanel.vue?vue&type=script&setup=true&lang.ts
652
+ var DeviceTwinPanel_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineComponent({
653
+ __name: "DeviceTwinPanel",
654
+ __ssrInlineRender: true,
655
+ props: {
656
+ daqLive: {},
657
+ dcwLive: {}
658
+ },
659
+ emits: ["focus-device"],
660
+ setup(__props) {
661
+ /**
662
+ * 设备控制台(Device Twin Console) —— 工业数字孪生 HMI:
663
+ * 设备实体直接列表展示(状态灯/遥测数据网格/下发控制),点击行聚焦小镇场景中的对应实体。
664
+ *
665
+ * 与 3D 小镇联动:拖 `dev` 模型进场景会创建设备 twin;本面板实时刷新其 state/telemetry,
666
+ * 并展示绑定智控通道的当前 set 值,支持窗口内直写下发(替代旧 power_on/power_off/set_speed)。
667
+ */
668
+ const { t } = useI18n();
669
+ /** 实时数采数据(twinId → 该实体相关的实时通道:
670
+ * 数采节点 = 自身通道;设备 = 绑定到它的全部数采通道;由 TownView 从模拟上报喂入) */
671
+ const twins = useDeviceTwins();
672
+ useDcwStream();
673
+ /** 数采实体(绿卡):kind=daq 或旧数据 modelRef 前缀兜底 */
674
+ const isDaq = (t) => t.kind === "daq" || (t.modelRef ?? "").startsWith("daq-");
675
+ const busyId = ref("");
676
+ const ctrlMsg = ref("");
677
+ /** 行内删除(两步确认:首击布防 3s,再击执行) */
678
+ const armedId = ref("");
679
+ const stateColor = {
680
+ idle: "var(--hud-amber)",
681
+ running: "var(--hud-ok)",
682
+ alarm: "var(--hud-danger)",
683
+ offline: "var(--hud-dim)"
684
+ };
685
+ const stateLabel = {
686
+ idle: "STANDBY",
687
+ running: "RUNNING",
688
+ alarm: "ALARM",
689
+ offline: "OFFLINE"
690
+ };
691
+ const modelTag = (name) => name.replace(/[^A-Za-z0-9]/g, "").slice(0, 4).toUpperCase() || "DEV";
692
+ const devNo = (id) => id.replace(/^dev-/, "").replace(/[^a-z0-9]/gi, "").slice(-6).toUpperCase();
693
+ const fmt = (v) => typeof v === "number" ? (Math.round(v * 100) / 100).toString() : String(v);
694
+ /** 智控上下限文案(无穷大显示 ±∞) */
695
+ const dcwWinText = (r) => `${Number.isFinite(r.lo) ? r.lo : "-∞"} ~ ${Number.isFinite(r.hi) ? r.hi : "+∞"} ${r.unit}`;
696
+ /** 写入草稿/错误(智控节点 id 键控) */
697
+ const dcwDrafts = reactive({});
698
+ const dcwErrs = reactive({});
699
+ const dcwBusy = ref("");
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>`);
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>`);
706
+ else {
707
+ _push(`<div class="twin-list" data-v-9a00109c><!--[-->`);
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>`);
710
+ if (Object.keys(t.telemetry).length) {
711
+ _push(`<div class="twin-tele" data-v-9a00109c><!--[-->`);
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>`);
714
+ });
715
+ _push(`<!--]--></div>`);
716
+ } else _push(`<!---->`);
717
+ if (__props.daqLive?.[t.id]?.length) {
718
+ _push(`<div class="twin-daq" data-v-9a00109c><!--[-->`);
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>`);
721
+ });
722
+ _push(`<!--]--></div>`);
723
+ } else _push(`<!---->`);
724
+ if (__props.dcwLive?.[t.id]?.length) {
725
+ _push(`<div class="twin-dcw" data-v-9a00109c><!--[-->`);
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>`);
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>`);
732
+ else _push(`<!---->`);
733
+ _push(`</div>`);
734
+ });
735
+ _push(`<!--]--></div>`);
736
+ } else _push(`<!---->`);
737
+ _push(`</button>`);
738
+ });
739
+ _push(`<!--]--></div>`);
740
+ }
741
+ if (unref(ctrlMsg)) _push(`<span class="twin-err" data-v-9a00109c>${ssrInterpolate(unref(ctrlMsg))}</span>`);
742
+ else _push(`<!---->`);
743
+ _push(`</aside>`);
744
+ };
745
+ }
746
+ });
747
+ //#endregion
748
+ //#region app/components/workshop/DeviceTwinPanel.vue
749
+ var _sfc_setup$1 = DeviceTwinPanel_vue_vue_type_script_setup_true_lang_default.setup;
750
+ DeviceTwinPanel_vue_vue_type_script_setup_true_lang_default.setup = (props, ctx) => {
751
+ const ssrContext = useSSRContext();
752
+ (ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("components/workshop/DeviceTwinPanel.vue");
753
+ return _sfc_setup$1 ? _sfc_setup$1(props, ctx) : void 0;
754
+ };
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" });
756
+ //#endregion
757
+ //#region app/composables/workshop/useSceneLayouts.ts
758
+ /**
759
+ * useSceneLayouts —— 频道领地放置(3D 小镇布局注册表)。
760
+ *
761
+ * 职责:
762
+ * - 拉取已放置频道清单(GET /api/workshop/scene/layouts);
763
+ * - 放置/更新领地(PUT /:channelId):拖频道入场景、编辑边界后落库;
764
+ * - 移除放置(DELETE /:channelId):把频道(及其 Agent)从场景撤出。
765
+ * 场景初始为空场地;未放置的频道只出现在频道坞,不进入 3D。
766
+ * 单例挂 globalThis,跨组件安全;store 为 reactive(驱动频道坞/选中面板重渲染)。
767
+ */
768
+ var GLOBAL_KEY = "__sceneLayouts";
769
+ function headers(json = true) {
770
+ const h = {};
771
+ if (json) h["content-type"] = "application/json";
772
+ return h;
773
+ }
774
+ function createStore() {
775
+ /** 在飞请求句柄:并发 load 等同一个真实请求(旧实现直接 return → 调用方拿空 layouts 去 hydrate,频道竞态消失) */
776
+ let inFlight = null;
777
+ const sleep = (ms) => new Promise((r) => setTimeout(r, ms));
778
+ const store = reactive({
779
+ layouts: {},
780
+ loaded: false,
781
+ loading: false,
782
+ error: "",
783
+ rev: 0,
784
+ async load() {
785
+ if (!inFlight) inFlight = doLoad().finally(() => {
786
+ inFlight = null;
787
+ });
788
+ return inFlight;
789
+ },
790
+ byChannel(channelId) {
791
+ return store.layouts[channelId];
792
+ },
793
+ async save(channelId, input) {
794
+ store.layouts[channelId] = {
795
+ channelId,
796
+ x: input.x,
797
+ z: input.z,
798
+ radiusX: input.radiusX,
799
+ radiusZ: input.radiusZ,
800
+ shape: input.shape ?? "ellipse",
801
+ rotationY: input.rotationY ?? 0,
802
+ updatedAt: (/* @__PURE__ */ new Date()).toISOString()
803
+ };
804
+ store.rev++;
805
+ let lastErr = null;
806
+ for (let attempt = 0; attempt < 3; attempt++) try {
807
+ const res = await fetch(`/api/workshop/scene/layouts/${channelId}`, {
808
+ method: "PUT",
809
+ headers: headers(),
810
+ body: JSON.stringify(input)
811
+ });
812
+ const json = await res.json().catch(() => ({}));
813
+ if (!res.ok || !json?.data?.layout) throw new Error(json?.message ?? "保存频道布局失败");
814
+ store.layouts[channelId] = json.data.layout;
815
+ return json.data.layout;
816
+ } catch (err) {
817
+ lastErr = err instanceof Error ? err : new Error(String(err));
818
+ if (attempt < 2) await sleep(500 * (attempt + 1));
819
+ }
820
+ throw lastErr ?? /* @__PURE__ */ new Error("保存频道布局失败");
821
+ },
822
+ async remove(channelId) {
823
+ const res = await fetch(`/api/workshop/scene/layouts/${channelId}`, {
824
+ method: "DELETE",
825
+ headers: headers()
826
+ });
827
+ const json = await res.json().catch(() => ({}));
828
+ if (!res.ok) throw new Error(json?.message ?? "移除频道放置失败");
829
+ const next = Object.fromEntries(Object.entries(store.layouts).filter(([k]) => k !== channelId));
830
+ store.layouts = next;
831
+ store.rev++;
832
+ }
833
+ });
834
+ /** 单次真实拉取(3 次退避重试;非 2xx 视为失败 —— 401/500 的空 layouts 曾让整场频道消失) */
835
+ async function doLoad() {
836
+ store.loading = true;
837
+ let lastErr = "";
838
+ try {
839
+ for (let attempt = 0; attempt < 3; attempt++) try {
840
+ const res = await fetch("/api/workshop/scene/layouts", { headers: headers() });
841
+ if (!res.ok) throw new Error(`HTTP ${res.status}`);
842
+ const list = (await res.json().catch(() => ({})))?.data?.layouts ?? [];
843
+ const next = {};
844
+ for (const l of list) next[l.channelId] = l;
845
+ store.layouts = next;
846
+ store.loaded = true;
847
+ store.error = "";
848
+ store.rev++;
849
+ return;
850
+ } catch (err) {
851
+ lastErr = err instanceof Error ? err.message : String(err);
852
+ if (attempt < 2) await sleep(400 * (attempt + 1));
853
+ }
854
+ store.loaded = false;
855
+ store.error = lastErr;
856
+ } finally {
857
+ store.loading = false;
858
+ }
859
+ }
860
+ return store;
861
+ }
862
+ function useSceneLayouts() {
863
+ const g = globalThis;
864
+ if (!g[GLOBAL_KEY]) g[GLOBAL_KEY] = createStore();
865
+ const store = g[GLOBAL_KEY];
866
+ store.load();
867
+ return store;
868
+ }
869
+ //#endregion
870
+ //#region node_modules/.pnpm/@vueuse+shared@13.9.0_vue@3.5.41_typescript@5.9.3_/node_modules/@vueuse/shared/index.mjs
871
+ function tryOnScopeDispose(fn) {
872
+ if (getCurrentScope()) {
873
+ onScopeDispose(fn);
874
+ return true;
875
+ }
876
+ return false;
877
+ }
878
+ typeof WorkerGlobalScope !== "undefined" && globalThis instanceof WorkerGlobalScope;
879
+ var toString = Object.prototype.toString;
880
+ var isObject = (val) => toString.call(val) === "[object Object]";
881
+ var noop = () => {};
882
+ function toRef$1(...args) {
883
+ if (args.length !== 1) return toRef(...args);
884
+ const r = args[0];
885
+ return typeof r === "function" ? readonly(customRef(() => ({
886
+ get: r,
887
+ set: noop
888
+ }))) : ref(r);
889
+ }
890
+ function createFilterWrapper(filter, fn) {
891
+ function wrapper(...args) {
892
+ return new Promise((resolve, reject) => {
893
+ Promise.resolve(filter(() => fn.apply(this, args), {
894
+ fn,
895
+ thisArg: this,
896
+ args
897
+ })).then(resolve).catch(reject);
898
+ });
899
+ }
900
+ return wrapper;
901
+ }
902
+ var bypassFilter = (invoke) => {
903
+ return invoke();
904
+ };
905
+ function pausableFilter(extendFilter = bypassFilter, options = {}) {
906
+ const { initialState = "active" } = options;
907
+ const isActive = toRef$1(initialState === "active");
908
+ function pause() {
909
+ isActive.value = false;
910
+ }
911
+ function resume() {
912
+ isActive.value = true;
913
+ }
914
+ const eventFilter = (...args) => {
915
+ if (isActive.value) extendFilter(...args);
916
+ };
917
+ return {
918
+ isActive: readonly(isActive),
919
+ pause,
920
+ resume,
921
+ eventFilter
922
+ };
923
+ }
924
+ function toArray(value) {
925
+ return Array.isArray(value) ? value : [value];
926
+ }
927
+ function getLifeCycleTarget(target) {
928
+ return getCurrentInstance();
929
+ }
930
+ function watchWithFilter(source, cb, options = {}) {
931
+ const { eventFilter = bypassFilter, ...watchOptions } = options;
932
+ return watch(source, createFilterWrapper(eventFilter, cb), watchOptions);
933
+ }
934
+ function watchPausable(source, cb, options = {}) {
935
+ const { eventFilter: filter, initialState = "active", ...watchOptions } = options;
936
+ const { eventFilter, pause, resume, isActive } = pausableFilter(filter, { initialState });
937
+ return {
938
+ stop: watchWithFilter(source, cb, {
939
+ ...watchOptions,
940
+ eventFilter
941
+ }),
942
+ pause,
943
+ resume,
944
+ isActive
945
+ };
946
+ }
947
+ function tryOnMounted(fn, sync = true, target) {
948
+ if (getLifeCycleTarget());
949
+ else if (sync) fn();
950
+ else nextTick(fn);
951
+ }
952
+ function watchImmediate(source, cb, options) {
953
+ return watch(source, cb, {
954
+ ...options,
955
+ immediate: true
956
+ });
957
+ }
958
+ //#endregion
959
+ //#region node_modules/.pnpm/@vueuse+core@13.9.0_vue@3.5.41_typescript@5.9.3_/node_modules/@vueuse/core/index.mjs
960
+ var defaultWindow = void 0;
961
+ function unrefElement(elRef) {
962
+ var _a;
963
+ const plain = toValue(elRef);
964
+ return (_a = plain == null ? void 0 : plain.$el) != null ? _a : plain;
965
+ }
966
+ function useEventListener(...args) {
967
+ const cleanups = [];
968
+ const cleanup = () => {
969
+ cleanups.forEach((fn) => fn());
970
+ cleanups.length = 0;
971
+ };
972
+ const register = (el, event, listener, options) => {
973
+ el.addEventListener(event, listener, options);
974
+ return () => el.removeEventListener(event, listener, options);
975
+ };
976
+ const firstParamTargets = computed(() => {
977
+ const test = toArray(toValue(args[0])).filter((e) => e != null);
978
+ return test.every((e) => typeof e !== "string") ? test : void 0;
979
+ });
980
+ const stopWatch = watchImmediate(() => {
981
+ var _a, _b;
982
+ return [
983
+ (_b = (_a = firstParamTargets.value) == null ? void 0 : _a.map((e) => unrefElement(e))) != null ? _b : [defaultWindow].filter((e) => e != null),
984
+ toArray(toValue(firstParamTargets.value ? args[1] : args[0])),
985
+ toArray(unref(firstParamTargets.value ? args[2] : args[1])),
986
+ toValue(firstParamTargets.value ? args[3] : args[2])
987
+ ];
988
+ }, ([raw_targets, raw_events, raw_listeners, raw_options]) => {
989
+ cleanup();
990
+ if (!(raw_targets == null ? void 0 : raw_targets.length) || !(raw_events == null ? void 0 : raw_events.length) || !(raw_listeners == null ? void 0 : raw_listeners.length)) return;
991
+ const optionsClone = isObject(raw_options) ? { ...raw_options } : raw_options;
992
+ cleanups.push(...raw_targets.flatMap((el) => raw_events.flatMap((event) => raw_listeners.map((listener) => register(el, event, listener, optionsClone)))));
993
+ }, { flush: "post" });
994
+ const stop = () => {
995
+ stopWatch();
996
+ cleanup();
997
+ };
998
+ tryOnScopeDispose(cleanup);
999
+ return stop;
1000
+ }
1001
+ var _global = typeof globalThis !== "undefined" ? globalThis : typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : {};
1002
+ var globalKey = "__vueuse_ssr_handlers__";
1003
+ var handlers = /* @__PURE__ */ getHandlers();
1004
+ function getHandlers() {
1005
+ if (!(globalKey in _global)) _global[globalKey] = _global[globalKey] || {};
1006
+ return _global[globalKey];
1007
+ }
1008
+ function getSSRHandler(key, fallback) {
1009
+ return handlers[key] || fallback;
1010
+ }
1011
+ function guessSerializerType(rawInit) {
1012
+ return rawInit == null ? "any" : rawInit instanceof Set ? "set" : rawInit instanceof Map ? "map" : rawInit instanceof Date ? "date" : typeof rawInit === "boolean" ? "boolean" : typeof rawInit === "string" ? "string" : typeof rawInit === "object" ? "object" : !Number.isNaN(rawInit) ? "number" : "any";
1013
+ }
1014
+ var StorageSerializers = {
1015
+ boolean: {
1016
+ read: (v) => v === "true",
1017
+ write: (v) => String(v)
1018
+ },
1019
+ object: {
1020
+ read: (v) => JSON.parse(v),
1021
+ write: (v) => JSON.stringify(v)
1022
+ },
1023
+ number: {
1024
+ read: (v) => Number.parseFloat(v),
1025
+ write: (v) => String(v)
1026
+ },
1027
+ any: {
1028
+ read: (v) => v,
1029
+ write: (v) => String(v)
1030
+ },
1031
+ string: {
1032
+ read: (v) => v,
1033
+ write: (v) => String(v)
1034
+ },
1035
+ map: {
1036
+ read: (v) => new Map(JSON.parse(v)),
1037
+ write: (v) => JSON.stringify(Array.from(v.entries()))
1038
+ },
1039
+ set: {
1040
+ read: (v) => new Set(JSON.parse(v)),
1041
+ write: (v) => JSON.stringify(Array.from(v))
1042
+ },
1043
+ date: {
1044
+ read: (v) => new Date(v),
1045
+ write: (v) => v.toISOString()
1046
+ }
1047
+ };
1048
+ var customStorageEventName = "vueuse-storage";
1049
+ function useStorage(key, defaults, storage, options = {}) {
1050
+ var _a;
1051
+ const { flush = "pre", deep = true, listenToStorageChanges = true, writeDefaults = true, mergeDefaults = false, shallow, window = defaultWindow, eventFilter, onError = (e) => {
1052
+ console.error(e);
1053
+ }, initOnMounted } = options;
1054
+ const data = (shallow ? shallowRef : ref)(typeof defaults === "function" ? defaults() : defaults);
1055
+ const keyComputed = computed(() => toValue(key));
1056
+ if (!storage) try {
1057
+ storage = getSSRHandler("getDefaultStorage", () => {
1058
+ var _a2;
1059
+ return (_a2 = defaultWindow) == null ? void 0 : _a2.localStorage;
1060
+ })();
1061
+ } catch (e) {
1062
+ onError(e);
1063
+ }
1064
+ if (!storage) return data;
1065
+ const rawInit = toValue(defaults);
1066
+ const type = guessSerializerType(rawInit);
1067
+ const serializer = (_a = options.serializer) != null ? _a : StorageSerializers[type];
1068
+ const { pause: pauseWatch, resume: resumeWatch } = watchPausable(data, (newValue) => write(newValue), {
1069
+ flush,
1070
+ deep,
1071
+ eventFilter
1072
+ });
1073
+ watch(keyComputed, () => update(), { flush });
1074
+ let firstMounted = false;
1075
+ const onStorageEvent = (ev) => {
1076
+ if (initOnMounted && !firstMounted) return;
1077
+ update(ev);
1078
+ };
1079
+ const onStorageCustomEvent = (ev) => {
1080
+ if (initOnMounted && !firstMounted) return;
1081
+ updateFromCustomEvent(ev);
1082
+ };
1083
+ if (window && listenToStorageChanges) {
1084
+ if (storage instanceof Storage) useEventListener(window, "storage", onStorageEvent, { passive: true });
1085
+ else useEventListener(window, customStorageEventName, onStorageCustomEvent);
1086
+ }
1087
+ if (initOnMounted) tryOnMounted(() => {
1088
+ firstMounted = true;
1089
+ update();
1090
+ });
1091
+ else update();
1092
+ function dispatchWriteEvent(oldValue, newValue) {
1093
+ if (window) {
1094
+ const payload = {
1095
+ key: keyComputed.value,
1096
+ oldValue,
1097
+ newValue,
1098
+ storageArea: storage
1099
+ };
1100
+ window.dispatchEvent(storage instanceof Storage ? new StorageEvent("storage", payload) : new CustomEvent(customStorageEventName, { detail: payload }));
1101
+ }
1102
+ }
1103
+ function write(v) {
1104
+ try {
1105
+ const oldValue = storage.getItem(keyComputed.value);
1106
+ if (v == null) {
1107
+ dispatchWriteEvent(oldValue, null);
1108
+ storage.removeItem(keyComputed.value);
1109
+ } else {
1110
+ const serialized = serializer.write(v);
1111
+ if (oldValue !== serialized) {
1112
+ storage.setItem(keyComputed.value, serialized);
1113
+ dispatchWriteEvent(oldValue, serialized);
1114
+ }
1115
+ }
1116
+ } catch (e) {
1117
+ onError(e);
1118
+ }
1119
+ }
1120
+ function read(event) {
1121
+ const rawValue = event ? event.newValue : storage.getItem(keyComputed.value);
1122
+ if (rawValue == null) {
1123
+ if (writeDefaults && rawInit != null) storage.setItem(keyComputed.value, serializer.write(rawInit));
1124
+ return rawInit;
1125
+ } else if (!event && mergeDefaults) {
1126
+ const value = serializer.read(rawValue);
1127
+ if (typeof mergeDefaults === "function") return mergeDefaults(value, rawInit);
1128
+ else if (type === "object" && !Array.isArray(value)) return {
1129
+ ...rawInit,
1130
+ ...value
1131
+ };
1132
+ return value;
1133
+ } else if (typeof rawValue !== "string") return rawValue;
1134
+ else return serializer.read(rawValue);
1135
+ }
1136
+ function update(event) {
1137
+ if (event && event.storageArea !== storage) return;
1138
+ if (event && event.key == null) {
1139
+ data.value = rawInit;
1140
+ return;
1141
+ }
1142
+ if (event && event.key !== keyComputed.value) return;
1143
+ pauseWatch();
1144
+ try {
1145
+ const serializedData = serializer.write(data.value);
1146
+ if (event === void 0 || (event == null ? void 0 : event.newValue) !== serializedData) data.value = read(event);
1147
+ } catch (e) {
1148
+ onError(e);
1149
+ } finally {
1150
+ if (event) nextTick(resumeWatch);
1151
+ else resumeWatch();
1152
+ }
1153
+ }
1154
+ function updateFromCustomEvent(event) {
1155
+ update(event.detail);
1156
+ }
1157
+ return data;
1158
+ }
1159
+ //#endregion
1160
+ //#region app/components/workshop/town/TownView.vue?vue&type=script&setup=true&lang.ts
1161
+ /** 两种渲染器共享:事件订阅 + HUD 事件 + E2E 钩子 */
1162
+ var PANEL_POS_KEY = "aw-town-panel-pos";
1163
+ var HISTORY_TTL_MS = 3e4;
1164
+ var CALLOUT_STACK = 104;
1165
+ var TREND_VISIBLE_DEFAULT = 8;
1166
+ /** 地图窗口缩放随 3D dolly(夹在 0.4~5;dolly 再深地图不再放大) */
1167
+ var TownView_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineComponent({
1168
+ __name: "TownView",
1169
+ __ssrInlineRender: true,
1170
+ props: {
1171
+ channelId: {},
1172
+ allChannels: { type: Boolean }
1173
+ },
1174
+ setup(__props) {
1175
+ /**
1176
+ * 小镇视图(AgentTeam RPG 可视化)— Vue 壳。
1177
+ *
1178
+ * 职责:挂载 Phaser(SSR 安全动态 import)、从 entities store 构建初始实体基线、
1179
+ * 订阅用TownBus(与时间线同源事件流)驱动场景、监听 channel.snapshot 重建、
1180
+ * HUD 覆盖层(加载态/连接态/当前说话者/统计)、E2E 钩子。
1181
+ */
1182
+ const { t } = useI18n();
1183
+ /**
1184
+ * 两种渲染器(Phaser 2D / Three.js 3D)共享的最小公开接口。
1185
+ * TownView 无感切换:事件订阅/HUD/跑马灯/迷你地图/拖放换装只用这里的方法。
1186
+ */
1187
+ const props = __props;
1188
+ const entities = useEntitiesStore();
1189
+ const wsStore = useWorkspacesStore();
1190
+ const { conn } = useWorkshopWs();
1191
+ useTownBus();
1192
+ const characterAssets = useCharacterAssets();
1193
+ const deviceTwins = useDeviceTwins();
1194
+ const sceneLayouts = useSceneLayouts();
1195
+ useHttp();
1196
+ ref(null);
1197
+ /** 当前渲染器(TownScene / TownScene3D 之一) */
1198
+ const sceneRef = shallowRef(null);
1199
+ shallowRef(null);
1200
+ /** 3D 场景实例(dispose 用) */
1201
+ const scene3dRef = shallowRef(null);
1202
+ const ready = ref(false);
1203
+ const fps = ref(0);
1204
+ const agentCount = ref(0);
1205
+ const blockCount = ref(0);
1206
+ ref(null);
1207
+ const selected = ref(null);
1208
+ const errorText = ref("");
1209
+ const syncing = computed(() => conn.state === "connecting");
1210
+ const activeChannelName = computed(() => entities.channels[props.channelId]?.name ?? "");
1211
+ const mode = ref("browse");
1212
+ const snap = ref(true);
1213
+ const saveState = ref(null);
1214
+ const saveStateLabel = computed(() => {
1215
+ switch (saveState.value?.state) {
1216
+ case "dirty": return t("townView.k3oo50k155");
1217
+ case "saving": return t("townView.k1b38d59156");
1218
+ case "saved": return t("townView.k3n51yk157");
1219
+ case "error": return t("townView.k1b3ayhc158");
1220
+ default: return "";
1221
+ }
1222
+ });
1223
+ /** 变换模式(Blender 键位):G 移动 / R 旋转 / S 缩放;选中设备时与场景手柄联动 */
1224
+ const tMode = ref("translate");
1225
+ watch(() => [selected.value, mode.value], ([sel, m]) => {
1226
+ if (m === "edit" && sel?.kind === "device") scene3dRef.value?.setTransformMode(tMode.value);
1227
+ });
1228
+ /** 选中频道(边界编辑面板) */
1229
+ const selectedChannel = ref(null);
1230
+ /** 边界编辑面板(拖拽中存草稿;确认后场景 applySceneLayouts + 落库) */
1231
+ const boundaryDraft = ref(null);
1232
+ /** 频道坞:把某频道拖入场景(须拖拽放置;点击不自动落点)。 */
1233
+ const dockHint = ref("");
1234
+ /** 角色模型选项(character 3D .glb;只在成员/选中面板设置,不进设备模型库) */
1235
+ const agentModels = computed(() => characterAssets.models.filter((m) => m.kind === "glb"));
1236
+ /** 设备模型选项(仅设备模型;换模即时重挂 + 落库) */
1237
+ const deviceModels = computed(() => characterAssets.models.filter((m) => m.kind === "dev"));
1238
+ /** 选中对象名称草稿(设备可改名;角色只读显示) */
1239
+ const objNameDraft = ref("");
1240
+ /** 选中角色活动范围草稿(面板滑杆/形状实时 → setAgentRangeScene;提交 → 落库) */
1241
+ const agentRangeDraft = ref(null);
1242
+ /** 框选绘制中标记(面板按钮态;绘制完成/切换选中/退出编辑自动复位) */
1243
+ const agentDrawingRange = ref(false);
1244
+ watch(() => selected.value, (sel) => {
1245
+ objNameDraft.value = sel?.kind === "device" ? scene3dRef.value?.getDeviceName?.(sel.id) ?? "" : "";
1246
+ agentRangeDraft.value = null;
1247
+ if (sel?.kind === "agent") {
1248
+ const r = scene3dRef.value?.getAgentRange?.(sel.id);
1249
+ agentRangeDraft.value = r ? {
1250
+ radiusX: r.radiusX,
1251
+ radiusZ: r.radiusZ,
1252
+ shape: r.shape
1253
+ } : null;
1254
+ agentDrawingRange.value = scene3dRef.value?.isRangeDrawing(sel.id) ?? false;
1255
+ } else agentDrawingRange.value = false;
1256
+ });
1257
+ /** 活动范围状态文本(对象面板展示) */
1258
+ const agentRangeStatusText = computed(() => {
1259
+ const sel = selected.value;
1260
+ if (!sel || sel.kind !== "agent") return "";
1261
+ const r = scene3dRef.value?.getAgentRange?.(sel.id);
1262
+ if (!r) return t("townView.k1v1icf6160");
1263
+ return `${r.shape === "rect" ? t("townView.k43u0g050") : t("townView.k414bc049")} ${Math.round(r.radiusX)} × ${Math.round(r.radiusZ)}`;
1264
+ });
1265
+ /** 删除选中设备实例(移除孪生 + 场景节点);两步确认:首击布防 3s,再击执行 */
1266
+ const deviceDeleteArmed = ref("");
1267
+ const channelPanelTab = ref("boundary");
1268
+ /** 选中频道成员(供成员 tab 为每个成员设置 character 模型) */
1269
+ const channelMembers = computed(() => {
1270
+ if (!selectedChannel.value) return [];
1271
+ return buildTownInput().find((c) => c.channelId === selectedChannel.value)?.agents ?? [];
1272
+ });
1273
+ /** 场景放置/移除版本戳(blockCount 事件时自增;驱动 dockChannels 对 hasChannel 的响应式重算) */
1274
+ const dockRev = ref(0);
1275
+ /** 频道坞列表(所有挂载频道;已放置/未放置标记) */
1276
+ const dockChannels = computed(() => {
1277
+ dockRev.value;
1278
+ return allMountedChannelIds().map((cid) => {
1279
+ return {
1280
+ channelId: cid,
1281
+ name: entities.channels[cid]?.name ?? cid.slice(0, 8),
1282
+ agentCount: (entities.agents[cid] ?? []).length,
1283
+ placed: scene3dRef.value?.hasChannel(cid) ?? false,
1284
+ color: hashColor(cid)
1285
+ };
1286
+ });
1287
+ });
1288
+ function allMountedChannelIds() {
1289
+ const ids = [];
1290
+ for (const ws of wsWorkspaces() ?? []) for (const cid of ws.channelIds ?? []) if (!ids.includes(cid)) ids.push(cid);
1291
+ if (!ids.includes(props.channelId)) ids.push(props.channelId);
1292
+ return ids;
1293
+ }
1294
+ /** workspaces store(频道坞列举所有已挂载频道) */
1295
+ function wsWorkspaces() {
1296
+ return wsStore.workspaces;
1297
+ }
1298
+ /** 稳定频道色(与场景 channelColorNum 同源:同一 hashHue,UI 用 CSS 色) */
1299
+ function hashColor(id) {
1300
+ return channelColorCss(id);
1301
+ }
1302
+ /** 从 entities store 构建小镇实体基线(当前 workspace 挂载的 channel) */
1303
+ function buildTownInput() {
1304
+ const out = [];
1305
+ for (const [cid, ch] of Object.entries(entities.channels)) {
1306
+ const agents = (entities.agents[cid] ?? []).map((a) => {
1307
+ const curTask = a.currentTaskId ? (entities.tasks[cid] ?? []).find((t) => t.id === a.currentTaskId) : void 0;
1308
+ return {
1309
+ agentId: a.agentId,
1310
+ name: a.name,
1311
+ role: a.role,
1312
+ harness: a.harness,
1313
+ state: a.state,
1314
+ currentTaskId: a.currentTaskId ?? null,
1315
+ currentTaskTitle: curTask?.title ?? null,
1316
+ currentTaskProgress: a.currentTaskProgress ?? curTask?.progress ?? null,
1317
+ modelRef: a.modelRef ?? null,
1318
+ homeX: a.config?.homeX ?? null,
1319
+ homeZ: a.config?.homeZ ?? null,
1320
+ range: a.config?.range ?? null
1321
+ };
1322
+ });
1323
+ out.push({
1324
+ channelId: cid,
1325
+ channelName: ch.name,
1326
+ agents
1327
+ });
1328
+ }
1329
+ return out;
1330
+ }
1331
+ function syncSceneModels(scene) {
1332
+ if (!scene || !("registerModelsFromList" in scene)) return;
1333
+ if ("screenToWorld" in scene) scene.registerModelsFromList(characterAssets.models.map((m) => ({
1334
+ id: m.id,
1335
+ file: m.file,
1336
+ name: m.name,
1337
+ kind: m.kind,
1338
+ hFactor: m.hFactor ?? 1
1339
+ })));
1340
+ else scene.registerModelsFromList(characterAssets.models.map((m) => ({
1341
+ id: m.id,
1342
+ file: m.file,
1343
+ name: m.name
1344
+ })));
1345
+ }
1346
+ watch(() => characterAssets.models.map((m) => `${m.id}:${m.file}`).join("|"), () => syncSceneModels(sceneRef.value));
1347
+ /** 用全量设备池收敛场景节点(真设备孪生 + 全部 DAQ 节点投影;按节点 id 对账)。
1348
+ * 必须传 sceneTwinPool 而非 deviceTwins.twins —— syncDevices 会移除不在清单内的
1349
+ * 本地节点,漏掉 daq 投影时设备事件每次到达都会把场景中的数采节点误删。 */
1350
+ function syncSceneDevices(scene) {
1351
+ if ("syncDevices" in scene) scene.syncDevices(sceneTwinPool.value);
1352
+ }
1353
+ watch(() => sceneLayouts.rev, (rev) => {
1354
+ const scene = scene3dRef.value;
1355
+ if (!scene || !sceneLayouts.loaded || rev === 0) return;
1356
+ scene.hydrate(buildTownInput(), Object.values(sceneLayouts.layouts), sceneTwinPool.value);
1357
+ syncChannelDock();
1358
+ });
1359
+ /** 频道坞已放置/未放置标记刷新(布局变化后) */
1360
+ function syncChannelDock() {
1361
+ sceneLayouts.load().finally(() => {});
1362
+ }
1363
+ /** 设备控制台行点击 → 场景镜头聚焦该实体并选中(工业 HMI 联动手感) */
1364
+ function onFocusDevice(t) {
1365
+ const s = scene3dRef.value;
1366
+ if (!s) return;
1367
+ if (typeof t.posX === "number" && typeof t.posZ === "number") s.focusTo(t.posX, t.posZ);
1368
+ s.setSelected?.({
1369
+ kind: "device",
1370
+ id: t.id
1371
+ });
1372
+ }
1373
+ const panelPos = reactive({});
1374
+ function restorePanelPos() {
1375
+ if (typeof localStorage === "undefined") return;
1376
+ try {
1377
+ const saved = JSON.parse(localStorage.getItem(PANEL_POS_KEY) || "{}");
1378
+ for (const k of Object.keys(saved)) if (saved[k] && Number.isFinite(saved[k].x)) panelPos[k] = saved[k];
1379
+ } catch {}
1380
+ }
1381
+ restorePanelPos();
1382
+ /** 领地块(2D 场景无形状数据 → 回退圆) */
1383
+ const minimap = shallowRef(null);
1384
+ const lastDrop = shallowRef(null);
1385
+ /** 模型落点反馈(供 HUD 显示) */
1386
+ const lastDropText = computed(() => {
1387
+ const d = lastDrop.value;
1388
+ if (!d) return "";
1389
+ return d.mode === "rebind" ? t("townView.kgz2nej193", {
1390
+ p0: d.agentId?.slice(0, 8) ?? t("townView.k479op189"),
1391
+ p1: d.textureKey
1392
+ }) : t("townView.k5e2460194", { p0: d.textureKey });
1393
+ });
1394
+ /** 员工会话台:选中角色时展示其「本人」消息(实时缓冲直采,按 agentId 精确归属;重名不串扰) */
1395
+ const agentChatRows = computed(() => {
1396
+ const sel = selected.value;
1397
+ if (!sel || sel.kind !== "agent") return [];
1398
+ const rows = liveChatBuf.get(sel.id);
1399
+ if (!rows || rows.length === 0) return [];
1400
+ const lastHistAt = agentHistory.value.length ? agentHistory.value[agentHistory.value.length - 1]?.at ?? 0 : 0;
1401
+ return rows.filter((r) => r.at > lastHistAt);
1402
+ });
1403
+ const agentChatTitle = computed(() => {
1404
+ if (!selected.value || selected.value.kind !== "agent") return "";
1405
+ return scene3dRef.value?.getAgentName?.(selected.value.id) ?? t("townView.k3xdvm125");
1406
+ });
1407
+ /** 选中角色的实体元数据(状态/harness/角色;驱动会话台头部状态章) */
1408
+ const selectedAgentMeta = computed(() => {
1409
+ const sel = selected.value;
1410
+ if (!sel || sel.kind !== "agent") return null;
1411
+ for (const list of Object.values(entities.agents)) {
1412
+ const a = (list ?? []).find((x) => x.agentId === sel.id);
1413
+ if (a) return a;
1414
+ }
1415
+ return null;
1416
+ });
1417
+ /** 选中角色的职务名(卡片标题/身份章):Leader / Worker —— 以职务取代人称,贴近 Agent Harness 习惯 */
1418
+ const selectedAgentRoleLabel = computed(() => selectedAgentMeta.value?.role === "lead" ? "Leader" : "Worker");
1419
+ const selectedAgentRoleTag = computed(() => selectedAgentMeta.value?.role === "lead" ? "LEADER" : "WORKER");
1420
+ const agentChatStateLabel = computed(() => {
1421
+ const st = selectedAgentMeta.value?.state;
1422
+ if (st === "busy") return t("townView.k3n4l5f163");
1423
+ if (st === "stopped") return t("townView.k3n58d1164");
1424
+ return t("townView.k3zcvb115");
1425
+ });
1426
+ const agentHistory = ref([]);
1427
+ const historyLoading = ref(false);
1428
+ /** 历史缓存(30s TTL;重选同角色短时间内免拉) */
1429
+ const historyCache = /* @__PURE__ */ new Map();
1430
+ const chatScroll = ref(null);
1431
+ /** 实时消息缓冲(agentId → 近实时条目;响应式 Map,computed 直接追踪) */
1432
+ const liveChatBuf = reactive(/* @__PURE__ */ new Map());
1433
+ function cookieToken() {
1434
+ return "";
1435
+ }
1436
+ function channelOfAgent(agentId) {
1437
+ for (const cid of Object.keys(entities.agents)) if ((entities.agents[cid] ?? []).some((a) => a.agentId === agentId)) return cid;
1438
+ }
1439
+ /** 拉取并缓存该角色的历史对话(按 at 升序;force 跳过 TTL 缓存) */
1440
+ async function loadAgentHistory(agentId, channelId, force = false) {
1441
+ const cached = historyCache.get(agentId);
1442
+ if (!force && cached && Date.now() - cached.at < HISTORY_TTL_MS) {
1443
+ agentHistory.value = cached.rows;
1444
+ return;
1445
+ }
1446
+ historyLoading.value = true;
1447
+ try {
1448
+ const tok = cookieToken();
1449
+ const q = `/api/workshop/channels/${channelId}/events?limit=500&excludeTypes=agent.delta`;
1450
+ const json = await (await fetch(q, { headers: tok ? { authorization: `Bearer ${decodeURIComponent(tok)}` } : {} })).json().catch(() => null);
1451
+ const events = json?.data?.items ?? (Array.isArray(json?.data) ? json.data : []);
1452
+ const rows = [];
1453
+ for (const e of events) {
1454
+ const b = mapEnvelopeToIntent(e)?.bubble;
1455
+ if (!b || b.agentId !== agentId) continue;
1456
+ const atRaw = e.at;
1457
+ const at = typeof atRaw === "number" ? atRaw : atRaw ? Date.parse(String(atRaw)) : 0;
1458
+ rows.push({
1459
+ id: `${String(e.seq ?? rows.length)}-${rows.length}`,
1460
+ agentId: b.agentId,
1461
+ text: b.text,
1462
+ kind: b.kind,
1463
+ at,
1464
+ live: false
1465
+ });
1466
+ }
1467
+ rows.sort((a, b) => a.at - b.at);
1468
+ historyCache.set(agentId, {
1469
+ rows,
1470
+ at: Date.now()
1471
+ });
1472
+ agentHistory.value = rows;
1473
+ } catch {
1474
+ agentHistory.value = [];
1475
+ } finally {
1476
+ historyLoading.value = false;
1477
+ }
1478
+ }
1479
+ watch(() => selected.value, (sel) => {
1480
+ if (!sel || sel.kind !== "agent") {
1481
+ agentHistory.value = [];
1482
+ return;
1483
+ }
1484
+ const cid = channelOfAgent(sel.id);
1485
+ if (cid) loadAgentHistory(sel.id, cid);
1486
+ else agentHistory.value = [];
1487
+ }, { immediate: true });
1488
+ /** 选中角色的身份色(频道哈希,与场景环同源) */
1489
+ const agentChatColor = computed(() => {
1490
+ const sel = selected.value;
1491
+ if (!sel || sel.kind !== "agent") return "#35e0a0";
1492
+ const cid = channelOfAgent(sel.id);
1493
+ return cid ? channelColorCss(cid) ?? "#35e0a0" : "#35e0a0";
1494
+ });
1495
+ /** 对话类型标签(工业 HMI 小印章) */
1496
+ function chatKindLabel(kind) {
1497
+ switch (kind) {
1498
+ case "artifact": return t("townView.k3w9q9165");
1499
+ case "delta": return "……";
1500
+ case "info": return t("townView.k44xa7166");
1501
+ case "error": return t("townView.k3zbgf167");
1502
+ default: return "";
1503
+ }
1504
+ }
1505
+ /** 时间戳(HH:MM:SS;空值占位) */
1506
+ function fmtTime(at) {
1507
+ if (!at || !Number.isFinite(at) || at <= 0) return "--:--:--";
1508
+ const d = new Date(at);
1509
+ return `${String(d.getHours()).padStart(2, "0")}:${String(d.getMinutes()).padStart(2, "0")}:${String(d.getSeconds()).padStart(2, "0")}`;
1510
+ }
1511
+ watch(() => agentHistory.value.length + agentChatRows.value.length, async () => {
1512
+ await nextTick();
1513
+ const el = chatScroll.value;
1514
+ if (el) el.scrollTop = el.scrollHeight;
1515
+ });
1516
+ /** 场景管线统一设备池:真实设备孪生(剔除旧 daq 孪生)+ server 数采节点伪孪生 */
1517
+ /** 产线光晕色(lineId → Hex;未分配 undefined = 缺省绿) */
1518
+ const lineColorOf = (lid) => dcw.lines.find((l) => l.id === lid)?.color;
1519
+ /** 智控节点伪孪生投影(与 daqTwins 同构;value = 当前设定值;lineColor = 产线光环) */
1520
+ const dcwTwins = computed(() => dcw.nodes.map((n) => ({
1521
+ id: n.id,
1522
+ workspaceId: "",
1523
+ name: n.name,
1524
+ modelRef: `dcw-${n.templateRef.startsWith("dcw-") ? n.templateRef.slice(4) : n.templateRef}`,
1525
+ boundAgentId: null,
1526
+ kind: "daq",
1527
+ telemetry: { value: n.value ?? 0 },
1528
+ desired: {},
1529
+ controls: [],
1530
+ state: n.enabled ? n.state === "error" ? "alarm" : "running" : "offline",
1531
+ posX: n.posX,
1532
+ posZ: n.posZ,
1533
+ lineId: n.lineId || void 0,
1534
+ lineColor: n.lineId ? lineColorOf(n.lineId) : void 0,
1535
+ updatedAt: n.lastWriteAt ?? n.createdAt
1536
+ })));
1537
+ const sceneTwinPool = computed(() => [
1538
+ ...deviceTwins.twins.filter((t) => !isLegacyDaqTwin(t)),
1539
+ ...daqTwins.value,
1540
+ ...dcwTwins.value
1541
+ ]);
1542
+ const sceneTwinById = (id) => sceneTwinPool.value.find((t) => t.id === id);
1543
+ /** 空场景提示判定:场景里没有任何「已落位」实体(设备/数采/数控)且无频道积木时才提示。
1544
+ * 只看 blockCount 会在清空频道布局后、设备与工业节点仍在场时误报"空场景"。 */
1545
+ const sceneEmpty = computed(() => ready.value && blockCount.value === 0 && !sceneTwinPool.value.some((t) => typeof t.posX === "number" && typeof t.posZ === "number"));
1546
+ /** 事件流:最近事件队列(at 供右轨"实时事件"面板;2D 场景无 at → 占位) */
1547
+ const ticker = shallowRef([]);
1548
+ /** 数采流单例:REST 快照 + townBus WS 帧(reading/node.changed/controller) */
1549
+ const daq = useDaqStream();
1550
+ /** 智控流单例(写控制;与数采对称:模板目录/节点/场景/绑定) */
1551
+ const dcw = useDcwStream();
1552
+ /** 智控模板目录(server 权威;与 daqTemplates 同构投影) */
1553
+ const dcwTemplates = reactive(dcw.templates.map((t) => ({
1554
+ id: t.key,
1555
+ name: t.name,
1556
+ code: t.code,
1557
+ ch: t.ch,
1558
+ unit: t.unit,
1559
+ min: t.min,
1560
+ max: t.max,
1561
+ decimals: t.decimals,
1562
+ icon: t.icon
1563
+ })));
1564
+ watch(() => dcw.templates, (list) => {
1565
+ if (!list?.length) return;
1566
+ dcwTemplates.splice(0, dcwTemplates.length, ...list.map((t) => ({
1567
+ id: t.key,
1568
+ name: t.name,
1569
+ code: t.code,
1570
+ ch: t.ch,
1571
+ unit: t.unit,
1572
+ min: t.min,
1573
+ max: t.max,
1574
+ decimals: t.decimals,
1575
+ icon: t.icon
1576
+ })));
1577
+ }, {
1578
+ immediate: true,
1579
+ deep: true
1580
+ });
1581
+ /** 左轨树形目录:模板 = 可展开分组(不可拖拽),节点 = 可拖入场景的叶子。
1582
+ * 展开状态持久化(aw.twin.treeOpen),拖拽载荷 = 既有节点 id(非模板)。 */
1583
+ const treeOpen = useStorage("aw.twin.treeOpen", {});
1584
+ const daqNodesByTpl = computed(() => {
1585
+ const m = /* @__PURE__ */ new Map();
1586
+ for (const n of daq.nodes) {
1587
+ const key = n.templateRef.startsWith("daq-") ? n.templateRef.slice(4) : n.templateRef;
1588
+ const arr = m.get(key) ?? [];
1589
+ arr.push(n);
1590
+ m.set(key, arr);
1591
+ }
1592
+ for (const arr of m.values()) arr.sort((a, b) => a.name.localeCompare(b.name, void 0, { numeric: true }));
1593
+ return m;
1594
+ });
1595
+ const dcwNodesByTpl = computed(() => {
1596
+ const m = /* @__PURE__ */ new Map();
1597
+ for (const n of dcw.nodes) {
1598
+ const key = n.templateRef.startsWith("dcw-") ? n.templateRef.slice(4) : n.templateRef;
1599
+ const arr = m.get(key) ?? [];
1600
+ arr.push(n);
1601
+ m.set(key, arr);
1602
+ }
1603
+ for (const arr of m.values()) arr.sort((a, b) => a.name.localeCompare(b.name, void 0, { numeric: true }));
1604
+ return m;
1605
+ });
1606
+ /** 叶子状态点(与伪孪生投影同一状态语义):绿=运行/黄=预警/红=告警/空心=离线 */
1607
+ function daqLeafState(n) {
1608
+ if (!daq.controller.running || !n.enabled || n.state === "offline") return "offline";
1609
+ if (n.state === "alarm") return "alarm";
1610
+ if (n.state === "warn") return "warn";
1611
+ return "running";
1612
+ }
1613
+ function dcwLeafState(n) {
1614
+ if (!n.enabled || n.state === "error") return "offline";
1615
+ return "running";
1616
+ }
1617
+ /** 左轨模板目录(server 权威:内置 + 自定义随 REST/WS 收敛;字段名兼容既有轨道模板标记) */
1618
+ const daqTemplates = reactive(DAQ_TEMPLATES.map((t) => ({
1619
+ id: t.key,
1620
+ name: t.name,
1621
+ code: t.code,
1622
+ ch: t.ch,
1623
+ unit: t.unit,
1624
+ base: t.base,
1625
+ amp: t.amp,
1626
+ min: t.min,
1627
+ max: t.max,
1628
+ decimals: t.decimals,
1629
+ icon: t.icon
1630
+ })));
1631
+ watch(() => daq.templates, (list) => {
1632
+ if (!list?.length) return;
1633
+ daqTemplates.splice(0, daqTemplates.length, ...list.map((t) => ({
1634
+ id: t.key,
1635
+ name: t.name,
1636
+ code: t.code,
1637
+ ch: t.ch,
1638
+ unit: t.unit,
1639
+ base: t.base,
1640
+ amp: t.amp,
1641
+ min: t.min,
1642
+ max: t.max,
1643
+ decimals: t.decimals,
1644
+ icon: t.icon
1645
+ })));
1646
+ }, {
1647
+ immediate: true,
1648
+ deep: true
1649
+ });
1650
+ const daqTplById = (ref) => {
1651
+ const key = ref.startsWith("daq-") ? ref.slice(4) : ref;
1652
+ return daqTemplates.find((t) => t.id === key);
1653
+ };
1654
+ const daqTplOf = (n) => daqTplById(n.templateRef);
1655
+ /** 孪生状态映射(node state → DeviceTwin.state 联合;warn 在值卡层表达) */
1656
+ function effectiveTwinState(n) {
1657
+ if (!daq.controller.running || !n.enabled) return "offline";
1658
+ if (n.state === "alarm") return "alarm";
1659
+ return "running";
1660
+ }
1661
+ /** 场景中的数采实例(server Node → 伪孪生投影;与设备孪生同构进 syncDevices/callout 管线) */
1662
+ const isLegacyDaqTwin = (t) => t.kind === "daq" || (t.modelRef ?? "").startsWith("daq-");
1663
+ const daqTwins = computed(() => daq.nodes.map((n) => ({
1664
+ id: n.id,
1665
+ workspaceId: "",
1666
+ name: n.name,
1667
+ modelRef: `daq-${daqTplOf(n)?.id ?? "unknown"}`,
1668
+ boundAgentId: null,
1669
+ kind: "daq",
1670
+ telemetry: { value: n.value ?? 0 },
1671
+ desired: {},
1672
+ controls: [],
1673
+ state: effectiveTwinState(n),
1674
+ posX: n.posX,
1675
+ posZ: n.posZ,
1676
+ lineId: n.lineId || void 0,
1677
+ lineColor: n.lineId ? lineColorOf(n.lineId) : void 0,
1678
+ updatedAt: n.lastAt ?? n.createdAt
1679
+ })));
1680
+ /**
1681
+ * 兼容视图:旧 UI 全部消费 DaqSimState(value/hist/tpl/alarm),保留同形结构。
1682
+ *
1683
+ * 双通道数据消费(与渲染帧率彻底解耦):
1684
+ * - 消费层:WS 读数帧直写 rtcVals/rtcHist(非响应式,帧到即入,零合批延迟),
1685
+ * 告警边沿检测同帧完成(异常事件即时上屏);
1686
+ * - 展示层:daqSim 计算属性消费 rtc 覆盖 + store hist(趋势),帧计数器作失效信号,
1687
+ * Vue 渲染管线自行合批 DOM 更新;场景渲染循环每帧只取「当前最新值」。
1688
+ */
1689
+ const liveTick = ref(0);
1690
+ const rtcVals = /* @__PURE__ */ new Map();
1691
+ const rtcHist = /* @__PURE__ */ new Map();
1692
+ const daqSim = computed(() => {
1693
+ liveTick.value;
1694
+ const m = /* @__PURE__ */ new Map();
1695
+ for (const n of daq.nodes) {
1696
+ const tpl = daqTplOf(n);
1697
+ if (!tpl) continue;
1698
+ const lv = rtcVals.get(n.id);
1699
+ const fresher = lv && (!n.lastAt || lv.atMs >= Date.parse(n.lastAt));
1700
+ const value = fresher ? lv.value : n.value;
1701
+ if (value == null) continue;
1702
+ const state = fresher ? lv.state : n.state;
1703
+ m.set(n.id, {
1704
+ value,
1705
+ hist: rtcHist.get(n.id) ?? n.hist,
1706
+ phase: 0,
1707
+ tpl,
1708
+ alarm: state === "alarm"
1709
+ });
1710
+ }
1711
+ return m;
1712
+ });
1713
+ const fmtDaq = (st) => st.value.toFixed(st.tpl.decimals);
1714
+ /** 告警推进(server 派生 state 变化 → 场景告警面板;恢复自动消警语义保持)。
1715
+ * prevDaqState 为帧通道(即时)与批量 watch(兜底)共享的去重账本 —— 先到先记。 */
1716
+ const prevDaqState = /* @__PURE__ */ new Map();
1717
+ /** 状态边沿 → 告警文案(crit/warn/恢复 info;label 优先绑定设备名) */
1718
+ function stateEdgeAlarm(nodeId, prevState, nextState, value) {
1719
+ const n = daq.nodeById(nodeId);
1720
+ const tpl = n ? daqTplOf(n) : null;
1721
+ const label = (n?.deviceBindingId ? deviceTwins.byId(n.deviceBindingId)?.name : null) ?? n?.name ?? nodeId.slice(0, 8);
1722
+ const val = `${value?.toFixed(tpl?.decimals ?? 2) ?? "--"} ${tpl?.unit ?? ""}`;
1723
+ if (nextState === "alarm") raiseAlarm(t("townView.k113fir9195", {
1724
+ p0: label,
1725
+ p1: tpl?.ch ?? "",
1726
+ p2: val
1727
+ }), "crit", label);
1728
+ else if (nextState === "warn") raiseAlarm(t("townView.k1knv89d196", {
1729
+ p0: label,
1730
+ p1: tpl?.ch ?? "",
1731
+ p2: val
1732
+ }), "warn", label);
1733
+ else if (prevState !== "ok" && nextState === "ok") raiseAlarm(t("townView.ksjancw197", {
1734
+ p0: label,
1735
+ p1: tpl?.ch ?? ""
1736
+ }), "info", label);
1737
+ }
1738
+ /** 批量兜底:REST 快照收敛时捕捉帧通道未见的边沿(如离线判定);帧通道已记的自动去重 */
1739
+ watch(() => daq.nodes.map((n) => `${n.id}:${n.state}`).join("|"), () => {
1740
+ for (const n of daq.nodes) {
1741
+ const prev = prevDaqState.get(n.id);
1742
+ prevDaqState.set(n.id, n.state);
1743
+ if (!prev || prev === n.state) continue;
1744
+ stateEdgeAlarm(n.id, prev, n.state, n.value);
1745
+ }
1746
+ });
1747
+ function approvalRemainingSec(ap) {
1748
+ return Math.max(0, Math.ceil((Date.parse(ap.expiresAt) - Date.now()) / 1e3));
1749
+ }
1750
+ const authHeaders = () => {
1751
+ const token = (void 0).cookie.match(/(?:^|;\s*)token=([^;]+)/)?.[1] ?? "";
1752
+ return {
1753
+ "content-type": "application/json",
1754
+ "authorization": `Bearer ${decodeURIComponent(token)}`
1755
+ };
1756
+ };
1757
+ const agentBindings = ref([]);
1758
+ const agentBindKind = ref("dcw");
1759
+ const agentBindNodeId = ref("");
1760
+ const agentBindMode = ref("auto");
1761
+ const pendingApprovals = ref([]);
1762
+ const approvalComments = reactive({});
1763
+ let approvalPoll = null;
1764
+ async function loadAgentBindings() {
1765
+ const id = selected.value?.id;
1766
+ if (selected.value?.kind !== "agent" || !id) return;
1767
+ try {
1768
+ const r = await fetch(`/api/workshop/agent-tools/bindings?agentId=${encodeURIComponent(id)}`, { headers: authHeaders() }).then((x) => x.json());
1769
+ agentBindings.value = r.data?.bindings ?? [];
1770
+ } catch {}
1771
+ }
1772
+ async function loadPendingApprovals() {
1773
+ const id = selected.value?.id;
1774
+ if (selected.value?.kind !== "agent" || !id) return;
1775
+ try {
1776
+ const r = await fetch(`/api/workshop/agent-tools/approvals?agentId=${encodeURIComponent(id)}`, { headers: authHeaders() }).then((x) => x.json());
1777
+ pendingApprovals.value = r.data?.approvals ?? [];
1778
+ } catch {}
1779
+ }
1780
+ watch(() => selected.value?.id, (id) => {
1781
+ if (approvalPoll) {
1782
+ clearInterval(approvalPoll);
1783
+ approvalPoll = null;
1784
+ }
1785
+ if (selected.value?.kind === "agent" && id) {
1786
+ loadAgentBindings();
1787
+ loadPendingApprovals();
1788
+ approvalPoll = setInterval();
1789
+ }
1790
+ }, { immediate: true });
1791
+ /** 绑定行的节点名(dcw/daq store 解析) */
1792
+ function bindingNodeName(b) {
1793
+ return b.kind === "dcw" ? dcw.nodeById(b.nodeId)?.name ?? b.nodeId : daq.nodeById(b.nodeId)?.name ?? b.nodeId;
1794
+ }
1795
+ /** 数采 → 设备绑定(server 权威:node.deviceBindingId;REST bind 落库 + WS 收敛) */
1796
+ const boundDeviceOf = (daqId) => daq.nodeById(daqId)?.deviceBindingId ?? null;
1797
+ const daqOfDevice = (deviceId) => deviceId ? daq.nodes.filter((n) => n.deviceBindingId === deviceId).map((n) => n.id) : [];
1798
+ /** 数采模板图标(设计稿 ICONS;SVG path 直嵌) */
1799
+ const DAQ_ICONS = {
1800
+ thermo: "<path d=\"M10 4a2 2 0 0 1 4 0v9a4 4 0 1 1-4 0V4Z\"/><circle cx=\"12\" cy=\"16.5\" r=\"1.6\"/>",
1801
+ pressure: "<circle cx=\"12\" cy=\"12\" r=\"8\"/><path d=\"m12 12 3.5-3.5\"/><circle cx=\"12\" cy=\"12\" r=\"1.2\"/>",
1802
+ tension: "<circle cx=\"12\" cy=\"10\" r=\"4\"/><path d=\"M4 18.5h16M8 18.5V14M16 18.5V14\"/><path d=\"M2.5 10H8M16 10h5.5\"/>",
1803
+ encoder: "<circle cx=\"12\" cy=\"12\" r=\"8\"/><circle cx=\"12\" cy=\"12\" r=\"2\"/><path d=\"M12 4v3M12 17v3M4 12h3M17 12h3\"/>",
1804
+ camera: "<rect x=\"3\" y=\"7\" width=\"13\" height=\"10\" rx=\"2\"/><path d=\"m16 11 5-3v8l-5-3\"/><circle cx=\"8\" cy=\"12\" r=\"2.5\"/>",
1805
+ gateway: "<rect x=\"8\" y=\"11\" width=\"8\" height=\"10\" rx=\"1.5\"/><circle cx=\"12\" cy=\"5.5\" r=\"1.5\"/><path d=\"M12 10V7M8.5 8.5a5 5 0 0 1 7 0M6 6a8.5 8.5 0 0 1 12 0\"/>"
1806
+ };
1807
+ const daqIcon = (icon) => DAQ_ICONS[icon] ?? DAQ_ICONS.gateway;
1808
+ /** bind-pop:添加数采通道 —— 直接选择节点实例绑定(server 权威 deviceBindingId,双向同源)。
1809
+ * 列出未绑定 + 绑在他设备的节点(按模板分组,显示当前归属);不再隐式创建/就近复用。 */
1810
+ const bindPopOpen = ref(false);
1811
+ const dcwBindPopOpen = ref(false);
1812
+ /** 弹层高度钳制:top 恰好贴住所属 Inspector 卡片顶缘(不越出面板、不顶到页面顶部) */
1813
+ const bindPopMaxH = ref(420);
1814
+ const daqBindChoices = computed(() => {
1815
+ const devId = selected.value?.kind === "device" ? selected.value.id : "";
1816
+ const map = {};
1817
+ if (!devId) return map;
1818
+ for (const n of daq.nodes) {
1819
+ if (n.deviceBindingId === devId) continue;
1820
+ const tpl = daqTplOf(n);
1821
+ if (!tpl) continue;
1822
+ (map[tpl.id] ??= []).push({
1823
+ id: n.id,
1824
+ name: n.name,
1825
+ tpl,
1826
+ devName: n.deviceBindingId ? deviceTwins.byId(n.deviceBindingId)?.name ?? null : null,
1827
+ placed: typeof n.posX === "number"
1828
+ });
1829
+ }
1830
+ return map;
1831
+ });
1832
+ const daqBindChoiceCount = computed(() => Object.values(daqBindChoices.value).reduce((s, a) => s + a.length, 0));
1833
+ /** 场景链路同步:绑定关系 → TownScene3D.syncDaqLinks(虚线 + 脉冲);server 绑定为权威 */
1834
+ watch(() => daq.nodes.map((n) => `${n.id}:${n.posX ?? ""}:${n.posZ ?? ""}:${n.enabled}:${n.state}:${n.deviceBindingId ?? ""}`).join("|"), () => {
1835
+ if (sceneRef.value) syncSceneDevices(sceneRef.value);
1836
+ });
1837
+ watch(() => dcw.nodes.map((n) => `${n.id}:${n.posX ?? ""}:${n.posZ ?? ""}:${n.enabled}:${n.deviceBindingId ?? ""}:${n.value ?? ""}`).join("|"), () => {
1838
+ if (sceneRef.value) syncSceneDevices(sceneRef.value);
1839
+ });
1840
+ watch(() => daq.nodes.map((n) => `${n.id}:${n.deviceBindingId ?? ""}`).join("|"), () => {
1841
+ const s = scene3dRef.value;
1842
+ if (!s || !("syncDaqLinks" in s)) return;
1843
+ s.syncDaqLinks(daq.nodes.filter((n) => n.deviceBindingId).map((n) => ({
1844
+ daqId: n.id,
1845
+ deviceId: n.deviceBindingId
1846
+ })));
1847
+ });
1848
+ /** 选中上下文:是否数采节点 / 其模板 / 实时值 */
1849
+ const selectedIsDaq = computed(() => selected.value?.kind === "device" && (daqOfSelected.value?.modelRef || "").startsWith("daq-"));
1850
+ const daqOfSelected = computed(() => {
1851
+ if (selected.value?.kind !== "device") return null;
1852
+ return sceneTwinById(selected.value?.id) ?? null;
1853
+ });
1854
+ const selectedDaqSim = computed(() => {
1855
+ const id = selected.value?.id;
1856
+ return id ? daqSim.value.get(id) ?? null : null;
1857
+ });
1858
+ /** 绑定选择器:待绑定数采下拉 */
1859
+ const bindPick = ref("");
1860
+ const boundDaqRows = computed(() => {
1861
+ const id = selected.value?.id;
1862
+ if (!id) return [];
1863
+ return daqOfDevice(id).map((daqId) => {
1864
+ const t = sceneTwinById(daqId);
1865
+ const st = daqSim.value.get(daqId);
1866
+ const tpl = st?.tpl ?? daqTplById(t?.modelRef ?? "");
1867
+ return {
1868
+ daqId,
1869
+ name: t?.name ?? daqId,
1870
+ ch: tpl?.ch ?? t("townView.k1ef3cls168"),
1871
+ icon: tpl?.icon ?? "gateway",
1872
+ value: st ? fmtDaq(st) : "--",
1873
+ unit: st?.tpl.unit ?? tpl?.unit ?? "",
1874
+ color: trendColor(daqId)
1875
+ };
1876
+ });
1877
+ });
1878
+ /** 数采节点选中:其绑定设备名 */
1879
+ const daqBoundDeviceName = computed(() => {
1880
+ const id = selected.value?.id;
1881
+ if (!id) return "";
1882
+ const devId = boundDeviceOf(id);
1883
+ if (!devId) return "";
1884
+ return deviceTwins.twins.find((t) => t.id === devId)?.name ?? devId.slice(0, 8);
1885
+ });
1886
+ const dcwOfDevice = (deviceId) => deviceId ? dcw.nodes.filter((n) => n.deviceBindingId === deviceId) : [];
1887
+ /** 活动配方对该智控节点的工艺窗口参数(产线未开跑/未命中 → null = 用节点全局量程) */
1888
+ /** 节点所属产线的活动配方窗口参数(逐产线运行窗;节点级寻址) */
1889
+ function activeRecipeParamOf(dcwId) {
1890
+ const node = dcw.nodeById(dcwId);
1891
+ if (!node || !node.lineId) return null;
1892
+ const run = dcw.lineStateOf(node.lineId);
1893
+ if (!run.active || !run.recipeId) return null;
1894
+ const r = dcw.recipes.find((x) => x.id === run.recipeId);
1895
+ if (!r) return null;
1896
+ return r.params.find((p) => p.nodeId === dcwId) ?? null;
1897
+ }
1898
+ const boundDcwRows = computed(() => {
1899
+ const id = selected.value?.id;
1900
+ if (!id) return [];
1901
+ return dcwOfDevice(id).map((n) => {
1902
+ const key = n.templateRef.startsWith("dcw-") ? n.templateRef.slice(4) : n.templateRef;
1903
+ const tpl = dcw.templates.find((t) => t.key === key);
1904
+ const rp = activeRecipeParamOf(n.id);
1905
+ return {
1906
+ dcwId: n.id,
1907
+ name: n.name,
1908
+ ch: tpl?.ch ?? key,
1909
+ unit: n.unit,
1910
+ icon: tpl?.icon ?? "gateway",
1911
+ value: n.value,
1912
+ state: n.state,
1913
+ decimals: n.decimals,
1914
+ gMin: n.min,
1915
+ gMax: n.max,
1916
+ rMin: rp?.min ?? null,
1917
+ rMax: rp?.max ?? null
1918
+ };
1919
+ });
1920
+ });
1921
+ /** 生效窗口:活动配方窗口优先,否则节点全局量程 */
1922
+ function dcwWindowOf(node) {
1923
+ const rp = activeRecipeParamOf(node.id);
1924
+ if (rp && (rp.min != null || rp.max != null)) return {
1925
+ lo: rp.min ?? Number.NEGATIVE_INFINITY,
1926
+ hi: rp.max ?? Number.POSITIVE_INFINITY,
1927
+ src: "recipe"
1928
+ };
1929
+ return {
1930
+ lo: node.min,
1931
+ hi: node.max,
1932
+ src: "global"
1933
+ };
1934
+ }
1935
+ /** 窗口游标(0~100%):当前设定值在生效窗口带上的位置(越界钳边;∞ 窗口居中) */
1936
+ function dcwMarkPct(r) {
1937
+ const lo = r.rMin ?? r.gMin;
1938
+ const hi = r.rMax ?? r.gMax;
1939
+ if (!Number.isFinite(lo) || !Number.isFinite(hi) || hi <= lo || r.value == null) return 50;
1940
+ return Math.min(100, Math.max(0, (r.value - lo) / (hi - lo) * 100));
1941
+ }
1942
+ const dcwWriteDrafts = reactive({});
1943
+ const dcwWriteErrs = reactive({});
1944
+ /** 添加智控通道 —— 直接选择节点实例绑定(与数采同构;绑定后设备面板可 SET 直写) */
1945
+ const dcwTplById = (ref_) => {
1946
+ const key = ref_.startsWith("dcw-") ? ref_.slice(4) : ref_;
1947
+ return dcwTemplates.find((t) => t.id === key);
1948
+ };
1949
+ const dcwBindChoices = computed(() => {
1950
+ const devId = selected.value?.kind === "device" ? selected.value.id : "";
1951
+ const map = {};
1952
+ if (!devId) return map;
1953
+ for (const n of dcw.nodes) {
1954
+ if (n.deviceBindingId === devId) continue;
1955
+ const tpl = dcwTplById(n.templateRef);
1956
+ if (!tpl) continue;
1957
+ (map[tpl.id] ??= []).push({
1958
+ id: n.id,
1959
+ name: n.name,
1960
+ tpl,
1961
+ devName: n.deviceBindingId ? deviceTwins.byId(n.deviceBindingId)?.name ?? null : null,
1962
+ placed: typeof n.posX === "number"
1963
+ });
1964
+ }
1965
+ return map;
1966
+ });
1967
+ const dcwBindChoiceCount = computed(() => Object.values(dcwBindChoices.value).reduce((s, a) => s + a.length, 0));
1968
+ /** 选中智控节点(检查器:绑定设备 + 设定值直写) */
1969
+ const selectedIsDcw = computed(() => selected.value?.kind === "device" && (sceneTwinById(selected.value?.id)?.modelRef ?? "").startsWith("dcw-"));
1970
+ const selectedDcwNode = computed(() => {
1971
+ const id = selected.value?.id;
1972
+ return id ? dcw.nodeById(id) ?? null : null;
1973
+ });
1974
+ const selectedDcwWindow = computed(() => {
1975
+ const n = selectedDcwNode.value;
1976
+ return n ? dcwWindowOf(n) : null;
1977
+ });
1978
+ const selectedDcwDeviceName = computed(() => {
1979
+ const n = selectedDcwNode.value;
1980
+ if (!n?.deviceBindingId) return "";
1981
+ return deviceTwins.twins.find((t) => t.id === n.deviceBindingId)?.name ?? n.deviceBindingId.slice(0, 8);
1982
+ });
1983
+ const dcwBindPick = ref("");
1984
+ function dcwWinLabel(n) {
1985
+ if (!n) return "--";
1986
+ const w = dcwWindowOf(n);
1987
+ return `${Number.isFinite(w.lo) ? w.lo : "-∞"} ~ ${Number.isFinite(w.hi) ? w.hi : "+∞"} ${n.unit}`;
1988
+ }
1989
+ function dcwWinInputPh(n) {
1990
+ if (!n) return "";
1991
+ const w = dcwWindowOf(n);
1992
+ return `${Number.isFinite(w.lo) ? w.lo : ""} ~ ${Number.isFinite(w.hi) ? w.hi : ""}`;
1993
+ }
1994
+ /** 选中数采节点的 live 视图(检查器单点控制用:启停/周期/阈值/解绑/删除) */
1995
+ const selectedDaqNode = computed(() => {
1996
+ const id = selected.value?.id;
1997
+ return id ? daq.nodeById(id) ?? null : null;
1998
+ });
1999
+ const daqIntervalDraft = ref(null);
2000
+ watch(selectedDaqNode, (n) => {
2001
+ daqIntervalDraft.value = n ? n.intervalMs ?? daq.controller.defaultIntervalMs : null;
2002
+ }, { immediate: true });
2003
+ /** 标注显隐(设计稿 tPins,默认开) */
2004
+ const showCallouts = ref(true);
2005
+ /** 自动环绕(设计稿 tOrbit) */
2006
+ const orbitOn = ref(false);
2007
+ /** 悬浮标注(绑定设备的实时值;150ms 跟随投影) */
2008
+ const calloutPos = ref({});
2009
+ /** 越近越亮:相机到锚点的 3D 距离阈值(世界单位;用户可在场景控制里调节)。
2010
+ * 只有所注视/飞近的设备亮起数据,邻机与远方节点保持静默 —— 数据属于走近的人。 */
2011
+ const calloutNearDist = useStorage("aw.twin.calloutNear", 1150);
2012
+ /** 设备控制台实时数采(twinId → 相关通道;数采自身 + 绑定设备双挂,随 server 读数流刷新) */
2013
+ const daqLive = computed(() => {
2014
+ const map = {};
2015
+ for (const t of daqTwins.value) {
2016
+ const st = daqSim.value.get(t.id);
2017
+ if (!st) continue;
2018
+ const row = {
2019
+ ch: st.tpl.ch,
2020
+ value: fmtDaq(st),
2021
+ unit: st.tpl.unit,
2022
+ alarm: st.alarm ?? false
2023
+ };
2024
+ (map[t.id] ??= []).push(row);
2025
+ const dev = boundDeviceOf(t.id);
2026
+ if (dev) (map[dev] ??= []).push(row);
2027
+ }
2028
+ return map;
2029
+ });
2030
+ /** 智控设定实时数据(关键设备监控卡片:twinId → 该设备绑定的全部智控通道;
2031
+ * 含当前 set 值与生效上下限(活动配方工艺窗口优先,否则节点全局量程),由 TownView 喂入) */
2032
+ const dcwLive = computed(() => {
2033
+ const map = {};
2034
+ for (const n of dcw.nodes) {
2035
+ if (!n.deviceBindingId) continue;
2036
+ const key = n.templateRef.startsWith("dcw-") ? n.templateRef.slice(4) : n.templateRef;
2037
+ const tpl = dcw.templates.find((t) => t.key === key);
2038
+ const w = dcwWindowOf(n);
2039
+ (map[n.deviceBindingId] ??= []).push({
2040
+ id: n.id,
2041
+ ch: tpl?.ch ?? key,
2042
+ name: n.name,
2043
+ unit: n.unit,
2044
+ value: n.value,
2045
+ decimals: n.decimals,
2046
+ lo: w.lo,
2047
+ hi: w.hi,
2048
+ src: w.src
2049
+ });
2050
+ }
2051
+ return map;
2052
+ });
2053
+ /** 同设备多路通道的竖排堆叠间距(px;卡高 ~88 + 间隙) */
2054
+ const camPose = ref({
2055
+ pos: {
2056
+ x: 0,
2057
+ y: 0,
2058
+ z: 0
2059
+ },
2060
+ target: {
2061
+ x: 0,
2062
+ z: 0
2063
+ },
2064
+ yaw: 0,
2065
+ dolly: 1
2066
+ });
2067
+ const callouts = computed(() => {
2068
+ if (!showCallouts.value) return [];
2069
+ const s3 = scene3dRef.value;
2070
+ if (!s3) return [];
2071
+ const nodes = s3.getDeviceNodes();
2072
+ const stageW = stageRef.value?.clientWidth ?? 1600;
2073
+ const rows = [];
2074
+ for (const t of daqTwins.value) {
2075
+ const st = daqSim.value.get(t.id);
2076
+ if (!st) continue;
2077
+ const boundDev = boundDeviceOf(t.id);
2078
+ const anchor = boundDev ? nodes.find((n) => n.twinId === boundDev) : nodes.find((n) => n.twinId === t.id);
2079
+ if (!anchor) continue;
2080
+ const pos = calloutPos.value[t.id];
2081
+ if (!pos) continue;
2082
+ rows.push({
2083
+ t,
2084
+ st,
2085
+ anchor,
2086
+ pos
2087
+ });
2088
+ }
2089
+ const anchorTopY = new Map(rows.map((r) => [r.anchor.twinId, r.anchor.topY]));
2090
+ const byAnchor = /* @__PURE__ */ new Map();
2091
+ for (const r of rows) {
2092
+ const list = byAnchor.get(r.anchor.twinId) ?? [];
2093
+ list.push(r);
2094
+ byAnchor.set(r.anchor.twinId, list);
2095
+ }
2096
+ const out = [];
2097
+ for (const group of byAnchor.values()) {
2098
+ group.sort((a, b) => a.t.id < b.t.id ? -1 : 1);
2099
+ const head = group[0];
2100
+ const near = Math.hypot(camPose.value.pos.x - head.anchor.x, camPose.value.pos.y - (anchorTopY.get(head.anchor.twinId) ?? 60), camPose.value.pos.z - head.anchor.z) < calloutNearDist.value;
2101
+ const cx = Math.min(stageW - 96, Math.max(96, head.pos.x));
2102
+ group.forEach((r, i) => {
2103
+ const { lo, hi } = alarmRange(r.st.tpl.min, r.st.tpl.max);
2104
+ out.push({
2105
+ id: r.t.id,
2106
+ x: cx,
2107
+ y: head.pos.y - i * CALLOUT_STACK,
2108
+ label: `${r.st.tpl.ch} · ${r.anchor.name || r.t.name}`,
2109
+ value: fmtDaq(r.st),
2110
+ unit: r.st.tpl.unit,
2111
+ lo,
2112
+ hi,
2113
+ warn: r.st.alarm ?? false,
2114
+ near,
2115
+ leader: i === 0
2116
+ });
2117
+ });
2118
+ }
2119
+ return out;
2120
+ });
2121
+ /** KPI 条(舞台底部居中浮条) */
2122
+ const deviceCount = computed(() => deviceTwins.twins.length);
2123
+ const runningCount = computed(() => deviceTwins.twins.filter((t) => t.state === "running").length);
2124
+ /** 顶栏用户 */
2125
+ const userStore = useUserStore();
2126
+ /** 舞台引用(全屏)与视角预设 */
2127
+ const stageRef = ref(null);
2128
+ const viewPreset = ref("std");
2129
+ /** 设备健康度(环形图数据) */
2130
+ const idleCount = computed(() => deviceTwins.twins.filter((t) => t.state === "idle").length);
2131
+ const alarmCount = computed(() => deviceTwins.twins.filter((t) => t.state === "alarm").length);
2132
+ const offlineCount = computed(() => deviceTwins.twins.filter((t) => t.state === "offline").length);
2133
+ const healthPct = computed(() => {
2134
+ const total = deviceTwins.twins.length;
2135
+ if (!total) return 100;
2136
+ const healthy = runningCount.value + idleCount.value;
2137
+ return Math.round(healthy / total * 100);
2138
+ });
2139
+ /** 健康分档语义色:中心百分数跟健康走(绿≥90/琥珀≥60/红<60),环保持状态分布语义 */
2140
+ const healthTone = computed(() => healthPct.value >= 90 ? "#35e0a0" : healthPct.value >= 60 ? "#f6c453" : "#ff6b6b");
2141
+ const donutCanvas = ref(null);
2142
+ function drawDonut() {
2143
+ const cv = donutCanvas.value;
2144
+ if (!cv) return;
2145
+ const ctx = cv.getContext("2d");
2146
+ if (!ctx) return;
2147
+ const total = deviceTwins.twins.length || 1;
2148
+ const segs = [
2149
+ {
2150
+ n: runningCount.value,
2151
+ color: "#35e0a0"
2152
+ },
2153
+ {
2154
+ n: idleCount.value,
2155
+ color: "#f6c453"
2156
+ },
2157
+ {
2158
+ n: alarmCount.value,
2159
+ color: "#ff6b6b"
2160
+ },
2161
+ {
2162
+ n: offlineCount.value,
2163
+ color: "#3a4a63"
2164
+ }
2165
+ ];
2166
+ ctx.clearRect(0, 0, 118, 118);
2167
+ ctx.lineWidth = 12;
2168
+ let ang = -Math.PI / 2;
2169
+ for (const seg of segs) {
2170
+ if (!seg.n) continue;
2171
+ const sweep = seg.n / total * Math.PI * 2;
2172
+ ctx.beginPath();
2173
+ ctx.strokeStyle = seg.color;
2174
+ ctx.arc(59, 59, 48, ang, ang + sweep);
2175
+ ctx.stroke();
2176
+ ang += sweep;
2177
+ }
2178
+ }
2179
+ watch(healthPct, () => drawDonut());
2180
+ watch(() => deviceTwins.twins.length, () => drawDonut());
2181
+ const alarms = ref([]);
2182
+ let alarmTid = 0;
2183
+ const ALARM_STATES = [
2184
+ t("townView.k3ng94k170"),
2185
+ t("townView.k3mi2n0171"),
2186
+ t("townView.k3ncnxl172")
2187
+ ];
2188
+ function raiseAlarm(txt, level = "warn", src = "SYSTEM") {
2189
+ const d = /* @__PURE__ */ new Date();
2190
+ const time = [
2191
+ d.getHours(),
2192
+ d.getMinutes(),
2193
+ d.getSeconds()
2194
+ ].map((n) => String(n).padStart(2, "0")).join(":");
2195
+ alarms.value.unshift({
2196
+ id: ++alarmTid,
2197
+ txt,
2198
+ src,
2199
+ time,
2200
+ state: 0,
2201
+ level
2202
+ });
2203
+ if (alarms.value.length > 30) alarms.value.pop();
2204
+ }
2205
+ const activeAlarmCount = computed(() => alarms.value.filter((a) => a.state < 2).length);
2206
+ /** 告警阈值(设计稿 rThresh 60~120%;>100 收紧,<100 放宽) */
2207
+ const threshPct = ref(100);
2208
+ /** 帧率上限(用户可选 60/120/∞;持久化)。只节流渲染帧,数据消费走帧通道与此无关 */
2209
+ const fpsCap = useStorage("aw.twin.fpsCap", "60");
2210
+ const FPS_OPTIONS = [
2211
+ {
2212
+ v: "60",
2213
+ label: "60"
2214
+ },
2215
+ {
2216
+ v: "120",
2217
+ label: "120"
2218
+ },
2219
+ {
2220
+ v: "0",
2221
+ label: "∞"
2222
+ }
2223
+ ];
2224
+ /** 画质(用户可选 自动/普通/高清/超清;持久化)。auto = 帧率自适应阶梯;三档手动固定 */
2225
+ const qualityMode = useStorage("aw.twin.quality", "auto");
2226
+ const QUALITY_OPTIONS = [
2227
+ {
2228
+ v: "auto",
2229
+ label: "townView.qualityAuto"
2230
+ },
2231
+ {
2232
+ v: "normal",
2233
+ label: "townView.qualityNormal"
2234
+ },
2235
+ {
2236
+ v: "hd",
2237
+ label: "townView.qualityHD"
2238
+ },
2239
+ {
2240
+ v: "ultra",
2241
+ label: "townView.qualityUltra"
2242
+ }
2243
+ ];
2244
+ /** 量程收紧后的告警上下界(设计稿公式:base ± 按阈值比例的内缩区间) */
2245
+ function alarmRange(min, max) {
2246
+ const t = threshPct.value / 100;
2247
+ const mid = (min + max) / 2;
2248
+ return {
2249
+ lo: mid - (mid - min) * t,
2250
+ hi: mid + (max - mid) * t
2251
+ };
2252
+ }
2253
+ /** E-STOP(设计稿 btnEstop:全线停机态;告警面板置 crit;再次点击解除) */
2254
+ const estop = ref(false);
2255
+ /** 场景控制:曝光/领地染色/重置视角 */
2256
+ const exposure = ref(1.12);
2257
+ const tintOpacity = ref(1);
2258
+ /** 滑杆填充比例(--fill;轨道随值染色,设计稿 setSliderFill) */
2259
+ function sliderPct(v, min, max) {
2260
+ return `${Math.min(100, Math.max(0, (v - min) / (max - min) * 100)).toFixed(1)}%`;
2261
+ }
2262
+ ref(null);
2263
+ const hiddenTrends = ref({});
2264
+ const TREND_COLORS = [
2265
+ "#35e0a0",
2266
+ "#41c8f4",
2267
+ "#f6c453",
2268
+ "#a78bfa",
2269
+ "#ff6b6b",
2270
+ "#4dd0e1"
2271
+ ];
2272
+ const trendColor = (id) => TREND_COLORS[Math.abs(id.split("").reduce((a, c) => a * 31 + c.charCodeAt(0), 7)) % TREND_COLORS.length] ?? "#35e0a0";
2273
+ /** 默认只画前 8 路:52 条曲线叠绘成不可读 spaghetti,数据可读性优先;
2274
+ * 用户显式点过 chip 的以 hiddenTrends 覆盖为准 */
2275
+ function trendOn(id, idx) {
2276
+ const v = hiddenTrends.value[id];
2277
+ if (v != null) return !v;
2278
+ return (daqTwins.value.findIndex((t) => t.id === id)) < TREND_VISIBLE_DEFAULT;
2279
+ }
2280
+ /** 信号条折叠:收起时只渲染前 8 枚 chip,余量聚合成「+N」(展开/收起) */
2281
+ const trendExpanded = ref(false);
2282
+ const trendOverflow = computed(() => Math.max(daqTwins.value.length - TREND_VISIBLE_DEFAULT, 0));
2283
+ const trendChips = computed(() => trendExpanded.value ? daqTwins.value : daqTwins.value.slice(0, TREND_VISIBLE_DEFAULT));
2284
+ ref(null);
2285
+ const navScale = computed(() => Math.min(5, Math.max(.4, camPose.value.dolly)));
2286
+ return (_ctx, _push, _parent, _attrs) => {
2287
+ const _component_WorkshopAssetLibrary = AssetLibrary_default;
2288
+ 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>`);
2291
+ 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>`);
2293
+ _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><!--[-->`);
2295
+ 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", {
2297
+ p0: tpl.name,
2298
+ p1: tpl.ch,
2299
+ p2: tpl.min,
2300
+ p3: tpl.max,
2301
+ 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>`);
2304
+ else _push(`<!---->`);
2305
+ _push(`<span class="daq-count" data-v-771c2c29>×${ssrInterpolate(unref(daqNodesByTpl).get(tpl.id)?.length ?? 0)}</span></div>`);
2306
+ if (unref(treeOpen)[`daq:${tpl.id}`]) {
2307
+ _push(`<div class="daq-children" data-v-771c2c29><!--[-->`);
2308
+ 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>`);
2311
+ else _push(`<!---->`);
2312
+ _push(`</div>`);
2313
+ });
2314
+ _push(`<!--]-->`);
2315
+ if (!unref(daqNodesByTpl).get(tpl.id)?.length) _push(`<div class="daq-empty-hint" data-v-771c2c29>${ssrInterpolate(_ctx.$t("townView.k2tplxp0003"))}</div>`);
2316
+ else _push(`<!---->`);
2317
+ _push(`</div>`);
2318
+ } else _push(`<!---->`);
2319
+ _push(`</div>`);
2320
+ });
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><!--[-->`);
2322
+ 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", {
2324
+ p0: tpl.name,
2325
+ p1: tpl.ch,
2326
+ p2: tpl.min,
2327
+ p3: tpl.max,
2328
+ 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>`);
2331
+ else _push(`<!---->`);
2332
+ _push(`<span class="daq-count" data-v-771c2c29>×${ssrInterpolate(unref(dcwNodesByTpl).get(tpl.id)?.length ?? 0)}</span></div>`);
2333
+ if (unref(treeOpen)[`dcw:${tpl.id}`]) {
2334
+ _push(`<div class="daq-children" data-v-771c2c29><!--[-->`);
2335
+ 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>`);
2338
+ else _push(`<!---->`);
2339
+ _push(`</div>`);
2340
+ });
2341
+ _push(`<!--]-->`);
2342
+ if (!unref(dcwNodesByTpl).get(tpl.id)?.length) _push(`<div class="daq-empty-hint" data-v-771c2c29>${ssrInterpolate(_ctx.$t("townView.k2tplxp0003"))}</div>`);
2343
+ else _push(`<!---->`);
2344
+ _push(`</div>`);
2345
+ } else _push(`<!---->`);
2346
+ _push(`</div>`);
2347
+ });
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><!--[-->`);
2349
+ 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>`);
2353
+ _push(`</div>`);
2354
+ });
2355
+ _push(`<!--]-->`);
2356
+ if (unref(dockHint)) _push(`<div class="scene-hint" data-v-771c2c29>${ssrInterpolate(unref(dockHint))}</div>`);
2357
+ 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>`);
2359
+ if (unref(showCallouts)) {
2360
+ _push(`<!--[--><svg class="leaders" data-v-771c2c29><!--[-->`);
2361
+ 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>`);
2363
+ });
2364
+ _push(`<!--]--></svg><div class="callout-layer" data-v-771c2c29><!--[-->`);
2365
+ ssrRenderList(unref(callouts), (c) => {
2366
+ _push(`<div class="${ssrRenderClass([{
2367
+ warn: c.warn,
2368
+ near: c.near
2369
+ }, "callout"])}" style="${ssrRenderStyle({
2370
+ left: c.x + "px",
2371
+ 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>`);
2373
+ });
2374
+ _push(`<!--]--></div><!--]-->`);
2375
+ } 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>`);
2378
+ else _push(`<!---->`);
2379
+ if (unref(selectedChannel) && unref(boundaryDraft)) {
2380
+ _push(`<div class="boundary-panel drag-panel" style="${ssrRenderStyle(unref(panelPos).boundary ? {
2381
+ left: unref(panelPos).boundary.x + "px",
2382
+ top: unref(panelPos).boundary.y + "px",
2383
+ bottom: "auto",
2384
+ 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><!--]-->`);
2387
+ else {
2388
+ _push(`<!--[--><div class="bp-hint" data-v-771c2c29>${ssrInterpolate(_ctx.$t("townView.kimxls2054"))}</div><div class="member-list" data-v-771c2c29><!--[-->`);
2389
+ 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><!--[-->`);
2391
+ ssrRenderList(unref(agentModels), (model) => {
2392
+ _push(`<option${ssrRenderAttr("value", model.id)} data-v-771c2c29>${ssrInterpolate(model.name)}</option>`);
2393
+ });
2394
+ _push(`<!--]--></select></div>`);
2395
+ });
2396
+ _push(`<!--]-->`);
2397
+ if (unref(channelMembers).length === 0) _push(`<div class="bp-hint" data-v-771c2c29>${ssrInterpolate(_ctx.$t("townView.k419rbs055"))}</div>`);
2398
+ else _push(`<!---->`);
2399
+ _push(`</div><!--]-->`);
2400
+ }
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>`);
2403
+ 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>`);
2405
+ } else _push(`<!---->`);
2406
+ if (unref(lastDropText)) _push(`<div class="drop-chip" data-v-771c2c29>${ssrInterpolate(unref(lastDropText))}</div>`);
2407
+ else _push(`<!---->`);
2408
+ if (unref(errorText)) _push(`<div class="error-chip" data-v-771c2c29>${ssrInterpolate(unref(errorText))}</div>`);
2409
+ 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>`);
2411
+ 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><!--[-->`);
2413
+ ssrRenderList(QUALITY_OPTIONS, (o) => {
2414
+ _push(`<button class="${ssrRenderClass({ on: unref(qualityMode) === o.v })}" data-v-771c2c29>${ssrInterpolate(_ctx.$t(o.label))}</button>`);
2415
+ });
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><!--[-->`);
2417
+ ssrRenderList(FPS_OPTIONS, (o) => {
2418
+ _push(`<button class="${ssrRenderClass({ on: unref(fpsCap) === o.v })}" data-v-771c2c29>${ssrInterpolate(o.label)}</button>`);
2419
+ });
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><!--[-->`);
2421
+ 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>`);
2423
+ });
2424
+ _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>`);
2426
+ 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>`);
2429
+ else _push(`<!---->`);
2430
+ _push(`</div></section></div></main><aside class="rail rail-right" data-v-771c2c29>`);
2431
+ 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>`);
2435
+ else _push(`<!---->`);
2436
+ _push(`</div>`);
2437
+ if (unref(selected).kind === "device") {
2438
+ _push(`<!--[-->`);
2439
+ 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>`);
2442
+ else _push(`<!---->`);
2443
+ 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><!--[-->`);
2445
+ 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>`);
2447
+ });
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>`);
2449
+ } else _push(`<!---->`);
2450
+ _push(`</div>`);
2451
+ } 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>`);
2453
+ 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><!--[-->`);
2455
+ 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>`);
2457
+ });
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>`);
2459
+ } 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>`);
2462
+ _push(`</div>`);
2463
+ } 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><!--[-->`);
2465
+ ssrRenderList(unref(deviceModels), (m) => {
2466
+ _push(`<option${ssrRenderAttr("value", m.id)} data-v-771c2c29>${ssrInterpolate(m.name)}</option>`);
2467
+ });
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><!--[-->`);
2469
+ 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>`);
2472
+ else _push(`<!---->`);
2473
+ _push(`</div>`);
2474
+ });
2475
+ _push(`<!--]-->`);
2476
+ if (!unref(boundDaqRows).length) _push(`<div class="ins-empty" data-v-771c2c29>${ssrInterpolate(_ctx.$t("townView.kgpuqhb084"))}</div>`);
2477
+ else _push(`<!---->`);
2478
+ 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>`);
2480
+ if (unref(bindPopOpen)) {
2481
+ _push(`<div class="bind-pop" style="${ssrRenderStyle({ maxHeight: `${unref(bindPopMaxH)}px` })}" data-v-771c2c29><!--[-->`);
2482
+ ssrRenderList(unref(daqTemplates), (tpl) => {
2483
+ _push(`<!--[-->`);
2484
+ 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><!--[-->`);
2486
+ 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>`);
2490
+ else _push(`<!---->`);
2491
+ _push(`</span></button>`);
2492
+ });
2493
+ _push(`<!--]--></div>`);
2494
+ } else _push(`<!---->`);
2495
+ _push(`<!--]-->`);
2496
+ });
2497
+ _push(`<!--]-->`);
2498
+ if (!unref(daqBindChoiceCount)) _push(`<div class="bp-empty" data-v-771c2c29>${ssrInterpolate(_ctx.$t("townView.k2bindr0010"))}</div>`);
2499
+ else _push(`<!---->`);
2500
+ _push(`</div>`);
2501
+ } else _push(`<!---->`);
2502
+ _push(`</div>`);
2503
+ } 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><!--[-->`);
2505
+ 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>`);
2508
+ 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>`);
2511
+ 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>`);
2514
+ else _push(`<!---->`);
2515
+ _push(`</div>`);
2516
+ });
2517
+ _push(`<!--]-->`);
2518
+ if (!unref(boundDcwRows).length) _push(`<div class="ins-empty" data-v-771c2c29>${ssrInterpolate(_ctx.$t("townView.k10smf24087"))}</div>`);
2519
+ else _push(`<!---->`);
2520
+ 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>`);
2522
+ if (unref(dcwBindPopOpen)) {
2523
+ _push(`<div class="bind-pop" style="${ssrRenderStyle({ maxHeight: `${unref(bindPopMaxH)}px` })}" data-v-771c2c29><!--[-->`);
2524
+ ssrRenderList(unref(dcwTemplates), (tpl) => {
2525
+ _push(`<!--[-->`);
2526
+ 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><!--[-->`);
2528
+ 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>`);
2532
+ else _push(`<!---->`);
2533
+ _push(`</span></button>`);
2534
+ });
2535
+ _push(`<!--]--></div>`);
2536
+ } else _push(`<!---->`);
2537
+ _push(`<!--]-->`);
2538
+ });
2539
+ _push(`<!--]-->`);
2540
+ if (!unref(dcwBindChoiceCount)) _push(`<div class="bp-empty" data-v-771c2c29>${ssrInterpolate(_ctx.$t("townView.k2bindr0010"))}</div>`);
2541
+ else _push(`<!---->`);
2542
+ _push(`</div>`);
2543
+ } else _push(`<!---->`);
2544
+ _push(`</div>`);
2545
+ } 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>`);
2548
+ _push(`<!--]-->`);
2549
+ }
2550
+ _push(`<!--]-->`);
2551
+ } 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>`);
2554
+ 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><!--[-->`);
2556
+ ssrRenderList(unref(agentModels), (m) => {
2557
+ _push(`<option${ssrRenderAttr("value", m.id)} data-v-771c2c29>${ssrInterpolate(m.name)}</option>`);
2558
+ });
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>`);
2561
+ 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><!--[-->`);
2563
+ 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>`);
2565
+ });
2566
+ _push(`<!--]-->`);
2567
+ if (!unref(agentBindings).length) _push(`<div class="ins-empty" data-v-771c2c29> 未绑定工业节点 —— 绑定后 Agent 可用 dcw_control / daq_query 工具 </div>`);
2568
+ else _push(`<!---->`);
2569
+ 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({
2571
+ "flex": "none",
2572
+ "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>`);
2574
+ if (unref(agentBindKind) === "dcw") {
2575
+ _push(`<!--[-->`);
2576
+ 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>`);
2578
+ });
2579
+ _push(`<!--]-->`);
2580
+ } else {
2581
+ _push(`<!--[-->`);
2582
+ 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>`);
2584
+ });
2585
+ _push(`<!--]-->`);
2586
+ }
2587
+ _push(`</select><select class="bind-select" style="${ssrRenderStyle({
2588
+ "flex": "none",
2589
+ "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>`);
2591
+ } else _push(`<!---->`);
2592
+ 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><!--[-->`);
2594
+ 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({
2596
+ "width": "100%",
2597
+ "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>`);
2599
+ });
2600
+ _push(`<!--]--><!--]-->`);
2601
+ } 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>`);
2606
+ else _push(`<!---->`);
2607
+ if (unref(agentHistory).length) {
2608
+ _push(`<!--[--><div class="rpg-divider" data-v-771c2c29>${ssrInterpolate(_ctx.$t("townView.k768cnt134"))} ${ssrInterpolate(unref(agentHistory).length)}</div><!--[-->`);
2609
+ 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>`);
2612
+ else _push(`<!---->`);
2613
+ _push(`<span class="rpg-text" data-v-771c2c29>${ssrInterpolate(r.text)}</span></div></div>`);
2614
+ });
2615
+ _push(`<!--]--><!--]-->`);
2616
+ } 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>`);
2618
+ else _push(`<!---->`);
2619
+ _push(`<!--[-->`);
2620
+ 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>`);
2622
+ });
2623
+ _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>`);
2625
+ 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>`);
2627
+ else _push(`<!---->`);
2628
+ _push(`</div><!--]-->`);
2629
+ } else _push(`<!---->`);
2630
+ _push(`</section>`);
2631
+ } 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>`);
2633
+ _push(ssrRenderComponent(_component_WorkshopDeviceTwinPanel, {
2634
+ class: "kd-embed",
2635
+ "daq-live": unref(daqLive),
2636
+ "dcw-live": unref(dcwLive),
2637
+ onFocusDevice
2638
+ }, 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><!--[-->`);
2640
+ 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>`);
2642
+ });
2643
+ _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>`);
2645
+ 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><!--[-->`);
2647
+ 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>`);
2649
+ });
2650
+ _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>`);
2652
+ 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>`);
2655
+ else _push(`<!---->`);
2656
+ _push(`</div>`);
2657
+ };
2658
+ }
2659
+ });
2660
+ //#endregion
2661
+ //#region app/components/workshop/town/TownView.vue
2662
+ var _sfc_setup = TownView_vue_vue_type_script_setup_true_lang_default.setup;
2663
+ TownView_vue_vue_type_script_setup_true_lang_default.setup = (props, ctx) => {
2664
+ const ssrContext = useSSRContext();
2665
+ (ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("components/workshop/town/TownView.vue");
2666
+ return _sfc_setup ? _sfc_setup(props, ctx) : void 0;
2667
+ };
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" });
2669
+
2670
+ export { TownView_default as T, useStorage as u };
2671
+ //# sourceMappingURL=TownView-DYlUNRZe.mjs.map