agentworkshop 0.6.1 → 0.7.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (537) hide show
  1. package/.AgentWorkShop/prompts/host-tools.json +17 -0
  2. package/.env.example +37 -0
  3. package/.output/.AgentWorkShop/prompts/host-tools.json +17 -0
  4. package/.output/nitro.json +1 -1
  5. package/.output/public/_nuxt/{Bc_mM2cU.js → BH0Z05CS.js} +1 -1
  6. package/.output/public/_nuxt/Bxgaym6j.js +1 -0
  7. package/.output/public/_nuxt/{DRlJ2-4p.js → By-LNp3k.js} +1 -1
  8. package/.output/public/_nuxt/{C2QSTAWf.js → Bz40vyZS.js} +1 -1
  9. package/.output/public/_nuxt/{CwS_UHeH.js → CS8R0_J3.js} +1 -1
  10. package/.output/public/_nuxt/{ClptO7LA.js → CUxV8Bw_.js} +1 -1
  11. package/.output/public/_nuxt/CXmkVXS5.js +1 -0
  12. package/.output/public/_nuxt/DC-QMEk1.js +2 -0
  13. package/.output/public/_nuxt/{C-Y5ydB6.js → Dgp2wK2U.js} +6 -6
  14. package/.output/public/_nuxt/{Ck6tznoQ.js → DjqcbFBE.js} +1 -1
  15. package/.output/public/_nuxt/{B0haAGoq.js → GP2wXyuY.js} +1 -1
  16. package/.output/public/_nuxt/TownView.Bt33bo1M.css +1 -0
  17. package/.output/public/_nuxt/{MhK4buEJ.js → XVB9_zwP.js} +1 -1
  18. package/.output/public/_nuxt/_id_.BeqSLvl_.css +1 -0
  19. package/.output/public/_nuxt/builds/latest.json +1 -1
  20. package/.output/public/_nuxt/builds/meta/0f65fbec-c4c0-45de-9c50-bb41ada375e5.json +1 -0
  21. package/.output/public/_nuxt/{Bq_KKxCg.js → i_MKObHo.js} +1 -1
  22. package/.output/public/_nuxt/settings.DeRNNUcP.css +1 -0
  23. package/.output/public/_nuxt/{CclO6GyL.js → tpDMVY5w.js} +1 -1
  24. package/.output/public/_nuxt/{C0FogB-p.js → zwdqvGN_.js} +1 -1
  25. package/.output/server/chunks/_/nitro.mjs +2674 -2347
  26. package/.output/server/chunks/_/nitro.mjs.map +1 -1
  27. package/.output/server/chunks/build/{TownView-D9yCQe1T.mjs → TownView-BkHxMiwZ.mjs} +168 -159
  28. package/.output/server/chunks/build/{TownView-D9yCQe1T.mjs.map → TownView-BkHxMiwZ.mjs.map} +1 -1
  29. package/.output/server/chunks/build/{_id_-xR3AChMO.mjs → _id_-Bna1_JuB.mjs} +5 -4
  30. package/.output/server/chunks/build/_id_-Bna1_JuB.mjs.map +1 -0
  31. package/.output/server/chunks/build/{_id_-CmKAEFHV.mjs → _id_-GnRJPykX.mjs} +161 -119
  32. package/.output/server/chunks/build/_id_-GnRJPykX.mjs.map +1 -0
  33. package/.output/server/chunks/build/{_wsId_-C45nVrl-.mjs → _wsId_-CzLDGT_V.mjs} +6 -5
  34. package/.output/server/chunks/build/{_wsId_-C45nVrl-.mjs.map → _wsId_-CzLDGT_V.mjs.map} +1 -1
  35. package/.output/server/chunks/build/agents-D4l1icvn.mjs +1 -0
  36. package/.output/server/chunks/build/agents-D4l1icvn.mjs.map +1 -1
  37. package/.output/server/chunks/build/channel-templates-DqjtC-R0.mjs +1 -0
  38. package/.output/server/chunks/build/channel-templates-DqjtC-R0.mjs.map +1 -1
  39. package/.output/server/chunks/build/{daq-Boz_dlAQ.mjs → daq-D_W59QOe.mjs} +6 -5
  40. package/.output/server/chunks/build/daq-D_W59QOe.mjs.map +1 -0
  41. package/.output/server/chunks/build/{dcw-wTRwBAUi.mjs → dcw-BTM5YU-B.mjs} +3 -2
  42. package/.output/server/chunks/build/dcw-BTM5YU-B.mjs.map +1 -0
  43. package/.output/server/chunks/build/default-Dt6xLdpd.mjs +1 -0
  44. package/.output/server/chunks/build/{logs-Cdi-eXlN.mjs → logs-CUQt1z7D.mjs} +4 -3
  45. package/.output/server/chunks/build/logs-CUQt1z7D.mjs.map +1 -0
  46. package/.output/server/chunks/build/monitor-yNoV98rf.mjs +1 -0
  47. package/.output/server/chunks/build/{pages-bWKy0ZsA.mjs → pages-DR2bzczM.mjs} +4 -3
  48. package/.output/server/chunks/build/pages-DR2bzczM.mjs.map +1 -0
  49. package/.output/server/chunks/build/plugins-B-ZNey0Z.mjs +1 -0
  50. package/.output/server/chunks/build/plugins-B-ZNey0Z.mjs.map +1 -1
  51. package/.output/server/chunks/build/{settings-C3T5hR2A.mjs → settings-Cr06lbRy.mjs} +26 -18
  52. package/.output/server/chunks/build/settings-Cr06lbRy.mjs.map +1 -0
  53. package/.output/server/chunks/build/teams-QR3BBF7A.mjs +1 -0
  54. package/.output/server/chunks/build/teams-QR3BBF7A.mjs.map +1 -1
  55. package/.output/server/chunks/build/tokens-DFvr_TLj.mjs +1 -0
  56. package/.output/server/chunks/build/tokens-DFvr_TLj.mjs.map +1 -1
  57. package/.output/server/chunks/build/{town-CKg6Qxba.mjs → town-BN4vQPb8.mjs} +6 -5
  58. package/.output/server/chunks/build/town-BN4vQPb8.mjs.map +1 -0
  59. package/.output/server/chunks/build/town-BUqRobze.mjs +1 -0
  60. package/.output/server/chunks/build/town-BUqRobze.mjs.map +1 -1
  61. package/.output/server/chunks/build/{useDaqStream-zHEptJQ_.mjs → useDaqStream-hwkhJHFU.mjs} +2 -2
  62. package/.output/server/chunks/build/{useDaqStream-zHEptJQ_.mjs.map → useDaqStream-hwkhJHFU.mjs.map} +1 -1
  63. package/.output/server/chunks/build/{useDcwStream-BkWDGaWp.mjs → useDcwStream-Bdew_yrr.mjs} +16 -1
  64. package/.output/server/chunks/build/useDcwStream-Bdew_yrr.mjs.map +1 -0
  65. package/.output/server/chunks/build/{useDeviceTwins-NhtXqSkU.mjs → useDeviceTwins-C6EBg9oN.mjs} +2 -2
  66. package/.output/server/chunks/build/{useDeviceTwins-NhtXqSkU.mjs.map → useDeviceTwins-C6EBg9oN.mjs.map} +1 -1
  67. package/.output/server/chunks/build/{useOpsLog-CU64VDg5.mjs → useOpsLog-DdCqKVVG.mjs} +2 -2
  68. package/.output/server/chunks/build/{useOpsLog-CU64VDg5.mjs.map → useOpsLog-DdCqKVVG.mjs.map} +1 -1
  69. package/.output/server/chunks/build/users-4FZ0yFUO.mjs +1 -0
  70. package/.output/server/chunks/build/users-4FZ0yFUO.mjs.map +1 -1
  71. package/.output/server/chunks/build/workshop-CLhwe5eo.mjs +1 -0
  72. package/.output/server/chunks/build/workshop-CLhwe5eo.mjs.map +1 -1
  73. package/.output/server/chunks/routes/api/health.get.mjs +1 -0
  74. package/.output/server/chunks/routes/api/health.get.mjs.map +1 -1
  75. package/.output/server/chunks/routes/api/index.get.mjs +1 -0
  76. package/.output/server/chunks/routes/api/index.get.mjs.map +1 -1
  77. package/.output/server/chunks/routes/api/index.post.mjs +1 -0
  78. package/.output/server/chunks/routes/api/index.post.mjs.map +1 -1
  79. package/.output/server/chunks/routes/api/mcp/workshop.mjs +1 -0
  80. package/.output/server/chunks/routes/api/mcp/workshop.mjs.map +1 -1
  81. package/.output/server/chunks/routes/api/metrics.mjs +1 -0
  82. package/.output/server/chunks/routes/api/metrics.mjs.map +1 -1
  83. package/.output/server/chunks/routes/api/plugins/_name/_...path_.mjs +1 -0
  84. package/.output/server/chunks/routes/api/plugins/_name/_...path_.mjs.map +1 -1
  85. package/.output/server/chunks/routes/api/plugins/client/_name_.get.mjs +1 -0
  86. package/.output/server/chunks/routes/api/plugins/client/_name_.get.mjs.map +1 -1
  87. package/.output/server/chunks/routes/api/plugins/manifest.get.mjs +1 -0
  88. package/.output/server/chunks/routes/api/plugins/manifest.get.mjs.map +1 -1
  89. package/.output/server/chunks/routes/api/system/config.get.mjs +1 -0
  90. package/.output/server/chunks/routes/api/system/config.get.mjs.map +1 -1
  91. package/.output/server/chunks/routes/api/system/index.get.mjs +1 -0
  92. package/.output/server/chunks/routes/api/system/index.get.mjs.map +1 -1
  93. package/.output/server/chunks/routes/api/system/index.patch.mjs +1 -0
  94. package/.output/server/chunks/routes/api/system/index.patch.mjs.map +1 -1
  95. package/.output/server/chunks/routes/api/system/monitor/terminal/ws.mjs +1 -0
  96. package/.output/server/chunks/routes/api/system/monitor/terminal/ws.mjs.map +1 -1
  97. package/.output/server/chunks/routes/api/system/monitor/terminate.post.mjs +1 -0
  98. package/.output/server/chunks/routes/api/system/monitor/terminate.post.mjs.map +1 -1
  99. package/.output/server/chunks/routes/api/system/monitor.get.mjs +1 -0
  100. package/.output/server/chunks/routes/api/system/monitor.get.mjs.map +1 -1
  101. package/.output/server/chunks/routes/api/system/settings/events.get.mjs +1 -0
  102. package/.output/server/chunks/routes/api/system/settings/events.get.mjs.map +1 -1
  103. package/.output/server/chunks/routes/api/system/settings/reset.post.mjs +1 -0
  104. package/.output/server/chunks/routes/api/system/settings/reset.post.mjs.map +1 -1
  105. package/.output/server/chunks/routes/api/users/_id_.delete.mjs +1 -0
  106. package/.output/server/chunks/routes/api/users/_id_.delete.mjs.map +1 -1
  107. package/.output/server/chunks/routes/api/users/_id_.get.mjs +1 -0
  108. package/.output/server/chunks/routes/api/users/_id_.get.mjs.map +1 -1
  109. package/.output/server/chunks/routes/api/users/_id_.put.mjs +1 -0
  110. package/.output/server/chunks/routes/api/users/_id_.put.mjs.map +1 -1
  111. package/.output/server/chunks/routes/api/users/index.get.mjs +1 -0
  112. package/.output/server/chunks/routes/api/users/index.get.mjs.map +1 -1
  113. package/.output/server/chunks/routes/api/users/index.post.mjs +1 -0
  114. package/.output/server/chunks/routes/api/users/index.post.mjs.map +1 -1
  115. package/.output/server/chunks/routes/api/users/login.post.mjs +1 -0
  116. package/.output/server/chunks/routes/api/users/login.post.mjs.map +1 -1
  117. package/.output/server/chunks/routes/api/users/logout.post.mjs +1 -0
  118. package/.output/server/chunks/routes/api/users/logout.post.mjs.map +1 -1
  119. package/.output/server/chunks/routes/api/users/me.get.mjs +1 -0
  120. package/.output/server/chunks/routes/api/users/me.get.mjs.map +1 -1
  121. package/.output/server/chunks/routes/api/users/register.post.mjs +1 -0
  122. package/.output/server/chunks/routes/api/users/register.post.mjs.map +1 -1
  123. package/.output/server/chunks/routes/api/users/tokens/_id/token.get.mjs +1 -0
  124. package/.output/server/chunks/routes/api/users/tokens/_id/token.get.mjs.map +1 -1
  125. package/.output/server/chunks/routes/api/users/tokens/_id_.delete.mjs +1 -0
  126. package/.output/server/chunks/routes/api/users/tokens/_id_.delete.mjs.map +1 -1
  127. package/.output/server/chunks/routes/api/users/tokens/_id_.patch.mjs +1 -0
  128. package/.output/server/chunks/routes/api/users/tokens/_id_.patch.mjs.map +1 -1
  129. package/.output/server/chunks/routes/api/workshop/_...path_.mjs +1 -0
  130. package/.output/server/chunks/routes/api/workshop/_...path_.mjs.map +1 -1
  131. package/.output/server/chunks/routes/api/workshop/a2a/_agentId/index.get.mjs +1 -0
  132. package/.output/server/chunks/routes/api/workshop/a2a/_agentId/index.get.mjs.map +1 -1
  133. package/.output/server/chunks/routes/api/workshop/a2a/_agentId/index.post.mjs +1 -0
  134. package/.output/server/chunks/routes/api/workshop/a2a/_agentId/index.post.mjs.map +1 -1
  135. package/.output/server/chunks/routes/api/workshop/a2a/send.post.mjs +1 -0
  136. package/.output/server/chunks/routes/api/workshop/a2a/send.post.mjs.map +1 -1
  137. package/.output/server/chunks/routes/api/workshop/agent-tools/approvals/_id/decide.post.mjs +1 -0
  138. package/.output/server/chunks/routes/api/workshop/agent-tools/approvals/_id/decide.post.mjs.map +1 -1
  139. package/.output/server/chunks/routes/api/workshop/agent-tools/bindings/_id_.delete.mjs +1 -0
  140. package/.output/server/chunks/routes/api/workshop/agent-tools/bindings/_id_.delete.mjs.map +1 -1
  141. package/.output/server/chunks/routes/api/workshop/agent-tools/bindings/_id_.patch.mjs +1 -0
  142. package/.output/server/chunks/routes/api/workshop/agent-tools/bindings/_id_.patch.mjs.map +1 -1
  143. package/.output/server/chunks/routes/api/workshop/agent-tools/index.get.mjs +1 -0
  144. package/.output/server/chunks/routes/api/workshop/agent-tools/index.get.mjs.map +1 -1
  145. package/.output/server/chunks/routes/api/workshop/agent-tools/index.post.mjs +1 -0
  146. package/.output/server/chunks/routes/api/workshop/agent-tools/index.post.mjs.map +1 -1
  147. package/.output/server/chunks/routes/api/workshop/agent-tools/index2.get.mjs +1 -0
  148. package/.output/server/chunks/routes/api/workshop/agent-tools/index2.get.mjs.map +1 -1
  149. package/.output/server/chunks/routes/api/workshop/agent-tools/invoke.post.mjs +1 -0
  150. package/.output/server/chunks/routes/api/workshop/agent-tools/invoke.post.mjs.map +1 -1
  151. package/.output/server/chunks/routes/api/workshop/agents/_id_.delete.mjs +1 -0
  152. package/.output/server/chunks/routes/api/workshop/agents/_id_.delete.mjs.map +1 -1
  153. package/.output/server/chunks/routes/api/workshop/agents/_id_.get.mjs +1 -0
  154. package/.output/server/chunks/routes/api/workshop/agents/_id_.get.mjs.map +1 -1
  155. package/.output/server/chunks/routes/api/workshop/agents/_id_.patch.mjs +1 -0
  156. package/.output/server/chunks/routes/api/workshop/agents/_id_.patch.mjs.map +1 -1
  157. package/.output/server/chunks/routes/api/workshop/agents/subscribe.post.mjs +1 -0
  158. package/.output/server/chunks/routes/api/workshop/agents/subscribe.post.mjs.map +1 -1
  159. package/.output/server/chunks/routes/api/workshop/approvals/_id/decide.post.mjs +1 -0
  160. package/.output/server/chunks/routes/api/workshop/approvals/_id/decide.post.mjs.map +1 -1
  161. package/.output/server/chunks/routes/api/workshop/assets/character/_id_.delete.mjs +1 -0
  162. package/.output/server/chunks/routes/api/workshop/assets/character/_id_.delete.mjs.map +1 -1
  163. package/.output/server/chunks/routes/api/workshop/assets/devices/_id_.delete.mjs +1 -0
  164. package/.output/server/chunks/routes/api/workshop/assets/devices/_id_.delete.mjs.map +1 -1
  165. package/.output/server/chunks/routes/api/workshop/assets/index.get.mjs +1 -0
  166. package/.output/server/chunks/routes/api/workshop/assets/index.get.mjs.map +1 -1
  167. package/.output/server/chunks/routes/api/workshop/assets/index.post.mjs +1 -0
  168. package/.output/server/chunks/routes/api/workshop/assets/index.post.mjs.map +1 -1
  169. package/.output/server/chunks/routes/api/workshop/assets/index2.get.mjs +1 -0
  170. package/.output/server/chunks/routes/api/workshop/assets/index2.get.mjs.map +1 -1
  171. package/.output/server/chunks/routes/api/workshop/assets/index2.post.mjs +1 -0
  172. package/.output/server/chunks/routes/api/workshop/assets/index2.post.mjs.map +1 -1
  173. package/.output/server/chunks/routes/api/workshop/audit.get.mjs +1 -0
  174. package/.output/server/chunks/routes/api/workshop/audit.get.mjs.map +1 -1
  175. package/.output/server/chunks/routes/api/workshop/caller.mjs +1 -0
  176. package/.output/server/chunks/routes/api/workshop/caller.mjs.map +1 -1
  177. package/.output/server/chunks/routes/api/workshop/channel-templates/_id/instantiate.post.mjs +1 -0
  178. package/.output/server/chunks/routes/api/workshop/channel-templates/_id/instantiate.post.mjs.map +1 -1
  179. package/.output/server/chunks/routes/api/workshop/channel-templates/_id_.delete.mjs +1 -0
  180. package/.output/server/chunks/routes/api/workshop/channel-templates/_id_.delete.mjs.map +1 -1
  181. package/.output/server/chunks/routes/api/workshop/channel-templates/_id_.get.mjs +1 -0
  182. package/.output/server/chunks/routes/api/workshop/channel-templates/_id_.get.mjs.map +1 -1
  183. package/.output/server/chunks/routes/api/workshop/channel-templates/_id_.patch.mjs +1 -0
  184. package/.output/server/chunks/routes/api/workshop/channel-templates/_id_.patch.mjs.map +1 -1
  185. package/.output/server/chunks/routes/api/workshop/channel-templates/from-channel.post.mjs +1 -0
  186. package/.output/server/chunks/routes/api/workshop/channel-templates/from-channel.post.mjs.map +1 -1
  187. package/.output/server/chunks/routes/api/workshop/channels/_id/activate.post.mjs +1 -0
  188. package/.output/server/chunks/routes/api/workshop/channels/_id/activate.post.mjs.map +1 -1
  189. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/index.get.mjs +1 -0
  190. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/index.get.mjs.map +1 -1
  191. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/index.post.mjs +1 -0
  192. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/index.post.mjs.map +1 -1
  193. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/memories/_memoryId_.delete.mjs +1 -0
  194. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/memories/_memoryId_.delete.mjs.map +1 -1
  195. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/memories/search.post.mjs +1 -0
  196. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/memories/search.post.mjs.map +1 -1
  197. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/model.patch.mjs +1 -0
  198. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/model.patch.mjs.map +1 -1
  199. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/position.patch.mjs +1 -0
  200. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/position.patch.mjs.map +1 -1
  201. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/range.patch.mjs +1 -0
  202. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/range.patch.mjs.map +1 -1
  203. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/stop.post.mjs +1 -0
  204. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/stop.post.mjs.map +1 -1
  205. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId_.delete.mjs +1 -0
  206. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId_.delete.mjs.map +1 -1
  207. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId_.patch.mjs +1 -0
  208. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId_.patch.mjs.map +1 -1
  209. package/.output/server/chunks/routes/api/workshop/channels/_id/events.get.mjs +1 -0
  210. package/.output/server/chunks/routes/api/workshop/channels/_id/events.get.mjs.map +1 -1
  211. package/.output/server/chunks/routes/api/workshop/channels/_id/index.get.mjs +1 -0
  212. package/.output/server/chunks/routes/api/workshop/channels/_id/index.get.mjs.map +1 -1
  213. package/.output/server/chunks/routes/api/workshop/channels/_id/index.post.mjs +1 -0
  214. package/.output/server/chunks/routes/api/workshop/channels/_id/index.post.mjs.map +1 -1
  215. package/.output/server/chunks/routes/api/workshop/channels/_id/index2.get.mjs +1 -0
  216. package/.output/server/chunks/routes/api/workshop/channels/_id/index2.get.mjs.map +1 -1
  217. package/.output/server/chunks/routes/api/workshop/channels/_id/index2.post.mjs +1 -0
  218. package/.output/server/chunks/routes/api/workshop/channels/_id/index2.post.mjs.map +1 -1
  219. package/.output/server/chunks/routes/api/workshop/channels/_id/index3.get.mjs +1 -0
  220. package/.output/server/chunks/routes/api/workshop/channels/_id/index3.get.mjs.map +1 -1
  221. package/.output/server/chunks/routes/api/workshop/channels/_id/index3.post.mjs +1 -0
  222. package/.output/server/chunks/routes/api/workshop/channels/_id/index3.post.mjs.map +1 -1
  223. package/.output/server/chunks/routes/api/workshop/channels/_id/index4.get.mjs +1 -0
  224. package/.output/server/chunks/routes/api/workshop/channels/_id/index4.get.mjs.map +1 -1
  225. package/.output/server/chunks/routes/api/workshop/channels/_id/index4.post.mjs +1 -0
  226. package/.output/server/chunks/routes/api/workshop/channels/_id/index4.post.mjs.map +1 -1
  227. package/.output/server/chunks/routes/api/workshop/channels/_id/memories/_memoryId_.delete.mjs +1 -0
  228. package/.output/server/chunks/routes/api/workshop/channels/_id/memories/_memoryId_.delete.mjs.map +1 -1
  229. package/.output/server/chunks/routes/api/workshop/channels/_id/queue.get.mjs +1 -0
  230. package/.output/server/chunks/routes/api/workshop/channels/_id/queue.get.mjs.map +1 -1
  231. package/.output/server/chunks/routes/api/workshop/channels/_id/terminals.get.mjs +1 -0
  232. package/.output/server/chunks/routes/api/workshop/channels/_id/terminals.get.mjs.map +1 -1
  233. package/.output/server/chunks/routes/api/workshop/channels/_id_.delete.mjs +1 -0
  234. package/.output/server/chunks/routes/api/workshop/channels/_id_.delete.mjs.map +1 -1
  235. package/.output/server/chunks/routes/api/workshop/channels/index.get.mjs +1 -0
  236. package/.output/server/chunks/routes/api/workshop/channels/index.get.mjs.map +1 -1
  237. package/.output/server/chunks/routes/api/workshop/channels/index.patch.mjs +1 -0
  238. package/.output/server/chunks/routes/api/workshop/channels/index.patch.mjs.map +1 -1
  239. package/.output/server/chunks/routes/api/workshop/channels.get.mjs +1 -0
  240. package/.output/server/chunks/routes/api/workshop/channels.get.mjs.map +1 -1
  241. package/.output/server/chunks/routes/api/workshop/channels.post.mjs +1 -0
  242. package/.output/server/chunks/routes/api/workshop/channels.post.mjs.map +1 -1
  243. package/.output/server/chunks/routes/api/workshop/daq/_id/bind.post.mjs +1 -0
  244. package/.output/server/chunks/routes/api/workshop/daq/_id/bind.post.mjs.map +1 -1
  245. package/.output/server/chunks/routes/api/workshop/daq/_id/frames/content.get.mjs +1 -0
  246. package/.output/server/chunks/routes/api/workshop/daq/_id/frames/content.get.mjs.map +1 -1
  247. package/.output/server/chunks/routes/api/workshop/daq/_id/frames.get.mjs +1 -0
  248. package/.output/server/chunks/routes/api/workshop/daq/_id/frames.get.mjs.map +1 -1
  249. package/.output/server/chunks/routes/api/workshop/daq/_id/samples.get.mjs +1 -0
  250. package/.output/server/chunks/routes/api/workshop/daq/_id/samples.get.mjs.map +1 -1
  251. package/.output/server/chunks/routes/api/workshop/daq/_id/test.post.mjs +1 -0
  252. package/.output/server/chunks/routes/api/workshop/daq/_id/test.post.mjs.map +1 -1
  253. package/.output/server/chunks/routes/api/workshop/daq/_id_.delete.mjs +1 -0
  254. package/.output/server/chunks/routes/api/workshop/daq/_id_.delete.mjs.map +1 -1
  255. package/.output/server/chunks/routes/api/workshop/daq/_id_.patch.mjs +1 -0
  256. package/.output/server/chunks/routes/api/workshop/daq/_id_.patch.mjs.map +1 -1
  257. package/.output/server/chunks/routes/api/workshop/daq/alarms/_id/ack.post.mjs +1 -0
  258. package/.output/server/chunks/routes/api/workshop/daq/alarms/_id/ack.post.mjs.map +1 -1
  259. package/.output/server/chunks/routes/api/workshop/daq/alarms.get.mjs +1 -0
  260. package/.output/server/chunks/routes/api/workshop/daq/alarms.get.mjs.map +1 -1
  261. package/.output/server/chunks/routes/api/workshop/daq/controller.post.mjs +1 -0
  262. package/.output/server/chunks/routes/api/workshop/daq/controller.post.mjs.map +1 -1
  263. package/.output/server/chunks/routes/api/workshop/daq/index.post.mjs +1 -0
  264. package/.output/server/chunks/routes/api/workshop/daq/index.post.mjs.map +1 -1
  265. package/.output/server/chunks/routes/api/workshop/daq/infra/reconnect.post.mjs +1 -0
  266. package/.output/server/chunks/routes/api/workshop/daq/infra/reconnect.post.mjs.map +1 -1
  267. package/.output/server/chunks/routes/api/workshop/daq/infra.get.mjs +1 -0
  268. package/.output/server/chunks/routes/api/workshop/daq/infra.get.mjs.map +1 -1
  269. package/.output/server/chunks/routes/api/workshop/daq/templates/_key_.delete.mjs +1 -0
  270. package/.output/server/chunks/routes/api/workshop/daq/templates/_key_.delete.mjs.map +1 -1
  271. package/.output/server/chunks/routes/api/workshop/daq/templates/_key_.patch.mjs +1 -0
  272. package/.output/server/chunks/routes/api/workshop/daq/templates/_key_.patch.mjs.map +1 -1
  273. package/.output/server/chunks/routes/api/workshop/daq/test-driver.post.mjs +1 -0
  274. package/.output/server/chunks/routes/api/workshop/daq/test-driver.post.mjs.map +1 -1
  275. package/.output/server/chunks/routes/api/workshop/dcw/_id/bind.post.mjs +1 -0
  276. package/.output/server/chunks/routes/api/workshop/dcw/_id/bind.post.mjs.map +1 -1
  277. package/.output/server/chunks/routes/api/workshop/dcw/_id/param-ledger.get.mjs +1 -0
  278. package/.output/server/chunks/routes/api/workshop/dcw/_id/param-ledger.get.mjs.map +1 -1
  279. package/.output/server/chunks/routes/api/workshop/dcw/_id/read.post.mjs +31 -0
  280. package/.output/server/chunks/routes/api/workshop/dcw/_id/read.post.mjs.map +1 -0
  281. package/.output/server/chunks/routes/api/workshop/dcw/_id/test.post.mjs +1 -0
  282. package/.output/server/chunks/routes/api/workshop/dcw/_id/test.post.mjs.map +1 -1
  283. package/.output/server/chunks/routes/api/workshop/dcw/_id/write.post.mjs +1 -0
  284. package/.output/server/chunks/routes/api/workshop/dcw/_id/write.post.mjs.map +1 -1
  285. package/.output/server/chunks/routes/api/workshop/dcw/_id_.delete.mjs +1 -0
  286. package/.output/server/chunks/routes/api/workshop/dcw/_id_.delete.mjs.map +1 -1
  287. package/.output/server/chunks/routes/api/workshop/dcw/_id_.patch.mjs +1 -0
  288. package/.output/server/chunks/routes/api/workshop/dcw/_id_.patch.mjs.map +1 -1
  289. package/.output/server/chunks/routes/api/workshop/dcw/controller.post.mjs +1 -0
  290. package/.output/server/chunks/routes/api/workshop/dcw/controller.post.mjs.map +1 -1
  291. package/.output/server/chunks/routes/api/workshop/dcw/index.get.mjs +1 -0
  292. package/.output/server/chunks/routes/api/workshop/dcw/index.get.mjs.map +1 -1
  293. package/.output/server/chunks/routes/api/workshop/dcw/index.post.mjs +1 -0
  294. package/.output/server/chunks/routes/api/workshop/dcw/index.post.mjs.map +1 -1
  295. package/.output/server/chunks/routes/api/workshop/dcw/index2.get.mjs +1 -0
  296. package/.output/server/chunks/routes/api/workshop/dcw/index2.get.mjs.map +1 -1
  297. package/.output/server/chunks/routes/api/workshop/dcw/index2.post.mjs +1 -0
  298. package/.output/server/chunks/routes/api/workshop/dcw/index2.post.mjs.map +1 -1
  299. package/.output/server/chunks/routes/api/workshop/dcw/index3.get.mjs +1 -0
  300. package/.output/server/chunks/routes/api/workshop/dcw/index3.get.mjs.map +1 -1
  301. package/.output/server/chunks/routes/api/workshop/dcw/index3.post.mjs +1 -0
  302. package/.output/server/chunks/routes/api/workshop/dcw/index3.post.mjs.map +1 -1
  303. package/.output/server/chunks/routes/api/workshop/dcw/index4.get.mjs +1 -0
  304. package/.output/server/chunks/routes/api/workshop/dcw/index4.get.mjs.map +1 -1
  305. package/.output/server/chunks/routes/api/workshop/dcw/index4.post.mjs +1 -0
  306. package/.output/server/chunks/routes/api/workshop/dcw/index4.post.mjs.map +1 -1
  307. package/.output/server/chunks/routes/api/workshop/dcw/index5.get.mjs +1 -0
  308. package/.output/server/chunks/routes/api/workshop/dcw/index5.get.mjs.map +1 -1
  309. package/.output/server/chunks/routes/api/workshop/dcw/journal/node/_nodeId/rollback.post.mjs +1 -0
  310. package/.output/server/chunks/routes/api/workshop/dcw/journal/node/_nodeId/rollback.post.mjs.map +1 -1
  311. package/.output/server/chunks/routes/api/workshop/dcw/line/query.get.mjs +1 -0
  312. package/.output/server/chunks/routes/api/workshop/dcw/line/query.get.mjs.map +1 -1
  313. package/.output/server/chunks/routes/api/workshop/dcw/lines/_id/start.post.mjs +1 -0
  314. package/.output/server/chunks/routes/api/workshop/dcw/lines/_id/start.post.mjs.map +1 -1
  315. package/.output/server/chunks/routes/api/workshop/dcw/lines/_id/stop.post.mjs +1 -0
  316. package/.output/server/chunks/routes/api/workshop/dcw/lines/_id/stop.post.mjs.map +1 -1
  317. package/.output/server/chunks/routes/api/workshop/dcw/lines/_id_.delete.mjs +1 -0
  318. package/.output/server/chunks/routes/api/workshop/dcw/lines/_id_.delete.mjs.map +1 -1
  319. package/.output/server/chunks/routes/api/workshop/dcw/lines/_id_.patch.mjs +1 -0
  320. package/.output/server/chunks/routes/api/workshop/dcw/lines/_id_.patch.mjs.map +1 -1
  321. package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id/judge.post.mjs +1 -0
  322. package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id/judge.post.mjs.map +1 -1
  323. package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id/rollback.post.mjs +1 -0
  324. package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id/rollback.post.mjs.map +1 -1
  325. package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id/series.get.mjs +1 -0
  326. package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id/series.get.mjs.map +1 -1
  327. package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id_.get.mjs +1 -0
  328. package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id_.get.mjs.map +1 -1
  329. package/.output/server/chunks/routes/api/workshop/dcw/products/_id_.delete.mjs +1 -0
  330. package/.output/server/chunks/routes/api/workshop/dcw/products/_id_.delete.mjs.map +1 -1
  331. package/.output/server/chunks/routes/api/workshop/dcw/products/_id_.patch.mjs +1 -0
  332. package/.output/server/chunks/routes/api/workshop/dcw/products/_id_.patch.mjs.map +1 -1
  333. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/apply.post.mjs +1 -0
  334. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/apply.post.mjs.map +1 -1
  335. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/mark-good.post.mjs +1 -0
  336. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/mark-good.post.mjs.map +1 -1
  337. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/rollback-good.post.mjs +1 -0
  338. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/rollback-good.post.mjs.map +1 -1
  339. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id_.delete.mjs +1 -0
  340. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id_.delete.mjs.map +1 -1
  341. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id_.patch.mjs +1 -0
  342. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id_.patch.mjs.map +1 -1
  343. package/.output/server/chunks/routes/api/workshop/dcw/runs/_id/close.post.mjs +1 -0
  344. package/.output/server/chunks/routes/api/workshop/dcw/runs/_id/close.post.mjs.map +1 -1
  345. package/.output/server/chunks/routes/api/workshop/dcw/runs/_id/data.get.mjs +1 -0
  346. package/.output/server/chunks/routes/api/workshop/dcw/runs/_id/data.get.mjs.map +1 -1
  347. package/.output/server/chunks/routes/api/workshop/dcw/runs/_id/rollback.post.mjs +1 -0
  348. package/.output/server/chunks/routes/api/workshop/dcw/runs/_id/rollback.post.mjs.map +1 -1
  349. package/.output/server/chunks/routes/api/workshop/dcw/templates/_key_.delete.mjs +1 -0
  350. package/.output/server/chunks/routes/api/workshop/dcw/templates/_key_.delete.mjs.map +1 -1
  351. package/.output/server/chunks/routes/api/workshop/dcw/templates/_key_.patch.mjs +1 -0
  352. package/.output/server/chunks/routes/api/workshop/dcw/templates/_key_.patch.mjs.map +1 -1
  353. package/.output/server/chunks/routes/api/workshop/dcw/test-driver.post.mjs +1 -0
  354. package/.output/server/chunks/routes/api/workshop/dcw/test-driver.post.mjs.map +1 -1
  355. package/.output/server/chunks/routes/api/workshop/device-twins/_id/control.post.mjs +1 -0
  356. package/.output/server/chunks/routes/api/workshop/device-twins/_id/control.post.mjs.map +1 -1
  357. package/.output/server/chunks/routes/api/workshop/device-twins/_id/telemetry.post.mjs +1 -0
  358. package/.output/server/chunks/routes/api/workshop/device-twins/_id/telemetry.post.mjs.map +1 -1
  359. package/.output/server/chunks/routes/api/workshop/device-twins/_id_.delete.mjs +1 -0
  360. package/.output/server/chunks/routes/api/workshop/device-twins/_id_.delete.mjs.map +1 -1
  361. package/.output/server/chunks/routes/api/workshop/device-twins/_id_.patch.mjs +1 -0
  362. package/.output/server/chunks/routes/api/workshop/device-twins/_id_.patch.mjs.map +1 -1
  363. package/.output/server/chunks/routes/api/workshop/fs/dirs.get.mjs +1 -0
  364. package/.output/server/chunks/routes/api/workshop/fs/dirs.get.mjs.map +1 -1
  365. package/.output/server/chunks/routes/api/workshop/index.get.mjs +1 -0
  366. package/.output/server/chunks/routes/api/workshop/index.get.mjs.map +1 -1
  367. package/.output/server/chunks/routes/api/workshop/index.post.mjs +1 -0
  368. package/.output/server/chunks/routes/api/workshop/index.post.mjs.map +1 -1
  369. package/.output/server/chunks/routes/api/workshop/index10.get.mjs +1 -0
  370. package/.output/server/chunks/routes/api/workshop/index10.get.mjs.map +1 -1
  371. package/.output/server/chunks/routes/api/workshop/index2.get.mjs +1 -0
  372. package/.output/server/chunks/routes/api/workshop/index2.get.mjs.map +1 -1
  373. package/.output/server/chunks/routes/api/workshop/index2.post.mjs +1 -0
  374. package/.output/server/chunks/routes/api/workshop/index2.post.mjs.map +1 -1
  375. package/.output/server/chunks/routes/api/workshop/index3.get.mjs +1 -0
  376. package/.output/server/chunks/routes/api/workshop/index3.get.mjs.map +1 -1
  377. package/.output/server/chunks/routes/api/workshop/index3.post.mjs +1 -0
  378. package/.output/server/chunks/routes/api/workshop/index3.post.mjs.map +1 -1
  379. package/.output/server/chunks/routes/api/workshop/index4.get.mjs +1 -0
  380. package/.output/server/chunks/routes/api/workshop/index4.get.mjs.map +1 -1
  381. package/.output/server/chunks/routes/api/workshop/index4.post.mjs +1 -0
  382. package/.output/server/chunks/routes/api/workshop/index4.post.mjs.map +1 -1
  383. package/.output/server/chunks/routes/api/workshop/index5.get.mjs +1 -0
  384. package/.output/server/chunks/routes/api/workshop/index5.get.mjs.map +1 -1
  385. package/.output/server/chunks/routes/api/workshop/index5.post.mjs +1 -0
  386. package/.output/server/chunks/routes/api/workshop/index5.post.mjs.map +1 -1
  387. package/.output/server/chunks/routes/api/workshop/index6.get.mjs +1 -0
  388. package/.output/server/chunks/routes/api/workshop/index6.get.mjs.map +1 -1
  389. package/.output/server/chunks/routes/api/workshop/index6.post.mjs +1 -0
  390. package/.output/server/chunks/routes/api/workshop/index6.post.mjs.map +1 -1
  391. package/.output/server/chunks/routes/api/workshop/index7.get.mjs +1 -0
  392. package/.output/server/chunks/routes/api/workshop/index7.get.mjs.map +1 -1
  393. package/.output/server/chunks/routes/api/workshop/index7.post.mjs +1 -0
  394. package/.output/server/chunks/routes/api/workshop/index7.post.mjs.map +1 -1
  395. package/.output/server/chunks/routes/api/workshop/index8.get.mjs +1 -0
  396. package/.output/server/chunks/routes/api/workshop/index8.get.mjs.map +1 -1
  397. package/.output/server/chunks/routes/api/workshop/index8.post.mjs +1 -0
  398. package/.output/server/chunks/routes/api/workshop/index8.post.mjs.map +1 -1
  399. package/.output/server/chunks/routes/api/workshop/index9.get.mjs +1 -0
  400. package/.output/server/chunks/routes/api/workshop/index9.get.mjs.map +1 -1
  401. package/.output/server/chunks/routes/api/workshop/mailbox/all.get.mjs +1 -0
  402. package/.output/server/chunks/routes/api/workshop/mailbox/all.get.mjs.map +1 -1
  403. package/.output/server/chunks/routes/api/workshop/mailbox.get.mjs +1 -0
  404. package/.output/server/chunks/routes/api/workshop/mailbox.get.mjs.map +1 -1
  405. package/.output/server/chunks/routes/api/workshop/memories/maintenance.post.mjs +1 -0
  406. package/.output/server/chunks/routes/api/workshop/memories/maintenance.post.mjs.map +1 -1
  407. package/.output/server/chunks/routes/api/workshop/plugins/_name/disable.post.mjs +1 -0
  408. package/.output/server/chunks/routes/api/workshop/plugins/_name/disable.post.mjs.map +1 -1
  409. package/.output/server/chunks/routes/api/workshop/plugins/_name/enable.post.mjs +1 -0
  410. package/.output/server/chunks/routes/api/workshop/plugins/_name/enable.post.mjs.map +1 -1
  411. package/.output/server/chunks/routes/api/workshop/plugins/index.get.mjs +1 -0
  412. package/.output/server/chunks/routes/api/workshop/plugins/index.get.mjs.map +1 -1
  413. package/.output/server/chunks/routes/api/workshop/runtime.get.mjs +1 -0
  414. package/.output/server/chunks/routes/api/workshop/runtime.get.mjs.map +1 -1
  415. package/.output/server/chunks/routes/api/workshop/scene/layouts/_channelId_.delete.mjs +1 -0
  416. package/.output/server/chunks/routes/api/workshop/scene/layouts/_channelId_.delete.mjs.map +1 -1
  417. package/.output/server/chunks/routes/api/workshop/scene/layouts/_channelId_.put.mjs +1 -0
  418. package/.output/server/chunks/routes/api/workshop/scene/layouts/_channelId_.put.mjs.map +1 -1
  419. package/.output/server/chunks/routes/api/workshop/scene/layouts.get.mjs +1 -0
  420. package/.output/server/chunks/routes/api/workshop/scene/layouts.get.mjs.map +1 -1
  421. package/.output/server/chunks/routes/api/workshop/tasks/_id/complete.post.mjs +1 -0
  422. package/.output/server/chunks/routes/api/workshop/tasks/_id/complete.post.mjs.map +1 -1
  423. package/.output/server/chunks/routes/api/workshop/tasks/_id/dispatch.post.mjs +1 -0
  424. package/.output/server/chunks/routes/api/workshop/tasks/_id/dispatch.post.mjs.map +1 -1
  425. package/.output/server/chunks/routes/api/workshop/tasks/_id/index.post.mjs +1 -0
  426. package/.output/server/chunks/routes/api/workshop/tasks/_id/index.post.mjs.map +1 -1
  427. package/.output/server/chunks/routes/api/workshop/tasks/_id/report.post.mjs +1 -0
  428. package/.output/server/chunks/routes/api/workshop/tasks/_id/report.post.mjs.map +1 -1
  429. package/.output/server/chunks/routes/api/workshop/tasks/_id/retry.post.mjs +1 -0
  430. package/.output/server/chunks/routes/api/workshop/tasks/_id/retry.post.mjs.map +1 -1
  431. package/.output/server/chunks/routes/api/workshop/tasks/_id_.get.mjs +1 -0
  432. package/.output/server/chunks/routes/api/workshop/tasks/_id_.get.mjs.map +1 -1
  433. package/.output/server/chunks/routes/api/workshop/tasks.get.mjs +1 -0
  434. package/.output/server/chunks/routes/api/workshop/tasks.get.mjs.map +1 -1
  435. package/.output/server/chunks/routes/api/workshop/teams/_id/deploy.post.mjs +1 -0
  436. package/.output/server/chunks/routes/api/workshop/teams/_id/deploy.post.mjs.map +1 -1
  437. package/.output/server/chunks/routes/api/workshop/teams/_id/index.get.mjs +1 -0
  438. package/.output/server/chunks/routes/api/workshop/teams/_id/index.get.mjs.map +1 -1
  439. package/.output/server/chunks/routes/api/workshop/teams/_id/index.post.mjs +1 -0
  440. package/.output/server/chunks/routes/api/workshop/teams/_id/index.post.mjs.map +1 -1
  441. package/.output/server/chunks/routes/api/workshop/teams/_id/members/_agentId_.delete.mjs +1 -0
  442. package/.output/server/chunks/routes/api/workshop/teams/_id/members/_agentId_.delete.mjs.map +1 -1
  443. package/.output/server/chunks/routes/api/workshop/teams/_id_.delete.mjs +1 -0
  444. package/.output/server/chunks/routes/api/workshop/teams/_id_.delete.mjs.map +1 -1
  445. package/.output/server/chunks/routes/api/workshop/teams/_id_.get.mjs +1 -0
  446. package/.output/server/chunks/routes/api/workshop/teams/_id_.get.mjs.map +1 -1
  447. package/.output/server/chunks/routes/api/workshop/teams/_id_.patch.mjs +1 -0
  448. package/.output/server/chunks/routes/api/workshop/teams/_id_.patch.mjs.map +1 -1
  449. package/.output/server/chunks/routes/api/workshop/users/me.get.mjs +1 -0
  450. package/.output/server/chunks/routes/api/workshop/users/me.get.mjs.map +1 -1
  451. package/.output/server/chunks/routes/api/workshop/users/register.post.mjs +1 -0
  452. package/.output/server/chunks/routes/api/workshop/users/register.post.mjs.map +1 -1
  453. package/.output/server/chunks/routes/api/workshop/workspaces/_id/channel-templates/_tplId_.post.mjs +1 -0
  454. package/.output/server/chunks/routes/api/workshop/workspaces/_id/channel-templates/_tplId_.post.mjs.map +1 -1
  455. package/.output/server/chunks/routes/api/workshop/workspaces/_id/channels/_channelId_.delete.mjs +1 -0
  456. package/.output/server/chunks/routes/api/workshop/workspaces/_id/channels/_channelId_.delete.mjs.map +1 -1
  457. package/.output/server/chunks/routes/api/workshop/workspaces/_id/channels/_channelId_.post.mjs +1 -0
  458. package/.output/server/chunks/routes/api/workshop/workspaces/_id/channels/_channelId_.post.mjs.map +1 -1
  459. package/.output/server/chunks/routes/api/workshop/workspaces/index.delete.mjs +1 -0
  460. package/.output/server/chunks/routes/api/workshop/workspaces/index.delete.mjs.map +1 -1
  461. package/.output/server/chunks/routes/renderer.mjs +1 -1
  462. package/.output/server/chunks/virtual/entry.mjs +287 -85
  463. package/.output/server/chunks/virtual/precomputed.mjs +1 -1
  464. package/.output/server/index.mjs +1 -0
  465. package/.output/server/package.json +1 -1
  466. package/README-zh.md +434 -430
  467. package/README.md +5 -1
  468. package/app/components/workshop/DeviceTwinPanel.vue +34 -0
  469. package/app/components/workshop/town/TownView.vue +5 -0
  470. package/app/composables/workshop/useDcwStream.ts +15 -1
  471. package/app/config/schema.ts +54 -0
  472. package/app/pages/dcw/[id].vue +57 -0
  473. package/app/pages/settings.vue +2 -1
  474. package/config.yml +58 -1
  475. package/i18n/dicts/_en.json +56 -2
  476. package/i18n/dicts/dcwDetail.json +9 -1
  477. package/i18n/dicts/deviceTwinPanel.json +2 -1
  478. package/i18n/dicts/settings.json +48 -1
  479. package/i18n/locales/en.ts +139 -38
  480. package/i18n/locales/zh-CN.ts +139 -38
  481. package/package.json +1 -1
  482. package/scripts/_dbg-agent-dcw-rw.ts +131 -0
  483. package/scripts/_dbg-config-smoke.ts +28 -0
  484. package/scripts/_dbg-dcw-read-rest.mjs +103 -0
  485. package/scripts/_dbg-dcw-read-toolface.ts +13 -0
  486. package/scripts/_dbg-dcw-read-ui.mjs +74 -0
  487. package/scripts/_dbg-plugin-ui-wizard.mjs +125 -0
  488. package/scripts/test-config-precedence.ts +124 -0
  489. package/scripts/test-dcw-read.ts +153 -0
  490. package/server/api/workshop/dcw/[id]/read.post.ts +18 -0
  491. package/server/api/workshop/ws.ts +6 -4
  492. package/server/data/daqs.json +55 -9
  493. package/server/data/dcw-rollback.json +221 -1
  494. package/server/data/dcw-runs.json +41 -18
  495. package/server/data/dcw-writes.json +264 -0
  496. package/server/data/dcws.json +646 -4
  497. package/server/data/line-runs.json +12 -1
  498. package/server/plugins/backup.ts +7 -5
  499. package/server/plugins/retention.ts +59 -57
  500. package/server/plugins/workshop.ts +5 -4
  501. package/server/services/workshop/agents/industrial-tools.ts +50 -1
  502. package/server/services/workshop/agents/omp-agent.ts +10 -8
  503. package/server/services/workshop/agents/tool-approvals.ts +175 -174
  504. package/server/services/workshop/daq/alarm-notify.ts +102 -100
  505. package/server/services/workshop/daq/bus/mqtt.adapter.ts +14 -15
  506. package/server/services/workshop/daq/storage/sqlite.adapter.ts +5 -4
  507. package/server/services/workshop/daq/storage/timescale.adapter.ts +5 -4
  508. package/server/services/workshop/db/retention.ts +49 -50
  509. package/server/services/workshop/dcw/dcw-controller.ts +56 -1
  510. package/server/services/workshop/dcw/dcw-node.ts +233 -200
  511. package/server/services/workshop/dcw/dcw-runtime.ts +46 -9
  512. package/server/services/workshop/dcw/drivers.ts +98 -0
  513. package/server/services/workshop/dcw/recipe-rollback-manager.ts +16 -15
  514. package/server/services/workshop/logger.ts +65 -58
  515. package/server/services/workshop/runtime/embedding-provider.ts +9 -5
  516. package/server/services/workshop/runtime/manager.ts +16 -7
  517. package/server/services/workshop/runtime/memory.ts +14 -7
  518. package/server/services/workshop/settings.ts +143 -0
  519. package/shared/config/engine.mjs +14 -2
  520. package/shared/config/schema.json +48 -1
  521. package/shared/dcw-protocol.ts +21 -0
  522. package/.output/public/_nuxt/BD9D9pl4.js +0 -1
  523. package/.output/public/_nuxt/BxD8Fg_Z.js +0 -2
  524. package/.output/public/_nuxt/CwcOEM8m.js +0 -1
  525. package/.output/public/_nuxt/TownView.CI2Wpzty.css +0 -1
  526. package/.output/public/_nuxt/_id_.Ci4u30cR.css +0 -1
  527. package/.output/public/_nuxt/builds/meta/221de779-a113-4232-b9a1-31a614f5e3c7.json +0 -1
  528. package/.output/public/_nuxt/settings.BG0K9_MG.css +0 -1
  529. package/.output/server/chunks/build/_id_-CmKAEFHV.mjs.map +0 -1
  530. package/.output/server/chunks/build/_id_-xR3AChMO.mjs.map +0 -1
  531. package/.output/server/chunks/build/daq-Boz_dlAQ.mjs.map +0 -1
  532. package/.output/server/chunks/build/dcw-wTRwBAUi.mjs.map +0 -1
  533. package/.output/server/chunks/build/logs-Cdi-eXlN.mjs.map +0 -1
  534. package/.output/server/chunks/build/pages-bWKy0ZsA.mjs.map +0 -1
  535. package/.output/server/chunks/build/settings-C3T5hR2A.mjs.map +0 -1
  536. package/.output/server/chunks/build/town-CKg6Qxba.mjs.map +0 -1
  537. package/.output/server/chunks/build/useDcwStream-BkWDGaWp.mjs.map +0 -1
@@ -1,174 +1,175 @@
1
- /**
2
- * ToolApprovals —— 手动确认模式的工具执行审批服务(进程内)。
3
- *
4
- * manual 模式绑定的数控下发:工具调用 → request() 挂起等待 →
5
- * 孪生侧栏审批面板 批准/拒绝(可附备注)→ 挂起 Promise 落定,
6
- * 结果(含用户备注)回给 Agent 作为 tool result。超时自动按拒绝收敛。
7
- */
8
-
9
- import { randomUUID } from 'node:crypto'
10
- import { getOps } from '../ops/ops'
11
-
12
- export interface ToolApproval {
13
- id: string
14
- agentId: string
15
- nodeId: string
16
- kind: 'dcw' | 'daq'
17
- /** 人读摘要(节点名/物理量/目标值/窗口) */
18
- detail: string
19
- createdAt: string
20
- /** 到期时刻(createdAt + 超时窗);UI 据此显示自动拒绝倒计时 */
21
- expiresAt: string
22
- status: 'pending' | 'approved' | 'denied' | 'expired'
23
- comment: string
24
- decidedAt: string | null
25
- /** S4:裁决人留痕(空 = 超时/系统收敛) */
26
- decidedBy: string
27
- decidedName: string
28
- }
29
-
30
- /** 审批超时窗(超时默认拒绝,指令不执行);可用环境变量 HITL_TIMEOUT_MS 调整(测试/产线策略) */
31
- const TIMEOUT_MS = Number(process.env.HITL_TIMEOUT_MS) > 0 ? Number(process.env.HITL_TIMEOUT_MS) : 180_000
32
- const HISTORY_CAP = 50
33
-
34
- class ToolApprovalService {
35
- private pending = new Map<string, {
36
- approval: ToolApproval
37
- resolve: (r: { approved: boolean, comment: string, id: string }) => void
38
- timer: NodeJS.Timeout
39
- }>()
40
-
41
- private history: ToolApproval[] = []
42
-
43
- /** 挂起一次执行审批(工具侧 await;批准/拒绝/超时三向落定) */
44
- request(agentId: string, nodeId: string, kind: 'dcw' | 'daq', detail: string): Promise<{ approved: boolean, comment: string, id: string }> {
45
- const approval: ToolApproval = {
46
- id: `ap-${randomUUID().slice(0, 8)}`,
47
- agentId,
48
- nodeId,
49
- kind,
50
- detail,
51
- createdAt: new Date().toISOString(),
52
- expiresAt: new Date(Date.now() + TIMEOUT_MS).toISOString(),
53
- status: 'pending',
54
- comment: '',
55
- decidedAt: null,
56
- decidedBy: '',
57
- decidedName: '',
58
- }
59
- return new Promise((resolve) => {
60
- const timer = setTimeout(() => {
61
- if (!this.pending.has(approval.id)) return
62
- this.pending.delete(approval.id)
63
- approval.status = 'expired'
64
- approval.decidedAt = new Date().toISOString()
65
- approval.comment = '审批超时未处理,默认拒绝,指令未执行'
66
- this.remember(approval)
67
- resolve({ approved: false, comment: approval.comment, id: approval.id })
68
- }, TIMEOUT_MS)
69
- timer.unref?.()
70
- this.pending.set(approval.id, { approval, resolve, timer })
71
- })
72
- }
73
-
74
- decide(id: string, approved: boolean, comment: string, decidedBy = '', decidedName = ''): ToolApproval {
75
- const entry = this.pending.get(id)
76
- if (!entry) throw new Error(`审批不存在或已处理: ${id}`)
77
- clearTimeout(entry.timer)
78
- this.pending.delete(id)
79
- entry.approval.status = approved ? 'approved' : 'denied'
80
- entry.approval.comment = String(comment ?? '').trim()
81
- entry.approval.decidedAt = new Date().toISOString()
82
- entry.approval.decidedBy = decidedBy
83
- entry.approval.decidedName = decidedName
84
- this.remember(entry.approval)
85
- entry.resolve({ approved, comment: entry.approval.comment, id })
86
- return entry.approval
87
- }
88
-
89
- /** 审批面板拉取(指定 Agent 的待处理;agentId 空 = 全部) */
90
- listPending(agentId = ''): ToolApproval[] {
91
- return [...this.pending.values()]
92
- .map(e => e.approval)
93
- .filter(a => !agentId || a.agentId === agentId)
94
- }
95
-
96
- /** 解绑/换线时取消挂起审批:该 Agent 对某节点的全部 pending 按拒绝收敛(备注说明原因) */
97
- cancelPendingFor(agentId: string, nodeId: string): number {
98
- let n = 0
99
- for (const [id, entry] of [...this.pending.entries()]) {
100
- if (entry.approval.agentId !== agentId || entry.approval.nodeId !== nodeId) continue
101
- clearTimeout(entry.timer)
102
- this.pending.delete(id)
103
- entry.approval.status = 'denied'
104
- entry.approval.comment = '绑定已解除,审批失效'
105
- entry.approval.decidedAt = new Date().toISOString()
106
- this.remember(entry.approval)
107
- entry.resolve({ approved: false, comment: entry.approval.comment, id })
108
- n++
109
- }
110
- return n
111
- }
112
-
113
- /** 同一 Agent 同一节点的挂起审批去重:已有 pending 时拒绝新挂起(防审批面板堆积) */
114
- hasPendingFor(agentId: string, nodeId: string): boolean {
115
- for (const entry of this.pending.values()) {
116
- if (entry.approval.agentId === agentId && entry.approval.nodeId === nodeId) return true
117
- }
118
- return false
119
- }
120
-
121
- historyList(): ToolApproval[] {
122
- // S4:优先读持久化表(重启后仍可查);未接线(测试/降级)回退内存窗口
123
- const repo = getOps()?.approvalHistory
124
- if (repo) {
125
- return repo.list(HISTORY_CAP * 4).map(r => ({
126
- id: r.id,
127
- agentId: r.agentId,
128
- nodeId: r.nodeId,
129
- kind: r.kind as ToolApproval['kind'],
130
- detail: r.detail,
131
- status: r.status as ToolApproval['status'],
132
- comment: r.comment,
133
- decidedAt: r.decidedAt,
134
- decidedBy: r.decidedBy,
135
- decidedName: r.decidedName,
136
- createdAt: r.createdAt,
137
- // 持久化表未存到期时刻:按超时窗从 createdAt 派生(仅展示用)
138
- expiresAt: new Date(Date.parse(r.createdAt) + TIMEOUT_MS).toISOString(),
139
- }))
140
- }
141
- return this.history
142
- }
143
-
144
- private remember(a: ToolApproval): void {
145
- this.history.unshift(a)
146
- if (this.history.length > HISTORY_CAP) this.history.splice(HISTORY_CAP)
147
- // S4:同步持久化(失败不影响审批主流程——工具侧已拿到裁决结果)
148
- try {
149
- getOps()?.approvalHistory.upsert({
150
- id: a.id,
151
- agentId: a.agentId,
152
- nodeId: a.nodeId,
153
- kind: a.kind,
154
- detail: a.detail,
155
- status: a.status,
156
- comment: a.comment,
157
- decidedBy: a.decidedBy,
158
- decidedName: a.decidedName,
159
- createdAt: a.createdAt,
160
- decidedAt: a.decidedAt,
161
- })
162
- }
163
- catch {
164
- // 持久化失败降级为仅内存历史
165
- }
166
- }
167
- }
168
-
169
- const g = globalThis as typeof globalThis & { __toolApprovals?: ToolApprovalService }
170
-
171
- export function getToolApprovals(): ToolApprovalService {
172
- g.__toolApprovals ??= new ToolApprovalService()
173
- return g.__toolApprovals
174
- }
1
+ /**
2
+ * ToolApprovals —— 手动确认模式的工具执行审批服务(进程内)。
3
+ *
4
+ * manual 模式绑定的数控下发:工具调用 → request() 挂起等待 →
5
+ * 孪生侧栏审批面板 批准/拒绝(可附备注)→ 挂起 Promise 落定,
6
+ * 结果(含用户备注)回给 Agent 作为 tool result。超时自动按拒绝收敛。
7
+ */
8
+
9
+ import { randomUUID } from 'node:crypto'
10
+ import { getOps } from '../ops/ops'
11
+ import { securityHitlTimeoutMs } from '../settings'
12
+
13
+ export interface ToolApproval {
14
+ id: string
15
+ agentId: string
16
+ nodeId: string
17
+ kind: 'dcw' | 'daq'
18
+ /** 人读摘要(节点名/物理量/目标值/窗口) */
19
+ detail: string
20
+ createdAt: string
21
+ /** 到期时刻(createdAt + 超时窗);UI 据此显示自动拒绝倒计时 */
22
+ expiresAt: string
23
+ status: 'pending' | 'approved' | 'denied' | 'expired'
24
+ comment: string
25
+ decidedAt: string | null
26
+ /** S4:裁决人留痕(空 = 超时/系统收敛) */
27
+ decidedBy: string
28
+ decidedName: string
29
+ }
30
+
31
+ /** 审批超时窗(超时默认拒绝,指令不执行);security.hitl_timeout_ms(env HITL_TIMEOUT_MS 兼容) */
32
+ const TIMEOUT_MS = (): number => securityHitlTimeoutMs()
33
+ const HISTORY_CAP = 50
34
+
35
+ class ToolApprovalService {
36
+ private pending = new Map<string, {
37
+ approval: ToolApproval
38
+ resolve: (r: { approved: boolean, comment: string, id: string }) => void
39
+ timer: NodeJS.Timeout
40
+ }>()
41
+
42
+ private history: ToolApproval[] = []
43
+
44
+ /** 挂起一次执行审批(工具侧 await;批准/拒绝/超时三向落定) */
45
+ request(agentId: string, nodeId: string, kind: 'dcw' | 'daq', detail: string): Promise<{ approved: boolean, comment: string, id: string }> {
46
+ const approval: ToolApproval = {
47
+ id: `ap-${randomUUID().slice(0, 8)}`,
48
+ agentId,
49
+ nodeId,
50
+ kind,
51
+ detail,
52
+ createdAt: new Date().toISOString(),
53
+ expiresAt: new Date(Date.now() + TIMEOUT_MS()).toISOString(),
54
+ status: 'pending',
55
+ comment: '',
56
+ decidedAt: null,
57
+ decidedBy: '',
58
+ decidedName: '',
59
+ }
60
+ return new Promise((resolve) => {
61
+ const timer = setTimeout(() => {
62
+ if (!this.pending.has(approval.id)) return
63
+ this.pending.delete(approval.id)
64
+ approval.status = 'expired'
65
+ approval.decidedAt = new Date().toISOString()
66
+ approval.comment = '审批超时未处理,默认拒绝,指令未执行'
67
+ this.remember(approval)
68
+ resolve({ approved: false, comment: approval.comment, id: approval.id })
69
+ }, TIMEOUT_MS())
70
+ timer.unref?.()
71
+ this.pending.set(approval.id, { approval, resolve, timer })
72
+ })
73
+ }
74
+
75
+ decide(id: string, approved: boolean, comment: string, decidedBy = '', decidedName = ''): ToolApproval {
76
+ const entry = this.pending.get(id)
77
+ if (!entry) throw new Error(`审批不存在或已处理: ${id}`)
78
+ clearTimeout(entry.timer)
79
+ this.pending.delete(id)
80
+ entry.approval.status = approved ? 'approved' : 'denied'
81
+ entry.approval.comment = String(comment ?? '').trim()
82
+ entry.approval.decidedAt = new Date().toISOString()
83
+ entry.approval.decidedBy = decidedBy
84
+ entry.approval.decidedName = decidedName
85
+ this.remember(entry.approval)
86
+ entry.resolve({ approved, comment: entry.approval.comment, id })
87
+ return entry.approval
88
+ }
89
+
90
+ /** 审批面板拉取(指定 Agent 的待处理;agentId 空 = 全部) */
91
+ listPending(agentId = ''): ToolApproval[] {
92
+ return [...this.pending.values()]
93
+ .map(e => e.approval)
94
+ .filter(a => !agentId || a.agentId === agentId)
95
+ }
96
+
97
+ /** 解绑/换线时取消挂起审批:该 Agent 对某节点的全部 pending 按拒绝收敛(备注说明原因) */
98
+ cancelPendingFor(agentId: string, nodeId: string): number {
99
+ let n = 0
100
+ for (const [id, entry] of [...this.pending.entries()]) {
101
+ if (entry.approval.agentId !== agentId || entry.approval.nodeId !== nodeId) continue
102
+ clearTimeout(entry.timer)
103
+ this.pending.delete(id)
104
+ entry.approval.status = 'denied'
105
+ entry.approval.comment = '绑定已解除,审批失效'
106
+ entry.approval.decidedAt = new Date().toISOString()
107
+ this.remember(entry.approval)
108
+ entry.resolve({ approved: false, comment: entry.approval.comment, id })
109
+ n++
110
+ }
111
+ return n
112
+ }
113
+
114
+ /** 同一 Agent 同一节点的挂起审批去重:已有 pending 时拒绝新挂起(防审批面板堆积) */
115
+ hasPendingFor(agentId: string, nodeId: string): boolean {
116
+ for (const entry of this.pending.values()) {
117
+ if (entry.approval.agentId === agentId && entry.approval.nodeId === nodeId) return true
118
+ }
119
+ return false
120
+ }
121
+
122
+ historyList(): ToolApproval[] {
123
+ // S4:优先读持久化表(重启后仍可查);未接线(测试/降级)回退内存窗口
124
+ const repo = getOps()?.approvalHistory
125
+ if (repo) {
126
+ return repo.list(HISTORY_CAP * 4).map(r => ({
127
+ id: r.id,
128
+ agentId: r.agentId,
129
+ nodeId: r.nodeId,
130
+ kind: r.kind as ToolApproval['kind'],
131
+ detail: r.detail,
132
+ status: r.status as ToolApproval['status'],
133
+ comment: r.comment,
134
+ decidedAt: r.decidedAt,
135
+ decidedBy: r.decidedBy,
136
+ decidedName: r.decidedName,
137
+ createdAt: r.createdAt,
138
+ // 持久化表未存到期时刻:按超时窗从 createdAt 派生(仅展示用)
139
+ expiresAt: new Date(Date.parse(r.createdAt) + TIMEOUT_MS()).toISOString(),
140
+ }))
141
+ }
142
+ return this.history
143
+ }
144
+
145
+ private remember(a: ToolApproval): void {
146
+ this.history.unshift(a)
147
+ if (this.history.length > HISTORY_CAP) this.history.splice(HISTORY_CAP)
148
+ // S4:同步持久化(失败不影响审批主流程——工具侧已拿到裁决结果)
149
+ try {
150
+ getOps()?.approvalHistory.upsert({
151
+ id: a.id,
152
+ agentId: a.agentId,
153
+ nodeId: a.nodeId,
154
+ kind: a.kind,
155
+ detail: a.detail,
156
+ status: a.status,
157
+ comment: a.comment,
158
+ decidedBy: a.decidedBy,
159
+ decidedName: a.decidedName,
160
+ createdAt: a.createdAt,
161
+ decidedAt: a.decidedAt,
162
+ })
163
+ }
164
+ catch {
165
+ // 持久化失败降级为仅内存历史
166
+ }
167
+ }
168
+ }
169
+
170
+ const g = globalThis as typeof globalThis & { __toolApprovals?: ToolApprovalService }
171
+
172
+ export function getToolApprovals(): ToolApprovalService {
173
+ g.__toolApprovals ??= new ToolApprovalService()
174
+ return g.__toolApprovals
175
+ }
@@ -1,100 +1,102 @@
1
- /**
2
- * AlarmNotifier —— 报警外送 + 升级扫描(S5,production-readiness-plan)。
3
- *
4
- * - notifyAlarm():webhook 外送(env ALARM_WEBHOOK_URL;POST JSON,天然兼容
5
- * 钉钉/企微/飞书机器人),失败重试 3 次退避;fire-and-forget,绝不阻塞采集主链路;
6
- * - startAlarmEscalator():60s 扫描未确认且超 ALARM_ESCALATE_MINUTES(默认 15)的
7
- * 报警 → escalation+1 并重发外送(升级通知);globalThis 守卫防 HMR 重复。
8
- */
9
- import { randomUUID } from 'node:crypto'
10
- import { getOps } from '../ops/ops'
11
-
12
- const RETRIES = 3
13
- const ESCALATE_SWEEP_MS = 60_000
14
-
15
- const g = globalThis as typeof globalThis & { __awAlarmEscalator?: NodeJS.Timeout }
16
-
17
- export interface AlarmNotifyPayload {
18
- id: string
19
- nodeId: string
20
- nodeName: string
21
- metric: string
22
- value: number | null
23
- rule: string
24
- threshold: number | null
25
- escalation: number
26
- createdAt: string
27
- }
28
-
29
- /** webhook 外送(单次;成功返回 true) */
30
- async function postWebhook(payload: AlarmNotifyPayload, url: string): Promise<boolean> {
31
- try {
32
- const res = await fetch(url, {
33
- method: 'POST',
34
- headers: { 'content-type': 'application/json' },
35
- body: JSON.stringify({ kind: 'alarm', text: `[报警] ${payload.nodeName} ${payload.metric} ${payload.rule} 阈值 ${payload.threshold ?? '-'} 当前 ${payload.value ?? '-'}(升级 x${payload.escalation})`, ...payload }),
36
- signal: AbortSignal.timeout(5000),
37
- })
38
- return res.ok
39
- }
40
- catch {
41
- return false
42
- }
43
- }
44
-
45
- /** 外送 + 重试退避(1s/2s/4s);结果记录进 alarm_events.notified_json */
46
- export function notifyAlarm(payload: AlarmNotifyPayload): void {
47
- const url = process.env.ALARM_WEBHOOK_URL
48
- if (!url) return // 未配置外送 = 仅 WS/面板可见(合法降级)
49
- const repo = getOps()?.alarmEvents
50
- void (async () => {
51
- let ok = false
52
- for (let attempt = 1; attempt <= RETRIES && !ok; attempt++) {
53
- ok = await postWebhook(payload, url)
54
- if (!ok && attempt < RETRIES) await new Promise(r => setTimeout(r, 2 ** (attempt - 1) * 1000))
55
- }
56
- if (!repo) return
57
- try {
58
- const row = repo.list(500).find(a => a.id === payload.id)
59
- if (!row) return
60
- const log = JSON.parse(row.notifiedJson || '[]') as Array<{ url: string, ok: boolean, at: string, attempt: number }>
61
- log.push({ url, ok, at: new Date().toISOString(), attempt: RETRIES })
62
- repo.recordNotify(payload.id, JSON.stringify(log.slice(-10)))
63
- }
64
- catch {
65
- // 外送记录失败不影响业务
66
- }
67
- })()
68
- }
69
-
70
- /** 升级扫描器(懒启动;进程内单例) */
71
- export function startAlarmEscalator(): void {
72
- if (g.__awAlarmEscalator) return
73
- const escalateMin = Math.max(1, Number(process.env.ALARM_ESCALATE_MINUTES) || 15)
74
- const timer = setInterval(() => {
75
- const repo = getOps()?.alarmEvents
76
- if (!repo) return
77
- try {
78
- const cutoff = Date.now() - escalateMin * 60_000
79
- for (const a of repo.listOpen(200)) {
80
- if (Date.parse(a.createdAt) > cutoff) continue
81
- repo.escalate(a.id)
82
- notifyAlarm({
83
- id: a.id, nodeId: a.nodeId, nodeName: a.nodeName, metric: a.metric,
84
- value: a.value, rule: a.rule, threshold: a.threshold,
85
- escalation: a.escalation + 1, createdAt: a.createdAt,
86
- })
87
- }
88
- }
89
- catch {
90
- // 升级扫描失败不致命(下一轮再扫)
91
- }
92
- }, ESCALATE_SWEEP_MS)
93
- timer.unref?.()
94
- g.__awAlarmEscalator = timer
95
- }
96
-
97
- /** 生成报警事件 id(raise 侧用) */
98
- export function newAlarmId(): string {
99
- return `al-${randomUUID().slice(0, 8)}`
100
- }
1
+ /**
2
+ * AlarmNotifier —— 报警外送 + 升级扫描(S5,production-readiness-plan)。
3
+ *
4
+ * - notifyAlarm():webhook 外送(env ALARM_WEBHOOK_URL;POST JSON,天然兼容
5
+ * 钉钉/企微/飞书机器人),失败重试 3 次退避;fire-and-forget,绝不阻塞采集主链路;
6
+ * - startAlarmEscalator():60s 扫描未确认且超 ALARM_ESCALATE_MINUTES(默认 15)的
7
+ * 报警 → escalation+1 并重发外送(升级通知);globalThis 守卫防 HMR 重复。
8
+ */
9
+ import { randomUUID } from 'node:crypto'
10
+ import { getOps } from '../ops/ops'
11
+ import { daqRuntimeSettings } from '../settings'
12
+
13
+ const RETRIES = 3
14
+ const ESCALATE_SWEEP_MS = 60_000
15
+
16
+ const g = globalThis as typeof globalThis & { __awAlarmEscalator?: NodeJS.Timeout }
17
+
18
+ export interface AlarmNotifyPayload {
19
+ id: string
20
+ nodeId: string
21
+ nodeName: string
22
+ metric: string
23
+ value: number | null
24
+ rule: string
25
+ threshold: number | null
26
+ escalation: number
27
+ createdAt: string
28
+ }
29
+
30
+ /** webhook 外送(单次;成功返回 true) */
31
+ async function postWebhook(payload: AlarmNotifyPayload, url: string): Promise<boolean> {
32
+ try {
33
+ const res = await fetch(url, {
34
+ method: 'POST',
35
+ headers: { 'content-type': 'application/json' },
36
+ body: JSON.stringify({ kind: 'alarm', text: `[报警] ${payload.nodeName} ${payload.metric} ${payload.rule} 阈值 ${payload.threshold ?? '-'} 当前 ${payload.value ?? '-'}(升级 x${payload.escalation})`, ...payload }),
37
+ signal: AbortSignal.timeout(5000),
38
+ })
39
+ return res.ok
40
+ }
41
+ catch {
42
+ return false
43
+ }
44
+ }
45
+
46
+ /** 外送 + 重试退避(1s/2s/4s);结果记录进 alarm_events.notified_json */
47
+ export function notifyAlarm(payload: AlarmNotifyPayload): void {
48
+ // daq.alarmWebhookUrl(env ALARM_WEBHOOK_URL 兼容别名);未配置 = 仅 WS/面板可见(合法降级)
49
+ const url = daqRuntimeSettings().alarmWebhookUrl || undefined
50
+ if (!url) return
51
+ const repo = getOps()?.alarmEvents
52
+ void (async () => {
53
+ let ok = false
54
+ for (let attempt = 1; attempt <= RETRIES && !ok; attempt++) {
55
+ ok = await postWebhook(payload, url)
56
+ if (!ok && attempt < RETRIES) await new Promise(r => setTimeout(r, 2 ** (attempt - 1) * 1000))
57
+ }
58
+ if (!repo) return
59
+ try {
60
+ const row = repo.list(500).find(a => a.id === payload.id)
61
+ if (!row) return
62
+ const log = JSON.parse(row.notifiedJson || '[]') as Array<{ url: string, ok: boolean, at: string, attempt: number }>
63
+ log.push({ url, ok, at: new Date().toISOString(), attempt: RETRIES })
64
+ repo.recordNotify(payload.id, JSON.stringify(log.slice(-10)))
65
+ }
66
+ catch {
67
+ // 外送记录失败不影响业务
68
+ }
69
+ })()
70
+ }
71
+
72
+ /** 升级扫描器(懒启动;进程内单例) */
73
+ export function startAlarmEscalator(): void {
74
+ if (g.__awAlarmEscalator) return
75
+ const escalateMin = Math.max(1, daqRuntimeSettings().alarmEscalateMinutes)
76
+ const timer = setInterval(() => {
77
+ const repo = getOps()?.alarmEvents
78
+ if (!repo) return
79
+ try {
80
+ const cutoff = Date.now() - escalateMin * 60_000
81
+ for (const a of repo.listOpen(200)) {
82
+ if (Date.parse(a.createdAt) > cutoff) continue
83
+ repo.escalate(a.id)
84
+ notifyAlarm({
85
+ id: a.id, nodeId: a.nodeId, nodeName: a.nodeName, metric: a.metric,
86
+ value: a.value, rule: a.rule, threshold: a.threshold,
87
+ escalation: a.escalation + 1, createdAt: a.createdAt,
88
+ })
89
+ }
90
+ }
91
+ catch {
92
+ // 升级扫描失败不致命(下一轮再扫)
93
+ }
94
+ }, ESCALATE_SWEEP_MS)
95
+ timer.unref?.()
96
+ g.__awAlarmEscalator = timer
97
+ }
98
+
99
+ /** 生成报警事件 id(raise 侧用) */
100
+ export function newAlarmId(): string {
101
+ return `al-${randomUUID().slice(0, 8)}`
102
+ }
@@ -6,10 +6,11 @@
6
6
  * - 消费者:通配订阅 aw/daq/+/sample,JSON 解析回 envelope;
7
7
  * - 重连由 mqtt.js 客户端内建;发布在断连期间的样本按丢弃计数(仪表可见)。
8
8
  */
9
- import { createLogger } from '../../logger'
9
+ import { createLogger } from '../../logger'
10
10
  import { createRequire } from 'node:module'
11
- import type { MqttClient } from 'mqtt'
12
-
11
+ import type { MqttClient } from 'mqtt'
12
+ import { daqRuntimeSettings } from '../../settings'
13
+
13
14
  import type { DaqConsumer, DaqQueuePort, DaqSampleEnvelope } from './queue-port'
14
15
 
15
16
  const log = createLogger('daq.mqtt')
@@ -45,24 +46,22 @@ export class MqttQueueAdapter implements DaqQueuePort {
45
46
  if (this.client) return
46
47
  // mqtt 包动态导入:未安装时不影响其余链路(工厂已兜底 inproc)
47
48
  const mod = requireMqtt('mqtt') as unknown as { connect: (url: string, opts?: Record<string, unknown>) => MqttClient }
48
- const qos = Number(process.env.DAQ_MQTT_QOS ?? 0)
49
- // S1:凭据(env 优先)与 TLS(mqtts:// + 自签 CA;rejectUnauthorized 默认 true)
50
- const username = process.env.DAQ_MQTT_USERNAME
51
- const password = process.env.DAQ_MQTT_PASSWORD
52
- const caFile = process.env.DAQ_MQTT_CA_FILE
49
+ // 凭据/QoS/TLS 配置驱动(daq.mqtt.*;legacy DAQ_MQTT_* env 别名兼容,DAQ_MQTT_URL 整串覆盖仍最高优先)
50
+ const mqttCfg = daqRuntimeSettings().mqtt
51
+ const qos = mqttCfg.qos
53
52
  const opts: Record<string, unknown> = {
54
53
  clientId: `aw-daq-${process.pid}-${Math.random().toString(36).slice(2, 6)}`,
55
54
  reconnectPeriod: 2000,
56
55
  keepalive: 20,
57
56
  }
58
- if (username) opts.username = username
59
- if (password) opts.password = password
60
- if (caFile) {
57
+ if (mqttCfg.username) opts.username = mqttCfg.username
58
+ if (mqttCfg.password) opts.password = mqttCfg.password
59
+ if (mqttCfg.caFile) {
61
60
  const fs = requireMqtt('node:fs') as typeof import('node:fs')
62
- opts.ca = [fs.readFileSync(caFile)]
61
+ opts.ca = [fs.readFileSync(mqttCfg.caFile)]
63
62
  }
64
- if (process.env.DAQ_MQTT_REJECT_UNAUTHORIZED === '0') opts.rejectUnauthorized = false
65
- if (this.url.startsWith('mqtts://') && !username && process.env.NODE_ENV === 'production') {
63
+ if (!mqttCfg.rejectUnauthorized) opts.rejectUnauthorized = false
64
+ if (this.url.startsWith('mqtts://') && !mqttCfg.username && process.env.NODE_ENV === 'production') {
66
65
  log.warn('[daq-mqtt] WARN:生产环境 MQTT 连接未配置凭据(mqtts 仅加密传输,建议同时启用 username/password)')
67
66
  }
68
67
  this.client = mod.connect(this.url, opts)
@@ -100,7 +99,7 @@ export class MqttQueueAdapter implements DaqQueuePort {
100
99
  return
101
100
  }
102
101
  this.published++
103
- this.client.publish(TOPIC_SAMPLE(env.nodeId), JSON.stringify(env), { qos: Number(process.env.DAQ_MQTT_QOS ?? 0) })
102
+ this.client.publish(TOPIC_SAMPLE(env.nodeId), JSON.stringify(env), { qos: daqRuntimeSettings().mqtt.qos })
104
103
  }
105
104
 
106
105
  consume(fn: DaqConsumer): () => void {