agentworkshop 0.5.8 → 0.6.0

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 (571) 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/a0ac51ef-51c0-4ff9-8484-7c90d8dd10ba.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 +2634 -1387
  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-prompts-hotreload-test.ts +76 -0
  501. package/scripts/_dbg-release-smoke.mjs +104 -0
  502. package/scripts/home-bootstrap.mjs +18 -0
  503. package/scripts/i18n-merge.mjs +69 -67
  504. package/scripts/test-context-governor.ts +176 -176
  505. package/scripts/test-daq-frames.ts +180 -0
  506. package/scripts/test-daq-minio.ts +77 -0
  507. package/scripts/test-memory-rrf-mmr.ts +114 -114
  508. package/scripts/test-plugin-ext.ts +173 -0
  509. package/server/api/system/settings/events.get.ts +27 -28
  510. package/server/api/system/settings/index.get.ts +14 -14
  511. package/server/api/system/settings/index.patch.ts +22 -22
  512. package/server/api/system/settings/reset.post.ts +12 -12
  513. package/server/api/workshop/daq/[id]/frames/content.get.ts +24 -0
  514. package/server/api/workshop/daq/[id]/frames.get.ts +44 -0
  515. package/server/data/daqs.json +89 -89
  516. package/server/data/dcw-rollback.json +1 -1
  517. package/server/data/dcw-runs.json +3136 -2492
  518. package/server/data/dcw-writes.json +672 -0
  519. package/server/data/dcws.json +4 -4
  520. package/server/data/line-runs.json +1 -232
  521. package/server/plugins/daq.ts +11 -0
  522. package/server/plugins/system-config.ts +38 -38
  523. package/server/services/system-config.ts +365 -356
  524. package/server/services/workshop/agents/industrial-tools.ts +91 -25
  525. package/server/services/workshop/agents/omp-agent.ts +1955 -1895
  526. package/server/services/workshop/agents/plugin-tools.ts +145 -0
  527. package/server/services/workshop/daq/bus/queue-port.ts +18 -0
  528. package/server/services/workshop/daq/daq-controller.ts +216 -14
  529. package/server/services/workshop/daq/daq-node.ts +257 -247
  530. package/server/services/workshop/daq/daq-runtime.ts +36 -4
  531. package/server/services/workshop/daq/daq-templates.ts +213 -157
  532. package/server/services/workshop/daq/drivers.ts +134 -30
  533. package/server/services/workshop/daq/frames.ts +227 -0
  534. package/server/services/workshop/daq/infra.ts +31 -17
  535. package/server/services/workshop/daq/objectstore/disk.adapter.ts +38 -0
  536. package/server/services/workshop/daq/objectstore/index.ts +88 -0
  537. package/server/services/workshop/daq/objectstore/minio.adapter.ts +60 -0
  538. package/server/services/workshop/daq/objectstore/objectstore-port.ts +27 -0
  539. package/server/services/workshop/daq/plugin-bridge.ts +73 -0
  540. package/server/services/workshop/daq/png-enc.ts +71 -0
  541. package/server/services/workshop/daq/storage/sqlite.adapter.ts +104 -1
  542. package/server/services/workshop/daq/storage/timescale.adapter.ts +95 -4
  543. package/server/services/workshop/daq/storage/tsdb-port.ts +46 -0
  544. package/server/services/workshop/plugins/host.mjs +479 -417
  545. package/server/services/workshop/runtime/agent-runtime.ts +744 -744
  546. package/shared/config/schema.json +6 -1
  547. package/shared/daq-protocol.ts +88 -0
  548. package/.output/public/_nuxt/B-PgoIPN.js +0 -1
  549. package/.output/public/_nuxt/DVNYfGsj.js +0 -1
  550. package/.output/public/_nuxt/_id_.CbiF5PrV.css +0 -1
  551. package/.output/public/_nuxt/builds/meta/998b4cce-8563-44e5-b0ef-ff3d71a8480f.json +0 -1
  552. package/.output/public/_nuxt/settings.BANibAnV.css +0 -1
  553. package/.output/server/chunks/build/_id_-BOhG2yz8.mjs.map +0 -1
  554. package/.output/server/chunks/build/_id_-CuyMYmhY.mjs.map +0 -1
  555. package/.output/server/chunks/build/agents-BVaxN75W.mjs.map +0 -1
  556. package/.output/server/chunks/build/channel-templates-D1K2IKrE.mjs.map +0 -1
  557. package/.output/server/chunks/build/client-only-CFTHwakk.mjs.map +0 -1
  558. package/.output/server/chunks/build/daq-ObtN1TQ4.mjs.map +0 -1
  559. package/.output/server/chunks/build/dcw-fINr-He1.mjs.map +0 -1
  560. package/.output/server/chunks/build/interval-Bt11uRPw.mjs +0 -9
  561. package/.output/server/chunks/build/interval-Bt11uRPw.mjs.map +0 -1
  562. package/.output/server/chunks/build/logs-DqNgCJAn.mjs.map +0 -1
  563. package/.output/server/chunks/build/pages-DC52d7z7.mjs.map +0 -1
  564. package/.output/server/chunks/build/plugins-DVQty7qG.mjs.map +0 -1
  565. package/.output/server/chunks/build/settings-BeergncK.mjs.map +0 -1
  566. package/.output/server/chunks/build/teams-CFeDlHDh.mjs.map +0 -1
  567. package/.output/server/chunks/build/tokens-CBAUbOce.mjs.map +0 -1
  568. package/.output/server/chunks/build/town-BxH-XXth.mjs.map +0 -1
  569. package/.output/server/chunks/build/useDaqStream-CwORhsD7.mjs.map +0 -1
  570. package/.output/server/chunks/build/users-BMs4s_6K.mjs.map +0 -1
  571. package/.output/server/chunks/build/workshop-CJAyZ5zS.mjs.map +0 -1
@@ -0,0 +1,145 @@
1
+ /**
2
+ * OMP 插件工具注册表 —— 插件经 ctx.omp.registerTool 注册自定义 host 工具,
3
+ * 注入 omp agent 会话(tool schema + handler 分发)。
4
+ *
5
+ * - 注册期:插件宿主(nitro plugin)先于 omp 模块装载 → 注册项进 pending 队列,
6
+ * 本模块 attachOmpPluginBridge() 被调用时接管并回放(与 daq plugin-bridge 同构)。
7
+ * - 注入期:hostToolsForRole() 合并插件工具;omp-agent 在 ensureClient 时随
8
+ * set_host_tools 下发;注册表变更(onChange)→ 通知全部在跑 agent 实例
9
+ * **热重发 set_host_tools**(运行时注入,无需重启/重spawn 子进程)。
10
+ * - 分发期:handleHostTool 对未内置的 toolName 查本注册表,以 agent 上下文
11
+ * (agentId/channelId/role/name)回调插件 handler。
12
+ */
13
+ import { createLogger } from '../logger'
14
+
15
+ const log = createLogger('workshop.plugin-tools')
16
+
17
+ export type OmpPluginToolRole = 'lead' | 'worker'
18
+
19
+ export interface OmpPluginAgentContext {
20
+ agentId: string
21
+ channelId: string
22
+ role: OmpPluginToolRole
23
+ name: string
24
+ }
25
+
26
+ export interface OmpPluginTool {
27
+ /** 工具名(与内置 host tool 冲突时内置优先,注册被忽略并告警) */
28
+ name: string
29
+ label?: string
30
+ description: string
31
+ /** JSON Schema(properties/required);omp 端可见的参数面 */
32
+ parameters: Record<string, unknown>
33
+ /** 可用角色(缺省 lead+worker 均可) */
34
+ roles?: OmpPluginToolRole[]
35
+ /** 执行体:返回文本结果(isError=true → omp 端按工具错误呈现) */
36
+ handler: (args: Record<string, unknown>, agent: OmpPluginAgentContext) => Promise<{ text: string, isError?: boolean }> | { text: string, isError?: boolean }
37
+ }
38
+
39
+ export interface OmpPluginToolDef {
40
+ plugin: string
41
+ tool: OmpPluginTool
42
+ }
43
+
44
+ interface OmpToolsBridge {
45
+ pending: OmpPluginToolDef[]
46
+ /** 回放槽(drain 接管后设置;注册即时回调) */
47
+ _drain?: () => void
48
+ register(plugin: string, tool: OmpPluginTool): void
49
+ drain(onTool: (def: OmpPluginToolDef) => void): void
50
+ }
51
+
52
+ const g = globalThis as typeof globalThis & {
53
+ __ompPluginTools?: { byPlugin: Map<string, OmpPluginTool>, byName: Map<string, OmpPluginTool>, listeners: Set<() => void> }
54
+ }
55
+
56
+ function state() {
57
+ return g.__ompPluginTools ??= { byPlugin: new Map(), byName: new Map(), listeners: new Set() }
58
+ }
59
+
60
+ /** 插件工具注册(同名覆盖;与内置 host tool 同名时忽略并告警)。变更后热通知全部在跑 agent。 */
61
+ export function registerPluginTool(plugin: string, tool: OmpPluginTool): void {
62
+ if (!tool || typeof tool.name !== 'string' || !tool.name.trim()) {
63
+ log.warn(`[${plugin}] 插件工具缺少 name,忽略`)
64
+ return
65
+ }
66
+ const st = state()
67
+ if (st.byName.has(tool.name)) {
68
+ const prev = st.byName.get(tool.name)!
69
+ if (prev === tool) return // 热重载重复注册幂等
70
+ log.warn(`[omp-tools] 工具「${tool.name}」被插件 ${plugin} 覆盖(原注册方仍在表中,后注册者胜)`)
71
+ }
72
+ // 旧注册清理(同插件同名)
73
+ const prevByPlugin = st.byPlugin.get(`${plugin}:${tool.name}`)
74
+ if (prevByPlugin) {
75
+ st.byName.delete(prevByPlugin.name)
76
+ }
77
+ st.byPlugin.set(`${plugin}:${tool.name}`, tool)
78
+ st.byName.set(tool.name, tool)
79
+ log.info(`[omp-tools] 插件工具注册:「${tool.name}」(${plugin})`)
80
+ notifyToolChange()
81
+ }
82
+
83
+ /** 插件卸载/停用时移除其全部工具 */
84
+ export function unregisterPluginTools(plugin: string): void {
85
+ const st = state()
86
+ for (const [k, tool] of [...st.byPlugin.entries()]) {
87
+ if (k.startsWith(`${plugin}:`)) {
88
+ st.byPlugin.delete(k)
89
+ if (st.byName.get(tool.name) === tool) st.byName.delete(tool.name)
90
+ }
91
+ }
92
+ }
93
+
94
+ /** 全部插件工具(工具名 → 定义;hostToolsForRole 合并与分发用) */
95
+ export function listPluginTools(): Map<string, OmpPluginTool> {
96
+ return state().byName
97
+ }
98
+
99
+ /** 注册表变更订阅(omp-agent 模块加载时接管 pending 并订阅热注入) */
100
+ export function onPluginToolsChange(fn: () => void): () => void {
101
+ const st = state()
102
+ st.listeners.add(fn)
103
+ return () => st.listeners.delete(fn)
104
+ }
105
+
106
+ function notifyToolChange(): void {
107
+ for (const fn of state().listeners) {
108
+ try {
109
+ fn()
110
+ }
111
+ catch (err) {
112
+ log.warn('[omp-tools] 变更通知失败:', err instanceof Error ? err.message : err)
113
+ }
114
+ }
115
+ }
116
+
117
+ /** 接管 host.mjs 的排队桥(装载顺序无关:桥不存在则自建;幂等) */
118
+ let attached = false
119
+
120
+ function makeOmpBridge(): OmpToolsBridge {
121
+ return {
122
+ pending: [],
123
+ register(plugin, tool) {
124
+ this.pending.push({ plugin, tool })
125
+ this._drain?.()
126
+ },
127
+ drain(onTool) {
128
+ this._drain = () => {
129
+ for (const def of this.pending.splice(0)) onTool(def)
130
+ }
131
+ this._drain()
132
+ },
133
+ }
134
+ }
135
+
136
+ export function attachOmpPluginBridge(): void {
137
+ if (attached) return
138
+ attached = true
139
+ const g = globalThis as typeof globalThis & { __ompPluginToolsBridge?: OmpToolsBridge }
140
+ const bridge: OmpToolsBridge = g.__ompPluginToolsBridge ?? makeOmpBridge()
141
+ g.__ompPluginToolsBridge = bridge
142
+ bridge.drain((def) => {
143
+ registerPluginTool(def.plugin, def.tool)
144
+ })
145
+ }
@@ -20,6 +20,24 @@ export interface DaqSampleEnvelope {
20
20
  state: string
21
21
  /** ISO 时间 */
22
22
  at: string
23
+ /**
24
+ * 多形态帧(v2;缺省 undefined = 标量样本,既有链路零感知):
25
+ * vector 携带点列(≤4096,JSON 安全);image 只携带对象存储引用与元数据
26
+ * (blob 已在生产侧落对象存储 —— 不进队列,MQTT 256KB 上限不可承载像素)。
27
+ */
28
+ frame?: {
29
+ kind: 'vector' | 'image'
30
+ /** vector:工程量点列(完整;WS 下发时截断为 64 点预览) */
31
+ points?: number[]
32
+ /** image:对象存储键(主图/缩略图) */
33
+ objectKey?: string
34
+ thumbKey?: string
35
+ mime?: string
36
+ width?: number
37
+ height?: number
38
+ /** 下沉管线派生指标(avg/max/brightness/zone_*…) */
39
+ metrics?: Record<string, number>
40
+ }
23
41
  }
24
42
 
25
43
  export type DaqConsumer = (env: DaqSampleEnvelope) => void
@@ -23,23 +23,31 @@
23
23
 
24
24
  import { createLogger } from '../logger'
25
25
  import { randomUUID } from 'node:crypto'
26
- import { daqKeyFromRef, normalizeDataTransform, DAQ_DRIVERS, type AepDaqControllerState, type AepDaqReading, type AepDaqNodeChange, type DaqDriverKind, type DaqNodeView, type DataTransform, type DriverTestResult } from '../../../../shared/daq-protocol'
26
+ import { daqKeyFromRef, normalizeDataTransform, normalizeSignalKind, DAQ_DRIVERS, type AepDaqControllerState, type AepDaqFrame, type AepDaqReading, type AepDaqNodeChange, type DaqDriverKind, type DaqNodeView, type DataTransform, type DriverTestResult } from '../../../../shared/daq-protocol'
27
27
  import { AppError, ErrorCodes } from '../../../utils/errors'
28
- import { normalizeDriverKind, resolveDaqDriver, probeDriverAvailability } from './drivers'
28
+ import { normalizeDriverKind, resolveDaqDriver, probeDriverAvailability, type DaqFrameSample } from './drivers'
29
29
  import { findDaqTemplate } from './daq-templates'
30
30
  import { DaqNode } from './daq-node'
31
31
  import { DaqNodeRuntime, type DaqRuntimeHost } from './daq-runtime'
32
32
  import { getDaqNodeRepo } from './daq-node.repo'
33
33
  import { getTsdb, tsdbReady } from './storage'
34
+ import type { DaqFrameRow } from './storage/tsdb-port'
34
35
  import { getDaqQueue } from './bus'
35
36
  import { getDaqHostPorts } from './host-ports'
36
- import { emitDaqSample } from '@/server/services/workshop/plugins/host.mjs'
37
+ import { runSinkPipeline, type DaqFrameWorking } from './frames'
38
+ import { getObjectStore } from './objectstore'
39
+ import { daqObjectKey } from './objectstore/objectstore-port'
40
+ import { emitDaqSample, emitDaqFrame } from '@/server/services/workshop/plugins/host.mjs'
37
41
  import { getOps, recordOps } from '../ops/ops'
38
42
  import { notifyAlarm, newAlarmId, startAlarmEscalator } from './alarm-notify'
43
+ import { attachDaqPluginBridge } from './plugin-bridge'
39
44
  import type { DaqSampleEnvelope } from './bus/queue-port'
40
45
 
41
46
  const log = createLogger('daq.controller')
42
47
 
48
+ // 插件桥接管(host.mjs ctx.daq 排队注册的驱动/处理器在此回放;幂等)
49
+ attachDaqPluginBridge()
50
+
43
51
  export interface DaqCreateInput {
44
52
  templateRef?: string
45
53
  name?: string
@@ -96,8 +104,12 @@ type BroadcastFn = (type: string, payload: unknown) => void
96
104
  const TSDB_FLUSH_MS = 500
97
105
  /** TSDB 攒批缓冲上限(背压:满则丢最旧并计数,防慢库拖爆内存) */
98
106
  const TSDB_BUFFER_CAP = 5000
107
+ /** 帧攒批缓冲上限(向量/图像元数据;量级远小于标量) */
108
+ const FRAME_BUFFER_CAP = 2000
99
109
  /** TSDB 写失败重试次数(有限重试后丢弃并计数,不阻塞消费) */
100
110
  const TSDB_WRITE_RETRIES = 3
111
+ /** WS 帧预览点数上限(AepDaqFrame.preview;完整点列经 REST frames 查询) */
112
+ const FRAME_PREVIEW_POINTS = 64
101
113
 
102
114
  class DaqController {
103
115
  private repo = getDaqNodeRepo()
@@ -107,6 +119,10 @@ class DaqController {
107
119
  private runtimes = new Map<string, DaqNodeRuntime>()
108
120
  /** TSDB 批量缓冲(consumer 攒批 → 定窗刷盘;上限背压,满丢最旧;产线窗口内逐样本打标) */
109
121
  private tsdbBuffer: Array<{ nodeId: string, tsMs: number, value: number, state: string, lineId?: string | null, productId?: string | null, recipeId?: string | null, runId?: string | null }> = []
122
+ /** 帧攒批缓冲(v2:向量/图像元数据;与样本同窗刷盘) */
123
+ private frameBuffer: DaqFrameRow[] = []
124
+ /** 帧指标告警态(nodeId::metricKey → ok/warn/alarm;边沿触发) */
125
+ private metricStates = new Map<string, 'ok' | 'warn' | 'alarm'>()
110
126
  private tsdbFlushTimer: NodeJS.Timeout | null = null
111
127
  /** 单 in-flight 写:写库中不叠写(promise 链串行化) */
112
128
  private tsdbWriting = false
@@ -127,6 +143,8 @@ class DaqController {
127
143
  private producedCount = 0
128
144
  private consumedCount = 0
129
145
  private storedCount = 0
146
+ /** 帧入库计数(v2:daq_frames 行数) */
147
+ private framesStored = 0
130
148
 
131
149
  // ---------- 生命周期 ----------
132
150
 
@@ -154,10 +172,13 @@ class DaqController {
154
172
  return { intervalMs: this.defaultIntervalMs, publishIntervalMs: this.defaultPublishIntervalMs }
155
173
  }
156
174
 
157
- /** 生产面:驱动采样一次(模板域 + 协议参数解析;mock/PLC 统一走驱动注册表) */
158
- private async sampleNode(node: DaqNode, now: number): Promise<number | null> {
175
+ /** 生产面:驱动采样一次(模板域 + 协议参数解析;mock/PLC 统一走驱动注册表)。
176
+ * 多形态模板(vector/image)在采样后执行 sink 下沉管线;图像 blob 就地落
177
+ * 对象存储(blob 不进队列 —— MQTT 256KB 上限不可承载像素,队列只传引用)。 */
178
+ private async sampleNode(node: DaqNode, now: number): Promise<number | DaqFrameSample | { frame: NonNullable<DaqSampleEnvelope['frame']> } | null> {
159
179
  const tpl = findDaqTemplate(node.templateKey)
160
- return resolveDaqDriver(node.driver).sample({
180
+ const signalKind = normalizeSignalKind(tpl?.signalKind)
181
+ const res = await resolveDaqDriver(node.driver).sample({
161
182
  ctx: { nodeId: node.id, now, ageMs: now - Date.parse(node.createdAt || new Date(now).toISOString()) },
162
183
  config: {
163
184
  base: tpl?.base ?? (node.min + node.max) / 2,
@@ -166,7 +187,39 @@ class DaqController {
166
187
  max: node.max,
167
188
  },
168
189
  driverConfig: node.driverConfig,
190
+ signalKind,
191
+ vector: tpl?.vector,
169
192
  })
193
+ if (res == null || typeof res !== 'object' || !('frame' in res) || res.frame == null) return res
194
+ // 下沉管线(生产侧;单步失败保留原帧,永不抛出 —— 见 frames.ts runSinkPipeline)
195
+ const raw = res.frame
196
+ let wf: DaqFrameWorking = raw.kind === 'vector'
197
+ ? { kind: 'vector', points: raw.points, metrics: raw.metrics }
198
+ : { kind: 'image', blob: raw.blob, mime: raw.mime, width: raw.width, height: raw.height, metrics: raw.metrics }
199
+ wf = runSinkPipeline(wf, tpl?.sink?.processors, node.id)
200
+ if (wf.kind === 'vector') {
201
+ return { frame: { kind: 'vector', points: (wf.points ?? []).slice(0, 4096), metrics: wf.metrics } }
202
+ }
203
+ // 图像:主图 + 缩略图落对象存储(失败抛出 → tick 按驱动故障节流,采集不中断)
204
+ const os = getObjectStore()
205
+ const objectKey = daqObjectKey(node.id, now, '.png')
206
+ await os.put(objectKey, wf.blob!, wf.mime ?? 'image/png')
207
+ let thumbKey: string | undefined
208
+ if (wf.thumbBlob) {
209
+ thumbKey = daqObjectKey(node.id, now, '.thumb.png')
210
+ await os.put(thumbKey, wf.thumbBlob, 'image/png')
211
+ }
212
+ return {
213
+ frame: {
214
+ kind: 'image',
215
+ objectKey,
216
+ thumbKey,
217
+ mime: wf.mime ?? 'image/png',
218
+ width: wf.width,
219
+ height: wf.height,
220
+ metrics: wf.metrics,
221
+ },
222
+ }
170
223
  }
171
224
 
172
225
  /** 生产面:样本帧入队 */
@@ -191,6 +244,11 @@ class DaqController {
191
244
  }
192
245
 
193
246
  private ingestNode(node: DaqNode, env: DaqSampleEnvelope, allowPublish: boolean): void {
247
+ // 多形态帧(v2):向量/图像走独立帧管线(不入 daq_samples,标量表零污染)
248
+ if (env.frame) {
249
+ this.ingestFrame(node, env, allowPublish)
250
+ return
251
+ }
194
252
  // 配方级数采监控窗口的越限判定已前移到运行时 onSample(与量程告警共用边沿语义,
195
253
  // 越窗即 raise 落库 + 广播);此处 state 已含窗口结论,仅负责管线汇聚。
196
254
  if (allowPublish) {
@@ -226,6 +284,11 @@ class DaqController {
226
284
  this.tsdbBuffer.splice(0, this.tsdbBuffer.length - TSDB_BUFFER_CAP)
227
285
  this.tsdbDropped += 1
228
286
  }
287
+ this.scheduleTsdbFlush()
288
+ }
289
+
290
+ /** 刷盘调度(样本与帧共用同一定窗;写库中不重复排程) */
291
+ private scheduleTsdbFlush(): void {
229
292
  if (!this.tsdbFlushTimer && !this.tsdbWriting) {
230
293
  this.tsdbFlushTimer = setTimeout(() => {
231
294
  this.tsdbFlushTimer = null
@@ -239,6 +302,97 @@ class DaqController {
239
302
  this.broadcast?.('error', { code: 'DAQ_DRIVER', message: `[${node.name}] ${message}` })
240
303
  }
241
304
 
305
+ // ---------- 帧管线(v2:向量/图像;打标与告警复用标量链路同源机制)----------
306
+
307
+ /** 帧消费:元数据攒批落 daq_frames + 指标阈值告警(边沿)+ WS daq.frame(预览/缩略图引用) */
308
+ private ingestFrame(node: DaqNode, env: DaqSampleEnvelope, allowPublish: boolean): void {
309
+ const f = env.frame!
310
+ const tpl = findDaqTemplate(node.templateKey)
311
+ const tsMs = Date.parse(env.at)
312
+ // 产线批次打标(与标量样本同源取值)
313
+ const lineRun = getDaqHostPorts()?.lineRun.activeRun(node.lineId) ?? null
314
+ if (lineRun) getDaqHostPorts()?.lineRun.bumpTaggedSamples(node.lineId)
315
+ const metrics = f.metrics ?? {}
316
+ this.frameBuffer.push({
317
+ nodeId: node.id,
318
+ tsMs,
319
+ kind: f.kind,
320
+ templateKey: node.templateKey,
321
+ deviceBindingId: node.deviceBindingId,
322
+ lineId: lineRun?.lineId ?? null,
323
+ productId: lineRun?.productId ?? null,
324
+ recipeId: lineRun?.recipeId ?? null,
325
+ runId: lineRun?.runId ?? null,
326
+ points: f.kind === 'vector' ? (f.points?.length ?? 0) : 0,
327
+ meta: f.kind === 'image'
328
+ ? { objectKey: f.objectKey, thumbKey: f.thumbKey, mime: f.mime, width: f.width, height: f.height }
329
+ : { points: f.points ?? [] },
330
+ metrics,
331
+ })
332
+ if (this.frameBuffer.length > FRAME_BUFFER_CAP) {
333
+ this.frameBuffer.splice(0, this.frameBuffer.length - FRAME_BUFFER_CAP)
334
+ this.tsdbDropped += 1
335
+ }
336
+ this.scheduleTsdbFlush()
337
+ // 指标阈值告警(模板 metrics 规则;alarm 硬限边沿 → 既有告警链路)
338
+ this.evaluateMetricAlarms(node, tpl, metrics)
339
+ if (!allowPublish) return
340
+ const payload: AepDaqFrame = {
341
+ nodeId: node.id,
342
+ templateRef: node.templateRef,
343
+ kind: f.kind,
344
+ at: env.at,
345
+ preview: f.kind === 'vector' ? DaqController.previewOf(f.points ?? [], FRAME_PREVIEW_POINTS) : undefined,
346
+ metrics,
347
+ thumbUrl: f.kind === 'image' && f.objectKey
348
+ ? `/api/workshop/daq/${node.id}/frames/content?ts=${tsMs}&thumb=1`
349
+ : undefined,
350
+ state: node.state,
351
+ }
352
+ this.broadcast?.('daq.frame', payload)
353
+ // 插件钩子:帧观察(只含元数据/指标/预览,不含 blob —— 防插件侧内存放大)
354
+ emitDaqFrame(payload)
355
+ }
356
+
357
+ /** 模板 metrics 规则评估:alarm 硬限沿 → handleAlarm/handleAlarmRecover;warn 只置节点态 */
358
+ private evaluateMetricAlarms(node: DaqNode, tpl: ReturnType<typeof findDaqTemplate>, metrics: Record<string, number>): void {
359
+ for (const rule of tpl?.metrics ?? []) {
360
+ const v = metrics[rule.key]
361
+ if (v == null || !Number.isFinite(v)) continue
362
+ const key = `${node.id}::${rule.key}`
363
+ const prev = this.metricStates.get(key) ?? 'ok'
364
+ let level: 'ok' | 'warn' | 'alarm' = 'ok'
365
+ if ((rule.alarmLow != null && v < rule.alarmLow) || (rule.alarmHigh != null && v > rule.alarmHigh)) level = 'alarm'
366
+ else if ((rule.warnLow != null && v < rule.warnLow) || (rule.warnHigh != null && v > rule.warnHigh)) level = 'warn'
367
+ this.metricStates.set(key, level)
368
+ if (level === 'alarm' && prev !== 'alarm') {
369
+ const gtMax = rule.alarmHigh != null && v > rule.alarmHigh
370
+ node.state = 'alarm'
371
+ this.handleAlarm(node, v, gtMax ? 'gt-max' : 'lt-min', gtMax ? rule.alarmHigh! : rule.alarmLow!, `${node.templateKey}.${rule.key}`)
372
+ }
373
+ else if (level !== 'alarm' && prev === 'alarm') {
374
+ node.state = level === 'warn' ? 'warn' : 'ok'
375
+ this.handleAlarmRecover(node, v)
376
+ }
377
+ else if (level === 'warn' && node.state === 'ok') {
378
+ node.state = 'warn'
379
+ }
380
+ else if (level === 'ok' && prev !== 'ok' && node.state !== 'alarm') {
381
+ node.state = 'ok'
382
+ }
383
+ }
384
+ }
385
+
386
+ /** WS 帧预览:均匀抽点 ≤max(线性抽点,保形) */
387
+ private static previewOf(points: number[], max: number): number[] {
388
+ if (points.length <= max) return points
389
+ const out: number[] = []
390
+ for (let i = 0; i < max; i++) {
391
+ out.push(points[Math.floor((i * (points.length - 1)) / (max - 1))]!)
392
+ }
393
+ return out
394
+ }
395
+
242
396
  /** 网关统一调度:250ms 扫描,到期判定与互斥由各运行时私有节拍自治(单节点慢/停不波及邻居)。
243
397
  * 产线门控:未选定配方(无活动 LineRun)不执行采集 —— 采样与实时下发均由配方驱动。 */
244
398
  private sweep(): void {
@@ -300,16 +454,18 @@ class DaqController {
300
454
  /** 累计报警次数(R4 指标暴露) */
301
455
  alarmsRaised = 0
302
456
 
303
- /** alarm 进入沿:落库(同节点同量未确认幂等)→ WS 广播 → webhook 外送;失败绝不影响采集 */
304
- private handleAlarm(node: DaqNode, value: number, rule: 'lt-min' | 'gt-max', threshold: number): void {
457
+ /** alarm 进入沿:落库(同节点同量未确认幂等)→ WS 广播 → webhook 外送;失败绝不影响采集。
458
+ * metricKey:帧派生指标告警的键(模板 metrics 规则;缺省 = 模板 key,标量越限) */
459
+ private handleAlarm(node: DaqNode, value: number, rule: 'lt-min' | 'gt-max', threshold: number, metricKey?: string): void {
305
460
  this.alarmsRaised++
306
461
  const repo = getOps()?.alarmEvents
307
462
  let id = newAlarmId()
308
463
  const createdAt = new Date().toISOString()
464
+ const metric = metricKey ?? node.templateKey
309
465
  if (repo) {
310
466
  try {
311
467
  const raised = repo.raise({
312
- id, nodeId: node.id, nodeName: node.name, metric: node.templateKey,
468
+ id, nodeId: node.id, nodeName: node.name, metric,
313
469
  value, rule, threshold, createdAt,
314
470
  })
315
471
  if (!raised) id = '' // 已有同源未确认报警:不重复广播/外送
@@ -320,7 +476,7 @@ class DaqController {
320
476
  }
321
477
  if (!id) return
322
478
  const payload = {
323
- id, nodeId: node.id, nodeName: node.name, metric: node.templateKey,
479
+ id, nodeId: node.id, nodeName: node.name, metric,
324
480
  value, rule, threshold, escalation: 0, createdAt,
325
481
  }
326
482
  this.broadcast?.('daq.alarm', payload)
@@ -335,9 +491,9 @@ class DaqController {
335
491
  kind: 'alarm',
336
492
  targetKind: 'daq-node',
337
493
  targetId: node.id,
338
- summary: `告警:「${node.name}」${zh}阈值 ${threshold}(当前 ${value})`,
494
+ summary: `告警:「${node.name}」${metric} ${zh}阈值 ${threshold}(当前 ${value})`,
339
495
  lineId: node.lineId ?? '',
340
- detail: { alarmId: id, metric: node.templateKey, value, rule, threshold },
496
+ detail: { alarmId: id, metric, value, rule, threshold },
341
497
  })
342
498
  }
343
499
 
@@ -408,6 +564,27 @@ class DaqController {
408
564
  }
409
565
  }
410
566
  }
567
+ // 帧批(v2:daq_frames;与样本同窗同重试语义)
568
+ while (this.frameBuffer.length > 0) {
569
+ const batch = this.frameBuffer.splice(0, this.frameBuffer.length)
570
+ let ok = false
571
+ for (let attempt = 0; attempt < TSDB_WRITE_RETRIES && !ok; attempt++) {
572
+ try {
573
+ await getTsdb().writeFrames(batch)
574
+ this.framesStored += batch.length
575
+ ok = true
576
+ }
577
+ catch (err) {
578
+ if (attempt === TSDB_WRITE_RETRIES - 1) {
579
+ this.tsdbDropped += batch.length
580
+ log.error('[daq] 帧写入失败(已重试,丢弃计数):', err instanceof Error ? err.message : err)
581
+ }
582
+ else {
583
+ await new Promise(r => setTimeout(r, 500 * (attempt + 1)))
584
+ }
585
+ }
586
+ }
587
+ }
411
588
  }
412
589
  finally {
413
590
  this.tsdbWriting = false
@@ -490,6 +667,7 @@ class DaqController {
490
667
  samplesStored: this.storedCount,
491
668
  tsdbDropped: this.tsdbDropped,
492
669
  alarmsRaised: this.alarmsRaised,
670
+ framesStored: this.framesStored,
493
671
  }
494
672
  }
495
673
 
@@ -522,9 +700,33 @@ class DaqController {
522
700
  return getTsdb().query(id, opts)
523
701
  }
524
702
 
703
+ /** 节点帧历史(v2:向量/图像元数据;像素按需经 frameContent 从对象存储取) */
704
+ async frames(id: string, opts: { fromMs?: number, toMs?: number, kind?: 'vector' | 'image', limit?: number }) {
705
+ this.ensureLoop()
706
+ await tsdbReady
707
+ const node = this.repo.byId(id)
708
+ if (!node) throw Object.assign(new Error(`数采节点不存在: ${id}`), { status: 404 })
709
+ return getTsdb().queryFrames(id, opts)
710
+ }
711
+
712
+ /** 帧内容(图像主图/缩略图;从对象存储读取后由 REST 流式返回) */
713
+ async frameContent(id: string, tsMs: number, thumb: boolean): Promise<{ data: Buffer, mime: string }> {
714
+ this.ensureLoop()
715
+ await tsdbReady
716
+ const node = this.repo.byId(id)
717
+ if (!node) throw Object.assign(new Error(`数采节点不存在: ${id}`), { status: 404 })
718
+ const rows = await getTsdb().queryFrames(id, { fromMs: tsMs - 1, toMs: tsMs + 1, limit: 5 })
719
+ const row = rows.find(r => r.at === tsMs)
720
+ if (!row || row.kind !== 'image') throw Object.assign(new Error(`帧不存在: ${id}@${tsMs}`), { status: 404 })
721
+ const key = (thumb ? row.meta.thumbKey : row.meta.objectKey) as string | undefined
722
+ if (!key) throw Object.assign(new Error(`帧对象缺失: ${id}@${tsMs}`), { status: 404 })
723
+ const data = await getObjectStore().get(String(key))
724
+ return { data, mime: typeof row.meta.mime === 'string' ? row.meta.mime : 'image/png' }
725
+ }
726
+
525
727
  /** 后端能力自描述(meta 用) */
526
- backends(): { tsdb: string, queue: string, drivers: typeof DAQ_DRIVERS } {
527
- return { tsdb: getTsdb().backend, queue: g_queueBackend ?? 'inproc', drivers: DAQ_DRIVERS }
728
+ backends(): { tsdb: string, queue: string, objectstore: string, drivers: typeof DAQ_DRIVERS } {
729
+ return { tsdb: getTsdb().backend, queue: g_queueBackend ?? 'inproc', objectstore: getObjectStore().backend, drivers: DAQ_DRIVERS }
528
730
  }
529
731
 
530
732
  // ---------- 控制器全局 ----------