agentworkshop 0.5.9 → 0.6.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 (572) hide show
  1. package/.AgentWorkShop/prompts/compaction-hints.md +9 -9
  2. package/.AgentWorkShop/prompts/host-tools.json +42 -0
  3. package/.output/.AgentWorkShop/prompts/compaction-hints.md +9 -9
  4. package/.output/.AgentWorkShop/prompts/host-tools.json +42 -0
  5. package/.output/nitro.json +1 -1
  6. package/.output/public/_nuxt/{Dm5mD6XT.js → BD9D9pl4.js} +1 -1
  7. package/.output/public/_nuxt/{BdKzfJiM.js → BxD8Fg_Z.js} +1 -1
  8. package/.output/public/_nuxt/{dRAyjbJ6.js → C-Y5ydB6.js} +3 -3
  9. package/.output/public/_nuxt/{Bok1DRqh.js → C0FogB-p.js} +1 -1
  10. package/.output/public/_nuxt/{BUNGEK2z.js → C2QSTAWf.js} +1 -1
  11. package/.output/public/_nuxt/{CWDzKGtj.js → CclO6GyL.js} +1 -1
  12. package/.output/public/_nuxt/{B3__nfxM.js → Ck6tznoQ.js} +1 -1
  13. package/.output/public/_nuxt/CwS_UHeH.js +1 -0
  14. package/.output/public/_nuxt/{CE2ynNi9.js → CwcOEM8m.js} +1 -1
  15. package/.output/public/_nuxt/MhK4buEJ.js +1 -0
  16. package/.output/public/_nuxt/_id_.DN3U6EF9.css +1 -0
  17. package/.output/public/_nuxt/builds/latest.json +1 -1
  18. package/.output/public/_nuxt/builds/meta/221de779-a113-4232-b9a1-31a614f5e3c7.json +1 -0
  19. package/.output/public/_nuxt/{entry.DjhxLu-f.css → entry.DvlXlPwx.css} +1 -1
  20. package/.output/public/_nuxt/settings.BG0K9_MG.css +1 -0
  21. package/.output/server/chunks/_/error-500.mjs.map +1 -1
  22. package/.output/server/chunks/_/nitro.mjs +2675 -1425
  23. package/.output/server/chunks/_/nitro.mjs.map +1 -1
  24. package/.output/server/chunks/build/{OmpTerminalPanel-CZnxR3M_.mjs → OmpTerminalPanel-B_SYhmgb.mjs} +2 -2
  25. package/.output/server/chunks/build/{OmpTerminalPanel-CZnxR3M_.mjs.map → OmpTerminalPanel-B_SYhmgb.mjs.map} +1 -1
  26. package/.output/server/chunks/build/{TownView-DYlUNRZe.mjs → TownView-D9yCQe1T.mjs} +6 -6
  27. package/.output/server/chunks/build/{TownView-DYlUNRZe.mjs.map → TownView-D9yCQe1T.mjs.map} +1 -1
  28. package/.output/server/chunks/build/{_id_-BOhG2yz8.mjs → _id_-CmKAEFHV.mjs} +4 -2
  29. package/.output/server/chunks/build/_id_-CmKAEFHV.mjs.map +1 -0
  30. package/.output/server/chunks/build/{_id_-CuyMYmhY.mjs → _id_-xR3AChMO.mjs} +74 -26
  31. package/.output/server/chunks/build/_id_-xR3AChMO.mjs.map +1 -0
  32. package/.output/server/chunks/build/{_wsId_-B5f5BdW2.mjs → _wsId_-C45nVrl-.mjs} +12 -10
  33. package/.output/server/chunks/build/{_wsId_-B5f5BdW2.mjs.map → _wsId_-C45nVrl-.mjs.map} +1 -1
  34. package/.output/server/chunks/build/{agents-BVaxN75W.mjs → agents-D4l1icvn.mjs} +5 -3
  35. package/.output/server/chunks/build/agents-D4l1icvn.mjs.map +1 -0
  36. package/.output/server/chunks/build/{channel-templates-D1K2IKrE.mjs → channel-templates-DqjtC-R0.mjs} +5 -3
  37. package/.output/server/chunks/build/channel-templates-DqjtC-R0.mjs.map +1 -0
  38. package/.output/server/chunks/build/{client-only-CFTHwakk.mjs → client-only-D5BzSQc6.mjs} +2 -2
  39. package/.output/server/chunks/build/client-only-D5BzSQc6.mjs.map +1 -0
  40. package/.output/server/chunks/build/{daq-ObtN1TQ4.mjs → daq-Boz_dlAQ.mjs} +6 -4
  41. package/.output/server/chunks/build/daq-Boz_dlAQ.mjs.map +1 -0
  42. package/.output/server/chunks/build/{dcw-fINr-He1.mjs → dcw-wTRwBAUi.mjs} +3 -1
  43. package/.output/server/chunks/build/dcw-wTRwBAUi.mjs.map +1 -0
  44. package/.output/server/chunks/build/{default-CVVO40Jj.mjs → default-Dt6xLdpd.mjs} +7 -5
  45. package/.output/server/chunks/build/{default-CVVO40Jj.mjs.map → default-Dt6xLdpd.mjs.map} +1 -1
  46. package/.output/server/chunks/build/interval-WlxgjTzO.mjs +9 -0
  47. package/.output/server/chunks/build/interval-WlxgjTzO.mjs.map +1 -0
  48. package/.output/server/chunks/build/{logs-DqNgCJAn.mjs → logs-Cdi-eXlN.mjs} +5 -3
  49. package/.output/server/chunks/build/logs-Cdi-eXlN.mjs.map +1 -0
  50. package/.output/server/chunks/build/{monitor-CTZLwbdw.mjs → monitor-yNoV98rf.mjs} +6 -4
  51. package/.output/server/chunks/build/{monitor-CTZLwbdw.mjs.map → monitor-yNoV98rf.mjs.map} +1 -1
  52. package/.output/server/chunks/build/{pages-DC52d7z7.mjs → pages-bWKy0ZsA.mjs} +6 -4
  53. package/.output/server/chunks/build/pages-bWKy0ZsA.mjs.map +1 -0
  54. package/.output/server/chunks/build/{plugins-DVQty7qG.mjs → plugins-B-ZNey0Z.mjs} +4 -2
  55. package/.output/server/chunks/build/plugins-B-ZNey0Z.mjs.map +1 -0
  56. package/.output/server/chunks/build/{settings-BeergncK.mjs → settings-C3T5hR2A.mjs} +21 -19
  57. package/.output/server/chunks/build/settings-C3T5hR2A.mjs.map +1 -0
  58. package/.output/server/chunks/build/{teams-CFeDlHDh.mjs → teams-QR3BBF7A.mjs} +5 -3
  59. package/.output/server/chunks/build/teams-QR3BBF7A.mjs.map +1 -0
  60. package/.output/server/chunks/build/{tokens-CBAUbOce.mjs → tokens-DFvr_TLj.mjs} +4 -2
  61. package/.output/server/chunks/build/tokens-DFvr_TLj.mjs.map +1 -0
  62. package/.output/server/chunks/build/town-BUqRobze.mjs +2 -0
  63. package/.output/server/chunks/build/town-BUqRobze.mjs.map +1 -1
  64. package/.output/server/chunks/build/{town-BxH-XXth.mjs → town-CKg6Qxba.mjs} +9 -7
  65. package/.output/server/chunks/build/town-CKg6Qxba.mjs.map +1 -0
  66. package/.output/server/chunks/build/{useDaqStream-CwORhsD7.mjs → useDaqStream-zHEptJQ_.mjs} +44 -1
  67. package/.output/server/chunks/build/useDaqStream-zHEptJQ_.mjs.map +1 -0
  68. package/.output/server/chunks/build/{useSiteConfig-Cc-ABesl.mjs → useSiteConfig-DJe_KMVr.mjs} +1 -1
  69. package/.output/server/chunks/build/{useSiteConfig-Cc-ABesl.mjs.map → useSiteConfig-DJe_KMVr.mjs.map} +1 -1
  70. package/.output/server/chunks/build/{useWorkshopApi-5er8_EHZ.mjs → useWorkshopApi-Bh5VUHWu.mjs} +1 -1
  71. package/.output/server/chunks/build/{useWorkshopApi-5er8_EHZ.mjs.map → useWorkshopApi-Bh5VUHWu.mjs.map} +1 -1
  72. package/.output/server/chunks/build/{useWorkshopWs-Dwr_1Q8f.mjs → useWorkshopWs-xcdeiSmJ.mjs} +2 -2
  73. package/.output/server/chunks/build/{useWorkshopWs-Dwr_1Q8f.mjs.map → useWorkshopWs-xcdeiSmJ.mjs.map} +1 -1
  74. package/.output/server/chunks/build/{user-CpVY4OAA.mjs → user-Dk-ytEUV.mjs} +1 -1
  75. package/.output/server/chunks/build/{user-CpVY4OAA.mjs.map → user-Dk-ytEUV.mjs.map} +1 -1
  76. package/.output/server/chunks/build/{users-BMs4s_6K.mjs → users-4FZ0yFUO.mjs} +4 -2
  77. package/.output/server/chunks/build/users-4FZ0yFUO.mjs.map +1 -0
  78. package/.output/server/chunks/build/{workshop-CJAyZ5zS.mjs → workshop-CLhwe5eo.mjs} +6 -4
  79. package/.output/server/chunks/build/workshop-CLhwe5eo.mjs.map +1 -0
  80. package/.output/server/chunks/build/{workspaces-Dq-1zvu9.mjs → workspaces-IfORCDJE.mjs} +2 -2
  81. package/.output/server/chunks/build/{workspaces-Dq-1zvu9.mjs.map → workspaces-IfORCDJE.mjs.map} +1 -1
  82. package/.output/server/chunks/routes/api/health.get.mjs +2 -0
  83. package/.output/server/chunks/routes/api/health.get.mjs.map +1 -1
  84. package/.output/server/chunks/routes/api/index.get.mjs +2 -0
  85. package/.output/server/chunks/routes/api/index.get.mjs.map +1 -1
  86. package/.output/server/chunks/routes/api/index.post.mjs +2 -0
  87. package/.output/server/chunks/routes/api/index.post.mjs.map +1 -1
  88. package/.output/server/chunks/routes/api/mcp/workshop.mjs +2 -0
  89. package/.output/server/chunks/routes/api/mcp/workshop.mjs.map +1 -1
  90. package/.output/server/chunks/routes/api/metrics.mjs +2 -0
  91. package/.output/server/chunks/routes/api/metrics.mjs.map +1 -1
  92. package/.output/server/chunks/routes/api/plugins/_name/_...path_.mjs +2 -0
  93. package/.output/server/chunks/routes/api/plugins/_name/_...path_.mjs.map +1 -1
  94. package/.output/server/chunks/routes/api/plugins/client/_name_.get.mjs +2 -0
  95. package/.output/server/chunks/routes/api/plugins/client/_name_.get.mjs.map +1 -1
  96. package/.output/server/chunks/routes/api/plugins/manifest.get.mjs +2 -0
  97. package/.output/server/chunks/routes/api/plugins/manifest.get.mjs.map +1 -1
  98. package/.output/server/chunks/routes/api/system/config.get.mjs +2 -0
  99. package/.output/server/chunks/routes/api/system/config.get.mjs.map +1 -1
  100. package/.output/server/chunks/routes/api/system/index.get.mjs +2 -0
  101. package/.output/server/chunks/routes/api/system/index.get.mjs.map +1 -1
  102. package/.output/server/chunks/routes/api/system/index.patch.mjs +2 -0
  103. package/.output/server/chunks/routes/api/system/index.patch.mjs.map +1 -1
  104. package/.output/server/chunks/routes/api/system/monitor/terminal/ws.mjs +2 -0
  105. package/.output/server/chunks/routes/api/system/monitor/terminal/ws.mjs.map +1 -1
  106. package/.output/server/chunks/routes/api/system/monitor/terminate.post.mjs +2 -0
  107. package/.output/server/chunks/routes/api/system/monitor/terminate.post.mjs.map +1 -1
  108. package/.output/server/chunks/routes/api/system/monitor.get.mjs +2 -0
  109. package/.output/server/chunks/routes/api/system/monitor.get.mjs.map +1 -1
  110. package/.output/server/chunks/routes/api/system/settings/events.get.mjs +3 -2
  111. package/.output/server/chunks/routes/api/system/settings/events.get.mjs.map +1 -1
  112. package/.output/server/chunks/routes/api/system/settings/reset.post.mjs +2 -0
  113. package/.output/server/chunks/routes/api/system/settings/reset.post.mjs.map +1 -1
  114. package/.output/server/chunks/routes/api/users/_id_.delete.mjs +2 -0
  115. package/.output/server/chunks/routes/api/users/_id_.delete.mjs.map +1 -1
  116. package/.output/server/chunks/routes/api/users/_id_.get.mjs +2 -0
  117. package/.output/server/chunks/routes/api/users/_id_.get.mjs.map +1 -1
  118. package/.output/server/chunks/routes/api/users/_id_.put.mjs +2 -0
  119. package/.output/server/chunks/routes/api/users/_id_.put.mjs.map +1 -1
  120. package/.output/server/chunks/routes/api/users/index.get.mjs +2 -0
  121. package/.output/server/chunks/routes/api/users/index.get.mjs.map +1 -1
  122. package/.output/server/chunks/routes/api/users/index.post.mjs +2 -0
  123. package/.output/server/chunks/routes/api/users/index.post.mjs.map +1 -1
  124. package/.output/server/chunks/routes/api/users/login.post.mjs +2 -0
  125. package/.output/server/chunks/routes/api/users/login.post.mjs.map +1 -1
  126. package/.output/server/chunks/routes/api/users/logout.post.mjs +2 -0
  127. package/.output/server/chunks/routes/api/users/logout.post.mjs.map +1 -1
  128. package/.output/server/chunks/routes/api/users/me.get.mjs +2 -0
  129. package/.output/server/chunks/routes/api/users/me.get.mjs.map +1 -1
  130. package/.output/server/chunks/routes/api/users/register.post.mjs +2 -0
  131. package/.output/server/chunks/routes/api/users/register.post.mjs.map +1 -1
  132. package/.output/server/chunks/routes/api/users/tokens/_id/token.get.mjs +2 -0
  133. package/.output/server/chunks/routes/api/users/tokens/_id/token.get.mjs.map +1 -1
  134. package/.output/server/chunks/routes/api/users/tokens/_id_.delete.mjs +2 -0
  135. package/.output/server/chunks/routes/api/users/tokens/_id_.delete.mjs.map +1 -1
  136. package/.output/server/chunks/routes/api/users/tokens/_id_.patch.mjs +2 -0
  137. package/.output/server/chunks/routes/api/users/tokens/_id_.patch.mjs.map +1 -1
  138. package/.output/server/chunks/routes/api/workshop/_...path_.mjs +2 -0
  139. package/.output/server/chunks/routes/api/workshop/_...path_.mjs.map +1 -1
  140. package/.output/server/chunks/routes/api/workshop/a2a/_agentId/index.get.mjs +2 -0
  141. package/.output/server/chunks/routes/api/workshop/a2a/_agentId/index.get.mjs.map +1 -1
  142. package/.output/server/chunks/routes/api/workshop/a2a/_agentId/index.post.mjs +2 -0
  143. package/.output/server/chunks/routes/api/workshop/a2a/_agentId/index.post.mjs.map +1 -1
  144. package/.output/server/chunks/routes/api/workshop/a2a/send.post.mjs +2 -0
  145. package/.output/server/chunks/routes/api/workshop/a2a/send.post.mjs.map +1 -1
  146. package/.output/server/chunks/routes/api/workshop/agent-tools/approvals/_id/decide.post.mjs +2 -0
  147. package/.output/server/chunks/routes/api/workshop/agent-tools/approvals/_id/decide.post.mjs.map +1 -1
  148. package/.output/server/chunks/routes/api/workshop/agent-tools/bindings/_id_.delete.mjs +2 -0
  149. package/.output/server/chunks/routes/api/workshop/agent-tools/bindings/_id_.delete.mjs.map +1 -1
  150. package/.output/server/chunks/routes/api/workshop/agent-tools/bindings/_id_.patch.mjs +2 -0
  151. package/.output/server/chunks/routes/api/workshop/agent-tools/bindings/_id_.patch.mjs.map +1 -1
  152. package/.output/server/chunks/routes/api/workshop/agent-tools/index.get.mjs +2 -0
  153. package/.output/server/chunks/routes/api/workshop/agent-tools/index.get.mjs.map +1 -1
  154. package/.output/server/chunks/routes/api/workshop/agent-tools/index.post.mjs +2 -0
  155. package/.output/server/chunks/routes/api/workshop/agent-tools/index.post.mjs.map +1 -1
  156. package/.output/server/chunks/routes/api/workshop/agent-tools/index2.get.mjs +2 -0
  157. package/.output/server/chunks/routes/api/workshop/agent-tools/index2.get.mjs.map +1 -1
  158. package/.output/server/chunks/routes/api/workshop/agent-tools/invoke.post.mjs +2 -0
  159. package/.output/server/chunks/routes/api/workshop/agent-tools/invoke.post.mjs.map +1 -1
  160. package/.output/server/chunks/routes/api/workshop/agents/_id_.delete.mjs +2 -0
  161. package/.output/server/chunks/routes/api/workshop/agents/_id_.delete.mjs.map +1 -1
  162. package/.output/server/chunks/routes/api/workshop/agents/_id_.get.mjs +2 -0
  163. package/.output/server/chunks/routes/api/workshop/agents/_id_.get.mjs.map +1 -1
  164. package/.output/server/chunks/routes/api/workshop/agents/_id_.patch.mjs +2 -0
  165. package/.output/server/chunks/routes/api/workshop/agents/_id_.patch.mjs.map +1 -1
  166. package/.output/server/chunks/routes/api/workshop/agents/subscribe.post.mjs +2 -0
  167. package/.output/server/chunks/routes/api/workshop/agents/subscribe.post.mjs.map +1 -1
  168. package/.output/server/chunks/routes/api/workshop/approvals/_id/decide.post.mjs +2 -0
  169. package/.output/server/chunks/routes/api/workshop/approvals/_id/decide.post.mjs.map +1 -1
  170. package/.output/server/chunks/routes/api/workshop/assets/character/_id_.delete.mjs +2 -0
  171. package/.output/server/chunks/routes/api/workshop/assets/character/_id_.delete.mjs.map +1 -1
  172. package/.output/server/chunks/routes/api/workshop/assets/devices/_id_.delete.mjs +2 -0
  173. package/.output/server/chunks/routes/api/workshop/assets/devices/_id_.delete.mjs.map +1 -1
  174. package/.output/server/chunks/routes/api/workshop/assets/index.get.mjs +2 -0
  175. package/.output/server/chunks/routes/api/workshop/assets/index.get.mjs.map +1 -1
  176. package/.output/server/chunks/routes/api/workshop/assets/index.post.mjs +2 -0
  177. package/.output/server/chunks/routes/api/workshop/assets/index.post.mjs.map +1 -1
  178. package/.output/server/chunks/routes/api/workshop/assets/index2.get.mjs +2 -0
  179. package/.output/server/chunks/routes/api/workshop/assets/index2.get.mjs.map +1 -1
  180. package/.output/server/chunks/routes/api/workshop/assets/index2.post.mjs +2 -0
  181. package/.output/server/chunks/routes/api/workshop/assets/index2.post.mjs.map +1 -1
  182. package/.output/server/chunks/routes/api/workshop/audit.get.mjs +2 -0
  183. package/.output/server/chunks/routes/api/workshop/audit.get.mjs.map +1 -1
  184. package/.output/server/chunks/routes/api/workshop/caller.mjs +2 -0
  185. package/.output/server/chunks/routes/api/workshop/caller.mjs.map +1 -1
  186. package/.output/server/chunks/routes/api/workshop/channel-templates/_id/instantiate.post.mjs +2 -0
  187. package/.output/server/chunks/routes/api/workshop/channel-templates/_id/instantiate.post.mjs.map +1 -1
  188. package/.output/server/chunks/routes/api/workshop/channel-templates/_id_.delete.mjs +2 -0
  189. package/.output/server/chunks/routes/api/workshop/channel-templates/_id_.delete.mjs.map +1 -1
  190. package/.output/server/chunks/routes/api/workshop/channel-templates/_id_.get.mjs +2 -0
  191. package/.output/server/chunks/routes/api/workshop/channel-templates/_id_.get.mjs.map +1 -1
  192. package/.output/server/chunks/routes/api/workshop/channel-templates/_id_.patch.mjs +2 -0
  193. package/.output/server/chunks/routes/api/workshop/channel-templates/_id_.patch.mjs.map +1 -1
  194. package/.output/server/chunks/routes/api/workshop/channel-templates/from-channel.post.mjs +2 -0
  195. package/.output/server/chunks/routes/api/workshop/channel-templates/from-channel.post.mjs.map +1 -1
  196. package/.output/server/chunks/routes/api/workshop/channels/_id/activate.post.mjs +2 -0
  197. package/.output/server/chunks/routes/api/workshop/channels/_id/activate.post.mjs.map +1 -1
  198. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/index.get.mjs +2 -0
  199. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/index.get.mjs.map +1 -1
  200. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/index.post.mjs +2 -0
  201. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/index.post.mjs.map +1 -1
  202. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/memories/_memoryId_.delete.mjs +2 -0
  203. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/memories/_memoryId_.delete.mjs.map +1 -1
  204. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/memories/search.post.mjs +2 -0
  205. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/memories/search.post.mjs.map +1 -1
  206. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/model.patch.mjs +2 -0
  207. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/model.patch.mjs.map +1 -1
  208. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/position.patch.mjs +2 -0
  209. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/position.patch.mjs.map +1 -1
  210. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/range.patch.mjs +2 -0
  211. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/range.patch.mjs.map +1 -1
  212. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/stop.post.mjs +2 -0
  213. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/stop.post.mjs.map +1 -1
  214. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId_.delete.mjs +2 -0
  215. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId_.delete.mjs.map +1 -1
  216. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId_.patch.mjs +2 -0
  217. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId_.patch.mjs.map +1 -1
  218. package/.output/server/chunks/routes/api/workshop/channels/_id/events.get.mjs +2 -0
  219. package/.output/server/chunks/routes/api/workshop/channels/_id/events.get.mjs.map +1 -1
  220. package/.output/server/chunks/routes/api/workshop/channels/_id/index.get.mjs +2 -0
  221. package/.output/server/chunks/routes/api/workshop/channels/_id/index.get.mjs.map +1 -1
  222. package/.output/server/chunks/routes/api/workshop/channels/_id/index.post.mjs +2 -0
  223. package/.output/server/chunks/routes/api/workshop/channels/_id/index.post.mjs.map +1 -1
  224. package/.output/server/chunks/routes/api/workshop/channels/_id/index2.get.mjs +2 -0
  225. package/.output/server/chunks/routes/api/workshop/channels/_id/index2.get.mjs.map +1 -1
  226. package/.output/server/chunks/routes/api/workshop/channels/_id/index2.post.mjs +2 -0
  227. package/.output/server/chunks/routes/api/workshop/channels/_id/index2.post.mjs.map +1 -1
  228. package/.output/server/chunks/routes/api/workshop/channels/_id/index3.get.mjs +2 -0
  229. package/.output/server/chunks/routes/api/workshop/channels/_id/index3.get.mjs.map +1 -1
  230. package/.output/server/chunks/routes/api/workshop/channels/_id/index3.post.mjs +2 -0
  231. package/.output/server/chunks/routes/api/workshop/channels/_id/index3.post.mjs.map +1 -1
  232. package/.output/server/chunks/routes/api/workshop/channels/_id/index4.get.mjs +2 -0
  233. package/.output/server/chunks/routes/api/workshop/channels/_id/index4.get.mjs.map +1 -1
  234. package/.output/server/chunks/routes/api/workshop/channels/_id/index4.post.mjs +2 -0
  235. package/.output/server/chunks/routes/api/workshop/channels/_id/index4.post.mjs.map +1 -1
  236. package/.output/server/chunks/routes/api/workshop/channels/_id/memories/_memoryId_.delete.mjs +2 -0
  237. package/.output/server/chunks/routes/api/workshop/channels/_id/memories/_memoryId_.delete.mjs.map +1 -1
  238. package/.output/server/chunks/routes/api/workshop/channels/_id/queue.get.mjs +2 -0
  239. package/.output/server/chunks/routes/api/workshop/channels/_id/queue.get.mjs.map +1 -1
  240. package/.output/server/chunks/routes/api/workshop/channels/_id/terminals.get.mjs +2 -0
  241. package/.output/server/chunks/routes/api/workshop/channels/_id/terminals.get.mjs.map +1 -1
  242. package/.output/server/chunks/routes/api/workshop/channels/_id_.delete.mjs +2 -0
  243. package/.output/server/chunks/routes/api/workshop/channels/_id_.delete.mjs.map +1 -1
  244. package/.output/server/chunks/routes/api/workshop/channels/index.get.mjs +2 -0
  245. package/.output/server/chunks/routes/api/workshop/channels/index.get.mjs.map +1 -1
  246. package/.output/server/chunks/routes/api/workshop/channels/index.patch.mjs +2 -0
  247. package/.output/server/chunks/routes/api/workshop/channels/index.patch.mjs.map +1 -1
  248. package/.output/server/chunks/routes/api/workshop/channels.get.mjs +2 -0
  249. package/.output/server/chunks/routes/api/workshop/channels.get.mjs.map +1 -1
  250. package/.output/server/chunks/routes/api/workshop/channels.post.mjs +2 -0
  251. package/.output/server/chunks/routes/api/workshop/channels.post.mjs.map +1 -1
  252. package/.output/server/chunks/routes/api/workshop/daq/_id/bind.post.mjs +2 -0
  253. package/.output/server/chunks/routes/api/workshop/daq/_id/bind.post.mjs.map +1 -1
  254. package/.output/server/chunks/routes/api/workshop/daq/_id/frames/content.get.mjs +36 -0
  255. package/.output/server/chunks/routes/api/workshop/daq/_id/frames/content.get.mjs.map +1 -0
  256. package/.output/server/chunks/routes/api/workshop/daq/_id/frames.get.mjs +53 -0
  257. package/.output/server/chunks/routes/api/workshop/daq/_id/frames.get.mjs.map +1 -0
  258. package/.output/server/chunks/routes/api/workshop/daq/_id/samples.get.mjs +2 -0
  259. package/.output/server/chunks/routes/api/workshop/daq/_id/samples.get.mjs.map +1 -1
  260. package/.output/server/chunks/routes/api/workshop/daq/_id/test.post.mjs +2 -0
  261. package/.output/server/chunks/routes/api/workshop/daq/_id/test.post.mjs.map +1 -1
  262. package/.output/server/chunks/routes/api/workshop/daq/_id_.delete.mjs +2 -0
  263. package/.output/server/chunks/routes/api/workshop/daq/_id_.delete.mjs.map +1 -1
  264. package/.output/server/chunks/routes/api/workshop/daq/_id_.patch.mjs +2 -0
  265. package/.output/server/chunks/routes/api/workshop/daq/_id_.patch.mjs.map +1 -1
  266. package/.output/server/chunks/routes/api/workshop/daq/alarms/_id/ack.post.mjs +2 -0
  267. package/.output/server/chunks/routes/api/workshop/daq/alarms/_id/ack.post.mjs.map +1 -1
  268. package/.output/server/chunks/routes/api/workshop/daq/alarms.get.mjs +2 -0
  269. package/.output/server/chunks/routes/api/workshop/daq/alarms.get.mjs.map +1 -1
  270. package/.output/server/chunks/routes/api/workshop/daq/controller.post.mjs +2 -0
  271. package/.output/server/chunks/routes/api/workshop/daq/controller.post.mjs.map +1 -1
  272. package/.output/server/chunks/routes/api/workshop/daq/index.post.mjs +2 -0
  273. package/.output/server/chunks/routes/api/workshop/daq/index.post.mjs.map +1 -1
  274. package/.output/server/chunks/routes/api/workshop/daq/infra/reconnect.post.mjs +2 -0
  275. package/.output/server/chunks/routes/api/workshop/daq/infra/reconnect.post.mjs.map +1 -1
  276. package/.output/server/chunks/routes/api/workshop/daq/infra.get.mjs +2 -0
  277. package/.output/server/chunks/routes/api/workshop/daq/infra.get.mjs.map +1 -1
  278. package/.output/server/chunks/routes/api/workshop/daq/templates/_key_.delete.mjs +2 -0
  279. package/.output/server/chunks/routes/api/workshop/daq/templates/_key_.delete.mjs.map +1 -1
  280. package/.output/server/chunks/routes/api/workshop/daq/templates/_key_.patch.mjs +2 -0
  281. package/.output/server/chunks/routes/api/workshop/daq/templates/_key_.patch.mjs.map +1 -1
  282. package/.output/server/chunks/routes/api/workshop/daq/test-driver.post.mjs +2 -0
  283. package/.output/server/chunks/routes/api/workshop/daq/test-driver.post.mjs.map +1 -1
  284. package/.output/server/chunks/routes/api/workshop/dcw/_id/bind.post.mjs +2 -0
  285. package/.output/server/chunks/routes/api/workshop/dcw/_id/bind.post.mjs.map +1 -1
  286. package/.output/server/chunks/routes/api/workshop/dcw/_id/param-ledger.get.mjs +2 -0
  287. package/.output/server/chunks/routes/api/workshop/dcw/_id/param-ledger.get.mjs.map +1 -1
  288. package/.output/server/chunks/routes/api/workshop/dcw/_id/test.post.mjs +2 -0
  289. package/.output/server/chunks/routes/api/workshop/dcw/_id/test.post.mjs.map +1 -1
  290. package/.output/server/chunks/routes/api/workshop/dcw/_id/write.post.mjs +2 -0
  291. package/.output/server/chunks/routes/api/workshop/dcw/_id/write.post.mjs.map +1 -1
  292. package/.output/server/chunks/routes/api/workshop/dcw/_id_.delete.mjs +2 -0
  293. package/.output/server/chunks/routes/api/workshop/dcw/_id_.delete.mjs.map +1 -1
  294. package/.output/server/chunks/routes/api/workshop/dcw/_id_.patch.mjs +2 -0
  295. package/.output/server/chunks/routes/api/workshop/dcw/_id_.patch.mjs.map +1 -1
  296. package/.output/server/chunks/routes/api/workshop/dcw/controller.post.mjs +2 -0
  297. package/.output/server/chunks/routes/api/workshop/dcw/controller.post.mjs.map +1 -1
  298. package/.output/server/chunks/routes/api/workshop/dcw/index.get.mjs +2 -0
  299. package/.output/server/chunks/routes/api/workshop/dcw/index.get.mjs.map +1 -1
  300. package/.output/server/chunks/routes/api/workshop/dcw/index.post.mjs +2 -0
  301. package/.output/server/chunks/routes/api/workshop/dcw/index.post.mjs.map +1 -1
  302. package/.output/server/chunks/routes/api/workshop/dcw/index2.get.mjs +2 -0
  303. package/.output/server/chunks/routes/api/workshop/dcw/index2.get.mjs.map +1 -1
  304. package/.output/server/chunks/routes/api/workshop/dcw/index2.post.mjs +2 -0
  305. package/.output/server/chunks/routes/api/workshop/dcw/index2.post.mjs.map +1 -1
  306. package/.output/server/chunks/routes/api/workshop/dcw/index3.get.mjs +2 -0
  307. package/.output/server/chunks/routes/api/workshop/dcw/index3.get.mjs.map +1 -1
  308. package/.output/server/chunks/routes/api/workshop/dcw/index3.post.mjs +2 -0
  309. package/.output/server/chunks/routes/api/workshop/dcw/index3.post.mjs.map +1 -1
  310. package/.output/server/chunks/routes/api/workshop/dcw/index4.get.mjs +2 -0
  311. package/.output/server/chunks/routes/api/workshop/dcw/index4.get.mjs.map +1 -1
  312. package/.output/server/chunks/routes/api/workshop/dcw/index4.post.mjs +2 -0
  313. package/.output/server/chunks/routes/api/workshop/dcw/index4.post.mjs.map +1 -1
  314. package/.output/server/chunks/routes/api/workshop/dcw/index5.get.mjs +2 -0
  315. package/.output/server/chunks/routes/api/workshop/dcw/index5.get.mjs.map +1 -1
  316. package/.output/server/chunks/routes/api/workshop/dcw/journal/node/_nodeId/rollback.post.mjs +2 -0
  317. package/.output/server/chunks/routes/api/workshop/dcw/journal/node/_nodeId/rollback.post.mjs.map +1 -1
  318. package/.output/server/chunks/routes/api/workshop/dcw/line/query.get.mjs +2 -0
  319. package/.output/server/chunks/routes/api/workshop/dcw/line/query.get.mjs.map +1 -1
  320. package/.output/server/chunks/routes/api/workshop/dcw/lines/_id/start.post.mjs +2 -0
  321. package/.output/server/chunks/routes/api/workshop/dcw/lines/_id/start.post.mjs.map +1 -1
  322. package/.output/server/chunks/routes/api/workshop/dcw/lines/_id/stop.post.mjs +2 -0
  323. package/.output/server/chunks/routes/api/workshop/dcw/lines/_id/stop.post.mjs.map +1 -1
  324. package/.output/server/chunks/routes/api/workshop/dcw/lines/_id_.delete.mjs +2 -0
  325. package/.output/server/chunks/routes/api/workshop/dcw/lines/_id_.delete.mjs.map +1 -1
  326. package/.output/server/chunks/routes/api/workshop/dcw/lines/_id_.patch.mjs +2 -0
  327. package/.output/server/chunks/routes/api/workshop/dcw/lines/_id_.patch.mjs.map +1 -1
  328. package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id/judge.post.mjs +2 -0
  329. package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id/judge.post.mjs.map +1 -1
  330. package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id/rollback.post.mjs +2 -0
  331. package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id/rollback.post.mjs.map +1 -1
  332. package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id/series.get.mjs +2 -0
  333. package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id/series.get.mjs.map +1 -1
  334. package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id_.get.mjs +2 -0
  335. package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id_.get.mjs.map +1 -1
  336. package/.output/server/chunks/routes/api/workshop/dcw/products/_id_.delete.mjs +2 -0
  337. package/.output/server/chunks/routes/api/workshop/dcw/products/_id_.delete.mjs.map +1 -1
  338. package/.output/server/chunks/routes/api/workshop/dcw/products/_id_.patch.mjs +2 -0
  339. package/.output/server/chunks/routes/api/workshop/dcw/products/_id_.patch.mjs.map +1 -1
  340. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/apply.post.mjs +2 -0
  341. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/apply.post.mjs.map +1 -1
  342. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/mark-good.post.mjs +2 -0
  343. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/mark-good.post.mjs.map +1 -1
  344. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/rollback-good.post.mjs +2 -0
  345. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/rollback-good.post.mjs.map +1 -1
  346. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id_.delete.mjs +2 -0
  347. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id_.delete.mjs.map +1 -1
  348. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id_.patch.mjs +2 -0
  349. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id_.patch.mjs.map +1 -1
  350. package/.output/server/chunks/routes/api/workshop/dcw/runs/_id/close.post.mjs +2 -0
  351. package/.output/server/chunks/routes/api/workshop/dcw/runs/_id/close.post.mjs.map +1 -1
  352. package/.output/server/chunks/routes/api/workshop/dcw/runs/_id/data.get.mjs +2 -0
  353. package/.output/server/chunks/routes/api/workshop/dcw/runs/_id/data.get.mjs.map +1 -1
  354. package/.output/server/chunks/routes/api/workshop/dcw/runs/_id/rollback.post.mjs +2 -0
  355. package/.output/server/chunks/routes/api/workshop/dcw/runs/_id/rollback.post.mjs.map +1 -1
  356. package/.output/server/chunks/routes/api/workshop/dcw/templates/_key_.delete.mjs +2 -0
  357. package/.output/server/chunks/routes/api/workshop/dcw/templates/_key_.delete.mjs.map +1 -1
  358. package/.output/server/chunks/routes/api/workshop/dcw/templates/_key_.patch.mjs +2 -0
  359. package/.output/server/chunks/routes/api/workshop/dcw/templates/_key_.patch.mjs.map +1 -1
  360. package/.output/server/chunks/routes/api/workshop/dcw/test-driver.post.mjs +2 -0
  361. package/.output/server/chunks/routes/api/workshop/dcw/test-driver.post.mjs.map +1 -1
  362. package/.output/server/chunks/routes/api/workshop/device-twins/_id/control.post.mjs +2 -0
  363. package/.output/server/chunks/routes/api/workshop/device-twins/_id/control.post.mjs.map +1 -1
  364. package/.output/server/chunks/routes/api/workshop/device-twins/_id/telemetry.post.mjs +2 -0
  365. package/.output/server/chunks/routes/api/workshop/device-twins/_id/telemetry.post.mjs.map +1 -1
  366. package/.output/server/chunks/routes/api/workshop/device-twins/_id_.delete.mjs +2 -0
  367. package/.output/server/chunks/routes/api/workshop/device-twins/_id_.delete.mjs.map +1 -1
  368. package/.output/server/chunks/routes/api/workshop/device-twins/_id_.patch.mjs +2 -0
  369. package/.output/server/chunks/routes/api/workshop/device-twins/_id_.patch.mjs.map +1 -1
  370. package/.output/server/chunks/routes/api/workshop/fs/dirs.get.mjs +2 -0
  371. package/.output/server/chunks/routes/api/workshop/fs/dirs.get.mjs.map +1 -1
  372. package/.output/server/chunks/routes/api/workshop/index.get.mjs +2 -0
  373. package/.output/server/chunks/routes/api/workshop/index.get.mjs.map +1 -1
  374. package/.output/server/chunks/routes/api/workshop/index.post.mjs +2 -0
  375. package/.output/server/chunks/routes/api/workshop/index.post.mjs.map +1 -1
  376. package/.output/server/chunks/routes/api/workshop/index10.get.mjs +2 -0
  377. package/.output/server/chunks/routes/api/workshop/index10.get.mjs.map +1 -1
  378. package/.output/server/chunks/routes/api/workshop/index2.get.mjs +2 -0
  379. package/.output/server/chunks/routes/api/workshop/index2.get.mjs.map +1 -1
  380. package/.output/server/chunks/routes/api/workshop/index2.post.mjs +2 -0
  381. package/.output/server/chunks/routes/api/workshop/index2.post.mjs.map +1 -1
  382. package/.output/server/chunks/routes/api/workshop/index3.get.mjs +2 -0
  383. package/.output/server/chunks/routes/api/workshop/index3.get.mjs.map +1 -1
  384. package/.output/server/chunks/routes/api/workshop/index3.post.mjs +2 -0
  385. package/.output/server/chunks/routes/api/workshop/index3.post.mjs.map +1 -1
  386. package/.output/server/chunks/routes/api/workshop/index4.get.mjs +2 -0
  387. package/.output/server/chunks/routes/api/workshop/index4.get.mjs.map +1 -1
  388. package/.output/server/chunks/routes/api/workshop/index4.post.mjs +2 -0
  389. package/.output/server/chunks/routes/api/workshop/index4.post.mjs.map +1 -1
  390. package/.output/server/chunks/routes/api/workshop/index5.get.mjs +2 -0
  391. package/.output/server/chunks/routes/api/workshop/index5.get.mjs.map +1 -1
  392. package/.output/server/chunks/routes/api/workshop/index5.post.mjs +2 -0
  393. package/.output/server/chunks/routes/api/workshop/index5.post.mjs.map +1 -1
  394. package/.output/server/chunks/routes/api/workshop/index6.get.mjs +2 -0
  395. package/.output/server/chunks/routes/api/workshop/index6.get.mjs.map +1 -1
  396. package/.output/server/chunks/routes/api/workshop/index6.post.mjs +2 -0
  397. package/.output/server/chunks/routes/api/workshop/index6.post.mjs.map +1 -1
  398. package/.output/server/chunks/routes/api/workshop/index7.get.mjs +2 -0
  399. package/.output/server/chunks/routes/api/workshop/index7.get.mjs.map +1 -1
  400. package/.output/server/chunks/routes/api/workshop/index7.post.mjs +2 -0
  401. package/.output/server/chunks/routes/api/workshop/index7.post.mjs.map +1 -1
  402. package/.output/server/chunks/routes/api/workshop/index8.get.mjs +2 -0
  403. package/.output/server/chunks/routes/api/workshop/index8.get.mjs.map +1 -1
  404. package/.output/server/chunks/routes/api/workshop/index8.post.mjs +2 -0
  405. package/.output/server/chunks/routes/api/workshop/index8.post.mjs.map +1 -1
  406. package/.output/server/chunks/routes/api/workshop/index9.get.mjs +2 -0
  407. package/.output/server/chunks/routes/api/workshop/index9.get.mjs.map +1 -1
  408. package/.output/server/chunks/routes/api/workshop/mailbox/all.get.mjs +2 -0
  409. package/.output/server/chunks/routes/api/workshop/mailbox/all.get.mjs.map +1 -1
  410. package/.output/server/chunks/routes/api/workshop/mailbox.get.mjs +2 -0
  411. package/.output/server/chunks/routes/api/workshop/mailbox.get.mjs.map +1 -1
  412. package/.output/server/chunks/routes/api/workshop/memories/maintenance.post.mjs +2 -0
  413. package/.output/server/chunks/routes/api/workshop/memories/maintenance.post.mjs.map +1 -1
  414. package/.output/server/chunks/routes/api/workshop/plugins/_name/disable.post.mjs +2 -0
  415. package/.output/server/chunks/routes/api/workshop/plugins/_name/disable.post.mjs.map +1 -1
  416. package/.output/server/chunks/routes/api/workshop/plugins/_name/enable.post.mjs +2 -0
  417. package/.output/server/chunks/routes/api/workshop/plugins/_name/enable.post.mjs.map +1 -1
  418. package/.output/server/chunks/routes/api/workshop/plugins/index.get.mjs +2 -0
  419. package/.output/server/chunks/routes/api/workshop/plugins/index.get.mjs.map +1 -1
  420. package/.output/server/chunks/routes/api/workshop/runtime.get.mjs +2 -0
  421. package/.output/server/chunks/routes/api/workshop/runtime.get.mjs.map +1 -1
  422. package/.output/server/chunks/routes/api/workshop/scene/layouts/_channelId_.delete.mjs +2 -0
  423. package/.output/server/chunks/routes/api/workshop/scene/layouts/_channelId_.delete.mjs.map +1 -1
  424. package/.output/server/chunks/routes/api/workshop/scene/layouts/_channelId_.put.mjs +2 -0
  425. package/.output/server/chunks/routes/api/workshop/scene/layouts/_channelId_.put.mjs.map +1 -1
  426. package/.output/server/chunks/routes/api/workshop/scene/layouts.get.mjs +2 -0
  427. package/.output/server/chunks/routes/api/workshop/scene/layouts.get.mjs.map +1 -1
  428. package/.output/server/chunks/routes/api/workshop/tasks/_id/complete.post.mjs +2 -0
  429. package/.output/server/chunks/routes/api/workshop/tasks/_id/complete.post.mjs.map +1 -1
  430. package/.output/server/chunks/routes/api/workshop/tasks/_id/dispatch.post.mjs +2 -0
  431. package/.output/server/chunks/routes/api/workshop/tasks/_id/dispatch.post.mjs.map +1 -1
  432. package/.output/server/chunks/routes/api/workshop/tasks/_id/index.post.mjs +2 -0
  433. package/.output/server/chunks/routes/api/workshop/tasks/_id/index.post.mjs.map +1 -1
  434. package/.output/server/chunks/routes/api/workshop/tasks/_id/report.post.mjs +2 -0
  435. package/.output/server/chunks/routes/api/workshop/tasks/_id/report.post.mjs.map +1 -1
  436. package/.output/server/chunks/routes/api/workshop/tasks/_id/retry.post.mjs +2 -0
  437. package/.output/server/chunks/routes/api/workshop/tasks/_id/retry.post.mjs.map +1 -1
  438. package/.output/server/chunks/routes/api/workshop/tasks/_id_.get.mjs +2 -0
  439. package/.output/server/chunks/routes/api/workshop/tasks/_id_.get.mjs.map +1 -1
  440. package/.output/server/chunks/routes/api/workshop/tasks.get.mjs +2 -0
  441. package/.output/server/chunks/routes/api/workshop/tasks.get.mjs.map +1 -1
  442. package/.output/server/chunks/routes/api/workshop/teams/_id/deploy.post.mjs +2 -0
  443. package/.output/server/chunks/routes/api/workshop/teams/_id/deploy.post.mjs.map +1 -1
  444. package/.output/server/chunks/routes/api/workshop/teams/_id/index.get.mjs +2 -0
  445. package/.output/server/chunks/routes/api/workshop/teams/_id/index.get.mjs.map +1 -1
  446. package/.output/server/chunks/routes/api/workshop/teams/_id/index.post.mjs +2 -0
  447. package/.output/server/chunks/routes/api/workshop/teams/_id/index.post.mjs.map +1 -1
  448. package/.output/server/chunks/routes/api/workshop/teams/_id/members/_agentId_.delete.mjs +2 -0
  449. package/.output/server/chunks/routes/api/workshop/teams/_id/members/_agentId_.delete.mjs.map +1 -1
  450. package/.output/server/chunks/routes/api/workshop/teams/_id_.delete.mjs +2 -0
  451. package/.output/server/chunks/routes/api/workshop/teams/_id_.delete.mjs.map +1 -1
  452. package/.output/server/chunks/routes/api/workshop/teams/_id_.get.mjs +2 -0
  453. package/.output/server/chunks/routes/api/workshop/teams/_id_.get.mjs.map +1 -1
  454. package/.output/server/chunks/routes/api/workshop/teams/_id_.patch.mjs +2 -0
  455. package/.output/server/chunks/routes/api/workshop/teams/_id_.patch.mjs.map +1 -1
  456. package/.output/server/chunks/routes/api/workshop/users/me.get.mjs +2 -0
  457. package/.output/server/chunks/routes/api/workshop/users/me.get.mjs.map +1 -1
  458. package/.output/server/chunks/routes/api/workshop/users/register.post.mjs +2 -0
  459. package/.output/server/chunks/routes/api/workshop/users/register.post.mjs.map +1 -1
  460. package/.output/server/chunks/routes/api/workshop/workspaces/_id/channel-templates/_tplId_.post.mjs +2 -0
  461. package/.output/server/chunks/routes/api/workshop/workspaces/_id/channel-templates/_tplId_.post.mjs.map +1 -1
  462. package/.output/server/chunks/routes/api/workshop/workspaces/_id/channels/_channelId_.delete.mjs +2 -0
  463. package/.output/server/chunks/routes/api/workshop/workspaces/_id/channels/_channelId_.delete.mjs.map +1 -1
  464. package/.output/server/chunks/routes/api/workshop/workspaces/_id/channels/_channelId_.post.mjs +2 -0
  465. package/.output/server/chunks/routes/api/workshop/workspaces/_id/channels/_channelId_.post.mjs.map +1 -1
  466. package/.output/server/chunks/routes/api/workshop/workspaces/index.delete.mjs +2 -0
  467. package/.output/server/chunks/routes/api/workshop/workspaces/index.delete.mjs.map +1 -1
  468. package/.output/server/chunks/routes/renderer.mjs +1 -1
  469. package/.output/server/chunks/routes/renderer.mjs.map +1 -1
  470. package/.output/server/chunks/virtual/entry.mjs +166 -114
  471. package/.output/server/chunks/virtual/entry.mjs.map +1 -1
  472. package/.output/server/chunks/virtual/precomputed.mjs +1 -1
  473. package/.output/server/index.mjs +2 -0
  474. package/.output/server/index.mjs.map +1 -1
  475. package/.output/server/package.json +1 -1
  476. package/app/composables/workshop/useDaqStream.ts +59 -1
  477. package/app/config/schema.ts +8 -0
  478. package/app/pages/daq/[id].vue +141 -1
  479. package/app/pages/settings.vue +10 -5
  480. package/app/plugins/runtime-config.client.ts +65 -65
  481. package/app/stores/runtime-config.ts +212 -212
  482. package/config.yml +77 -70
  483. package/docker-compose.yml +19 -2
  484. package/docs/plugins.md +271 -197
  485. package/i18n/dicts/_en.json +7 -2
  486. package/i18n/dicts/daqDetail.json +8 -2
  487. package/i18n/locales/en.ts +55 -29
  488. package/i18n/locales/zh-CN.ts +55 -29
  489. package/nuxt.config.ts +1 -1
  490. package/package.json +144 -143
  491. package/scripts/_dbg-collab-scenario-e2e.mjs +185 -0
  492. package/scripts/_dbg-daq-frame-alarm.mjs +49 -0
  493. package/scripts/_dbg-daq-frame-ui.mjs +62 -0
  494. package/scripts/_dbg-daq-frame-ws.mjs +72 -0
  495. package/scripts/_dbg-daq-frames-e2e.mjs +118 -0
  496. package/scripts/_dbg-host.mjs +16 -0
  497. package/scripts/_dbg-plugin-agent-read.ts +56 -0
  498. package/scripts/_dbg-plugin-sink-rest.mjs +70 -0
  499. package/scripts/_dbg-plugin-sink-ui.mjs +81 -0
  500. package/scripts/_dbg-plugin-tools-inject.ts +80 -0
  501. package/scripts/_dbg-plugin-verify-e2e.mjs +123 -0
  502. package/scripts/_dbg-prompts-hotreload-test.ts +76 -0
  503. package/scripts/_dbg-release-smoke.mjs +104 -0
  504. package/scripts/i18n-merge.mjs +69 -67
  505. package/scripts/test-context-governor.ts +176 -176
  506. package/scripts/test-daq-frames.ts +180 -0
  507. package/scripts/test-daq-minio.ts +77 -0
  508. package/scripts/test-memory-rrf-mmr.ts +114 -114
  509. package/scripts/test-plugin-ext.ts +173 -0
  510. package/server/api/system/settings/events.get.ts +27 -28
  511. package/server/api/system/settings/index.get.ts +14 -14
  512. package/server/api/system/settings/index.patch.ts +22 -22
  513. package/server/api/system/settings/reset.post.ts +12 -12
  514. package/server/api/workshop/daq/[id]/frames/content.get.ts +24 -0
  515. package/server/api/workshop/daq/[id]/frames.get.ts +44 -0
  516. package/server/data/daqs.json +113 -89
  517. package/server/data/dcw-rollback.json +1 -1
  518. package/server/data/dcw-runs.json +3207 -2517
  519. package/server/data/dcw-writes.json +720 -0
  520. package/server/data/dcws.json +4 -4
  521. package/server/data/line-runs.json +1 -232
  522. package/server/plugins/daq.ts +11 -0
  523. package/server/plugins/system-config.ts +38 -38
  524. package/server/services/system-config.ts +365 -356
  525. package/server/services/workshop/agents/industrial-tools.ts +91 -25
  526. package/server/services/workshop/agents/omp-agent.ts +1955 -1895
  527. package/server/services/workshop/agents/plugin-tools.ts +145 -0
  528. package/server/services/workshop/daq/bus/queue-port.ts +18 -0
  529. package/server/services/workshop/daq/daq-controller.ts +216 -14
  530. package/server/services/workshop/daq/daq-node.ts +257 -247
  531. package/server/services/workshop/daq/daq-runtime.ts +36 -4
  532. package/server/services/workshop/daq/daq-templates.ts +213 -157
  533. package/server/services/workshop/daq/drivers.ts +134 -30
  534. package/server/services/workshop/daq/frames.ts +227 -0
  535. package/server/services/workshop/daq/infra.ts +31 -17
  536. package/server/services/workshop/daq/objectstore/disk.adapter.ts +38 -0
  537. package/server/services/workshop/daq/objectstore/index.ts +88 -0
  538. package/server/services/workshop/daq/objectstore/minio.adapter.ts +60 -0
  539. package/server/services/workshop/daq/objectstore/objectstore-port.ts +27 -0
  540. package/server/services/workshop/daq/plugin-bridge.ts +73 -0
  541. package/server/services/workshop/daq/png-enc.ts +71 -0
  542. package/server/services/workshop/daq/storage/sqlite.adapter.ts +104 -1
  543. package/server/services/workshop/daq/storage/timescale.adapter.ts +95 -4
  544. package/server/services/workshop/daq/storage/tsdb-port.ts +46 -0
  545. package/server/services/workshop/plugins/host.mjs +479 -417
  546. package/server/services/workshop/runtime/agent-runtime.ts +744 -744
  547. package/shared/config/schema.json +6 -1
  548. package/shared/daq-protocol.ts +88 -0
  549. package/.output/public/_nuxt/B-PgoIPN.js +0 -1
  550. package/.output/public/_nuxt/DVNYfGsj.js +0 -1
  551. package/.output/public/_nuxt/_id_.CbiF5PrV.css +0 -1
  552. package/.output/public/_nuxt/builds/meta/6f7e40bf-a960-4f51-8a2e-bb1fffeaa5e8.json +0 -1
  553. package/.output/public/_nuxt/settings.BANibAnV.css +0 -1
  554. package/.output/server/chunks/build/_id_-BOhG2yz8.mjs.map +0 -1
  555. package/.output/server/chunks/build/_id_-CuyMYmhY.mjs.map +0 -1
  556. package/.output/server/chunks/build/agents-BVaxN75W.mjs.map +0 -1
  557. package/.output/server/chunks/build/channel-templates-D1K2IKrE.mjs.map +0 -1
  558. package/.output/server/chunks/build/client-only-CFTHwakk.mjs.map +0 -1
  559. package/.output/server/chunks/build/daq-ObtN1TQ4.mjs.map +0 -1
  560. package/.output/server/chunks/build/dcw-fINr-He1.mjs.map +0 -1
  561. package/.output/server/chunks/build/interval-Bt11uRPw.mjs +0 -9
  562. package/.output/server/chunks/build/interval-Bt11uRPw.mjs.map +0 -1
  563. package/.output/server/chunks/build/logs-DqNgCJAn.mjs.map +0 -1
  564. package/.output/server/chunks/build/pages-DC52d7z7.mjs.map +0 -1
  565. package/.output/server/chunks/build/plugins-DVQty7qG.mjs.map +0 -1
  566. package/.output/server/chunks/build/settings-BeergncK.mjs.map +0 -1
  567. package/.output/server/chunks/build/teams-CFeDlHDh.mjs.map +0 -1
  568. package/.output/server/chunks/build/tokens-CBAUbOce.mjs.map +0 -1
  569. package/.output/server/chunks/build/town-BxH-XXth.mjs.map +0 -1
  570. package/.output/server/chunks/build/useDaqStream-CwORhsD7.mjs.map +0 -1
  571. package/.output/server/chunks/build/users-BMs4s_6K.mjs.map +0 -1
  572. package/.output/server/chunks/build/workshop-CJAyZ5zS.mjs.map +0 -1
@@ -1,157 +1,213 @@
1
- /**
2
- * DaqTemplate 注册表 —— 内置模板(shared 单一事实源)+ 用户自定义模板的统一查询口。
3
- *
4
- * 自定义模板落盘 server/data/daq-templates.json(仅存自定义;内置始终在代码里),
5
- * 与 DaqNodeRepo 同风格:进程内缓存 + 同步落盘(量小无抖动)。节点创建校验、
6
- * 缺省域、mock 采样一律经 findDaqTemplate 查找 —— 自定义模板与内置同权。
7
- */
8
-
9
- import { createLogger } from '../logger'
10
- import fs from 'node:fs'
11
- import { join } from 'node:path'
12
- import { randomUUID } from 'node:crypto'
13
- import { DAQ_TEMPLATES, DAQ_TEMPLATE_ICONS, daqTemplateByKey, type DaqTemplateDef, type DaqTemplateIcon, type DaqTemplateInput } from '../../../../shared/daq-protocol'
14
- import { AppError, ErrorCodes } from '../../../utils/errors'
15
- import { ensureDataDir } from '@/shared/config/home.mjs'
16
-
17
- const log = createLogger('daq.templates')
18
-
19
- /** 业务错误捷径(经 defineApiHandler 映射为对应 HTTP 状态与消息) */
20
- const bad = (msg: string): AppError => new AppError(400, ErrorCodes.VALIDATION_ERROR, msg)
21
-
22
- // 配置根 .AgentWorkShop/data(ensureDataDir 统一解析 + 旧位置迁移)
23
- const DB_PATH = join(ensureDataDir(), 'daq-templates.json')
24
-
25
- function load(): DaqTemplateDef[] {
26
- try {
27
- const raw = fs.readFileSync(DB_PATH, 'utf-8')
28
- const parsed = JSON.parse(raw)
29
- return Array.isArray(parsed) ? parsed as DaqTemplateDef[] : []
30
- }
31
- catch {
32
- return []
33
- }
34
- }
35
-
36
- /** 输入校验 + 归一(base/amp/decimals 等缺省由量程推导;非法值直接抛业务错误) */
37
- function normalize(input: Partial<DaqTemplateInput>, prev?: DaqTemplateDef): DaqTemplateDef {
38
- const name = String(input.name ?? prev?.name ?? '').trim()
39
- if (!name) throw bad('模板名称必填')
40
- const unit = String(input.unit ?? prev?.unit ?? '').trim()
41
- if (!unit) throw bad('单位必填(如 ℃ / MPa)')
42
-
43
- const min = Number(input.min ?? prev?.min)
44
- const max = Number(input.max ?? prev?.max)
45
- if (!Number.isFinite(min) || !Number.isFinite(max) || min >= max) {
46
- throw bad('量程非法:需满足 min < max 的数字')
47
- }
48
-
49
- const base = input.base ?? prev?.base ?? (min + max) / 2
50
- if (!Number.isFinite(Number(base))) throw bad('模拟基值需为数字')
51
-
52
- const amp = Number(input.amp ?? prev?.amp ?? Math.max((max - min) * 0.04, 0.001))
53
- if (!Number.isFinite(amp) || amp <= 0) throw bad('模拟波幅需为正数')
54
-
55
- const decimals = Math.round(Number(input.decimals ?? prev?.decimals ?? 2))
56
- if (!Number.isInteger(decimals) || decimals < 0 || decimals > 4) {
57
- throw bad('小数位需为 0~4 的整数')
58
- }
59
-
60
- const iconRaw = String(input.icon ?? prev?.icon ?? 'thermo')
61
- const icon = (DAQ_TEMPLATE_ICONS as readonly string[]).includes(iconRaw)
62
- ? iconRaw as DaqTemplateIcon
63
- : 'thermo'
64
-
65
- return {
66
- key: prev?.key ?? `ct-${randomUUID().slice(0, 8)}`,
67
- name,
68
- code: String(input.code ?? prev?.code ?? name).trim().toUpperCase() || name.toUpperCase(),
69
- ch: String(input.ch ?? prev?.ch ?? name).trim() || name,
70
- unit,
71
- base: Number(base),
72
- amp,
73
- min,
74
- max,
75
- decimals,
76
- icon,
77
- semantics: String(input.semantics ?? prev?.semantics ?? '').trim() || undefined,
78
- telemetryKey: String(input.telemetryKey ?? prev?.telemetryKey ?? '').trim() || undefined,
79
- builtin: false,
80
- }
81
- }
82
-
83
- class DaqTemplateRegistry {
84
- private customs: DaqTemplateDef[]
85
-
86
- constructor() {
87
- this.customs = load()
88
- }
89
-
90
- /** 全目录:内置在前(统一打 builtin 标记,前端据此分区),自定义在后 */
91
- all(): DaqTemplateDef[] {
92
- return [...DAQ_TEMPLATES.map(t => ({ ...t, builtin: true })), ...this.customs]
93
- }
94
-
95
- byKey(key: string): DaqTemplateDef | undefined {
96
- return daqTemplateByKey(key) ?? this.customs.find(t => t.key === key)
97
- }
98
-
99
- create(input: DaqTemplateInput): DaqTemplateDef {
100
- const tpl = normalize(input)
101
- if (this.customs.some(t => t.name === tpl.name)) {
102
- throw new AppError(409, ErrorCodes.CONFLICT, `同名自定义模板已存在: ${tpl.name}`)
103
- }
104
- this.customs.push(tpl)
105
- this.flush()
106
- return tpl
107
- }
108
-
109
- update(key: string, patch: Partial<DaqTemplateInput>): DaqTemplateDef {
110
- const prev = this.customs.find(t => t.key === key)
111
- if (!prev) {
112
- throw new AppError(400, ErrorCodes.BAD_REQUEST, daqTemplateByKey(key) ? '内置模板不可修改(可复制为自定义)' : `自定义模板不存在: ${key}`)
113
- }
114
- const tpl = normalize(patch, prev)
115
- this.customs = this.customs.map(t => (t.key === key ? tpl : t))
116
- this.flush()
117
- return tpl
118
- }
119
-
120
- remove(key: string): DaqTemplateDef {
121
- const prev = this.customs.find(t => t.key === key)
122
- if (!prev) {
123
- throw new AppError(400, ErrorCodes.BAD_REQUEST, daqTemplateByKey(key) ? '内置模板不可删除' : `自定义模板不存在: ${key}`)
124
- }
125
- this.customs = this.customs.filter(t => t.key !== key)
126
- this.flush()
127
- return prev
128
- }
129
-
130
- private flush(): void {
131
- try {
132
- fs.mkdirSync(join(DB_PATH, '..'), { recursive: true })
133
- fs.writeFileSync(DB_PATH, JSON.stringify(this.customs, null, 2), 'utf-8')
134
- }
135
- catch (err) {
136
- log.error('[daq] 模板落盘失败:', err)
137
- }
138
- }
139
- }
140
-
141
- // 单例(HMR 存活,与 DaqNodeRepo 同风格)
142
- const g = globalThis as typeof globalThis & { __daqTemplateRegistry?: DaqTemplateRegistry }
143
-
144
- export function getDaqTemplateRegistry(): DaqTemplateRegistry {
145
- g.__daqTemplateRegistry ??= new DaqTemplateRegistry()
146
- return g.__daqTemplateRegistry
147
- }
148
-
149
- /** 目录快照(server 返回给前端时附带 builtin 标记) */
150
- export function listDaqTemplates(): DaqTemplateDef[] {
151
- return getDaqTemplateRegistry().all()
152
- }
153
-
154
- /** 节点缺省域/mock 采样的统一查找口(内置 + 自定义) */
155
- export function findDaqTemplate(key: string): DaqTemplateDef | undefined {
156
- return getDaqTemplateRegistry().byKey(key)
157
- }
1
+ /**
2
+ * DaqTemplate 注册表 —— 内置模板(shared 单一事实源)+ 用户自定义模板的统一查询口。
3
+ *
4
+ * 自定义模板落盘 server/data/daq-templates.json(仅存自定义;内置始终在代码里),
5
+ * 与 DaqNodeRepo 同风格:进程内缓存 + 同步落盘(量小无抖动)。节点创建校验、
6
+ * 缺省域、mock 采样一律经 findDaqTemplate 查找 —— 自定义模板与内置同权。
7
+ */
8
+
9
+ import { createLogger } from '../logger'
10
+ import fs from 'node:fs'
11
+ import { join } from 'node:path'
12
+ import { randomUUID } from 'node:crypto'
13
+ import { DAQ_TEMPLATES, DAQ_TEMPLATE_ICONS, daqTemplateByKey, normalizeSignalKind, type DaqMetricRule, type DaqSinkStep, type DaqTemplateDef, type DaqTemplateIcon, type DaqTemplateInput } from '../../../../shared/daq-protocol'
14
+ import { AppError, ErrorCodes } from '../../../utils/errors'
15
+ import { ensureDataDir } from '@/shared/config/home.mjs'
16
+
17
+ const log = createLogger('daq.templates')
18
+
19
+ /** 业务错误捷径(经 defineApiHandler 映射为对应 HTTP 状态与消息) */
20
+ const bad = (msg: string): AppError => new AppError(400, ErrorCodes.VALIDATION_ERROR, msg)
21
+
22
+ // 配置根 .AgentWorkShop/data(ensureDataDir 统一解析 + 旧位置迁移)
23
+ const DB_PATH = join(ensureDataDir(), 'daq-templates.json')
24
+
25
+ function load(): DaqTemplateDef[] {
26
+ try {
27
+ const raw = fs.readFileSync(DB_PATH, 'utf-8')
28
+ const parsed = JSON.parse(raw)
29
+ return Array.isArray(parsed) ? parsed as DaqTemplateDef[] : []
30
+ }
31
+ catch {
32
+ return []
33
+ }
34
+ }
35
+
36
+ /** 输入校验 + 归一(base/amp/decimals 等缺省由量程推导;非法值直接抛业务错误) */
37
+ function normalize(input: Partial<DaqTemplateInput>, prev?: DaqTemplateDef): DaqTemplateDef {
38
+ const name = String(input.name ?? prev?.name ?? '').trim()
39
+ if (!name) throw bad('模板名称必填')
40
+ const unit = String(input.unit ?? prev?.unit ?? '').trim()
41
+ if (!unit) throw bad('单位必填(如 ℃ / MPa)')
42
+
43
+ const min = Number(input.min ?? prev?.min)
44
+ const max = Number(input.max ?? prev?.max)
45
+ if (!Number.isFinite(min) || !Number.isFinite(max) || min >= max) {
46
+ throw bad('量程非法:需满足 min < max 的数字')
47
+ }
48
+
49
+ const base = input.base ?? prev?.base ?? (min + max) / 2
50
+ if (!Number.isFinite(Number(base))) throw bad('模拟基值需为数字')
51
+
52
+ const amp = Number(input.amp ?? prev?.amp ?? Math.max((max - min) * 0.04, 0.001))
53
+ if (!Number.isFinite(amp) || amp <= 0) throw bad('模拟波幅需为正数')
54
+
55
+ const decimals = Math.round(Number(input.decimals ?? prev?.decimals ?? 2))
56
+ if (!Number.isInteger(decimals) || decimals < 0 || decimals > 4) {
57
+ throw bad('小数位需为 0~4 的整数')
58
+ }
59
+
60
+ const iconRaw = String(input.icon ?? prev?.icon ?? 'thermo')
61
+ const icon = (DAQ_TEMPLATE_ICONS as readonly string[]).includes(iconRaw)
62
+ ? iconRaw as DaqTemplateIcon
63
+ : 'thermo'
64
+
65
+ // 多形态信号(v2 帧管线):signalKind/vector/sink/metrics 归一(缺省 scalar 零行为变化)
66
+ const signalKind = normalizeSignalKind(input.signalKind ?? prev?.signalKind)
67
+ let vector: DaqTemplateDef['vector']
68
+ if (signalKind === 'vector') {
69
+ const points = Math.round(Number(input.vector?.points ?? prev?.vector?.points ?? 64))
70
+ if (!Number.isInteger(points) || points < 2 || points > 4096) {
71
+ throw bad('vector.points 需为 2~4096 的整数')
72
+ }
73
+ const vmin = Number(input.vector?.min ?? prev?.vector?.min ?? min)
74
+ const vmax = Number(input.vector?.max ?? prev?.vector?.max ?? max)
75
+ if (!Number.isFinite(vmin) || !Number.isFinite(vmax) || vmin >= vmax) throw bad('vector 量程非法')
76
+ vector = { points, min: vmin, max: vmax }
77
+ }
78
+ const sink = input.sink ?? prev?.sink
79
+ if (sink && (!Array.isArray(sink.processors) || sink.processors.some(p => !p || typeof p.name !== 'string'))) {
80
+ throw bad('sink.processors 非法:需为 { name, args? } 数组')
81
+ }
82
+ const metrics = (input.metrics ?? prev?.metrics)?.filter(r => r && typeof r.key === 'string' && r.key.trim()) as DaqMetricRule[] | undefined
83
+
84
+ return {
85
+ key: prev?.key ?? `ct-${randomUUID().slice(0, 8)}`,
86
+ name,
87
+ code: String(input.code ?? prev?.code ?? name).trim().toUpperCase() || name.toUpperCase(),
88
+ ch: String(input.ch ?? prev?.ch ?? name).trim() || name,
89
+ unit,
90
+ base: Number(base),
91
+ amp,
92
+ min,
93
+ max,
94
+ decimals,
95
+ icon,
96
+ semantics: String(input.semantics ?? prev?.semantics ?? '').trim() || undefined,
97
+ telemetryKey: String(input.telemetryKey ?? prev?.telemetryKey ?? '').trim() || undefined,
98
+ builtin: false,
99
+ signalKind,
100
+ vector,
101
+ sink: sink && sink.processors.length > 0 ? { processors: sink.processors as DaqSinkStep[] } : undefined,
102
+ metrics: metrics && metrics.length > 0 ? metrics : undefined,
103
+ }
104
+ }
105
+
106
+ class DaqTemplateRegistry {
107
+ private customs: DaqTemplateDef[]
108
+ /** 插件注册模板(内存态,键 = 模板 key;插件热重载同名覆盖;不经 REST 增删) */
109
+ private pluginTpls = new Map<string, DaqTemplateDef>()
110
+
111
+ constructor() {
112
+ this.customs = load()
113
+ }
114
+
115
+ /** 全目录:内置在前(统一打 builtin 标记),插件模板居中(打 plugin 标记),自定义在后 */
116
+ all(): DaqTemplateDef[] {
117
+ return [
118
+ ...DAQ_TEMPLATES.map(t => ({ ...t, builtin: true })),
119
+ ...[...this.pluginTpls.values()].map(t => ({ ...t, plugin: t.plugin ?? 'plugin' })),
120
+ ...this.customs,
121
+ ]
122
+ }
123
+
124
+ byKey(key: string): DaqTemplateDef | undefined {
125
+ return daqTemplateByKey(key) ?? this.pluginTpls.get(key) ?? this.customs.find(t => t.key === key)
126
+ }
127
+
128
+ /**
129
+ * 插件模板注册(同名 key 覆盖 → 插件热重载幂等;REST 不可增删改)。
130
+ * def.key 必填(建议 `plug-<plugin>-<sig>` 命名);signalKind/sink/metrics 全量可用。
131
+ */
132
+ registerPlugin(def: DaqTemplateDef): DaqTemplateDef {
133
+ if (!def?.key || !/^[\w-]+$/.test(def.key)) {
134
+ throw new AppError(400, ErrorCodes.VALIDATION_ERROR, `插件模板 key 非法: ${def?.key}(需 [\\w-]+)`)
135
+ }
136
+ if (daqTemplateByKey(def.key)) {
137
+ throw new AppError(400, ErrorCodes.VALIDATION_ERROR, `插件模板 key 与内置模板冲突: ${def.key}`)
138
+ }
139
+ const merged: DaqTemplateDef = { ...def, plugin: def.plugin ?? 'plugin' }
140
+ this.pluginTpls.set(def.key, merged)
141
+ log.info(`[daq] 插件模板注册:「${merged.name}」(${def.key},插件=${merged.plugin})`)
142
+ return merged
143
+ }
144
+
145
+ isPlugin(key: string): boolean {
146
+ return this.pluginTpls.has(key)
147
+ }
148
+
149
+ create(input: DaqTemplateInput): DaqTemplateDef {
150
+ const tpl = normalize(input)
151
+ if (this.customs.some(t => t.name === tpl.name)) {
152
+ throw new AppError(409, ErrorCodes.CONFLICT, `同名自定义模板已存在: ${tpl.name}`)
153
+ }
154
+ this.customs.push(tpl)
155
+ this.flush()
156
+ return tpl
157
+ }
158
+
159
+ update(key: string, patch: Partial<DaqTemplateInput>): DaqTemplateDef {
160
+ if (this.pluginTpls.has(key)) {
161
+ throw new AppError(400, ErrorCodes.BAD_REQUEST, '插件模板不可经 REST 修改(由插件自身管理)')
162
+ }
163
+ const prev = this.customs.find(t => t.key === key)
164
+ if (!prev) {
165
+ throw new AppError(400, ErrorCodes.BAD_REQUEST, daqTemplateByKey(key) ? '内置模板不可修改(可复制为自定义)' : `自定义模板不存在: ${key}`)
166
+ }
167
+ const tpl = normalize(patch, prev)
168
+ this.customs = this.customs.map(t => (t.key === key ? tpl : t))
169
+ this.flush()
170
+ return tpl
171
+ }
172
+
173
+ remove(key: string): DaqTemplateDef {
174
+ if (this.pluginTpls.has(key)) {
175
+ throw new AppError(400, ErrorCodes.BAD_REQUEST, '插件模板不可经 REST 删除(由插件自身管理)')
176
+ }
177
+ const prev = this.customs.find(t => t.key === key)
178
+ if (!prev) {
179
+ throw new AppError(400, ErrorCodes.BAD_REQUEST, daqTemplateByKey(key) ? '内置模板不可删除' : `自定义模板不存在: ${key}`)
180
+ }
181
+ this.customs = this.customs.filter(t => t.key !== key)
182
+ this.flush()
183
+ return prev
184
+ }
185
+
186
+ private flush(): void {
187
+ try {
188
+ fs.mkdirSync(join(DB_PATH, '..'), { recursive: true })
189
+ fs.writeFileSync(DB_PATH, JSON.stringify(this.customs, null, 2), 'utf-8')
190
+ }
191
+ catch (err) {
192
+ log.error('[daq] 模板落盘失败:', err)
193
+ }
194
+ }
195
+ }
196
+
197
+ // 单例(HMR 存活,与 DaqNodeRepo 同风格)
198
+ const g = globalThis as typeof globalThis & { __daqTemplateRegistry?: DaqTemplateRegistry }
199
+
200
+ export function getDaqTemplateRegistry(): DaqTemplateRegistry {
201
+ g.__daqTemplateRegistry ??= new DaqTemplateRegistry()
202
+ return g.__daqTemplateRegistry
203
+ }
204
+
205
+ /** 目录快照(server 返回给前端时附带 builtin 标记) */
206
+ export function listDaqTemplates(): DaqTemplateDef[] {
207
+ return getDaqTemplateRegistry().all()
208
+ }
209
+
210
+ /** 节点缺省域/mock 采样的统一查找口(内置 + 自定义) */
211
+ export function findDaqTemplate(key: string): DaqTemplateDef | undefined {
212
+ return getDaqTemplateRegistry().byKey(key)
213
+ }
@@ -16,6 +16,7 @@
16
16
  */
17
17
  import { createLogger } from '../logger'
18
18
  import { createRequire } from 'node:module'
19
+ import { encodePng } from './png-enc'
19
20
  import type { DaqDriverKind, DriverTestResult } from '../../../../shared/daq-protocol'
20
21
 
21
22
  const log = createLogger('daq.drivers')
@@ -36,13 +37,38 @@ export interface DaqDriverInput {
36
37
  config: { base: number, amp: number, min: number, max: number }
37
38
  /** 节点保存的协议连接参数(host/register/endpoint/nodeId...) */
38
39
  driverConfig: Record<string, unknown>
40
+ /** 模板信号形态(v2 帧管线;缺省 scalar —— 既有驱动零感知) */
41
+ signalKind?: 'scalar' | 'vector' | 'image'
42
+ /** vector 声明(模板;mock 生成点列/校验依据) */
43
+ vector?: { points: number, min: number, max: number }
44
+ }
45
+
46
+ /**
47
+ * 帧采样值(v2 多形态信号):驱动 sample() 可返回标量(既有契约)或帧信封。
48
+ * - vector:多点工程量轮廓(≤4096 点,经队列 JSON 传输)
49
+ * - image :像素 blob(仅生产侧管线内存续;controller 落对象存储后剥离为 objectKey)
50
+ */
51
+ export type DaqFrameSample = {
52
+ frame:
53
+ | { kind: 'vector', points: number[], metrics?: Record<string, number> }
54
+ | {
55
+ kind: 'image'
56
+ blob: Buffer
57
+ mime: string
58
+ width: number
59
+ height: number
60
+ metrics?: Record<string, number>
61
+ /** 驱动侧通常未设;controller 落对象存储后回填引用(队列信封只传引用) */
62
+ objectKey?: string
63
+ thumbKey?: string
64
+ }
39
65
  }
40
66
 
41
67
  export interface DaqDriver {
42
68
  readonly kind: DaqDriverKind
43
69
  /** 协议栈是否可用(包缺失时 false,节点测试连接给出可行动提示) */
44
70
  available(): Promise<boolean>
45
- sample(input: DaqDriverInput): Promise<number | null> | number | null
71
+ sample(input: DaqDriverInput): Promise<number | DaqFrameSample | null> | number | DaqFrameSample | null
46
72
  test(driverConfig: Record<string, unknown>): Promise<DriverTestResult>
47
73
  }
48
74
 
@@ -75,39 +101,101 @@ export const mockDaqDriver: DaqDriver = {
75
101
  async available() {
76
102
  return true
77
103
  },
78
- sample({ ctx, config }) {
79
- const states = mockStates()
80
- let st = states.get(ctx.nodeId)
81
- if (!st) {
82
- st = { phase: hashPhase(ctx.nodeId), value: null, excursionLeft: 0, excursionDir: 0, excursionDepth: 0, lastAt: ctx.now }
83
- states.set(ctx.nodeId, st)
84
- }
85
- const dt = Math.max(0, Math.min(ctx.now - st.lastAt, 60_000))
86
- st.lastAt = ctx.now
87
- if (st.excursionLeft <= 0 && Math.random() < 0.008 * Math.max(1, dt / 1000)) {
88
- st.excursionLeft = 6 + Math.floor(Math.random() * 9)
89
- st.excursionDir = Math.random() < 0.5 ? -1 : 1
90
- st.excursionDepth = (config.max - config.min) * (0.08 + Math.random() * 0.1)
91
- }
92
- const t = (ctx.ageMs + st.phase * 100) / 1000
93
- const sine = Math.sin(t * 0.35) * config.amp * 0.55 + Math.sin(t * 0.11 + 1.3) * config.amp * 0.3
94
- let v = config.base + sine
95
- if (st.value != null) v += (config.base - st.value) * 0.06 + (Math.random() - 0.5) * config.amp * 0.5
96
- if (st.excursionLeft > 0) {
97
- st.excursionLeft -= 1
98
- const ramp = Math.min(1, (10 - st.excursionLeft) / 4)
99
- v += st.excursionDir * st.excursionDepth * (0.4 + 0.6 * ramp)
100
- if (st.excursionLeft === 0) st.excursionDir = 0
101
- }
102
- v = Math.min(config.max + config.amp * 2.2, Math.max(config.min - config.amp * 2.2, v))
103
- st.value = v
104
- return v
104
+ sample({ ctx, config, signalKind, vector }) {
105
+ // 多形态分支(v2 帧管线):vector=多点波形轮廓;image=程序化灰度 PNG;scalar=既有单点波形
106
+ if (signalKind === 'vector') return mockVectorSample(ctx, config, vector)
107
+ if (signalKind === 'image') return mockImageSample(ctx, config)
108
+ return mockScalarSample(ctx, config)
105
109
  },
106
110
  async test() {
107
111
  return { ok: true, message: 'Mock 驱动无需连接,采样即模拟波形' }
108
112
  },
109
113
  }
110
114
 
115
+ /** 既有单点波形(原 sample() 主体,零行为变化) */
116
+ function mockScalarSample(ctx: DaqSampleCtx, config: { base: number, amp: number, min: number, max: number }): number {
117
+ const states = mockStates()
118
+ let st = states.get(ctx.nodeId)
119
+ if (!st) {
120
+ st = { phase: hashPhase(ctx.nodeId), value: null, excursionLeft: 0, excursionDir: 0, excursionDepth: 0, lastAt: ctx.now }
121
+ states.set(ctx.nodeId, st)
122
+ }
123
+ const dt = Math.max(0, Math.min(ctx.now - st.lastAt, 60_000))
124
+ st.lastAt = ctx.now
125
+ if (st.excursionLeft <= 0 && Math.random() < 0.008 * Math.max(1, dt / 1000)) {
126
+ st.excursionLeft = 6 + Math.floor(Math.random() * 9)
127
+ st.excursionDir = Math.random() < 0.5 ? -1 : 1
128
+ st.excursionDepth = (config.max - config.min) * (0.08 + Math.random() * 0.1)
129
+ }
130
+ const t = (ctx.ageMs + st.phase * 100) / 1000
131
+ const sine = Math.sin(t * 0.35) * config.amp * 0.55 + Math.sin(t * 0.11 + 1.3) * config.amp * 0.3
132
+ let v = config.base + sine
133
+ if (st.value != null) v += (config.base - st.value) * 0.06 + (Math.random() - 0.5) * config.amp * 0.5
134
+ if (st.excursionLeft > 0) {
135
+ st.excursionLeft -= 1
136
+ const ramp = Math.min(1, (10 - st.excursionLeft) / 4)
137
+ v += st.excursionDir * st.excursionDepth * (0.4 + 0.6 * ramp)
138
+ if (st.excursionLeft === 0) st.excursionDir = 0
139
+ }
140
+ v = Math.min(config.max + config.amp * 2.2, Math.max(config.min - config.amp * 2.2, v))
141
+ st.value = v
142
+ return v
143
+ }
144
+
145
+ /** 多点波形轮廓(测厚仪/扫描仪语义:横向 n 点,带漂移与偶发局部尖峰) */
146
+ function mockVectorSample(
147
+ ctx: DaqSampleCtx,
148
+ config: { base: number, amp: number, min: number, max: number },
149
+ vector?: { points: number, min: number, max: number },
150
+ ): { frame: { kind: 'vector', points: number[], metrics: Record<string, number> } } {
151
+ const n = Math.max(2, Math.min(4096, vector?.points ?? 64))
152
+ const vMin = vector?.min ?? config.min
153
+ const vMax = vector?.max ?? config.max
154
+ const span = vMax - vMin
155
+ const t = (ctx.ageMs + hashPhase(ctx.nodeId) * 100) / 1000
156
+ const points: number[] = []
157
+ // 横向轮廓:慢波(工艺整体偏移)+ 位置抛物面(边缘偏厚)+ 噪声 + 偶发局部尖峰(缺陷)
158
+ const drift = Math.sin(t * 0.21) * config.amp
159
+ const spikePos = Math.floor((Math.sin(t * 0.07) * 0.5 + 0.5) * n)
160
+ for (let i = 0; i < n; i++) {
161
+ const rel = i / (n - 1)
162
+ const crown = -4 * (rel - 0.5) ** 2 * span * 0.03 // 边缘略薄(负抛物面)
163
+ let v = config.base + drift + crown + (Math.random() - 0.5) * config.amp * 0.4
164
+ if (Math.abs(i - spikePos) <= 1) v += span * 0.06 // 偶发局部尖峰
165
+ points.push(Math.round(Math.min(vMax, Math.max(vMin, v)) * 1e6) / 1e6)
166
+ }
167
+ return { frame: { kind: 'vector', points, metrics: {} } }
168
+ }
169
+
170
+ /** 程序化灰度图像(CCD 语义:纹理背景 + 移动暗斑;零外部依赖 zlib PNG) */
171
+ function mockImageSample(
172
+ ctx: DaqSampleCtx,
173
+ config: { base: number, amp: number, min: number, max: number },
174
+ ): { frame: { kind: 'image', blob: Buffer, mime: string, width: number, height: number, metrics: Record<string, number> } } {
175
+ // 偶发"曝光异常"帧(低亮度)驱动 quality-gate 告警链路可观测
176
+ const dark = Math.random() < 0.03
177
+ const baseGray = dark ? 22 : Math.round(Math.min(230, Math.max(60, config.base)))
178
+ const w = 320
179
+ const h = 240
180
+ const px = new Uint8Array(w * h)
181
+ const t = (ctx.ageMs + hashPhase(ctx.nodeId) * 100) / 1000
182
+ const spotX = Math.floor(((Math.sin(t * 0.4) + 1) / 2) * (w - 60)) + 30
183
+ const spotY = Math.floor(((Math.cos(t * 0.3) + 1) / 2) * (h - 60)) + 30
184
+ for (let y = 0; y < h; y++) {
185
+ for (let x = 0; x < w; x++) {
186
+ // 编织纹理 + 随机噪声 + 移动暗斑(表面缺陷模拟)
187
+ let v = baseGray + Math.sin(x * 0.35) * 8 + Math.sin(y * 0.22 + 1.7) * 6 + (Math.random() - 0.5) * 10
188
+ const dx = x - spotX
189
+ const dy = y - spotY
190
+ const d2 = dx * dx + dy * dy
191
+ if (d2 < 400) v -= (1 - d2 / 400) * 90
192
+ px[y * w + x] = Math.max(0, Math.min(255, Math.round(v)))
193
+ }
194
+ }
195
+ const blob = encodePng(w, h, px)
196
+ return { frame: { kind: 'image', blob, mime: 'image/png', width: w, height: h, metrics: {} } }
197
+ }
198
+
111
199
  // ============================================================
112
200
  // Modbus TCP 真实驱动(modbus-serial;连接池按 host:port:unitId 复用)
113
201
  // ============================================================
@@ -746,14 +834,30 @@ const REGISTRY: Record<DaqDriverKind, DaqDriver> = {
746
834
  's7': new PlannedProtocolStub('s7', 'S7comm'),
747
835
  }
748
836
 
837
+ /** 插件注册的驱动(经 ctx.daq.registerDriver;热重载重复注册幂等覆盖) */
838
+ const g_plugins = globalThis as typeof globalThis & { __daqPluginDrivers?: Map<string, DaqDriver> }
839
+ function pluginRegistry(): Map<string, DaqDriver> {
840
+ return g_plugins.__daqPluginDrivers ??= new Map()
841
+ }
842
+
843
+ /** 插件驱动注册(kind 与内置冲突时覆盖并告警;resolveDaqDriver 插件优先) */
844
+ export function registerPluginDriver(driver: DaqDriver): void {
845
+ if (driver.kind in REGISTRY) log.warn(`[daq-drivers] 插件驱动覆盖内置:「${driver.kind}」`)
846
+ pluginRegistry().set(driver.kind, driver)
847
+ }
848
+
849
+ export function listPluginDrivers(): string[] {
850
+ return [...pluginRegistry().keys()]
851
+ }
852
+
749
853
  export function normalizeDriverKind(kind: string): DaqDriverKind {
750
854
  if (kind === 'modbus') return 'modbus-tcp'
751
855
  if (kind === 'rtu' || kind === 'modbus-rtu-tcp') return 'modbus-rtu'
752
- return (kind in REGISTRY ? kind : 'mock') as DaqDriverKind
856
+ return (kind in REGISTRY || pluginRegistry().has(kind) ? kind : 'mock') as DaqDriverKind
753
857
  }
754
858
 
755
859
  export function resolveDaqDriver(kind: DaqDriverKind): DaqDriver {
756
- return REGISTRY[kind] ?? mockDaqDriver
860
+ return pluginRegistry().get(kind) ?? REGISTRY[kind] ?? mockDaqDriver
757
861
  }
758
862
 
759
863
  /** 驱动可用性探测(meta 报告:包缺失时 UI 显示"未安装"而非硬失败) */