agentworkshop 0.5.9 → 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.
- 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/a0ac51ef-51c0-4ff9-8484-7c90d8dd10ba.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 +2648 -1401
- 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-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 +89 -89
- package/server/data/dcw-rollback.json +1 -1
- package/server/data/dcw-runs.json +3136 -2492
- package/server/data/dcw-writes.json +672 -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
|
@@ -1,157 +1,213 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* DaqTemplate 注册表 —— 内置模板(shared 单一事实源)+ 用户自定义模板的统一查询口。
|
|
3
|
-
*
|
|
4
|
-
* 自定义模板落盘 server/data/daq-templates.json(仅存自定义;内置始终在代码里),
|
|
5
|
-
* 与 DaqNodeRepo 同风格:进程内缓存 + 同步落盘(量小无抖动)。节点创建校验、
|
|
6
|
-
* 缺省域、mock 采样一律经 findDaqTemplate 查找 —— 自定义模板与内置同权。
|
|
7
|
-
*/
|
|
8
|
-
|
|
9
|
-
import { createLogger } from '../logger'
|
|
10
|
-
import fs from 'node:fs'
|
|
11
|
-
import { join } from 'node:path'
|
|
12
|
-
import { randomUUID } from 'node:crypto'
|
|
13
|
-
import { DAQ_TEMPLATES, DAQ_TEMPLATE_ICONS, daqTemplateByKey, type DaqTemplateDef, type DaqTemplateIcon, type DaqTemplateInput } from '../../../../shared/daq-protocol'
|
|
14
|
-
import { AppError, ErrorCodes } from '../../../utils/errors'
|
|
15
|
-
import { ensureDataDir } from '@/shared/config/home.mjs'
|
|
16
|
-
|
|
17
|
-
const log = createLogger('daq.templates')
|
|
18
|
-
|
|
19
|
-
/** 业务错误捷径(经 defineApiHandler 映射为对应 HTTP 状态与消息) */
|
|
20
|
-
const bad = (msg: string): AppError => new AppError(400, ErrorCodes.VALIDATION_ERROR, msg)
|
|
21
|
-
|
|
22
|
-
// 配置根 .AgentWorkShop/data(ensureDataDir 统一解析 + 旧位置迁移)
|
|
23
|
-
const DB_PATH = join(ensureDataDir(), 'daq-templates.json')
|
|
24
|
-
|
|
25
|
-
function load(): DaqTemplateDef[] {
|
|
26
|
-
try {
|
|
27
|
-
const raw = fs.readFileSync(DB_PATH, 'utf-8')
|
|
28
|
-
const parsed = JSON.parse(raw)
|
|
29
|
-
return Array.isArray(parsed) ? parsed as DaqTemplateDef[] : []
|
|
30
|
-
}
|
|
31
|
-
catch {
|
|
32
|
-
return []
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
/** 输入校验 + 归一(base/amp/decimals 等缺省由量程推导;非法值直接抛业务错误) */
|
|
37
|
-
function normalize(input: Partial<DaqTemplateInput>, prev?: DaqTemplateDef): DaqTemplateDef {
|
|
38
|
-
const name = String(input.name ?? prev?.name ?? '').trim()
|
|
39
|
-
if (!name) throw bad('模板名称必填')
|
|
40
|
-
const unit = String(input.unit ?? prev?.unit ?? '').trim()
|
|
41
|
-
if (!unit) throw bad('单位必填(如 ℃ / MPa)')
|
|
42
|
-
|
|
43
|
-
const min = Number(input.min ?? prev?.min)
|
|
44
|
-
const max = Number(input.max ?? prev?.max)
|
|
45
|
-
if (!Number.isFinite(min) || !Number.isFinite(max) || min >= max) {
|
|
46
|
-
throw bad('量程非法:需满足 min < max 的数字')
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
const base = input.base ?? prev?.base ?? (min + max) / 2
|
|
50
|
-
if (!Number.isFinite(Number(base))) throw bad('模拟基值需为数字')
|
|
51
|
-
|
|
52
|
-
const amp = Number(input.amp ?? prev?.amp ?? Math.max((max - min) * 0.04, 0.001))
|
|
53
|
-
if (!Number.isFinite(amp) || amp <= 0) throw bad('模拟波幅需为正数')
|
|
54
|
-
|
|
55
|
-
const decimals = Math.round(Number(input.decimals ?? prev?.decimals ?? 2))
|
|
56
|
-
if (!Number.isInteger(decimals) || decimals < 0 || decimals > 4) {
|
|
57
|
-
throw bad('小数位需为 0~4 的整数')
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
const iconRaw = String(input.icon ?? prev?.icon ?? 'thermo')
|
|
61
|
-
const icon = (DAQ_TEMPLATE_ICONS as readonly string[]).includes(iconRaw)
|
|
62
|
-
? iconRaw as DaqTemplateIcon
|
|
63
|
-
: 'thermo'
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
min
|
|
74
|
-
max
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
return
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
this.
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
}
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
}
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
}
|
|
1
|
+
/**
|
|
2
|
+
* DaqTemplate 注册表 —— 内置模板(shared 单一事实源)+ 用户自定义模板的统一查询口。
|
|
3
|
+
*
|
|
4
|
+
* 自定义模板落盘 server/data/daq-templates.json(仅存自定义;内置始终在代码里),
|
|
5
|
+
* 与 DaqNodeRepo 同风格:进程内缓存 + 同步落盘(量小无抖动)。节点创建校验、
|
|
6
|
+
* 缺省域、mock 采样一律经 findDaqTemplate 查找 —— 自定义模板与内置同权。
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import { createLogger } from '../logger'
|
|
10
|
+
import fs from 'node:fs'
|
|
11
|
+
import { join } from 'node:path'
|
|
12
|
+
import { randomUUID } from 'node:crypto'
|
|
13
|
+
import { DAQ_TEMPLATES, DAQ_TEMPLATE_ICONS, daqTemplateByKey, normalizeSignalKind, type DaqMetricRule, type DaqSinkStep, type DaqTemplateDef, type DaqTemplateIcon, type DaqTemplateInput } from '../../../../shared/daq-protocol'
|
|
14
|
+
import { AppError, ErrorCodes } from '../../../utils/errors'
|
|
15
|
+
import { ensureDataDir } from '@/shared/config/home.mjs'
|
|
16
|
+
|
|
17
|
+
const log = createLogger('daq.templates')
|
|
18
|
+
|
|
19
|
+
/** 业务错误捷径(经 defineApiHandler 映射为对应 HTTP 状态与消息) */
|
|
20
|
+
const bad = (msg: string): AppError => new AppError(400, ErrorCodes.VALIDATION_ERROR, msg)
|
|
21
|
+
|
|
22
|
+
// 配置根 .AgentWorkShop/data(ensureDataDir 统一解析 + 旧位置迁移)
|
|
23
|
+
const DB_PATH = join(ensureDataDir(), 'daq-templates.json')
|
|
24
|
+
|
|
25
|
+
function load(): DaqTemplateDef[] {
|
|
26
|
+
try {
|
|
27
|
+
const raw = fs.readFileSync(DB_PATH, 'utf-8')
|
|
28
|
+
const parsed = JSON.parse(raw)
|
|
29
|
+
return Array.isArray(parsed) ? parsed as DaqTemplateDef[] : []
|
|
30
|
+
}
|
|
31
|
+
catch {
|
|
32
|
+
return []
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/** 输入校验 + 归一(base/amp/decimals 等缺省由量程推导;非法值直接抛业务错误) */
|
|
37
|
+
function normalize(input: Partial<DaqTemplateInput>, prev?: DaqTemplateDef): DaqTemplateDef {
|
|
38
|
+
const name = String(input.name ?? prev?.name ?? '').trim()
|
|
39
|
+
if (!name) throw bad('模板名称必填')
|
|
40
|
+
const unit = String(input.unit ?? prev?.unit ?? '').trim()
|
|
41
|
+
if (!unit) throw bad('单位必填(如 ℃ / MPa)')
|
|
42
|
+
|
|
43
|
+
const min = Number(input.min ?? prev?.min)
|
|
44
|
+
const max = Number(input.max ?? prev?.max)
|
|
45
|
+
if (!Number.isFinite(min) || !Number.isFinite(max) || min >= max) {
|
|
46
|
+
throw bad('量程非法:需满足 min < max 的数字')
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
const base = input.base ?? prev?.base ?? (min + max) / 2
|
|
50
|
+
if (!Number.isFinite(Number(base))) throw bad('模拟基值需为数字')
|
|
51
|
+
|
|
52
|
+
const amp = Number(input.amp ?? prev?.amp ?? Math.max((max - min) * 0.04, 0.001))
|
|
53
|
+
if (!Number.isFinite(amp) || amp <= 0) throw bad('模拟波幅需为正数')
|
|
54
|
+
|
|
55
|
+
const decimals = Math.round(Number(input.decimals ?? prev?.decimals ?? 2))
|
|
56
|
+
if (!Number.isInteger(decimals) || decimals < 0 || decimals > 4) {
|
|
57
|
+
throw bad('小数位需为 0~4 的整数')
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
const iconRaw = String(input.icon ?? prev?.icon ?? 'thermo')
|
|
61
|
+
const icon = (DAQ_TEMPLATE_ICONS as readonly string[]).includes(iconRaw)
|
|
62
|
+
? iconRaw as DaqTemplateIcon
|
|
63
|
+
: 'thermo'
|
|
64
|
+
|
|
65
|
+
// 多形态信号(v2 帧管线):signalKind/vector/sink/metrics 归一(缺省 scalar 零行为变化)
|
|
66
|
+
const signalKind = normalizeSignalKind(input.signalKind ?? prev?.signalKind)
|
|
67
|
+
let vector: DaqTemplateDef['vector']
|
|
68
|
+
if (signalKind === 'vector') {
|
|
69
|
+
const points = Math.round(Number(input.vector?.points ?? prev?.vector?.points ?? 64))
|
|
70
|
+
if (!Number.isInteger(points) || points < 2 || points > 4096) {
|
|
71
|
+
throw bad('vector.points 需为 2~4096 的整数')
|
|
72
|
+
}
|
|
73
|
+
const vmin = Number(input.vector?.min ?? prev?.vector?.min ?? min)
|
|
74
|
+
const vmax = Number(input.vector?.max ?? prev?.vector?.max ?? max)
|
|
75
|
+
if (!Number.isFinite(vmin) || !Number.isFinite(vmax) || vmin >= vmax) throw bad('vector 量程非法')
|
|
76
|
+
vector = { points, min: vmin, max: vmax }
|
|
77
|
+
}
|
|
78
|
+
const sink = input.sink ?? prev?.sink
|
|
79
|
+
if (sink && (!Array.isArray(sink.processors) || sink.processors.some(p => !p || typeof p.name !== 'string'))) {
|
|
80
|
+
throw bad('sink.processors 非法:需为 { name, args? } 数组')
|
|
81
|
+
}
|
|
82
|
+
const metrics = (input.metrics ?? prev?.metrics)?.filter(r => r && typeof r.key === 'string' && r.key.trim()) as DaqMetricRule[] | undefined
|
|
83
|
+
|
|
84
|
+
return {
|
|
85
|
+
key: prev?.key ?? `ct-${randomUUID().slice(0, 8)}`,
|
|
86
|
+
name,
|
|
87
|
+
code: String(input.code ?? prev?.code ?? name).trim().toUpperCase() || name.toUpperCase(),
|
|
88
|
+
ch: String(input.ch ?? prev?.ch ?? name).trim() || name,
|
|
89
|
+
unit,
|
|
90
|
+
base: Number(base),
|
|
91
|
+
amp,
|
|
92
|
+
min,
|
|
93
|
+
max,
|
|
94
|
+
decimals,
|
|
95
|
+
icon,
|
|
96
|
+
semantics: String(input.semantics ?? prev?.semantics ?? '').trim() || undefined,
|
|
97
|
+
telemetryKey: String(input.telemetryKey ?? prev?.telemetryKey ?? '').trim() || undefined,
|
|
98
|
+
builtin: false,
|
|
99
|
+
signalKind,
|
|
100
|
+
vector,
|
|
101
|
+
sink: sink && sink.processors.length > 0 ? { processors: sink.processors as DaqSinkStep[] } : undefined,
|
|
102
|
+
metrics: metrics && metrics.length > 0 ? metrics : undefined,
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
class DaqTemplateRegistry {
|
|
107
|
+
private customs: DaqTemplateDef[]
|
|
108
|
+
/** 插件注册模板(内存态,键 = 模板 key;插件热重载同名覆盖;不经 REST 增删) */
|
|
109
|
+
private pluginTpls = new Map<string, DaqTemplateDef>()
|
|
110
|
+
|
|
111
|
+
constructor() {
|
|
112
|
+
this.customs = load()
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
/** 全目录:内置在前(统一打 builtin 标记),插件模板居中(打 plugin 标记),自定义在后 */
|
|
116
|
+
all(): DaqTemplateDef[] {
|
|
117
|
+
return [
|
|
118
|
+
...DAQ_TEMPLATES.map(t => ({ ...t, builtin: true })),
|
|
119
|
+
...[...this.pluginTpls.values()].map(t => ({ ...t, plugin: t.plugin ?? 'plugin' })),
|
|
120
|
+
...this.customs,
|
|
121
|
+
]
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
byKey(key: string): DaqTemplateDef | undefined {
|
|
125
|
+
return daqTemplateByKey(key) ?? this.pluginTpls.get(key) ?? this.customs.find(t => t.key === key)
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
/**
|
|
129
|
+
* 插件模板注册(同名 key 覆盖 → 插件热重载幂等;REST 不可增删改)。
|
|
130
|
+
* def.key 必填(建议 `plug-<plugin>-<sig>` 命名);signalKind/sink/metrics 全量可用。
|
|
131
|
+
*/
|
|
132
|
+
registerPlugin(def: DaqTemplateDef): DaqTemplateDef {
|
|
133
|
+
if (!def?.key || !/^[\w-]+$/.test(def.key)) {
|
|
134
|
+
throw new AppError(400, ErrorCodes.VALIDATION_ERROR, `插件模板 key 非法: ${def?.key}(需 [\\w-]+)`)
|
|
135
|
+
}
|
|
136
|
+
if (daqTemplateByKey(def.key)) {
|
|
137
|
+
throw new AppError(400, ErrorCodes.VALIDATION_ERROR, `插件模板 key 与内置模板冲突: ${def.key}`)
|
|
138
|
+
}
|
|
139
|
+
const merged: DaqTemplateDef = { ...def, plugin: def.plugin ?? 'plugin' }
|
|
140
|
+
this.pluginTpls.set(def.key, merged)
|
|
141
|
+
log.info(`[daq] 插件模板注册:「${merged.name}」(${def.key},插件=${merged.plugin})`)
|
|
142
|
+
return merged
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
isPlugin(key: string): boolean {
|
|
146
|
+
return this.pluginTpls.has(key)
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
create(input: DaqTemplateInput): DaqTemplateDef {
|
|
150
|
+
const tpl = normalize(input)
|
|
151
|
+
if (this.customs.some(t => t.name === tpl.name)) {
|
|
152
|
+
throw new AppError(409, ErrorCodes.CONFLICT, `同名自定义模板已存在: ${tpl.name}`)
|
|
153
|
+
}
|
|
154
|
+
this.customs.push(tpl)
|
|
155
|
+
this.flush()
|
|
156
|
+
return tpl
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
update(key: string, patch: Partial<DaqTemplateInput>): DaqTemplateDef {
|
|
160
|
+
if (this.pluginTpls.has(key)) {
|
|
161
|
+
throw new AppError(400, ErrorCodes.BAD_REQUEST, '插件模板不可经 REST 修改(由插件自身管理)')
|
|
162
|
+
}
|
|
163
|
+
const prev = this.customs.find(t => t.key === key)
|
|
164
|
+
if (!prev) {
|
|
165
|
+
throw new AppError(400, ErrorCodes.BAD_REQUEST, daqTemplateByKey(key) ? '内置模板不可修改(可复制为自定义)' : `自定义模板不存在: ${key}`)
|
|
166
|
+
}
|
|
167
|
+
const tpl = normalize(patch, prev)
|
|
168
|
+
this.customs = this.customs.map(t => (t.key === key ? tpl : t))
|
|
169
|
+
this.flush()
|
|
170
|
+
return tpl
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
remove(key: string): DaqTemplateDef {
|
|
174
|
+
if (this.pluginTpls.has(key)) {
|
|
175
|
+
throw new AppError(400, ErrorCodes.BAD_REQUEST, '插件模板不可经 REST 删除(由插件自身管理)')
|
|
176
|
+
}
|
|
177
|
+
const prev = this.customs.find(t => t.key === key)
|
|
178
|
+
if (!prev) {
|
|
179
|
+
throw new AppError(400, ErrorCodes.BAD_REQUEST, daqTemplateByKey(key) ? '内置模板不可删除' : `自定义模板不存在: ${key}`)
|
|
180
|
+
}
|
|
181
|
+
this.customs = this.customs.filter(t => t.key !== key)
|
|
182
|
+
this.flush()
|
|
183
|
+
return prev
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
private flush(): void {
|
|
187
|
+
try {
|
|
188
|
+
fs.mkdirSync(join(DB_PATH, '..'), { recursive: true })
|
|
189
|
+
fs.writeFileSync(DB_PATH, JSON.stringify(this.customs, null, 2), 'utf-8')
|
|
190
|
+
}
|
|
191
|
+
catch (err) {
|
|
192
|
+
log.error('[daq] 模板落盘失败:', err)
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
// 单例(HMR 存活,与 DaqNodeRepo 同风格)
|
|
198
|
+
const g = globalThis as typeof globalThis & { __daqTemplateRegistry?: DaqTemplateRegistry }
|
|
199
|
+
|
|
200
|
+
export function getDaqTemplateRegistry(): DaqTemplateRegistry {
|
|
201
|
+
g.__daqTemplateRegistry ??= new DaqTemplateRegistry()
|
|
202
|
+
return g.__daqTemplateRegistry
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
/** 目录快照(server 返回给前端时附带 builtin 标记) */
|
|
206
|
+
export function listDaqTemplates(): DaqTemplateDef[] {
|
|
207
|
+
return getDaqTemplateRegistry().all()
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
/** 节点缺省域/mock 采样的统一查找口(内置 + 自定义) */
|
|
211
|
+
export function findDaqTemplate(key: string): DaqTemplateDef | undefined {
|
|
212
|
+
return getDaqTemplateRegistry().byKey(key)
|
|
213
|
+
}
|
|
@@ -16,6 +16,7 @@
|
|
|
16
16
|
*/
|
|
17
17
|
import { createLogger } from '../logger'
|
|
18
18
|
import { createRequire } from 'node:module'
|
|
19
|
+
import { encodePng } from './png-enc'
|
|
19
20
|
import type { DaqDriverKind, DriverTestResult } from '../../../../shared/daq-protocol'
|
|
20
21
|
|
|
21
22
|
const log = createLogger('daq.drivers')
|
|
@@ -36,13 +37,38 @@ export interface DaqDriverInput {
|
|
|
36
37
|
config: { base: number, amp: number, min: number, max: number }
|
|
37
38
|
/** 节点保存的协议连接参数(host/register/endpoint/nodeId...) */
|
|
38
39
|
driverConfig: Record<string, unknown>
|
|
40
|
+
/** 模板信号形态(v2 帧管线;缺省 scalar —— 既有驱动零感知) */
|
|
41
|
+
signalKind?: 'scalar' | 'vector' | 'image'
|
|
42
|
+
/** vector 声明(模板;mock 生成点列/校验依据) */
|
|
43
|
+
vector?: { points: number, min: number, max: number }
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* 帧采样值(v2 多形态信号):驱动 sample() 可返回标量(既有契约)或帧信封。
|
|
48
|
+
* - vector:多点工程量轮廓(≤4096 点,经队列 JSON 传输)
|
|
49
|
+
* - image :像素 blob(仅生产侧管线内存续;controller 落对象存储后剥离为 objectKey)
|
|
50
|
+
*/
|
|
51
|
+
export type DaqFrameSample = {
|
|
52
|
+
frame:
|
|
53
|
+
| { kind: 'vector', points: number[], metrics?: Record<string, number> }
|
|
54
|
+
| {
|
|
55
|
+
kind: 'image'
|
|
56
|
+
blob: Buffer
|
|
57
|
+
mime: string
|
|
58
|
+
width: number
|
|
59
|
+
height: number
|
|
60
|
+
metrics?: Record<string, number>
|
|
61
|
+
/** 驱动侧通常未设;controller 落对象存储后回填引用(队列信封只传引用) */
|
|
62
|
+
objectKey?: string
|
|
63
|
+
thumbKey?: string
|
|
64
|
+
}
|
|
39
65
|
}
|
|
40
66
|
|
|
41
67
|
export interface DaqDriver {
|
|
42
68
|
readonly kind: DaqDriverKind
|
|
43
69
|
/** 协议栈是否可用(包缺失时 false,节点测试连接给出可行动提示) */
|
|
44
70
|
available(): Promise<boolean>
|
|
45
|
-
sample(input: DaqDriverInput): Promise<number | null> | number | null
|
|
71
|
+
sample(input: DaqDriverInput): Promise<number | DaqFrameSample | null> | number | DaqFrameSample | null
|
|
46
72
|
test(driverConfig: Record<string, unknown>): Promise<DriverTestResult>
|
|
47
73
|
}
|
|
48
74
|
|
|
@@ -75,39 +101,101 @@ export const mockDaqDriver: DaqDriver = {
|
|
|
75
101
|
async available() {
|
|
76
102
|
return true
|
|
77
103
|
},
|
|
78
|
-
sample({ ctx, config }) {
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
if (
|
|
82
|
-
|
|
83
|
-
states.set(ctx.nodeId, st)
|
|
84
|
-
}
|
|
85
|
-
const dt = Math.max(0, Math.min(ctx.now - st.lastAt, 60_000))
|
|
86
|
-
st.lastAt = ctx.now
|
|
87
|
-
if (st.excursionLeft <= 0 && Math.random() < 0.008 * Math.max(1, dt / 1000)) {
|
|
88
|
-
st.excursionLeft = 6 + Math.floor(Math.random() * 9)
|
|
89
|
-
st.excursionDir = Math.random() < 0.5 ? -1 : 1
|
|
90
|
-
st.excursionDepth = (config.max - config.min) * (0.08 + Math.random() * 0.1)
|
|
91
|
-
}
|
|
92
|
-
const t = (ctx.ageMs + st.phase * 100) / 1000
|
|
93
|
-
const sine = Math.sin(t * 0.35) * config.amp * 0.55 + Math.sin(t * 0.11 + 1.3) * config.amp * 0.3
|
|
94
|
-
let v = config.base + sine
|
|
95
|
-
if (st.value != null) v += (config.base - st.value) * 0.06 + (Math.random() - 0.5) * config.amp * 0.5
|
|
96
|
-
if (st.excursionLeft > 0) {
|
|
97
|
-
st.excursionLeft -= 1
|
|
98
|
-
const ramp = Math.min(1, (10 - st.excursionLeft) / 4)
|
|
99
|
-
v += st.excursionDir * st.excursionDepth * (0.4 + 0.6 * ramp)
|
|
100
|
-
if (st.excursionLeft === 0) st.excursionDir = 0
|
|
101
|
-
}
|
|
102
|
-
v = Math.min(config.max + config.amp * 2.2, Math.max(config.min - config.amp * 2.2, v))
|
|
103
|
-
st.value = v
|
|
104
|
-
return v
|
|
104
|
+
sample({ ctx, config, signalKind, vector }) {
|
|
105
|
+
// 多形态分支(v2 帧管线):vector=多点波形轮廓;image=程序化灰度 PNG;scalar=既有单点波形
|
|
106
|
+
if (signalKind === 'vector') return mockVectorSample(ctx, config, vector)
|
|
107
|
+
if (signalKind === 'image') return mockImageSample(ctx, config)
|
|
108
|
+
return mockScalarSample(ctx, config)
|
|
105
109
|
},
|
|
106
110
|
async test() {
|
|
107
111
|
return { ok: true, message: 'Mock 驱动无需连接,采样即模拟波形' }
|
|
108
112
|
},
|
|
109
113
|
}
|
|
110
114
|
|
|
115
|
+
/** 既有单点波形(原 sample() 主体,零行为变化) */
|
|
116
|
+
function mockScalarSample(ctx: DaqSampleCtx, config: { base: number, amp: number, min: number, max: number }): number {
|
|
117
|
+
const states = mockStates()
|
|
118
|
+
let st = states.get(ctx.nodeId)
|
|
119
|
+
if (!st) {
|
|
120
|
+
st = { phase: hashPhase(ctx.nodeId), value: null, excursionLeft: 0, excursionDir: 0, excursionDepth: 0, lastAt: ctx.now }
|
|
121
|
+
states.set(ctx.nodeId, st)
|
|
122
|
+
}
|
|
123
|
+
const dt = Math.max(0, Math.min(ctx.now - st.lastAt, 60_000))
|
|
124
|
+
st.lastAt = ctx.now
|
|
125
|
+
if (st.excursionLeft <= 0 && Math.random() < 0.008 * Math.max(1, dt / 1000)) {
|
|
126
|
+
st.excursionLeft = 6 + Math.floor(Math.random() * 9)
|
|
127
|
+
st.excursionDir = Math.random() < 0.5 ? -1 : 1
|
|
128
|
+
st.excursionDepth = (config.max - config.min) * (0.08 + Math.random() * 0.1)
|
|
129
|
+
}
|
|
130
|
+
const t = (ctx.ageMs + st.phase * 100) / 1000
|
|
131
|
+
const sine = Math.sin(t * 0.35) * config.amp * 0.55 + Math.sin(t * 0.11 + 1.3) * config.amp * 0.3
|
|
132
|
+
let v = config.base + sine
|
|
133
|
+
if (st.value != null) v += (config.base - st.value) * 0.06 + (Math.random() - 0.5) * config.amp * 0.5
|
|
134
|
+
if (st.excursionLeft > 0) {
|
|
135
|
+
st.excursionLeft -= 1
|
|
136
|
+
const ramp = Math.min(1, (10 - st.excursionLeft) / 4)
|
|
137
|
+
v += st.excursionDir * st.excursionDepth * (0.4 + 0.6 * ramp)
|
|
138
|
+
if (st.excursionLeft === 0) st.excursionDir = 0
|
|
139
|
+
}
|
|
140
|
+
v = Math.min(config.max + config.amp * 2.2, Math.max(config.min - config.amp * 2.2, v))
|
|
141
|
+
st.value = v
|
|
142
|
+
return v
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
/** 多点波形轮廓(测厚仪/扫描仪语义:横向 n 点,带漂移与偶发局部尖峰) */
|
|
146
|
+
function mockVectorSample(
|
|
147
|
+
ctx: DaqSampleCtx,
|
|
148
|
+
config: { base: number, amp: number, min: number, max: number },
|
|
149
|
+
vector?: { points: number, min: number, max: number },
|
|
150
|
+
): { frame: { kind: 'vector', points: number[], metrics: Record<string, number> } } {
|
|
151
|
+
const n = Math.max(2, Math.min(4096, vector?.points ?? 64))
|
|
152
|
+
const vMin = vector?.min ?? config.min
|
|
153
|
+
const vMax = vector?.max ?? config.max
|
|
154
|
+
const span = vMax - vMin
|
|
155
|
+
const t = (ctx.ageMs + hashPhase(ctx.nodeId) * 100) / 1000
|
|
156
|
+
const points: number[] = []
|
|
157
|
+
// 横向轮廓:慢波(工艺整体偏移)+ 位置抛物面(边缘偏厚)+ 噪声 + 偶发局部尖峰(缺陷)
|
|
158
|
+
const drift = Math.sin(t * 0.21) * config.amp
|
|
159
|
+
const spikePos = Math.floor((Math.sin(t * 0.07) * 0.5 + 0.5) * n)
|
|
160
|
+
for (let i = 0; i < n; i++) {
|
|
161
|
+
const rel = i / (n - 1)
|
|
162
|
+
const crown = -4 * (rel - 0.5) ** 2 * span * 0.03 // 边缘略薄(负抛物面)
|
|
163
|
+
let v = config.base + drift + crown + (Math.random() - 0.5) * config.amp * 0.4
|
|
164
|
+
if (Math.abs(i - spikePos) <= 1) v += span * 0.06 // 偶发局部尖峰
|
|
165
|
+
points.push(Math.round(Math.min(vMax, Math.max(vMin, v)) * 1e6) / 1e6)
|
|
166
|
+
}
|
|
167
|
+
return { frame: { kind: 'vector', points, metrics: {} } }
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
/** 程序化灰度图像(CCD 语义:纹理背景 + 移动暗斑;零外部依赖 zlib PNG) */
|
|
171
|
+
function mockImageSample(
|
|
172
|
+
ctx: DaqSampleCtx,
|
|
173
|
+
config: { base: number, amp: number, min: number, max: number },
|
|
174
|
+
): { frame: { kind: 'image', blob: Buffer, mime: string, width: number, height: number, metrics: Record<string, number> } } {
|
|
175
|
+
// 偶发"曝光异常"帧(低亮度)驱动 quality-gate 告警链路可观测
|
|
176
|
+
const dark = Math.random() < 0.03
|
|
177
|
+
const baseGray = dark ? 22 : Math.round(Math.min(230, Math.max(60, config.base)))
|
|
178
|
+
const w = 320
|
|
179
|
+
const h = 240
|
|
180
|
+
const px = new Uint8Array(w * h)
|
|
181
|
+
const t = (ctx.ageMs + hashPhase(ctx.nodeId) * 100) / 1000
|
|
182
|
+
const spotX = Math.floor(((Math.sin(t * 0.4) + 1) / 2) * (w - 60)) + 30
|
|
183
|
+
const spotY = Math.floor(((Math.cos(t * 0.3) + 1) / 2) * (h - 60)) + 30
|
|
184
|
+
for (let y = 0; y < h; y++) {
|
|
185
|
+
for (let x = 0; x < w; x++) {
|
|
186
|
+
// 编织纹理 + 随机噪声 + 移动暗斑(表面缺陷模拟)
|
|
187
|
+
let v = baseGray + Math.sin(x * 0.35) * 8 + Math.sin(y * 0.22 + 1.7) * 6 + (Math.random() - 0.5) * 10
|
|
188
|
+
const dx = x - spotX
|
|
189
|
+
const dy = y - spotY
|
|
190
|
+
const d2 = dx * dx + dy * dy
|
|
191
|
+
if (d2 < 400) v -= (1 - d2 / 400) * 90
|
|
192
|
+
px[y * w + x] = Math.max(0, Math.min(255, Math.round(v)))
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
const blob = encodePng(w, h, px)
|
|
196
|
+
return { frame: { kind: 'image', blob, mime: 'image/png', width: w, height: h, metrics: {} } }
|
|
197
|
+
}
|
|
198
|
+
|
|
111
199
|
// ============================================================
|
|
112
200
|
// Modbus TCP 真实驱动(modbus-serial;连接池按 host:port:unitId 复用)
|
|
113
201
|
// ============================================================
|
|
@@ -746,14 +834,30 @@ const REGISTRY: Record<DaqDriverKind, DaqDriver> = {
|
|
|
746
834
|
's7': new PlannedProtocolStub('s7', 'S7comm'),
|
|
747
835
|
}
|
|
748
836
|
|
|
837
|
+
/** 插件注册的驱动(经 ctx.daq.registerDriver;热重载重复注册幂等覆盖) */
|
|
838
|
+
const g_plugins = globalThis as typeof globalThis & { __daqPluginDrivers?: Map<string, DaqDriver> }
|
|
839
|
+
function pluginRegistry(): Map<string, DaqDriver> {
|
|
840
|
+
return g_plugins.__daqPluginDrivers ??= new Map()
|
|
841
|
+
}
|
|
842
|
+
|
|
843
|
+
/** 插件驱动注册(kind 与内置冲突时覆盖并告警;resolveDaqDriver 插件优先) */
|
|
844
|
+
export function registerPluginDriver(driver: DaqDriver): void {
|
|
845
|
+
if (driver.kind in REGISTRY) log.warn(`[daq-drivers] 插件驱动覆盖内置:「${driver.kind}」`)
|
|
846
|
+
pluginRegistry().set(driver.kind, driver)
|
|
847
|
+
}
|
|
848
|
+
|
|
849
|
+
export function listPluginDrivers(): string[] {
|
|
850
|
+
return [...pluginRegistry().keys()]
|
|
851
|
+
}
|
|
852
|
+
|
|
749
853
|
export function normalizeDriverKind(kind: string): DaqDriverKind {
|
|
750
854
|
if (kind === 'modbus') return 'modbus-tcp'
|
|
751
855
|
if (kind === 'rtu' || kind === 'modbus-rtu-tcp') return 'modbus-rtu'
|
|
752
|
-
return (kind in REGISTRY ? kind : 'mock') as DaqDriverKind
|
|
856
|
+
return (kind in REGISTRY || pluginRegistry().has(kind) ? kind : 'mock') as DaqDriverKind
|
|
753
857
|
}
|
|
754
858
|
|
|
755
859
|
export function resolveDaqDriver(kind: DaqDriverKind): DaqDriver {
|
|
756
|
-
return REGISTRY[kind] ?? mockDaqDriver
|
|
860
|
+
return pluginRegistry().get(kind) ?? REGISTRY[kind] ?? mockDaqDriver
|
|
757
861
|
}
|
|
758
862
|
|
|
759
863
|
/** 驱动可用性探测(meta 报告:包缺失时 UI 显示"未安装"而非硬失败) */
|