agentworkshop 0.7.9 → 0.7.12

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 (534) hide show
  1. package/.output/nitro.json +1 -1
  2. package/.output/public/_nuxt/{BUPj10t4.js → 6vYobj4F.js} +1 -1
  3. package/.output/public/_nuxt/{BCJFMBQ6.js → B-xskWta.js} +1 -1
  4. package/.output/public/_nuxt/{BC8s1Guv.js → B3Psw_sL.js} +1 -1
  5. package/.output/public/_nuxt/B53Mp7lD.js +1 -0
  6. package/.output/public/_nuxt/{BDASpD_i.js → BBwMH_hG.js} +1 -1
  7. package/.output/public/_nuxt/BNXfwXpE.js +1 -0
  8. package/.output/public/_nuxt/BbZAzXjZ2.js +1 -0
  9. package/.output/public/_nuxt/{CFn4vHwD.js → Bc3PiGGr.js} +1 -1
  10. package/.output/public/_nuxt/BcrN7QEl2.js +1 -0
  11. package/.output/public/_nuxt/BgOhoDTI.js +1 -0
  12. package/.output/public/_nuxt/Bmpvki7M.js +1 -0
  13. package/.output/public/_nuxt/BxPPAkGA.js +3 -0
  14. package/.output/public/_nuxt/{u7KWCGSb.js → BxtpDtzC.js} +1 -1
  15. package/.output/public/_nuxt/{DxrgFxIr2.js → C4OAdbVK2.js} +1 -1
  16. package/.output/public/_nuxt/C6m-kenn.js +1 -0
  17. package/.output/public/_nuxt/CcwJ2mrD2.js +1 -0
  18. package/.output/public/_nuxt/Cj6139IM.js +1 -0
  19. package/.output/public/_nuxt/{6PZPfFcO.js → Cor9siSf.js} +1 -1
  20. package/.output/public/_nuxt/CvYfzHYz.js +1 -0
  21. package/.output/public/_nuxt/D2JyEL28.js +14 -0
  22. package/.output/public/_nuxt/{DDdEnkdw.js → D8xY-Yjc.js} +2 -2
  23. package/.output/public/_nuxt/{Ct68Z0232.js → DA4lxCWC2.js} +1 -1
  24. package/.output/public/_nuxt/{MyA0Oeqd.js → DNxVTfhe.js} +1 -1
  25. package/.output/public/_nuxt/DT-Wg8r1.js +1 -0
  26. package/.output/public/_nuxt/DTYBfjRY.js +1 -0
  27. package/.output/public/_nuxt/{DvgKXPgu2.js → DWcEk1ur2.js} +1 -1
  28. package/.output/public/_nuxt/DaE5saZg.js +1 -0
  29. package/.output/public/_nuxt/Dhqra7NB.js +1 -0
  30. package/.output/public/_nuxt/DlRO_q5L.js +1 -0
  31. package/.output/public/_nuxt/{D8EfUxO2.js → Ds8JbqGB.js} +1 -1
  32. package/.output/public/_nuxt/Dsdy4Ua-.js +1 -0
  33. package/.output/public/_nuxt/{DN5RuZ8k.js → DyisHHzD.js} +1 -1
  34. package/.output/public/_nuxt/{91DZTUMJ.js → E88a-JCG.js} +1 -1
  35. package/.output/public/_nuxt/ORt9oDIy2.js +1 -0
  36. package/.output/public/_nuxt/{By8BpbKH.js → QoCzfpo2.js} +1 -1
  37. package/.output/public/_nuxt/RzXYI9FM.js +23 -0
  38. package/.output/public/_nuxt/{BuktKVqK2.js → arUY5dyq2.js} +2 -2
  39. package/.output/public/_nuxt/bAFueD6a.js +1 -0
  40. package/.output/public/_nuxt/builds/latest.json +1 -1
  41. package/.output/public/_nuxt/builds/meta/54e22640-4fd0-4fee-9077-31d4d4bb7969.json +1 -0
  42. package/.output/public/_nuxt/dcw.rpqpOYQ8.css +1 -0
  43. package/.output/public/_nuxt/{default.BR3e5fPY.css → default.BbgdTDCk.css} +1 -1
  44. package/.output/public/_nuxt/{C9cU_Ujd.js → eHYnGew0.js} +1 -1
  45. package/.output/public/_nuxt/{DM4CNkXz.js → eUGyJdiT.js} +1 -1
  46. package/.output/public/_nuxt/{entry.5qf6EqfN.css → entry.Bv_GCmPP.css} +1 -1
  47. package/.output/public/_nuxt/hb_ceMJP.js +1 -0
  48. package/.output/public/_nuxt/{B1g8pJmr.js → kkEthL84.js} +1 -1
  49. package/.output/public/_nuxt/logs.BS1sb41K.css +1 -0
  50. package/.output/public/_nuxt/pages.BkE-AfIb.css +1 -0
  51. package/.output/public/_nuxt/permissions.DTRtZeTw.css +1 -0
  52. package/.output/public/_nuxt/plugins.BcSEwwGb.css +1 -0
  53. package/.output/public/_nuxt/settings.BqMF2nfj.css +1 -0
  54. package/.output/public/_nuxt/tokens.rW1xHxRW.css +1 -0
  55. package/.output/public/_nuxt/workshop.CbymC2LY.css +1 -0
  56. package/.output/public/_nuxt/zVkqCZ78.js +1 -0
  57. package/.output/server/chunks/_/LeftOutlined.mjs +1 -1
  58. package/.output/server/chunks/_/SearchOutlined.mjs +1 -1
  59. package/.output/server/chunks/_/character-asset.repo.mjs +1 -1
  60. package/.output/server/chunks/_/host-bindings.mjs +1 -1
  61. package/.output/server/chunks/_/nitro.mjs +1549 -1228
  62. package/.output/server/chunks/_/nitro.mjs.map +1 -1
  63. package/.output/server/chunks/_/scene-layout.repo.mjs +1 -1
  64. package/.output/server/chunks/build/Col-biaNnEPf.mjs +1 -1
  65. package/.output/server/chunks/build/{OmpTerminalPanel-COphA1br.mjs → OmpTerminalPanel-Ban3yJZ4.mjs} +4 -5
  66. package/.output/server/chunks/build/OmpTerminalPanel-Ban3yJZ4.mjs.map +1 -0
  67. package/.output/server/chunks/build/{TownView-D8DSdO3H.mjs → TownView-CunmEMzS.mjs} +8 -9
  68. package/.output/server/chunks/build/{TownView-D8DSdO3H.mjs.map → TownView-CunmEMzS.mjs.map} +1 -1
  69. package/.output/server/chunks/build/{_id_-BV4FfiYd.mjs → _id_-CVnMdSeG.mjs} +7 -7
  70. package/.output/server/chunks/build/{_id_-BV4FfiYd.mjs.map → _id_-CVnMdSeG.mjs.map} +1 -1
  71. package/.output/server/chunks/build/{_id_-TP9hvnBM.mjs → _id_-D265Wh_k.mjs} +7 -7
  72. package/.output/server/chunks/build/{_id_-TP9hvnBM.mjs.map → _id_-D265Wh_k.mjs.map} +1 -1
  73. package/.output/server/chunks/build/{_wsId_-Mm9sQSz2.mjs → _wsId_-eNJmBp05.mjs} +17 -17
  74. package/.output/server/chunks/build/{_wsId_-Mm9sQSz2.mjs.map → _wsId_-eNJmBp05.mjs.map} +1 -1
  75. package/.output/server/chunks/build/{agents-To3a5xcZ.mjs → agents-B10wmFri.mjs} +9 -9
  76. package/.output/server/chunks/build/{agents-To3a5xcZ.mjs.map → agents-B10wmFri.mjs.map} +1 -1
  77. package/.output/server/chunks/build/alert-qJnjyRcP.mjs +1 -1
  78. package/.output/server/chunks/build/api-error-dul30BYQ.mjs +1 -1
  79. package/.output/server/chunks/build/button-DEcZFcqN.mjs +2 -2
  80. package/.output/server/chunks/build/{card-Dipvaykh.mjs → card-CCPQoKlh.mjs} +4 -4
  81. package/.output/server/chunks/build/{card-Dipvaykh.mjs.map → card-CCPQoKlh.mjs.map} +1 -1
  82. package/.output/server/chunks/build/{channel-templates-DRsP-qxl.mjs → channel-templates-CpWxVk5A.mjs} +7 -7
  83. package/.output/server/chunks/build/{channel-templates-DRsP-qxl.mjs.map → channel-templates-CpWxVk5A.mjs.map} +1 -1
  84. package/.output/server/chunks/build/{checkbox-dzcpU_Cd.mjs → checkbox-Dv1kjaUZ.mjs} +3 -3
  85. package/.output/server/chunks/build/{checkbox-dzcpU_Cd.mjs.map → checkbox-Dv1kjaUZ.mjs.map} +1 -1
  86. package/.output/server/chunks/build/client-only-D5BzSQc6.mjs +1 -1
  87. package/.output/server/chunks/build/{daq-_hCEaYLd.mjs → daq-DxaXk_8N.mjs} +9 -10
  88. package/.output/server/chunks/build/daq-DxaXk_8N.mjs.map +1 -0
  89. package/.output/server/chunks/build/{dcw-C7pJ4Y0p.mjs → dcw-B0dtiHFG.mjs} +47 -47
  90. package/.output/server/chunks/build/dcw-B0dtiHFG.mjs.map +1 -0
  91. package/.output/server/chunks/build/{default-Dnjs36e8.mjs → default-DdV642BY.mjs} +41 -13
  92. package/.output/server/chunks/build/{default-Dnjs36e8.mjs.map → default-DdV642BY.mjs.map} +1 -1
  93. package/.output/server/chunks/build/drawer-Cmh90erI.mjs +1 -1
  94. package/.output/server/chunks/build/dropdown-vhn1NPFs.mjs +2 -2
  95. package/.output/server/chunks/build/hasIn-vQ9LWt-J.mjs +554 -0
  96. package/.output/server/chunks/build/hasIn-vQ9LWt-J.mjs.map +1 -0
  97. package/.output/server/chunks/build/initDefaultProps-DIbWwP4R.mjs +1 -1
  98. package/.output/server/chunks/build/{input-sf_BT6o6.mjs → input-DxDqeyQW.mjs} +5 -553
  99. package/.output/server/chunks/build/input-DxDqeyQW.mjs.map +1 -0
  100. package/.output/server/chunks/build/{input-number-Bd55elNN.mjs → input-number-CZ3ZrCsy.mjs} +3 -3
  101. package/.output/server/chunks/build/{input-number-Bd55elNN.mjs.map → input-number-CZ3ZrCsy.mjs.map} +1 -1
  102. package/.output/server/chunks/build/{logs-C039TFW1.mjs → logs-Crf6f1IC.mjs} +39 -40
  103. package/.output/server/chunks/build/logs-Crf6f1IC.mjs.map +1 -0
  104. package/.output/server/chunks/build/menu-WCrlpYVh.mjs +2 -2
  105. package/.output/server/chunks/build/modal-yvUquPj5.mjs +2 -2
  106. package/.output/server/chunks/build/{monitor-MIOvsyLa.mjs → monitor-miqq9xHB.mjs} +11 -11
  107. package/.output/server/chunks/build/{monitor-MIOvsyLa.mjs.map → monitor-miqq9xHB.mjs.map} +1 -1
  108. package/.output/server/chunks/build/{pages-C_VSGSGo.mjs → pages-BmRUbGUi.mjs} +32 -22
  109. package/.output/server/chunks/build/pages-BmRUbGUi.mjs.map +1 -0
  110. package/.output/server/chunks/build/permissions-CxEgXic0.mjs +534 -0
  111. package/.output/server/chunks/build/permissions-CxEgXic0.mjs.map +1 -0
  112. package/.output/server/chunks/build/{plugins-4FMWkN8d.mjs → plugins-wLIKHcIE.mjs} +19 -20
  113. package/.output/server/chunks/build/{plugins-4FMWkN8d.mjs.map → plugins-wLIKHcIE.mjs.map} +1 -1
  114. package/.output/server/chunks/build/popconfirm-CRaHcz5O.mjs +2 -2
  115. package/.output/server/chunks/build/responsiveObserve-CS0UB6wQ.mjs +1 -1
  116. package/.output/server/chunks/build/{segmented-DPe9ZzLO.mjs → segmented-ChmQZwz6.mjs} +5 -4
  117. package/.output/server/chunks/build/{segmented-DPe9ZzLO.mjs.map → segmented-ChmQZwz6.mjs.map} +1 -1
  118. package/.output/server/chunks/build/select-D-CeE5vY.mjs +1 -1
  119. package/.output/server/chunks/build/{settings-DA8IkGLo.mjs → settings-BPBll_7K.mjs} +28 -26
  120. package/.output/server/chunks/build/settings-BPBll_7K.mjs.map +1 -0
  121. package/.output/server/chunks/build/space-CCBYAkXt.mjs +2 -2
  122. package/.output/server/chunks/build/spin-HVY81X_L.mjs +1 -1
  123. package/.output/server/chunks/build/switch-CelRXpcy.mjs +2 -2
  124. package/.output/server/chunks/build/{table-Cswq-l2r.mjs → table-BtksyDlQ.mjs} +5 -5
  125. package/.output/server/chunks/build/{table-Cswq-l2r.mjs.map → table-BtksyDlQ.mjs.map} +1 -1
  126. package/.output/server/chunks/build/{tabs-BM3tAh_J.mjs → tabs-DQv-_-R6.mjs} +3 -3
  127. package/.output/server/chunks/build/{tabs-BM3tAh_J.mjs.map → tabs-DQv-_-R6.mjs.map} +1 -1
  128. package/.output/server/chunks/build/{tag-NO9jEqKy.mjs → tag-A0tZ2Ouq.mjs} +4 -4
  129. package/.output/server/chunks/build/{tag-NO9jEqKy.mjs.map → tag-A0tZ2Ouq.mjs.map} +1 -1
  130. package/.output/server/chunks/build/{teams-DA1lkf1n.mjs → teams-CNflUtPh.mjs} +7 -7
  131. package/.output/server/chunks/build/{teams-DA1lkf1n.mjs.map → teams-CNflUtPh.mjs.map} +1 -1
  132. package/.output/server/chunks/build/{tokens-DKMvvk3e.mjs → tokens-BKLzcdMg.mjs} +53 -84
  133. package/.output/server/chunks/build/tokens-BKLzcdMg.mjs.map +1 -0
  134. package/.output/server/chunks/build/town-BUqRobze.mjs +1 -1
  135. package/.output/server/chunks/build/{town-D0thZ7PK.mjs → town-BbaR-8io.mjs} +9 -10
  136. package/.output/server/chunks/build/town-BbaR-8io.mjs.map +1 -0
  137. package/.output/server/chunks/build/{useDaqStream-BVTRw8_H.mjs → useDaqStream-BkmyQT06.mjs} +34 -23
  138. package/.output/server/chunks/build/useDaqStream-BkmyQT06.mjs.map +1 -0
  139. package/.output/server/chunks/build/{useDcwStream-DNsivqI_.mjs → useDcwStream-DWVoU96J.mjs} +60 -46
  140. package/.output/server/chunks/build/useDcwStream-DWVoU96J.mjs.map +1 -0
  141. package/.output/server/chunks/build/{useDeviceTwins-WeIom7A6.mjs → useDeviceTwins-34WGk9aN.mjs} +2 -2
  142. package/.output/server/chunks/build/{useDeviceTwins-WeIom7A6.mjs.map → useDeviceTwins-34WGk9aN.mjs.map} +1 -1
  143. package/.output/server/chunks/build/useLocalTime-9a4B-aHv.mjs +1 -1
  144. package/.output/server/chunks/build/{useOpsLog-DcKnPO43.mjs → useOpsLog-C9zTzYof.mjs} +27 -15
  145. package/.output/server/chunks/build/useOpsLog-C9zTzYof.mjs.map +1 -0
  146. package/.output/server/chunks/build/useSiteConfig-DJe_KMVr.mjs +1 -1
  147. package/.output/server/chunks/build/useWorkshopApi-D2gq06N2.mjs +1 -1
  148. package/.output/server/chunks/build/{useWorkshopWs-B3j5wIAK.mjs → useWorkshopWs-CprkZEdq.mjs} +2 -3
  149. package/.output/server/chunks/build/useWorkshopWs-CprkZEdq.mjs.map +1 -0
  150. package/.output/server/chunks/build/{users-CmVvb1oq.mjs → users-D6RNylrW.mjs} +10 -10
  151. package/.output/server/chunks/build/{users-CmVvb1oq.mjs.map → users-D6RNylrW.mjs.map} +1 -1
  152. package/.output/server/chunks/build/{workshop-BhWnJMWs.mjs → workshop-CTcYDq2i.mjs} +29 -24
  153. package/.output/server/chunks/build/{workshop-BhWnJMWs.mjs.map → workshop-CTcYDq2i.mjs.map} +1 -1
  154. package/.output/server/chunks/build/{workspaces-IfORCDJE.mjs → workspaces-BuydxM-3.mjs} +2 -3
  155. package/.output/server/chunks/build/workspaces-BuydxM-3.mjs.map +1 -0
  156. package/.output/server/chunks/routes/api/health.get.mjs +1 -1
  157. package/.output/server/chunks/routes/api/index.get.mjs +1 -1
  158. package/.output/server/chunks/routes/api/index.post.mjs +1 -1
  159. package/.output/server/chunks/routes/api/mcp/workshop.mjs +1 -1
  160. package/.output/server/chunks/routes/api/metrics.mjs +1 -1
  161. package/.output/server/chunks/routes/api/plugins/_name/_...path_.mjs +1 -1
  162. package/.output/server/chunks/routes/api/plugins/client/_name_.get.mjs +1 -1
  163. package/.output/server/chunks/routes/api/plugins/manifest.get.mjs +1 -1
  164. package/.output/server/chunks/routes/api/system/config.get.mjs +1 -1
  165. package/.output/server/chunks/routes/api/system/index.get.mjs +1 -1
  166. package/.output/server/chunks/routes/api/system/index.patch.mjs +1 -1
  167. package/.output/server/chunks/routes/api/system/monitor/terminal/ws.mjs +1 -1
  168. package/.output/server/chunks/routes/api/system/monitor/terminate.post.mjs +1 -1
  169. package/.output/server/chunks/routes/api/system/monitor.get.mjs +1 -1
  170. package/.output/server/chunks/routes/api/system/settings/events.get.mjs +1 -1
  171. package/.output/server/chunks/routes/api/system/settings/reset.post.mjs +1 -1
  172. package/.output/server/chunks/routes/api/users/_id_.delete.mjs +1 -1
  173. package/.output/server/chunks/routes/api/users/_id_.get.mjs +1 -1
  174. package/.output/server/chunks/routes/api/users/_id_.put.mjs +1 -1
  175. package/.output/server/chunks/routes/api/users/index.get.mjs +1 -1
  176. package/.output/server/chunks/routes/api/users/index.post.mjs +1 -1
  177. package/.output/server/chunks/routes/api/users/login.post.mjs +1 -1
  178. package/.output/server/chunks/routes/api/users/logout.post.mjs +1 -1
  179. package/.output/server/chunks/routes/api/users/me.get.mjs +1 -1
  180. package/.output/server/chunks/routes/api/users/register.post.mjs +1 -1
  181. package/.output/server/chunks/routes/api/users/setup-status.get.mjs +1 -1
  182. package/.output/server/chunks/routes/api/users/tokens/_id/token.get.mjs +1 -1
  183. package/.output/server/chunks/routes/api/users/tokens/_id_.delete.mjs +1 -1
  184. package/.output/server/chunks/routes/api/users/tokens/_id_.patch.mjs +1 -1
  185. package/.output/server/chunks/routes/api/workshop/_...path_.mjs +1 -1
  186. package/.output/server/chunks/routes/api/workshop/a2a/_agentId/index.get.mjs +1 -1
  187. package/.output/server/chunks/routes/api/workshop/a2a/_agentId/index.post.mjs +1 -1
  188. package/.output/server/chunks/routes/api/workshop/a2a/send.post.mjs +1 -1
  189. package/.output/server/chunks/routes/api/workshop/agent-tools/approvals/_id/decide.post.mjs +1 -1
  190. package/.output/server/chunks/routes/api/workshop/agent-tools/bindings/_id_.delete.mjs +1 -1
  191. package/.output/server/chunks/routes/api/workshop/agent-tools/bindings/_id_.patch.mjs +1 -1
  192. package/.output/server/chunks/routes/api/workshop/agent-tools/index.get.mjs +1 -1
  193. package/.output/server/chunks/routes/api/workshop/agent-tools/index.post.mjs +19 -8
  194. package/.output/server/chunks/routes/api/workshop/agent-tools/index.post.mjs.map +1 -1
  195. package/.output/server/chunks/routes/api/workshop/agent-tools/index2.get.mjs +1 -1
  196. package/.output/server/chunks/routes/api/workshop/agent-tools/invoke.post.mjs +2 -2
  197. package/.output/server/chunks/routes/api/workshop/agent-tools/list.get.mjs +2 -2
  198. package/.output/server/chunks/routes/api/workshop/agents/_id_.delete.mjs +1 -1
  199. package/.output/server/chunks/routes/api/workshop/agents/_id_.get.mjs +1 -1
  200. package/.output/server/chunks/routes/api/workshop/agents/_id_.patch.mjs +1 -1
  201. package/.output/server/chunks/routes/api/workshop/agents/subscribe.post.mjs +1 -1
  202. package/.output/server/chunks/routes/api/workshop/approvals/_id/decide.post.mjs +1 -1
  203. package/.output/server/chunks/routes/api/workshop/assets/character/_id_.delete.mjs +1 -1
  204. package/.output/server/chunks/routes/api/workshop/assets/devices/_id_.delete.mjs +1 -1
  205. package/.output/server/chunks/routes/api/workshop/assets/index.get.mjs +1 -1
  206. package/.output/server/chunks/routes/api/workshop/assets/index.post.mjs +2 -2
  207. package/.output/server/chunks/routes/api/workshop/assets/index2.get.mjs +1 -1
  208. package/.output/server/chunks/routes/api/workshop/assets/index2.post.mjs +2 -2
  209. package/.output/server/chunks/routes/api/workshop/audit.get.mjs +1 -1
  210. package/.output/server/chunks/routes/api/workshop/caller.mjs +1 -1
  211. package/.output/server/chunks/routes/api/workshop/channel-templates/_id/instantiate.post.mjs +3 -3
  212. package/.output/server/chunks/routes/api/workshop/channel-templates/_id_.delete.mjs +1 -1
  213. package/.output/server/chunks/routes/api/workshop/channel-templates/_id_.get.mjs +1 -1
  214. package/.output/server/chunks/routes/api/workshop/channel-templates/_id_.patch.mjs +1 -1
  215. package/.output/server/chunks/routes/api/workshop/channel-templates/from-channel.post.mjs +1 -1
  216. package/.output/server/chunks/routes/api/workshop/channels/_id/activate.post.mjs +2 -2
  217. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/index.get.mjs +1 -1
  218. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/index.post.mjs +1 -1
  219. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/memories/_memoryId_.delete.mjs +1 -1
  220. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/memories/search.post.mjs +1 -1
  221. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/model.patch.mjs +1 -1
  222. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/position.patch.mjs +1 -1
  223. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/range.patch.mjs +1 -1
  224. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/stop.post.mjs +1 -1
  225. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId_.delete.mjs +1 -1
  226. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId_.patch.mjs +1 -1
  227. package/.output/server/chunks/routes/api/workshop/channels/_id/events.get.mjs +1 -1
  228. package/.output/server/chunks/routes/api/workshop/channels/_id/index.get.mjs +1 -1
  229. package/.output/server/chunks/routes/api/workshop/channels/_id/index.post.mjs +2 -2
  230. package/.output/server/chunks/routes/api/workshop/channels/_id/index2.get.mjs +1 -1
  231. package/.output/server/chunks/routes/api/workshop/channels/_id/index2.post.mjs +1 -1
  232. package/.output/server/chunks/routes/api/workshop/channels/_id/index3.get.mjs +1 -1
  233. package/.output/server/chunks/routes/api/workshop/channels/_id/index3.post.mjs +1 -1
  234. package/.output/server/chunks/routes/api/workshop/channels/_id/index4.get.mjs +1 -1
  235. package/.output/server/chunks/routes/api/workshop/channels/_id/index4.post.mjs +1 -1
  236. package/.output/server/chunks/routes/api/workshop/channels/_id/memories/_memoryId_.delete.mjs +1 -1
  237. package/.output/server/chunks/routes/api/workshop/channels/_id/queue.get.mjs +1 -1
  238. package/.output/server/chunks/routes/api/workshop/channels/_id/terminals.get.mjs +2 -2
  239. package/.output/server/chunks/routes/api/workshop/channels/_id_.delete.mjs +1 -1
  240. package/.output/server/chunks/routes/api/workshop/channels/index.get.mjs +2 -2
  241. package/.output/server/chunks/routes/api/workshop/channels/index.patch.mjs +1 -1
  242. package/.output/server/chunks/routes/api/workshop/channels.get.mjs +1 -1
  243. package/.output/server/chunks/routes/api/workshop/channels.post.mjs +3 -3
  244. package/.output/server/chunks/routes/api/workshop/daq/_id/bind.post.mjs +7 -6
  245. package/.output/server/chunks/routes/api/workshop/daq/_id/bind.post.mjs.map +1 -1
  246. package/.output/server/chunks/routes/api/workshop/daq/_id/frames/content.get.mjs +5 -4
  247. package/.output/server/chunks/routes/api/workshop/daq/_id/frames/content.get.mjs.map +1 -1
  248. package/.output/server/chunks/routes/api/workshop/daq/_id/frames.get.mjs +5 -4
  249. package/.output/server/chunks/routes/api/workshop/daq/_id/frames.get.mjs.map +1 -1
  250. package/.output/server/chunks/routes/api/workshop/daq/_id/samples.get.mjs +5 -4
  251. package/.output/server/chunks/routes/api/workshop/daq/_id/samples.get.mjs.map +1 -1
  252. package/.output/server/chunks/routes/api/workshop/daq/_id/test.post.mjs +2 -2
  253. package/.output/server/chunks/routes/api/workshop/daq/_id_.delete.mjs +2 -2
  254. package/.output/server/chunks/routes/api/workshop/daq/_id_.patch.mjs +5 -4
  255. package/.output/server/chunks/routes/api/workshop/daq/_id_.patch.mjs.map +1 -1
  256. package/.output/server/chunks/routes/api/workshop/daq/alarms/_id/ack.post.mjs +5 -2
  257. package/.output/server/chunks/routes/api/workshop/daq/alarms/_id/ack.post.mjs.map +1 -1
  258. package/.output/server/chunks/routes/api/workshop/daq/alarms.get.mjs +2 -2
  259. package/.output/server/chunks/routes/api/workshop/daq/controller.post.mjs +3 -2
  260. package/.output/server/chunks/routes/api/workshop/daq/controller.post.mjs.map +1 -1
  261. package/.output/server/chunks/routes/api/workshop/daq/index.post.mjs +2 -2
  262. package/.output/server/chunks/routes/api/workshop/daq/infra/reconnect.post.mjs +2 -2
  263. package/.output/server/chunks/routes/api/workshop/daq/infra.get.mjs +2 -2
  264. package/.output/server/chunks/routes/api/workshop/daq/templates/_key_.delete.mjs +2 -2
  265. package/.output/server/chunks/routes/api/workshop/daq/templates/_key_.patch.mjs +2 -2
  266. package/.output/server/chunks/routes/api/workshop/daq/test-driver.post.mjs +2 -2
  267. package/.output/server/chunks/routes/api/workshop/dcw/_id/bind.post.mjs +7 -6
  268. package/.output/server/chunks/routes/api/workshop/dcw/_id/bind.post.mjs.map +1 -1
  269. package/.output/server/chunks/routes/api/workshop/dcw/_id/param-ledger.get.mjs +2 -2
  270. package/.output/server/chunks/routes/api/workshop/dcw/_id/read.post.mjs +2 -2
  271. package/.output/server/chunks/routes/api/workshop/dcw/_id/test.post.mjs +5 -4
  272. package/.output/server/chunks/routes/api/workshop/dcw/_id/test.post.mjs.map +1 -1
  273. package/.output/server/chunks/routes/api/workshop/dcw/_id/write.post.mjs +4 -3
  274. package/.output/server/chunks/routes/api/workshop/dcw/_id/write.post.mjs.map +1 -1
  275. package/.output/server/chunks/routes/api/workshop/dcw/_id_.delete.mjs +2 -2
  276. package/.output/server/chunks/routes/api/workshop/dcw/_id_.patch.mjs +2 -2
  277. package/.output/server/chunks/routes/api/workshop/dcw/controller.post.mjs +2 -2
  278. package/.output/server/chunks/routes/api/workshop/dcw/index.get.mjs +2 -2
  279. package/.output/server/chunks/routes/api/workshop/dcw/index.post.mjs +4 -4
  280. package/.output/server/chunks/routes/api/workshop/dcw/index.post.mjs.map +1 -1
  281. package/.output/server/chunks/routes/api/workshop/dcw/index2.get.mjs +8 -4
  282. package/.output/server/chunks/routes/api/workshop/dcw/index2.get.mjs.map +1 -1
  283. package/.output/server/chunks/routes/api/workshop/dcw/index2.post.mjs +4 -4
  284. package/.output/server/chunks/routes/api/workshop/dcw/index2.post.mjs.map +1 -1
  285. package/.output/server/chunks/routes/api/workshop/dcw/index3.get.mjs +2 -2
  286. package/.output/server/chunks/routes/api/workshop/dcw/index3.post.mjs +2 -2
  287. package/.output/server/chunks/routes/api/workshop/dcw/index4.get.mjs +2 -2
  288. package/.output/server/chunks/routes/api/workshop/dcw/index4.post.mjs +2 -2
  289. package/.output/server/chunks/routes/api/workshop/dcw/index5.get.mjs +4 -4
  290. package/.output/server/chunks/routes/api/workshop/dcw/index5.get.mjs.map +1 -1
  291. package/.output/server/chunks/routes/api/workshop/dcw/journal/node/_nodeId/rollback.post.mjs +2 -2
  292. package/.output/server/chunks/routes/api/workshop/dcw/line/query.get.mjs +7 -3
  293. package/.output/server/chunks/routes/api/workshop/dcw/line/query.get.mjs.map +1 -1
  294. package/.output/server/chunks/routes/api/workshop/dcw/lines/_id/start.post.mjs +3 -2
  295. package/.output/server/chunks/routes/api/workshop/dcw/lines/_id/start.post.mjs.map +1 -1
  296. package/.output/server/chunks/routes/api/workshop/dcw/lines/_id/stop.post.mjs +3 -2
  297. package/.output/server/chunks/routes/api/workshop/dcw/lines/_id/stop.post.mjs.map +1 -1
  298. package/.output/server/chunks/routes/api/workshop/dcw/lines/_id_.delete.mjs +2 -2
  299. package/.output/server/chunks/routes/api/workshop/dcw/lines/_id_.patch.mjs +2 -2
  300. package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id/judge.post.mjs +2 -2
  301. package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id/rollback.post.mjs +2 -2
  302. package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id/series.get.mjs +2 -2
  303. package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id_.get.mjs +2 -2
  304. package/.output/server/chunks/routes/api/workshop/dcw/products/_id_.delete.mjs +2 -2
  305. package/.output/server/chunks/routes/api/workshop/dcw/products/_id_.patch.mjs +2 -2
  306. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/apply.post.mjs +2 -2
  307. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/mark-good.post.mjs +2 -2
  308. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/rollback-good.post.mjs +2 -2
  309. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id_.delete.mjs +2 -2
  310. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id_.patch.mjs +2 -2
  311. package/.output/server/chunks/routes/api/workshop/dcw/runs/_id/close.post.mjs +2 -2
  312. package/.output/server/chunks/routes/api/workshop/dcw/runs/_id/data.get.mjs +5 -3
  313. package/.output/server/chunks/routes/api/workshop/dcw/runs/_id/data.get.mjs.map +1 -1
  314. package/.output/server/chunks/routes/api/workshop/dcw/runs/_id/rollback.post.mjs +2 -2
  315. package/.output/server/chunks/routes/api/workshop/dcw/templates/_key_.delete.mjs +2 -2
  316. package/.output/server/chunks/routes/api/workshop/dcw/templates/_key_.patch.mjs +2 -2
  317. package/.output/server/chunks/routes/api/workshop/dcw/test-driver.post.mjs +2 -2
  318. package/.output/server/chunks/routes/api/workshop/device-twins/_id/control.post.mjs +1 -1
  319. package/.output/server/chunks/routes/api/workshop/device-twins/_id/telemetry.post.mjs +1 -1
  320. package/.output/server/chunks/routes/api/workshop/device-twins/_id_.delete.mjs +2 -2
  321. package/.output/server/chunks/routes/api/workshop/device-twins/_id_.patch.mjs +2 -2
  322. package/.output/server/chunks/routes/api/workshop/fs/dirs.get.mjs +1 -1
  323. package/.output/server/chunks/routes/api/workshop/harnesses/_id/providers.get.mjs +2 -2
  324. package/.output/server/chunks/routes/api/workshop/harnesses.get.mjs +2 -2
  325. package/.output/server/chunks/routes/api/workshop/hitl/pending.get.mjs +2 -2
  326. package/.output/server/chunks/routes/api/workshop/hitl/respond.post.mjs +2 -2
  327. package/.output/server/chunks/routes/api/workshop/index.get.mjs +1 -1
  328. package/.output/server/chunks/routes/api/workshop/index.post.mjs +1 -1
  329. package/.output/server/chunks/routes/api/workshop/index.put.mjs +41 -0
  330. package/.output/server/chunks/routes/api/workshop/index.put.mjs.map +1 -0
  331. package/.output/server/chunks/routes/api/workshop/index10.get.mjs +4 -3
  332. package/.output/server/chunks/routes/api/workshop/index10.get.mjs.map +1 -1
  333. package/.output/server/chunks/routes/api/workshop/index11.get.mjs +27 -0
  334. package/.output/server/chunks/routes/api/workshop/index11.get.mjs.map +1 -0
  335. package/.output/server/chunks/routes/api/workshop/index2.get.mjs +1 -1
  336. package/.output/server/chunks/routes/api/workshop/index2.post.mjs +1 -1
  337. package/.output/server/chunks/routes/api/workshop/index3.get.mjs +1 -1
  338. package/.output/server/chunks/routes/api/workshop/index3.post.mjs +4 -4
  339. package/.output/server/chunks/routes/api/workshop/index3.post.mjs.map +1 -1
  340. package/.output/server/chunks/routes/api/workshop/index4.get.mjs +5 -4
  341. package/.output/server/chunks/routes/api/workshop/index4.get.mjs.map +1 -1
  342. package/.output/server/chunks/routes/api/workshop/index4.post.mjs +2 -2
  343. package/.output/server/chunks/routes/api/workshop/index5.get.mjs +18 -11
  344. package/.output/server/chunks/routes/api/workshop/index5.get.mjs.map +1 -1
  345. package/.output/server/chunks/routes/api/workshop/index5.post.mjs +2 -2
  346. package/.output/server/chunks/routes/api/workshop/index6.get.mjs +1 -1
  347. package/.output/server/chunks/routes/api/workshop/index6.post.mjs +2 -2
  348. package/.output/server/chunks/routes/api/workshop/index7.get.mjs +1 -1
  349. package/.output/server/chunks/routes/api/workshop/index7.post.mjs +1 -1
  350. package/.output/server/chunks/routes/api/workshop/index8.get.mjs +24 -12
  351. package/.output/server/chunks/routes/api/workshop/index8.get.mjs.map +1 -1
  352. package/.output/server/chunks/routes/api/workshop/index8.post.mjs +1 -1
  353. package/.output/server/chunks/routes/api/workshop/index9.get.mjs +12 -7
  354. package/.output/server/chunks/routes/api/workshop/index9.get.mjs.map +1 -1
  355. package/.output/server/chunks/routes/api/workshop/mailbox/all.get.mjs +1 -1
  356. package/.output/server/chunks/routes/api/workshop/mailbox.get.mjs +1 -1
  357. package/.output/server/chunks/routes/api/workshop/memories/maintenance.post.mjs +1 -1
  358. package/.output/server/chunks/routes/api/workshop/plugins/_name/disable.post.mjs +2 -2
  359. package/.output/server/chunks/routes/api/workshop/plugins/_name/enable.post.mjs +2 -2
  360. package/.output/server/chunks/routes/api/workshop/plugins/index.get.mjs +1 -1
  361. package/.output/server/chunks/routes/api/workshop/runtime.get.mjs +1 -1
  362. package/.output/server/chunks/routes/api/workshop/scene/layouts/_channelId_.delete.mjs +2 -2
  363. package/.output/server/chunks/routes/api/workshop/scene/layouts/_channelId_.put.mjs +2 -2
  364. package/.output/server/chunks/routes/api/workshop/scene/layouts.get.mjs +1 -1
  365. package/.output/server/chunks/routes/api/workshop/tasks/_id/complete.post.mjs +1 -1
  366. package/.output/server/chunks/routes/api/workshop/tasks/_id/dispatch.post.mjs +1 -1
  367. package/.output/server/chunks/routes/api/workshop/tasks/_id/index.post.mjs +1 -1
  368. package/.output/server/chunks/routes/api/workshop/tasks/_id/report.post.mjs +1 -1
  369. package/.output/server/chunks/routes/api/workshop/tasks/_id/retry.post.mjs +1 -1
  370. package/.output/server/chunks/routes/api/workshop/tasks/_id_.get.mjs +1 -1
  371. package/.output/server/chunks/routes/api/workshop/tasks.get.mjs +1 -1
  372. package/.output/server/chunks/routes/api/workshop/teams/_id/deploy.post.mjs +2 -2
  373. package/.output/server/chunks/routes/api/workshop/teams/_id/index.get.mjs +1 -1
  374. package/.output/server/chunks/routes/api/workshop/teams/_id/index.post.mjs +1 -1
  375. package/.output/server/chunks/routes/api/workshop/teams/_id/members/_agentId_.delete.mjs +1 -1
  376. package/.output/server/chunks/routes/api/workshop/teams/_id_.delete.mjs +1 -1
  377. package/.output/server/chunks/routes/api/workshop/teams/_id_.get.mjs +1 -1
  378. package/.output/server/chunks/routes/api/workshop/teams/_id_.patch.mjs +1 -1
  379. package/.output/server/chunks/routes/api/workshop/users/me.get.mjs +1 -1
  380. package/.output/server/chunks/routes/api/workshop/users/register.post.mjs +1 -1
  381. package/.output/server/chunks/routes/api/workshop/workspaces/_id/channel-templates/_tplId_.post.mjs +3 -3
  382. package/.output/server/chunks/routes/api/workshop/workspaces/_id/channels/_channelId_.delete.mjs +1 -1
  383. package/.output/server/chunks/routes/api/workshop/workspaces/_id/channels/_channelId_.post.mjs +1 -1
  384. package/.output/server/chunks/routes/api/workshop/workspaces/index.delete.mjs +1 -1
  385. package/.output/server/chunks/routes/renderer.mjs +3 -3
  386. package/.output/server/chunks/virtual/entry.mjs +275 -33
  387. package/.output/server/chunks/virtual/entry.mjs.map +1 -1
  388. package/.output/server/chunks/virtual/precomputed.mjs +1 -1
  389. package/.output/server/index.mjs +1 -1
  390. package/.output/server/package.json +1 -1
  391. package/README-zh.md +15 -0
  392. package/README.md +20 -0
  393. package/app/assets/css/main.css +161 -0
  394. package/app/components/AppSidebar.vue +7 -1
  395. package/app/components/AwChart.vue +12 -2
  396. package/app/composables/useRouteMeta.ts +8 -1
  397. package/app/composables/workshop/apiClient.ts +103 -95
  398. package/app/composables/workshop/useDaqStream.ts +35 -21
  399. package/app/composables/workshop/useDcwStream.ts +22 -5
  400. package/app/composables/workshop/useOpsLog.ts +26 -13
  401. package/app/composables/workshop/useWorkshopWs.ts +11 -2
  402. package/app/pages/dcw/index.vue +1079 -1079
  403. package/app/pages/index.vue +7 -2
  404. package/app/pages/logs/index.vue +621 -621
  405. package/app/pages/permissions/index.vue +330 -0
  406. package/app/pages/plugins/index.vue +6 -3
  407. package/app/pages/settings.vue +4 -2
  408. package/app/pages/tokens.vue +9 -13
  409. package/app/pages/workshop/index.vue +3 -1
  410. package/app/plugins/http.ts +18 -2
  411. package/app/plugins/session-restore.client.ts +7 -2
  412. package/app/stores/workshop/user.ts +14 -1
  413. package/i18n/locales/en.ts +1944 -1906
  414. package/i18n/locales/zh-CN.ts +1943 -1905
  415. package/package.json +1 -1
  416. package/scripts/_dbg-acc-1-setup.mjs +57 -0
  417. package/scripts/_dbg-acc-2-diag.mjs +14 -0
  418. package/scripts/_dbg-acc-2-intervals.mjs +81 -0
  419. package/scripts/_dbg-acc-3-daq.mjs +48 -0
  420. package/scripts/_dbg-acc-4-team.mjs +92 -0
  421. package/scripts/_dbg-acc-5-visual.mjs +63 -0
  422. package/scripts/_dbg-acc-5b-ws-town.mjs +18 -0
  423. package/scripts/_dbg-acc-5c-town.mjs +12 -0
  424. package/scripts/_dbg-acc-6-i18n.mjs +19 -0
  425. package/scripts/_dbg-audit-neg-e2e.mjs +64 -0
  426. package/scripts/_dbg-final-features.mjs +155 -0
  427. package/scripts/_dbg-final-fixups.mjs +62 -0
  428. package/scripts/_dbg-final-visual.mjs +29 -0
  429. package/scripts/_dbg-kicker-check.mjs +11 -0
  430. package/scripts/_dbg-perms-e2e.mjs +102 -0
  431. package/scripts/_dbg-perms-visual.mjs +36 -0
  432. package/scripts/_dbg-plugins-e2e.mjs +1 -1
  433. package/scripts/_dbg-protocol-matrix.mjs +16 -0
  434. package/scripts/_dbg-swatch-check.mjs +10 -0
  435. package/scripts/_dbg-ui-shots.mjs +28 -0
  436. package/sdk/api.mjs +117 -101
  437. package/sdk/context.mjs +240 -219
  438. package/sdk/hooks.mjs +105 -103
  439. package/sdk/index.d.mts +142 -135
  440. package/sdk/lifecycle.mjs +26 -25
  441. package/server/api/workshop/agent-tools/bindings/index.post.ts +40 -20
  442. package/server/api/workshop/daq/[id]/bind.post.ts +5 -2
  443. package/server/api/workshop/daq/[id]/frames/content.get.ts +4 -1
  444. package/server/api/workshop/daq/[id]/frames.get.ts +4 -1
  445. package/server/api/workshop/daq/[id]/samples.get.ts +4 -1
  446. package/server/api/workshop/daq/[id].patch.ts +3 -0
  447. package/server/api/workshop/daq/alarms/[id]/ack.post.ts +20 -15
  448. package/server/api/workshop/daq/controller.post.ts +2 -0
  449. package/server/api/workshop/daq/index.get.ts +5 -3
  450. package/server/api/workshop/daq/index.post.ts +2 -2
  451. package/server/api/workshop/dcw/[id]/bind.post.ts +20 -17
  452. package/server/api/workshop/dcw/[id]/test.post.ts +18 -15
  453. package/server/api/workshop/dcw/[id]/write.post.ts +3 -0
  454. package/server/api/workshop/dcw/index.get.ts +22 -9
  455. package/server/api/workshop/dcw/line/query.get.ts +38 -31
  456. package/server/api/workshop/dcw/lines/[id]/start.post.ts +3 -0
  457. package/server/api/workshop/dcw/lines/[id]/stop.post.ts +3 -0
  458. package/server/api/workshop/dcw/lines/index.get.ts +8 -2
  459. package/server/api/workshop/dcw/lines/index.post.ts +2 -2
  460. package/server/api/workshop/dcw/products/index.post.ts +16 -16
  461. package/server/api/workshop/dcw/runs/[id]/data.get.ts +20 -15
  462. package/server/api/workshop/dcw/runs/index.get.ts +13 -11
  463. package/server/api/workshop/permissions/index.get.ts +30 -0
  464. package/server/api/workshop/permissions/index.put.ts +29 -0
  465. package/server/api/workshop/ws.ts +18 -6
  466. package/server/data/daqs.json +48 -48
  467. package/server/data/dcw-products.json +21 -0
  468. package/server/data/dcw-recipes.json +84 -0
  469. package/server/data/dcw-rollback.json +94 -6
  470. package/server/data/dcw-runs.json +81 -75
  471. package/server/data/dcw-writes.json +108 -0
  472. package/server/data/dcws.json +791 -528
  473. package/server/data/line-runs.json +8 -8
  474. package/server/plugins/backup.ts +119 -116
  475. package/server/repositories/user.repository.ts +86 -6
  476. package/server/services/user.service.ts +5 -3
  477. package/server/services/workshop/daq/bus/index.ts +5 -3
  478. package/server/services/workshop/daq/bus/inproc.adapter.ts +12 -3
  479. package/server/services/workshop/daq/bus/mqtt.adapter.ts +13 -0
  480. package/server/services/workshop/daq/bus/queue-port.ts +2 -0
  481. package/server/services/workshop/daq/daq-controller.ts +18 -1
  482. package/server/services/workshop/db/ops.repo.ts +6 -0
  483. package/server/services/workshop/dcw/dcw-controller.ts +10 -2
  484. package/server/services/workshop/permissions.ts +79 -0
  485. package/server/services/workshop/plugins/host.mjs +38 -1
  486. package/server/services/workshop/scene-events.ts +25 -1
  487. package/shared/config/single-instance.mjs +24 -0
  488. package/shared/daq-protocol.ts +2 -0
  489. package/.output/public/_nuxt/B0HpdCKS.js +0 -1
  490. package/.output/public/_nuxt/B1kA8LhC.js +0 -14
  491. package/.output/public/_nuxt/B9MUiDFl.js +0 -1
  492. package/.output/public/_nuxt/B9dLFSYI.js +0 -1
  493. package/.output/public/_nuxt/BaMkWl5i2.js +0 -1
  494. package/.output/public/_nuxt/BmHvC_OU.js +0 -1
  495. package/.output/public/_nuxt/CBciOiTQ.js +0 -1
  496. package/.output/public/_nuxt/CUMdhxg9.js +0 -1
  497. package/.output/public/_nuxt/CgvGu2IO.js +0 -1
  498. package/.output/public/_nuxt/CjDQPXfv.js +0 -1
  499. package/.output/public/_nuxt/CmHzfVc5.js +0 -3
  500. package/.output/public/_nuxt/Cn3J3NXR.js +0 -23
  501. package/.output/public/_nuxt/Cst47G4-.js +0 -1
  502. package/.output/public/_nuxt/D0Szyn_D.js +0 -1
  503. package/.output/public/_nuxt/D3VJ3lex.js +0 -1
  504. package/.output/public/_nuxt/D8wyHvcz2.js +0 -1
  505. package/.output/public/_nuxt/Dqj2h40U.js +0 -1
  506. package/.output/public/_nuxt/OV6PBW2z.js +0 -1
  507. package/.output/public/_nuxt/builds/meta/92d6bd39-dbc5-46d5-90d8-8387f36715fa.json +0 -1
  508. package/.output/public/_nuxt/dcw.DcDjwvqv.css +0 -1
  509. package/.output/public/_nuxt/logs.BO-BSyjm.css +0 -1
  510. package/.output/public/_nuxt/pKv_VWR4.js +0 -1
  511. package/.output/public/_nuxt/pages.CytEOfUs.css +0 -1
  512. package/.output/public/_nuxt/plugins.Clsky_kl.css +0 -1
  513. package/.output/public/_nuxt/settings.DeRNNUcP.css +0 -1
  514. package/.output/public/_nuxt/tokens.BPLe9ioQ.css +0 -1
  515. package/.output/public/_nuxt/wirVyscc.js +0 -1
  516. package/.output/public/_nuxt/workshop.BIdoGfoC.css +0 -1
  517. package/.output/server/chunks/build/OmpTerminalPanel-COphA1br.mjs.map +0 -1
  518. package/.output/server/chunks/build/daq-_hCEaYLd.mjs.map +0 -1
  519. package/.output/server/chunks/build/dcw-C7pJ4Y0p.mjs.map +0 -1
  520. package/.output/server/chunks/build/input-sf_BT6o6.mjs.map +0 -1
  521. package/.output/server/chunks/build/logs-C039TFW1.mjs.map +0 -1
  522. package/.output/server/chunks/build/pages-C_VSGSGo.mjs.map +0 -1
  523. package/.output/server/chunks/build/settings-DA8IkGLo.mjs.map +0 -1
  524. package/.output/server/chunks/build/tokens-DKMvvk3e.mjs.map +0 -1
  525. package/.output/server/chunks/build/town-D0thZ7PK.mjs.map +0 -1
  526. package/.output/server/chunks/build/useDaqStream-BVTRw8_H.mjs.map +0 -1
  527. package/.output/server/chunks/build/useDcwStream-DNsivqI_.mjs.map +0 -1
  528. package/.output/server/chunks/build/useOpsLog-DcKnPO43.mjs.map +0 -1
  529. package/.output/server/chunks/build/useWorkshopWs-B3j5wIAK.mjs.map +0 -1
  530. package/.output/server/chunks/build/user-Dk-ytEUV.mjs +0 -140
  531. package/.output/server/chunks/build/user-Dk-ytEUV.mjs.map +0 -1
  532. package/.output/server/chunks/build/workspaces-IfORCDJE.mjs.map +0 -1
  533. /package/.output/public/_nuxt/{CNs_Ozdc2.js → CNs_Ozdc.js} +0 -0
  534. /package/.output/public/_nuxt/{Cno6kYiO2.js → Cno6kYiO.js} +0 -0
@@ -6,6 +6,7 @@ import { Buffer as Buffer$1 } from 'node:buffer';
6
6
  import { promises, existsSync, readFileSync, mkdirSync, writeFileSync, renameSync, readdirSync, watch as watch$1, statSync, copyFileSync, rmSync } from 'node:fs';
7
7
  import path, { resolve as resolve$1, dirname as dirname$1, join } from 'node:path';
8
8
  import { pathToFileURL, fileURLToPath } from 'node:url';
9
+ import { copyFile, mkdir, writeFile as writeFile$1, readFile as readFile$1, rm } from 'node:fs/promises';
9
10
  import { homedir, tmpdir } from 'node:os';
10
11
  import YAML from 'js-yaml';
11
12
  import { execFile, spawn } from 'node:child_process';
@@ -13,7 +14,6 @@ import { createConnection, createServer } from 'node:net';
13
14
  import { promisify } from 'node:util';
14
15
  import { DatabaseSync } from 'node:sqlite';
15
16
  import { createRequire } from 'node:module';
16
- import { mkdir, writeFile as writeFile$1, readFile as readFile$1, rm } from 'node:fs/promises';
17
17
  import { deflateSync, inflateSync } from 'node:zlib';
18
18
 
19
19
  const subtle = nodeCrypto.webcrypto?.subtle || {};
@@ -5106,7 +5106,7 @@ function _expandFromEnv(value) {
5106
5106
  const _inlineRuntimeConfig = {
5107
5107
  "app": {
5108
5108
  "baseURL": "/",
5109
- "buildId": "92d6bd39-dbc5-46d5-90d8-8387f36715fa",
5109
+ "buildId": "54e22640-4fd0-4fee-9077-31d4d4bb7969",
5110
5110
  "buildAssetsDir": "/_nuxt/",
5111
5111
  "cdnURL": ""
5112
5112
  },
@@ -5136,7 +5136,7 @@ const _inlineRuntimeConfig = {
5136
5136
  "public": {
5137
5137
  "appName": "AgentWorkShop",
5138
5138
  "appTitle": "AgentWorkShop",
5139
- "version": "0.7.9",
5139
+ "version": "0.7.12",
5140
5140
  "description": "基于 Nuxt 4 的配置驱动运行范式",
5141
5141
  "mode": "dev",
5142
5142
  "apiBase": "/api",
@@ -6138,394 +6138,428 @@ const ErrorCodes = {
6138
6138
  INTERNAL: "INTERNAL_ERROR"
6139
6139
  };
6140
6140
 
6141
- // ============================================================
6142
- // AgentWorkShop SDK — HookBus(插件生命周期钩子总线)
6143
- // ------------------------------------------------------------
6144
- // 设计:
6145
- // · 异步串行触发(监听器按注册序 await,可返回值形成 waterfall)
6146
- // · 错误隔离:单监听器抛错不影响其他监听器,错误经 onError 上报
6147
- // · 支持通配符 '*'(接收 { type, payload })
6148
- // · 连续失败自动摘除(熔断):同一监听器连续失败超阈值自动停用,
6149
- // 防止病态插件拖垮事件桥
6150
- // ============================================================
6151
-
6152
- const FAILLIMIT = 8;
6153
-
6154
- class HookBus {
6155
- constructor({ name = 'hooks', onError } = {}) {
6156
- this.name = name;
6157
- this.onError = onError ?? (() => {});
6158
- /** type → Array<{ fn, fails }> */
6159
- this.listeners = new Map();
6160
- this.count = 0;
6161
- }
6162
-
6163
- /** 注册监听器;type='*' 接收全部事件({type,payload})。返回解绑函数 */
6164
- on(type, fn) {
6165
- if (typeof type !== 'string' || typeof fn !== 'function') return () => {}
6166
- const list = this.listeners.get(type) ?? [];
6167
- list.push({ fn, fails: 0 });
6168
- this.listeners.set(type, list);
6169
- this.count++;
6170
- return () => this.off(type, fn)
6171
- }
6172
-
6173
- /** 一次性监听(触发后自动解绑) */
6174
- once(type, fn) {
6175
- const off = this.on(type, async (arg) => {
6176
- off();
6177
- return fn(arg)
6178
- });
6179
- return off
6180
- }
6181
-
6182
- off(type, fn) {
6183
- const list = this.listeners.get(type);
6184
- if (!list) return
6185
- const idx = list.findIndex(l => l.fn === fn);
6186
- if (idx >= 0) {
6187
- list.splice(idx, 1);
6188
- this.count--;
6189
- }
6190
- if (!list.length) this.listeners.delete(type);
6191
- }
6192
-
6193
- /**
6194
- * 触发事件:同名监听器按注册序串行 await;返回最后一个非 undefined 返回值。
6195
- * emit 永不抛错——监听器错误被隔离并计数,连续超限自动摘除(熔断)。
6196
- */
6197
- async emit(type, payload) {
6198
- const same = this.listeners.get(type);
6199
- const wild = this.listeners.get('*');
6200
- let result;
6201
- if (same) {
6202
- for (const l of [...same]) {
6203
- const r = await this.#invoke(type, l, payload);
6204
- if (r !== undefined) result = r;
6205
- }
6206
- }
6207
- if (wild) {
6208
- for (const l of [...wild]) {
6209
- await this.#invoke('*', l, { type, payload });
6210
- }
6211
- }
6212
- return result
6213
- }
6214
-
6215
- async #invoke(type, l, payload) {
6216
- try {
6217
- return await l.fn(payload)
6218
- }
6219
- catch (err) {
6220
- l.fails++;
6221
- try {
6222
- this.onError(err, { bus: this.name, type, fails: l.fails });
6223
- }
6224
- catch { /* 上报器自身错误忽略 */ }
6225
- if (l.fails >= FAILLIMIT) {
6226
- const list = this.listeners.get(type);
6227
- const idx = list?.indexOf(l) ?? -1;
6228
- if (idx >= 0) {
6229
- list.splice(idx, 1);
6230
- this.count--;
6231
- }
6232
- }
6233
- return undefined
6234
- }
6235
- }
6236
-
6237
- /** 已注册监听器总数(诊断用) */
6238
- get size() {
6239
- return this.count
6240
- }
6241
- }
6242
-
6243
- // ============================================================
6244
- // AgentWorkShop SDK — 平台 REST 客户端
6245
- // ------------------------------------------------------------
6246
- // SDK 作为项目服务的 client:对平台 REST 面(/api/**)的类型化轻封装。
6247
- // 三个使用形态:
6248
- // 1) 插件内: ctx.api.lines.list() —— 宿主注入(自环 origin)
6249
- // 2) 外部脚本: createPlatformClient({ baseUrl, token }).daq.nodes()
6250
- // 3) 浏览器: createPlatformClient({ baseUrl: '' }) 同源相对路径
6251
- // 资源方法返回原始 JSON body(data 字段已解包);4xx/5xx 抛错(含 status)。
6252
- // ============================================================
6253
-
6254
- function createPlatformClient({ baseUrl = '', token, logger, timeoutMs = 10000 } = {}) {
6255
- // baseUrl 支持函数(延迟解析):插件宿主的监听端口在 nitro listen 钩子后才确定
6256
- const resolveBase = () => String(typeof baseUrl === 'function' ? baseUrl() : (baseUrl ?? '')).replace(/\/+$/, '');
6257
- let authToken = token ?? null;
6258
-
6259
- async function call(method, path, body, opt = {}) {
6260
- const base = resolveBase();
6261
- const headers = { accept: 'application/json', ...(opt.headers ?? {}) };
6262
- if (authToken) headers.authorization = `Bearer ${authToken}`;
6263
- if (body !== undefined) headers['content-type'] = 'application/json';
6264
- const res = await fetch(`${base}${path}`, {
6265
- method,
6266
- headers,
6267
- body: body !== undefined ? JSON.stringify(body) : undefined,
6268
- signal: AbortSignal.timeout(opt.timeoutMs ?? timeoutMs),
6269
- });
6270
- const json = await res.json().catch(() => null);
6271
- if (!res.ok) {
6272
- const err = new Error(json?.message ?? `HTTP ${res.status} ${path}`);
6273
- err.status = res.status;
6274
- err.body = json;
6275
- if (logger) logger.warn(`API ${method} ${path} → ${res.status}`);
6276
- throw err
6277
- }
6278
- // 平台统一信封 { code, message, data } → 解包 data;非信封原样返回
6279
- return json && typeof json === 'object' && 'data' in json ? json.data : json
6280
- }
6281
-
6282
- const resource = root => ({
6283
- list: (query = {}) => call('GET', `${root}${toQuery(query)}`),
6284
- get: id => call('GET', `${root}/${id}`),
6285
- create: body => call('POST', root, body),
6286
- update: (id, patch) => call('PATCH', `${root}/${id}`, patch),
6287
- remove: id => call('DELETE', `${root}/${id}`),
6288
- });
6289
-
6290
- const client = {
6291
- /** 底层调用(任意平台路径;自动带 token 与信封解包) */
6292
- call,
6293
- get: (path, query = {}) => call('GET', `${path}${toQuery(query)}`),
6294
- post: (path, body) => call('POST', path, body),
6295
- patch: (path, body) => call('PATCH', path, body),
6296
- delete: path => call('DELETE', path),
6297
- setToken: (t) => {
6298
- authToken = t ?? null;
6299
- return client
6300
- },
6301
- /** 平台健康(免鉴权) */
6302
- ping: () => call('GET', '/api/plugins/manifest'),
6303
-
6304
- // ---- 业务资源面 ----
6305
- users: {
6306
- ...resource('/api/users'),
6307
- login: (email, password) => call('POST', '/api/users/login', { email, password }),
6308
- me: () => call('GET', '/api/users/me'),
6309
- },
6310
- lines: {
6311
- ...resource('/api/workshop/dcw/lines'),
6312
- start: (id, recipeId = '') => call('POST', `/api/workshop/dcw/lines/${id}/start`, { recipeId }),
6313
- stop: id => call('POST', `/api/workshop/dcw/lines/${id}/stop`),
6314
- },
6315
- products: resource('/api/workshop/dcw/products'),
6316
- recipes: resource('/api/workshop/dcw/recipes'),
6317
- dcwNodes: resource('/api/workshop/dcw'),
6318
- daqNodes: {
6319
- ...resource('/api/workshop/daq'),
6320
- alarms: () => call('GET', '/api/workshop/daq/alarms'),
6321
- },
6322
- templates: {
6323
- daq: () => call('GET', '/api/workshop/daq').then(d => d?.templates ?? []),
6324
- dcw: () => call('GET', '/api/workshop/dcw').then(d => d?.templates ?? []),
6325
- },
6326
- twins: resource('/api/workshop/device-twins'),
6327
- teams: resource('/api/workshop/teams'),
6328
- agents: resource('/api/workshop/agents'),
6329
- channels: resource('/api/workshop/channels'),
6330
- plugins: {
6331
- manifest: () => call('GET', '/api/plugins/manifest'),
6332
- },
6333
- };
6334
- return client
6335
- }
6336
-
6337
- function toQuery(query) {
6338
- const entries = Object.entries(query ?? {}).filter(([, v]) => v !== undefined && v !== null && v !== '');
6339
- if (!entries.length) return ''
6340
- return `?${new URLSearchParams(Object.fromEntries(entries.map(([k, v]) => [k, String(v)]))).toString()}`
6341
- }
6342
-
6343
- // ============================================================
6344
- // AgentWorkShop SDK — 服务端插件上下文工厂(宿主调用;插件经 setup(ctx) 获得)
6345
- // ------------------------------------------------------------
6346
- // ctx 形态(运行时完整变量面):
6347
- // 身份 ctx.name / ctx.scope('home'|'project') / ctx.dir / ctx.sdkVersion
6348
- // 钩子 ctx.hooks HookBus(生命周期 + event:*) [SDK]
6349
- // 日志 ctx.logger { debug, info, warn, error } 插件名前缀 [SDK]
6350
- // 配置 ctx.config { get(key), all(), onChange(fn) } [SDK]
6351
- // 存储 ctx.kv { get,set,all,bump } 内存态+防抖落盘 [SDK]
6352
- // 定时 ctx.timer { setInterval, setTimeout } 服务关闭自动回收 [SDK]
6353
- // 清理 ctx.onDispose(fn) / ctx.subscriptions [SDK]
6354
- // 路由 ctx.route(method, path, handler) → /api/plugins/<name>… [SDK]
6355
- // 平台 ctx.api 平台 REST 客户端(lines/daq/dcw/twins/teams…) [SDK]
6356
- // 网络 ctx.http { get, post } 带超时 fetch(仅 http/https) [SDK]
6357
- // 事件 ctx.events { on(type,fn), off } scene 实时事件 [SDK]
6358
- // 路径 ctx.paths { home, configRoot, dataDir } [SDK]
6359
- // ============================================================
6360
-
6361
- const SDK_VERSION = '0.3.0';
6362
-
6363
- /** 允许的对外请求协议守卫(拒绝 file:/data: 等;宿主/插件同守此规则) */
6364
- function safeUrl(raw, timeoutMs = 8000) {
6365
- const u = new URL(String(raw));
6366
- if (u.protocol !== 'http:' && u.protocol !== 'https:')
6367
- throw new Error(`协议不允许: ${u.protocol}(仅 http/https)`)
6368
- return { signal: AbortSignal.timeout(timeoutMs) }
6369
- }
6370
-
6371
- /**
6372
- * 创建服务端插件上下文。
6373
- * @param {{ name, scope, dir, hooks, logger, config, paths, emitter, onDispose, selfOrigin }} opts 宿主装配
6374
- */
6375
- function createPluginContext(opts) {
6376
- const { name, scope, dir, hooks, config, paths, emitter } = opts;
6377
- // 规范化 logger:宿主实现缺级时兜底 no-op(插件可用全套 debug/info/warn/error)
6378
- const logger = {
6379
- debug: () => {},
6380
- info: () => {},
6381
- warn: () => {},
6382
- error: () => {},
6383
- ...(opts.logger ?? {}),
6384
- };
6385
- const onDispose = (fn) => {
6386
- return fn
6387
- };
6388
-
6389
- // ---- 定时器:自动登记回收,杜绝插件定时器泄漏 ----
6390
- const timer = {
6391
- setInterval: (fn, ms, ...rest) => {
6392
- const id = setInterval(fn, ms, ...rest);
6393
- if (typeof id === 'object' && id !== null && 'unref' in id) id.unref?.();
6394
- return id
6395
- },
6396
- setTimeout: (fn, ms, ...rest) => {
6397
- const id = setTimeout(fn, ms, ...rest);
6398
- if (typeof id === 'object' && id !== null && 'unref' in id) id.unref?.();
6399
- return id
6400
- },
6401
- };
6402
-
6403
- // ---- 插件私有持久化:内存态为准 + 200ms 防抖落盘 —— 高频钩子(daq:sample)
6404
- // 与低频钩子(line:stop)并发时无 read-modify-write 竞态(JS 同步内存操作原子) ----
6405
- const kvDir = join(paths.dataDir, 'plugins', name);
6406
- const kvFile = join(kvDir, 'kv.json');
6407
- const kvState = (() => {
6408
- try {
6409
- return JSON.parse(readFileSync(kvFile, 'utf8'))
6410
- }
6411
- catch {
6412
- return {}
6413
- }
6414
- })();
6415
- let kvFlushTimer = null;
6416
- const kvFlush = () => {
6417
- clearTimeout(kvFlushTimer);
6418
- kvFlushTimer = setTimeout(() => {
6419
- try {
6420
- mkdirSync(kvDir, { recursive: true });
6421
- const tmp = `${kvFile}.${process.pid}.tmp`;
6422
- writeFileSync(tmp, `${JSON.stringify(kvState, null, 2)}\n`, 'utf8');
6423
- renameSync(tmp, kvFile);
6424
- }
6425
- catch { /* 磁盘异常不阻断插件 */ }
6426
- }, 200);
6427
- };
6428
-
6429
- const ctx = {
6430
- name,
6431
- scope,
6432
- dir: resolve$1(dir),
6433
- sdkVersion: SDK_VERSION,
6434
- hooks, // 宿主全局总线(与事件桥同源)
6435
- logger,
6436
- config: {
6437
- get: key => config?.effective?.[key],
6438
- all: () => ({ ...config?.effective }),
6439
- /** 运行时覆盖变更订阅(runtime-settings.json 变化;宿主 fs.watch 驱动) */
6440
- onChange: fn => hooks.on('config:changed', fn),
6441
- },
6442
- paths: { ...paths },
6443
- dataDir: kvDir,
6444
- kv: {
6445
- get: key => kvState[key],
6446
- set: (key, value) => {
6447
- kvState[key] = value;
6448
- kvFlush();
6449
- return value
6450
- },
6451
- all: () => ({ ...kvState }),
6452
- bump: (key, by = 1) => {
6453
- kvState[key] = (Number(kvState[key]) || 0) + by;
6454
- kvFlush();
6455
- return kvState[key]
6456
- },
6457
- },
6458
- timer,
6459
- onDispose,
6460
- /** 订阅式清理对象({ dispose(){} })集中登记 */
6461
- subscriptions: {
6462
- add: (d) => {
6463
- return d
6464
- },
6465
- },
6466
- route: (method, path, handler) => emitter?.registerRoute(name, method, path, handler),
6467
- /** 平台 REST 客户端(自环 origin 延迟解析;鉴权端点请 ctx.api.setToken(token)) */
6468
- api: createPlatformClient({
6469
- baseUrl: typeof opts.selfOrigin === 'function' ? opts.selfOrigin : () => opts.selfOrigin,
6470
- logger,
6471
- }),
6472
- http: {
6473
- get: (url, opts2 = {}) => fetch(url, { ...safeUrl(url, opts2.timeoutMs), ...opts2 }),
6474
- post: (url, body, opts2 = {}) => fetch(url, {
6475
- method: 'POST',
6476
- headers: { 'content-type': 'application/json', ...(opts2.headers ?? {}) },
6477
- body: JSON.stringify(body ?? {}),
6478
- ...safeUrl(url, opts2.timeoutMs),
6479
- }),
6480
- },
6481
- events: {
6482
- on: (type, fn) => hooks.on(type === '*' ? '*' : `event:${type}`, fn),
6483
- off: (type, fn) => hooks.off(type === '*' ? '*' : `event:${type}`, fn),
6484
- },
6485
- };
6486
- return ctx
6141
+ // ============================================================
6142
+ // AgentWorkShop SDK — HookBus(插件生命周期钩子总线)
6143
+ // ------------------------------------------------------------
6144
+ // 设计:
6145
+ // · 异步串行触发(监听器按注册序 await,可返回值形成 waterfall)
6146
+ // · 错误隔离:单监听器抛错不影响其他监听器,错误经 onError 上报
6147
+ // · 支持通配符 '*'(接收 { type, payload })
6148
+ // · 连续失败自动摘除(熔断):同一监听器连续失败超阈值自动停用,
6149
+ // 防止病态插件拖垮事件桥
6150
+ // ============================================================
6151
+
6152
+ const FAILLIMIT = 8;
6153
+
6154
+ class HookBus {
6155
+ constructor({ name = 'hooks', onError } = {}) {
6156
+ this.name = name;
6157
+ this.onError = onError ?? (() => {});
6158
+ /** type → Array<{ fn, fails }> */
6159
+ this.listeners = new Map();
6160
+ this.count = 0;
6161
+ }
6162
+
6163
+ /** 注册监听器;type='*' 接收全部事件({type,payload})。返回解绑函数 */
6164
+ on(type, fn) {
6165
+ if (typeof type !== 'string' || typeof fn !== 'function') return () => {}
6166
+ const list = this.listeners.get(type) ?? [];
6167
+ list.push({ fn, fails: 0 });
6168
+ this.listeners.set(type, list);
6169
+ this.count++;
6170
+ return () => this.off(type, fn)
6171
+ }
6172
+
6173
+ /** 一次性监听(触发后自动解绑) */
6174
+ once(type, fn) {
6175
+ const off = this.on(type, async (arg) => {
6176
+ off();
6177
+ return fn(arg)
6178
+ });
6179
+ return off
6180
+ }
6181
+
6182
+ off(type, fn) {
6183
+ const list = this.listeners.get(type);
6184
+ if (!list) return
6185
+ const idx = list.findIndex(l => l.fn === fn);
6186
+ if (idx >= 0) {
6187
+ list.splice(idx, 1);
6188
+ this.count--;
6189
+ }
6190
+ if (!list.length) this.listeners.delete(type);
6191
+ }
6192
+
6193
+ /**
6194
+ * 触发事件:同名监听器按注册序串行 await;返回最后一个非 undefined 返回值。
6195
+ * emit 永不抛错——监听器错误被隔离并计数,连续超限自动摘除(熔断)。
6196
+ */
6197
+ async emit(type, payload) {
6198
+ const same = this.listeners.get(type);
6199
+ const wild = this.listeners.get('*');
6200
+ let result;
6201
+ if (same) {
6202
+ for (const l of [...same]) {
6203
+ const r = await this.#invoke(type, l, payload);
6204
+ if (r !== undefined) result = r;
6205
+ }
6206
+ }
6207
+ if (wild) {
6208
+ for (const l of [...wild]) {
6209
+ await this.#invoke('*', l, { type, payload });
6210
+ }
6211
+ }
6212
+ return result
6213
+ }
6214
+
6215
+ async #invoke(type, l, payload) {
6216
+ try {
6217
+ const r = await l.fn(payload);
6218
+ l.fails = 0; // 仅"连续失败"触发熔断:成功即清零,偶发失败不累积驱逐
6219
+ return r
6220
+ }
6221
+ catch (err) {
6222
+ l.fails++;
6223
+ try {
6224
+ this.onError(err, { bus: this.name, type, fails: l.fails });
6225
+ }
6226
+ catch { /* 上报器自身错误忽略 */ }
6227
+ if (l.fails >= FAILLIMIT) {
6228
+ const list = this.listeners.get(type);
6229
+ const idx = list?.indexOf(l) ?? -1;
6230
+ if (idx >= 0) {
6231
+ list.splice(idx, 1);
6232
+ this.count--;
6233
+ }
6234
+ }
6235
+ return undefined
6236
+ }
6237
+ }
6238
+
6239
+ /** 已注册监听器总数(诊断用) */
6240
+ get size() {
6241
+ return this.count
6242
+ }
6487
6243
  }
6488
6244
 
6489
- /** 宿主路由表(exact-match;插件 API 挂 /api/plugins/<name><path>) */
6490
- function createRouteTable() {
6491
- const table = new Map(); // `${method} ${name} ${path}` → handler
6492
- return {
6493
- register(name, method, path, handler) {
6494
- if (typeof handler !== 'function') return false
6495
- const key = `${String(method).toUpperCase()} ${name} ${path.startsWith('/') ? path : `/${path}`}`;
6496
- table.set(key, handler);
6497
- return true
6498
- },
6499
- resolve(name, method, path) {
6500
- return table.get(`${String(method).toUpperCase()} ${name} ${path.startsWith('/') ? path : `/${path}`}`) ?? null
6501
- },
6502
- byPlugin(name) {
6503
- const out = [];
6504
- for (const key of table.keys()) {
6505
- const [m, n, ...rest] = key.split(' ');
6506
- if (n === name) out.push({ method: m, path: rest.join('/') });
6507
- }
6508
- return out
6509
- },
6510
- get size() {
6511
- return table.size
6512
- },
6513
- }
6245
+ // ============================================================
6246
+ // AgentWorkShop SDK — 平台 REST 客户端
6247
+ // ------------------------------------------------------------
6248
+ // SDK 作为项目服务的 client:对平台 REST 面(/api/**)的类型化轻封装。
6249
+ // 三个使用形态:
6250
+ // 1) 插件内: ctx.api.lines.list() —— 宿主注入(自环 origin)
6251
+ // 2) 外部脚本: createPlatformClient({ baseUrl, token }).daq.nodes()
6252
+ // 3) 浏览器: createPlatformClient({ baseUrl: '' }) 同源相对路径
6253
+ // 资源方法返回原始 JSON body(data 字段已解包);4xx/5xx 抛错(含 status)。
6254
+ // ============================================================
6255
+
6256
+ function createPlatformClient({ baseUrl = '', token, logger, timeoutMs = 10000 } = {}) {
6257
+ // baseUrl 支持函数(延迟解析):插件宿主的监听端口在 nitro listen 钩子后才确定
6258
+ const resolveBase = () => String(typeof baseUrl === 'function' ? baseUrl() : (baseUrl ?? '')).replace(/\/+$/, '');
6259
+ let authToken = token ?? null;
6260
+
6261
+ async function call(method, path, body, opt = {}) {
6262
+ const base = resolveBase();
6263
+ const headers = { accept: 'application/json', ...(opt.headers ?? {}) };
6264
+ if (authToken) headers.authorization = `Bearer ${authToken}`;
6265
+ if (body !== undefined) headers['content-type'] = 'application/json';
6266
+ const res = await fetch(`${base}${path}`, {
6267
+ method,
6268
+ headers,
6269
+ body: body !== undefined ? JSON.stringify(body) : undefined,
6270
+ signal: AbortSignal.timeout(opt.timeoutMs ?? timeoutMs),
6271
+ });
6272
+ const json = await res.json().catch(() => null);
6273
+ if (!res.ok) {
6274
+ const err = new Error(json?.message ?? `HTTP ${res.status} ${path}`);
6275
+ err.status = res.status;
6276
+ err.body = json;
6277
+ if (logger) logger.warn(`API ${method} ${path} → ${res.status}`);
6278
+ throw err
6279
+ }
6280
+ // 平台统一信封 { code, message, data }:HTTP 200 但业务 code 非 0 也是错误
6281
+ // (不做此检查插件会把 error 信封解包成 null 当成功用)
6282
+ if (json && typeof json === 'object' && 'code' in json && json.code !== 0) {
6283
+ const err = new Error(json.message ?? `业务错误 ${json.code} ${path}`);
6284
+ err.status = res.status;
6285
+ err.code = json.code;
6286
+ err.body = json;
6287
+ if (logger) logger.warn(`API ${method} ${path} → code ${json.code}`);
6288
+ throw err
6289
+ }
6290
+ // 非信封原样返回
6291
+ return json && typeof json === 'object' && 'data' in json && 'code' in json ? json.data : json
6292
+ }
6293
+
6294
+ const resource = root => ({
6295
+ list: (query = {}) => call('GET', `${root}${toQuery(query)}`),
6296
+ get: id => call('GET', `${root}/${id}`),
6297
+ create: body => call('POST', root, body),
6298
+ update: (id, patch) => call('PATCH', `${root}/${id}`, patch),
6299
+ remove: id => call('DELETE', `${root}/${id}`),
6300
+ });
6301
+
6302
+ const client = {
6303
+ /** 底层调用(任意平台路径;自动带 token 与信封解包) */
6304
+ call,
6305
+ get: (path, query = {}) => call('GET', `${path}${toQuery(query)}`),
6306
+ post: (path, body) => call('POST', path, body),
6307
+ patch: (path, body) => call('PATCH', path, body),
6308
+ delete: path => call('DELETE', path),
6309
+ setToken: (t) => {
6310
+ authToken = t ?? null;
6311
+ return client
6312
+ },
6313
+ /** 平台健康(免鉴权) */
6314
+ ping: () => call('GET', '/api/plugins/manifest'),
6315
+
6316
+ // ---- 业务资源面 ----
6317
+ users: {
6318
+ ...resource('/api/users'),
6319
+ login: (email, password) => call('POST', '/api/users/login', { email, password }),
6320
+ me: () => call('GET', '/api/users/me'),
6321
+ },
6322
+ lines: {
6323
+ ...resource('/api/workshop/dcw/lines'),
6324
+ start: (id, recipeId = '') => call('POST', `/api/workshop/dcw/lines/${id}/start`, { recipeId }),
6325
+ stop: id => call('POST', `/api/workshop/dcw/lines/${id}/stop`),
6326
+ },
6327
+ products: resource('/api/workshop/dcw/products'),
6328
+ recipes: resource('/api/workshop/dcw/recipes'),
6329
+ dcwNodes: resource('/api/workshop/dcw'),
6330
+ daqNodes: {
6331
+ ...resource('/api/workshop/daq'),
6332
+ alarms: () => call('GET', '/api/workshop/daq/alarms'),
6333
+ },
6334
+ templates: {
6335
+ daq: () => call('GET', '/api/workshop/daq').then(d => d?.templates ?? []),
6336
+ dcw: () => call('GET', '/api/workshop/dcw').then(d => d?.templates ?? []),
6337
+ },
6338
+ twins: resource('/api/workshop/device-twins'),
6339
+ teams: resource('/api/workshop/teams'),
6340
+ agents: resource('/api/workshop/agents'),
6341
+ channels: resource('/api/workshop/channels'),
6342
+ permissions: {
6343
+ /** admin:全量产线 + 用户(含 channels/grants)总览 */
6344
+ overview: () => call('GET', '/api/workshop/permissions'),
6345
+ /** admin:批量设置用户产线授权 { userId, grants: [{ lineId, mode: 'readonly'|'operate'|null }] } */
6346
+ set: payload => call('PUT', '/api/workshop/permissions', payload),
6347
+ },
6348
+ plugins: {
6349
+ manifest: () => call('GET', '/api/plugins/manifest'),
6350
+ },
6351
+ };
6352
+ return client
6353
+ }
6354
+
6355
+ function toQuery(query) {
6356
+ const entries = Object.entries(query ?? {}).filter(([, v]) => v !== undefined && v !== null && v !== '');
6357
+ if (!entries.length) return ''
6358
+ return `?${new URLSearchParams(Object.fromEntries(entries.map(([k, v]) => [k, String(v)]))).toString()}`
6514
6359
  }
6515
6360
 
6516
- /** 校验插件入口导出(宿主装载前的形态检查) */
6517
- function validatePluginModule(mod, source) {
6518
- const def = mod?.default ?? mod;
6519
- if (!def || typeof def !== 'object' || typeof def.name !== 'string' || !def.name.trim()) {
6520
- return { ok: false, error: `插件缺少 name 或不是对象: ${source}` }
6521
- }
6522
- if (def.setup && typeof def.setup !== 'function') {
6523
- return { ok: false, error: `插件 setup 不是函数: ${def.name}` }
6524
- }
6525
- if (def.client && typeof def.client !== 'string') {
6526
- return { ok: false, error: `插件 client 必须是相对路径字符串: ${def.name}` }
6527
- }
6528
- return { ok: true, def }
6361
+ // ============================================================
6362
+ // AgentWorkShop SDK — 服务端插件上下文工厂(宿主调用;插件经 setup(ctx) 获得)
6363
+ // ------------------------------------------------------------
6364
+ // ctx 形态(运行时完整变量面):
6365
+ // 身份 ctx.name / ctx.scope('home'|'project') / ctx.dir / ctx.sdkVersion
6366
+ // 钩子 ctx.hooks HookBus(生命周期 + event:*) [SDK]
6367
+ // 日志 ctx.logger { debug, info, warn, error } 插件名前缀 [SDK]
6368
+ // 配置 ctx.config { get(key), all(), onChange(fn) } [SDK]
6369
+ // 存储 ctx.kv { get,set,all,bump } 内存态+防抖落盘 [SDK]
6370
+ // 定时 ctx.timer { setInterval, setTimeout } 服务关闭自动回收 [SDK]
6371
+ // 清理 ctx.onDispose(fn) / ctx.subscriptions [SDK]
6372
+ // 路由 ctx.route(method, path, handler) → /api/plugins/<name>… [SDK]
6373
+ // 平台 ctx.api 平台 REST 客户端(lines/daq/dcw/twins/teams…) [SDK]
6374
+ // 网络 ctx.http { get, post } 带超时 fetch(仅 http/https) [SDK]
6375
+ // 事件 ctx.events { on(type,fn), off } scene 实时事件 [SDK]
6376
+ // 路径 ctx.paths { home, configRoot, dataDir } [SDK]
6377
+ // ============================================================
6378
+
6379
+ const SDK_VERSION = '0.3.0';
6380
+
6381
+ /** 允许的对外请求协议守卫(拒绝 file:/data: 等;宿主/插件同守此规则) */
6382
+ function safeUrl(raw, timeoutMs = 8000) {
6383
+ const u = new URL(String(raw));
6384
+ if (u.protocol !== 'http:' && u.protocol !== 'https:')
6385
+ throw new Error(`协议不允许: ${u.protocol}(仅 http/https)`)
6386
+ return { signal: AbortSignal.timeout(timeoutMs) }
6387
+ }
6388
+
6389
+ /**
6390
+ * 创建服务端插件上下文。
6391
+ * @param {{ name, scope, dir, hooks, logger, config, paths, emitter, onDispose, selfOrigin }} opts 宿主装配
6392
+ */
6393
+ function createPluginContext(opts) {
6394
+ const { name, scope, dir, hooks, config, paths, emitter } = opts;
6395
+ // 规范化 logger:宿主实现缺级时兜底 no-op(插件可用全套 debug/info/warn/error)
6396
+ const logger = {
6397
+ debug: () => {},
6398
+ info: () => {},
6399
+ warn: () => {},
6400
+ error: () => {},
6401
+ ...(opts.logger ?? {}),
6402
+ };
6403
+ const onDispose = (fn) => {
6404
+ return fn
6405
+ };
6406
+
6407
+ // ---- 定时器:自动登记回收,杜绝插件定时器泄漏 ----
6408
+ const timer = {
6409
+ setInterval: (fn, ms, ...rest) => {
6410
+ const id = setInterval(fn, ms, ...rest);
6411
+ if (typeof id === 'object' && id !== null && 'unref' in id) id.unref?.();
6412
+ return id
6413
+ },
6414
+ setTimeout: (fn, ms, ...rest) => {
6415
+ const id = setTimeout(fn, ms, ...rest);
6416
+ if (typeof id === 'object' && id !== null && 'unref' in id) id.unref?.();
6417
+ return id
6418
+ },
6419
+ };
6420
+
6421
+ // ---- 插件私有持久化:内存态为准 + 200ms 防抖落盘 —— 高频钩子(daq:sample)
6422
+ // 与低频钩子(line:stop)并发时无 read-modify-write 竞态(JS 同步内存操作原子) ----
6423
+ const kvDir = join(paths.dataDir, 'plugins', name);
6424
+ const kvFile = join(kvDir, 'kv.json');
6425
+ const kvState = (() => {
6426
+ try {
6427
+ return JSON.parse(readFileSync(kvFile, 'utf8'))
6428
+ }
6429
+ catch {
6430
+ return {}
6431
+ }
6432
+ })();
6433
+ let kvFlushTimer = null;
6434
+ const flushKvNow = () => {
6435
+ try {
6436
+ mkdirSync(kvDir, { recursive: true });
6437
+ const tmp = `${kvFile}.${process.pid}.tmp`;
6438
+ writeFileSync(tmp, `${JSON.stringify(kvState, null, 2)}\n`, 'utf8');
6439
+ renameSync(tmp, kvFile);
6440
+ }
6441
+ catch (err) {
6442
+ // 磁盘异常不阻断插件,但不再静默:持久化失败至少要可见
6443
+ console.warn('[sdk] kv 落盘失败:', err?.message ?? err);
6444
+ }
6445
+ };
6446
+ const kvFlush = () => {
6447
+ clearTimeout(kvFlushTimer);
6448
+ kvFlushTimer = setTimeout(flushKvNow, 200);
6449
+ };
6450
+
6451
+ const ctx = {
6452
+ name,
6453
+ scope,
6454
+ dir: resolve$1(dir),
6455
+ sdkVersion: SDK_VERSION,
6456
+ hooks, // 宿主全局总线(与事件桥同源)
6457
+ logger,
6458
+ config: {
6459
+ get: key => config?.effective?.[key],
6460
+ all: () => ({ ...config?.effective }),
6461
+ /** 运行时覆盖变更订阅(runtime-settings.json 变化;宿主 fs.watch 驱动) */
6462
+ onChange: fn => hooks.on('config:changed', fn),
6463
+ },
6464
+ paths: { ...paths },
6465
+ dataDir: kvDir,
6466
+ kv: {
6467
+ get: key => kvState[key],
6468
+ set: (key, value) => {
6469
+ kvState[key] = value;
6470
+ kvFlush();
6471
+ return value
6472
+ },
6473
+ all: () => ({ ...kvState }),
6474
+ bump: (key, by = 1) => {
6475
+ kvState[key] = (Number(kvState[key]) || 0) + by;
6476
+ kvFlush();
6477
+ return kvState[key]
6478
+ },
6479
+ },
6480
+ timer,
6481
+ onDispose,
6482
+ /** 产线权限面(宿主注入;未提供时降级为不可用占位):
6483
+ * lineMode(user,lineId) → 'none'|'readonly'|'operate'
6484
+ * visibleLineIds(user) → Set<lineId>|null(全量)
6485
+ * listGrants(userId) → [{lineId,mode,grantedBy,grantedAt}]
6486
+ * setGrants(userId, [{lineId,mode}]) → 写授权(需 admin 上下文)
6487
+ * 变更事件: hooks.on('permissions:changed', { userId }) */
6488
+ permissions: opts.permissions ?? {
6489
+ lineMode: () => 'none',
6490
+ visibleLineIds: () => new Set(),
6491
+ listGrants: () => [],
6492
+ setGrants: () => { throw new Error('[sdk] ctx.permissions 未由宿主注入') },
6493
+ },
6494
+ /** 订阅式清理对象({ dispose(){} })集中登记 */
6495
+ subscriptions: {
6496
+ add: (d) => {
6497
+ return d
6498
+ },
6499
+ },
6500
+ route: (method, path, handler) => emitter?.registerRoute(name, method, path, handler),
6501
+ /** 平台 REST 客户端(自环 origin 延迟解析;鉴权端点请 ctx.api.setToken(token)) */
6502
+ api: createPlatformClient({
6503
+ baseUrl: typeof opts.selfOrigin === 'function' ? opts.selfOrigin : () => opts.selfOrigin,
6504
+ logger,
6505
+ }),
6506
+ http: {
6507
+ get: (url, opts2 = {}) => fetch(url, { ...safeUrl(url, opts2.timeoutMs), ...opts2 }),
6508
+ post: (url, body, opts2 = {}) => fetch(url, {
6509
+ method: 'POST',
6510
+ headers: { 'content-type': 'application/json', ...(opts2.headers ?? {}) },
6511
+ body: JSON.stringify(body ?? {}),
6512
+ ...safeUrl(url, opts2.timeoutMs),
6513
+ }),
6514
+ },
6515
+ events: {
6516
+ on: (type, fn) => hooks.on(type === '*' ? '*' : `event:${type}`, fn),
6517
+ off: (type, fn) => hooks.off(type === '*' ? '*' : `event:${type}`, fn),
6518
+ },
6519
+ };
6520
+ return ctx
6521
+ }
6522
+
6523
+ /** 宿主路由表(exact-match;插件 API 挂 /api/plugins/<name><path>) */
6524
+ function createRouteTable() {
6525
+ const table = new Map(); // `${method} ${name} ${path}` → handler
6526
+ return {
6527
+ register(name, method, path, handler) {
6528
+ if (typeof handler !== 'function') return false
6529
+ const key = `${String(method).toUpperCase()} ${name} ${path.startsWith('/') ? path : `/${path}`}`;
6530
+ table.set(key, handler);
6531
+ return true
6532
+ },
6533
+ resolve(name, method, path) {
6534
+ return table.get(`${String(method).toUpperCase()} ${name} ${path.startsWith('/') ? path : `/${path}`}`) ?? null
6535
+ },
6536
+ byPlugin(name) {
6537
+ const out = [];
6538
+ for (const key of table.keys()) {
6539
+ const [m, n, ...rest] = key.split(' ');
6540
+ if (n === name) out.push({ method: m, path: rest.join('/') });
6541
+ }
6542
+ return out
6543
+ },
6544
+ get size() {
6545
+ return table.size
6546
+ },
6547
+ }
6548
+ }
6549
+
6550
+ /** 校验插件入口导出(宿主装载前的形态检查) */
6551
+ function validatePluginModule(mod, source) {
6552
+ const def = mod?.default ?? mod;
6553
+ if (!def || typeof def !== 'object' || typeof def.name !== 'string' || !def.name.trim()) {
6554
+ return { ok: false, error: `插件缺少 name 或不是对象: ${source}` }
6555
+ }
6556
+ if (def.setup && typeof def.setup !== 'function') {
6557
+ return { ok: false, error: `插件 setup 不是函数: ${def.name}` }
6558
+ }
6559
+ if (def.client && typeof def.client !== 'string') {
6560
+ return { ok: false, error: `插件 client 必须是相对路径字符串: ${def.name}` }
6561
+ }
6562
+ return { ok: true, def }
6529
6563
  }
6530
6564
 
6531
6565
  // ============================================================
@@ -6545,6 +6579,23 @@ function validatePluginModule(mod, source) {
6545
6579
  // 错误隔离:单插件装载/执行失败记入 failures,绝不拖垮主服务。
6546
6580
  // ============================================================
6547
6581
 
6582
+ // 延迟解析的产线权限服务(esbuild/别名下避免 nitro 打包循环导入;失败降级为拒绝一切)
6583
+ let permissions$1 = null;
6584
+ let userRepository$1 = null;
6585
+ async function loadPermissions() {
6586
+ if (permissions$1) return
6587
+ try {
6588
+ permissions$1 = await Promise.resolve().then(function () { return permissions; });
6589
+ userRepository$1 = await Promise.resolve().then(function () { return user_repository; }).then(m => m.userRepository);
6590
+ }
6591
+ catch (err) {
6592
+ hostLoggerFallback()?.warn('权限服务加载失败(插件 ctx.permissions 降级):', err?.message);
6593
+ }
6594
+ }
6595
+ function hostLoggerFallback() {
6596
+ return globalThis.__awPluginHost?.logger ?? console
6597
+ }
6598
+
6548
6599
  const g$r = globalThis;
6549
6600
 
6550
6601
  function log$t() {
@@ -6689,6 +6740,9 @@ async function loadAllPlugins(host, { config, paths }) {
6689
6740
  const disabled = readDisabledSet(homeDir);
6690
6741
  host.disabledSet = disabled;
6691
6742
 
6743
+ // 产线权限服务(ctx.permissions 注入用;失败降级)
6744
+ await loadPermissions();
6745
+
6692
6746
  const entries = discoverPluginDirs(host.cwd);
6693
6747
  if (entries.length) host.logger.info(`发现 ${entries.length} 个插件(停用 ${disabled.size}),开始装载 ...`);
6694
6748
 
@@ -6775,6 +6829,20 @@ async function loadAllPlugins(host, { config, paths }) {
6775
6829
  return fn
6776
6830
  },
6777
6831
  selfOrigin: () => selfOriginRef(host),
6832
+ // 产线权限拓展面(SDK ctx.permissions):插件可查询/管理用户×产线授权
6833
+ permissions: {
6834
+ lineMode: (user, lineId) => permissions$1.lineMode(user, lineId),
6835
+ visibleLineIds: user => permissions$1.visibleLineIds(user),
6836
+ listGrants: userId => userRepository$1.listGrants(userId),
6837
+ setGrants: (userId, entries, grantedBy = 'plugin') => {
6838
+ for (const g of (entries ?? [])) {
6839
+ if (!g?.lineId) continue
6840
+ userRepository$1.setGrant(userId, String(g.lineId), (g.mode ?? null), grantedBy);
6841
+ }
6842
+ permissions$1.notifyGrantsChanged(userId);
6843
+ return userRepository$1.listGrants(userId)
6844
+ },
6845
+ },
6778
6846
  });
6779
6847
  // DAQ 扩展面(v2 帧管线):插件注册自定义驱动与下沉处理器。
6780
6848
  // 桥经 globalThis 排队 —— daq 模块晚于插件宿主装载时,注册项先排队、
@@ -6919,7 +6987,10 @@ function ensureStateWatcher(host) {
6919
6987
  mkdirSync(dirname$1(statePath), { recursive: true });
6920
6988
  if (!existsSync(statePath)) writeDisabledSet(modePaths(host.cwd).homeDir, new Set());
6921
6989
  let debounce = null;
6922
- watch$1(statePath, () => {
6990
+ // watch 目录而非文件:writeDisabledSet 用 rename 原子替换,POSIX 的文件级
6991
+ // watch 挂在旧 inode 上,首次启停后静默失效;目录监听对 rename 稳定
6992
+ watch$1(dirname$1(statePath), (_event, filename) => {
6993
+ if (filename && filename !== 'plugins-state.json') return
6923
6994
  clearTimeout(debounce);
6924
6995
  debounce = setTimeout(() => {
6925
6996
  void reloadPluginHost();
@@ -7006,12 +7077,44 @@ async function shutdownPluginHost() {
7006
7077
  host.logger.info('插件清理完成,已发出 server:close');
7007
7078
  }
7008
7079
 
7080
+ const host = /*#__PURE__*/Object.freeze(/*#__PURE__*/Object.defineProperty({
7081
+ __proto__: null,
7082
+ discoverPluginDirs: discoverPluginDirs,
7083
+ emitDaqFrame: emitDaqFrame,
7084
+ emitDaqSample: emitDaqSample,
7085
+ emitDcwWrite: emitDcwWrite,
7086
+ emitLineLifecycle: emitLineLifecycle,
7087
+ emitPluginEvent: emitPluginEvent,
7088
+ getPluginHost: getPluginHost,
7089
+ initPluginHost: initPluginHost,
7090
+ pluginManifest: pluginManifest,
7091
+ readClientScript: readClientScript,
7092
+ readDisabledSet: readDisabledSet,
7093
+ reloadPluginHost: reloadPluginHost,
7094
+ setPluginEnabled: setPluginEnabled,
7095
+ shutdownPluginHost: shutdownPluginHost,
7096
+ statePathFor: statePathFor,
7097
+ writeDisabledSet: writeDisabledSet
7098
+ }, Symbol.toStringTag, { value: 'Module' }));
7099
+
7009
7100
  const AEP_VERSION$1 = 1;
7010
7101
  const g$q = globalThis;
7011
7102
  function peers() {
7012
7103
  var _a;
7013
7104
  return (_a = g$q.__sceneEventPeers) != null ? _a : g$q.__sceneEventPeers = /* @__PURE__ */ new Set();
7014
7105
  }
7106
+ function setPeerVisibleLines(peer, visible) {
7107
+ peer.__awVisibleLines = visible;
7108
+ }
7109
+ function peerSeesLine(peer, lineId) {
7110
+ const visible = peer.__awVisibleLines;
7111
+ if (visible == null) return true;
7112
+ return visible.has(lineId);
7113
+ }
7114
+ function payloadLineId(payload) {
7115
+ const lid = payload == null ? void 0 : payload.lineId;
7116
+ return typeof lid === "string" && lid !== "" ? lid : void 0;
7117
+ }
7015
7118
  function registerScenePeer(peer) {
7016
7119
  peers().add(peer);
7017
7120
  }
@@ -7024,8 +7127,10 @@ function sceneEventPeerCount() {
7024
7127
  function broadcastSceneEvent(type, payload) {
7025
7128
  emitPluginEvent(type, payload);
7026
7129
  if (peers().size === 0) return;
7130
+ const lineId = payloadLineId(payload);
7027
7131
  const frame = JSON.stringify({ v: AEP_VERSION$1, type, seq: 0, at: (/* @__PURE__ */ new Date()).toISOString(), channelId: "", payload });
7028
7132
  for (const peer of peers()) {
7133
+ if (lineId !== void 0 && !peerSeesLine(peer, lineId)) continue;
7029
7134
  try {
7030
7135
  peer.send(frame);
7031
7136
  } catch {
@@ -7051,6 +7156,7 @@ const sceneEvents = /*#__PURE__*/Object.freeze(/*#__PURE__*/Object.definePropert
7051
7156
  broadcastSceneEvent: broadcastSceneEvent,
7052
7157
  registerScenePeer: registerScenePeer,
7053
7158
  sceneEventPeerCount: sceneEventPeerCount,
7159
+ setPeerVisibleLines: setPeerVisibleLines,
7054
7160
  unregisterScenePeer: unregisterScenePeer
7055
7161
  }, Symbol.toStringTag, { value: 'Module' }));
7056
7162
 
@@ -7836,11 +7942,11 @@ async function backupOne(src, target) {
7836
7942
  }
7837
7943
  }
7838
7944
  const tmp = `${target}.tmp`;
7839
- copyFileSync(src, tmp);
7945
+ await copyFile(src, tmp);
7840
7946
  try {
7841
7947
  renameSync(tmp, target);
7842
7948
  } catch {
7843
- copyFileSync(src, target);
7949
+ await copyFile(src, target);
7844
7950
  try {
7845
7951
  rmSync(tmp);
7846
7952
  } catch {
@@ -8901,6 +9007,14 @@ class InProcQueueAdapter {
8901
9007
  this.consumers.delete(fn);
8902
9008
  };
8903
9009
  }
9010
+ /** 释放消费泵(rebuild 换装前调用,防定时器泄漏) */
9011
+ close() {
9012
+ if (this.pump) {
9013
+ clearInterval(this.pump);
9014
+ this.pump = null;
9015
+ }
9016
+ this.consumers.clear();
9017
+ }
8904
9018
  drain() {
8905
9019
  if (this.queue.length === 0 || this.consumers.size === 0) return;
8906
9020
  const batch = this.queue.splice(0, this.queue.length);
@@ -9001,6 +9115,18 @@ class MqttQueueAdapter {
9001
9115
  this.consumers.delete(fn);
9002
9116
  };
9003
9117
  }
9118
+ /** 断开 MQTT 连接并清理订阅(rebuild 换装前调用,防 socket/keepalive 泄漏) */
9119
+ async close() {
9120
+ this.consumers.clear();
9121
+ const c = this.client;
9122
+ this.client = null;
9123
+ if (c) {
9124
+ try {
9125
+ await new Promise((r) => c.end(false, () => r()));
9126
+ } catch {
9127
+ }
9128
+ }
9129
+ }
9004
9130
  }
9005
9131
 
9006
9132
  const log$m = createLogger("daq.queue");
@@ -9014,9 +9140,10 @@ async function getDaqQueue() {
9014
9140
  return g$j.__daqQueue;
9015
9141
  }
9016
9142
  async function rebuildDaqQueue(online, url) {
9017
- var _a;
9143
+ var _a, _b, _c;
9144
+ await ((_b = (_a = g$j.__daqQueue) == null ? void 0 : _a.close) == null ? void 0 : _b.call(_a));
9018
9145
  if (!online || !url) {
9019
- if (((_a = g$j.__daqQueue) == null ? void 0 : _a.backend) !== "inproc") {
9146
+ if (((_c = g$j.__daqQueue) == null ? void 0 : _c.backend) !== "inproc") {
9020
9147
  g$j.__daqQueue = new InProcQueueAdapter();
9021
9148
  await g$j.__daqQueue.init();
9022
9149
  log$m.warn("[daq-queue] \u964D\u7EA7\u8FDB\u7A0B\u5185\u961F\u5217");
@@ -11328,6 +11455,8 @@ class DaqController {
11328
11455
  /** 绑定设备端到端回写:通道值进入 DeviceTwin.telemetry(键名 = 模板 telemetryKey 数据,缺省 templateKey);
11329
11456
  * 状态随行:节点 alarm 派生自用户设置的量程/预警带(数据驱动),透传给孪生而非让孪生按硬编码阈值猜 */
11330
11457
  __publicField$u(this, "pendingBackfill", /* @__PURE__ */ new Map());
11458
+ /** 同绑定 siblings 缓存(1s TTL):回写热路径不再逐样本全量 scan,O(N²)→O(N)/周期 */
11459
+ __publicField$u(this, "siblingsCache", /* @__PURE__ */ new Map());
11331
11460
  /** 遥测 WS 推送(1s/设备节流):孪生状态/遥测事件化直推,前端全量轮询降级为断线兜底 */
11332
11461
  __publicField$u(this, "twinPushAt", /* @__PURE__ */ new Map());
11333
11462
  }
@@ -11441,7 +11570,7 @@ class DaqController {
11441
11570
  return host.lineRun.recipeWindow(run.recipeId, node.id);
11442
11571
  }
11443
11572
  ingestNode(node, env, allowPublish) {
11444
- var _a, _b, _c, _d, _e, _f, _g, _h, _i;
11573
+ var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j;
11445
11574
  if (env.frame) {
11446
11575
  this.ingestFrame(node, env, allowPublish);
11447
11576
  return;
@@ -11452,24 +11581,25 @@ class DaqController {
11452
11581
  templateRef: node.templateRef,
11453
11582
  value: (_a = node.value) != null ? _a : env.value,
11454
11583
  state: node.state,
11455
- at: env.at
11584
+ at: env.at,
11585
+ lineId: (_b = node.lineId) != null ? _b : null
11456
11586
  };
11457
- (_b = this.broadcast) == null ? void 0 : _b.call(this, "daq.reading", reading);
11587
+ (_c = this.broadcast) == null ? void 0 : _c.call(this, "daq.reading", reading);
11458
11588
  emitDaqSample(reading);
11459
11589
  }
11460
11590
  this.writeBackTelemetry(node);
11461
11591
  const tsMs = Date.parse(env.at);
11462
- const lineRun = (_d = (_c = getDaqHostPorts()) == null ? void 0 : _c.lineRun.activeRun(node.lineId)) != null ? _d : null;
11463
- if (lineRun) (_e = getDaqHostPorts()) == null ? void 0 : _e.lineRun.bumpTaggedSamples(node.lineId);
11592
+ const lineRun = (_e = (_d = getDaqHostPorts()) == null ? void 0 : _d.lineRun.activeRun(node.lineId)) != null ? _e : null;
11593
+ if (lineRun) (_f = getDaqHostPorts()) == null ? void 0 : _f.lineRun.bumpTaggedSamples(node.lineId);
11464
11594
  this.tsdbBuffer.push({
11465
11595
  nodeId: node.id,
11466
11596
  tsMs,
11467
11597
  value: env.value,
11468
11598
  state: node.state,
11469
- lineId: (_f = lineRun == null ? void 0 : lineRun.lineId) != null ? _f : null,
11470
- productId: (_g = lineRun == null ? void 0 : lineRun.productId) != null ? _g : null,
11471
- recipeId: (_h = lineRun == null ? void 0 : lineRun.recipeId) != null ? _h : null,
11472
- runId: (_i = lineRun == null ? void 0 : lineRun.runId) != null ? _i : null
11599
+ lineId: (_g = lineRun == null ? void 0 : lineRun.lineId) != null ? _g : null,
11600
+ productId: (_h = lineRun == null ? void 0 : lineRun.productId) != null ? _h : null,
11601
+ recipeId: (_i = lineRun == null ? void 0 : lineRun.recipeId) != null ? _i : null,
11602
+ runId: (_j = lineRun == null ? void 0 : lineRun.runId) != null ? _j : null
11473
11603
  });
11474
11604
  if (this.tsdbBuffer.length > TSDB_BUFFER_CAP) {
11475
11605
  this.tsdbBuffer.splice(0, this.tsdbBuffer.length - TSDB_BUFFER_CAP);
@@ -11495,7 +11625,7 @@ class DaqController {
11495
11625
  // ---------- 帧管线(v2:向量/图像;打标与告警复用标量链路同源机制)----------
11496
11626
  /** 帧消费:元数据攒批落 daq_frames + 指标阈值告警(边沿)+ WS daq.frame(预览/缩略图引用) */
11497
11627
  ingestFrame(node, env, allowPublish) {
11498
- var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m;
11628
+ var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n;
11499
11629
  const f = env.frame;
11500
11630
  const tpl = findDaqTemplate(node.templateKey);
11501
11631
  const tsMs = Date.parse(env.at);
@@ -11528,12 +11658,13 @@ class DaqController {
11528
11658
  templateRef: node.templateRef,
11529
11659
  kind: f.kind,
11530
11660
  at: env.at,
11531
- preview: f.kind === "vector" ? DaqController.previewOf((_l = f.points) != null ? _l : [], FRAME_PREVIEW_POINTS) : void 0,
11661
+ lineId: (_l = node.lineId) != null ? _l : null,
11662
+ preview: f.kind === "vector" ? DaqController.previewOf((_m = f.points) != null ? _m : [], FRAME_PREVIEW_POINTS) : void 0,
11532
11663
  metrics,
11533
11664
  thumbUrl: f.kind === "image" && f.objectKey ? `/api/workshop/daq/${node.id}/frames/content?ts=${tsMs}&thumb=1` : void 0,
11534
11665
  state: node.state
11535
11666
  };
11536
- (_m = this.broadcast) == null ? void 0 : _m.call(this, "daq.frame", payload);
11667
+ (_n = this.broadcast) == null ? void 0 : _n.call(this, "daq.frame", payload);
11537
11668
  emitDaqFrame(payload);
11538
11669
  }
11539
11670
  /** 模板 metrics 规则评估:alarm 硬限沿 → handleAlarm/handleAlarmRecover;warn 只置节点态 */
@@ -11747,15 +11878,24 @@ class DaqController {
11747
11878
  }
11748
11879
  } finally {
11749
11880
  this.tsdbWriting = false;
11881
+ if (this.tsdbBuffer.length > 0 || this.frameBuffer.length > 0) this.scheduleTsdbFlush();
11750
11882
  }
11751
11883
  }
11884
+ siblingsOf(bindingId) {
11885
+ const hit = this.siblingsCache.get(bindingId);
11886
+ if (hit && Date.now() - hit.at < 1e3) return hit.list;
11887
+ const list = this.repo.all().filter((n) => n.deviceBindingId === bindingId);
11888
+ if (this.siblingsCache.size > 500) this.siblingsCache.clear();
11889
+ this.siblingsCache.set(bindingId, { at: Date.now(), list });
11890
+ return list;
11891
+ }
11752
11892
  writeBackTelemetry(node) {
11753
11893
  var _a, _b, _c;
11754
11894
  if (!node.deviceBindingId || node.value == null) return;
11755
11895
  const host = getDaqHostPorts();
11756
11896
  if (!host) return;
11757
11897
  const key = (_b = (_a = findDaqTemplate(node.templateKey)) == null ? void 0 : _a.telemetryKey) != null ? _b : node.templateKey;
11758
- const siblings = this.repo.all().filter((n) => n.deviceBindingId === node.deviceBindingId);
11898
+ const siblings = this.siblingsOf(node.deviceBindingId);
11759
11899
  const worst = siblings.some((n) => n.state === "alarm") ? "alarm" : siblings.some((n) => n.state === "warn") ? "warn" : "ok";
11760
11900
  const acc = (_c = this.pendingBackfill.get(node.deviceBindingId)) != null ? _c : {};
11761
11901
  acc[key] = node.value;
@@ -14167,6 +14307,11 @@ function createAlarmEventRepo(db) {
14167
14307
  `SELECT ${ALARM_COLS} FROM alarm_events ORDER BY created_at DESC LIMIT ?`
14168
14308
  );
14169
14309
  return {
14310
+ /** 按 id 取报警关联节点(产线权限判定用);不存在返回 undefined */
14311
+ nodeIdById(id) {
14312
+ const r = db.prepare("SELECT node_id FROM alarm_events WHERE id = ?").get(id);
14313
+ return r == null ? void 0 : r.node_id;
14314
+ },
14170
14315
  /** 报警产生(同 node+metric 未确认报警幂等去重,防止高频越限刷表) */
14171
14316
  raise(a) {
14172
14317
  const open = db.prepare(
@@ -14481,12 +14626,22 @@ CREATE TABLE IF NOT EXISTS user_tokens (
14481
14626
  last_used_at TEXT
14482
14627
  );
14483
14628
  CREATE INDEX IF NOT EXISTS idx_user_tokens_user ON user_tokens(user_id);
14629
+ CREATE TABLE IF NOT EXISTS user_line_grants (
14630
+ user_id TEXT NOT NULL REFERENCES users(id) ON DELETE CASCADE,
14631
+ line_id TEXT NOT NULL,
14632
+ mode TEXT NOT NULL,
14633
+ granted_by TEXT,
14634
+ granted_at TEXT NOT NULL,
14635
+ PRIMARY KEY (user_id, line_id)
14636
+ );
14484
14637
  `;
14485
14638
  let db = null;
14486
14639
  function getDb() {
14487
14640
  if (!db) {
14488
14641
  db = new DatabaseSync(DB_PATH$6);
14489
14642
  backupRegistry.register(DB_PATH$6, db);
14643
+ db.exec("PRAGMA journal_mode = WAL");
14644
+ db.exec("PRAGMA synchronous = NORMAL");
14490
14645
  db.exec("PRAGMA busy_timeout = 5000");
14491
14646
  db.exec(SCHEMA_SQL);
14492
14647
  migrateSchema(db);
@@ -14502,6 +14657,7 @@ function migrateSchema(d) {
14502
14657
  if (!cols.some((c) => c.name === "expires_at")) {
14503
14658
  d.exec("ALTER TABLE user_tokens ADD COLUMN expires_at TEXT");
14504
14659
  }
14660
+ d.exec("UPDATE user_tokens SET token_plain = NULL WHERE token_plain IS NOT NULL");
14505
14661
  d.prepare("UPDATE user_tokens SET expires_at = ? WHERE expires_at IS NULL").run(isoInDays(TOKEN_TTL_DAYS));
14506
14662
  }
14507
14663
  const TOKEN_TTL_DAYS = 30;
@@ -14579,13 +14735,16 @@ function issueToken(userId, label) {
14579
14735
  createdAt: now(),
14580
14736
  lastUsedAt: null,
14581
14737
  preview: maskPreview(raw),
14582
- hasPlain: true
14738
+ hasPlain: false
14583
14739
  };
14584
14740
  const d = getDb();
14585
- d.prepare("INSERT INTO user_tokens (id, user_id, label, token_hash, token_plain, created_at, expires_at) VALUES (?, ?, ?, ?, ?, ?, ?)").run(row.id, userId, label, hash, raw, row.createdAt, isoInDays(TOKEN_TTL_DAYS));
14741
+ d.prepare("INSERT INTO user_tokens (id, user_id, label, token_hash, token_plain, created_at, expires_at) VALUES (?, ?, ?, ?, NULL, ?, ?)").run(row.id, userId, label, hash, row.createdAt, isoInDays(TOKEN_TTL_DAYS));
14586
14742
  return { raw, row };
14587
14743
  }
14744
+ const lastUsedSeen = /* @__PURE__ */ new Map();
14745
+ const LAST_USED_THROTTLE_MS = 6e4;
14588
14746
  function findByToken(token) {
14747
+ var _a;
14589
14748
  const d = getDb();
14590
14749
  const hash = hashToken(token);
14591
14750
  const row = d.prepare(
@@ -14596,7 +14755,11 @@ WHERE t.token_hash = ?`
14596
14755
  if (!row) return null;
14597
14756
  if (row.expiresAt && Date.parse(row.expiresAt) < Date.now()) return null;
14598
14757
  if (row.status && row.status !== "active") return null;
14599
- d.prepare("UPDATE user_tokens SET last_used_at = ? WHERE token_hash = ?").run(now(), hash);
14758
+ const seenAt = (_a = lastUsedSeen.get(row.tokenId)) != null ? _a : 0;
14759
+ if (Date.now() - seenAt >= LAST_USED_THROTTLE_MS) {
14760
+ lastUsedSeen.set(row.tokenId, Date.now());
14761
+ d.prepare("UPDATE user_tokens SET last_used_at = ? WHERE token_hash = ?").run(now(), hash);
14762
+ }
14600
14763
  return row;
14601
14764
  }
14602
14765
  function toUser(row) {
@@ -14624,6 +14787,17 @@ const userRepository = {
14624
14787
  ).all(...params, pageSize, (page - 1) * pageSize);
14625
14788
  return { items: rows.map(toUser), total, page, pageSize };
14626
14789
  },
14790
+ /** 全量用户(不分页;管理面授权矩阵用,避免分页截断) */
14791
+ listAll() {
14792
+ const d = getDb();
14793
+ const rows = d.prepare("SELECT id, name, email, role, status, created_at AS createdAt FROM users ORDER BY created_at DESC").all();
14794
+ return rows.map(toUser);
14795
+ },
14796
+ /** 全部产线授权(单查询;管理面按 userId 分组,替代逐用户 N+1) */
14797
+ allGrants() {
14798
+ const d = getDb();
14799
+ return d.prepare("SELECT user_id AS userId, line_id AS lineId, mode, granted_by AS grantedBy, granted_at AS grantedAt FROM user_line_grants").all();
14800
+ },
14627
14801
  findById(id) {
14628
14802
  const d = getDb();
14629
14803
  const row = d.prepare("SELECT id, name, email, role, status, created_at AS createdAt FROM users WHERE id = ?").get(id);
@@ -14645,6 +14819,28 @@ const userRepository = {
14645
14819
  const { n } = d.prepare("SELECT COUNT(*) AS n FROM users WHERE role = 'admin' AND status = 'active'").get();
14646
14820
  return n > 0;
14647
14821
  },
14822
+ // ===== 产线授权(user_line_grants;admin/editor 不查此表,全量全权)=====
14823
+ /** 某用户全部产线授权 */
14824
+ listGrants(userId) {
14825
+ const d = getDb();
14826
+ return d.prepare("SELECT line_id AS lineId, mode, granted_by AS grantedBy, granted_at AS grantedAt FROM user_line_grants WHERE user_id = ?").all(userId);
14827
+ },
14828
+ /** 单条授权(mode 非 readonly/operate → 撤销);返回是否发生变化 */
14829
+ setGrant(userId, lineId, mode, grantedBy) {
14830
+ const d = getDb();
14831
+ if (mode !== "readonly" && mode !== "operate") {
14832
+ return d.prepare("DELETE FROM user_line_grants WHERE user_id = ? AND line_id = ?").run(userId, lineId).changes > 0;
14833
+ }
14834
+ d.prepare(`INSERT INTO user_line_grants (user_id, line_id, mode, granted_by, granted_at) VALUES (?, ?, ?, ?, ?)
14835
+ ON CONFLICT(user_id, line_id) DO UPDATE SET mode = excluded.mode, granted_by = excluded.granted_by, granted_at = excluded.granted_at`).run(userId, lineId, mode, grantedBy, now());
14836
+ return true;
14837
+ },
14838
+ /** 用户 → 产线访问映射(lineId → 'readonly'|'operate');无记录 = 无权 */
14839
+ lineAccessMap(userId) {
14840
+ const d = getDb();
14841
+ const rows = d.prepare("SELECT line_id AS lineId, mode FROM user_line_grants WHERE user_id = ?").all(userId);
14842
+ return new Map(rows.map((r) => [r.lineId, r.mode]));
14843
+ },
14648
14844
  /** 内部:取密码哈希(仅认证路径使用,不参与领域对象外泄) */
14649
14845
  getPasswordHash(email) {
14650
14846
  const d = getDb();
@@ -14664,6 +14860,23 @@ const userRepository = {
14664
14860
  d.prepare("INSERT INTO users (id, name, email, password_hash, role, status, created_at) VALUES (?, ?, ?, ?, ?, ?, ?)").run(user.id, user.name, user.email, hashPassword(input.password), user.role, user.status, user.createdAt);
14665
14861
  return user;
14666
14862
  },
14863
+ /** 原子注册(IMMEDIATE 事务内判定管理员空缺):并发注册不会产生第二个 bootstrap admin */
14864
+ createWithRoleBootstrap(input) {
14865
+ const d = getDb();
14866
+ d.exec("BEGIN IMMEDIATE");
14867
+ try {
14868
+ const bootstrap = !this.hasActiveAdmin();
14869
+ const user = this.create({ ...input, role: bootstrap ? "admin" : input.role });
14870
+ d.exec("COMMIT");
14871
+ return { user, bootstrap };
14872
+ } catch (err) {
14873
+ try {
14874
+ d.exec("ROLLBACK");
14875
+ } catch {
14876
+ }
14877
+ throw err;
14878
+ }
14879
+ },
14667
14880
  update(id, input) {
14668
14881
  const d = getDb();
14669
14882
  const current = this.findById(id);
@@ -14825,7 +15038,8 @@ const userService = {
14825
15038
  },
14826
15039
  // ===== 认证(公开端点)=====
14827
15040
  /** 注册:创建账号 + 签发首个 token(邮箱/用户名占用 → 409)。
14828
- * 首启初始化:系统尚无活跃管理员时,首个注册账号授予 admin(空库自注册建站) */
15041
+ * 首启初始化:原子事务内判定「尚无活跃管理员」→ 首个注册账号授予 admin
15042
+ * (并发注册不会产生第二个 bootstrap admin) */
14829
15043
  register(input) {
14830
15044
  if (userRepository.findByEmail(input.email)) {
14831
15045
  throw new AppError(409, ErrorCodes.CONFLICT, "\u90AE\u7BB1\u5DF2\u88AB\u6CE8\u518C");
@@ -14833,11 +15047,14 @@ const userService = {
14833
15047
  if (userRepository.findByName(input.name)) {
14834
15048
  throw new AppError(409, "USER_EXISTS", `\u7528\u6237\u540D\u5DF2\u5B58\u5728: ${input.name}`);
14835
15049
  }
14836
- const needsBootstrap = !userRepository.hasActiveAdmin();
15050
+ const { user, bootstrap: needsBootstrap } = userRepository.createWithRoleBootstrap({
15051
+ ...input,
15052
+ role: "user",
15053
+ status: "active"
15054
+ });
14837
15055
  if (needsBootstrap) {
14838
15056
  console.log(`[users] \u521D\u59CB\u5316:\u5C1A\u65E0\u7BA1\u7406\u5458\u8D26\u53F7,\u9996\u4E2A\u6CE8\u518C\u8D26\u53F7\u6388\u4E88\u7BA1\u7406\u5458\u89D2\u8272(${input.email})`);
14839
15057
  }
14840
- const user = userRepository.create({ ...input, role: needsBootstrap ? "admin" : "user", status: "active" });
14841
15058
  const { raw } = userRepository.createToken(user.id, needsBootstrap ? "bootstrap-admin" : "default");
14842
15059
  return { user: this.publicProfile(user), token: raw };
14843
15060
  },
@@ -15033,20 +15250,76 @@ class Mailbox {
15033
15250
  }
15034
15251
  }
15035
15252
 
15036
- var _a$1, _b, _c;
15037
- const log$g = createLogger("workshop.ws");
15038
- const AEP_VERSION = 1;
15039
- const RING_CAP = 5e3;
15040
- const RING_BYTES_CAP = 4 * 1024 * 1024;
15041
- const DB_BUFFER_CAP = 2e3;
15042
- const EVENTS_RETENTION_DAYS = () => retentionSettings().events_days;
15043
- const PEER_SEND_BUDGET_BYTES = 32 * 1024 * 1024;
15044
- const hubGlobal$1 = globalThis;
15045
- const hub$1 = (_a$1 = hubGlobal$1.__workshopWsHub) != null ? _a$1 : hubGlobal$1.__workshopWsHub = { streams: /* @__PURE__ */ new Map(), peerChannels: /* @__PURE__ */ new Map(), boundManager: null };
15046
- const streams = hub$1.streams;
15047
- const peerChannels = hub$1.peerChannels;
15048
- function ensureHubBound(manager) {
15049
- if (hub$1.boundManager === manager) return;
15253
+ function isPrivilegedRole(user) {
15254
+ return (user == null ? void 0 : user.role) === "admin" || (user == null ? void 0 : user.role) === "editor";
15255
+ }
15256
+ function lineMode(user, lineId) {
15257
+ if (!lineId) return isPrivilegedRole(user) ? "operate" : "none";
15258
+ if (isPrivilegedRole(user)) return "operate";
15259
+ const grant = userRepository.lineAccessMap(user.id).get(lineId);
15260
+ return grant === "operate" ? "operate" : grant === "readonly" ? "readonly" : "none";
15261
+ }
15262
+ function visibleLineIds(user) {
15263
+ if (isPrivilegedRole(user)) return null;
15264
+ return new Set(userRepository.lineAccessMap(user.id).keys());
15265
+ }
15266
+ function filterByLine(user, items, lineIdOf) {
15267
+ const visible = visibleLineIds(user);
15268
+ if (!visible) return items;
15269
+ return items.filter((it) => {
15270
+ const lid = lineIdOf(it);
15271
+ return lid != null && visible.has(lid);
15272
+ });
15273
+ }
15274
+ function requireLineMode(user, lineId, need) {
15275
+ const mode = lineMode(user, lineId);
15276
+ if (mode === "operate" || need === "readonly" && mode === "readonly") return mode;
15277
+ if (mode === "readonly") {
15278
+ throw new AppError(403, "LINE_READONLY", "\u8BE5\u4EA7\u7EBF\u4E3A\u4EC5\u67E5\u770B\u6743\u9650:\u53EA\u8BFB\u6570\u91C7\u53EF\u89C1,\u5199\u63A7/\u64CD\u4F5C\u9700\u7BA1\u7406\u5458\u6388\u4E88\u300C\u53EF\u64CD\u63A7\u300D");
15279
+ }
15280
+ throw new AppError(403, "LINE_FORBIDDEN", `\u65E0\u8BE5\u4EA7\u7EBF\u6743\u9650:\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458\u5728\u300C\u6743\u9650\u7BA1\u7406\u300D\u4E2D\u6388\u4E88(\u4EA7\u7EBF ${lineId != null ? lineId : "?"})`);
15281
+ }
15282
+ function notifyGrantsChanged(userId) {
15283
+ try {
15284
+ void Promise.resolve().then(function () { return sceneEvents; }).then((m) => {
15285
+ m.broadcastSceneEvent("permissions.changed", { userId, at: (/* @__PURE__ */ new Date()).toISOString() });
15286
+ }).catch(() => {
15287
+ });
15288
+ } catch {
15289
+ }
15290
+ try {
15291
+ void Promise.resolve().then(function () { return host; }).then((m) => {
15292
+ void m.emitPluginEvent("permissions:changed", { userId });
15293
+ }).catch(() => {
15294
+ });
15295
+ } catch {
15296
+ }
15297
+ }
15298
+
15299
+ const permissions = /*#__PURE__*/Object.freeze(/*#__PURE__*/Object.defineProperty({
15300
+ __proto__: null,
15301
+ filterByLine: filterByLine,
15302
+ isPrivilegedRole: isPrivilegedRole,
15303
+ lineMode: lineMode,
15304
+ notifyGrantsChanged: notifyGrantsChanged,
15305
+ requireLineMode: requireLineMode,
15306
+ visibleLineIds: visibleLineIds
15307
+ }, Symbol.toStringTag, { value: 'Module' }));
15308
+
15309
+ var _a$1, _b, _c;
15310
+ const log$g = createLogger("workshop.ws");
15311
+ const AEP_VERSION = 1;
15312
+ const RING_CAP = 5e3;
15313
+ const RING_BYTES_CAP = 4 * 1024 * 1024;
15314
+ const DB_BUFFER_CAP = 2e3;
15315
+ const EVENTS_RETENTION_DAYS = () => retentionSettings().events_days;
15316
+ const PEER_SEND_BUDGET_BYTES = 32 * 1024 * 1024;
15317
+ const hubGlobal$1 = globalThis;
15318
+ const hub$1 = (_a$1 = hubGlobal$1.__workshopWsHub) != null ? _a$1 : hubGlobal$1.__workshopWsHub = { streams: /* @__PURE__ */ new Map(), peerChannels: /* @__PURE__ */ new Map(), boundManager: null };
15319
+ const streams = hub$1.streams;
15320
+ const peerChannels = hub$1.peerChannels;
15321
+ function ensureHubBound(manager) {
15322
+ if (hub$1.boundManager === manager) return;
15050
15323
  hub$1.boundManager = manager;
15051
15324
  for (const stream of [...streams.values()]) {
15052
15325
  const channelId = stream.channelId;
@@ -15097,6 +15370,10 @@ function resolveChannelIdFromUrl(peer) {
15097
15370
  var _a2;
15098
15371
  return (_a2 = resolveQueryParam(peer, "channelId")) != null ? _a2 : resolveQueryParam(peer, "channel_id");
15099
15372
  }
15373
+ function attachScenePeer(peer, user) {
15374
+ setPeerVisibleLines(peer, visibleLineIds(user));
15375
+ registerScenePeer(peer);
15376
+ }
15100
15377
  function sendControl(peer, obj) {
15101
15378
  try {
15102
15379
  peer.send(JSON.stringify(obj));
@@ -15453,7 +15730,7 @@ function subscribePeer(manager, peer, channelId, lastSeq, userToken) {
15453
15730
  return;
15454
15731
  }
15455
15732
  stream.peers.add(peer);
15456
- registerScenePeer(peer);
15733
+ attachScenePeer(peer, user);
15457
15734
  let channels = peerChannels.get(peer);
15458
15735
  if (!channels) {
15459
15736
  channels = /* @__PURE__ */ new Set();
@@ -15512,7 +15789,11 @@ const ws = defineWebSocketHandler({
15512
15789
  return;
15513
15790
  }
15514
15791
  ensureHubBound(manager);
15515
- registerScenePeer(peer);
15792
+ const qpUser = (() => {
15793
+ const t = resolveQueryParam(peer, "token");
15794
+ return t ? resolveUserByToken(t) : null;
15795
+ })();
15796
+ if (qpUser) attachScenePeer(peer, qpUser);
15516
15797
  const channelId = resolveChannelIdFromUrl(peer);
15517
15798
  if (!channelId) return;
15518
15799
  subscribePeer(manager, peer, channelId, void 0, resolveQueryParam(peer, "token"));
@@ -19768,7 +20049,7 @@ class DcwController {
19768
20049
  * → ACK 记账(节点状态/写历史)→ WS 直推。真实/模拟驱动同一路径。
19769
20050
  */
19770
20051
  async executeWrite(node, eng, tolerance, recipeRunId) {
19771
- var _a, _b, _c, _d, _e, _f, _g, _h;
20052
+ var _a, _b, _c, _d, _e, _f, _g, _h, _i;
19772
20053
  const at = (/* @__PURE__ */ new Date()).toISOString();
19773
20054
  const t = node.transform;
19774
20055
  const plcValue = inverseTransform(eng, t);
@@ -19804,10 +20085,11 @@ class DcwController {
19804
20085
  at
19805
20086
  };
19806
20087
  repo.appendHistory(entry);
19807
- (_h = this.broadcast) == null ? void 0 : _h.call(this, "dcw.written", {
20088
+ (_i = this.broadcast) == null ? void 0 : _i.call(this, "dcw.written", {
19808
20089
  nodeId: node.id,
19809
20090
  templateRef: node.templateRef,
19810
- value: (_g = node.value) != null ? _g : eng,
20091
+ lineId: (_g = node.lineId) != null ? _g : null,
20092
+ value: (_h = node.value) != null ? _h : eng,
19811
20093
  raw: outcome.raw,
19812
20094
  ok: outcome.ok,
19813
20095
  message: outcome.message,
@@ -19828,7 +20110,7 @@ class DcwController {
19828
20110
  * 不支持读的驱动(mock 外的 mqtt/http)不产生节点状态噪音,直接返回说明。
19829
20111
  */
19830
20112
  async executeRead(node) {
19831
- var _a;
20113
+ var _a, _b;
19832
20114
  const at = (/* @__PURE__ */ new Date()).toISOString();
19833
20115
  const driver = resolveDcwDriver(node.driver);
19834
20116
  if (!driver.read) {
@@ -19843,9 +20125,10 @@ class DcwController {
19843
20125
  const value = r.ok && r.eng != null ? applyTransform(r.eng, node.transform) : null;
19844
20126
  node.applyReadResult(value, r.raw, r.ok, r.message, at);
19845
20127
  this.repo.flushDebounced();
19846
- (_a = this.broadcast) == null ? void 0 : _a.call(this, "dcw.read", {
20128
+ (_b = this.broadcast) == null ? void 0 : _b.call(this, "dcw.read", {
19847
20129
  nodeId: node.id,
19848
20130
  templateRef: node.templateRef,
20131
+ lineId: (_a = node.lineId) != null ? _a : null,
19849
20132
  value,
19850
20133
  raw: r.raw,
19851
20134
  ok: r.ok,
@@ -20419,9 +20702,16 @@ class DcwController {
20419
20702
  await tsdbReady;
20420
20703
  const bucketMs = endMs - startMs > 6e4 ? Math.max(1e3, Math.round((endMs - startMs) / 200)) : void 0;
20421
20704
  const daq = [];
20422
- for (const node of getDaqNodeRepo().all()) {
20705
+ const results = await Promise.all(getDaqNodeRepo().all().map(async (node) => {
20423
20706
  try {
20424
20707
  const points = await getTsdb().query(node.id, { fromMs: startMs, toMs: endMs, bucketMs, limit: 500 });
20708
+ return { node, points };
20709
+ } catch {
20710
+ return { node, points: [] };
20711
+ }
20712
+ }));
20713
+ for (const { node, points } of results) {
20714
+ {
20425
20715
  if (points.length === 0) continue;
20426
20716
  const values = points.map((p) => {
20427
20717
  var _a2, _b;
@@ -20441,7 +20731,6 @@ class DcwController {
20441
20731
  max: Number(Math.max(...values).toFixed(node.decimals)),
20442
20732
  cnt: values.length
20443
20733
  });
20444
- } catch {
20445
20734
  }
20446
20735
  }
20447
20736
  return { run, daq, writes };
@@ -30041,13 +30330,6 @@ workshopPlugin
30041
30330
  ];
30042
30331
 
30043
30332
  const assets = {
30044
- "/_nuxt/-6OnbLFb.js": {
30045
- "type": "text/javascript; charset=utf-8",
30046
- "etag": "\"1343-vdAf4w0aJYo+a7mW3u5aS6nVAXY\"",
30047
- "mtime": "2026-09-05T18:48:20.525Z",
30048
- "size": 4931,
30049
- "path": "../public/_nuxt/-6OnbLFb.js"
30050
- },
30051
30333
  "/favicon.svg": {
30052
30334
  "type": "image/svg+xml",
30053
30335
  "etag": "\"333-aFlSVm0gS1OwJAKmnnSly7X0FJ0\"",
@@ -30055,1258 +30337,1286 @@ const assets = {
30055
30337
  "size": 819,
30056
30338
  "path": "../public/favicon.svg"
30057
30339
  },
30058
- "/_nuxt/-nb2uqVg.js": {
30340
+ "/_nuxt/-6OnbLFb.js": {
30059
30341
  "type": "text/javascript; charset=utf-8",
30060
- "etag": "\"1d2b-jLwuC0KKuwuubw09IH7Tm1lfqoE\"",
30061
- "mtime": "2026-09-05T18:48:20.526Z",
30062
- "size": 7467,
30063
- "path": "../public/_nuxt/-nb2uqVg.js"
30342
+ "etag": "\"1343-vdAf4w0aJYo+a7mW3u5aS6nVAXY\"",
30343
+ "mtime": "2026-09-06T08:07:40.895Z",
30344
+ "size": 4931,
30345
+ "path": "../public/_nuxt/-6OnbLFb.js"
30346
+ },
30347
+ "/_nuxt/6vYobj4F.js": {
30348
+ "type": "text/javascript; charset=utf-8",
30349
+ "etag": "\"626-XI9KdnbsNv0FxC1h6cVurcJhbQI\"",
30350
+ "mtime": "2026-09-06T08:07:40.895Z",
30351
+ "size": 1574,
30352
+ "path": "../public/_nuxt/6vYobj4F.js"
30064
30353
  },
30065
30354
  "/_nuxt/36oeS8_R2.js": {
30066
30355
  "type": "text/javascript; charset=utf-8",
30067
30356
  "etag": "\"d6-9W7EHt23WjRGOYCN8bz9Yy0aMhg\"",
30068
- "mtime": "2026-09-05T18:48:20.526Z",
30357
+ "mtime": "2026-09-06T08:07:40.895Z",
30069
30358
  "size": 214,
30070
30359
  "path": "../public/_nuxt/36oeS8_R2.js"
30071
30360
  },
30072
- "/_nuxt/B0HpdCKS.js": {
30073
- "type": "text/javascript; charset=utf-8",
30074
- "etag": "\"2165-1sZ0UM2rwvV+tY1H08bvvzhl3vc\"",
30075
- "mtime": "2026-09-05T18:48:20.527Z",
30076
- "size": 8549,
30077
- "path": "../public/_nuxt/B0HpdCKS.js"
30078
- },
30079
- "/_nuxt/91DZTUMJ.js": {
30361
+ "/_nuxt/-nb2uqVg.js": {
30080
30362
  "type": "text/javascript; charset=utf-8",
30081
- "etag": "\"2374-n04hK8DQiQi9Hi/mO9GHT1PkGHk\"",
30082
- "mtime": "2026-09-05T18:48:20.526Z",
30083
- "size": 9076,
30084
- "path": "../public/_nuxt/91DZTUMJ.js"
30363
+ "etag": "\"1d2b-jLwuC0KKuwuubw09IH7Tm1lfqoE\"",
30364
+ "mtime": "2026-09-06T08:07:40.895Z",
30365
+ "size": 7467,
30366
+ "path": "../public/_nuxt/-nb2uqVg.js"
30085
30367
  },
30086
- "/_nuxt/6PZPfFcO.js": {
30368
+ "/_nuxt/B-xskWta.js": {
30087
30369
  "type": "text/javascript; charset=utf-8",
30088
- "etag": "\"469c-Fu/GyOZbOvzzzrId7NUg9WJshE8\"",
30089
- "mtime": "2026-09-05T18:48:20.526Z",
30090
- "size": 18076,
30091
- "path": "../public/_nuxt/6PZPfFcO.js"
30370
+ "etag": "\"4842-u3DYd8BlLUn7q26s3PJm3Fvo+j4\"",
30371
+ "mtime": "2026-09-06T08:07:40.896Z",
30372
+ "size": 18498,
30373
+ "path": "../public/_nuxt/B-xskWta.js"
30092
30374
  },
30093
30375
  "/_nuxt/agents.CEbox5-D.css": {
30094
30376
  "type": "text/css; charset=utf-8",
30095
30377
  "etag": "\"43e-sjh3eXQzQvuPq+iaiDAqlB5A/o8\"",
30096
- "mtime": "2026-09-05T18:48:20.546Z",
30378
+ "mtime": "2026-09-06T08:07:40.926Z",
30097
30379
  "size": 1086,
30098
30380
  "path": "../public/_nuxt/agents.CEbox5-D.css"
30099
30381
  },
30100
- "/_nuxt/B5S_UyaC.js": {
30382
+ "/_nuxt/arUY5dyq2.js": {
30101
30383
  "type": "text/javascript; charset=utf-8",
30102
- "etag": "\"2435-cVXb4Ze0vEZbXwWSHOgo7NJ59ME\"",
30103
- "mtime": "2026-09-05T18:48:20.528Z",
30104
- "size": 9269,
30105
- "path": "../public/_nuxt/B5S_UyaC.js"
30384
+ "etag": "\"59f6-d7NzfWgWT2fTR2MXV0/3pKn7pms\"",
30385
+ "mtime": "2026-09-06T08:07:40.922Z",
30386
+ "size": 23030,
30387
+ "path": "../public/_nuxt/arUY5dyq2.js"
30106
30388
  },
30107
- "/_nuxt/B9dLFSYI.js": {
30389
+ "/_nuxt/B3Psw_sL.js": {
30108
30390
  "type": "text/javascript; charset=utf-8",
30109
- "etag": "\"24d7-b5vV8KRjZ+pkTmbebWEy1jMfTLc\"",
30110
- "mtime": "2026-09-05T18:48:20.528Z",
30111
- "size": 9431,
30112
- "path": "../public/_nuxt/B9dLFSYI.js"
30391
+ "etag": "\"35bb-+DrI8MnN/s50k/0E1BAPSxI6dg8\"",
30392
+ "mtime": "2026-09-06T08:07:40.905Z",
30393
+ "size": 13755,
30394
+ "path": "../public/_nuxt/B3Psw_sL.js"
30113
30395
  },
30114
- "/_nuxt/B1g8pJmr.js": {
30396
+ "/_nuxt/B53Mp7lD.js": {
30115
30397
  "type": "text/javascript; charset=utf-8",
30116
- "etag": "\"1c85b-3oUo7M56HumWq82hEf0zhD0hw5g\"",
30117
- "mtime": "2026-09-05T18:48:20.527Z",
30118
- "size": 116827,
30119
- "path": "../public/_nuxt/B1g8pJmr.js"
30398
+ "etag": "\"4256-Pirq2khpmJQqhRxinPVbluoGfGI\"",
30399
+ "mtime": "2026-09-06T08:07:40.906Z",
30400
+ "size": 16982,
30401
+ "path": "../public/_nuxt/B53Mp7lD.js"
30120
30402
  },
30121
- "/_nuxt/BBrRELH32.js": {
30403
+ "/_nuxt/B5S_UyaC.js": {
30122
30404
  "type": "text/javascript; charset=utf-8",
30123
- "etag": "\"5bc-jGs6+2LpPidhbmCHZyKfmEWQxCI\"",
30124
- "mtime": "2026-09-05T18:48:20.529Z",
30125
- "size": 1468,
30126
- "path": "../public/_nuxt/BBrRELH32.js"
30405
+ "etag": "\"2435-cVXb4Ze0vEZbXwWSHOgo7NJ59ME\"",
30406
+ "mtime": "2026-09-06T08:07:40.906Z",
30407
+ "size": 9269,
30408
+ "path": "../public/_nuxt/B5S_UyaC.js"
30127
30409
  },
30128
30410
  "/_nuxt/B7wL3pDk.js": {
30129
30411
  "type": "text/javascript; charset=utf-8",
30130
30412
  "etag": "\"3d5-itnLaBVfNThToG43nVPq3jMDhq0\"",
30131
- "mtime": "2026-09-05T18:48:20.528Z",
30413
+ "mtime": "2026-09-06T08:07:40.906Z",
30132
30414
  "size": 981,
30133
30415
  "path": "../public/_nuxt/B7wL3pDk.js"
30134
30416
  },
30135
- "/_nuxt/BaMkWl5i2.js": {
30417
+ "/_nuxt/bAFueD6a.js": {
30136
30418
  "type": "text/javascript; charset=utf-8",
30137
- "etag": "\"aa5-hAIxwyr8gdRLFxtHUgEGPFI2JPg\"",
30138
- "mtime": "2026-09-05T18:48:20.531Z",
30139
- "size": 2725,
30140
- "path": "../public/_nuxt/BaMkWl5i2.js"
30419
+ "etag": "\"193d-ZYfa844YaFXfx11WB4DcqB3k/yo\"",
30420
+ "mtime": "2026-09-06T08:07:40.923Z",
30421
+ "size": 6461,
30422
+ "path": "../public/_nuxt/bAFueD6a.js"
30141
30423
  },
30142
- "/_nuxt/B9MUiDFl.js": {
30424
+ "/_nuxt/BBwMH_hG.js": {
30143
30425
  "type": "text/javascript; charset=utf-8",
30144
- "etag": "\"987e-8CAjRpOHY02KlfHZyydFT5G41PU\"",
30145
- "mtime": "2026-09-05T18:48:20.528Z",
30146
- "size": 39038,
30147
- "path": "../public/_nuxt/B9MUiDFl.js"
30426
+ "etag": "\"587d-zV1IOugR08gc0LlOGMSClQfdApQ\"",
30427
+ "mtime": "2026-09-06T08:07:40.906Z",
30428
+ "size": 22653,
30429
+ "path": "../public/_nuxt/BBwMH_hG.js"
30148
30430
  },
30149
- "/_nuxt/BC8s1Guv.js": {
30431
+ "/_nuxt/BBrRELH32.js": {
30150
30432
  "type": "text/javascript; charset=utf-8",
30151
- "etag": "\"359b-dbES6Y29M72Cqy3UohNxiO1hHqY\"",
30152
- "mtime": "2026-09-05T18:48:20.529Z",
30153
- "size": 13723,
30154
- "path": "../public/_nuxt/BC8s1Guv.js"
30433
+ "etag": "\"5bc-jGs6+2LpPidhbmCHZyKfmEWQxCI\"",
30434
+ "mtime": "2026-09-06T08:07:40.906Z",
30435
+ "size": 1468,
30436
+ "path": "../public/_nuxt/BBrRELH32.js"
30155
30437
  },
30156
- "/_nuxt/B1kA8LhC.js": {
30438
+ "/_nuxt/BcrN7QEl2.js": {
30157
30439
  "type": "text/javascript; charset=utf-8",
30158
- "etag": "\"3c3b2-oTLd8oZ3cJ4zqrKXMOLAlV3Kl1A\"",
30159
- "mtime": "2026-09-05T18:48:20.525Z",
30160
- "size": 246706,
30161
- "path": "../public/_nuxt/B1kA8LhC.js"
30440
+ "etag": "\"b14-CLdyddO7m6guAKfIeyReGHA6Jwg\"",
30441
+ "mtime": "2026-09-06T08:07:40.910Z",
30442
+ "size": 2836,
30443
+ "path": "../public/_nuxt/BcrN7QEl2.js"
30162
30444
  },
30163
- "/_nuxt/BDASpD_i.js": {
30445
+ "/_nuxt/Bc3PiGGr.js": {
30164
30446
  "type": "text/javascript; charset=utf-8",
30165
- "etag": "\"5861-95tIX4k9GMLdnBt33puQ3bvV3FQ\"",
30166
- "mtime": "2026-09-05T18:48:20.529Z",
30167
- "size": 22625,
30168
- "path": "../public/_nuxt/BDASpD_i.js"
30447
+ "etag": "\"b0a6-an7ekHZpfAEw9EM+R3gB2d6eZHg\"",
30448
+ "mtime": "2026-09-06T08:07:40.909Z",
30449
+ "size": 45222,
30450
+ "path": "../public/_nuxt/Bc3PiGGr.js"
30169
30451
  },
30170
- "/_nuxt/BDUjyaF4.js": {
30452
+ "/_nuxt/BbZAzXjZ2.js": {
30171
30453
  "type": "text/javascript; charset=utf-8",
30172
- "etag": "\"12149-hpS4uBcTVyjMF/ahBrfPvWSV6dM\"",
30173
- "mtime": "2026-09-05T18:48:20.529Z",
30174
- "size": 74057,
30175
- "path": "../public/_nuxt/BDUjyaF4.js"
30454
+ "etag": "\"14fe-0KLPumZNGMQ1C2rj5UA7kI1IBvY\"",
30455
+ "mtime": "2026-09-06T08:07:40.909Z",
30456
+ "size": 5374,
30457
+ "path": "../public/_nuxt/BbZAzXjZ2.js"
30176
30458
  },
30177
- "/_nuxt/BCJFMBQ6.js": {
30459
+ "/_nuxt/BfGc7TJp.js": {
30178
30460
  "type": "text/javascript; charset=utf-8",
30179
- "etag": "\"4842-IVkNLBLz/YP6SzRlilOTMLcIKzA\"",
30180
- "mtime": "2026-09-05T18:48:20.529Z",
30181
- "size": 18498,
30182
- "path": "../public/_nuxt/BCJFMBQ6.js"
30461
+ "etag": "\"f5-ynAHqm+XhchZ1co7YynIGiIextg\"",
30462
+ "mtime": "2026-09-06T08:07:40.910Z",
30463
+ "size": 245,
30464
+ "path": "../public/_nuxt/BfGc7TJp.js"
30465
+ },
30466
+ "/_nuxt/BgOhoDTI.js": {
30467
+ "type": "text/javascript; charset=utf-8",
30468
+ "etag": "\"2543-qvpXnC+y5grUwUw+mC7meP0i3EA\"",
30469
+ "mtime": "2026-09-06T08:07:40.910Z",
30470
+ "size": 9539,
30471
+ "path": "../public/_nuxt/BgOhoDTI.js"
30183
30472
  },
30184
30473
  "/_nuxt/BeIfu4N3.js": {
30185
30474
  "type": "text/javascript; charset=utf-8",
30186
30475
  "etag": "\"bc89-neyoILuYLlrhO8n1ehz7UmvocMs\"",
30187
- "mtime": "2026-09-05T18:48:20.531Z",
30476
+ "mtime": "2026-09-06T08:07:40.910Z",
30188
30477
  "size": 48265,
30189
30478
  "path": "../public/_nuxt/BeIfu4N3.js"
30190
30479
  },
30191
- "/_nuxt/BfGc7TJp.js": {
30480
+ "/_nuxt/BDUjyaF4.js": {
30192
30481
  "type": "text/javascript; charset=utf-8",
30193
- "etag": "\"f5-ynAHqm+XhchZ1co7YynIGiIextg\"",
30194
- "mtime": "2026-09-05T18:48:20.531Z",
30195
- "size": 245,
30196
- "path": "../public/_nuxt/BfGc7TJp.js"
30482
+ "etag": "\"12149-hpS4uBcTVyjMF/ahBrfPvWSV6dM\"",
30483
+ "mtime": "2026-09-06T08:07:40.907Z",
30484
+ "size": 74057,
30485
+ "path": "../public/_nuxt/BDUjyaF4.js"
30197
30486
  },
30198
- "/_nuxt/BmHvC_OU.js": {
30487
+ "/_nuxt/Bmpvki7M.js": {
30199
30488
  "type": "text/javascript; charset=utf-8",
30200
- "etag": "\"4257-gsEzsEOULks8ILp6jG5RHYKayDg\"",
30201
- "mtime": "2026-09-05T18:48:20.532Z",
30202
- "size": 16983,
30203
- "path": "../public/_nuxt/BmHvC_OU.js"
30489
+ "etag": "\"623-ghkdDMae0RDQxJr6vx8je/qPTRs\"",
30490
+ "mtime": "2026-09-06T08:07:40.910Z",
30491
+ "size": 1571,
30492
+ "path": "../public/_nuxt/Bmpvki7M.js"
30204
30493
  },
30205
30494
  "/_nuxt/BFjGV-RV2.js": {
30206
30495
  "type": "text/javascript; charset=utf-8",
30207
30496
  "etag": "\"a0340-NzvTqyczSJgnuw9pjPQnLX42sAE\"",
30208
- "mtime": "2026-09-05T18:48:20.530Z",
30497
+ "mtime": "2026-09-06T08:07:40.907Z",
30209
30498
  "size": 656192,
30210
30499
  "path": "../public/_nuxt/BFjGV-RV2.js"
30211
30500
  },
30212
30501
  "/_nuxt/BGkumHZ32.js": {
30213
30502
  "type": "text/javascript; charset=utf-8",
30214
30503
  "etag": "\"14a0a8-FkCiOKvl5+p8em/4UNCrmbDN4qY\"",
30215
- "mtime": "2026-09-05T18:48:20.530Z",
30504
+ "mtime": "2026-09-06T08:07:40.908Z",
30216
30505
  "size": 1351848,
30217
30506
  "path": "../public/_nuxt/BGkumHZ32.js"
30218
30507
  },
30508
+ "/_nuxt/BNXfwXpE.js": {
30509
+ "type": "text/javascript; charset=utf-8",
30510
+ "etag": "\"30a-SKr3Bmmq+lyC2EG7XQ/M7P1jWog\"",
30511
+ "mtime": "2026-09-06T08:07:40.908Z",
30512
+ "size": 778,
30513
+ "path": "../public/_nuxt/BNXfwXpE.js"
30514
+ },
30219
30515
  "/_nuxt/BN_PdN3J.js": {
30220
30516
  "type": "text/javascript; charset=utf-8",
30221
30517
  "etag": "\"10b9b-D693oquQMdJ9uX8C5GEOl79xXOE\"",
30222
- "mtime": "2026-09-05T18:48:20.530Z",
30518
+ "mtime": "2026-09-06T08:07:40.908Z",
30223
30519
  "size": 68507,
30224
30520
  "path": "../public/_nuxt/BN_PdN3J.js"
30225
30521
  },
30226
30522
  "/_nuxt/Bp5luxkg2.js": {
30227
30523
  "type": "text/javascript; charset=utf-8",
30228
30524
  "etag": "\"3a06-wE6nRVKQRjsGzClNYT0f+LE6/Lg\"",
30229
- "mtime": "2026-09-05T18:48:20.532Z",
30525
+ "mtime": "2026-09-06T08:07:40.910Z",
30230
30526
  "size": 14854,
30231
30527
  "path": "../public/_nuxt/Bp5luxkg2.js"
30232
30528
  },
30233
30529
  "/_nuxt/BSCpFtzG.js": {
30234
30530
  "type": "text/javascript; charset=utf-8",
30235
30531
  "etag": "\"13398-3vxX1fQrPyVWKnXsEX5bmCpF/Eg\"",
30236
- "mtime": "2026-09-05T18:48:20.530Z",
30532
+ "mtime": "2026-09-06T08:07:40.908Z",
30237
30533
  "size": 78744,
30238
30534
  "path": "../public/_nuxt/BSCpFtzG.js"
30239
30535
  },
30240
- "/_nuxt/BuktKVqK2.js": {
30241
- "type": "text/javascript; charset=utf-8",
30242
- "etag": "\"59e7-pVub+JlxBt/tL6XnwKEEMDod9W8\"",
30243
- "mtime": "2026-09-05T18:48:20.532Z",
30244
- "size": 23015,
30245
- "path": "../public/_nuxt/BuktKVqK2.js"
30246
- },
30247
30536
  "/_nuxt/BSSUlJnx2.js": {
30248
30537
  "type": "text/javascript; charset=utf-8",
30249
30538
  "etag": "\"5f5-t0OMayeEXY7fEaFUOlppJZZQvtM\"",
30250
- "mtime": "2026-09-05T18:48:20.531Z",
30539
+ "mtime": "2026-09-06T08:07:40.909Z",
30251
30540
  "size": 1525,
30252
30541
  "path": "../public/_nuxt/BSSUlJnx2.js"
30253
30542
  },
30254
- "/_nuxt/BUPj10t4.js": {
30255
- "type": "text/javascript; charset=utf-8",
30256
- "etag": "\"626-fp7JumGv3hrekrhXEH2cFy9kSGg\"",
30257
- "mtime": "2026-09-05T18:48:20.531Z",
30258
- "size": 1574,
30259
- "path": "../public/_nuxt/BUPj10t4.js"
30260
- },
30261
- "/_nuxt/BUcmySDa2.js": {
30543
+ "/_nuxt/BxPPAkGA.js": {
30262
30544
  "type": "text/javascript; charset=utf-8",
30263
- "etag": "\"1d27c-MrwgQiovFUP0UVtMJ1LdEF/IrEs\"",
30264
- "mtime": "2026-09-05T18:48:20.531Z",
30265
- "size": 119420,
30266
- "path": "../public/_nuxt/BUcmySDa2.js"
30545
+ "etag": "\"7ebd-9b4xLtZRNbmB3J2esDdIp2+t5sk\"",
30546
+ "mtime": "2026-09-06T08:07:40.911Z",
30547
+ "size": 32445,
30548
+ "path": "../public/_nuxt/BxPPAkGA.js"
30267
30549
  },
30268
30550
  "/_nuxt/BytVi9VX2.js": {
30269
30551
  "type": "text/javascript; charset=utf-8",
30270
30552
  "etag": "\"8b9-SsapD0I/64H+tosN0JmRWjisTd0\"",
30271
- "mtime": "2026-09-05T18:48:20.533Z",
30553
+ "mtime": "2026-09-06T08:07:40.911Z",
30272
30554
  "size": 2233,
30273
30555
  "path": "../public/_nuxt/BytVi9VX2.js"
30274
30556
  },
30275
- "/_nuxt/By8BpbKH.js": {
30276
- "type": "text/javascript; charset=utf-8",
30277
- "etag": "\"22a4-V8S+THPIIgXmc/CMCTKAmu006N4\"",
30278
- "mtime": "2026-09-05T18:48:20.532Z",
30279
- "size": 8868,
30280
- "path": "../public/_nuxt/By8BpbKH.js"
30281
- },
30282
- "/_nuxt/BrIJiJSN.js": {
30283
- "type": "text/javascript; charset=utf-8",
30284
- "etag": "\"50eba-EQGueVrdlEzHO7oTVt2LPxnHgRo\"",
30285
- "mtime": "2026-09-05T18:48:20.532Z",
30286
- "size": 331450,
30287
- "path": "../public/_nuxt/BrIJiJSN.js"
30288
- },
30289
- "/_nuxt/C3tCneTM.js": {
30290
- "type": "text/javascript; charset=utf-8",
30291
- "etag": "\"56ab-/6Cr6erEwmZtrhutqEU3O5P+s0A\"",
30292
- "mtime": "2026-09-05T18:48:20.533Z",
30293
- "size": 22187,
30294
- "path": "../public/_nuxt/C3tCneTM.js"
30295
- },
30296
30557
  "/_nuxt/BZGNTgTQ2.js": {
30297
30558
  "type": "text/javascript; charset=utf-8",
30298
30559
  "etag": "\"53-pfqlZiZJEbPiLoDxP0PLfz2Ucmw\"",
30299
- "mtime": "2026-09-05T18:48:20.531Z",
30560
+ "mtime": "2026-09-06T08:07:40.909Z",
30300
30561
  "size": 83,
30301
30562
  "path": "../public/_nuxt/BZGNTgTQ2.js"
30302
30563
  },
30303
- "/_nuxt/CBciOiTQ.js": {
30564
+ "/_nuxt/BUcmySDa2.js": {
30565
+ "type": "text/javascript; charset=utf-8",
30566
+ "etag": "\"1d27c-MrwgQiovFUP0UVtMJ1LdEF/IrEs\"",
30567
+ "mtime": "2026-09-06T08:07:40.909Z",
30568
+ "size": 119420,
30569
+ "path": "../public/_nuxt/BUcmySDa2.js"
30570
+ },
30571
+ "/_nuxt/BxtpDtzC.js": {
30572
+ "type": "text/javascript; charset=utf-8",
30573
+ "etag": "\"3348-NKn0ndcjz+XrgOw2f4HZ7I2TF34\"",
30574
+ "mtime": "2026-09-06T08:07:40.911Z",
30575
+ "size": 13128,
30576
+ "path": "../public/_nuxt/BxtpDtzC.js"
30577
+ },
30578
+ "/_nuxt/C4OAdbVK2.js": {
30304
30579
  "type": "text/javascript; charset=utf-8",
30305
- "etag": "\"1194-WxYP7OaMYUM5oCfp4XJVfRlTMlM\"",
30306
- "mtime": "2026-09-05T18:48:20.534Z",
30307
- "size": 4500,
30308
- "path": "../public/_nuxt/CBciOiTQ.js"
30580
+ "etag": "\"89e-AQFf/aV6YnDPM3edZWc1ASPluno\"",
30581
+ "mtime": "2026-09-06T08:07:40.912Z",
30582
+ "size": 2206,
30583
+ "path": "../public/_nuxt/C4OAdbVK2.js"
30309
30584
  },
30310
30585
  "/_nuxt/C9f8QMp12.js": {
30311
30586
  "type": "text/javascript; charset=utf-8",
30312
30587
  "etag": "\"1896-VcRRXhZEm21djPt3FTvlq+iUccI\"",
30313
- "mtime": "2026-09-05T18:48:20.534Z",
30588
+ "mtime": "2026-09-06T08:07:40.912Z",
30314
30589
  "size": 6294,
30315
30590
  "path": "../public/_nuxt/C9f8QMp12.js"
30316
30591
  },
30317
- "/_nuxt/CFn4vHwD.js": {
30592
+ "/_nuxt/C3tCneTM.js": {
30318
30593
  "type": "text/javascript; charset=utf-8",
30319
- "etag": "\"b0a6-pEeoiOpa3Elamlu0jIwV5uMF+Zo\"",
30320
- "mtime": "2026-09-05T18:48:20.534Z",
30321
- "size": 45222,
30322
- "path": "../public/_nuxt/CFn4vHwD.js"
30594
+ "etag": "\"56ab-/6Cr6erEwmZtrhutqEU3O5P+s0A\"",
30595
+ "mtime": "2026-09-06T08:07:40.912Z",
30596
+ "size": 22187,
30597
+ "path": "../public/_nuxt/C3tCneTM.js"
30323
30598
  },
30324
- "/_nuxt/CgvGu2IO.js": {
30599
+ "/_nuxt/BrIJiJSN.js": {
30325
30600
  "type": "text/javascript; charset=utf-8",
30326
- "etag": "\"14fd-wNtJagXepRoNqOmBp92jBS71X+c\"",
30327
- "mtime": "2026-09-05T18:48:20.536Z",
30328
- "size": 5373,
30329
- "path": "../public/_nuxt/CgvGu2IO.js"
30601
+ "etag": "\"50eba-EQGueVrdlEzHO7oTVt2LPxnHgRo\"",
30602
+ "mtime": "2026-09-06T08:07:40.911Z",
30603
+ "size": 331450,
30604
+ "path": "../public/_nuxt/BrIJiJSN.js"
30330
30605
  },
30331
- "/_nuxt/C9cU_Ujd.js": {
30606
+ "/_nuxt/C6m-kenn.js": {
30332
30607
  "type": "text/javascript; charset=utf-8",
30333
- "etag": "\"f8fd-ZCJOj8FbmwZ4veRig3XA2wOzfCY\"",
30334
- "mtime": "2026-09-05T18:48:20.533Z",
30335
- "size": 63741,
30336
- "path": "../public/_nuxt/C9cU_Ujd.js"
30608
+ "etag": "\"3914-PeLFbXPWgKtw3N2Fy1E79JcHpLU\"",
30609
+ "mtime": "2026-09-06T08:07:40.912Z",
30610
+ "size": 14612,
30611
+ "path": "../public/_nuxt/C6m-kenn.js"
30337
30612
  },
30338
- "/_nuxt/CfVAr2nf.js": {
30613
+ "/_nuxt/CcwJ2mrD2.js": {
30339
30614
  "type": "text/javascript; charset=utf-8",
30340
- "etag": "\"4e58-dM+JZz9VCHehIO2I74Q45dMOZ8s\"",
30341
- "mtime": "2026-09-05T18:48:20.535Z",
30342
- "size": 20056,
30343
- "path": "../public/_nuxt/CfVAr2nf.js"
30615
+ "etag": "\"5792-PEWC62IL0fC62opbFHZ+I++wvbk\"",
30616
+ "mtime": "2026-09-06T08:07:40.913Z",
30617
+ "size": 22418,
30618
+ "path": "../public/_nuxt/CcwJ2mrD2.js"
30344
30619
  },
30345
30620
  "/_nuxt/channel-templates.De5ZvrGz.css": {
30346
30621
  "type": "text/css; charset=utf-8",
30347
30622
  "etag": "\"846-hiNcWp465PfIwg3Hui8TGCj9S3o\"",
30348
- "mtime": "2026-09-05T18:48:20.546Z",
30623
+ "mtime": "2026-09-06T08:07:40.926Z",
30349
30624
  "size": 2118,
30350
30625
  "path": "../public/_nuxt/channel-templates.De5ZvrGz.css"
30351
30626
  },
30352
- "/_nuxt/CKfhtOt7.js": {
30353
- "type": "text/javascript; charset=utf-8",
30354
- "etag": "\"9141-NLArDp1lZISfBmTeNNW/SqVqPrc\"",
30355
- "mtime": "2026-09-05T18:48:20.534Z",
30356
- "size": 37185,
30357
- "path": "../public/_nuxt/CKfhtOt7.js"
30358
- },
30359
- "/_nuxt/CjDQPXfv.js": {
30360
- "type": "text/javascript; charset=utf-8",
30361
- "etag": "\"607-BXADOxvWyodLA6anDkRXIub8+XA\"",
30362
- "mtime": "2026-09-05T18:48:20.536Z",
30363
- "size": 1543,
30364
- "path": "../public/_nuxt/CjDQPXfv.js"
30365
- },
30366
- "/_nuxt/CmHzfVc5.js": {
30627
+ "/_nuxt/Cj6139IM.js": {
30367
30628
  "type": "text/javascript; charset=utf-8",
30368
- "etag": "\"7ec3-tUpCnS/mT7jwFKjKxxLd9XTbgFU\"",
30369
- "mtime": "2026-09-05T18:48:20.536Z",
30370
- "size": 32451,
30371
- "path": "../public/_nuxt/CmHzfVc5.js"
30629
+ "etag": "\"664-bB/MABMcuh9JMyKWxZJfgs5cTRI\"",
30630
+ "mtime": "2026-09-06T08:07:40.913Z",
30631
+ "size": 1636,
30632
+ "path": "../public/_nuxt/Cj6139IM.js"
30372
30633
  },
30373
- "/_nuxt/Cn3J3NXR.js": {
30634
+ "/_nuxt/CfVAr2nf.js": {
30374
30635
  "type": "text/javascript; charset=utf-8",
30375
- "etag": "\"a6ef-rxc5AWy7cZY4nez30ZVJeXrMlc4\"",
30376
- "mtime": "2026-09-05T18:48:20.536Z",
30377
- "size": 42735,
30378
- "path": "../public/_nuxt/Cn3J3NXR.js"
30636
+ "etag": "\"4e58-dM+JZz9VCHehIO2I74Q45dMOZ8s\"",
30637
+ "mtime": "2026-09-06T08:07:40.913Z",
30638
+ "size": 20056,
30639
+ "path": "../public/_nuxt/CfVAr2nf.js"
30379
30640
  },
30380
- "/_nuxt/Cno6kYiO2.js": {
30641
+ "/_nuxt/Cno6kYiO.js": {
30381
30642
  "type": "text/javascript; charset=utf-8",
30382
30643
  "etag": "\"f2-SIBAvqBfq2ENmoMT2zz03X9uJTg\"",
30383
- "mtime": "2026-09-05T18:48:20.536Z",
30644
+ "mtime": "2026-09-06T08:07:40.913Z",
30384
30645
  "size": 242,
30385
- "path": "../public/_nuxt/Cno6kYiO2.js"
30646
+ "path": "../public/_nuxt/Cno6kYiO.js"
30386
30647
  },
30387
- "/_nuxt/CNs_Ozdc2.js": {
30648
+ "/_nuxt/CNs_Ozdc.js": {
30388
30649
  "type": "text/javascript; charset=utf-8",
30389
30650
  "etag": "\"1b-1MHUJYdBtOvbvPMaiQxDXp3lHyw\"",
30390
- "mtime": "2026-09-05T18:48:20.535Z",
30651
+ "mtime": "2026-09-06T08:07:40.913Z",
30391
30652
  "size": 27,
30392
- "path": "../public/_nuxt/CNs_Ozdc2.js"
30653
+ "path": "../public/_nuxt/CNs_Ozdc.js"
30393
30654
  },
30394
- "/_nuxt/Cst47G4-.js": {
30395
- "type": "text/javascript; charset=utf-8",
30396
- "etag": "\"665-V4F23TKbxq9kj2VOHEzQDbnxcoY\"",
30397
- "mtime": "2026-09-05T18:48:20.536Z",
30398
- "size": 1637,
30399
- "path": "../public/_nuxt/Cst47G4-.js"
30400
- },
30401
- "/_nuxt/CUMdhxg9.js": {
30655
+ "/_nuxt/CKfhtOt7.js": {
30402
30656
  "type": "text/javascript; charset=utf-8",
30403
- "etag": "\"37f4-uc2WpdbaNENYM3WAykEeB5zcLKo\"",
30404
- "mtime": "2026-09-05T18:48:20.535Z",
30405
- "size": 14324,
30406
- "path": "../public/_nuxt/CUMdhxg9.js"
30657
+ "etag": "\"9141-NLArDp1lZISfBmTeNNW/SqVqPrc\"",
30658
+ "mtime": "2026-09-06T08:07:40.913Z",
30659
+ "size": 37185,
30660
+ "path": "../public/_nuxt/CKfhtOt7.js"
30407
30661
  },
30408
- "/_nuxt/Ct68Z0232.js": {
30662
+ "/_nuxt/Cor9siSf.js": {
30409
30663
  "type": "text/javascript; charset=utf-8",
30410
- "etag": "\"1fd9-fy6MDO8Ui/TXblQ1wK/rr5tdL4U\"",
30411
- "mtime": "2026-09-05T18:48:20.537Z",
30412
- "size": 8153,
30413
- "path": "../public/_nuxt/Ct68Z0232.js"
30664
+ "etag": "\"469c-SAQlRrJexDg1WPypDeSp4i/c4PA\"",
30665
+ "mtime": "2026-09-06T08:07:40.914Z",
30666
+ "size": 18076,
30667
+ "path": "../public/_nuxt/Cor9siSf.js"
30414
30668
  },
30415
30669
  "/_nuxt/CUXCQXjG.js": {
30416
30670
  "type": "text/javascript; charset=utf-8",
30417
30671
  "etag": "\"18b-4es6+sDUaYZ89sbvxGRBaXHox64\"",
30418
- "mtime": "2026-09-05T18:48:20.535Z",
30672
+ "mtime": "2026-09-06T08:07:40.913Z",
30419
30673
  "size": 395,
30420
30674
  "path": "../public/_nuxt/CUXCQXjG.js"
30421
30675
  },
30676
+ "/_nuxt/CvYfzHYz.js": {
30677
+ "type": "text/javascript; charset=utf-8",
30678
+ "etag": "\"20dc-gCA9ZNv8r8lAY21fe67KYxIB3DY\"",
30679
+ "mtime": "2026-09-06T08:07:40.914Z",
30680
+ "size": 8412,
30681
+ "path": "../public/_nuxt/CvYfzHYz.js"
30682
+ },
30422
30683
  "/_nuxt/CWKEp1wx2.js": {
30423
30684
  "type": "text/javascript; charset=utf-8",
30424
30685
  "etag": "\"555-ED/tuOi0Qdk4aSGksbI58QY+vQ8\"",
30425
- "mtime": "2026-09-05T18:48:20.535Z",
30686
+ "mtime": "2026-09-06T08:07:40.913Z",
30426
30687
  "size": 1365,
30427
30688
  "path": "../public/_nuxt/CWKEp1wx2.js"
30428
30689
  },
30690
+ "/_nuxt/D-Ca4BGY.js": {
30691
+ "type": "text/javascript; charset=utf-8",
30692
+ "etag": "\"d322-Ji+xNrf2m+xWgNVNTGDuV7nAR7w\"",
30693
+ "mtime": "2026-09-06T08:07:40.915Z",
30694
+ "size": 54050,
30695
+ "path": "../public/_nuxt/D-Ca4BGY.js"
30696
+ },
30429
30697
  "/_nuxt/D1z7i2UP.js": {
30430
30698
  "type": "text/javascript; charset=utf-8",
30431
30699
  "etag": "\"3488-96j3CtrX45ueUXO7o7l3+3rcKWk\"",
30432
- "mtime": "2026-09-05T18:48:20.537Z",
30700
+ "mtime": "2026-09-06T08:07:40.915Z",
30433
30701
  "size": 13448,
30434
30702
  "path": "../public/_nuxt/D1z7i2UP.js"
30435
30703
  },
30436
- "/_nuxt/D3VJ3lex.js": {
30437
- "type": "text/javascript; charset=utf-8",
30438
- "etag": "\"f01-r7T4K2XehrEJJJK0PwxWUc/AYBo\"",
30439
- "mtime": "2026-09-05T18:48:20.537Z",
30440
- "size": 3841,
30441
- "path": "../public/_nuxt/D3VJ3lex.js"
30442
- },
30443
- "/_nuxt/D0Szyn_D.js": {
30444
- "type": "text/javascript; charset=utf-8",
30445
- "etag": "\"3d83-SNx5jbrmEIkXnjG0hx+QAnLAJaU\"",
30446
- "mtime": "2026-09-05T18:48:20.537Z",
30447
- "size": 15747,
30448
- "path": "../public/_nuxt/D0Szyn_D.js"
30449
- },
30450
- "/_nuxt/D-Ca4BGY.js": {
30704
+ "/_nuxt/D2JyEL28.js": {
30451
30705
  "type": "text/javascript; charset=utf-8",
30452
- "etag": "\"d322-Ji+xNrf2m+xWgNVNTGDuV7nAR7w\"",
30453
- "mtime": "2026-09-05T18:48:20.537Z",
30454
- "size": 54050,
30455
- "path": "../public/_nuxt/D-Ca4BGY.js"
30706
+ "etag": "\"3cec5-TxP/adCAMJxntNai1sx15z/ieVE\"",
30707
+ "mtime": "2026-09-06T08:07:40.895Z",
30708
+ "size": 249541,
30709
+ "path": "../public/_nuxt/D2JyEL28.js"
30456
30710
  },
30457
30711
  "/_nuxt/D8CqF0yy.js": {
30458
30712
  "type": "text/javascript; charset=utf-8",
30459
30713
  "etag": "\"1dae-DlKVVV+fkbaFtolHiRzBO1Gjw4s\"",
30460
- "mtime": "2026-09-05T18:48:20.537Z",
30714
+ "mtime": "2026-09-06T08:07:40.915Z",
30461
30715
  "size": 7598,
30462
30716
  "path": "../public/_nuxt/D8CqF0yy.js"
30463
30717
  },
30464
- "/_nuxt/D8wyHvcz2.js": {
30465
- "type": "text/javascript; charset=utf-8",
30466
- "etag": "\"55b3-IXOjYFN89j76ODqvRackqZfkzLU\"",
30467
- "mtime": "2026-09-05T18:48:20.538Z",
30468
- "size": 21939,
30469
- "path": "../public/_nuxt/D8wyHvcz2.js"
30470
- },
30471
- "/_nuxt/D8EfUxO2.js": {
30472
- "type": "text/javascript; charset=utf-8",
30473
- "etag": "\"20a5-Z19piLjMj61QfCggRD0AXtjNA9Q\"",
30474
- "mtime": "2026-09-05T18:48:20.538Z",
30475
- "size": 8357,
30476
- "path": "../public/_nuxt/D8EfUxO2.js"
30477
- },
30478
30718
  "/_nuxt/D95h62Jn.js": {
30479
30719
  "type": "text/javascript; charset=utf-8",
30480
30720
  "etag": "\"3f5-sTPqCSaAt8a9YlLXlhRfFlOtmcQ\"",
30481
- "mtime": "2026-09-05T18:48:20.538Z",
30721
+ "mtime": "2026-09-06T08:07:40.916Z",
30482
30722
  "size": 1013,
30483
30723
  "path": "../public/_nuxt/D95h62Jn.js"
30484
30724
  },
30485
30725
  "/_nuxt/daq.6IrhVVfy.css": {
30486
30726
  "type": "text/css; charset=utf-8",
30487
30727
  "etag": "\"560c-BXFIKD9bnWhTOZ8SzFFpfkMuNHU\"",
30488
- "mtime": "2026-09-05T18:48:20.546Z",
30728
+ "mtime": "2026-09-06T08:07:40.927Z",
30489
30729
  "size": 22028,
30490
30730
  "path": "../public/_nuxt/daq.6IrhVVfy.css"
30491
30731
  },
30492
- "/_nuxt/dcw.DcDjwvqv.css": {
30732
+ "/_nuxt/DA4lxCWC2.js": {
30733
+ "type": "text/javascript; charset=utf-8",
30734
+ "etag": "\"1fd9-/rwkIG2tdN0ulOA/H0Hwh783NRw\"",
30735
+ "mtime": "2026-09-06T08:07:40.916Z",
30736
+ "size": 8153,
30737
+ "path": "../public/_nuxt/DA4lxCWC2.js"
30738
+ },
30739
+ "/_nuxt/dcw.rpqpOYQ8.css": {
30493
30740
  "type": "text/css; charset=utf-8",
30494
- "etag": "\"2608-sKDmsAosVQN2c6l/NGazwNjDLUI\"",
30495
- "mtime": "2026-09-05T18:48:20.546Z",
30741
+ "etag": "\"2608-O6LWPYmCVMPE4w9ov0f4xG4gJg0\"",
30742
+ "mtime": "2026-09-06T08:07:40.927Z",
30496
30743
  "size": 9736,
30497
- "path": "../public/_nuxt/dcw.DcDjwvqv.css"
30744
+ "path": "../public/_nuxt/dcw.rpqpOYQ8.css"
30498
30745
  },
30499
- "/_nuxt/default.BR3e5fPY.css": {
30746
+ "/_nuxt/DaE5saZg.js": {
30747
+ "type": "text/javascript; charset=utf-8",
30748
+ "etag": "\"3d8b-v1n7kg5KKx0NfcuzRjI3aHnlvfg\"",
30749
+ "mtime": "2026-09-06T08:07:40.917Z",
30750
+ "size": 15755,
30751
+ "path": "../public/_nuxt/DaE5saZg.js"
30752
+ },
30753
+ "/_nuxt/default.BbgdTDCk.css": {
30500
30754
  "type": "text/css; charset=utf-8",
30501
- "etag": "\"2f9e-upGaJ3k11leK6cD+Djdue8Ue2CQ\"",
30502
- "mtime": "2026-09-05T18:48:20.547Z",
30755
+ "etag": "\"2f9e-FQsP/3guV1XWiRqjZyF0yxNKLkc\"",
30756
+ "mtime": "2026-09-06T08:07:40.927Z",
30503
30757
  "size": 12190,
30504
- "path": "../public/_nuxt/default.BR3e5fPY.css"
30758
+ "path": "../public/_nuxt/default.BbgdTDCk.css"
30759
+ },
30760
+ "/_nuxt/Dhqra7NB.js": {
30761
+ "type": "text/javascript; charset=utf-8",
30762
+ "etag": "\"c67-DJQzh47TgZoVFNIo5m4hACtSlTg\"",
30763
+ "mtime": "2026-09-06T08:07:40.918Z",
30764
+ "size": 3175,
30765
+ "path": "../public/_nuxt/Dhqra7NB.js"
30505
30766
  },
30506
30767
  "/_nuxt/DeYsUzhr.js": {
30507
30768
  "type": "text/javascript; charset=utf-8",
30508
30769
  "etag": "\"287-ALaKQkZWM37K7ru31bg511e8ikI\"",
30509
- "mtime": "2026-09-05T18:48:20.539Z",
30770
+ "mtime": "2026-09-06T08:07:40.917Z",
30510
30771
  "size": 647,
30511
30772
  "path": "../public/_nuxt/DeYsUzhr.js"
30512
30773
  },
30513
30774
  "/_nuxt/DIOBYJe3.js": {
30514
30775
  "type": "text/javascript; charset=utf-8",
30515
30776
  "etag": "\"4b5-DdWaiyBS+/JejqhLG4Q7/JprP2Q\"",
30516
- "mtime": "2026-09-05T18:48:20.538Z",
30777
+ "mtime": "2026-09-06T08:07:40.916Z",
30517
30778
  "size": 1205,
30518
30779
  "path": "../public/_nuxt/DIOBYJe3.js"
30519
30780
  },
30520
- "/_nuxt/DM4CNkXz.js": {
30781
+ "/_nuxt/DlRO_q5L.js": {
30521
30782
  "type": "text/javascript; charset=utf-8",
30522
- "etag": "\"20aa-+0gDSjYbp44IKCQS+olLGwWYLZ0\"",
30523
- "mtime": "2026-09-05T18:48:20.539Z",
30524
- "size": 8362,
30525
- "path": "../public/_nuxt/DM4CNkXz.js"
30526
- },
30527
- "/_nuxt/DpojD719.js": {
30528
- "type": "text/javascript; charset=utf-8",
30529
- "etag": "\"29d-Fu+XH+dfF6wIVeD5drBDJvCFiPE\"",
30530
- "mtime": "2026-09-05T18:48:20.539Z",
30531
- "size": 669,
30532
- "path": "../public/_nuxt/DpojD719.js"
30783
+ "etag": "\"1195-qIdBUxD1e9n0IIVzYKGquwyc5IM\"",
30784
+ "mtime": "2026-09-06T08:07:40.918Z",
30785
+ "size": 4501,
30786
+ "path": "../public/_nuxt/DlRO_q5L.js"
30533
30787
  },
30534
30788
  "/_nuxt/DoLasgPj2.js": {
30535
30789
  "type": "text/javascript; charset=utf-8",
30536
30790
  "etag": "\"20cf-AD2OXvXYmQR29f4gV1ADJLRnCEA\"",
30537
- "mtime": "2026-09-05T18:48:20.539Z",
30791
+ "mtime": "2026-09-06T08:07:40.918Z",
30538
30792
  "size": 8399,
30539
30793
  "path": "../public/_nuxt/DoLasgPj2.js"
30540
30794
  },
30541
- "/_nuxt/DN5RuZ8k.js": {
30795
+ "/_nuxt/DpojD719.js": {
30796
+ "type": "text/javascript; charset=utf-8",
30797
+ "etag": "\"29d-Fu+XH+dfF6wIVeD5drBDJvCFiPE\"",
30798
+ "mtime": "2026-09-06T08:07:40.918Z",
30799
+ "size": 669,
30800
+ "path": "../public/_nuxt/DpojD719.js"
30801
+ },
30802
+ "/_nuxt/Ds8JbqGB.js": {
30542
30803
  "type": "text/javascript; charset=utf-8",
30543
- "etag": "\"26637-Mfy9qOBxF72GHzi+rb3kHe7iBVs\"",
30544
- "mtime": "2026-09-05T18:48:20.539Z",
30545
- "size": 157239,
30546
- "path": "../public/_nuxt/DN5RuZ8k.js"
30804
+ "etag": "\"20a5-5w+JPRF9P/jPDCyWtGvTH9GWMvs\"",
30805
+ "mtime": "2026-09-06T08:07:40.918Z",
30806
+ "size": 8357,
30807
+ "path": "../public/_nuxt/Ds8JbqGB.js"
30547
30808
  },
30548
- "/_nuxt/Dqj2h40U.js": {
30809
+ "/_nuxt/DNxVTfhe.js": {
30549
30810
  "type": "text/javascript; charset=utf-8",
30550
- "etag": "\"e582-boZuLO/wWhULGxLqbU4ZyPr4G+4\"",
30551
- "mtime": "2026-09-05T18:48:20.539Z",
30552
- "size": 58754,
30553
- "path": "../public/_nuxt/Dqj2h40U.js"
30811
+ "etag": "\"28a2e-JTPo0V0NdEUiA5ubrG/aTW6Nt3s\"",
30812
+ "mtime": "2026-09-06T08:07:40.916Z",
30813
+ "size": 166446,
30814
+ "path": "../public/_nuxt/DNxVTfhe.js"
30554
30815
  },
30555
- "/_nuxt/DDdEnkdw.js": {
30816
+ "/_nuxt/Dsdy4Ua-.js": {
30556
30817
  "type": "text/javascript; charset=utf-8",
30557
- "etag": "\"8cc4a-lwyc2Eg+lft0XI7SWiX5gE688tU\"",
30558
- "mtime": "2026-09-05T18:48:20.538Z",
30559
- "size": 576586,
30560
- "path": "../public/_nuxt/DDdEnkdw.js"
30818
+ "etag": "\"12dd-PxFx1uaFqb7tUPva/yyN7Y/S75I\"",
30819
+ "mtime": "2026-09-06T08:07:40.919Z",
30820
+ "size": 4829,
30821
+ "path": "../public/_nuxt/Dsdy4Ua-.js"
30561
30822
  },
30562
30823
  "/_nuxt/DsUUYP292.js": {
30563
30824
  "type": "text/javascript; charset=utf-8",
30564
30825
  "etag": "\"144-/n2T55jR70VIdOwiikYjqUe6HLk\"",
30565
- "mtime": "2026-09-05T18:48:20.540Z",
30826
+ "mtime": "2026-09-06T08:07:40.919Z",
30566
30827
  "size": 324,
30567
30828
  "path": "../public/_nuxt/DsUUYP292.js"
30568
30829
  },
30569
- "/_nuxt/DvgKXPgu2.js": {
30830
+ "/_nuxt/DT-Wg8r1.js": {
30570
30831
  "type": "text/javascript; charset=utf-8",
30571
- "etag": "\"6a1f-p1gezMFsyF2Pmipd9NKL0IvgPBY\"",
30572
- "mtime": "2026-09-05T18:48:20.541Z",
30573
- "size": 27167,
30574
- "path": "../public/_nuxt/DvgKXPgu2.js"
30832
+ "etag": "\"987d-FRY5+vZoHzByvMEFbeh2lKuBssc\"",
30833
+ "mtime": "2026-09-06T08:07:40.916Z",
30834
+ "size": 39037,
30835
+ "path": "../public/_nuxt/DT-Wg8r1.js"
30836
+ },
30837
+ "/_nuxt/D8xY-Yjc.js": {
30838
+ "type": "text/javascript; charset=utf-8",
30839
+ "etag": "\"8cd3c-1gm55NOnlTpCwPO3UZDzscgQ87g\"",
30840
+ "mtime": "2026-09-06T08:07:40.915Z",
30841
+ "size": 576828,
30842
+ "path": "../public/_nuxt/D8xY-Yjc.js"
30575
30843
  },
30576
30844
  "/_nuxt/DtBu71ev.js": {
30577
30845
  "type": "text/javascript; charset=utf-8",
30578
30846
  "etag": "\"156bf-YTCvoAR5ZNk1ZGVhmY/Bceo/GjQ\"",
30579
- "mtime": "2026-09-05T18:48:20.540Z",
30847
+ "mtime": "2026-09-06T08:07:40.920Z",
30580
30848
  "size": 87743,
30581
30849
  "path": "../public/_nuxt/DtBu71ev.js"
30582
30850
  },
30851
+ "/_nuxt/DTYBfjRY.js": {
30852
+ "type": "text/javascript; charset=utf-8",
30853
+ "etag": "\"1a89-9gPrj/bgllCi+f9Gl6ze+k5zkcw\"",
30854
+ "mtime": "2026-09-06T08:07:40.917Z",
30855
+ "size": 6793,
30856
+ "path": "../public/_nuxt/DTYBfjRY.js"
30857
+ },
30858
+ "/_nuxt/DWcEk1ur2.js": {
30859
+ "type": "text/javascript; charset=utf-8",
30860
+ "etag": "\"6a1f-fF/+gkQ3RswZQKIYDBEx7d8rnN8\"",
30861
+ "mtime": "2026-09-06T08:07:40.917Z",
30862
+ "size": 27167,
30863
+ "path": "../public/_nuxt/DWcEk1ur2.js"
30864
+ },
30583
30865
  "/_nuxt/DXRZPxGs.js": {
30584
30866
  "type": "text/javascript; charset=utf-8",
30585
30867
  "etag": "\"42-LgXLXdo9BGzBlyxqolWDOt/Ezyg\"",
30586
- "mtime": "2026-09-05T18:48:20.539Z",
30868
+ "mtime": "2026-09-06T08:07:40.917Z",
30587
30869
  "size": 66,
30588
30870
  "path": "../public/_nuxt/DXRZPxGs.js"
30589
30871
  },
30590
30872
  "/_nuxt/Dy-mxvXY2.js": {
30591
30873
  "type": "text/javascript; charset=utf-8",
30592
30874
  "etag": "\"92-oLgwL98kjyuEcvL717na1ap9Tks\"",
30593
- "mtime": "2026-09-05T18:48:20.541Z",
30875
+ "mtime": "2026-09-06T08:07:40.920Z",
30594
30876
  "size": 146,
30595
30877
  "path": "../public/_nuxt/Dy-mxvXY2.js"
30596
30878
  },
30597
- "/_nuxt/eb-garamond-cyrillic-400-italic.BGIwiowF.woff2": {
30598
- "type": "font/woff2",
30599
- "etag": "\"3504-t17DeaJZ5CiTr/7PdWXcRgN9/Yc\"",
30600
- "mtime": "2026-09-05T18:48:20.547Z",
30601
- "size": 13572,
30602
- "path": "../public/_nuxt/eb-garamond-cyrillic-400-italic.BGIwiowF.woff2"
30879
+ "/_nuxt/E88a-JCG.js": {
30880
+ "type": "text/javascript; charset=utf-8",
30881
+ "etag": "\"2463-SRR9K/48ysJhqMUtjV+hQzbQox8\"",
30882
+ "mtime": "2026-09-06T08:07:40.920Z",
30883
+ "size": 9315,
30884
+ "path": "../public/_nuxt/E88a-JCG.js"
30603
30885
  },
30604
30886
  "/_nuxt/eb-garamond-cyrillic-400-italic.BZInx2ys.woff": {
30605
30887
  "type": "font/woff",
30606
30888
  "etag": "\"3f04-1MKyFKXvChwQTK9MnbAM3SwAP/w\"",
30607
- "mtime": "2026-09-05T18:48:20.547Z",
30889
+ "mtime": "2026-09-06T08:07:40.928Z",
30608
30890
  "size": 16132,
30609
30891
  "path": "../public/_nuxt/eb-garamond-cyrillic-400-italic.BZInx2ys.woff"
30610
30892
  },
30611
- "/_nuxt/DxrgFxIr2.js": {
30612
- "type": "text/javascript; charset=utf-8",
30613
- "etag": "\"89e-8NcXOG1REJAIlIAOpWPT7Ks0lvQ\"",
30614
- "mtime": "2026-09-05T18:48:20.541Z",
30615
- "size": 2206,
30616
- "path": "../public/_nuxt/DxrgFxIr2.js"
30617
- },
30618
- "/_nuxt/eb-garamond-cyrillic-400-normal.DDLP67lu.woff2": {
30893
+ "/_nuxt/eb-garamond-cyrillic-400-italic.BGIwiowF.woff2": {
30619
30894
  "type": "font/woff2",
30620
- "etag": "\"33d4-lVrdxXudnaWAAL0JfU6b+yZGpK0\"",
30621
- "mtime": "2026-09-05T18:48:20.547Z",
30622
- "size": 13268,
30623
- "path": "../public/_nuxt/eb-garamond-cyrillic-400-normal.DDLP67lu.woff2"
30895
+ "etag": "\"3504-t17DeaJZ5CiTr/7PdWXcRgN9/Yc\"",
30896
+ "mtime": "2026-09-06T08:07:40.927Z",
30897
+ "size": 13572,
30898
+ "path": "../public/_nuxt/eb-garamond-cyrillic-400-italic.BGIwiowF.woff2"
30624
30899
  },
30625
30900
  "/_nuxt/eb-garamond-cyrillic-400-normal.C0kVTdou.woff": {
30626
30901
  "type": "font/woff",
30627
30902
  "etag": "\"3c88-Q5XoFKe1rGp1UkdvSR6MtPcFfgQ\"",
30628
- "mtime": "2026-09-05T18:48:20.547Z",
30903
+ "mtime": "2026-09-06T08:07:40.928Z",
30629
30904
  "size": 15496,
30630
30905
  "path": "../public/_nuxt/eb-garamond-cyrillic-400-normal.C0kVTdou.woff"
30631
30906
  },
30632
30907
  "/_nuxt/eb-garamond-cyrillic-ext-400-italic.Bz1w3xqM.woff2": {
30633
30908
  "type": "font/woff2",
30634
30909
  "etag": "\"4620-AEmSjSDDFDLAiok0BdjqqFs2mx4\"",
30635
- "mtime": "2026-09-05T18:48:20.547Z",
30910
+ "mtime": "2026-09-06T08:07:40.928Z",
30636
30911
  "size": 17952,
30637
30912
  "path": "../public/_nuxt/eb-garamond-cyrillic-ext-400-italic.Bz1w3xqM.woff2"
30638
30913
  },
30639
- "/_nuxt/eb-garamond-cyrillic-ext-400-italic.CYS3phfl.woff": {
30640
- "type": "font/woff",
30641
- "etag": "\"5698-6bgErOYTElI0Z3Untp+h0Xi0FGs\"",
30642
- "mtime": "2026-09-05T18:48:20.548Z",
30643
- "size": 22168,
30644
- "path": "../public/_nuxt/eb-garamond-cyrillic-ext-400-italic.CYS3phfl.woff"
30914
+ "/_nuxt/DyisHHzD.js": {
30915
+ "type": "text/javascript; charset=utf-8",
30916
+ "etag": "\"26637-o15U+yDwUbonOcjvC07KaBGRDho\"",
30917
+ "mtime": "2026-09-06T08:07:40.920Z",
30918
+ "size": 157239,
30919
+ "path": "../public/_nuxt/DyisHHzD.js"
30920
+ },
30921
+ "/_nuxt/eb-garamond-cyrillic-400-normal.DDLP67lu.woff2": {
30922
+ "type": "font/woff2",
30923
+ "etag": "\"33d4-lVrdxXudnaWAAL0JfU6b+yZGpK0\"",
30924
+ "mtime": "2026-09-06T08:07:40.928Z",
30925
+ "size": 13268,
30926
+ "path": "../public/_nuxt/eb-garamond-cyrillic-400-normal.DDLP67lu.woff2"
30927
+ },
30928
+ "/_nuxt/eb-garamond-cyrillic-ext-400-italic.CYS3phfl.woff": {
30929
+ "type": "font/woff",
30930
+ "etag": "\"5698-6bgErOYTElI0Z3Untp+h0Xi0FGs\"",
30931
+ "mtime": "2026-09-06T08:07:40.928Z",
30932
+ "size": 22168,
30933
+ "path": "../public/_nuxt/eb-garamond-cyrillic-ext-400-italic.CYS3phfl.woff"
30645
30934
  },
30646
30935
  "/_nuxt/eb-garamond-cyrillic-ext-400-normal.DG8lny6_.woff": {
30647
30936
  "type": "font/woff",
30648
30937
  "etag": "\"4fcc-Wt58DNvJEH8PhhsEwR/fAuZLZf0\"",
30649
- "mtime": "2026-09-05T18:48:20.548Z",
30938
+ "mtime": "2026-09-06T08:07:40.928Z",
30650
30939
  "size": 20428,
30651
30940
  "path": "../public/_nuxt/eb-garamond-cyrillic-ext-400-normal.DG8lny6_.woff"
30652
30941
  },
30653
- "/_nuxt/eb-garamond-greek-400-italic.BamGE6QP.woff": {
30654
- "type": "font/woff",
30655
- "etag": "\"307c-Fmorq8T0Tyl1FByuAGfnIMJMsU0\"",
30656
- "mtime": "2026-09-05T18:48:20.548Z",
30657
- "size": 12412,
30658
- "path": "../public/_nuxt/eb-garamond-greek-400-italic.BamGE6QP.woff"
30659
- },
30660
30942
  "/_nuxt/eb-garamond-cyrillic-ext-400-normal.o8fRvAFQ.woff2": {
30661
30943
  "type": "font/woff2",
30662
30944
  "etag": "\"419c-BgVrkDzxBAskhVuAe8ZPKrVJ2vk\"",
30663
- "mtime": "2026-09-05T18:48:20.548Z",
30945
+ "mtime": "2026-09-06T08:07:40.929Z",
30664
30946
  "size": 16796,
30665
30947
  "path": "../public/_nuxt/eb-garamond-cyrillic-ext-400-normal.o8fRvAFQ.woff2"
30666
30948
  },
30949
+ "/_nuxt/eb-garamond-greek-400-italic.BamGE6QP.woff": {
30950
+ "type": "font/woff",
30951
+ "etag": "\"307c-Fmorq8T0Tyl1FByuAGfnIMJMsU0\"",
30952
+ "mtime": "2026-09-06T08:07:40.929Z",
30953
+ "size": 12412,
30954
+ "path": "../public/_nuxt/eb-garamond-greek-400-italic.BamGE6QP.woff"
30955
+ },
30667
30956
  "/_nuxt/eb-garamond-greek-400-italic.Dqr5KC66.woff2": {
30668
30957
  "type": "font/woff2",
30669
30958
  "etag": "\"2904-BXAeLh8O+jrT8ujKrV7WtU2zP1c\"",
30670
- "mtime": "2026-09-05T18:48:20.548Z",
30959
+ "mtime": "2026-09-06T08:07:40.929Z",
30671
30960
  "size": 10500,
30672
30961
  "path": "../public/_nuxt/eb-garamond-greek-400-italic.Dqr5KC66.woff2"
30673
30962
  },
30674
30963
  "/_nuxt/eb-garamond-greek-400-normal.CVAbzS9p.woff2": {
30675
30964
  "type": "font/woff2",
30676
30965
  "etag": "\"2a00-ZNzj8SIiN3t2N23u++WhC6jE8gk\"",
30677
- "mtime": "2026-09-05T18:48:20.548Z",
30966
+ "mtime": "2026-09-06T08:07:40.929Z",
30678
30967
  "size": 10752,
30679
30968
  "path": "../public/_nuxt/eb-garamond-greek-400-normal.CVAbzS9p.woff2"
30680
30969
  },
30681
- "/_nuxt/eb-garamond-greek-ext-400-italic.CHZOQEtG.woff2": {
30682
- "type": "font/woff2",
30683
- "etag": "\"19d0-ppOK6AfNTXYuDEeeEMQQhOypGW8\"",
30684
- "mtime": "2026-09-05T18:48:20.549Z",
30685
- "size": 6608,
30686
- "path": "../public/_nuxt/eb-garamond-greek-ext-400-italic.CHZOQEtG.woff2"
30970
+ "/_nuxt/eb-garamond-greek-400-normal.d4JlP2QH.woff": {
30971
+ "type": "font/woff",
30972
+ "etag": "\"3108-ggShwQ6kE+MAR7EEQafdmWunxHg\"",
30973
+ "mtime": "2026-09-06T08:07:40.930Z",
30974
+ "size": 12552,
30975
+ "path": "../public/_nuxt/eb-garamond-greek-400-normal.d4JlP2QH.woff"
30687
30976
  },
30688
30977
  "/_nuxt/eb-garamond-greek-ext-400-italic.BL1XYHtS.woff": {
30689
30978
  "type": "font/woff",
30690
30979
  "etag": "\"2304-q8ppn7qePqLys53UrEKMrGT8e6E\"",
30691
- "mtime": "2026-09-05T18:48:20.549Z",
30980
+ "mtime": "2026-09-06T08:07:40.930Z",
30692
30981
  "size": 8964,
30693
30982
  "path": "../public/_nuxt/eb-garamond-greek-ext-400-italic.BL1XYHtS.woff"
30694
30983
  },
30695
- "/_nuxt/eb-garamond-greek-400-normal.d4JlP2QH.woff": {
30696
- "type": "font/woff",
30697
- "etag": "\"3108-ggShwQ6kE+MAR7EEQafdmWunxHg\"",
30698
- "mtime": "2026-09-05T18:48:20.549Z",
30699
- "size": 12552,
30700
- "path": "../public/_nuxt/eb-garamond-greek-400-normal.d4JlP2QH.woff"
30701
- },
30702
30984
  "/_nuxt/eb-garamond-greek-ext-400-normal.K8pwR3tn.woff2": {
30703
30985
  "type": "font/woff2",
30704
30986
  "etag": "\"1940-Y3hsqG2RXMGI9hHTiI+Nv2Q4msM\"",
30705
- "mtime": "2026-09-05T18:48:20.549Z",
30987
+ "mtime": "2026-09-06T08:07:40.930Z",
30706
30988
  "size": 6464,
30707
30989
  "path": "../public/_nuxt/eb-garamond-greek-ext-400-normal.K8pwR3tn.woff2"
30708
30990
  },
30991
+ "/_nuxt/eb-garamond-greek-ext-400-italic.CHZOQEtG.woff2": {
30992
+ "type": "font/woff2",
30993
+ "etag": "\"19d0-ppOK6AfNTXYuDEeeEMQQhOypGW8\"",
30994
+ "mtime": "2026-09-06T08:07:40.930Z",
30995
+ "size": 6608,
30996
+ "path": "../public/_nuxt/eb-garamond-greek-ext-400-italic.CHZOQEtG.woff2"
30997
+ },
30709
30998
  "/_nuxt/eb-garamond-greek-ext-400-normal.BaZl8BIK.woff": {
30710
30999
  "type": "font/woff",
30711
31000
  "etag": "\"20b0-FNV/ZgjupejIrGOsz4+8EYVUXHo\"",
30712
- "mtime": "2026-09-05T18:48:20.549Z",
31001
+ "mtime": "2026-09-06T08:07:40.930Z",
30713
31002
  "size": 8368,
30714
31003
  "path": "../public/_nuxt/eb-garamond-greek-ext-400-normal.BaZl8BIK.woff"
30715
31004
  },
30716
31005
  "/_nuxt/eb-garamond-latin-400-italic.CDFyLPXJ.woff": {
30717
31006
  "type": "font/woff",
30718
31007
  "etag": "\"7890-VX8YYh09367bg28IWSUybEXrsDQ\"",
30719
- "mtime": "2026-09-05T18:48:20.549Z",
31008
+ "mtime": "2026-09-06T08:07:40.930Z",
30720
31009
  "size": 30864,
30721
31010
  "path": "../public/_nuxt/eb-garamond-latin-400-italic.CDFyLPXJ.woff"
30722
31011
  },
30723
31012
  "/_nuxt/eb-garamond-latin-400-italic.DSEbMgZu.woff2": {
30724
31013
  "type": "font/woff2",
30725
31014
  "etag": "\"632c-iB8RNlBCm9D0APLcMJ/hIPATx+0\"",
30726
- "mtime": "2026-09-05T18:48:20.550Z",
31015
+ "mtime": "2026-09-06T08:07:40.931Z",
30727
31016
  "size": 25388,
30728
31017
  "path": "../public/_nuxt/eb-garamond-latin-400-italic.DSEbMgZu.woff2"
30729
31018
  },
30730
31019
  "/_nuxt/eb-garamond-latin-400-normal.BCNrxLz_.woff2": {
30731
31020
  "type": "font/woff2",
30732
31021
  "etag": "\"5d0c-w7FmIa34l5RBoJYmvp9lwadEvW4\"",
30733
- "mtime": "2026-09-05T18:48:20.550Z",
31022
+ "mtime": "2026-09-06T08:07:40.931Z",
30734
31023
  "size": 23820,
30735
31024
  "path": "../public/_nuxt/eb-garamond-latin-400-normal.BCNrxLz_.woff2"
30736
31025
  },
30737
31026
  "/_nuxt/eb-garamond-latin-400-normal.maQnHeKB.woff": {
30738
31027
  "type": "font/woff",
30739
31028
  "etag": "\"6fc0-tKFcVMt7ocp7dmWyG6/kxtP5mKY\"",
30740
- "mtime": "2026-09-05T18:48:20.550Z",
31029
+ "mtime": "2026-09-06T08:07:40.931Z",
30741
31030
  "size": 28608,
30742
31031
  "path": "../public/_nuxt/eb-garamond-latin-400-normal.maQnHeKB.woff"
30743
31032
  },
30744
31033
  "/_nuxt/eb-garamond-latin-ext-400-italic.DUSsnRSD.woff": {
30745
31034
  "type": "font/woff",
30746
31035
  "etag": "\"f5b8-o98RIl4uKzIPJHZZpEI+mI17K3c\"",
30747
- "mtime": "2026-09-05T18:48:20.550Z",
31036
+ "mtime": "2026-09-06T08:07:40.931Z",
30748
31037
  "size": 62904,
30749
31038
  "path": "../public/_nuxt/eb-garamond-latin-ext-400-italic.DUSsnRSD.woff"
30750
31039
  },
30751
31040
  "/_nuxt/eb-garamond-latin-ext-400-italic.V7s3nWfX.woff2": {
30752
31041
  "type": "font/woff2",
30753
31042
  "etag": "\"b19c-7qms9anmdJJsBixQTHSocgV31Qk\"",
30754
- "mtime": "2026-09-05T18:48:20.550Z",
31043
+ "mtime": "2026-09-06T08:07:40.931Z",
30755
31044
  "size": 45468,
30756
31045
  "path": "../public/_nuxt/eb-garamond-latin-ext-400-italic.V7s3nWfX.woff2"
30757
31046
  },
30758
- "/_nuxt/eb-garamond-vietnamese-400-italic.ORtyMVfw.woff": {
30759
- "type": "font/woff",
30760
- "etag": "\"1edc-XUugZ4qMSSF4m+TQLER2LLza1t0\"",
30761
- "mtime": "2026-09-05T18:48:20.551Z",
30762
- "size": 7900,
30763
- "path": "../public/_nuxt/eb-garamond-vietnamese-400-italic.ORtyMVfw.woff"
31047
+ "/_nuxt/eb-garamond-latin-ext-400-normal.o4A__6QZ.woff2": {
31048
+ "type": "font/woff2",
31049
+ "etag": "\"de84-qKZ/sgxlZLRv1TmEnWR30Cc4wfw\"",
31050
+ "mtime": "2026-09-06T08:07:40.932Z",
31051
+ "size": 56964,
31052
+ "path": "../public/_nuxt/eb-garamond-latin-ext-400-normal.o4A__6QZ.woff2"
30764
31053
  },
30765
31054
  "/_nuxt/eb-garamond-latin-ext-400-normal.B4EmgUmt.woff": {
30766
31055
  "type": "font/woff",
30767
31056
  "etag": "\"12b44-jg/K3aZca4XOngCAf1Jh47/0cj8\"",
30768
- "mtime": "2026-09-05T18:48:20.551Z",
31057
+ "mtime": "2026-09-06T08:07:40.932Z",
30769
31058
  "size": 76612,
30770
31059
  "path": "../public/_nuxt/eb-garamond-latin-ext-400-normal.B4EmgUmt.woff"
30771
31060
  },
30772
- "/_nuxt/eb-garamond-latin-ext-400-normal.o4A__6QZ.woff2": {
31061
+ "/_nuxt/eb-garamond-vietnamese-400-italic.DQ8HKnks.woff2": {
30773
31062
  "type": "font/woff2",
30774
- "etag": "\"de84-qKZ/sgxlZLRv1TmEnWR30Cc4wfw\"",
30775
- "mtime": "2026-09-05T18:48:20.551Z",
30776
- "size": 56964,
30777
- "path": "../public/_nuxt/eb-garamond-latin-ext-400-normal.o4A__6QZ.woff2"
31063
+ "etag": "\"187c-Wj36AOh9OjwDZT5W3eeao1D/NT4\"",
31064
+ "mtime": "2026-09-06T08:07:40.932Z",
31065
+ "size": 6268,
31066
+ "path": "../public/_nuxt/eb-garamond-vietnamese-400-italic.DQ8HKnks.woff2"
31067
+ },
31068
+ "/_nuxt/eb-garamond-vietnamese-400-italic.ORtyMVfw.woff": {
31069
+ "type": "font/woff",
31070
+ "etag": "\"1edc-XUugZ4qMSSF4m+TQLER2LLza1t0\"",
31071
+ "mtime": "2026-09-06T08:07:40.932Z",
31072
+ "size": 7900,
31073
+ "path": "../public/_nuxt/eb-garamond-vietnamese-400-italic.ORtyMVfw.woff"
30778
31074
  },
30779
31075
  "/_nuxt/eb-garamond-vietnamese-400-normal.CLvJdMEL.woff2": {
30780
31076
  "type": "font/woff2",
30781
31077
  "etag": "\"183c-arAHcc3MmJQ6+OtYVThlERUqDQQ\"",
30782
- "mtime": "2026-09-05T18:48:20.551Z",
31078
+ "mtime": "2026-09-06T08:07:40.932Z",
30783
31079
  "size": 6204,
30784
31080
  "path": "../public/_nuxt/eb-garamond-vietnamese-400-normal.CLvJdMEL.woff2"
30785
31081
  },
30786
- "/_nuxt/eb-garamond-vietnamese-400-italic.DQ8HKnks.woff2": {
30787
- "type": "font/woff2",
30788
- "etag": "\"187c-Wj36AOh9OjwDZT5W3eeao1D/NT4\"",
30789
- "mtime": "2026-09-05T18:48:20.551Z",
30790
- "size": 6268,
30791
- "path": "../public/_nuxt/eb-garamond-vietnamese-400-italic.DQ8HKnks.woff2"
30792
- },
30793
31082
  "/_nuxt/eb-garamond-vietnamese-400-normal.ifvNSiWx.woff": {
30794
31083
  "type": "font/woff",
30795
31084
  "etag": "\"1e50-PGVIQbsmhTvI1h5aIhavpIQl8z4\"",
30796
- "mtime": "2026-09-05T18:48:20.551Z",
31085
+ "mtime": "2026-09-06T08:07:40.933Z",
30797
31086
  "size": 7760,
30798
31087
  "path": "../public/_nuxt/eb-garamond-vietnamese-400-normal.ifvNSiWx.woff"
30799
31088
  },
31089
+ "/_nuxt/entry.Bv_GCmPP.css": {
31090
+ "type": "text/css; charset=utf-8",
31091
+ "etag": "\"1c9b6-RizRBl9ggVXgI0fO8IO7Wg1f9NM\"",
31092
+ "mtime": "2026-09-06T08:07:40.933Z",
31093
+ "size": 117174,
31094
+ "path": "../public/_nuxt/entry.Bv_GCmPP.css"
31095
+ },
31096
+ "/_nuxt/eUGyJdiT.js": {
31097
+ "type": "text/javascript; charset=utf-8",
31098
+ "etag": "\"20aa-Rif3v+aNt91q54e4MLGobwnuKbg\"",
31099
+ "mtime": "2026-09-06T08:07:40.923Z",
31100
+ "size": 8362,
31101
+ "path": "../public/_nuxt/eUGyJdiT.js"
31102
+ },
31103
+ "/_nuxt/eHYnGew0.js": {
31104
+ "type": "text/javascript; charset=utf-8",
31105
+ "etag": "\"f919-Mna7yicjedSnPxQ5bWRqIqFwv4Y\"",
31106
+ "mtime": "2026-09-06T08:07:40.923Z",
31107
+ "size": 63769,
31108
+ "path": "../public/_nuxt/eHYnGew0.js"
31109
+ },
30800
31110
  "/_nuxt/G0qIw7Gq2.js": {
30801
31111
  "type": "text/javascript; charset=utf-8",
30802
31112
  "etag": "\"462-s/N+VoJiDplj3GORHgaIwAR+Uqk\"",
30803
- "mtime": "2026-09-05T18:48:20.541Z",
31113
+ "mtime": "2026-09-06T08:07:40.921Z",
30804
31114
  "size": 1122,
30805
31115
  "path": "../public/_nuxt/G0qIw7Gq2.js"
30806
31116
  },
30807
- "/_nuxt/geist-cyrillic-ext-wght-normal.DjL33-gN.woff2": {
30808
- "type": "font/woff2",
30809
- "etag": "\"1cfc-yYSDXNlt/tTRaj6rJo8ZMqvY7pQ\"",
30810
- "mtime": "2026-09-05T18:48:20.552Z",
30811
- "size": 7420,
30812
- "path": "../public/_nuxt/geist-cyrillic-ext-wght-normal.DjL33-gN.woff2"
30813
- },
30814
31117
  "/_nuxt/geist-cyrillic-wght-normal.BEAKL7Jp.woff2": {
30815
31118
  "type": "font/woff2",
30816
31119
  "etag": "\"3aec-5kpQSZEtAzzU5kdiuro3Zr2YR54\"",
30817
- "mtime": "2026-09-05T18:48:20.552Z",
31120
+ "mtime": "2026-09-06T08:07:40.933Z",
30818
31121
  "size": 15084,
30819
31122
  "path": "../public/_nuxt/geist-cyrillic-wght-normal.BEAKL7Jp.woff2"
30820
31123
  },
31124
+ "/_nuxt/geist-cyrillic-ext-wght-normal.DjL33-gN.woff2": {
31125
+ "type": "font/woff2",
31126
+ "etag": "\"1cfc-yYSDXNlt/tTRaj6rJo8ZMqvY7pQ\"",
31127
+ "mtime": "2026-09-06T08:07:40.933Z",
31128
+ "size": 7420,
31129
+ "path": "../public/_nuxt/geist-cyrillic-ext-wght-normal.DjL33-gN.woff2"
31130
+ },
30821
31131
  "/_nuxt/geist-latin-ext-wght-normal.DC-KSUi6.woff2": {
30822
31132
  "type": "font/woff2",
30823
31133
  "etag": "\"4080-mZu3Z7sOWqglha+kefNbUA9Pp+Q\"",
30824
- "mtime": "2026-09-05T18:48:20.552Z",
31134
+ "mtime": "2026-09-06T08:07:40.933Z",
30825
31135
  "size": 16512,
30826
31136
  "path": "../public/_nuxt/geist-latin-ext-wght-normal.DC-KSUi6.woff2"
30827
31137
  },
30828
- "/_nuxt/entry.5qf6EqfN.css": {
30829
- "type": "text/css; charset=utf-8",
30830
- "etag": "\"1bd29-YrzLBKwAnzQB0oErHEF/vGIWjcY\"",
30831
- "mtime": "2026-09-05T18:48:20.552Z",
30832
- "size": 113961,
30833
- "path": "../public/_nuxt/entry.5qf6EqfN.css"
31138
+ "/_nuxt/geist-mono-cyrillic-ext-wght-normal.X_5orZeX.woff2": {
31139
+ "type": "font/woff2",
31140
+ "etag": "\"1820-nQACIwCsmkduQK2CSMidMhmLR9U\"",
31141
+ "mtime": "2026-09-06T08:07:40.934Z",
31142
+ "size": 6176,
31143
+ "path": "../public/_nuxt/geist-mono-cyrillic-ext-wght-normal.X_5orZeX.woff2"
30834
31144
  },
30835
31145
  "/_nuxt/geist-latin-wght-normal.BgDaEnEv.woff2": {
30836
31146
  "type": "font/woff2",
30837
31147
  "etag": "\"72d8-9J+D7/6th5UzRxIgoFX9awJv47A\"",
30838
- "mtime": "2026-09-05T18:48:20.552Z",
31148
+ "mtime": "2026-09-06T08:07:40.934Z",
30839
31149
  "size": 29400,
30840
31150
  "path": "../public/_nuxt/geist-latin-wght-normal.BgDaEnEv.woff2"
30841
31151
  },
30842
31152
  "/_nuxt/geist-mono-cyrillic-wght-normal.DiZS0aHC.woff2": {
30843
31153
  "type": "font/woff2",
30844
31154
  "etag": "\"328c-3kQUs7xjzfvJdLvI58iU6DHlynA\"",
30845
- "mtime": "2026-09-05T18:48:20.552Z",
31155
+ "mtime": "2026-09-06T08:07:40.934Z",
30846
31156
  "size": 12940,
30847
31157
  "path": "../public/_nuxt/geist-mono-cyrillic-wght-normal.DiZS0aHC.woff2"
30848
31158
  },
30849
- "/_nuxt/geist-mono-cyrillic-ext-wght-normal.X_5orZeX.woff2": {
30850
- "type": "font/woff2",
30851
- "etag": "\"1820-nQACIwCsmkduQK2CSMidMhmLR9U\"",
30852
- "mtime": "2026-09-05T18:48:20.552Z",
30853
- "size": 6176,
30854
- "path": "../public/_nuxt/geist-mono-cyrillic-ext-wght-normal.X_5orZeX.woff2"
30855
- },
30856
- "/_nuxt/geist-mono-symbols2-wght-normal.CO5SzqOn.woff2": {
31159
+ "/_nuxt/geist-mono-latin-ext-wght-normal.Bwz-egvJ.woff2": {
30857
31160
  "type": "font/woff2",
30858
- "etag": "\"16b4-aZoLOGWoEYW7gmwZamfz5kTfFco\"",
30859
- "mtime": "2026-09-05T18:48:20.553Z",
30860
- "size": 5812,
30861
- "path": "../public/_nuxt/geist-mono-symbols2-wght-normal.CO5SzqOn.woff2"
31161
+ "etag": "\"3968-BV9ZbqWHVAcipAKX5y8la3JkUQs\"",
31162
+ "mtime": "2026-09-06T08:07:40.935Z",
31163
+ "size": 14696,
31164
+ "path": "../public/_nuxt/geist-mono-latin-ext-wght-normal.Bwz-egvJ.woff2"
30862
31165
  },
30863
31166
  "/_nuxt/geist-mono-latin-wght-normal.XN7g48iV.woff2": {
30864
31167
  "type": "font/woff2",
30865
31168
  "etag": "\"5a58-jDy+14PX7OhwqFZsiKzuRax9xZ8\"",
30866
- "mtime": "2026-09-05T18:48:20.553Z",
31169
+ "mtime": "2026-09-06T08:07:40.935Z",
30867
31170
  "size": 23128,
30868
31171
  "path": "../public/_nuxt/geist-mono-latin-wght-normal.XN7g48iV.woff2"
30869
31172
  },
30870
- "/_nuxt/geist-mono-latin-ext-wght-normal.Bwz-egvJ.woff2": {
30871
- "type": "font/woff2",
30872
- "etag": "\"3968-BV9ZbqWHVAcipAKX5y8la3JkUQs\"",
30873
- "mtime": "2026-09-05T18:48:20.553Z",
30874
- "size": 14696,
30875
- "path": "../public/_nuxt/geist-mono-latin-ext-wght-normal.Bwz-egvJ.woff2"
30876
- },
30877
31173
  "/_nuxt/geist-mono-vietnamese-wght-normal.DadHysG0.woff2": {
30878
31174
  "type": "font/woff2",
30879
31175
  "etag": "\"1e10-mpU2OlFk4DakDO4paRfgJ2LHDsM\"",
30880
- "mtime": "2026-09-05T18:48:20.553Z",
31176
+ "mtime": "2026-09-06T08:07:40.935Z",
30881
31177
  "size": 7696,
30882
31178
  "path": "../public/_nuxt/geist-mono-vietnamese-wght-normal.DadHysG0.woff2"
30883
31179
  },
31180
+ "/_nuxt/geist-mono-symbols2-wght-normal.CO5SzqOn.woff2": {
31181
+ "type": "font/woff2",
31182
+ "etag": "\"16b4-aZoLOGWoEYW7gmwZamfz5kTfFco\"",
31183
+ "mtime": "2026-09-06T08:07:40.935Z",
31184
+ "size": 5812,
31185
+ "path": "../public/_nuxt/geist-mono-symbols2-wght-normal.CO5SzqOn.woff2"
31186
+ },
30884
31187
  "/_nuxt/geist-vietnamese-wght-normal.6IgcOCM7.woff2": {
30885
31188
  "type": "font/woff2",
30886
31189
  "etag": "\"1f44-6MZ7/PEEOeDVF0eHI650KpwKQV8\"",
30887
- "mtime": "2026-09-05T18:48:20.553Z",
31190
+ "mtime": "2026-09-06T08:07:40.936Z",
30888
31191
  "size": 8004,
30889
31192
  "path": "../public/_nuxt/geist-vietnamese-wght-normal.6IgcOCM7.woff2"
30890
31193
  },
31194
+ "/_nuxt/hb_ceMJP.js": {
31195
+ "type": "text/javascript; charset=utf-8",
31196
+ "etag": "\"2404-kR4WdZ0CWZbFeOQtbFv9FcKLpLA\"",
31197
+ "mtime": "2026-09-06T08:07:40.923Z",
31198
+ "size": 9220,
31199
+ "path": "../public/_nuxt/hb_ceMJP.js"
31200
+ },
30891
31201
  "/_nuxt/HclGiUj8.js": {
30892
31202
  "type": "text/javascript; charset=utf-8",
30893
31203
  "etag": "\"4bb-OjUbx7m0dPDFUkNfZ4BuUs+1sHI\"",
30894
- "mtime": "2026-09-05T18:48:20.542Z",
31204
+ "mtime": "2026-09-06T08:07:40.921Z",
30895
31205
  "size": 1211,
30896
31206
  "path": "../public/_nuxt/HclGiUj8.js"
30897
31207
  },
30898
- "/_nuxt/ibm-plex-mono-cyrillic-400-normal.CEL4l2ZJ.woff": {
30899
- "type": "font/woff",
30900
- "etag": "\"1c24-wpeoT2YBcqJ4hbipsoiB1m58w98\"",
30901
- "mtime": "2026-09-05T18:48:20.553Z",
30902
- "size": 7204,
30903
- "path": "../public/_nuxt/ibm-plex-mono-cyrillic-400-normal.CEL4l2ZJ.woff"
30904
- },
30905
31208
  "/_nuxt/ibm-plex-mono-cyrillic-400-normal.BSMlKf0J.woff2": {
30906
31209
  "type": "font/woff2",
30907
31210
  "etag": "\"20a4-mDbzFbXDuciYuRDdYbcJkcocaWU\"",
30908
- "mtime": "2026-09-05T18:48:20.553Z",
31211
+ "mtime": "2026-09-06T08:07:40.936Z",
30909
31212
  "size": 8356,
30910
31213
  "path": "../public/_nuxt/ibm-plex-mono-cyrillic-400-normal.BSMlKf0J.woff2"
30911
31214
  },
30912
31215
  "/_nuxt/ibm-plex-mono-cyrillic-500-normal.Ael50iVv.woff": {
30913
31216
  "type": "font/woff",
30914
31217
  "etag": "\"1c28-50yap58S0sLYRB2B8AEk2dq82kg\"",
30915
- "mtime": "2026-09-05T18:48:20.553Z",
31218
+ "mtime": "2026-09-06T08:07:40.936Z",
30916
31219
  "size": 7208,
30917
31220
  "path": "../public/_nuxt/ibm-plex-mono-cyrillic-500-normal.Ael50iVv.woff"
30918
31221
  },
31222
+ "/_nuxt/ibm-plex-mono-cyrillic-400-normal.CEL4l2ZJ.woff": {
31223
+ "type": "font/woff",
31224
+ "etag": "\"1c24-wpeoT2YBcqJ4hbipsoiB1m58w98\"",
31225
+ "mtime": "2026-09-06T08:07:40.936Z",
31226
+ "size": 7204,
31227
+ "path": "../public/_nuxt/ibm-plex-mono-cyrillic-400-normal.CEL4l2ZJ.woff"
31228
+ },
30919
31229
  "/_nuxt/ibm-plex-mono-cyrillic-500-normal.Bq9vWWag.woff2": {
30920
31230
  "type": "font/woff2",
30921
31231
  "etag": "\"210c-yqAnW+098RkHUvQzwj27Jo9sIUc\"",
30922
- "mtime": "2026-09-05T18:48:20.554Z",
31232
+ "mtime": "2026-09-06T08:07:40.936Z",
30923
31233
  "size": 8460,
30924
31234
  "path": "../public/_nuxt/ibm-plex-mono-cyrillic-500-normal.Bq9vWWag.woff2"
30925
31235
  },
30926
31236
  "/_nuxt/ibm-plex-mono-cyrillic-600-normal.CTOM6hUh.woff2": {
30927
31237
  "type": "font/woff2",
30928
31238
  "etag": "\"2488-WHfw+ZaOHy8HhYaV0AzfKZ8dozA\"",
30929
- "mtime": "2026-09-05T18:48:20.554Z",
31239
+ "mtime": "2026-09-06T08:07:40.936Z",
30930
31240
  "size": 9352,
30931
31241
  "path": "../public/_nuxt/ibm-plex-mono-cyrillic-600-normal.CTOM6hUh.woff2"
30932
31242
  },
30933
- "/_nuxt/ibm-plex-mono-cyrillic-ext-400-normal.DMdlQ8Kv.woff": {
30934
- "type": "font/woff",
30935
- "etag": "\"16bc-GBHBT1lClOFRLkxzjkkoZV1QN+Y\"",
30936
- "mtime": "2026-09-05T18:48:20.554Z",
30937
- "size": 5820,
30938
- "path": "../public/_nuxt/ibm-plex-mono-cyrillic-ext-400-normal.DMdlQ8Kv.woff"
30939
- },
30940
31243
  "/_nuxt/ibm-plex-mono-cyrillic-ext-400-normal.xuaO2J-f.woff2": {
30941
31244
  "type": "font/woff2",
30942
31245
  "etag": "\"1b00-w57wcK5m30ZZ4sBwsaWzlcI3F7c\"",
30943
- "mtime": "2026-09-05T18:48:20.554Z",
31246
+ "mtime": "2026-09-06T08:07:40.937Z",
30944
31247
  "size": 6912,
30945
31248
  "path": "../public/_nuxt/ibm-plex-mono-cyrillic-ext-400-normal.xuaO2J-f.woff2"
30946
31249
  },
31250
+ "/_nuxt/ibm-plex-mono-cyrillic-ext-400-normal.DMdlQ8Kv.woff": {
31251
+ "type": "font/woff",
31252
+ "etag": "\"16bc-GBHBT1lClOFRLkxzjkkoZV1QN+Y\"",
31253
+ "mtime": "2026-09-06T08:07:40.937Z",
31254
+ "size": 5820,
31255
+ "path": "../public/_nuxt/ibm-plex-mono-cyrillic-ext-400-normal.DMdlQ8Kv.woff"
31256
+ },
30947
31257
  "/_nuxt/ibm-plex-mono-cyrillic-600-normal.fLZuRloM.woff": {
30948
31258
  "type": "font/woff",
30949
31259
  "etag": "\"1c64-t3eBraFEv1B6D+DIfK23+8/F2mA\"",
30950
- "mtime": "2026-09-05T18:48:20.554Z",
31260
+ "mtime": "2026-09-06T08:07:40.937Z",
30951
31261
  "size": 7268,
30952
31262
  "path": "../public/_nuxt/ibm-plex-mono-cyrillic-600-normal.fLZuRloM.woff"
30953
31263
  },
30954
31264
  "/_nuxt/ibm-plex-mono-cyrillic-ext-500-normal.BIfNGwUT.woff": {
30955
31265
  "type": "font/woff",
30956
31266
  "etag": "\"168c-gvDCX7ATl9g9LbPEKlQjJSXhRPw\"",
30957
- "mtime": "2026-09-05T18:48:20.554Z",
31267
+ "mtime": "2026-09-06T08:07:40.937Z",
30958
31268
  "size": 5772,
30959
31269
  "path": "../public/_nuxt/ibm-plex-mono-cyrillic-ext-500-normal.BIfNGwUT.woff"
30960
31270
  },
31271
+ "/_nuxt/ibm-plex-mono-cyrillic-ext-500-normal.BqneJy0T.woff2": {
31272
+ "type": "font/woff2",
31273
+ "etag": "\"1b3c-pFin0Xk9XlGLhqdo1+npFJkyQ5Y\"",
31274
+ "mtime": "2026-09-06T08:07:40.937Z",
31275
+ "size": 6972,
31276
+ "path": "../public/_nuxt/ibm-plex-mono-cyrillic-ext-500-normal.BqneJy0T.woff2"
31277
+ },
30961
31278
  "/_nuxt/ibm-plex-mono-cyrillic-ext-600-normal.9HEixskS.woff": {
30962
31279
  "type": "font/woff",
30963
31280
  "etag": "\"16a0-8RgtlGopOkBt2P4jKMMd7hk+D74\"",
30964
- "mtime": "2026-09-05T18:48:20.555Z",
31281
+ "mtime": "2026-09-06T08:07:40.938Z",
30965
31282
  "size": 5792,
30966
31283
  "path": "../public/_nuxt/ibm-plex-mono-cyrillic-ext-600-normal.9HEixskS.woff"
30967
31284
  },
30968
31285
  "/_nuxt/ibm-plex-mono-cyrillic-ext-600-normal.V-xxqcpd.woff2": {
30969
31286
  "type": "font/woff2",
30970
31287
  "etag": "\"1e0c-R9/TBUX2qLWGlHeC55LoggyLdII\"",
30971
- "mtime": "2026-09-05T18:48:20.555Z",
31288
+ "mtime": "2026-09-06T08:07:40.938Z",
30972
31289
  "size": 7692,
30973
31290
  "path": "../public/_nuxt/ibm-plex-mono-cyrillic-ext-600-normal.V-xxqcpd.woff2"
30974
31291
  },
30975
- "/_nuxt/ibm-plex-mono-cyrillic-ext-500-normal.BqneJy0T.woff2": {
30976
- "type": "font/woff2",
30977
- "etag": "\"1b3c-pFin0Xk9XlGLhqdo1+npFJkyQ5Y\"",
30978
- "mtime": "2026-09-05T18:48:20.554Z",
30979
- "size": 6972,
30980
- "path": "../public/_nuxt/ibm-plex-mono-cyrillic-ext-500-normal.BqneJy0T.woff2"
30981
- },
30982
- "/_nuxt/ibm-plex-mono-latin-500-normal.DSY6xOcd.woff2": {
31292
+ "/_nuxt/ibm-plex-mono-latin-400-normal.DMJ8VG8y.woff2": {
30983
31293
  "type": "font/woff2",
30984
- "etag": "\"3a28-0y8OBwGsYgQ4QBMagAznF6huTuI\"",
30985
- "mtime": "2026-09-05T18:48:20.555Z",
30986
- "size": 14888,
30987
- "path": "../public/_nuxt/ibm-plex-mono-latin-500-normal.DSY6xOcd.woff2"
31294
+ "etag": "\"3974-u4dQDjIEo6fGXWYzx5xchAw76NM\"",
31295
+ "mtime": "2026-09-06T08:07:40.938Z",
31296
+ "size": 14708,
31297
+ "path": "../public/_nuxt/ibm-plex-mono-latin-400-normal.DMJ8VG8y.woff2"
30988
31298
  },
30989
31299
  "/_nuxt/ibm-plex-mono-latin-400-normal.CvHOgSBP.woff": {
30990
31300
  "type": "font/woff",
30991
31301
  "etag": "\"3358-rWMSbc9cch7FBErQpfnWcshAYFM\"",
30992
- "mtime": "2026-09-05T18:48:20.555Z",
31302
+ "mtime": "2026-09-06T08:07:40.938Z",
30993
31303
  "size": 13144,
30994
31304
  "path": "../public/_nuxt/ibm-plex-mono-latin-400-normal.CvHOgSBP.woff"
30995
31305
  },
30996
- "/_nuxt/ibm-plex-mono-latin-400-normal.DMJ8VG8y.woff2": {
30997
- "type": "font/woff2",
30998
- "etag": "\"3974-u4dQDjIEo6fGXWYzx5xchAw76NM\"",
30999
- "mtime": "2026-09-05T18:48:20.555Z",
31000
- "size": 14708,
31001
- "path": "../public/_nuxt/ibm-plex-mono-latin-400-normal.DMJ8VG8y.woff2"
31002
- },
31003
31306
  "/_nuxt/ibm-plex-mono-latin-600-normal.BgSNZQsw.woff2": {
31004
31307
  "type": "font/woff2",
31005
31308
  "etag": "\"3d04-zppco6h02pIBwmMMXLe/qpaIwFI\"",
31006
- "mtime": "2026-09-05T18:48:20.555Z",
31309
+ "mtime": "2026-09-06T08:07:40.939Z",
31007
31310
  "size": 15620,
31008
31311
  "path": "../public/_nuxt/ibm-plex-mono-latin-600-normal.BgSNZQsw.woff2"
31009
31312
  },
31010
31313
  "/_nuxt/ibm-plex-mono-latin-500-normal.CB9ihrfo.woff": {
31011
31314
  "type": "font/woff",
31012
31315
  "etag": "\"3364-S8wip5no4QO46BFh3FPzQKpIOec\"",
31013
- "mtime": "2026-09-05T18:48:20.555Z",
31316
+ "mtime": "2026-09-06T08:07:40.938Z",
31014
31317
  "size": 13156,
31015
31318
  "path": "../public/_nuxt/ibm-plex-mono-latin-500-normal.CB9ihrfo.woff"
31016
31319
  },
31017
31320
  "/_nuxt/ibm-plex-mono-latin-600-normal.DWFSQ4vo.woff": {
31018
31321
  "type": "font/woff",
31019
31322
  "etag": "\"3398-D/GHpHo4zls8HLHH2boKeigB6S4\"",
31020
- "mtime": "2026-09-05T18:48:20.555Z",
31323
+ "mtime": "2026-09-06T08:07:40.939Z",
31021
31324
  "size": 13208,
31022
31325
  "path": "../public/_nuxt/ibm-plex-mono-latin-600-normal.DWFSQ4vo.woff"
31023
31326
  },
31024
- "/_nuxt/ibm-plex-mono-latin-ext-400-normal.BmRBH3aV.woff2": {
31327
+ "/_nuxt/ibm-plex-mono-latin-500-normal.DSY6xOcd.woff2": {
31025
31328
  "type": "font/woff2",
31026
- "etag": "\"3424-SvjO9SK9iRLLL61B4GuQJWQP62I\"",
31027
- "mtime": "2026-09-05T18:48:20.556Z",
31028
- "size": 13348,
31029
- "path": "../public/_nuxt/ibm-plex-mono-latin-ext-400-normal.BmRBH3aV.woff2"
31329
+ "etag": "\"3a28-0y8OBwGsYgQ4QBMagAznF6huTuI\"",
31330
+ "mtime": "2026-09-06T08:07:40.939Z",
31331
+ "size": 14888,
31332
+ "path": "../public/_nuxt/ibm-plex-mono-latin-500-normal.DSY6xOcd.woff2"
31030
31333
  },
31031
31334
  "/_nuxt/ibm-plex-mono-latin-ext-400-normal.D3D2R8hC.woff": {
31032
31335
  "type": "font/woff",
31033
31336
  "etag": "\"2df8-dfJwTWMZxHyGnUuJDGfpU4w2dLs\"",
31034
- "mtime": "2026-09-05T18:48:20.556Z",
31337
+ "mtime": "2026-09-06T08:07:40.939Z",
31035
31338
  "size": 11768,
31036
31339
  "path": "../public/_nuxt/ibm-plex-mono-latin-ext-400-normal.D3D2R8hC.woff"
31037
31340
  },
31341
+ "/_nuxt/ibm-plex-mono-latin-ext-400-normal.BmRBH3aV.woff2": {
31342
+ "type": "font/woff2",
31343
+ "etag": "\"3424-SvjO9SK9iRLLL61B4GuQJWQP62I\"",
31344
+ "mtime": "2026-09-06T08:07:40.939Z",
31345
+ "size": 13348,
31346
+ "path": "../public/_nuxt/ibm-plex-mono-latin-ext-400-normal.BmRBH3aV.woff2"
31347
+ },
31038
31348
  "/_nuxt/ibm-plex-mono-latin-ext-500-normal.CAhNIIs5.woff2": {
31039
31349
  "type": "font/woff2",
31040
31350
  "etag": "\"3478-PpQvQo59iHxPLcEUBhJfmFmCPuA\"",
31041
- "mtime": "2026-09-05T18:48:20.556Z",
31351
+ "mtime": "2026-09-06T08:07:40.940Z",
31042
31352
  "size": 13432,
31043
31353
  "path": "../public/_nuxt/ibm-plex-mono-latin-ext-500-normal.CAhNIIs5.woff2"
31044
31354
  },
31045
31355
  "/_nuxt/ibm-plex-mono-latin-ext-500-normal.CZ70TYgx.woff": {
31046
31356
  "type": "font/woff",
31047
31357
  "etag": "\"2df8-73sb1BUyjMsq70ppsdZBHEqWrtE\"",
31048
- "mtime": "2026-09-05T18:48:20.556Z",
31358
+ "mtime": "2026-09-06T08:07:40.940Z",
31049
31359
  "size": 11768,
31050
31360
  "path": "../public/_nuxt/ibm-plex-mono-latin-ext-500-normal.CZ70TYgx.woff"
31051
31361
  },
31052
- "/_nuxt/ibm-plex-mono-latin-ext-600-normal.D38SheWl.woff2": {
31053
- "type": "font/woff2",
31054
- "etag": "\"37f8-5XYRqKuMO2rN5QZqfj4VW8r2jSQ\"",
31055
- "mtime": "2026-09-05T18:48:20.557Z",
31056
- "size": 14328,
31057
- "path": "../public/_nuxt/ibm-plex-mono-latin-ext-600-normal.D38SheWl.woff2"
31058
- },
31059
31362
  "/_nuxt/ibm-plex-mono-latin-ext-600-normal.DmB0ttJJ.woff": {
31060
31363
  "type": "font/woff",
31061
31364
  "etag": "\"2e38-fOmVENNzEJaYqxODn6K5NAbrEJk\"",
31062
- "mtime": "2026-09-05T18:48:20.557Z",
31365
+ "mtime": "2026-09-06T08:07:40.941Z",
31063
31366
  "size": 11832,
31064
31367
  "path": "../public/_nuxt/ibm-plex-mono-latin-ext-600-normal.DmB0ttJJ.woff"
31065
31368
  },
31369
+ "/_nuxt/ibm-plex-mono-latin-ext-600-normal.D38SheWl.woff2": {
31370
+ "type": "font/woff2",
31371
+ "etag": "\"37f8-5XYRqKuMO2rN5QZqfj4VW8r2jSQ\"",
31372
+ "mtime": "2026-09-06T08:07:40.941Z",
31373
+ "size": 14328,
31374
+ "path": "../public/_nuxt/ibm-plex-mono-latin-ext-600-normal.D38SheWl.woff2"
31375
+ },
31066
31376
  "/_nuxt/ibm-plex-mono-vietnamese-400-normal.BulugwFq.woff2": {
31067
31377
  "type": "font/woff2",
31068
31378
  "etag": "\"16ec-bIkS18/YaTiWdOzfzp4pFXvLmqQ\"",
31069
- "mtime": "2026-09-05T18:48:20.557Z",
31379
+ "mtime": "2026-09-06T08:07:40.941Z",
31070
31380
  "size": 5868,
31071
31381
  "path": "../public/_nuxt/ibm-plex-mono-vietnamese-400-normal.BulugwFq.woff2"
31072
31382
  },
31073
31383
  "/_nuxt/ibm-plex-mono-vietnamese-500-normal.C8zxqsMH.woff": {
31074
31384
  "type": "font/woff",
31075
31385
  "etag": "\"15f0-mGuZIt/ndQFiw5uxmCOkhhWSxi4\"",
31076
- "mtime": "2026-09-05T18:48:20.557Z",
31386
+ "mtime": "2026-09-06T08:07:40.941Z",
31077
31387
  "size": 5616,
31078
31388
  "path": "../public/_nuxt/ibm-plex-mono-vietnamese-500-normal.C8zxqsMH.woff"
31079
31389
  },
31080
31390
  "/_nuxt/ibm-plex-mono-vietnamese-400-normal.DDuiU_S-.woff": {
31081
31391
  "type": "font/woff",
31082
31392
  "etag": "\"15f4-LdRX2sBB3T5WDAsZLCwBlsMYXPw\"",
31083
- "mtime": "2026-09-05T18:48:20.557Z",
31393
+ "mtime": "2026-09-06T08:07:40.941Z",
31084
31394
  "size": 5620,
31085
31395
  "path": "../public/_nuxt/ibm-plex-mono-vietnamese-400-normal.DDuiU_S-.woff"
31086
31396
  },
31087
31397
  "/_nuxt/ibm-plex-mono-vietnamese-500-normal.DZ4AoWbu.woff2": {
31088
31398
  "type": "font/woff2",
31089
31399
  "etag": "\"1798-7VDjg0E2ggd9c0kJDHNRh+Fu5E0\"",
31090
- "mtime": "2026-09-05T18:48:20.557Z",
31400
+ "mtime": "2026-09-06T08:07:40.941Z",
31091
31401
  "size": 6040,
31092
31402
  "path": "../public/_nuxt/ibm-plex-mono-vietnamese-500-normal.DZ4AoWbu.woff2"
31093
31403
  },
31094
31404
  "/_nuxt/ibm-plex-mono-vietnamese-600-normal.D2EvbN8M.woff2": {
31095
31405
  "type": "font/woff2",
31096
31406
  "etag": "\"1b14-ylPjcMKGVc4RbTi2G25N0MSlVNo\"",
31097
- "mtime": "2026-09-05T18:48:20.557Z",
31407
+ "mtime": "2026-09-06T08:07:40.942Z",
31098
31408
  "size": 6932,
31099
31409
  "path": "../public/_nuxt/ibm-plex-mono-vietnamese-600-normal.D2EvbN8M.woff2"
31100
31410
  },
31101
31411
  "/_nuxt/ibm-plex-mono-vietnamese-600-normal.iLQfcSjf.woff": {
31102
31412
  "type": "font/woff",
31103
31413
  "etag": "\"1650-9Pko0qRZ+EoISmnDaTRQ8KRGy/s\"",
31104
- "mtime": "2026-09-05T18:48:20.558Z",
31414
+ "mtime": "2026-09-06T08:07:40.942Z",
31105
31415
  "size": 5712,
31106
31416
  "path": "../public/_nuxt/ibm-plex-mono-vietnamese-600-normal.iLQfcSjf.woff"
31107
31417
  },
31108
31418
  "/_nuxt/kZl6yT-12.js": {
31109
31419
  "type": "text/javascript; charset=utf-8",
31110
31420
  "etag": "\"e9-t0VKevMurw+ruGbCV/EgmcM2dww\"",
31111
- "mtime": "2026-09-05T18:48:20.543Z",
31421
+ "mtime": "2026-09-06T08:07:40.924Z",
31112
31422
  "size": 233,
31113
31423
  "path": "../public/_nuxt/kZl6yT-12.js"
31114
31424
  },
31115
31425
  "/_nuxt/kZV5TQvh2.js": {
31116
31426
  "type": "text/javascript; charset=utf-8",
31117
31427
  "etag": "\"b36-HJpEm4SThB06CEAVNx2ouDQlwFw\"",
31118
- "mtime": "2026-09-05T18:48:20.543Z",
31428
+ "mtime": "2026-09-06T08:07:40.923Z",
31119
31429
  "size": 2870,
31120
31430
  "path": "../public/_nuxt/kZV5TQvh2.js"
31121
31431
  },
31122
31432
  "/_nuxt/lO5tpDZ5.js": {
31123
31433
  "type": "text/javascript; charset=utf-8",
31124
31434
  "etag": "\"3b-z4jypkmUW9c9v+AALQ28pDyJ80A\"",
31125
- "mtime": "2026-09-05T18:48:20.544Z",
31435
+ "mtime": "2026-09-06T08:07:40.924Z",
31126
31436
  "size": 59,
31127
31437
  "path": "../public/_nuxt/lO5tpDZ5.js"
31128
31438
  },
31129
- "/_nuxt/logs.BO-BSyjm.css": {
31439
+ "/_nuxt/kkEthL84.js": {
31440
+ "type": "text/javascript; charset=utf-8",
31441
+ "etag": "\"1c85b-rndZIGE/0sbN/dsGvCDYNjDmhrs\"",
31442
+ "mtime": "2026-09-06T08:07:40.924Z",
31443
+ "size": 116827,
31444
+ "path": "../public/_nuxt/kkEthL84.js"
31445
+ },
31446
+ "/_nuxt/logs.BS1sb41K.css": {
31130
31447
  "type": "text/css; charset=utf-8",
31131
- "etag": "\"1635-oLZsusF3NVkvz+WVroCfL6psPFE\"",
31132
- "mtime": "2026-09-05T18:48:20.558Z",
31448
+ "etag": "\"1635-lMZop5du3sVLv4O11u3L5K8ZoeM\"",
31449
+ "mtime": "2026-09-06T08:07:40.942Z",
31133
31450
  "size": 5685,
31134
- "path": "../public/_nuxt/logs.BO-BSyjm.css"
31451
+ "path": "../public/_nuxt/logs.BS1sb41K.css"
31135
31452
  },
31136
31453
  "/_nuxt/monitor.CmwpEUCI.css": {
31137
31454
  "type": "text/css; charset=utf-8",
31138
31455
  "etag": "\"483-Lotbm40sJjjryRjOid43sPWucRw\"",
31139
- "mtime": "2026-09-05T18:48:20.558Z",
31456
+ "mtime": "2026-09-06T08:07:40.942Z",
31140
31457
  "size": 1155,
31141
31458
  "path": "../public/_nuxt/monitor.CmwpEUCI.css"
31142
31459
  },
31143
31460
  "/_nuxt/niDwBOZW.js": {
31144
31461
  "type": "text/javascript; charset=utf-8",
31145
31462
  "etag": "\"12f1-JlgzqHJQENBszEGLuO9fMyRYm/E\"",
31146
- "mtime": "2026-09-05T18:48:20.544Z",
31463
+ "mtime": "2026-09-06T08:07:40.924Z",
31147
31464
  "size": 4849,
31148
31465
  "path": "../public/_nuxt/niDwBOZW.js"
31149
31466
  },
31150
31467
  "/_nuxt/OmpTerminalPanel.B_Pl5Ynm.css": {
31151
31468
  "type": "text/css; charset=utf-8",
31152
31469
  "etag": "\"10d0-uLyus3YRLFfRIoYhlKCERpGIwVE\"",
31153
- "mtime": "2026-09-05T18:48:20.545Z",
31470
+ "mtime": "2026-09-06T08:07:40.925Z",
31154
31471
  "size": 4304,
31155
31472
  "path": "../public/_nuxt/OmpTerminalPanel.B_Pl5Ynm.css"
31156
31473
  },
31157
- "/_nuxt/OV6PBW2z.js": {
31474
+ "/_nuxt/ORt9oDIy2.js": {
31158
31475
  "type": "text/javascript; charset=utf-8",
31159
- "etag": "\"1a88-OuP6OGdPStac2ADrALDpl6jy1yE\"",
31160
- "mtime": "2026-09-05T18:48:20.542Z",
31161
- "size": 6792,
31162
- "path": "../public/_nuxt/OV6PBW2z.js"
31476
+ "etag": "\"c42-g+2xQOk5SmNd8dk4LSqx7FrSVE0\"",
31477
+ "mtime": "2026-09-06T08:07:40.921Z",
31478
+ "size": 3138,
31479
+ "path": "../public/_nuxt/ORt9oDIy2.js"
31163
31480
  },
31164
- "/_nuxt/pages.CytEOfUs.css": {
31481
+ "/_nuxt/pages.BkE-AfIb.css": {
31165
31482
  "type": "text/css; charset=utf-8",
31166
- "etag": "\"1f78-Zc87Z5OhCuyS/CdNTE5IMJgqhH0\"",
31167
- "mtime": "2026-09-05T18:48:20.558Z",
31483
+ "etag": "\"1f78-4k4EvKWp5iUvKtA4CjhB7L8WifI\"",
31484
+ "mtime": "2026-09-06T08:07:40.943Z",
31168
31485
  "size": 8056,
31169
- "path": "../public/_nuxt/pages.CytEOfUs.css"
31486
+ "path": "../public/_nuxt/pages.BkE-AfIb.css"
31170
31487
  },
31171
- "/_nuxt/MyA0Oeqd.js": {
31172
- "type": "text/javascript; charset=utf-8",
31173
- "etag": "\"28a2e-MjJZfUvupE+wXFYYArQlEz2SAbk\"",
31174
- "mtime": "2026-09-05T18:48:20.542Z",
31175
- "size": 166446,
31176
- "path": "../public/_nuxt/MyA0Oeqd.js"
31488
+ "/_nuxt/permissions.DTRtZeTw.css": {
31489
+ "type": "text/css; charset=utf-8",
31490
+ "etag": "\"4c8-9re0o0yfSvROlGQZhstmHhHfzlE\"",
31491
+ "mtime": "2026-09-06T08:07:40.943Z",
31492
+ "size": 1224,
31493
+ "path": "../public/_nuxt/permissions.DTRtZeTw.css"
31494
+ },
31495
+ "/_nuxt/plugins.BcSEwwGb.css": {
31496
+ "type": "text/css; charset=utf-8",
31497
+ "etag": "\"a50-JjpuKXTJQUZDH3PRepA186REfG4\"",
31498
+ "mtime": "2026-09-06T08:07:40.943Z",
31499
+ "size": 2640,
31500
+ "path": "../public/_nuxt/plugins.BcSEwwGb.css"
31177
31501
  },
31178
- "/_nuxt/pKv_VWR4.js": {
31502
+ "/_nuxt/QoCzfpo2.js": {
31179
31503
  "type": "text/javascript; charset=utf-8",
31180
- "etag": "\"2405-xQKYKu5L7qjIzeic95lM0ERNS8M\"",
31181
- "mtime": "2026-09-05T18:48:20.544Z",
31182
- "size": 9221,
31183
- "path": "../public/_nuxt/pKv_VWR4.js"
31504
+ "etag": "\"22a4-SrGVCoHXHudcEctvNqU+aTlWgyg\"",
31505
+ "mtime": "2026-09-06T08:07:40.921Z",
31506
+ "size": 8868,
31507
+ "path": "../public/_nuxt/QoCzfpo2.js"
31184
31508
  },
31185
- "/_nuxt/plugins.Clsky_kl.css": {
31186
- "type": "text/css; charset=utf-8",
31187
- "etag": "\"a22-6XqjlTw44n7uzNJ8R9pxD9C1f58\"",
31188
- "mtime": "2026-09-05T18:48:20.558Z",
31189
- "size": 2594,
31190
- "path": "../public/_nuxt/plugins.Clsky_kl.css"
31509
+ "/_nuxt/RYFtK4qZ2.js": {
31510
+ "type": "text/javascript; charset=utf-8",
31511
+ "etag": "\"594c-ZHrAodAyz6fWAruZCqluWn052zA\"",
31512
+ "mtime": "2026-09-06T08:07:40.922Z",
31513
+ "size": 22860,
31514
+ "path": "../public/_nuxt/RYFtK4qZ2.js"
31191
31515
  },
31192
31516
  "/_nuxt/rqZ-1SoP.js": {
31193
31517
  "type": "text/javascript; charset=utf-8",
31194
31518
  "etag": "\"761d-n3nYYQYIxdnAu9GaImKE7k1Xy7Y\"",
31195
- "mtime": "2026-09-05T18:48:20.544Z",
31519
+ "mtime": "2026-09-06T08:07:40.924Z",
31196
31520
  "size": 30237,
31197
31521
  "path": "../public/_nuxt/rqZ-1SoP.js"
31198
31522
  },
31199
- "/_nuxt/settings.DeRNNUcP.css": {
31200
- "type": "text/css; charset=utf-8",
31201
- "etag": "\"14e1-E7dYiYwz16rJpF2sfkfQq3pGU1c\"",
31202
- "mtime": "2026-09-05T18:48:20.559Z",
31203
- "size": 5345,
31204
- "path": "../public/_nuxt/settings.DeRNNUcP.css"
31205
- },
31206
- "/_nuxt/RYFtK4qZ2.js": {
31523
+ "/_nuxt/RzXYI9FM.js": {
31207
31524
  "type": "text/javascript; charset=utf-8",
31208
- "etag": "\"594c-ZHrAodAyz6fWAruZCqluWn052zA\"",
31209
- "mtime": "2026-09-05T18:48:20.542Z",
31210
- "size": 22860,
31211
- "path": "../public/_nuxt/RYFtK4qZ2.js"
31525
+ "etag": "\"9a6b-hWs9hqxsYAIn7EKAMQfiXbHC5bw\"",
31526
+ "mtime": "2026-09-06T08:07:40.922Z",
31527
+ "size": 39531,
31528
+ "path": "../public/_nuxt/RzXYI9FM.js"
31212
31529
  },
31213
- "/_nuxt/town.BLrD9-WH.css": {
31530
+ "/_nuxt/settings.BqMF2nfj.css": {
31214
31531
  "type": "text/css; charset=utf-8",
31215
- "etag": "\"64-INqlNEwsg1I+Dzc8LaEkJCLno5o\"",
31216
- "mtime": "2026-09-05T18:48:20.559Z",
31217
- "size": 100,
31218
- "path": "../public/_nuxt/town.BLrD9-WH.css"
31532
+ "etag": "\"14e1-XjxEHtGImiK+UJc+jkb4oOU898E\"",
31533
+ "mtime": "2026-09-06T08:07:40.943Z",
31534
+ "size": 5345,
31535
+ "path": "../public/_nuxt/settings.BqMF2nfj.css"
31219
31536
  },
31220
31537
  "/_nuxt/teams.CUMnbQGf.css": {
31221
31538
  "type": "text/css; charset=utf-8",
31222
31539
  "etag": "\"6b7-g1G8KL1N00xQbucKbHyHr3V6KOg\"",
31223
- "mtime": "2026-09-05T18:48:20.559Z",
31540
+ "mtime": "2026-09-06T08:07:40.943Z",
31224
31541
  "size": 1719,
31225
31542
  "path": "../public/_nuxt/teams.CUMnbQGf.css"
31226
31543
  },
31227
- "/_nuxt/town.C_DsNW0J.css": {
31544
+ "/_nuxt/tokens.rW1xHxRW.css": {
31228
31545
  "type": "text/css; charset=utf-8",
31229
- "etag": "\"3b2-lx8uIK7y3f1Nkj2gMcTuak3mB/I\"",
31230
- "mtime": "2026-09-05T18:48:20.559Z",
31231
- "size": 946,
31232
- "path": "../public/_nuxt/town.C_DsNW0J.css"
31546
+ "etag": "\"9cd-hrb0z9L9Q1QW+qFELSWPTH41I/8\"",
31547
+ "mtime": "2026-09-06T08:07:40.943Z",
31548
+ "size": 2509,
31549
+ "path": "../public/_nuxt/tokens.rW1xHxRW.css"
31233
31550
  },
31234
- "/_nuxt/tokens.BPLe9ioQ.css": {
31551
+ "/_nuxt/town.BLrD9-WH.css": {
31235
31552
  "type": "text/css; charset=utf-8",
31236
- "etag": "\"9cd-147MQyZ2Ox0eBoOzCqzEBTE6A1w\"",
31237
- "mtime": "2026-09-05T18:48:20.559Z",
31238
- "size": 2509,
31239
- "path": "../public/_nuxt/tokens.BPLe9ioQ.css"
31553
+ "etag": "\"64-INqlNEwsg1I+Dzc8LaEkJCLno5o\"",
31554
+ "mtime": "2026-09-06T08:07:40.944Z",
31555
+ "size": 100,
31556
+ "path": "../public/_nuxt/town.BLrD9-WH.css"
31240
31557
  },
31241
31558
  "/_nuxt/TownView.BHLKAjEu.css": {
31242
31559
  "type": "text/css; charset=utf-8",
31243
31560
  "etag": "\"11b2a-iRw/kbvCuxhjwK4gMYcSwCJYIEk\"",
31244
- "mtime": "2026-09-05T18:48:20.545Z",
31561
+ "mtime": "2026-09-06T08:07:40.925Z",
31245
31562
  "size": 72490,
31246
31563
  "path": "../public/_nuxt/TownView.BHLKAjEu.css"
31247
31564
  },
31248
- "/_nuxt/users.D8lcLE62.css": {
31249
- "type": "text/css; charset=utf-8",
31250
- "etag": "\"2f7-vPqmiQmG+gTnKc25vyRnF3nNTy0\"",
31251
- "mtime": "2026-09-05T18:48:20.560Z",
31252
- "size": 759,
31253
- "path": "../public/_nuxt/users.D8lcLE62.css"
31254
- },
31255
- "/_nuxt/u7KWCGSb.js": {
31256
- "type": "text/javascript; charset=utf-8",
31257
- "etag": "\"3348-dHLPellbGHVZ5EamK1rpRZfN4OQ\"",
31258
- "mtime": "2026-09-05T18:48:20.544Z",
31259
- "size": 13128,
31260
- "path": "../public/_nuxt/u7KWCGSb.js"
31261
- },
31262
31565
  "/_nuxt/vJ4FPb-_.js": {
31263
31566
  "type": "text/javascript; charset=utf-8",
31264
31567
  "etag": "\"496e-HYp1zkNZ5UP5CkmOCjjlTOlpRAA\"",
31265
- "mtime": "2026-09-05T18:48:20.545Z",
31568
+ "mtime": "2026-09-06T08:07:40.925Z",
31266
31569
  "size": 18798,
31267
31570
  "path": "../public/_nuxt/vJ4FPb-_.js"
31268
31571
  },
31269
- "/_nuxt/workshop.BIdoGfoC.css": {
31572
+ "/_nuxt/town.C_DsNW0J.css": {
31270
31573
  "type": "text/css; charset=utf-8",
31271
- "etag": "\"d1c-u7eiOCnZLnH0C1d+mXWsSkBFJOI\"",
31272
- "mtime": "2026-09-05T18:48:20.560Z",
31273
- "size": 3356,
31274
- "path": "../public/_nuxt/workshop.BIdoGfoC.css"
31574
+ "etag": "\"3b2-lx8uIK7y3f1Nkj2gMcTuak3mB/I\"",
31575
+ "mtime": "2026-09-06T08:07:40.944Z",
31576
+ "size": 946,
31577
+ "path": "../public/_nuxt/town.C_DsNW0J.css"
31275
31578
  },
31276
- "/_nuxt/wirVyscc.js": {
31277
- "type": "text/javascript; charset=utf-8",
31278
- "etag": "\"1285-2DSy7SejsFZSSxlWC2oD7KdPFW4\"",
31279
- "mtime": "2026-09-05T18:48:20.545Z",
31280
- "size": 4741,
31281
- "path": "../public/_nuxt/wirVyscc.js"
31282
- },
31283
- "/_nuxt/_id_.DIxEKj88.css": {
31579
+ "/_nuxt/users.D8lcLE62.css": {
31284
31580
  "type": "text/css; charset=utf-8",
31285
- "etag": "\"1564-kqE2azzqPk0lKOVi0vRsIBIu7UM\"",
31286
- "mtime": "2026-09-05T18:48:20.545Z",
31287
- "size": 5476,
31288
- "path": "../public/_nuxt/_id_.DIxEKj88.css"
31581
+ "etag": "\"2f7-vPqmiQmG+gTnKc25vyRnF3nNTy0\"",
31582
+ "mtime": "2026-09-06T08:07:40.944Z",
31583
+ "size": 759,
31584
+ "path": "../public/_nuxt/users.D8lcLE62.css"
31289
31585
  },
31290
31586
  "/_nuxt/VLI2Zy4t.js": {
31291
31587
  "type": "text/javascript; charset=utf-8",
31292
31588
  "etag": "\"79db-1zvdkTTeWhTS0A+KbRz0/ud/ntw\"",
31293
- "mtime": "2026-09-05T18:48:20.543Z",
31589
+ "mtime": "2026-09-06T08:07:40.922Z",
31294
31590
  "size": 31195,
31295
31591
  "path": "../public/_nuxt/VLI2Zy4t.js"
31296
31592
  },
31593
+ "/_nuxt/workshop.CbymC2LY.css": {
31594
+ "type": "text/css; charset=utf-8",
31595
+ "etag": "\"d1c-YQcbvHheVnY14BKtJSxnL4w6r4Y\"",
31596
+ "mtime": "2026-09-06T08:07:40.944Z",
31597
+ "size": 3356,
31598
+ "path": "../public/_nuxt/workshop.CbymC2LY.css"
31599
+ },
31600
+ "/_nuxt/zVkqCZ78.js": {
31601
+ "type": "text/javascript; charset=utf-8",
31602
+ "etag": "\"e583-atAfcqj4nxxk6KUzDMuv2R/bDCg\"",
31603
+ "mtime": "2026-09-06T08:07:40.925Z",
31604
+ "size": 58755,
31605
+ "path": "../public/_nuxt/zVkqCZ78.js"
31606
+ },
31297
31607
  "/_nuxt/_id_.DTvjd6VN.css": {
31298
31608
  "type": "text/css; charset=utf-8",
31299
31609
  "etag": "\"36e7-Um0hcCUBU5cd8ESeOGJffLOJkG8\"",
31300
- "mtime": "2026-09-05T18:48:20.545Z",
31610
+ "mtime": "2026-09-06T08:07:40.926Z",
31301
31611
  "size": 14055,
31302
31612
  "path": "../public/_nuxt/_id_.DTvjd6VN.css"
31303
31613
  },
31304
- "/_nuxt/_wsId_.BFyCuUwS.css": {
31614
+ "/_nuxt/_id_.DIxEKj88.css": {
31305
31615
  "type": "text/css; charset=utf-8",
31306
- "etag": "\"11059-fUcBwBRjCr5Nger7gVc5ZTCEb1o\"",
31307
- "mtime": "2026-09-05T18:48:20.546Z",
31308
- "size": 69721,
31309
- "path": "../public/_nuxt/_wsId_.BFyCuUwS.css"
31616
+ "etag": "\"1564-kqE2azzqPk0lKOVi0vRsIBIu7UM\"",
31617
+ "mtime": "2026-09-06T08:07:40.925Z",
31618
+ "size": 5476,
31619
+ "path": "../public/_nuxt/_id_.DIxEKj88.css"
31310
31620
  },
31311
31621
  "/assets/game/coin.png": {
31312
31622
  "type": "image/png",
@@ -31315,6 +31625,20 @@ const assets = {
31315
31625
  "size": 6733,
31316
31626
  "path": "../public/assets/game/coin.png"
31317
31627
  },
31628
+ "/assets/game/player-sheet.png": {
31629
+ "type": "image/png",
31630
+ "etag": "\"2742-xHFqZq17XtbQVhapFMWJpVb0W5o\"",
31631
+ "mtime": "2026-08-25T12:20:54.514Z",
31632
+ "size": 10050,
31633
+ "path": "../public/assets/game/player-sheet.png"
31634
+ },
31635
+ "/_nuxt/_wsId_.BFyCuUwS.css": {
31636
+ "type": "text/css; charset=utf-8",
31637
+ "etag": "\"11059-fUcBwBRjCr5Nger7gVc5ZTCEb1o\"",
31638
+ "mtime": "2026-09-06T08:07:40.926Z",
31639
+ "size": 69721,
31640
+ "path": "../public/_nuxt/_wsId_.BFyCuUwS.css"
31641
+ },
31318
31642
  "/assets/game/tuxemon-town.json": {
31319
31643
  "type": "application/json",
31320
31644
  "etag": "\"fec5-uB5TWkwSxd0G5Tiupl3I0+u94XM\"",
@@ -31322,12 +31646,12 @@ const assets = {
31322
31646
  "size": 65221,
31323
31647
  "path": "../public/assets/game/tuxemon-town.json"
31324
31648
  },
31325
- "/assets/game/player-sheet.png": {
31326
- "type": "image/png",
31327
- "etag": "\"2742-xHFqZq17XtbQVhapFMWJpVb0W5o\"",
31328
- "mtime": "2026-08-25T12:20:54.514Z",
31329
- "size": 10050,
31330
- "path": "../public/assets/game/player-sheet.png"
31649
+ "/_nuxt/builds/latest.json": {
31650
+ "type": "application/json",
31651
+ "etag": "\"47-qDccb/InmBCvCI/goUm7hH7Z94U\"",
31652
+ "mtime": "2026-09-06T08:07:46.121Z",
31653
+ "size": 71,
31654
+ "path": "../public/_nuxt/builds/latest.json"
31331
31655
  },
31332
31656
  "/scene/background/cyber-town-background.svg": {
31333
31657
  "type": "image/svg+xml",
@@ -31336,19 +31660,89 @@ const assets = {
31336
31660
  "size": 5718,
31337
31661
  "path": "../public/scene/background/cyber-town-background.svg"
31338
31662
  },
31339
- "/_nuxt/builds/latest.json": {
31340
- "type": "application/json",
31341
- "etag": "\"47-GDqaVI/lOhYE3WbtBwlSHrID4h8\"",
31342
- "mtime": "2026-09-05T18:48:24.622Z",
31343
- "size": 71,
31344
- "path": "../public/_nuxt/builds/latest.json"
31345
- },
31346
- "/assets/game/character/bot.png": {
31663
+ "/assets/game/tuxmon-sample-32px-extruded.png": {
31347
31664
  "type": "image/png",
31348
- "etag": "\"36fe-Ke8vj83Dinp8fFaRQQBfBsTGI/8\"",
31349
- "mtime": "2026-08-25T12:20:54.510Z",
31350
- "size": 14078,
31351
- "path": "../public/assets/game/character/bot.png"
31665
+ "etag": "\"2ee08-3yTsAqzTx0djGCGVAEgUGQ1/MEg\"",
31666
+ "mtime": "2026-08-25T12:20:54.518Z",
31667
+ "size": 192008,
31668
+ "path": "../public/assets/game/tuxmon-sample-32px-extruded.png"
31669
+ },
31670
+ "/assets/game/devices/caster.glb": {
31671
+ "type": "model/gltf-binary",
31672
+ "etag": "\"5874-Qd988sa7u1y3lgH8K/zhzRLbRbs\"",
31673
+ "mtime": "2026-08-27T07:03:12.510Z",
31674
+ "size": 22644,
31675
+ "path": "../public/assets/game/devices/caster.glb"
31676
+ },
31677
+ "/assets/game/devices/device-console.glb": {
31678
+ "type": "model/gltf-binary",
31679
+ "etag": "\"3984-GibNFJHAqtYWIxLy79rzU1HZAds\"",
31680
+ "mtime": "2026-08-26T05:23:14.559Z",
31681
+ "size": 14724,
31682
+ "path": "../public/assets/game/devices/device-console.glb"
31683
+ },
31684
+ "/assets/game/devices/agv.glb": {
31685
+ "type": "model/gltf-binary",
31686
+ "etag": "\"b0ec-SGRGNfFN89F7v1GROXKGve7pQqs\"",
31687
+ "mtime": "2026-08-27T07:03:12.531Z",
31688
+ "size": 45292,
31689
+ "path": "../public/assets/game/devices/agv.glb"
31690
+ },
31691
+ "/assets/game/devices/device-robot-arm.glb": {
31692
+ "type": "model/gltf-binary",
31693
+ "etag": "\"37fc-uBxMDklo0SfaA6KXZIylh/S2p+c\"",
31694
+ "mtime": "2026-08-26T05:23:14.560Z",
31695
+ "size": 14332,
31696
+ "path": "../public/assets/game/devices/device-robot-arm.glb"
31697
+ },
31698
+ "/assets/game/devices/device-scanner.glb": {
31699
+ "type": "model/gltf-binary",
31700
+ "etag": "\"28e0-uKYZaLiZiCedMMozKBOFU14HUSE\"",
31701
+ "mtime": "2026-08-26T05:23:14.560Z",
31702
+ "size": 10464,
31703
+ "path": "../public/assets/game/devices/device-scanner.glb"
31704
+ },
31705
+ "/assets/game/devices/extruder.glb": {
31706
+ "type": "model/gltf-binary",
31707
+ "etag": "\"18124-H6X1eQmFDn6eONUMGU6lGdQafZ8\"",
31708
+ "mtime": "2026-08-27T07:03:12.506Z",
31709
+ "size": 98596,
31710
+ "path": "../public/assets/game/devices/extruder.glb"
31711
+ },
31712
+ "/assets/game/devices/mdo.glb": {
31713
+ "type": "model/gltf-binary",
31714
+ "etag": "\"132e4-EDslgF5+17dSukguA0eZzN4I0+o\"",
31715
+ "mtime": "2026-08-27T07:03:12.518Z",
31716
+ "size": 78564,
31717
+ "path": "../public/assets/game/devices/mdo.glb"
31718
+ },
31719
+ "/assets/game/devices/power-cabinet.glb": {
31720
+ "type": "model/gltf-binary",
31721
+ "etag": "\"54f0-KsrAxig9JTAY5SGKK3jbdJXB6fk\"",
31722
+ "mtime": "2026-08-27T07:03:12.534Z",
31723
+ "size": 21744,
31724
+ "path": "../public/assets/game/devices/power-cabinet.glb"
31725
+ },
31726
+ "/assets/game/devices/pump.glb": {
31727
+ "type": "model/gltf-binary",
31728
+ "etag": "\"4bc8-yAiKZtO+P2bBmqfRvhlxcF0oduE\"",
31729
+ "mtime": "2026-08-25T12:20:54.512Z",
31730
+ "size": 19400,
31731
+ "path": "../public/assets/game/devices/pump.glb"
31732
+ },
31733
+ "/assets/game/devices/tdo.glb": {
31734
+ "type": "model/gltf-binary",
31735
+ "etag": "\"e10c-GdMX+mG/KrSVBzy4EeAPPjFoTqM\"",
31736
+ "mtime": "2026-08-27T07:03:12.523Z",
31737
+ "size": 57612,
31738
+ "path": "../public/assets/game/devices/tdo.glb"
31739
+ },
31740
+ "/assets/game/devices/winder.glb": {
31741
+ "type": "model/gltf-binary",
31742
+ "etag": "\"9084-N9S2enupsA8WyhEHtkIgQ+RBDV4\"",
31743
+ "mtime": "2026-08-27T07:03:12.526Z",
31744
+ "size": 36996,
31745
+ "path": "../public/assets/game/devices/winder.glb"
31352
31746
  },
31353
31747
  "/assets/game/character/device-3d.glb": {
31354
31748
  "type": "model/gltf-binary",
@@ -31357,12 +31751,19 @@ const assets = {
31357
31751
  "size": 19400,
31358
31752
  "path": "../public/assets/game/character/device-3d.glb"
31359
31753
  },
31360
- "/assets/game/tuxmon-sample-32px-extruded.png": {
31754
+ "/assets/game/devices/thickness-scanner.glb": {
31755
+ "type": "model/gltf-binary",
31756
+ "etag": "\"3480-WMTbMzRrl/6AJPzEIPhRW9xPugA\"",
31757
+ "mtime": "2026-08-27T07:03:12.527Z",
31758
+ "size": 13440,
31759
+ "path": "../public/assets/game/devices/thickness-scanner.glb"
31760
+ },
31761
+ "/assets/game/character/bot.png": {
31361
31762
  "type": "image/png",
31362
- "etag": "\"2ee08-3yTsAqzTx0djGCGVAEgUGQ1/MEg\"",
31363
- "mtime": "2026-08-25T12:20:54.518Z",
31364
- "size": 192008,
31365
- "path": "../public/assets/game/tuxmon-sample-32px-extruded.png"
31763
+ "etag": "\"36fe-Ke8vj83Dinp8fFaRQQBfBsTGI/8\"",
31764
+ "mtime": "2026-08-25T12:20:54.510Z",
31765
+ "size": 14078,
31766
+ "path": "../public/assets/game/character/bot.png"
31366
31767
  },
31367
31768
  "/assets/game/character/hero-3d.glb": {
31368
31769
  "type": "model/gltf-binary",
@@ -31371,6 +31772,13 @@ const assets = {
31371
31772
  "size": 33940,
31372
31773
  "path": "../public/assets/game/character/hero-3d.glb"
31373
31774
  },
31775
+ "/assets/game/character/hero-anime-1.glb": {
31776
+ "type": "model/gltf-binary",
31777
+ "etag": "\"1044c-AUMAdrW4S6OKEsUeAcR5c50fyKs\"",
31778
+ "mtime": "2026-08-26T05:23:14.557Z",
31779
+ "size": 66636,
31780
+ "path": "../public/assets/game/character/hero-anime-1.glb"
31781
+ },
31374
31782
  "/assets/game/character/hero-anime-2.glb": {
31375
31783
  "type": "model/gltf-binary",
31376
31784
  "etag": "\"1058c-J91UapGlsJg/5ODN8k8c7rSNpzw\"",
@@ -31378,12 +31786,12 @@ const assets = {
31378
31786
  "size": 66956,
31379
31787
  "path": "../public/assets/game/character/hero-anime-2.glb"
31380
31788
  },
31381
- "/assets/game/character/hero-anime-1.glb": {
31789
+ "/assets/game/character/hero-anime-3.glb": {
31382
31790
  "type": "model/gltf-binary",
31383
- "etag": "\"1044c-AUMAdrW4S6OKEsUeAcR5c50fyKs\"",
31384
- "mtime": "2026-08-26T05:23:14.557Z",
31385
- "size": 66636,
31386
- "path": "../public/assets/game/character/hero-anime-1.glb"
31791
+ "etag": "\"1057c-jREeKLYoS8AFWzuIOgOSr6CzehU\"",
31792
+ "mtime": "2026-08-26T05:23:14.558Z",
31793
+ "size": 66940,
31794
+ "path": "../public/assets/game/character/hero-anime-3.glb"
31387
31795
  },
31388
31796
  "/assets/game/character/hero-anime-4.glb": {
31389
31797
  "type": "model/gltf-binary",
@@ -31399,13 +31807,6 @@ const assets = {
31399
31807
  "size": 14386,
31400
31808
  "path": "../public/assets/game/character/mage.png"
31401
31809
  },
31402
- "/assets/game/player/misa-back-walk.000.png": {
31403
- "type": "image/png",
31404
- "etag": "\"157-/Sm0qrBJSHEFTGYwuSqnzRaX3Jk\"",
31405
- "mtime": "2026-08-25T12:20:54.514Z",
31406
- "size": 343,
31407
- "path": "../public/assets/game/player/misa-back-walk.000.png"
31408
- },
31409
31810
  "/assets/game/character/knight.png": {
31410
31811
  "type": "image/png",
31411
31812
  "etag": "\"3b37-Wyixufl/LcqKO/AeTLuGvzi4goQ\"",
@@ -31413,19 +31814,12 @@ const assets = {
31413
31814
  "size": 15159,
31414
31815
  "path": "../public/assets/game/character/knight.png"
31415
31816
  },
31416
- "/assets/game/character/hero-anime-3.glb": {
31417
- "type": "model/gltf-binary",
31418
- "etag": "\"1057c-jREeKLYoS8AFWzuIOgOSr6CzehU\"",
31419
- "mtime": "2026-08-26T05:23:14.558Z",
31420
- "size": 66940,
31421
- "path": "../public/assets/game/character/hero-anime-3.glb"
31422
- },
31423
- "/assets/game/player/misa-back-walk.002.png": {
31817
+ "/assets/game/player/misa-back-walk.000.png": {
31424
31818
  "type": "image/png",
31425
- "etag": "\"157-/PPQEWo58n/RNDDq2aia6nAWOQw\"",
31819
+ "etag": "\"157-/Sm0qrBJSHEFTGYwuSqnzRaX3Jk\"",
31426
31820
  "mtime": "2026-08-25T12:20:54.514Z",
31427
31821
  "size": 343,
31428
- "path": "../public/assets/game/player/misa-back-walk.002.png"
31822
+ "path": "../public/assets/game/player/misa-back-walk.000.png"
31429
31823
  },
31430
31824
  "/assets/game/player/misa-back-walk.001.png": {
31431
31825
  "type": "image/png",
@@ -31434,6 +31828,13 @@ const assets = {
31434
31828
  "size": 348,
31435
31829
  "path": "../public/assets/game/player/misa-back-walk.001.png"
31436
31830
  },
31831
+ "/assets/game/player/misa-back-walk.002.png": {
31832
+ "type": "image/png",
31833
+ "etag": "\"157-/PPQEWo58n/RNDDq2aia6nAWOQw\"",
31834
+ "mtime": "2026-08-25T12:20:54.514Z",
31835
+ "size": 343,
31836
+ "path": "../public/assets/game/player/misa-back-walk.002.png"
31837
+ },
31437
31838
  "/assets/game/player/misa-back-walk.003.png": {
31438
31839
  "type": "image/png",
31439
31840
  "etag": "\"15c-L+/hkHDyiQ9FJs5w93pxALzvWEg\"",
@@ -31441,13 +31842,6 @@ const assets = {
31441
31842
  "size": 348,
31442
31843
  "path": "../public/assets/game/player/misa-back-walk.003.png"
31443
31844
  },
31444
- "/assets/game/player/misa-front-walk.000.png": {
31445
- "type": "image/png",
31446
- "etag": "\"152-+euueT0jvK7OjNDmtrdehgkQatE\"",
31447
- "mtime": "2026-08-25T12:20:54.515Z",
31448
- "size": 338,
31449
- "path": "../public/assets/game/player/misa-front-walk.000.png"
31450
- },
31451
31845
  "/assets/game/player/misa-back.png": {
31452
31846
  "type": "image/png",
31453
31847
  "etag": "\"15c-KwI7aIn2tc/RPUJViRtdOGKZre4\"",
@@ -31455,6 +31849,13 @@ const assets = {
31455
31849
  "size": 348,
31456
31850
  "path": "../public/assets/game/player/misa-back.png"
31457
31851
  },
31852
+ "/assets/game/player/misa-front-walk.000.png": {
31853
+ "type": "image/png",
31854
+ "etag": "\"152-+euueT0jvK7OjNDmtrdehgkQatE\"",
31855
+ "mtime": "2026-08-25T12:20:54.515Z",
31856
+ "size": 338,
31857
+ "path": "../public/assets/game/player/misa-front-walk.000.png"
31858
+ },
31458
31859
  "/assets/game/player/misa-front-walk.001.png": {
31459
31860
  "type": "image/png",
31460
31861
  "etag": "\"155-r/wKRG+amQ/2TvYolFC2UPXHdC4\"",
@@ -31469,13 +31870,6 @@ const assets = {
31469
31870
  "size": 341,
31470
31871
  "path": "../public/assets/game/player/misa-front-walk.002.png"
31471
31872
  },
31472
- "/assets/game/player/misa-front.png": {
31473
- "type": "image/png",
31474
- "etag": "\"155-5X/+kju2mVH43N4/093cbqbcr+I\"",
31475
- "mtime": "2026-08-25T12:20:54.516Z",
31476
- "size": 341,
31477
- "path": "../public/assets/game/player/misa-front.png"
31478
- },
31479
31873
  "/assets/game/player/misa-front-walk.003.png": {
31480
31874
  "type": "image/png",
31481
31875
  "etag": "\"155-JVYjyw5Raquze4YHeYII+iXfJx4\"",
@@ -31483,6 +31877,13 @@ const assets = {
31483
31877
  "size": 341,
31484
31878
  "path": "../public/assets/game/player/misa-front-walk.003.png"
31485
31879
  },
31880
+ "/assets/game/player/misa-front.png": {
31881
+ "type": "image/png",
31882
+ "etag": "\"155-5X/+kju2mVH43N4/093cbqbcr+I\"",
31883
+ "mtime": "2026-08-25T12:20:54.516Z",
31884
+ "size": 341,
31885
+ "path": "../public/assets/game/player/misa-front.png"
31886
+ },
31486
31887
  "/assets/game/player/misa-left-walk.000.png": {
31487
31888
  "type": "image/png",
31488
31889
  "etag": "\"13f-Hlll+U+bluQUD8w3klFf7vww08M\"",
@@ -31490,13 +31891,6 @@ const assets = {
31490
31891
  "size": 319,
31491
31892
  "path": "../public/assets/game/player/misa-left-walk.000.png"
31492
31893
  },
31493
- "/assets/game/player/misa-left-walk.002.png": {
31494
- "type": "image/png",
31495
- "etag": "\"13e-ZO/OghsjeAi+tGQq5r7slwZn0zg\"",
31496
- "mtime": "2026-08-25T12:20:54.516Z",
31497
- "size": 318,
31498
- "path": "../public/assets/game/player/misa-left-walk.002.png"
31499
- },
31500
31894
  "/assets/game/player/misa-left-walk.001.png": {
31501
31895
  "type": "image/png",
31502
31896
  "etag": "\"13f-kvFuR3pXnfcL/C63pYoL58iuFOk\"",
@@ -31504,12 +31898,12 @@ const assets = {
31504
31898
  "size": 319,
31505
31899
  "path": "../public/assets/game/player/misa-left-walk.001.png"
31506
31900
  },
31507
- "/assets/game/player/misa-left.png": {
31901
+ "/assets/game/player/misa-left-walk.002.png": {
31508
31902
  "type": "image/png",
31509
- "etag": "\"13f-U80SqejQLrLmFSm4ifHPjYI/r5Q\"",
31903
+ "etag": "\"13e-ZO/OghsjeAi+tGQq5r7slwZn0zg\"",
31510
31904
  "mtime": "2026-08-25T12:20:54.516Z",
31511
- "size": 319,
31512
- "path": "../public/assets/game/player/misa-left.png"
31905
+ "size": 318,
31906
+ "path": "../public/assets/game/player/misa-left-walk.002.png"
31513
31907
  },
31514
31908
  "/assets/game/player/misa-left-walk.003.png": {
31515
31909
  "type": "image/png",
@@ -31518,12 +31912,12 @@ const assets = {
31518
31912
  "size": 319,
31519
31913
  "path": "../public/assets/game/player/misa-left-walk.003.png"
31520
31914
  },
31521
- "/assets/game/player/misa-right-walk.001.png": {
31915
+ "/assets/game/player/misa-left.png": {
31522
31916
  "type": "image/png",
31523
- "etag": "\"12e-DPDndNK7hnSQCpyHmbRm1ttAM1s\"",
31524
- "mtime": "2026-08-25T12:20:54.517Z",
31525
- "size": 302,
31526
- "path": "../public/assets/game/player/misa-right-walk.001.png"
31917
+ "etag": "\"13f-U80SqejQLrLmFSm4ifHPjYI/r5Q\"",
31918
+ "mtime": "2026-08-25T12:20:54.516Z",
31919
+ "size": 319,
31920
+ "path": "../public/assets/game/player/misa-left.png"
31527
31921
  },
31528
31922
  "/assets/game/player/misa-right-walk.000.png": {
31529
31923
  "type": "image/png",
@@ -31539,6 +31933,13 @@ const assets = {
31539
31933
  "size": 303,
31540
31934
  "path": "../public/assets/game/player/misa-right-walk.002.png"
31541
31935
  },
31936
+ "/assets/game/player/misa-right-walk.001.png": {
31937
+ "type": "image/png",
31938
+ "etag": "\"12e-DPDndNK7hnSQCpyHmbRm1ttAM1s\"",
31939
+ "mtime": "2026-08-25T12:20:54.517Z",
31940
+ "size": 302,
31941
+ "path": "../public/assets/game/player/misa-right-walk.001.png"
31942
+ },
31542
31943
  "/assets/game/player/misa-right-walk.003.png": {
31543
31944
  "type": "image/png",
31544
31945
  "etag": "\"12e-1Tf+ktOQnj4YEenOBQ+4j9KNxVQ\"",
@@ -31553,83 +31954,6 @@ const assets = {
31553
31954
  "size": 302,
31554
31955
  "path": "../public/assets/game/player/misa-right.png"
31555
31956
  },
31556
- "/assets/game/devices/agv.glb": {
31557
- "type": "model/gltf-binary",
31558
- "etag": "\"b0ec-SGRGNfFN89F7v1GROXKGve7pQqs\"",
31559
- "mtime": "2026-08-27T07:03:12.531Z",
31560
- "size": 45292,
31561
- "path": "../public/assets/game/devices/agv.glb"
31562
- },
31563
- "/assets/game/devices/caster.glb": {
31564
- "type": "model/gltf-binary",
31565
- "etag": "\"5874-Qd988sa7u1y3lgH8K/zhzRLbRbs\"",
31566
- "mtime": "2026-08-27T07:03:12.510Z",
31567
- "size": 22644,
31568
- "path": "../public/assets/game/devices/caster.glb"
31569
- },
31570
- "/assets/game/devices/device-console.glb": {
31571
- "type": "model/gltf-binary",
31572
- "etag": "\"3984-GibNFJHAqtYWIxLy79rzU1HZAds\"",
31573
- "mtime": "2026-08-26T05:23:14.559Z",
31574
- "size": 14724,
31575
- "path": "../public/assets/game/devices/device-console.glb"
31576
- },
31577
- "/assets/game/devices/device-scanner.glb": {
31578
- "type": "model/gltf-binary",
31579
- "etag": "\"28e0-uKYZaLiZiCedMMozKBOFU14HUSE\"",
31580
- "mtime": "2026-08-26T05:23:14.560Z",
31581
- "size": 10464,
31582
- "path": "../public/assets/game/devices/device-scanner.glb"
31583
- },
31584
- "/assets/game/devices/device-robot-arm.glb": {
31585
- "type": "model/gltf-binary",
31586
- "etag": "\"37fc-uBxMDklo0SfaA6KXZIylh/S2p+c\"",
31587
- "mtime": "2026-08-26T05:23:14.560Z",
31588
- "size": 14332,
31589
- "path": "../public/assets/game/devices/device-robot-arm.glb"
31590
- },
31591
- "/assets/game/devices/extruder.glb": {
31592
- "type": "model/gltf-binary",
31593
- "etag": "\"18124-H6X1eQmFDn6eONUMGU6lGdQafZ8\"",
31594
- "mtime": "2026-08-27T07:03:12.506Z",
31595
- "size": 98596,
31596
- "path": "../public/assets/game/devices/extruder.glb"
31597
- },
31598
- "/assets/game/devices/power-cabinet.glb": {
31599
- "type": "model/gltf-binary",
31600
- "etag": "\"54f0-KsrAxig9JTAY5SGKK3jbdJXB6fk\"",
31601
- "mtime": "2026-08-27T07:03:12.534Z",
31602
- "size": 21744,
31603
- "path": "../public/assets/game/devices/power-cabinet.glb"
31604
- },
31605
- "/assets/game/devices/mdo.glb": {
31606
- "type": "model/gltf-binary",
31607
- "etag": "\"132e4-EDslgF5+17dSukguA0eZzN4I0+o\"",
31608
- "mtime": "2026-08-27T07:03:12.518Z",
31609
- "size": 78564,
31610
- "path": "../public/assets/game/devices/mdo.glb"
31611
- },
31612
- "/assets/game/devices/pump.glb": {
31613
- "type": "model/gltf-binary",
31614
- "etag": "\"4bc8-yAiKZtO+P2bBmqfRvhlxcF0oduE\"",
31615
- "mtime": "2026-08-25T12:20:54.512Z",
31616
- "size": 19400,
31617
- "path": "../public/assets/game/devices/pump.glb"
31618
- },
31619
- "/assets/game/devices/thickness-scanner.glb": {
31620
- "type": "model/gltf-binary",
31621
- "etag": "\"3480-WMTbMzRrl/6AJPzEIPhRW9xPugA\"",
31622
- "mtime": "2026-08-27T07:03:12.527Z",
31623
- "size": 13440,
31624
- "path": "../public/assets/game/devices/thickness-scanner.glb"
31625
- },
31626
- "/assets/game/devices/tdo.glb": {
31627
- "type": "model/gltf-binary",
31628
- "etag": "\"e10c-GdMX+mG/KrSVBzy4EeAPPjFoTqM\"",
31629
- "mtime": "2026-08-27T07:03:12.523Z",
31630
- "size": 57612,
31631
- "path": "../public/assets/game/devices/tdo.glb"
31632
- },
31633
31957
  "/assets/game/npc/boltnu-sheet.png": {
31634
31958
  "type": "image/png",
31635
31959
  "etag": "\"a14-8xg90l10OuRoiEEgFXx9PTGJ9rA\"",
@@ -31644,13 +31968,6 @@ const assets = {
31644
31968
  "size": 3941,
31645
31969
  "path": "../public/assets/game/npc/fluttaflap-sheet.png"
31646
31970
  },
31647
- "/assets/game/devices/winder.glb": {
31648
- "type": "model/gltf-binary",
31649
- "etag": "\"9084-N9S2enupsA8WyhEHtkIgQ+RBDV4\"",
31650
- "mtime": "2026-08-27T07:03:12.526Z",
31651
- "size": 36996,
31652
- "path": "../public/assets/game/devices/winder.glb"
31653
- },
31654
31971
  "/assets/game/npc/rockitten-sheet.png": {
31655
31972
  "type": "image/png",
31656
31973
  "etag": "\"786-IY4LCl37+SB6pnPynapoUxsxvOM\"",
@@ -31665,6 +31982,13 @@ const assets = {
31665
31982
  "size": 2322,
31666
31983
  "path": "../public/assets/game/npc/tux-sheet.png"
31667
31984
  },
31985
+ "/assets/game/wuwa/world-middle.png": {
31986
+ "type": "image/png",
31987
+ "etag": "\"16164-Dxu+NdXPnqoPFfWHwQi1oefgNvU\"",
31988
+ "mtime": "2026-08-25T12:20:54.523Z",
31989
+ "size": 90468,
31990
+ "path": "../public/assets/game/wuwa/world-middle.png"
31991
+ },
31668
31992
  "/assets/game/wuwa/scene-map.png": {
31669
31993
  "type": "image/png",
31670
31994
  "etag": "\"682db-bU8mh8SeHPotvuaCc6PZzrWoT+A\"",
@@ -31672,6 +31996,13 @@ const assets = {
31672
31996
  "size": 426715,
31673
31997
  "path": "../public/assets/game/wuwa/scene-map.png"
31674
31998
  },
31999
+ "/assets/game/wuwa/world-far.png": {
32000
+ "type": "image/png",
32001
+ "etag": "\"6b391-DRcUWDyPUwUxDpAWplDh9StwdO0\"",
32002
+ "mtime": "2026-08-25T12:20:54.522Z",
32003
+ "size": 439185,
32004
+ "path": "../public/assets/game/wuwa/world-far.png"
32005
+ },
31675
32006
  "/assets/game/wuwa/wu-aura.png": {
31676
32007
  "type": "image/png",
31677
32008
  "etag": "\"2055-NKWgEbJfTq5l56FGWi9WDWgBAbU\"",
@@ -31679,12 +32010,12 @@ const assets = {
31679
32010
  "size": 8277,
31680
32011
  "path": "../public/assets/game/wuwa/wu-aura.png"
31681
32012
  },
31682
- "/assets/game/wuwa/world-middle.png": {
32013
+ "/assets/game/wuwa/wu-ring.png": {
31683
32014
  "type": "image/png",
31684
- "etag": "\"16164-Dxu+NdXPnqoPFfWHwQi1oefgNvU\"",
31685
- "mtime": "2026-08-25T12:20:54.523Z",
31686
- "size": 90468,
31687
- "path": "../public/assets/game/wuwa/world-middle.png"
32015
+ "etag": "\"65ac-/iIjlPgFNpD98zDsyCJYA8021E4\"",
32016
+ "mtime": "2026-08-25T12:20:54.527Z",
32017
+ "size": 26028,
32018
+ "path": "../public/assets/game/wuwa/wu-ring.png"
31688
32019
  },
31689
32020
  "/assets/game/wuwa/wu-lead.png": {
31690
32021
  "type": "image/png",
@@ -31693,13 +32024,6 @@ const assets = {
31693
32024
  "size": 15108,
31694
32025
  "path": "../public/assets/game/wuwa/wu-lead.png"
31695
32026
  },
31696
- "/assets/game/wuwa/wu-ring.png": {
31697
- "type": "image/png",
31698
- "etag": "\"65ac-/iIjlPgFNpD98zDsyCJYA8021E4\"",
31699
- "mtime": "2026-08-25T12:20:54.527Z",
31700
- "size": 26028,
31701
- "path": "../public/assets/game/wuwa/wu-ring.png"
31702
- },
31703
32027
  "/assets/game/wuwa/wu-slash.png": {
31704
32028
  "type": "image/png",
31705
32029
  "etag": "\"185-fVjcllSJOBMFcBWLIgBzTrzWGaY\"",
@@ -31707,6 +32031,13 @@ const assets = {
31707
32031
  "size": 389,
31708
32032
  "path": "../public/assets/game/wuwa/wu-slash.png"
31709
32033
  },
32034
+ "/assets/game/wuwa/wu-worker-2.png": {
32035
+ "type": "image/png",
32036
+ "etag": "\"3c81-6qd4LQS0v2L4rTa0XAmekluER7c\"",
32037
+ "mtime": "2026-08-25T12:20:54.529Z",
32038
+ "size": 15489,
32039
+ "path": "../public/assets/game/wuwa/wu-worker-2.png"
32040
+ },
31710
32041
  "/assets/game/wuwa/wu-worker-0.png": {
31711
32042
  "type": "image/png",
31712
32043
  "etag": "\"3c59-fILvgyTv9TKRgrI9GQlRhaSR96U\"",
@@ -31714,13 +32045,6 @@ const assets = {
31714
32045
  "size": 15449,
31715
32046
  "path": "../public/assets/game/wuwa/wu-worker-0.png"
31716
32047
  },
31717
- "/assets/game/wuwa/world-far.png": {
31718
- "type": "image/png",
31719
- "etag": "\"6b391-DRcUWDyPUwUxDpAWplDh9StwdO0\"",
31720
- "mtime": "2026-08-25T12:20:54.522Z",
31721
- "size": 439185,
31722
- "path": "../public/assets/game/wuwa/world-far.png"
31723
- },
31724
32048
  "/assets/game/wuwa/wu-worker-1.png": {
31725
32049
  "type": "image/png",
31726
32050
  "etag": "\"3cc8-0XoRr5qFC7X+vEEX+XrX4cRX+D0\"",
@@ -31728,19 +32052,12 @@ const assets = {
31728
32052
  "size": 15560,
31729
32053
  "path": "../public/assets/game/wuwa/wu-worker-1.png"
31730
32054
  },
31731
- "/assets/game/wuwa/wu-worker-2.png": {
31732
- "type": "image/png",
31733
- "etag": "\"3c81-6qd4LQS0v2L4rTa0XAmekluER7c\"",
31734
- "mtime": "2026-08-25T12:20:54.529Z",
31735
- "size": 15489,
31736
- "path": "../public/assets/game/wuwa/wu-worker-2.png"
31737
- },
31738
- "/_nuxt/builds/meta/92d6bd39-dbc5-46d5-90d8-8387f36715fa.json": {
32055
+ "/_nuxt/builds/meta/54e22640-4fd0-4fee-9077-31d4d4bb7969.json": {
31739
32056
  "type": "application/json",
31740
- "etag": "\"58-brb82ueTftNtuXpeQYXmPAHqC50\"",
31741
- "mtime": "2026-09-05T18:48:24.623Z",
32057
+ "etag": "\"58-rrmEpLO/wJ0L+jEH3Ydgl10HBf4\"",
32058
+ "mtime": "2026-09-06T08:07:46.121Z",
31742
32059
  "size": 88,
31743
- "path": "../public/_nuxt/builds/meta/92d6bd39-dbc5-46d5-90d8-8387f36715fa.json"
32060
+ "path": "../public/_nuxt/builds/meta/54e22640-4fd0-4fee-9077-31d4d4bb7969.json"
31744
32061
  },
31745
32062
  "/assets/game/wuwa/world-near.png": {
31746
32063
  "type": "image/png",
@@ -32153,10 +32470,12 @@ const _lazy_2iGKST = () => import('../routes/api/workshop/mailbox/all.get.mjs');
32153
32470
  const _lazy_J6CvCX = () => import('../routes/api/workshop/memories/maintenance.post.mjs');
32154
32471
  const _lazy_LRmOHW = () => import('../routes/api/workshop/index7.get.mjs');
32155
32472
  const _lazy_cmZtLZ = () => import('../routes/api/workshop/index6.post.mjs');
32473
+ const _lazy_XX9fDc = () => import('../routes/api/workshop/index8.get.mjs');
32474
+ const _lazy_yaEjdd = () => import('../routes/api/workshop/index.put.mjs');
32156
32475
  const _lazy__lD5l_ = () => import('../routes/api/workshop/plugins/_name/disable.post.mjs');
32157
32476
  const _lazy_HZYjW8 = () => import('../routes/api/workshop/plugins/_name/enable.post.mjs');
32158
32477
  const _lazy_yCW7sb = () => import('../routes/api/workshop/plugins/index.get.mjs');
32159
- const _lazy_WewPGz = () => import('../routes/api/workshop/index8.get.mjs');
32478
+ const _lazy_WewPGz = () => import('../routes/api/workshop/index9.get.mjs');
32160
32479
  const _lazy_RWH736 = () => import('../routes/api/workshop/runtime.get.mjs');
32161
32480
  const _lazy_3ImWSQ = () => import('../routes/api/workshop/scene/layouts.get.mjs');
32162
32481
  const _lazy_u16cXh = () => import('../routes/api/workshop/scene/layouts/_channelId_.delete.mjs');
@@ -32175,7 +32494,7 @@ const _lazy_qFs78O = () => import('../routes/api/workshop/teams/_id/deploy.post.
32175
32494
  const _lazy_KpUmMl = () => import('../routes/api/workshop/teams/_id/members/_agentId_.delete.mjs');
32176
32495
  const _lazy_QonglT = () => import('../routes/api/workshop/teams/_id/index.get.mjs');
32177
32496
  const _lazy_k1sUOm = () => import('../routes/api/workshop/teams/_id/index.post.mjs');
32178
- const _lazy_s5XbV8 = () => import('../routes/api/workshop/index9.get.mjs');
32497
+ const _lazy_s5XbV8 = () => import('../routes/api/workshop/index10.get.mjs');
32179
32498
  const _lazy_1skCLM = () => import('../routes/api/workshop/index7.post.mjs');
32180
32499
  const _lazy_dMbmjJ = () => import('../routes/api/workshop/users/me.get.mjs');
32181
32500
  const _lazy_bjrVjh = () => import('../routes/api/workshop/users/register.post.mjs');
@@ -32183,7 +32502,7 @@ const _lazy_aVK7tA = () => import('../routes/api/workshop/workspaces/_id/channel
32183
32502
  const _lazy_iX4xNa = () => import('../routes/api/workshop/workspaces/_id/channels/_channelId_.delete.mjs');
32184
32503
  const _lazy_4thuTL = () => import('../routes/api/workshop/workspaces/_id/channels/_channelId_.post.mjs');
32185
32504
  const _lazy_pSf6CV = () => import('../routes/api/workshop/workspaces/index.delete.mjs');
32186
- const _lazy_HyhUaS = () => import('../routes/api/workshop/index10.get.mjs');
32505
+ const _lazy_HyhUaS = () => import('../routes/api/workshop/index11.get.mjs');
32187
32506
  const _lazy_2pjBry = () => import('../routes/api/workshop/index8.post.mjs');
32188
32507
  const _lazy_gDD48s = () => Promise.resolve().then(function () { return ws$1; });
32189
32508
  const _lazy_YccnuE = () => import('../routes/renderer.mjs').then(function (n) { return n.r; });
@@ -32359,6 +32678,8 @@ const handlers = [
32359
32678
  { route: '/api/workshop/memories/maintenance', handler: _lazy_J6CvCX, lazy: true, middleware: false, method: "post" },
32360
32679
  { route: '/api/workshop/ops-logs', handler: _lazy_LRmOHW, lazy: true, middleware: false, method: "get" },
32361
32680
  { route: '/api/workshop/ops-logs', handler: _lazy_cmZtLZ, lazy: true, middleware: false, method: "post" },
32681
+ { route: '/api/workshop/permissions', handler: _lazy_XX9fDc, lazy: true, middleware: false, method: "get" },
32682
+ { route: '/api/workshop/permissions', handler: _lazy_yaEjdd, lazy: true, middleware: false, method: "put" },
32362
32683
  { route: '/api/workshop/plugins/:name/disable', handler: _lazy__lD5l_, lazy: true, middleware: false, method: "post" },
32363
32684
  { route: '/api/workshop/plugins/:name/enable', handler: _lazy_HZYjW8, lazy: true, middleware: false, method: "post" },
32364
32685
  { route: '/api/workshop/plugins/:name', handler: _lazy_yCW7sb, lazy: true, middleware: false, method: "get" },
@@ -32786,5 +33107,5 @@ function setupGracefulShutdown(listener, nitroApp) {
32786
33107
  });
32787
33108
  }
32788
33109
 
32789
- export { readMultipartFormData as $, abortTerminal as A, sendTerminalInput as B, resolveUserByToken as C, findLiveTerminalPidByAgent as D, terminalSessionSnapshot as E, subscribeTerminal as F, listHarnessProcesses as G, AppError as H, getSystemConfigService as I, createEventStream as J, userService as K, readValidatedBody as L, zValidator as M, getValidatedQuery as N, extractBearerToken as O, userRepository as P, getRequestHeader as Q, setResponseStatus as R, parseJson as S, getToolApprovals as T, audit as U, getQuery as V, getAgentNodeBindingRepo as W, getHeader as X, loadJsonFile as Y, saveJsonFileAtomic as Z, ensureDataDir as _, trapUnhandledNodeErrors as a, DCW_LINE_COLORS as a$, ensureLeadSchedulerLoop as a0, listTerminalSessions as a1, broadcastSceneEvent as a2, getDaqController as a3, recordOps as a4, bindDaqHostPorts as a5, bindDaqBroadcast as a6, bumpTaggedSamples as a7, getDcwLineRepo as a8, getDcwRecipeRepo as a9, encodePath as aA, buildAssetsURL as aB, publicAssetsURL as aC, defineRenderHandler as aD, getRouteRules as aE, relative as aF, joinURL as aG, getResponseStatusText as aH, getResponseStatus as aI, createHooks as aJ, sanitizeStatusCode as aK, klona as aL, isEqual as aM, setCookie as aN, getCookie as aO, deleteCookie as aP, $fetch as aQ, baseURL as aR, defu as aS, getRequestProtocol as aT, appendResponseHeader as aU, DAQ_TEMPLATES as aV, DCW_TEMPLATES as aW, daqKeyFromRef as aX, DAQ_DRIVERS as aY, DCW_DRIVERS as aZ, DAQ_TEMPLATE_ICONS as a_, getAllActiveLineRuns as aa, getActiveLineRun as ab, deviceScenePayload as ac, daqRuntimeSettings as ad, tsdbReady as ae, getDaqQueue as af, listDaqTemplates as ag, daqInfraStatus as ah, daqInfraConfig as ai, getDaqTemplateRegistry as aj, normalizeDriverKind as ak, bindDcwBroadcast as al, gateDangerous as am, getDcwController as an, getRecipeRollBackManager as ao, listDcwTemplates as ap, emitLineLifecycle as aq, ErrorCodes as ar, getDcwTemplateRegistry as as, harnessMetas as at, StdioJsonRpcClient as au, spawnLineProcess as av, getHitlRegistry as aw, setPluginEnabled as ax, reloadPluginHost as ay, publishSceneLayoutEvent as az, useNitroApp as b, ws$1 as b0, defineApiHandler as c, destr as d, useServerConfig as e, getDeviceTwinRepo as f, getWorkshopManager as g, defineEventHandler as h, readRawBody as i, getRequestURL as j, getRequestHeaders as k, getOps as l, setResponseHeader as m, createError$1 as n, readBody as o, getPluginHost as p, getRouterParam as q, randomUUID as r, setupGracefulShutdown as s, toNodeListener as t, useRuntimeConfig as u, readClientScript as v, setHeader as w, pluginManifest as x, defineWebSocketHandler as y, respondTerminalUi as z };
33110
+ export { getHeader as $, abortTerminal as A, sendTerminalInput as B, resolveUserByToken as C, findLiveTerminalPidByAgent as D, terminalSessionSnapshot as E, subscribeTerminal as F, listHarnessProcesses as G, AppError as H, getSystemConfigService as I, createEventStream as J, userService as K, readValidatedBody as L, zValidator as M, getValidatedQuery as N, extractBearerToken as O, userRepository as P, getRequestHeader as Q, setResponseStatus as R, parseJson as S, getToolApprovals as T, audit as U, getQuery as V, getAgentNodeBindingRepo as W, getDaqController as X, getDcwController as Y, ErrorCodes as Z, lineMode as _, trapUnhandledNodeErrors as a, DAQ_TEMPLATES as a$, loadJsonFile as a0, saveJsonFileAtomic as a1, ensureDataDir as a2, readMultipartFormData as a3, ensureLeadSchedulerLoop as a4, listTerminalSessions as a5, broadcastSceneEvent as a6, recordOps as a7, bindDaqHostPorts as a8, bindDaqBroadcast as a9, spawnLineProcess as aA, getHitlRegistry as aB, notifyGrantsChanged as aC, setPluginEnabled as aD, reloadPluginHost as aE, publishSceneLayoutEvent as aF, encodePath as aG, buildAssetsURL as aH, publicAssetsURL as aI, defineRenderHandler as aJ, getRouteRules as aK, relative as aL, joinURL as aM, getResponseStatusText as aN, getResponseStatus as aO, createHooks as aP, sanitizeStatusCode as aQ, klona as aR, isEqual as aS, setCookie as aT, getCookie as aU, deleteCookie as aV, $fetch as aW, baseURL as aX, defu as aY, getRequestProtocol as aZ, appendResponseHeader as a_, bumpTaggedSamples as aa, getDcwLineRepo as ab, getDcwRecipeRepo as ac, getAllActiveLineRuns as ad, getActiveLineRun as ae, deviceScenePayload as af, requireLineMode as ag, daqRuntimeSettings as ah, tsdbReady as ai, getDaqQueue as aj, listDaqTemplates as ak, daqInfraStatus as al, filterByLine as am, daqInfraConfig as an, getDaqTemplateRegistry as ao, normalizeDriverKind as ap, bindDcwBroadcast as aq, gateDangerous as ar, getRecipeRollBackManager as as, visibleLineIds as at, isPrivilegedRole as au, listDcwTemplates as av, emitLineLifecycle as aw, getDcwTemplateRegistry as ax, harnessMetas as ay, StdioJsonRpcClient as az, useNitroApp as b, DCW_TEMPLATES as b0, daqKeyFromRef as b1, DAQ_DRIVERS as b2, DCW_DRIVERS as b3, DAQ_TEMPLATE_ICONS as b4, DCW_LINE_COLORS as b5, ws$1 as b6, defineApiHandler as c, destr as d, useServerConfig as e, getDeviceTwinRepo as f, getWorkshopManager as g, defineEventHandler as h, readRawBody as i, getRequestURL as j, getRequestHeaders as k, getOps as l, setResponseHeader as m, createError$1 as n, readBody as o, getPluginHost as p, getRouterParam as q, randomUUID as r, setupGracefulShutdown as s, toNodeListener as t, useRuntimeConfig as u, readClientScript as v, setHeader as w, pluginManifest as x, defineWebSocketHandler as y, respondTerminalUi as z };
32790
33111
  //# sourceMappingURL=nitro.mjs.map