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.
- package/.AgentWorkShop/prompts/compaction-hints.md +9 -9
- package/.AgentWorkShop/prompts/host-tools.json +42 -0
- package/.output/.AgentWorkShop/prompts/compaction-hints.md +9 -9
- package/.output/.AgentWorkShop/prompts/host-tools.json +42 -0
- package/.output/nitro.json +1 -1
- package/.output/public/_nuxt/{Dm5mD6XT.js → BD9D9pl4.js} +1 -1
- package/.output/public/_nuxt/{BdKzfJiM.js → BxD8Fg_Z.js} +1 -1
- package/.output/public/_nuxt/{dRAyjbJ6.js → C-Y5ydB6.js} +3 -3
- package/.output/public/_nuxt/{Bok1DRqh.js → C0FogB-p.js} +1 -1
- package/.output/public/_nuxt/{BUNGEK2z.js → C2QSTAWf.js} +1 -1
- package/.output/public/_nuxt/{CWDzKGtj.js → CclO6GyL.js} +1 -1
- package/.output/public/_nuxt/{B3__nfxM.js → Ck6tznoQ.js} +1 -1
- package/.output/public/_nuxt/CwS_UHeH.js +1 -0
- package/.output/public/_nuxt/{CE2ynNi9.js → CwcOEM8m.js} +1 -1
- package/.output/public/_nuxt/MhK4buEJ.js +1 -0
- package/.output/public/_nuxt/_id_.DN3U6EF9.css +1 -0
- package/.output/public/_nuxt/builds/latest.json +1 -1
- package/.output/public/_nuxt/builds/meta/221de779-a113-4232-b9a1-31a614f5e3c7.json +1 -0
- package/.output/public/_nuxt/{entry.DjhxLu-f.css → entry.DvlXlPwx.css} +1 -1
- package/.output/public/_nuxt/settings.BG0K9_MG.css +1 -0
- package/.output/server/chunks/_/error-500.mjs.map +1 -1
- package/.output/server/chunks/_/nitro.mjs +2675 -1425
- package/.output/server/chunks/_/nitro.mjs.map +1 -1
- package/.output/server/chunks/build/{OmpTerminalPanel-CZnxR3M_.mjs → OmpTerminalPanel-B_SYhmgb.mjs} +2 -2
- package/.output/server/chunks/build/{OmpTerminalPanel-CZnxR3M_.mjs.map → OmpTerminalPanel-B_SYhmgb.mjs.map} +1 -1
- package/.output/server/chunks/build/{TownView-DYlUNRZe.mjs → TownView-D9yCQe1T.mjs} +6 -6
- package/.output/server/chunks/build/{TownView-DYlUNRZe.mjs.map → TownView-D9yCQe1T.mjs.map} +1 -1
- package/.output/server/chunks/build/{_id_-BOhG2yz8.mjs → _id_-CmKAEFHV.mjs} +4 -2
- package/.output/server/chunks/build/_id_-CmKAEFHV.mjs.map +1 -0
- package/.output/server/chunks/build/{_id_-CuyMYmhY.mjs → _id_-xR3AChMO.mjs} +74 -26
- package/.output/server/chunks/build/_id_-xR3AChMO.mjs.map +1 -0
- package/.output/server/chunks/build/{_wsId_-B5f5BdW2.mjs → _wsId_-C45nVrl-.mjs} +12 -10
- package/.output/server/chunks/build/{_wsId_-B5f5BdW2.mjs.map → _wsId_-C45nVrl-.mjs.map} +1 -1
- package/.output/server/chunks/build/{agents-BVaxN75W.mjs → agents-D4l1icvn.mjs} +5 -3
- package/.output/server/chunks/build/agents-D4l1icvn.mjs.map +1 -0
- package/.output/server/chunks/build/{channel-templates-D1K2IKrE.mjs → channel-templates-DqjtC-R0.mjs} +5 -3
- package/.output/server/chunks/build/channel-templates-DqjtC-R0.mjs.map +1 -0
- package/.output/server/chunks/build/{client-only-CFTHwakk.mjs → client-only-D5BzSQc6.mjs} +2 -2
- package/.output/server/chunks/build/client-only-D5BzSQc6.mjs.map +1 -0
- package/.output/server/chunks/build/{daq-ObtN1TQ4.mjs → daq-Boz_dlAQ.mjs} +6 -4
- package/.output/server/chunks/build/daq-Boz_dlAQ.mjs.map +1 -0
- package/.output/server/chunks/build/{dcw-fINr-He1.mjs → dcw-wTRwBAUi.mjs} +3 -1
- package/.output/server/chunks/build/dcw-wTRwBAUi.mjs.map +1 -0
- package/.output/server/chunks/build/{default-CVVO40Jj.mjs → default-Dt6xLdpd.mjs} +7 -5
- package/.output/server/chunks/build/{default-CVVO40Jj.mjs.map → default-Dt6xLdpd.mjs.map} +1 -1
- package/.output/server/chunks/build/interval-WlxgjTzO.mjs +9 -0
- package/.output/server/chunks/build/interval-WlxgjTzO.mjs.map +1 -0
- package/.output/server/chunks/build/{logs-DqNgCJAn.mjs → logs-Cdi-eXlN.mjs} +5 -3
- package/.output/server/chunks/build/logs-Cdi-eXlN.mjs.map +1 -0
- package/.output/server/chunks/build/{monitor-CTZLwbdw.mjs → monitor-yNoV98rf.mjs} +6 -4
- package/.output/server/chunks/build/{monitor-CTZLwbdw.mjs.map → monitor-yNoV98rf.mjs.map} +1 -1
- package/.output/server/chunks/build/{pages-DC52d7z7.mjs → pages-bWKy0ZsA.mjs} +6 -4
- package/.output/server/chunks/build/pages-bWKy0ZsA.mjs.map +1 -0
- package/.output/server/chunks/build/{plugins-DVQty7qG.mjs → plugins-B-ZNey0Z.mjs} +4 -2
- package/.output/server/chunks/build/plugins-B-ZNey0Z.mjs.map +1 -0
- package/.output/server/chunks/build/{settings-BeergncK.mjs → settings-C3T5hR2A.mjs} +21 -19
- package/.output/server/chunks/build/settings-C3T5hR2A.mjs.map +1 -0
- package/.output/server/chunks/build/{teams-CFeDlHDh.mjs → teams-QR3BBF7A.mjs} +5 -3
- package/.output/server/chunks/build/teams-QR3BBF7A.mjs.map +1 -0
- package/.output/server/chunks/build/{tokens-CBAUbOce.mjs → tokens-DFvr_TLj.mjs} +4 -2
- package/.output/server/chunks/build/tokens-DFvr_TLj.mjs.map +1 -0
- package/.output/server/chunks/build/town-BUqRobze.mjs +2 -0
- package/.output/server/chunks/build/town-BUqRobze.mjs.map +1 -1
- package/.output/server/chunks/build/{town-BxH-XXth.mjs → town-CKg6Qxba.mjs} +9 -7
- package/.output/server/chunks/build/town-CKg6Qxba.mjs.map +1 -0
- package/.output/server/chunks/build/{useDaqStream-CwORhsD7.mjs → useDaqStream-zHEptJQ_.mjs} +44 -1
- package/.output/server/chunks/build/useDaqStream-zHEptJQ_.mjs.map +1 -0
- package/.output/server/chunks/build/{useSiteConfig-Cc-ABesl.mjs → useSiteConfig-DJe_KMVr.mjs} +1 -1
- package/.output/server/chunks/build/{useSiteConfig-Cc-ABesl.mjs.map → useSiteConfig-DJe_KMVr.mjs.map} +1 -1
- package/.output/server/chunks/build/{useWorkshopApi-5er8_EHZ.mjs → useWorkshopApi-Bh5VUHWu.mjs} +1 -1
- package/.output/server/chunks/build/{useWorkshopApi-5er8_EHZ.mjs.map → useWorkshopApi-Bh5VUHWu.mjs.map} +1 -1
- package/.output/server/chunks/build/{useWorkshopWs-Dwr_1Q8f.mjs → useWorkshopWs-xcdeiSmJ.mjs} +2 -2
- package/.output/server/chunks/build/{useWorkshopWs-Dwr_1Q8f.mjs.map → useWorkshopWs-xcdeiSmJ.mjs.map} +1 -1
- package/.output/server/chunks/build/{user-CpVY4OAA.mjs → user-Dk-ytEUV.mjs} +1 -1
- package/.output/server/chunks/build/{user-CpVY4OAA.mjs.map → user-Dk-ytEUV.mjs.map} +1 -1
- package/.output/server/chunks/build/{users-BMs4s_6K.mjs → users-4FZ0yFUO.mjs} +4 -2
- package/.output/server/chunks/build/users-4FZ0yFUO.mjs.map +1 -0
- package/.output/server/chunks/build/{workshop-CJAyZ5zS.mjs → workshop-CLhwe5eo.mjs} +6 -4
- package/.output/server/chunks/build/workshop-CLhwe5eo.mjs.map +1 -0
- package/.output/server/chunks/build/{workspaces-Dq-1zvu9.mjs → workspaces-IfORCDJE.mjs} +2 -2
- package/.output/server/chunks/build/{workspaces-Dq-1zvu9.mjs.map → workspaces-IfORCDJE.mjs.map} +1 -1
- package/.output/server/chunks/routes/api/health.get.mjs +2 -0
- package/.output/server/chunks/routes/api/health.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/index.get.mjs +2 -0
- package/.output/server/chunks/routes/api/index.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/index.post.mjs +2 -0
- package/.output/server/chunks/routes/api/index.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/mcp/workshop.mjs +2 -0
- package/.output/server/chunks/routes/api/mcp/workshop.mjs.map +1 -1
- package/.output/server/chunks/routes/api/metrics.mjs +2 -0
- package/.output/server/chunks/routes/api/metrics.mjs.map +1 -1
- package/.output/server/chunks/routes/api/plugins/_name/_...path_.mjs +2 -0
- package/.output/server/chunks/routes/api/plugins/_name/_...path_.mjs.map +1 -1
- package/.output/server/chunks/routes/api/plugins/client/_name_.get.mjs +2 -0
- package/.output/server/chunks/routes/api/plugins/client/_name_.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/plugins/manifest.get.mjs +2 -0
- package/.output/server/chunks/routes/api/plugins/manifest.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/system/config.get.mjs +2 -0
- package/.output/server/chunks/routes/api/system/config.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/system/index.get.mjs +2 -0
- package/.output/server/chunks/routes/api/system/index.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/system/index.patch.mjs +2 -0
- package/.output/server/chunks/routes/api/system/index.patch.mjs.map +1 -1
- package/.output/server/chunks/routes/api/system/monitor/terminal/ws.mjs +2 -0
- package/.output/server/chunks/routes/api/system/monitor/terminal/ws.mjs.map +1 -1
- package/.output/server/chunks/routes/api/system/monitor/terminate.post.mjs +2 -0
- package/.output/server/chunks/routes/api/system/monitor/terminate.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/system/monitor.get.mjs +2 -0
- package/.output/server/chunks/routes/api/system/monitor.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/system/settings/events.get.mjs +3 -2
- package/.output/server/chunks/routes/api/system/settings/events.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/system/settings/reset.post.mjs +2 -0
- package/.output/server/chunks/routes/api/system/settings/reset.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/users/_id_.delete.mjs +2 -0
- package/.output/server/chunks/routes/api/users/_id_.delete.mjs.map +1 -1
- package/.output/server/chunks/routes/api/users/_id_.get.mjs +2 -0
- package/.output/server/chunks/routes/api/users/_id_.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/users/_id_.put.mjs +2 -0
- package/.output/server/chunks/routes/api/users/_id_.put.mjs.map +1 -1
- package/.output/server/chunks/routes/api/users/index.get.mjs +2 -0
- package/.output/server/chunks/routes/api/users/index.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/users/index.post.mjs +2 -0
- package/.output/server/chunks/routes/api/users/index.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/users/login.post.mjs +2 -0
- package/.output/server/chunks/routes/api/users/login.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/users/logout.post.mjs +2 -0
- package/.output/server/chunks/routes/api/users/logout.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/users/me.get.mjs +2 -0
- package/.output/server/chunks/routes/api/users/me.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/users/register.post.mjs +2 -0
- package/.output/server/chunks/routes/api/users/register.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/users/tokens/_id/token.get.mjs +2 -0
- package/.output/server/chunks/routes/api/users/tokens/_id/token.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/users/tokens/_id_.delete.mjs +2 -0
- package/.output/server/chunks/routes/api/users/tokens/_id_.delete.mjs.map +1 -1
- package/.output/server/chunks/routes/api/users/tokens/_id_.patch.mjs +2 -0
- package/.output/server/chunks/routes/api/users/tokens/_id_.patch.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/_...path_.mjs +2 -0
- package/.output/server/chunks/routes/api/workshop/_...path_.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/a2a/_agentId/index.get.mjs +2 -0
- package/.output/server/chunks/routes/api/workshop/a2a/_agentId/index.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/a2a/_agentId/index.post.mjs +2 -0
- package/.output/server/chunks/routes/api/workshop/a2a/_agentId/index.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/a2a/send.post.mjs +2 -0
- package/.output/server/chunks/routes/api/workshop/a2a/send.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/agent-tools/approvals/_id/decide.post.mjs +2 -0
- package/.output/server/chunks/routes/api/workshop/agent-tools/approvals/_id/decide.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/agent-tools/bindings/_id_.delete.mjs +2 -0
- package/.output/server/chunks/routes/api/workshop/agent-tools/bindings/_id_.delete.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/agent-tools/bindings/_id_.patch.mjs +2 -0
- package/.output/server/chunks/routes/api/workshop/agent-tools/bindings/_id_.patch.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/agent-tools/index.get.mjs +2 -0
- package/.output/server/chunks/routes/api/workshop/agent-tools/index.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/agent-tools/index.post.mjs +2 -0
- package/.output/server/chunks/routes/api/workshop/agent-tools/index.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/agent-tools/index2.get.mjs +2 -0
- package/.output/server/chunks/routes/api/workshop/agent-tools/index2.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/agent-tools/invoke.post.mjs +2 -0
- package/.output/server/chunks/routes/api/workshop/agent-tools/invoke.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/agents/_id_.delete.mjs +2 -0
- package/.output/server/chunks/routes/api/workshop/agents/_id_.delete.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/agents/_id_.get.mjs +2 -0
- package/.output/server/chunks/routes/api/workshop/agents/_id_.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/agents/_id_.patch.mjs +2 -0
- package/.output/server/chunks/routes/api/workshop/agents/_id_.patch.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/agents/subscribe.post.mjs +2 -0
- package/.output/server/chunks/routes/api/workshop/agents/subscribe.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/approvals/_id/decide.post.mjs +2 -0
- package/.output/server/chunks/routes/api/workshop/approvals/_id/decide.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/assets/character/_id_.delete.mjs +2 -0
- package/.output/server/chunks/routes/api/workshop/assets/character/_id_.delete.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/assets/devices/_id_.delete.mjs +2 -0
- package/.output/server/chunks/routes/api/workshop/assets/devices/_id_.delete.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/assets/index.get.mjs +2 -0
- package/.output/server/chunks/routes/api/workshop/assets/index.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/assets/index.post.mjs +2 -0
- package/.output/server/chunks/routes/api/workshop/assets/index.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/assets/index2.get.mjs +2 -0
- package/.output/server/chunks/routes/api/workshop/assets/index2.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/assets/index2.post.mjs +2 -0
- package/.output/server/chunks/routes/api/workshop/assets/index2.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/audit.get.mjs +2 -0
- package/.output/server/chunks/routes/api/workshop/audit.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/caller.mjs +2 -0
- package/.output/server/chunks/routes/api/workshop/caller.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/channel-templates/_id/instantiate.post.mjs +2 -0
- package/.output/server/chunks/routes/api/workshop/channel-templates/_id/instantiate.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/channel-templates/_id_.delete.mjs +2 -0
- package/.output/server/chunks/routes/api/workshop/channel-templates/_id_.delete.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/channel-templates/_id_.get.mjs +2 -0
- package/.output/server/chunks/routes/api/workshop/channel-templates/_id_.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/channel-templates/_id_.patch.mjs +2 -0
- package/.output/server/chunks/routes/api/workshop/channel-templates/_id_.patch.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/channel-templates/from-channel.post.mjs +2 -0
- package/.output/server/chunks/routes/api/workshop/channel-templates/from-channel.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/channels/_id/activate.post.mjs +2 -0
- package/.output/server/chunks/routes/api/workshop/channels/_id/activate.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/index.get.mjs +2 -0
- package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/index.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/index.post.mjs +2 -0
- package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/index.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/memories/_memoryId_.delete.mjs +2 -0
- package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/memories/_memoryId_.delete.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/memories/search.post.mjs +2 -0
- package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/memories/search.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/model.patch.mjs +2 -0
- package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/model.patch.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/position.patch.mjs +2 -0
- package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/position.patch.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/range.patch.mjs +2 -0
- package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/range.patch.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/stop.post.mjs +2 -0
- package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/stop.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId_.delete.mjs +2 -0
- package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId_.delete.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId_.patch.mjs +2 -0
- package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId_.patch.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/channels/_id/events.get.mjs +2 -0
- package/.output/server/chunks/routes/api/workshop/channels/_id/events.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/channels/_id/index.get.mjs +2 -0
- package/.output/server/chunks/routes/api/workshop/channels/_id/index.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/channels/_id/index.post.mjs +2 -0
- package/.output/server/chunks/routes/api/workshop/channels/_id/index.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/channels/_id/index2.get.mjs +2 -0
- package/.output/server/chunks/routes/api/workshop/channels/_id/index2.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/channels/_id/index2.post.mjs +2 -0
- package/.output/server/chunks/routes/api/workshop/channels/_id/index2.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/channels/_id/index3.get.mjs +2 -0
- package/.output/server/chunks/routes/api/workshop/channels/_id/index3.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/channels/_id/index3.post.mjs +2 -0
- package/.output/server/chunks/routes/api/workshop/channels/_id/index3.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/channels/_id/index4.get.mjs +2 -0
- package/.output/server/chunks/routes/api/workshop/channels/_id/index4.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/channels/_id/index4.post.mjs +2 -0
- package/.output/server/chunks/routes/api/workshop/channels/_id/index4.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/channels/_id/memories/_memoryId_.delete.mjs +2 -0
- package/.output/server/chunks/routes/api/workshop/channels/_id/memories/_memoryId_.delete.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/channels/_id/queue.get.mjs +2 -0
- package/.output/server/chunks/routes/api/workshop/channels/_id/queue.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/channels/_id/terminals.get.mjs +2 -0
- package/.output/server/chunks/routes/api/workshop/channels/_id/terminals.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/channels/_id_.delete.mjs +2 -0
- package/.output/server/chunks/routes/api/workshop/channels/_id_.delete.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/channels/index.get.mjs +2 -0
- package/.output/server/chunks/routes/api/workshop/channels/index.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/channels/index.patch.mjs +2 -0
- package/.output/server/chunks/routes/api/workshop/channels/index.patch.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/channels.get.mjs +2 -0
- package/.output/server/chunks/routes/api/workshop/channels.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/channels.post.mjs +2 -0
- package/.output/server/chunks/routes/api/workshop/channels.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/daq/_id/bind.post.mjs +2 -0
- package/.output/server/chunks/routes/api/workshop/daq/_id/bind.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/daq/_id/frames/content.get.mjs +36 -0
- package/.output/server/chunks/routes/api/workshop/daq/_id/frames/content.get.mjs.map +1 -0
- package/.output/server/chunks/routes/api/workshop/daq/_id/frames.get.mjs +53 -0
- package/.output/server/chunks/routes/api/workshop/daq/_id/frames.get.mjs.map +1 -0
- package/.output/server/chunks/routes/api/workshop/daq/_id/samples.get.mjs +2 -0
- package/.output/server/chunks/routes/api/workshop/daq/_id/samples.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/daq/_id/test.post.mjs +2 -0
- package/.output/server/chunks/routes/api/workshop/daq/_id/test.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/daq/_id_.delete.mjs +2 -0
- package/.output/server/chunks/routes/api/workshop/daq/_id_.delete.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/daq/_id_.patch.mjs +2 -0
- package/.output/server/chunks/routes/api/workshop/daq/_id_.patch.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/daq/alarms/_id/ack.post.mjs +2 -0
- package/.output/server/chunks/routes/api/workshop/daq/alarms/_id/ack.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/daq/alarms.get.mjs +2 -0
- package/.output/server/chunks/routes/api/workshop/daq/alarms.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/daq/controller.post.mjs +2 -0
- package/.output/server/chunks/routes/api/workshop/daq/controller.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/daq/index.post.mjs +2 -0
- package/.output/server/chunks/routes/api/workshop/daq/index.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/daq/infra/reconnect.post.mjs +2 -0
- package/.output/server/chunks/routes/api/workshop/daq/infra/reconnect.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/daq/infra.get.mjs +2 -0
- package/.output/server/chunks/routes/api/workshop/daq/infra.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/daq/templates/_key_.delete.mjs +2 -0
- package/.output/server/chunks/routes/api/workshop/daq/templates/_key_.delete.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/daq/templates/_key_.patch.mjs +2 -0
- package/.output/server/chunks/routes/api/workshop/daq/templates/_key_.patch.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/daq/test-driver.post.mjs +2 -0
- package/.output/server/chunks/routes/api/workshop/daq/test-driver.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/_id/bind.post.mjs +2 -0
- package/.output/server/chunks/routes/api/workshop/dcw/_id/bind.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/_id/param-ledger.get.mjs +2 -0
- package/.output/server/chunks/routes/api/workshop/dcw/_id/param-ledger.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/_id/test.post.mjs +2 -0
- package/.output/server/chunks/routes/api/workshop/dcw/_id/test.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/_id/write.post.mjs +2 -0
- package/.output/server/chunks/routes/api/workshop/dcw/_id/write.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/_id_.delete.mjs +2 -0
- package/.output/server/chunks/routes/api/workshop/dcw/_id_.delete.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/_id_.patch.mjs +2 -0
- package/.output/server/chunks/routes/api/workshop/dcw/_id_.patch.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/controller.post.mjs +2 -0
- package/.output/server/chunks/routes/api/workshop/dcw/controller.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/index.get.mjs +2 -0
- package/.output/server/chunks/routes/api/workshop/dcw/index.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/index.post.mjs +2 -0
- package/.output/server/chunks/routes/api/workshop/dcw/index.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/index2.get.mjs +2 -0
- package/.output/server/chunks/routes/api/workshop/dcw/index2.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/index2.post.mjs +2 -0
- package/.output/server/chunks/routes/api/workshop/dcw/index2.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/index3.get.mjs +2 -0
- package/.output/server/chunks/routes/api/workshop/dcw/index3.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/index3.post.mjs +2 -0
- package/.output/server/chunks/routes/api/workshop/dcw/index3.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/index4.get.mjs +2 -0
- package/.output/server/chunks/routes/api/workshop/dcw/index4.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/index4.post.mjs +2 -0
- package/.output/server/chunks/routes/api/workshop/dcw/index4.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/index5.get.mjs +2 -0
- package/.output/server/chunks/routes/api/workshop/dcw/index5.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/journal/node/_nodeId/rollback.post.mjs +2 -0
- package/.output/server/chunks/routes/api/workshop/dcw/journal/node/_nodeId/rollback.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/line/query.get.mjs +2 -0
- package/.output/server/chunks/routes/api/workshop/dcw/line/query.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/lines/_id/start.post.mjs +2 -0
- package/.output/server/chunks/routes/api/workshop/dcw/lines/_id/start.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/lines/_id/stop.post.mjs +2 -0
- package/.output/server/chunks/routes/api/workshop/dcw/lines/_id/stop.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/lines/_id_.delete.mjs +2 -0
- package/.output/server/chunks/routes/api/workshop/dcw/lines/_id_.delete.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/lines/_id_.patch.mjs +2 -0
- package/.output/server/chunks/routes/api/workshop/dcw/lines/_id_.patch.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id/judge.post.mjs +2 -0
- package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id/judge.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id/rollback.post.mjs +2 -0
- package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id/rollback.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id/series.get.mjs +2 -0
- package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id/series.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id_.get.mjs +2 -0
- package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id_.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/products/_id_.delete.mjs +2 -0
- package/.output/server/chunks/routes/api/workshop/dcw/products/_id_.delete.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/products/_id_.patch.mjs +2 -0
- package/.output/server/chunks/routes/api/workshop/dcw/products/_id_.patch.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/apply.post.mjs +2 -0
- package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/apply.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/mark-good.post.mjs +2 -0
- package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/mark-good.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/rollback-good.post.mjs +2 -0
- package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/rollback-good.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id_.delete.mjs +2 -0
- package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id_.delete.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id_.patch.mjs +2 -0
- package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id_.patch.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/runs/_id/close.post.mjs +2 -0
- package/.output/server/chunks/routes/api/workshop/dcw/runs/_id/close.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/runs/_id/data.get.mjs +2 -0
- package/.output/server/chunks/routes/api/workshop/dcw/runs/_id/data.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/runs/_id/rollback.post.mjs +2 -0
- package/.output/server/chunks/routes/api/workshop/dcw/runs/_id/rollback.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/templates/_key_.delete.mjs +2 -0
- package/.output/server/chunks/routes/api/workshop/dcw/templates/_key_.delete.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/templates/_key_.patch.mjs +2 -0
- package/.output/server/chunks/routes/api/workshop/dcw/templates/_key_.patch.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/test-driver.post.mjs +2 -0
- package/.output/server/chunks/routes/api/workshop/dcw/test-driver.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/device-twins/_id/control.post.mjs +2 -0
- package/.output/server/chunks/routes/api/workshop/device-twins/_id/control.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/device-twins/_id/telemetry.post.mjs +2 -0
- package/.output/server/chunks/routes/api/workshop/device-twins/_id/telemetry.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/device-twins/_id_.delete.mjs +2 -0
- package/.output/server/chunks/routes/api/workshop/device-twins/_id_.delete.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/device-twins/_id_.patch.mjs +2 -0
- package/.output/server/chunks/routes/api/workshop/device-twins/_id_.patch.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/fs/dirs.get.mjs +2 -0
- package/.output/server/chunks/routes/api/workshop/fs/dirs.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/index.get.mjs +2 -0
- package/.output/server/chunks/routes/api/workshop/index.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/index.post.mjs +2 -0
- package/.output/server/chunks/routes/api/workshop/index.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/index10.get.mjs +2 -0
- package/.output/server/chunks/routes/api/workshop/index10.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/index2.get.mjs +2 -0
- package/.output/server/chunks/routes/api/workshop/index2.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/index2.post.mjs +2 -0
- package/.output/server/chunks/routes/api/workshop/index2.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/index3.get.mjs +2 -0
- package/.output/server/chunks/routes/api/workshop/index3.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/index3.post.mjs +2 -0
- package/.output/server/chunks/routes/api/workshop/index3.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/index4.get.mjs +2 -0
- package/.output/server/chunks/routes/api/workshop/index4.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/index4.post.mjs +2 -0
- package/.output/server/chunks/routes/api/workshop/index4.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/index5.get.mjs +2 -0
- package/.output/server/chunks/routes/api/workshop/index5.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/index5.post.mjs +2 -0
- package/.output/server/chunks/routes/api/workshop/index5.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/index6.get.mjs +2 -0
- package/.output/server/chunks/routes/api/workshop/index6.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/index6.post.mjs +2 -0
- package/.output/server/chunks/routes/api/workshop/index6.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/index7.get.mjs +2 -0
- package/.output/server/chunks/routes/api/workshop/index7.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/index7.post.mjs +2 -0
- package/.output/server/chunks/routes/api/workshop/index7.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/index8.get.mjs +2 -0
- package/.output/server/chunks/routes/api/workshop/index8.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/index8.post.mjs +2 -0
- package/.output/server/chunks/routes/api/workshop/index8.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/index9.get.mjs +2 -0
- package/.output/server/chunks/routes/api/workshop/index9.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/mailbox/all.get.mjs +2 -0
- package/.output/server/chunks/routes/api/workshop/mailbox/all.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/mailbox.get.mjs +2 -0
- package/.output/server/chunks/routes/api/workshop/mailbox.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/memories/maintenance.post.mjs +2 -0
- package/.output/server/chunks/routes/api/workshop/memories/maintenance.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/plugins/_name/disable.post.mjs +2 -0
- package/.output/server/chunks/routes/api/workshop/plugins/_name/disable.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/plugins/_name/enable.post.mjs +2 -0
- package/.output/server/chunks/routes/api/workshop/plugins/_name/enable.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/plugins/index.get.mjs +2 -0
- package/.output/server/chunks/routes/api/workshop/plugins/index.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/runtime.get.mjs +2 -0
- package/.output/server/chunks/routes/api/workshop/runtime.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/scene/layouts/_channelId_.delete.mjs +2 -0
- package/.output/server/chunks/routes/api/workshop/scene/layouts/_channelId_.delete.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/scene/layouts/_channelId_.put.mjs +2 -0
- package/.output/server/chunks/routes/api/workshop/scene/layouts/_channelId_.put.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/scene/layouts.get.mjs +2 -0
- package/.output/server/chunks/routes/api/workshop/scene/layouts.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/tasks/_id/complete.post.mjs +2 -0
- package/.output/server/chunks/routes/api/workshop/tasks/_id/complete.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/tasks/_id/dispatch.post.mjs +2 -0
- package/.output/server/chunks/routes/api/workshop/tasks/_id/dispatch.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/tasks/_id/index.post.mjs +2 -0
- package/.output/server/chunks/routes/api/workshop/tasks/_id/index.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/tasks/_id/report.post.mjs +2 -0
- package/.output/server/chunks/routes/api/workshop/tasks/_id/report.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/tasks/_id/retry.post.mjs +2 -0
- package/.output/server/chunks/routes/api/workshop/tasks/_id/retry.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/tasks/_id_.get.mjs +2 -0
- package/.output/server/chunks/routes/api/workshop/tasks/_id_.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/tasks.get.mjs +2 -0
- package/.output/server/chunks/routes/api/workshop/tasks.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/teams/_id/deploy.post.mjs +2 -0
- package/.output/server/chunks/routes/api/workshop/teams/_id/deploy.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/teams/_id/index.get.mjs +2 -0
- package/.output/server/chunks/routes/api/workshop/teams/_id/index.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/teams/_id/index.post.mjs +2 -0
- package/.output/server/chunks/routes/api/workshop/teams/_id/index.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/teams/_id/members/_agentId_.delete.mjs +2 -0
- package/.output/server/chunks/routes/api/workshop/teams/_id/members/_agentId_.delete.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/teams/_id_.delete.mjs +2 -0
- package/.output/server/chunks/routes/api/workshop/teams/_id_.delete.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/teams/_id_.get.mjs +2 -0
- package/.output/server/chunks/routes/api/workshop/teams/_id_.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/teams/_id_.patch.mjs +2 -0
- package/.output/server/chunks/routes/api/workshop/teams/_id_.patch.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/users/me.get.mjs +2 -0
- package/.output/server/chunks/routes/api/workshop/users/me.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/users/register.post.mjs +2 -0
- package/.output/server/chunks/routes/api/workshop/users/register.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/workspaces/_id/channel-templates/_tplId_.post.mjs +2 -0
- package/.output/server/chunks/routes/api/workshop/workspaces/_id/channel-templates/_tplId_.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/workspaces/_id/channels/_channelId_.delete.mjs +2 -0
- package/.output/server/chunks/routes/api/workshop/workspaces/_id/channels/_channelId_.delete.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/workspaces/_id/channels/_channelId_.post.mjs +2 -0
- package/.output/server/chunks/routes/api/workshop/workspaces/_id/channels/_channelId_.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/workspaces/index.delete.mjs +2 -0
- package/.output/server/chunks/routes/api/workshop/workspaces/index.delete.mjs.map +1 -1
- package/.output/server/chunks/routes/renderer.mjs +1 -1
- package/.output/server/chunks/routes/renderer.mjs.map +1 -1
- package/.output/server/chunks/virtual/entry.mjs +166 -114
- package/.output/server/chunks/virtual/entry.mjs.map +1 -1
- package/.output/server/chunks/virtual/precomputed.mjs +1 -1
- package/.output/server/index.mjs +2 -0
- package/.output/server/index.mjs.map +1 -1
- package/.output/server/package.json +1 -1
- package/app/composables/workshop/useDaqStream.ts +59 -1
- package/app/config/schema.ts +8 -0
- package/app/pages/daq/[id].vue +141 -1
- package/app/pages/settings.vue +10 -5
- package/app/plugins/runtime-config.client.ts +65 -65
- package/app/stores/runtime-config.ts +212 -212
- package/config.yml +77 -70
- package/docker-compose.yml +19 -2
- package/docs/plugins.md +271 -197
- package/i18n/dicts/_en.json +7 -2
- package/i18n/dicts/daqDetail.json +8 -2
- package/i18n/locales/en.ts +55 -29
- package/i18n/locales/zh-CN.ts +55 -29
- package/nuxt.config.ts +1 -1
- package/package.json +144 -143
- package/scripts/_dbg-collab-scenario-e2e.mjs +185 -0
- package/scripts/_dbg-daq-frame-alarm.mjs +49 -0
- package/scripts/_dbg-daq-frame-ui.mjs +62 -0
- package/scripts/_dbg-daq-frame-ws.mjs +72 -0
- package/scripts/_dbg-daq-frames-e2e.mjs +118 -0
- package/scripts/_dbg-host.mjs +16 -0
- package/scripts/_dbg-plugin-agent-read.ts +56 -0
- package/scripts/_dbg-plugin-sink-rest.mjs +70 -0
- package/scripts/_dbg-plugin-sink-ui.mjs +81 -0
- package/scripts/_dbg-plugin-tools-inject.ts +80 -0
- package/scripts/_dbg-plugin-verify-e2e.mjs +123 -0
- package/scripts/_dbg-prompts-hotreload-test.ts +76 -0
- package/scripts/_dbg-release-smoke.mjs +104 -0
- package/scripts/i18n-merge.mjs +69 -67
- package/scripts/test-context-governor.ts +176 -176
- package/scripts/test-daq-frames.ts +180 -0
- package/scripts/test-daq-minio.ts +77 -0
- package/scripts/test-memory-rrf-mmr.ts +114 -114
- package/scripts/test-plugin-ext.ts +173 -0
- package/server/api/system/settings/events.get.ts +27 -28
- package/server/api/system/settings/index.get.ts +14 -14
- package/server/api/system/settings/index.patch.ts +22 -22
- package/server/api/system/settings/reset.post.ts +12 -12
- package/server/api/workshop/daq/[id]/frames/content.get.ts +24 -0
- package/server/api/workshop/daq/[id]/frames.get.ts +44 -0
- package/server/data/daqs.json +113 -89
- package/server/data/dcw-rollback.json +1 -1
- package/server/data/dcw-runs.json +3207 -2517
- package/server/data/dcw-writes.json +720 -0
- package/server/data/dcws.json +4 -4
- package/server/data/line-runs.json +1 -232
- package/server/plugins/daq.ts +11 -0
- package/server/plugins/system-config.ts +38 -38
- package/server/services/system-config.ts +365 -356
- package/server/services/workshop/agents/industrial-tools.ts +91 -25
- package/server/services/workshop/agents/omp-agent.ts +1955 -1895
- package/server/services/workshop/agents/plugin-tools.ts +145 -0
- package/server/services/workshop/daq/bus/queue-port.ts +18 -0
- package/server/services/workshop/daq/daq-controller.ts +216 -14
- package/server/services/workshop/daq/daq-node.ts +257 -247
- package/server/services/workshop/daq/daq-runtime.ts +36 -4
- package/server/services/workshop/daq/daq-templates.ts +213 -157
- package/server/services/workshop/daq/drivers.ts +134 -30
- package/server/services/workshop/daq/frames.ts +227 -0
- package/server/services/workshop/daq/infra.ts +31 -17
- package/server/services/workshop/daq/objectstore/disk.adapter.ts +38 -0
- package/server/services/workshop/daq/objectstore/index.ts +88 -0
- package/server/services/workshop/daq/objectstore/minio.adapter.ts +60 -0
- package/server/services/workshop/daq/objectstore/objectstore-port.ts +27 -0
- package/server/services/workshop/daq/plugin-bridge.ts +73 -0
- package/server/services/workshop/daq/png-enc.ts +71 -0
- package/server/services/workshop/daq/storage/sqlite.adapter.ts +104 -1
- package/server/services/workshop/daq/storage/timescale.adapter.ts +95 -4
- package/server/services/workshop/daq/storage/tsdb-port.ts +46 -0
- package/server/services/workshop/plugins/host.mjs +479 -417
- package/server/services/workshop/runtime/agent-runtime.ts +744 -744
- package/shared/config/schema.json +6 -1
- package/shared/daq-protocol.ts +88 -0
- package/.output/public/_nuxt/B-PgoIPN.js +0 -1
- package/.output/public/_nuxt/DVNYfGsj.js +0 -1
- package/.output/public/_nuxt/_id_.CbiF5PrV.css +0 -1
- package/.output/public/_nuxt/builds/meta/6f7e40bf-a960-4f51-8a2e-bb1fffeaa5e8.json +0 -1
- package/.output/public/_nuxt/settings.BANibAnV.css +0 -1
- package/.output/server/chunks/build/_id_-BOhG2yz8.mjs.map +0 -1
- package/.output/server/chunks/build/_id_-CuyMYmhY.mjs.map +0 -1
- package/.output/server/chunks/build/agents-BVaxN75W.mjs.map +0 -1
- package/.output/server/chunks/build/channel-templates-D1K2IKrE.mjs.map +0 -1
- package/.output/server/chunks/build/client-only-CFTHwakk.mjs.map +0 -1
- package/.output/server/chunks/build/daq-ObtN1TQ4.mjs.map +0 -1
- package/.output/server/chunks/build/dcw-fINr-He1.mjs.map +0 -1
- package/.output/server/chunks/build/interval-Bt11uRPw.mjs +0 -9
- package/.output/server/chunks/build/interval-Bt11uRPw.mjs.map +0 -1
- package/.output/server/chunks/build/logs-DqNgCJAn.mjs.map +0 -1
- package/.output/server/chunks/build/pages-DC52d7z7.mjs.map +0 -1
- package/.output/server/chunks/build/plugins-DVQty7qG.mjs.map +0 -1
- package/.output/server/chunks/build/settings-BeergncK.mjs.map +0 -1
- package/.output/server/chunks/build/teams-CFeDlHDh.mjs.map +0 -1
- package/.output/server/chunks/build/tokens-CBAUbOce.mjs.map +0 -1
- package/.output/server/chunks/build/town-BxH-XXth.mjs.map +0 -1
- package/.output/server/chunks/build/useDaqStream-CwORhsD7.mjs.map +0 -1
- package/.output/server/chunks/build/users-BMs4s_6K.mjs.map +0 -1
- 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, listPluginDrivers, 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 {
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
|
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
|
|
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, pluginDrivers: string[], drivers: typeof DAQ_DRIVERS } {
|
|
729
|
+
return { tsdb: getTsdb().backend, queue: g_queueBackend ?? 'inproc', objectstore: getObjectStore().backend, pluginDrivers: listPluginDrivers(), drivers: DAQ_DRIVERS }
|
|
528
730
|
}
|
|
529
731
|
|
|
530
732
|
// ---------- 控制器全局 ----------
|