agentworkshop 0.7.40 → 0.7.44
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/.output/nitro.json +1 -1
- package/.output/public/_nuxt/B8uy9iRW.js +1 -0
- package/.output/public/_nuxt/BGTYYQH-.js +1 -0
- package/.output/public/_nuxt/BUmHEJ77.js +2 -0
- package/.output/public/_nuxt/BY7YrV_D.js +1 -0
- package/.output/public/_nuxt/Bqcgz95s.js +18 -0
- package/.output/public/_nuxt/C7UlqPeD.js +1 -0
- package/.output/public/_nuxt/CTmDn-YP.js +1 -0
- package/.output/public/_nuxt/Cs8pVeVG.js +1 -0
- package/.output/public/_nuxt/{DcsCcxp4.js → D98NH8kG.js} +1 -1
- package/.output/public/_nuxt/DKySmNPI.js +14 -0
- package/.output/public/_nuxt/Di0NY_ht.js +1 -0
- package/.output/public/_nuxt/Du9v6qGB.js +1 -0
- package/.output/public/_nuxt/{C_iYD-EB.js → EHlEMRii.js} +1 -1
- package/.output/public/_nuxt/Eke1fs-U.js +1 -0
- package/.output/public/_nuxt/{DeJykBFf.js → H0BcqZtT.js} +1 -1
- package/.output/public/_nuxt/{C4oW1HsE.js → HSYEkkce.js} +1 -1
- package/.output/public/_nuxt/{DZshyNLa.js → IREZ1eC2.js} +1 -1
- package/.output/public/_nuxt/{D_OTvQza.js → J9oU00D1.js} +1 -1
- package/.output/public/_nuxt/OmpTerminalPanel.BxR5-lvi.css +1 -0
- package/.output/public/_nuxt/SSyAPaHc.js +1 -0
- package/.output/public/_nuxt/TownView.li4EMQxK.css +1 -0
- package/.output/public/_nuxt/VdLk4jLE2.js +1 -0
- package/.output/public/_nuxt/_id_.BhsXoEuk.css +1 -0
- package/.output/public/_nuxt/_id_.DQyj-WKN.css +1 -0
- package/.output/public/_nuxt/{_wsId_.B4WiqkIS.css → _wsId_.CTx-BlfF.css} +1 -1
- package/.output/public/_nuxt/aShsv_rG.js +19 -0
- package/.output/public/_nuxt/{yF0aYMF1.js → aesgXKSr.js} +3 -3
- package/.output/public/_nuxt/agents.B21nUEUX.css +1 -0
- package/.output/public/_nuxt/aml.ekTjxFkf.css +1 -0
- package/.output/public/_nuxt/builds/latest.json +1 -1
- package/.output/public/_nuxt/builds/meta/b5506ef0-f48e-4f14-a6c0-d65e505d0b09.json +1 -0
- package/.output/public/_nuxt/ca4TJ3Op.js +1 -0
- package/.output/public/_nuxt/channel-templates.DplM1pJ3.css +1 -0
- package/.output/public/_nuxt/daq.BdVmoIfe.css +1 -0
- package/.output/public/_nuxt/dcw.DCgyzpWV.css +1 -0
- package/.output/public/_nuxt/{default.J32SgqFY.css → default.Bh3L2HU8.css} +1 -1
- package/.output/public/_nuxt/lHAxdSsj.js +1 -0
- package/.output/public/_nuxt/pages.j9rzRocr.css +1 -0
- package/.output/public/_nuxt/plugins.DhiZbHU8.css +1 -0
- package/.output/public/_nuxt/settings.BRx9rIDg.css +1 -0
- package/.output/public/_nuxt/teams.BLlOPB_Z.css +1 -0
- package/.output/public/_nuxt/tokens.De8xzszn.css +1 -0
- package/.output/public/_nuxt/workshop.D1jFNkrn.css +1 -0
- package/.output/server/chunks/_/nitro.mjs +1058 -830
- package/.output/server/chunks/_/nitro.mjs.map +1 -1
- package/.output/server/chunks/build/{OmpTerminalPanel-Cu_s4i0A.mjs → OmpTerminalPanel-CVvxpsF7.mjs} +15 -15
- package/.output/server/chunks/build/{OmpTerminalPanel-Cu_s4i0A.mjs.map → OmpTerminalPanel-CVvxpsF7.mjs.map} +1 -1
- package/.output/server/chunks/build/{TownView-BuLAsmpR.mjs → TownView-CJ6IsDCc.mjs} +229 -228
- package/.output/server/chunks/build/{TownView-BuLAsmpR.mjs.map → TownView-CJ6IsDCc.mjs.map} +1 -1
- package/.output/server/chunks/build/{_id_-BU1wfOID.mjs → _id_-CVD_H0ir.mjs} +149 -147
- package/.output/server/chunks/build/_id_-CVD_H0ir.mjs.map +1 -0
- package/.output/server/chunks/build/{_id_-BYsEua57.mjs → _id_-CtxMb3qp.mjs} +47 -46
- package/.output/server/chunks/build/_id_-CtxMb3qp.mjs.map +1 -0
- package/.output/server/chunks/build/{_wsId_-BxlDcJHg.mjs → _wsId_-DpY3T-md.mjs} +516 -446
- package/.output/server/chunks/build/{_wsId_-BxlDcJHg.mjs.map → _wsId_-DpY3T-md.mjs.map} +1 -1
- package/.output/server/chunks/build/{agents-CLQqJF2y.mjs → agents-DsCkuXDV.mjs} +49 -46
- package/.output/server/chunks/build/agents-DsCkuXDV.mjs.map +1 -0
- package/.output/server/chunks/build/{aml-_7FdFL2p.mjs → aml-CT0xKGKI.mjs} +122 -105
- package/.output/server/chunks/build/aml-CT0xKGKI.mjs.map +1 -0
- package/.output/server/chunks/build/builtin-catalog-edpDcgfL.mjs +117 -0
- package/.output/server/chunks/build/builtin-catalog-edpDcgfL.mjs.map +1 -0
- package/.output/server/chunks/build/{channel-templates-p6SZNjlM.mjs → channel-templates-Dla9FbYa.mjs} +49 -37
- package/.output/server/chunks/build/channel-templates-Dla9FbYa.mjs.map +1 -0
- package/.output/server/chunks/build/{daq-cgyjKmJu.mjs → daq-DWWSKGAV.mjs} +95 -93
- package/.output/server/chunks/build/daq-DWWSKGAV.mjs.map +1 -0
- package/.output/server/chunks/build/{dcw-CoTxBlAZ.mjs → dcw-CT8k17_E.mjs} +46 -45
- package/.output/server/chunks/build/dcw-CT8k17_E.mjs.map +1 -0
- package/.output/server/chunks/build/{default-BE4r0FZN.mjs → default-D3525UFX.mjs} +16 -15
- package/.output/server/chunks/build/{default-BE4r0FZN.mjs.map → default-D3525UFX.mjs.map} +1 -1
- package/.output/server/chunks/build/{logs-BSOeZwwI.mjs → logs--dByNyhw.mjs} +2 -2
- package/.output/server/chunks/build/{logs-BSOeZwwI.mjs.map → logs--dByNyhw.mjs.map} +1 -1
- package/.output/server/chunks/build/{monitor-C0okQaXz.mjs → monitor-Dh2Kvaq5.mjs} +2 -2
- package/.output/server/chunks/build/{monitor-C0okQaXz.mjs.map → monitor-Dh2Kvaq5.mjs.map} +1 -1
- package/.output/server/chunks/build/{pages-DFxjn9Xa.mjs → pages-BHcSBM2D.mjs} +26 -20
- package/.output/server/chunks/build/pages-BHcSBM2D.mjs.map +1 -0
- package/.output/server/chunks/build/{plugins-lGlUr1lj.mjs → plugins-BNgIi61W.mjs} +23 -17
- package/.output/server/chunks/build/plugins-BNgIi61W.mjs.map +1 -0
- package/.output/server/chunks/build/{settings-Ddd1qx2Z.mjs → settings-ipYBDWdn.mjs} +45 -44
- package/.output/server/chunks/build/settings-ipYBDWdn.mjs.map +1 -0
- package/.output/server/chunks/build/{teams-MEDLZdMn.mjs → teams-5lx-CwFa.mjs} +47 -44
- package/.output/server/chunks/build/teams-5lx-CwFa.mjs.map +1 -0
- package/.output/server/chunks/build/{tokens-C7fTM5C2.mjs → tokens-q-IDT8Io.mjs} +73 -53
- package/.output/server/chunks/build/tokens-q-IDT8Io.mjs.map +1 -0
- package/.output/server/chunks/build/{town-qMPql9Se.mjs → town-QJWB5wng.mjs} +5 -4
- package/.output/server/chunks/build/town-QJWB5wng.mjs.map +1 -0
- package/.output/server/chunks/build/{useDaqStream-CIBaiGAl.mjs → useDaqStream-DfCFpb3p.mjs} +9 -3
- package/.output/server/chunks/build/useDaqStream-DfCFpb3p.mjs.map +1 -0
- package/.output/server/chunks/build/{useDcwStream-CBbiYnWe.mjs → useDcwStream-UPiX-3iO.mjs} +11 -2
- package/.output/server/chunks/build/useDcwStream-UPiX-3iO.mjs.map +1 -0
- package/.output/server/chunks/build/{workshop-BL5bhfs0.mjs → workshop-BIlCj_ZP.mjs} +45 -45
- package/.output/server/chunks/build/workshop-BIlCj_ZP.mjs.map +1 -0
- package/.output/server/chunks/routes/api/workshop/channel-templates/_id/instantiate.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/channels.post.mjs +3 -3
- package/.output/server/chunks/routes/api/workshop/dcw/index5.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/lines/_id/start.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/lines/_id/stop.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/params/_id_.delete.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/params/_id_.patch.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/templates/_key_.delete.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/templates/_key_.patch.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/harnesses/_id/providers.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/harnesses.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/hitl/pending.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/hitl/respond.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/index.put.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/index5.get.mjs +3 -1
- package/.output/server/chunks/routes/api/workshop/index5.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/index6.get.mjs +3 -1
- package/.output/server/chunks/routes/api/workshop/index6.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/plugins/_name/disable.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/plugins/_name/enable.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/scene/layouts/_channelId_.delete.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/scene/layouts/_channelId_.put.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/workspaces/_id/channel-templates/_tplId_.post.mjs +1 -1
- package/.output/server/chunks/routes/renderer.mjs +2 -2
- package/.output/server/chunks/virtual/entry.mjs +639 -88
- package/.output/server/chunks/virtual/entry.mjs.map +1 -1
- package/.output/server/chunks/virtual/precomputed.mjs +1 -1
- package/.output/server/package.json +1 -1
- package/README-zh.md +16 -6
- package/README.md +17 -7
- package/app/components/AppHeader.vue +961 -959
- package/app/components/workshop/A2aRpcDebugger.vue +237 -237
- package/app/components/workshop/AgentInspectorDrawer.vue +424 -424
- package/app/components/workshop/AgentLanesView.vue +998 -998
- package/app/components/workshop/ArtifactCard.vue +120 -120
- package/app/components/workshop/AssetLibrary.vue +452 -452
- package/app/components/workshop/ChannelSessionList.vue +812 -804
- package/app/components/workshop/CommandPalette.vue +269 -269
- package/app/components/workshop/Composer.vue +827 -827
- package/app/components/workshop/DeviceTwinPanel.vue +643 -643
- package/app/components/workshop/EventBlock.vue +602 -602
- package/app/components/workshop/FileSelectorModal.vue +188 -188
- package/app/components/workshop/InspectorPanel.vue +301 -301
- package/app/components/workshop/MemoryPanel.vue +364 -364
- package/app/components/workshop/MultiChannelView.vue +189 -189
- package/app/components/workshop/TaskBoardView.vue +686 -686
- package/app/components/workshop/TaskInspectorDrawer.vue +390 -390
- package/app/components/workshop/TranscriptTimeline.vue +601 -601
- package/app/components/workshop/blocks/ClusterArtifact.vue +61 -61
- package/app/components/workshop/blocks/ClusterError.vue +85 -85
- package/app/components/workshop/blocks/ClusterLife.vue +87 -87
- package/app/components/workshop/blocks/ClusterMember.vue +95 -93
- package/app/components/workshop/blocks/ClusterMemory.vue +84 -84
- package/app/components/workshop/blocks/ClusterOther.vue +67 -67
- package/app/components/workshop/blocks/ClusterStatus.vue +149 -147
- package/app/components/workshop/blocks/ClusterTool.vue +158 -158
- package/app/components/workshop/terminal/OmpTerminalPanel.vue +1011 -1011
- package/app/components/workshop/town/TownView.vue +56 -56
- package/app/composables/workshop/useDaqStream.ts +7 -4
- package/app/composables/workshop/useDcwStream.ts +8 -2
- package/app/middleware/locale-cookie.global.ts +22 -0
- package/app/pages/aml/index.vue +24 -2
- package/app/pages/daq/[id].vue +20 -16
- package/app/pages/daq/index.vue +2310 -2307
- package/app/pages/dcw/[id].vue +26 -23
- package/app/pages/dcw/index.vue +3 -3
- package/app/pages/index.vue +987 -981
- package/app/pages/plugins/index.vue +317 -311
- package/app/pages/settings.vue +1564 -1562
- package/app/pages/tokens.vue +15 -15
- package/app/pages/workshop/agents.vue +612 -609
- package/app/pages/workshop/channel-templates.vue +18 -11
- package/app/pages/workshop/index.vue +668 -668
- package/app/pages/workshop/teams.vue +743 -740
- package/app/pages/workshop/w/[wsId].vue +704 -704
- package/app/plugins/locale-restore.client.ts +16 -1
- package/app/utils/builtin-catalog.ts +104 -0
- package/config.yml +170 -170
- package/docs/cli.en.md +2 -2
- package/docs/cli.md +2 -2
- package/docs/full-test-plan.md +2 -3
- package/docs/plugins.en.md +33 -1
- package/docs/plugins.md +29 -1
- package/docs/sdk.en.md +1 -1
- package/docs/sdk.md +1 -1
- package/i18n/locales/en.ts +293 -35
- package/i18n/locales/zh-CN.ts +265 -7
- package/package.json +4 -3
- package/scripts/_dbg-perms-e2e.mjs +132 -109
- package/scripts/_demo-agentteam-capture.mjs +278 -0
- package/scripts/_e2e-ui-functional.mjs +371 -0
- package/scripts/_i18n-en-cjk-scan.mjs +28 -0
- package/scripts/_i18n-en-verify.mjs +107 -0
- package/scripts/_i18n-extra-checks.mjs +53 -0
- package/scripts/_i18n-scan-hardcoded.mjs +180 -0
- package/scripts/_i18n-verify-keys.mjs +50 -0
- package/scripts/_loop-biax-campaign.mjs +130 -0
- package/scripts/_sweep-button-contrast.mjs +87 -0
- package/scripts/test-serial-bridge.mjs +418 -0
- package/scripts/ui/e2e-interactive.mjs +328 -0
- package/scripts/ui/record-demo.mjs +557 -0
- package/scripts/ui/seed-industrial-demo.mjs +171 -0
- package/server/api/workshop/daq/index.get.ts +3 -1
- package/server/api/workshop/dcw/index.get.ts +3 -0
- package/server/plugins/aw-plugins.ts +9 -7
- package/server/plugins-builtin/diag-bridge/index.mjs +608 -661
- package/server/plugins-builtin/rag-bridge/index.mjs +57 -133
- package/server/plugins-builtin/serial-bridge/client.mjs +210 -0
- package/server/plugins-builtin/serial-bridge/drivers.mjs +409 -0
- package/server/plugins-builtin/serial-bridge/i18n.json +62 -0
- package/server/plugins-builtin/serial-bridge/index.mjs +247 -0
- package/server/plugins-builtin/serial-bridge/lib.mjs +208 -0
- package/server/plugins-builtin/serial-bridge/rtu.mjs +168 -0
- package/server/services/workshop/daq/daq-controller.ts +7 -2
- package/server/services/workshop/daq/drivers.ts +89 -3
- package/server/services/workshop/dcw/dcw-controller.ts +5 -1
- package/server/services/workshop/dcw/drivers.ts +85 -2
- package/server/services/workshop/dcw/plugin-bridge.ts +45 -0
- package/server/services/workshop/plugins/host.mjs +30 -0
- package/shared/daq-protocol.ts +15 -0
- package/.output/public/_nuxt/88GOowgO2.js +0 -1
- package/.output/public/_nuxt/BOt2SP4z.js +0 -1
- package/.output/public/_nuxt/BP-NyKVG.js +0 -18
- package/.output/public/_nuxt/BXxH0UQE.js +0 -1
- package/.output/public/_nuxt/BsROmY89.js +0 -1
- package/.output/public/_nuxt/ClILjvWH.js +0 -1
- package/.output/public/_nuxt/CzOCSGLe.js +0 -1
- package/.output/public/_nuxt/D8qvkfyY.js +0 -1
- package/.output/public/_nuxt/DCn7QZ5N.js +0 -2
- package/.output/public/_nuxt/DS8qj8EL.js +0 -1
- package/.output/public/_nuxt/DUjW5Yq5.js +0 -1
- package/.output/public/_nuxt/Dihnimlk.js +0 -19
- package/.output/public/_nuxt/Dqw1lpr-.js +0 -1
- package/.output/public/_nuxt/Dr9v6C0f.js +0 -14
- package/.output/public/_nuxt/Du9ZJtnj.js +0 -1
- package/.output/public/_nuxt/OmpTerminalPanel.B_Pl5Ynm.css +0 -1
- package/.output/public/_nuxt/TownView.f-YOdXRs.css +0 -1
- package/.output/public/_nuxt/_id_.CM4bIgKY.css +0 -1
- package/.output/public/_nuxt/_id_.bNV69Dtf.css +0 -1
- package/.output/public/_nuxt/agents.ZD0rVdHE.css +0 -1
- package/.output/public/_nuxt/aml.BN8ZEW4h.css +0 -1
- package/.output/public/_nuxt/builds/meta/f4707884-7cf4-4a31-80d2-e3d72b73745f.json +0 -1
- package/.output/public/_nuxt/channel-templates.BOtahzPi.css +0 -1
- package/.output/public/_nuxt/daq.B0D3dPAc.css +0 -1
- package/.output/public/_nuxt/dcw.8Y7FqCVN.css +0 -1
- package/.output/public/_nuxt/pages.D7aSDlUI.css +0 -1
- package/.output/public/_nuxt/plugins.sb4nDGqr.css +0 -1
- package/.output/public/_nuxt/qr6R6Ha1.js +0 -1
- package/.output/public/_nuxt/settings.BTgR-NiE.css +0 -1
- package/.output/public/_nuxt/teams.CxnxKVVs.css +0 -1
- package/.output/public/_nuxt/tokens.BFY7qv4f.css +0 -1
- package/.output/public/_nuxt/workshop.CR_QzeAN.css +0 -1
- package/.output/server/chunks/build/_id_-BU1wfOID.mjs.map +0 -1
- package/.output/server/chunks/build/_id_-BYsEua57.mjs.map +0 -1
- package/.output/server/chunks/build/agents-CLQqJF2y.mjs.map +0 -1
- package/.output/server/chunks/build/aml-_7FdFL2p.mjs.map +0 -1
- package/.output/server/chunks/build/channel-templates-p6SZNjlM.mjs.map +0 -1
- package/.output/server/chunks/build/daq-cgyjKmJu.mjs.map +0 -1
- package/.output/server/chunks/build/dcw-CoTxBlAZ.mjs.map +0 -1
- package/.output/server/chunks/build/pages-DFxjn9Xa.mjs.map +0 -1
- package/.output/server/chunks/build/plugins-lGlUr1lj.mjs.map +0 -1
- package/.output/server/chunks/build/settings-Ddd1qx2Z.mjs.map +0 -1
- package/.output/server/chunks/build/teams-MEDLZdMn.mjs.map +0 -1
- package/.output/server/chunks/build/tokens-C7fTM5C2.mjs.map +0 -1
- package/.output/server/chunks/build/town-qMPql9Se.mjs.map +0 -1
- package/.output/server/chunks/build/useDaqStream-CIBaiGAl.mjs.map +0 -1
- package/.output/server/chunks/build/useDcwStream-CBbiYnWe.mjs.map +0 -1
- package/.output/server/chunks/build/workshop-BL5bhfs0.mjs.map +0 -1
- package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.continue.json +0 -1
- package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.json +0 -1
- package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/054bb4bc4e4217a2ab0b0c6b663747214a9af464f5568ea60e784704e340bb0f.source +0 -153
- package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/0554197c3d2bac203a1f5c48a5d52495d1336db1bd7aa4f4c19875810363e684.source +0 -153
- package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/05c203d12a954fffba942e1d626e3f5fec05b18a5aef2bac003b7884a4b77406.source +0 -431
- package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/145a6e6ba811af35aed31e0cc3211f53706a14980fa069ee9e3c1591139f96f0.source +0 -180
- package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/1ae0fb281f97899c025e368ca73f41349b01fb5f85b19e08d7ebccff49095ed5.source +0 -112
- package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/20ee9967aa0541c516db7575bdd4a1a745939bc7016bd10d7635903113edb8ec.source +0 -227
- package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/233751843aeba9d4c5263f275b8102de00443c06f286918cbd23e0b6729e01aa.source +0 -131
- package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/263c2e05b425e5c322e60c6475279f963bab3a873eb521b21df7fec935a46597.source +0 -160
- package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/2ac5eaac28eaaee2178c4b32014df8e732f9dd432a285a872f5b7f31c1395fa4.source +0 -157
- package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/33a0db0d2d95d2c11d0720090458e5fba1425376f5ceb5b422d1d3471be3226b.source +0 -348
- package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/359e474ae83db35e4615d3728de6bf694b64d4dce9b536730a3b6518f9c0494a.source +0 -296
- package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/37a4c3c31c4b70f6b719c53d1e9c4fcba603f31adfdd11bb6ef9f0d094923c56.source +0 -285
- package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/461feca1c14a695eb8b0f17a6f95fe97eeceabc0510faaea4ba6d25bde147d8d.source +0 -217
- package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/4cfadbda8591f29d5e1e230dc000e701b756e850441b3900fb596a4d2f6e98c2.source +0 -301
- package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/50ca2810cf0b248c96948994c0c404531bbad6e553166b6816b3b03bfa0f75d2.source +0 -151
- package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/52d9e8cb591a9ae86e238c3620a610cd386717bee222c0f37b25b2ac7e523dc4.source +0 -135
- package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/6c87daafa4c006560a954636a97333f6123153c9d34d96203f7ee3a14e556357.source +0 -156
- package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/77bc47854b577900621cacf1697f81fa2bc005af129d37614a97a3441c08f99f.source +0 -72
- package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/7bbb789d3a527817118cf8399ed1861d6a962ade10878fd07223435d333a7089.source +0 -469
- package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/86b7c1daafc8b60ba9982dde5bf1bcc74265709483c176e71f23ec6fc267451f.source +0 -259
- package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/8df66d62bd41984d0970e8236882080c5085ac937d07a29779463d6a03b37c76.source +0 -97
- package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/9962f2d1b3a85137bd40cc835725600b39f89ee02a27c06b2e0402e1eafde115.source +0 -277
- package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/a1090ea066b792cb201739f4994e37bf7c12f52e805239a1eab87f18a537f266.source +0 -171
- package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/a5241091650134d0919897e086a606a3846c8b2b54f8b4c84a8696c145ac3e9e.source +0 -425
- package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/af19fa4c6e34d5540028be4b17600161283af3a2a2dfc61a3fdc0834436a0c14.source +0 -99
- package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/b3713d78e2b2f93905ff6be8d58a8d0a2f42dea322eb67c987fda22ff6a084d5.source +0 -325
- package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/b3849943c3aff102d1af815631fc843a2a52c17646a4b04696ece323e483bbec.source +0 -332
- package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/bac735a3803a6650b7f1eb8f587e6dc5c68ea055000c3c99a11789438b78e837.source +0 -43
- package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/d32c24d61eb8b33c73e5a8fc7e4dc7ef437aed238ee4371c2b00617e6104090a.source +0 -154
- package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/d5170dc9a9879fda04fdf91d8a110d4efb6787ee38dda596d4da899883d36a72.source +0 -531
- package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/dc59bcd7bb397be63ba2f2c3fec23f3782dcb17d2d75a9981eeced761f33eb32.source +0 -439
- package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/eb5ff8cf66b92aec7bf6726781d8df74faa2b030c3aaac17d6b00c1fc04c9b32.source +0 -323
- package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/f10615a6fae18436e70d1201b2d44fdae3174a3aa7bb4db97dea1b3ed291d721.source +0 -433
- package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/f36d3e271668bc1260c2823542d22dbf1d0f7041ff16b1ac175bce2256e582ca.source +0 -280
- package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/f94449380af09f31ac352152007146a75cc80bae8d6411ffe57b2c56f933b0ff.source +0 -117
- package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/fe4dfd81178fd6b648335f6405d9ede71319aebde796008e50db21f8adf44c99.source +0 -160
- package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/ffb4e3aa548cfdadabaa44ab599f9b6a3ca6288176a2cc7a4b2fc2a12b5fb848.source +0 -101
- package/scripts/.mimosa/hook-status/sess_aeaecb58-8833-4b83-b93c-050467d21e03-d944d71bb3.json +0 -14
- package/scripts/_dbg-audit-all-pages.mjs +0 -43
- package/scripts/_dbg-daq-frames-e2e.mjs +0 -118
- package/scripts/_dbg-daq-rowstyle-verify.mjs +0 -112
- package/scripts/_dbg-hitl-timeout-e2e.mjs +0 -93
- package/scripts/_dbg-live-line-e2e.mjs +0 -279
- package/scripts/_dbg-minimal-omp.mjs +0 -77
- package/scripts/_dbg-mode-nav.mjs +0 -173
- package/scripts/_dbg-real-scenario-timeline.log +0 -55
- package/scripts/_dbg-team-repro.mjs +0 -76
- package/scripts/_dbg-town-agents-probe.mjs +0 -60
- package/scripts/_dbg-visual-acceptance.mjs +0 -63
- package/scripts/_townview_style.css +0 -1185
- package/scripts/_townview_template.html +0 -1215
- package/server/data/agent-node-bindings.json +0 -554
- package/server/data/daq-templates.json +0 -16
- package/server/data/daqs.json +0 -7464
- package/server/data/dcw-lines.json +0 -1787
- package/server/data/dcw-products.json +0 -1626
- package/server/data/dcw-recipes.json +0 -4672
- package/server/data/dcw-rollback.json +0 -20754
- package/server/data/dcw-runs.json +0 -6354
- package/server/data/dcw-templates.json +0 -146
- package/server/data/dcw-writes.json +0 -15650
- package/server/data/dcws.json +0 -9033
- package/server/data/device-twins.json +0 -133
- package/server/data/line-runs.json +0 -322
- package/server/data/scene-layouts.json +0 -277
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
import { createLogger } from '../logger'
|
|
18
18
|
import { createRequire } from 'node:module'
|
|
19
19
|
import { encodePng } from './png-enc'
|
|
20
|
-
import type
|
|
20
|
+
import { DAQ_DRIVERS, type DaqDriverKind, type DriverTestResult } from '../../../../shared/daq-protocol'
|
|
21
21
|
|
|
22
22
|
const log = createLogger('daq.drivers')
|
|
23
23
|
|
|
@@ -331,6 +331,17 @@ export async function getModbusConn(cfg: Record<string, unknown>, transport: Mod
|
|
|
331
331
|
// 会以 unhandledRejection 打崩进程(stability-guard fatal)。池层已有 evict 自愈,这里只需静默。
|
|
332
332
|
const sock = (client as unknown as { port?: { client?: { on?: (ev: string, cb: (e: Error) => void) => void } } }).port?.client
|
|
333
333
|
sock?.on?.('error', () => {})
|
|
334
|
+
// write-after-end 防线:evict/close 与在飞事务竞态时,modbus-serial 仍可能对已 end/destroy 的
|
|
335
|
+
// socket 调 write —— 该错误的 emit 路径并不总走 'error' 事件(实测同步抛出打崩进程,
|
|
336
|
+
// ERR_STREAM_WRITE_AFTER_END)。在 socket 层直接拦截:已终结即丢弃写入,让上层超时兜底。
|
|
337
|
+
const sockWritable = sock as unknown as { writableEnded?: boolean, destroyed?: boolean, write?: (...a: unknown[]) => unknown } | null
|
|
338
|
+
if (sockWritable?.write) {
|
|
339
|
+
const rawWrite = sockWritable.write.bind(sock)
|
|
340
|
+
sockWritable.write = (...a: unknown[]) => {
|
|
341
|
+
if (sockWritable.writableEnded || sockWritable.destroyed) return false
|
|
342
|
+
return rawWrite(...a)
|
|
343
|
+
}
|
|
344
|
+
}
|
|
334
345
|
const conn: ModbusConn = { client, lastUsed: Date.now(), tail: Promise.resolve(), pending: 0, errors: 0 }
|
|
335
346
|
modbusPool.set(key, conn)
|
|
336
347
|
return conn
|
|
@@ -1075,16 +1086,64 @@ function pluginRegistry(): Map<string, DaqDriver> {
|
|
|
1075
1086
|
return g_plugins.__daqPluginDrivers ??= new Map()
|
|
1076
1087
|
}
|
|
1077
1088
|
|
|
1089
|
+
/**
|
|
1090
|
+
* 插件驱动的自描述目录(前端「添加节点」下拉与动态参数表单的数据源)。
|
|
1091
|
+
* 插件驱动在 DaqDriver 上携带可选 meta(label/status/configFields,与 DaqDriverMeta 同形、
|
|
1092
|
+
* kind 放宽为 string);未带 meta 的插件驱动只在 meta.pluginDrivers 里以 kind 出现,
|
|
1093
|
+
* 前端能感知存在但不出表单(如实降级,不猜测参数 schema)。
|
|
1094
|
+
*/
|
|
1095
|
+
export interface PluginDriverMeta {
|
|
1096
|
+
kind: string
|
|
1097
|
+
label: string
|
|
1098
|
+
status: 'builtin' | 'real' | 'planned'
|
|
1099
|
+
configFields?: import('../../../../shared/daq-protocol').DriverConfigField[]
|
|
1100
|
+
/** true = 来自插件协议插件(前端展示「插件」徽标) */
|
|
1101
|
+
plugin: true
|
|
1102
|
+
}
|
|
1103
|
+
|
|
1104
|
+
const g_metas = globalThis as typeof globalThis & { __daqPluginDriverMetas?: Map<string, PluginDriverMeta> }
|
|
1105
|
+
function pluginMetaRegistry(): Map<string, PluginDriverMeta> {
|
|
1106
|
+
return g_metas.__daqPluginDriverMetas ??= new Map()
|
|
1107
|
+
}
|
|
1108
|
+
|
|
1078
1109
|
/** 插件驱动注册(kind 与内置冲突时覆盖并告警;resolveDaqDriver 插件优先) */
|
|
1079
1110
|
export function registerPluginDriver(driver: DaqDriver): void {
|
|
1080
1111
|
if (driver.kind in REGISTRY) log.warn(`[daq-drivers] 插件驱动覆盖内置:「${driver.kind}」`)
|
|
1081
1112
|
pluginRegistry().set(driver.kind, driver)
|
|
1113
|
+
const meta = (driver as DaqDriver & { meta?: Omit<PluginDriverMeta, 'kind' | 'plugin'> }).meta
|
|
1114
|
+
if (meta && typeof meta.label === 'string') {
|
|
1115
|
+
pluginMetaRegistry().set(driver.kind, {
|
|
1116
|
+
kind: driver.kind,
|
|
1117
|
+
label: meta.label,
|
|
1118
|
+
status: meta.status === 'builtin' || meta.status === 'planned' ? meta.status : 'real',
|
|
1119
|
+
configFields: Array.isArray(meta.configFields) ? meta.configFields : [],
|
|
1120
|
+
plugin: true,
|
|
1121
|
+
})
|
|
1122
|
+
}
|
|
1123
|
+
else {
|
|
1124
|
+
// 同名驱动重注册(热重载)可能这次不带 meta:旧 meta 一并清除,保持两边一致
|
|
1125
|
+
pluginMetaRegistry().delete(driver.kind)
|
|
1126
|
+
}
|
|
1082
1127
|
}
|
|
1083
1128
|
|
|
1084
1129
|
export function listPluginDrivers(): string[] {
|
|
1085
1130
|
return [...pluginRegistry().keys()]
|
|
1086
1131
|
}
|
|
1087
1132
|
|
|
1133
|
+
/**
|
|
1134
|
+
* 清空插件驱动与自描述目录(插件宿主热重载前调用):停用/卸载的插件驱动随之失效,
|
|
1135
|
+
* 只有本轮重新装载成功的插件驱动会再注册进来 —— 否则被停用的驱动会一直生效到进程重启。
|
|
1136
|
+
*/
|
|
1137
|
+
export function clearPluginDrivers(): void {
|
|
1138
|
+
pluginRegistry().clear()
|
|
1139
|
+
pluginMetaRegistry().clear()
|
|
1140
|
+
}
|
|
1141
|
+
|
|
1142
|
+
/** 插件驱动自描述目录(驱动目录合并端点用;热重载随重注册刷新) */
|
|
1143
|
+
export function listPluginDriverMetas(): PluginDriverMeta[] {
|
|
1144
|
+
return [...pluginMetaRegistry().values()]
|
|
1145
|
+
}
|
|
1146
|
+
|
|
1088
1147
|
export function normalizeDriverKind(kind: string): DaqDriverKind {
|
|
1089
1148
|
if (kind === 'modbus') return 'modbus-tcp'
|
|
1090
1149
|
if (kind === 'rtu' || kind === 'modbus-rtu-tcp') return 'modbus-rtu'
|
|
@@ -1095,10 +1154,11 @@ export function resolveDaqDriver(kind: DaqDriverKind): DaqDriver {
|
|
|
1095
1154
|
return pluginRegistry().get(kind) ?? REGISTRY[kind] ?? mockDaqDriver
|
|
1096
1155
|
}
|
|
1097
1156
|
|
|
1098
|
-
/** 驱动可用性探测(meta 报告:包缺失时 UI 显示"未安装"
|
|
1157
|
+
/** 驱动可用性探测(meta 报告:包缺失时 UI 显示"未安装"而非硬失败;含插件驱动) */
|
|
1099
1158
|
export async function probeDriverAvailability(): Promise<Record<string, boolean>> {
|
|
1100
1159
|
const out: Record<string, boolean> = {}
|
|
1101
|
-
|
|
1160
|
+
const all: Array<[string, DaqDriver]> = [...Object.entries(REGISTRY), ...pluginRegistry()]
|
|
1161
|
+
for (const [kind, drv] of all) {
|
|
1102
1162
|
try {
|
|
1103
1163
|
out[kind] = await drv.available()
|
|
1104
1164
|
}
|
|
@@ -1108,3 +1168,29 @@ export async function probeDriverAvailability(): Promise<Record<string, boolean>
|
|
|
1108
1168
|
}
|
|
1109
1169
|
return out
|
|
1110
1170
|
}
|
|
1171
|
+
|
|
1172
|
+
/**
|
|
1173
|
+
* 驱动目录合并(内置 DAQ_DRIVERS + 插件自描述;同名插件条目覆盖内置并标记 plugin)。
|
|
1174
|
+
* index.get.ts 以 `drivers` 下发,前端据此渲染「添加节点」下拉与动态参数表单。
|
|
1175
|
+
*/
|
|
1176
|
+
export async function driverCatalog(): Promise<Array<{
|
|
1177
|
+
kind: string
|
|
1178
|
+
label: string
|
|
1179
|
+
status: 'builtin' | 'real' | 'planned'
|
|
1180
|
+
configFields: import('../../../../shared/daq-protocol').DriverConfigField[]
|
|
1181
|
+
plugin?: boolean
|
|
1182
|
+
}>> {
|
|
1183
|
+
const out: Array<{ kind: string, label: string, status: 'builtin' | 'real' | 'planned', configFields: import('../../../../shared/daq-protocol').DriverConfigField[], plugin?: boolean }> = DAQ_DRIVERS.map(d => ({
|
|
1184
|
+
kind: d.kind,
|
|
1185
|
+
label: d.label,
|
|
1186
|
+
status: d.status,
|
|
1187
|
+
configFields: d.configFields,
|
|
1188
|
+
}))
|
|
1189
|
+
for (const m of listPluginDriverMetas()) {
|
|
1190
|
+
const i = out.findIndex(d => d.kind === m.kind)
|
|
1191
|
+
const entry = { kind: m.kind, label: m.label, status: m.status, configFields: m.configFields ?? [], plugin: true }
|
|
1192
|
+
if (i >= 0) out[i] = entry
|
|
1193
|
+
else out.push(entry)
|
|
1194
|
+
}
|
|
1195
|
+
return out
|
|
1196
|
+
}
|
|
@@ -11,9 +11,10 @@
|
|
|
11
11
|
|
|
12
12
|
import { randomUUID } from 'node:crypto'
|
|
13
13
|
import { applyTransform, inverseTransform, normalizeDataTransform, dcwKeyFromRef } from '../../../../shared/dcw-protocol'
|
|
14
|
-
import type { AepDcwNodeChange, DcwDriverKind, DcwNodeView, DcwParamView, DataTransform, LineInput, LineQueryOpts, LineQueryResult, LineRunState, LineView, ProductInput, ProductView, RecipeInput, RecipeRunView, RecipeView, DcwWriteMeta } from '../../../../shared/dcw-protocol'
|
|
14
|
+
import type { AepDcwNodeChange, DcwDriverKind, DcwNodeView, DcwParamInput, DcwParamView, DataTransform, LineInput, LineQueryOpts, LineQueryResult, LineRunState, LineView, ProductInput, ProductView, RecipeInput, RecipeRunView, RecipeView, DcwWriteMeta } from '../../../../shared/dcw-protocol'
|
|
15
15
|
import { AppError, ErrorCodes } from '../../../utils/errors'
|
|
16
16
|
import { normalizeDcwDriverKind, resolveDcwDriver } from './drivers'
|
|
17
|
+
import { attachDcwPluginBridge } from './plugin-bridge'
|
|
17
18
|
import { findDcwTemplate } from './dcw-templates'
|
|
18
19
|
import { getDeviceTwinRepo } from '../assets/device-twin.repo'
|
|
19
20
|
import { DcwNode } from './dcw-node'
|
|
@@ -34,6 +35,9 @@ import { daqRuntimeSettings } from '../settings'
|
|
|
34
35
|
/** 运维日志写下发防噪:同节点同值 10s 内的心跳重下发不重复入册 */
|
|
35
36
|
const opsWriteMemo = new Map<string, { eng: number, at: number }>()
|
|
36
37
|
|
|
38
|
+
// 写驱动插件桥(模块装载即挂;插件宿主先到则注册项排队、此处接管回放)
|
|
39
|
+
attachDcwPluginBridge()
|
|
40
|
+
|
|
37
41
|
/** 周期读网关默认间隔(节点 readIntervalMs=null 时生效;真实 PLC 建议按链路承载调整) */
|
|
38
42
|
const DEFAULT_READ_INTERVAL_MS = 5000
|
|
39
43
|
|
|
@@ -9,6 +9,7 @@
|
|
|
9
9
|
*/
|
|
10
10
|
import { createRequire } from 'node:module'
|
|
11
11
|
import type { DcwDriverKind } from '../../../../shared/dcw-protocol'
|
|
12
|
+
import { DCW_DRIVERS } from '../../../../shared/dcw-protocol'
|
|
12
13
|
import { AppError } from '../../../utils/errors'
|
|
13
14
|
import { classifyCommError, closeModbusSafely, decodeRegisters, evictModbusConn, evictOpcUaConn, getModbusConn, getOpcUaConn, modbusKey, registerOffset, withModbusConn } from '../daq/drivers'
|
|
14
15
|
|
|
@@ -637,12 +638,94 @@ const REGISTRY: Record<DcwDriverKind, DcwWriteDriver> = {
|
|
|
637
638
|
'http': httpDcwDriver,
|
|
638
639
|
}
|
|
639
640
|
|
|
641
|
+
/**
|
|
642
|
+
* 插件写驱动注册表(经 ctx.dcw.registerWriteDriver;与数采侧 registerPluginDriver 对称)。
|
|
643
|
+
* globalThis 防 HMR 双实例;resolveDcwDriver 插件优先,热重载同名幂等覆盖。
|
|
644
|
+
* 驱动可携带可选 meta(label/configFields)进写控驱动目录(dcwDriverCatalog)。
|
|
645
|
+
*/
|
|
646
|
+
export interface PluginWriteDriverMeta {
|
|
647
|
+
kind: string
|
|
648
|
+
label: string
|
|
649
|
+
status: 'builtin' | 'real' | 'planned'
|
|
650
|
+
configFields?: import('../../../../shared/daq-protocol').DriverConfigField[]
|
|
651
|
+
plugin: true
|
|
652
|
+
}
|
|
653
|
+
|
|
654
|
+
const g_plugins = globalThis as typeof globalThis & { __dcwPluginDrivers?: Map<string, DcwWriteDriver> }
|
|
655
|
+
function pluginRegistry(): Map<string, DcwWriteDriver> {
|
|
656
|
+
return g_plugins.__dcwPluginDrivers ??= new Map()
|
|
657
|
+
}
|
|
658
|
+
|
|
659
|
+
const g_metas = globalThis as typeof globalThis & { __dcwPluginDriverMetas?: Map<string, PluginWriteDriverMeta> }
|
|
660
|
+
function pluginMetaRegistry(): Map<string, PluginWriteDriverMeta> {
|
|
661
|
+
return g_metas.__dcwPluginDriverMetas ??= new Map()
|
|
662
|
+
}
|
|
663
|
+
|
|
664
|
+
export function registerPluginWriteDriver(driver: DcwWriteDriver): void {
|
|
665
|
+
if (driver.kind in REGISTRY) console.warn(`[dcw-drivers] 插件写驱动覆盖内置:「${driver.kind}」`)
|
|
666
|
+
pluginRegistry().set(driver.kind, driver)
|
|
667
|
+
const meta = (driver as DcwWriteDriver & { meta?: Omit<PluginWriteDriverMeta, 'kind' | 'plugin'> }).meta
|
|
668
|
+
if (meta && typeof meta.label === 'string') {
|
|
669
|
+
pluginMetaRegistry().set(driver.kind, {
|
|
670
|
+
kind: driver.kind,
|
|
671
|
+
label: meta.label,
|
|
672
|
+
status: meta.status === 'builtin' || meta.status === 'planned' ? meta.status : 'real',
|
|
673
|
+
configFields: Array.isArray(meta.configFields) ? meta.configFields : [],
|
|
674
|
+
plugin: true,
|
|
675
|
+
})
|
|
676
|
+
}
|
|
677
|
+
else {
|
|
678
|
+
pluginMetaRegistry().delete(driver.kind)
|
|
679
|
+
}
|
|
680
|
+
}
|
|
681
|
+
|
|
682
|
+
export function listPluginWriteDrivers(): string[] {
|
|
683
|
+
return [...pluginRegistry().keys()]
|
|
684
|
+
}
|
|
685
|
+
|
|
686
|
+
/** 插件写驱动自描述目录(写控驱动目录合并端点用) */
|
|
687
|
+
export function listPluginWriteDriverMetas(): PluginWriteDriverMeta[] {
|
|
688
|
+
return [...pluginMetaRegistry().values()]
|
|
689
|
+
}
|
|
690
|
+
|
|
691
|
+
/** 清空插件写驱动与其自描述目录(插件宿主热重载前调用;与数采侧 clearPluginDrivers 对称) */
|
|
692
|
+
export function clearPluginWriteDrivers(): void {
|
|
693
|
+
pluginRegistry().clear()
|
|
694
|
+
pluginMetaRegistry().clear()
|
|
695
|
+
}
|
|
696
|
+
|
|
697
|
+
/**
|
|
698
|
+
* 写控驱动目录(内置 DCW_DRIVERS + 插件自描述合并;同名插件条目覆盖内置)。
|
|
699
|
+
* dcw index.get 以 `drivers` 下发,前端写控节点向导据此渲染。
|
|
700
|
+
*/
|
|
701
|
+
export async function dcwDriverCatalog(): Promise<Array<{
|
|
702
|
+
kind: string
|
|
703
|
+
label: string
|
|
704
|
+
status: 'builtin' | 'real' | 'planned'
|
|
705
|
+
configFields: import('../../../../shared/daq-protocol').DriverConfigField[]
|
|
706
|
+
plugin?: boolean
|
|
707
|
+
}>> {
|
|
708
|
+
const out: Array<{ kind: string, label: string, status: 'builtin' | 'real' | 'planned', configFields: import('../../../../shared/daq-protocol').DriverConfigField[], plugin?: boolean }> = DCW_DRIVERS.map(d => ({
|
|
709
|
+
kind: d.kind,
|
|
710
|
+
label: d.label,
|
|
711
|
+
status: d.status,
|
|
712
|
+
configFields: d.configFields,
|
|
713
|
+
}))
|
|
714
|
+
for (const m of listPluginWriteDriverMetas()) {
|
|
715
|
+
const i = out.findIndex(d => d.kind === m.kind)
|
|
716
|
+
const entry = { kind: m.kind, label: m.label, status: m.status, configFields: m.configFields ?? [], plugin: true }
|
|
717
|
+
if (i >= 0) out[i] = entry
|
|
718
|
+
else out.push(entry)
|
|
719
|
+
}
|
|
720
|
+
return out
|
|
721
|
+
}
|
|
722
|
+
|
|
640
723
|
export function normalizeDcwDriverKind(kind: string): DcwDriverKind {
|
|
641
724
|
if (kind === 'modbus') return 'modbus-tcp'
|
|
642
725
|
if (kind === 'rtu' || kind === 'modbus-rtu-tcp') return 'modbus-rtu'
|
|
643
|
-
return (kind in REGISTRY ? kind : 'mock') as DcwDriverKind
|
|
726
|
+
return ((kind in REGISTRY || pluginRegistry().has(kind) ? kind : 'mock')) as DcwDriverKind
|
|
644
727
|
}
|
|
645
728
|
|
|
646
729
|
export function resolveDcwDriver(kind: DcwDriverKind): DcwWriteDriver {
|
|
647
|
-
return REGISTRY[kind] ?? mockDcwDriver
|
|
730
|
+
return pluginRegistry().get(kind) ?? REGISTRY[kind] ?? mockDcwDriver
|
|
648
731
|
}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import type { DcwWriteDriver } from './drivers'
|
|
2
|
+
import { registerPluginWriteDriver } from './drivers'
|
|
3
|
+
|
|
4
|
+
interface DcwPluginBridge {
|
|
5
|
+
pendingDrivers: unknown[]
|
|
6
|
+
/** 回放槽(drain 接管后设置;注册即时回调) */
|
|
7
|
+
_drain?: () => void
|
|
8
|
+
registerWriteDriver(d: unknown): void
|
|
9
|
+
drain(onDriver: (d: unknown) => void): void
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
/** 自建桥(仅队列 + drain 槽;宿主后到时由其接管) */
|
|
13
|
+
function makeDcwBridge(): DcwPluginBridge {
|
|
14
|
+
return {
|
|
15
|
+
pendingDrivers: [],
|
|
16
|
+
registerWriteDriver(d) {
|
|
17
|
+
this.pendingDrivers.push(d)
|
|
18
|
+
this._drain?.()
|
|
19
|
+
},
|
|
20
|
+
drain(onDriver) {
|
|
21
|
+
this._drain = () => {
|
|
22
|
+
for (const d of this.pendingDrivers.splice(0)) onDriver(d)
|
|
23
|
+
}
|
|
24
|
+
this._drain()
|
|
25
|
+
},
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
let attached = false
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* DCW 写驱动插件桥 —— 与数采侧 attachDaqPluginBridge 同构:
|
|
33
|
+
* 插件宿主与 dcw 模块装载顺序无关(谁后到谁接管,先到的注册项排队回放)。
|
|
34
|
+
* 在 dcw-controller 模块装载时调用一次。
|
|
35
|
+
*/
|
|
36
|
+
export function attachDcwPluginBridge(): void {
|
|
37
|
+
if (attached) return
|
|
38
|
+
attached = true
|
|
39
|
+
const g = globalThis as { __dcwPluginExt?: DcwPluginBridge }
|
|
40
|
+
const bridge: DcwPluginBridge = g.__dcwPluginExt ?? makeDcwBridge()
|
|
41
|
+
g.__dcwPluginExt = bridge
|
|
42
|
+
bridge.drain(
|
|
43
|
+
d => registerPluginWriteDriver(d as DcwWriteDriver),
|
|
44
|
+
)
|
|
45
|
+
}
|
|
@@ -534,6 +534,24 @@ async function loadAllPlugins(host, { config, paths }) {
|
|
|
534
534
|
return m.getDaqNodeRepo().snapshot()
|
|
535
535
|
},
|
|
536
536
|
}
|
|
537
|
+
// DCW 写驱动扩展面:与 daq.registerDriver 对称(排队桥 globalThis.__dcwPluginExt,
|
|
538
|
+
// dcw-controller 侧 plugin-bridge 接管回放)。写驱动契约见 server/services/workshop/dcw/drivers.ts。
|
|
539
|
+
const dcwExt = (globalThis.__dcwPluginExt ??= {
|
|
540
|
+
pendingDrivers: [],
|
|
541
|
+
registerWriteDriver(d) {
|
|
542
|
+
this.pendingDrivers.push(d)
|
|
543
|
+
this._drain?.()
|
|
544
|
+
},
|
|
545
|
+
drain(onDriver) {
|
|
546
|
+
this._drain = () => {
|
|
547
|
+
for (const d of this.pendingDrivers.splice(0)) onDriver(d)
|
|
548
|
+
}
|
|
549
|
+
this._drain()
|
|
550
|
+
},
|
|
551
|
+
})
|
|
552
|
+
ctx.dcw = {
|
|
553
|
+
registerWriteDriver: d => dcwExt.registerWriteDriver(d),
|
|
554
|
+
}
|
|
537
555
|
// OMP 工具扩展面:插件注册自定义 host 工具 → omp 会话运行时热注入
|
|
538
556
|
const ompExt = (globalThis.__ompPluginToolsBridge ??= {
|
|
539
557
|
pending: [],
|
|
@@ -697,6 +715,18 @@ async function doReload(host) {
|
|
|
697
715
|
}
|
|
698
716
|
}
|
|
699
717
|
const prevNames = [...host.plugins.keys()]
|
|
718
|
+
// 插件注册的协议驱动(数采读 + 写控)先清空:停用/卸载的插件驱动立即失效,
|
|
719
|
+
// 本轮装载成功的插件经 ctx.daq/ctx.dcw 重新注册(同名幂等)。
|
|
720
|
+
try {
|
|
721
|
+
const daqDrivers = await import('@/server/services/workshop/daq/drivers')
|
|
722
|
+
daqDrivers.clearPluginDrivers()
|
|
723
|
+
}
|
|
724
|
+
catch { /* daq 未装载(桥排队中):注册表为空,无需清 */ }
|
|
725
|
+
try {
|
|
726
|
+
const dcwDrivers = await import('@/server/services/workshop/dcw/drivers')
|
|
727
|
+
dcwDrivers.clearPluginWriteDrivers()
|
|
728
|
+
}
|
|
729
|
+
catch { /* dcw 未装载:同上 */ }
|
|
700
730
|
// 工具注销延后:先装载新集、后清「本轮未再装载」的旧插件工具。
|
|
701
731
|
// 原先在装载前就全部注销 → 重载窗口内(秒级~数十秒)所有插件工具"未知工具",
|
|
702
732
|
// 期间到达的 Agent 工具调用(daq:sample 自动诊断/kb_store 等)被误拒
|
package/shared/daq-protocol.ts
CHANGED
|
@@ -351,6 +351,21 @@ export const DAQ_DRIVERS: DaqDriverMeta[] = [
|
|
|
351
351
|
export const daqDriverMeta = (kind: DaqDriverKind): DaqDriverMeta | undefined =>
|
|
352
352
|
DAQ_DRIVERS.find(d => d.kind === kind)
|
|
353
353
|
|
|
354
|
+
/**
|
|
355
|
+
* 驱动目录条目(GET /api/workshop/daq `drivers` 字段):内置 DAQ_DRIVERS 与
|
|
356
|
+
* 协议插件自描述(ctx.daq.registerDriver 携带的 meta)合并后的统一形态。
|
|
357
|
+
* kind 放宽为 string —— 插件可注册任意自定义协议 kind。
|
|
358
|
+
*/
|
|
359
|
+
export interface DaqDriverCatalogEntry {
|
|
360
|
+
kind: string
|
|
361
|
+
label: string
|
|
362
|
+
status: 'builtin' | 'real' | 'planned'
|
|
363
|
+
/** 连接参数表单 schema(前端动态渲染;插件驱动经 meta.configFields 自描述) */
|
|
364
|
+
configFields: DriverConfigField[]
|
|
365
|
+
/** true = 来自协议插件(前端展示「插件」徽标;热重载/停用随宿主收敛) */
|
|
366
|
+
plugin?: boolean
|
|
367
|
+
}
|
|
368
|
+
|
|
354
369
|
/** 连接测试结果(REST/前端向导共用) */
|
|
355
370
|
export interface DriverTestResult {
|
|
356
371
|
ok: boolean
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{a as e,c as t,j as n}from"./BU83-NnX.js";import{$ as r,D as i,G as a,H as o,Ht as s,P as c,R as l,S as u,Ut as d,V as f,Vt as p,W as m,b as h,d as g,et as _,f as v,h as y,ht as b,i as x,m as S,nt as C,p as w,pt as T,tt as E,v as D,xt as O,y as k}from"./CSkxz2NX.js";import{d as ee,f as A,n as j,t as M,u as N}from"./D6uzXueg.js";import{d as P,p as te}from"./BJHKLJJU.js";import{i as F}from"./YnQxK3eG.js";import{n as ne,r as I,t as re}from"./xh3_vYcu.js";import{n as ie}from"./KZQX7xoM.js";import{t as ae}from"./D9Oidm5I.js";import{At as L,St as oe,d as R,jt as se,n as z,nt as ce,t as B,u as le,wt as ue}from"./4sIEbgcl.js";import{i as de}from"./DYr1VMiQ.js";import{t as fe}from"./aWWIh8YL.js";import{a as pe,i as me,n as he,r as ge,t as _e}from"./CzlMDL5H.js";import{t as V}from"./lO5tpDZ5.js";import{n as H}from"./JCoYF4IJ.js";import{t as U}from"./Crod5z2f.js";import{t as ve}from"./C4DWUZ6d2.js";import{t as ye}from"./JTLM-kqr2.js";import{t as be}from"./DIaZ2PTo2.js";import{t as W}from"./BDNMzG2s2.js";import{t as xe}from"./DGIuvyRN2.js";import{t as G}from"./CssgYAAL2.js";import{t as Se}from"./D0ZBQrN_2.js";import{m as Ce,p as we,t as Te}from"./BC9wjTJK2.js";import{t as Ee}from"./BN6iuJEg2.js";var De=e=>{let{componentCls:t,colorBgContainer:n,colorBgBody:r,colorText:i}=e;return{[`${t}-sider-light`]:{background:n,[`${t}-sider-trigger`]:{color:i,background:n},[`${t}-sider-zero-width-trigger`]:{color:i,background:n,border:`1px solid ${r}`,borderInlineStart:0}}}},Oe=e=>{let{antCls:t,componentCls:n,colorText:r,colorTextLightSolid:i,colorBgHeader:a,colorBgBody:o,colorBgTrigger:s,layoutHeaderHeight:c,layoutHeaderPaddingInline:l,layoutHeaderColor:u,layoutFooterPadding:d,layoutTriggerHeight:f,layoutZeroTriggerSize:p,motionDurationMid:m,motionDurationSlow:h,fontSize:g,borderRadius:_}=e;return{[n]:L(L({display:`flex`,flex:`auto`,flexDirection:`column`,color:r,minHeight:0,background:o,"&, *":{boxSizing:`border-box`},[`&${n}-has-sider`]:{flexDirection:`row`,[`> ${n}, > ${n}-content`]:{width:0}},[`${n}-header, &${n}-footer`]:{flex:`0 0 auto`},[`${n}-header`]:{height:c,paddingInline:l,color:u,lineHeight:`${c}px`,background:a,[`${t}-menu`]:{lineHeight:`inherit`}},[`${n}-footer`]:{padding:d,color:r,fontSize:g,background:o},[`${n}-content`]:{flex:`auto`,minHeight:0},[`${n}-sider`]:{position:`relative`,minWidth:0,background:a,transition:`all ${m}, background 0s`,"&-children":{height:`100%`,marginTop:-.1,paddingTop:.1,[`${t}-menu${t}-menu-inline-collapsed`]:{width:`auto`}},"&-has-trigger":{paddingBottom:f},"&-right":{order:1},"&-trigger":{position:`fixed`,bottom:0,zIndex:1,height:f,color:i,lineHeight:`${f}px`,textAlign:`center`,background:s,cursor:`pointer`,transition:`all ${m}`},"&-zero-width":{"> *":{overflow:`hidden`},"&-trigger":{position:`absolute`,top:c,insetInlineEnd:-p,zIndex:1,width:p,height:p,color:i,fontSize:e.fontSizeXL,display:`flex`,alignItems:`center`,justifyContent:`center`,background:a,borderStartStartRadius:0,borderStartEndRadius:_,borderEndEndRadius:_,borderEndStartRadius:0,cursor:`pointer`,transition:`background ${h} ease`,"&::after":{position:`absolute`,inset:0,background:`transparent`,transition:`all ${h}`,content:`""`},"&:hover::after":{background:`rgba(255, 255, 255, 0.2)`},"&-right":{insetInlineStart:-p,borderStartStartRadius:_,borderStartEndRadius:0,borderEndEndRadius:0,borderEndStartRadius:_}}}}},De(e)),{"&-rtl":{direction:`rtl`}})}},ke=R(`Layout`,e=>{let{colorText:t,controlHeightSM:n,controlHeight:r,controlHeightLG:i,marginXXS:a}=e,o=i*1.25;return[Oe(le(e,{layoutHeaderHeight:r*2,layoutHeaderPaddingInline:o,layoutHeaderColor:t,layoutFooterPadding:`${n}px ${o}px`,layoutTriggerHeight:i+a*2,layoutZeroTriggerSize:i}))]},e=>{let{colorBgLayout:t}=e;return{colorBgHeader:`#001529`,colorBgBody:t,colorBgTrigger:`#002140`}}),K=()=>({prefixCls:String,hasSider:{type:Boolean,default:void 0},tagName:String});function q(e){let{suffixCls:t,tagName:n,name:r}=e;return e=>u({compatConfig:{MODE:3},name:r,props:K(),setup(r,i){let{slots:a}=i,{prefixCls:o}=z(t,r);return()=>{let t=L(L({},r),{prefixCls:o.value,tagName:n});return h(e,t,a)}}})}var J=u({compatConfig:{MODE:3},props:K(),setup(e,t){let{slots:n}=t;return()=>h(e.tagName,{class:e.prefixCls},n)}}),Ae=u({compatConfig:{MODE:3},inheritAttrs:!1,props:K(),setup(e,t){let{slots:n,attrs:r}=t,{prefixCls:i,direction:a}=z(``,e),[s,c]=ke(i),l=T([]);o(pe,{addSider:e=>{l.value=[...l.value,e]},removeSider:e=>{l.value=l.value.filter(t=>t!==e)}});let u=g(()=>{let{prefixCls:t,hasSider:n}=e;return{[c.value]:!0,[`${t}`]:!0,[`${t}-has-sider`]:typeof n==`boolean`?n:l.value.length>0,[`${t}-rtl`]:a.value===`rtl`}});return()=>{let{tagName:t}=e;return s(h(t,L(L({},r),{class:[u.value,r.class]}),n))}}}),Y=q({suffixCls:`layout`,tagName:`section`,name:`ALayout`})(Ae),X=q({suffixCls:`layout-header`,tagName:`header`,name:`ALayoutHeader`})(J),Z=q({suffixCls:`layout-footer`,tagName:`footer`,name:`ALayoutFooter`})(J),Q=q({suffixCls:`layout-content`,tagName:`main`,name:`ALayoutContent`})(J),je={icon:{tag:`svg`,attrs:{viewBox:`0 0 1024 1024`,focusable:`false`},children:[{tag:`path`,attrs:{d:`M912 192H328c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h584c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm0 284H328c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h584c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm0 284H328c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h584c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zM104 228a56 56 0 10112 0 56 56 0 10-112 0zm0 284a56 56 0 10112 0 56 56 0 10-112 0zm0 284a56 56 0 10112 0 56 56 0 10-112 0z`}}]},name:`bars`,theme:`outlined`};function Me(e){for(var t=1;t<arguments.length;t++){var n=arguments[t]==null?{}:Object(arguments[t]),r=Object.keys(n);typeof Object.getOwnPropertySymbols==`function`&&(r=r.concat(Object.getOwnPropertySymbols(n).filter(function(e){return Object.getOwnPropertyDescriptor(n,e).enumerable}))),r.forEach(function(t){Ne(e,t,n[t])})}return e}function Ne(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}var Pe=function(e,t){var r=Me({},e,t.attrs);return h(n,Me({},r,{icon:je}),null)};Pe.displayName=`BarsOutlined`,Pe.inheritAttrs=!1;var Fe={xs:`479.98px`,sm:`575.98px`,md:`767.98px`,lg:`991.98px`,xl:`1199.98px`,xxl:`1599.98px`,xxxl:`1999.98px`},Ie=()=>({prefixCls:String,collapsible:{type:Boolean,default:void 0},collapsed:{type:Boolean,default:void 0},defaultCollapsed:{type:Boolean,default:void 0},reverseArrow:{type:Boolean,default:void 0},zeroWidthTriggerStyle:{type:Object,default:void 0},trigger:B.any,width:B.oneOfType([B.number,B.string]),collapsedWidth:B.oneOfType([B.number,B.string]),breakpoint:B.oneOf(ce(`xs`,`sm`,`md`,`lg`,`xl`,`xxl`,`xxxl`)),theme:B.oneOf(ce(`light`,`dark`)).def(`dark`),onBreakpoint:Function,onCollapse:Function}),Le=(()=>{let e=0;return function(){let t=arguments.length>0&&arguments[0]!==void 0?arguments[0]:``;return e+=1,`${t}${e}`}})(),$=u({compatConfig:{MODE:3},name:`ALayoutSider`,inheritAttrs:!1,props:oe(Ie(),{collapsible:!1,defaultCollapsed:!1,reverseArrow:!1,width:200,collapsedWidth:80}),emits:[`breakpoint`,`update:collapsed`,`collapse`],setup(e,t){let{emit:n,attrs:a,slots:s}=t,{prefixCls:u}=z(`layout-sider`,e),d=i(pe,void 0),f=b(!!(e.collapsed===void 0?e.defaultCollapsed:e.collapsed)),p=b(!1);r(()=>e.collapsed,()=>{f.value=!!e.collapsed}),o(me,f);let m=(t,r)=>{e.collapsed===void 0&&(f.value=t),n(`update:collapsed`,t),n(`collapse`,t,r)},g=b(e=>{p.value=e.matches,n(`breakpoint`,e.matches),f.value!==e.matches&&m(e.matches,`responsive`)}),_;function v(e){return g.value(e)}let y=Le(`ant-sider-`);d&&d.addSider(y),l(()=>{r(()=>e.breakpoint,()=>{try{_?.removeEventListener(`change`,v)}catch{_?.removeListener(v)}if(typeof window<`u`){let{matchMedia:t}=window;if(t&&e.breakpoint&&e.breakpoint in Fe){_=t(`(max-width: ${Fe[e.breakpoint]})`);try{_.addEventListener(`change`,v)}catch{_.addListener(v)}v(_)}}},{immediate:!0})}),c(()=>{try{_?.removeEventListener(`change`,v)}catch{_?.removeListener(v)}d&&d.removeSider(y)});let x=()=>{m(!f.value,`clickTrigger`)};return()=>{let t=u.value,{collapsedWidth:n,width:r,reverseArrow:i,zeroWidthTriggerStyle:o,trigger:c=s.trigger?.call(s),collapsible:l,theme:d}=e,m=f.value?n:r,g=V(m)?`${m}px`:String(m),_=parseFloat(String(n||0))===0?h(`span`,{onClick:x,class:ue(`${t}-zero-width-trigger`,`${t}-zero-width-trigger-${i?`right`:`left`}`),style:o},[c||h(Pe,null,null)]):null,v={expanded:h(i?H:U,null,null),collapsed:h(i?U:H,null,null)}[f.value?`collapsed`:`expanded`],y=c===null?null:_||h(`div`,{class:`${t}-trigger`,onClick:x,style:{width:g}},[c||v]),b=[a.style,{flex:`0 0 ${g}`,maxWidth:g,minWidth:g,width:g}],S=ue(t,`${t}-${d}`,{[`${t}-collapsed`]:!!f.value,[`${t}-has-trigger`]:l&&c!==null&&!_,[`${t}-below`]:!!p.value,[`${t}-zero-width`]:parseFloat(g)===0},a.class);return h(`aside`,se(se({},a),{},{class:S,style:b}),[h(`div`,{class:`${t}-children`},[s.default?.call(s)]),l||p.value&&_?y:null])}}}),Re=X,ze=Z,Be=$,Ve=Q,He=L(Y,{Header:X,Footer:Z,Content:Q,Sider:$,install:e=>(e.component(Y.name,Y),e.component(X.name,X),e.component(Z.name,Z),e.component($.name,$),e.component(Q.name,Q),e)}),Ue=[`width`,`height`],We=Object.assign(u({__name:`AwLogo`,props:{size:{default:32}},setup(e){return(t,n)=>(f(),y(`svg`,{width:e.size,height:e.size,viewBox:`0 0 64 64`,fill:`none`,"aria-hidden":`true`},[...n[0]||=[D(`<defs><linearGradient id="aw-logo-gradient" x1="0" y1="0" x2="1" y2="1"><stop offset="0" stop-color="#35e0a0"></stop><stop offset="1" stop-color="#41c8f4"></stop></linearGradient></defs><path d="M32 4 L56 18 V46 L32 60 L8 46 V18 Z" stroke="url(#aw-logo-gradient)" stroke-width="4" stroke-linejoin="round"></path><path d="M32 15 L46.7 23.5 V40.5 L32 49 L17.3 40.5 V23.5 Z" stroke="#41c8f4" stroke-opacity="0.45" stroke-width="1.8" stroke-dasharray="4 3"></path><path d="M32 23 L25 38 M32 23 L39 38 M25 38 L39 38" stroke="#35e0a0" stroke-width="1.8" stroke-opacity="0.75"></path><circle cx="32" cy="23" r="3.4" fill="#35e0a0"></circle><circle cx="25" cy="38" r="3.4" fill="#41c8f4"></circle><circle cx="39" cy="38" r="3.4" fill="#41c8f4"></circle>`,7)]],8,Ue))}}),{__name:`AwLogo`}),Ge={class:`logo`},Ke={class:`logo-mark`,"aria-hidden":`true`},qe={class:`logo-text`},Je={class:`logo-title`},Ye={class:`app-menu`},Xe={class:`menu-group-label`},Ze={class:`menu-group-text`},Qe={class:`menu-group-sep`,"aria-hidden":`true`},$e=[`title`,`onClick`],et={class:`sider-footer`},tt={class:`footer-line`},nt=Object.assign(W(u({__name:`AppSidebar`,setup(e){let t=be(),{t:n}=ie(),i=te(),a=re(),o=ne(),s=T(!1),u=g(()=>[{id:`console`,label:n(`menu.groups.console`),items:[{key:`/`,icon:`i-tabler-layout-dashboard`,label:n(`menu.dashboard`),motion:`im-pop`},{key:`/workshop`,icon:`i-tabler-box`,label:n(`menu.workshop`),motion:`im-pop`},{key:`/town`,icon:`i-tabler-map-2`,label:n(`menu.town`),motion:`im-pop`},{key:`/daq`,icon:`i-tabler-activity`,label:n(`menu.daq`),motion:`im-pop`},{key:`/dcw`,icon:`i-tabler-settings-automation`,label:n(`menu.dcw`),motion:`im-pop`},{key:`/aml`,icon:`i-tabler-flask`,label:n(`menu.aml`),motion:`im-pop`}]},{id:`ops`,label:n(`menu.groups.ops`),items:[{key:`/monitor`,icon:`i-tabler-cpu`,label:n(`menu.monitor`),motion:`im-pulse`},{key:`/logs`,icon:`i-tabler-list-details`,label:n(`menu.logs`),motion:`im-pop`}]},{id:`system`,label:n(`menu.groups.system`),items:[{key:`/tokens`,icon:`i-tabler-key`,label:n(`menu.tokens`),motion:`im-nudge-up`},{key:`/users`,icon:`i-tabler-users-group`,label:n(`menu.users`),motion:`im-pop`},{key:`/permissions`,icon:`i-tabler-shield-lock`,label:n(`menu.permissions`),motion:`im-pop`,adminOnly:!0},{key:`/plugins`,icon:`i-tabler-puzzle`,label:n(`menu.plugins`),motion:`im-pop`},{key:`/settings`,icon:`i-tabler-settings`,label:n(`menu.settings`),motion:`im-rotate`}]}].map(e=>({...e,items:e.items.filter(e=>!e.adminOnly||s.value&&t.isAdmin)})).filter(e=>e.items.length>0)),b=e=>e===`/`?i.path===`/`:i.path.startsWith(e),w=e=>{D.value&&o.closeMobileNav(),b(e)||P(e)},{isDrawer:D,isTablet:k}=xe();l(()=>{s.value=!0});let ee=g(()=>s.value?D.value?`drawer`:k.value?`rail`:`full`:void 0),A=g(()=>D.value?!1:k.value?!0:o.sidebarCollapsed),j=g(()=>!A.value),F=g(()=>D.value&&o.mobileNavOpen);r(()=>i.path,()=>{o.mobileNavOpen&&o.closeMobileNav()}),_(()=>{typeof document>`u`||(document.body.classList.toggle(`nav-drawer`,D.value),document.body.classList.toggle(`nav-drawer-open`,F.value))}),c(()=>{typeof document>`u`||document.body.classList.remove(`nav-drawer`,`nav-drawer-open`)}),r(F,e=>{typeof document>`u`||(document.body.style.overflow=e?`hidden`:``)});let I=e=>{e.key===`Escape`&&F.value&&o.closeMobileNav()};return l(()=>window.addEventListener(`keydown`,I)),c(()=>{window.removeEventListener(`keydown`,I),typeof document<`u`&&(document.body.style.overflow=``)}),(e,t)=>{let n=We,r=Be;return f(),y(x,null,[h(r,{collapsed:O(A),trigger:null,collapsible:``,width:228,"collapsed-width":64,class:`app-sider`,"data-nav-mode":O(ee),"aria-hidden":O(D)&&!O(F)?`true`:void 0},{default:E(()=>[v(`div`,Ge,[v(`div`,Ke,[h(n,{size:30})]),h(M,{name:`slide-fade`},{default:E(()=>[C(v(`div`,qe,[v(`span`,Je,d(O(a).name),1),t[1]||=v(`span`,{class:`logo-sub`},`digital twin`,-1)],512),[[N,O(j)]])]),_:1})]),v(`nav`,Ye,[(f(!0),y(x,null,m(O(u),e=>(f(),y(`div`,{key:e.id,class:`menu-group`},[C(v(`div`,Xe,[v(`span`,Ze,d(e.label),1),t[2]||=v(`span`,{class:`menu-group-rule`,"aria-hidden":`true`},null,-1)],512),[[N,O(j)]]),C(v(`div`,Qe,null,512),[[N,!O(j)]]),(f(!0),y(x,null,m(e.items,e=>(f(),y(`button`,{key:e.key,type:`button`,class:p([`menu-item im`,{active:b(e.key)}]),title:O(j)?void 0:e.label,onClick:t=>w(e.key)},[v(`span`,{class:p([`menu-icon`,[e.icon,e.motion]])},null,2),C(v(`span`,{class:`menu-label`},d(e.label),513),[[N,O(j)]])],10,$e))),128))]))),128))]),C(v(`div`,et,[t[4]||=v(`div`,{class:`footer-rule`},null,-1),v(`div`,tt,[v(`span`,null,`v`+d(O(a).version),1),t[3]||=v(`span`,{class:`sep`},`/`,-1),v(`span`,null,d(O(a).mode),1)])],512),[[N,O(j)]])]),_:1},8,[`collapsed`,`data-nav-mode`,`aria-hidden`]),O(F)?(f(),y(`div`,{key:0,class:`nav-scrim`,"aria-hidden":`true`,onClick:t[0]||=e=>O(o).closeMobileNav()})):S(``,!0)],64)}}}),[[`__scopeId`,`data-v-a91ac3dd`]]),{__name:`AppSidebar`}),rt=F(`app.routeTrail`,()=>{let e=T([]);function t(t){if(!t||t.startsWith(`/api`))return;let n=e.value.filter(e=>e.path!==t);e.value=[...n,{path:t,at:Date.now()}].slice(-8)}function n(t){let n=e.value.findIndex(e=>e.path===t);return n>=0&&(e.value=e.value.filter(e=>e.path!==t)),n}function r(){e.value=[]}return{waypoints:e,visit:t,remove:n,clear:r}},{persist:{pick:[`waypoints`],storage:I.localStorage()}});function it(){let{t:e}=ie(),t=G(),n={"/":{key:`menu.dashboard`,icon:`i-tabler-layout-dashboard`},"/workshop":{key:`menu.workshop`,icon:`i-tabler-box`},"/workshop/agents":{key:`meta.agents`,icon:`i-tabler-users`},"/workshop/teams":{key:`meta.teams`,icon:`i-tabler-users-group`},"/workshop/channel-templates":{key:`meta.ctpl`,icon:`i-tabler-layout-grid-add`},"/town":{key:`menu.town`,icon:`i-tabler-map-2`},"/tokens":{key:`menu.tokens`,icon:`i-tabler-key`},"/daq":{key:`menu.daq`,icon:`i-tabler-activity`},"/dcw":{key:`menu.dcw`,icon:`i-tabler-settings-automation`},"/aml":{key:`menu.aml`,icon:`i-tabler-flask`},"/logs":{key:`menu.logs`,icon:`i-tabler-list-details`},"/permissions":{key:`menu.permissions`,icon:`i-tabler-shield-lock`},"/plugins":{key:`menu.plugins`,icon:`i-tabler-puzzle`},"/users":{key:`menu.users`,icon:`i-tabler-users-group`},"/monitor":{key:`menu.monitor`,icon:`i-tabler-cpu`},"/settings":{key:`menu.settings`,icon:`i-tabler-settings`}};return{metaFor:r=>{let i=n[r];if(i)return{title:e(i.key),icon:i.icon};let a=r.match(/^\/workshop\/w\/([^/]+)$/);if(a){let n=a[1];return{title:t.workspaces.find(e=>e.id===n)?.name??`${e(`header.workspace`)} ${n.slice(0,6)}`,icon:`i-tabler-console`}}let o=r.split(`/`).filter(Boolean).pop()??`·`;return{title:o.charAt(0).toUpperCase()+o.slice(1),icon:`i-tabler-point`}}}}var at={class:`header-left`},ot=[`aria-label`,`aria-expanded`],st={class:`mobile-title`},ct=[`aria-label`],lt=[`title`,`onClick`,`onKeydown`],ut={class:`node-title`},dt=[`aria-label`,`title`,`onClick`],ft={class:`header-right`},pt=[`title`],mt={class:`hitl-count`},ht={class:`hitl-menu`},gt={class:`hitl-menu-title`},_t=[`onClick`],vt={class:`hitl-item-top`},yt={class:`hitl-item-agent`},bt={class:`hitl-item-kind`},xt={class:`hitl-item-title`},St=[`title`],Ct={class:`user-chip`},wt={class:`user-initial aw-avatar`},Tt={class:`user-meta`},Et={class:`user-name`},Dt={class:`user-role`},Ot=Object.assign(W(u({__name:`AppHeader`,setup(n){let{t:i,locale:a,locales:o,setLocale:s}=ie(),u=ne(),_=te(),b=rt(),C=be(),{metaFor:D}=it(),M=we(),N=Te(),F=()=>{C.isLoggedIn&&N.ensureConnected()};r(()=>C.token,e=>{e?(F(),M.loadSnapshot()):M.clear()},{immediate:!0});let I=new Set([`codex-approval`,`opencode-permission`,`dsh-permission`]),re=e=>{switch(e){case`omp-dialog`:return i(`appHeader.hitlKindOmp`);case`dcw-approval`:return i(`appHeader.hitlKindDcw`);case`codex-approval`:return i(`appHeader.hitlKindCodex`);case`opencode-permission`:return i(`appHeader.hitlKindOpencode`);case`dsh-permission`:return i(`appHeader.hitlKindDsh`);default:return e}},L=e=>{P({path:`/monitor`,query:{agentId:e.agentId,channelId:e.channelId}})},oe=Ee(),R=T(null),se=async(t,n)=>{R.value=`${t.kind}:${t.id}`;try{await oe.respondHitl({kind:t.kind,id:t.id,confirmed:n,cancelled:!n}),await M.loadSnapshot()}catch(t){e.error(Se(t))}finally{R.value=null}},z=g(()=>o.value.map(e=>({label:le.value?e.code.split(`-`)[0].toUpperCase():e.name,value:e.code}))),ce=e=>{e!=null&&(localStorage.setItem(`aw.locale`,String(e)),s(String(e)),window.location.reload())},{isDrawer:B,isMobile:le}=xe(),ue=g(()=>B.value?u.mobileNavOpen?i(`header.closeNav`):i(`header.openNav`):u.sidebarCollapsed?i(`header.expand`):i(`header.collapse`)),pe=()=>{B.value?u.toggleMobileNav():u.toggleSidebar()},me=g(()=>D(_.path).title),V=T(!1),H=T(!1),U=null;r(()=>_.path,()=>{b.visit(_.path),H.value=!1,requestAnimationFrame(()=>{H.value=!0,U&&clearTimeout(U),U=setTimeout(()=>{H.value=!1},620)})},{immediate:!1}),l(()=>{V.value=!0,b.visit(_.path)}),c(()=>{U&&clearTimeout(U)});let ye=e=>{e!==_.path&&P(e)},W=e=>{let t=b.remove(e);if(e!==_.path)return;let n=b.waypoints,r=n[Math.min(Math.max(t-1,0),Math.max(n.length-1,0))]?.path??`/`;P(r)},G=T(!1);function De(){document.fullscreenElement?(document.exitFullscreen(),G.value=!1):(document.documentElement.requestFullscreen(),G.value=!0)}let Oe=g(()=>(C.user?.name??`?`).trim().charAt(0).toUpperCase()),ke=g(()=>C.user?.name??i(`header.guest`)),K=g(()=>C.isLoggedIn?C.user?.role??`user`:`anonymous`),q=Ce(),J=g(()=>q.state!==`closed`||q.lastDataAt>0),Ae=g(()=>q.state===`open`?q.pendingReplay?`syncing`:`live`:q.state===`connecting`?`syncing`:`down`),Y=g(()=>q.state===`open`?q.pendingReplay?i(`appHeader.kwsdot0002`):i(`appHeader.kwsdot0001`):q.state===`connecting`?i(`appHeader.kwsdot0003`):i(`appHeader.kwsdot0004`)),X=g(()=>{let e=[{key:`tokens`,icon:`i-tabler-key`,label:i(`menu.tokens`)},{key:`settings`,icon:`i-tabler-adjustments`,label:i(`menu.settings`)}];return C.isLoggedIn&&(e.push({key:`d-logout`,label:``,divider:!0}),e.push({key:`logout`,icon:`i-tabler-logout`,label:i(`header.logout`),danger:!0})),e}),Z=async({key:e})=>{e===`settings`?P(`/settings`):e===`tokens`?P(`/tokens`):e===`logout`&&(await C.logout(),P(`/workshop`))};return(e,n)=>{let r=t,o=ve,s=ae,c=de,l=fe,g=he,C=ge,T=_e,N=Re;return f(),w(N,{class:`app-header app-header-glass`},{default:E(()=>[v(`div`,at,[v(`button`,{class:`collapse-btn`,"aria-label":O(ue),"aria-expanded":O(B)?O(u).mobileNavOpen:!O(u).sidebarCollapsed,onClick:n[0]||=e=>pe()},[...n[3]||=[v(`span`,{class:`i-tabler-menu-2`},null,-1)]],8,ot),v(`span`,st,d(O(me)),1),n[5]||=v(`span`,{class:`rail-mark i-tabler-route`},null,-1),v(`nav`,{class:`trail`,"aria-label":O(i)(`header.trail`)},[h(j,{name:`stamp`,tag:`div`,class:`trail-row`},{default:E(()=>[O(V)?(f(!0),y(x,{key:0},m(O(b).waypoints,(t,r)=>(f(),y(x,{key:t.path},[r>0?(f(),y(`span`,{key:`link-${t.path}`,class:`trail-link`,"aria-hidden":`true`})):S(``,!0),v(`div`,{class:p([`trail-node`,{active:t.path===O(_).path}]),role:`button`,tabindex:`0`,title:O(D)(t.path).title,onClick:e=>ye(t.path),onKeydown:ee(A(e=>ye(t.path),[`prevent`]),[`enter`])},[v(`span`,{class:p([`node-icon`,O(D)(t.path).icon])},null,2),v(`span`,ut,d(O(D)(t.path).title),1),v(`button`,{class:`node-close`,"aria-label":e.$t(`appHeader.kzwjv99001`,{p0:O(D)(t.path).title}),title:e.$t(`appHeader.kzwjv99001`,{p0:O(D)(t.path).title}),onClick:A(e=>W(t.path),[`stop`])},[...n[4]||=[v(`span`,{class:`i-tabler-x`},null,-1)]],8,dt)],42,lt)],64))),128)):S(``,!0)]),_:1})],8,ct)]),v(`div`,ft,[h(s,null,{default:E(()=>[O(M).count>0?(f(),w(o,{key:0,placement:`bottomRight`},{overlay:E(()=>[v(`div`,ht,[v(`div`,gt,d(O(i)(`appHeader.hitlBadge`))+` · `+d(O(M).count),1),(f(!0),y(x,null,m(O(M).items,e=>(f(),y(`button`,{key:`${e.kind}:${e.id}`,class:`hitl-item`,onClick:t=>L(e)},[v(`span`,vt,[v(`span`,yt,d(e.agentName),1),v(`span`,bt,d(re(e.kind)),1)]),v(`span`,xt,d(e.title),1),O(I).has(e.kind)?(f(),y(`span`,{key:0,class:`hitl-item-actions`,onClick:n[1]||=A(()=>{},[`stop`])},[h(r,{size:`small`,type:`primary`,loading:O(R)===`${e.kind}:${e.id}`,onClick:t=>se(e,!0)},{default:E(()=>[k(d(O(i)(`appHeader.hitlApprove`)),1)]),_:1},8,[`loading`,`onClick`]),h(r,{size:`small`,danger:``,disabled:O(R)===`${e.kind}:${e.id}`,onClick:t=>se(e,!1)},{default:E(()=>[k(d(O(i)(`appHeader.hitlReject`)),1)]),_:1},8,[`disabled`,`onClick`])])):S(``,!0)],8,_t))),128))])]),default:E(()=>[v(`button`,{class:`icon-btn hitl-bell`,title:O(i)(`appHeader.hitlBadge`)},[n[6]||=v(`span`,{class:`i-tabler-bell-ringing`},null,-1),v(`span`,mt,d(O(M).count),1)],8,pt)]),_:1})):S(``,!0)]),_:1}),O(V)&&O(J)?(f(),y(`span`,{key:0,class:p([`ws-dot`,O(Ae)]),title:O(Y)},null,10,St)):S(``,!0),h(c,{title:O(i)(`header.fullscreen`)},{default:E(()=>[v(`button`,{class:`icon-btn hdr-fullscreen`,onClick:De},[v(`span`,{class:p([`i-tabler-arrows-maximize`,{hidden:O(G)}])},null,2),v(`span`,{class:p([`i-tabler-arrows-minimize`,{hidden:!O(G)}])},null,2)])]),_:1},8,[`title`]),h(l,{id:`hdr-locale`,value:O(a),size:`middle`,options:O(z),class:`lang-select`,onChange:ce},null,8,[`value`,`options`]),h(c,{title:O(u).isDark?O(i)(`common.light`):O(i)(`common.dark`)},{default:E(()=>[v(`button`,{class:`icon-btn`,onClick:n[2]||=e=>O(u).toggleDark()},[v(`span`,{class:p([`i-tabler-sun-high`,{hidden:O(u).isDark}])},null,2),v(`span`,{class:p([`i-tabler-moon-stars`,{hidden:!O(u).isDark}])},null,2)])]),_:1},8,[`title`]),h(o,null,{overlay:E(()=>[h(T,{onClick:Z},{default:E(()=>[(f(!0),y(x,null,m(O(X),e=>(f(),y(x,{key:e.key},[e.divider?(f(),w(g,{key:0})):(f(),w(C,{key:e.key,danger:e.danger},{default:E(()=>[v(`span`,{class:p([e.icon,`mr-2`])},null,2),k(` `+d(e.label),1)]),_:2},1032,[`danger`]))],64))),128))]),_:1})]),default:E(()=>[v(`div`,Ct,[h(s,null,{fallback:E(()=>[...n[7]||=[v(`span`,{class:`user-initial aw-avatar`},`·`,-1),v(`span`,{class:`user-meta`},[v(`span`,{class:`user-name`},`·`),v(`span`,{class:`user-role`},`·`)],-1)]]),default:E(()=>[v(`span`,wt,d(O(Oe)),1),v(`span`,Tt,[v(`span`,Et,d(O(ke)),1),v(`span`,Dt,d(O(K)),1)])]),_:1})])]),_:1})]),v(`span`,{class:p([`plotter-line`,{run:O(H)}]),"aria-hidden":`true`},null,2)]),_:1})}}}),[[`__scopeId`,`data-v-a6ff3f55`]]),{__name:`AppHeader`}),kt={class:`footer-title aw-serif-accent`},At={class:`footer-corner`},jt=W(u({__name:`default`,setup(e){let{token:t}=ye.useToken(),n=re();return(e,r)=>{let i=nt,o=Ot,c=Ve,l=ze,u=He;return f(),w(u,{class:`app-layout`,"has-sider":``},{default:E(()=>[h(i),h(u,{class:`app-main`,style:s({background:`transparent`,"--app-bg-container":O(t)?.colorBgContainer,"--app-bg-layout":O(t)?.colorBgLayout,"--app-text":O(t)?.colorText,"--app-text-secondary":O(t)?.colorTextSecondary,"--app-border":O(t)?.colorBorderSecondary,"--app-fill":O(t)?.colorFillQuaternary,"--app-header-h":`56px`,"--app-footer-h":`46px`})},{default:E(()=>[h(o),h(c,{class:`app-content`},{default:E(()=>[a(e.$slots,`default`,{},void 0,!0)]),_:3}),h(l,{class:`app-footer`,style:s({color:O(t)?.colorTextSecondary})},{default:E(()=>[v(`span`,kt,d(O(n).title),1),r[4]||=v(`span`,{class:`sep`},`/`,-1),v(`span`,null,`mode=`+d(O(n).mode),1),v(`span`,At,[v(`span`,null,`v`+d(O(n).version),1),r[0]||=v(`span`,{class:`sep`},`·`,-1),r[1]||=v(`a`,{class:`footer-link`,href:`https://github.com/kingdol666/AgentWorkShop`,target:`_blank`,rel:`noopener`},`GitHub`,-1),r[2]||=v(`span`,{class:`sep`},`·`,-1),r[3]||=v(`a`,{class:`footer-link`,href:`https://kingdol666.github.io/AgentWorkShop/`,target:`_blank`,rel:`noopener`},`Docs`,-1)])]),_:1},8,[`style`])]),_:3},8,[`style`]),r[5]||=v(`span`,{class:`aw-noise`,"aria-hidden":`true`},null,-1)]),_:3})}}}),[[`__scopeId`,`data-v-e4abc244`]]);export{jt as default};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{a as e}from"./BU83-NnX.js";import{$ as t,Ht as n,P as r,R as i,S as a,Ut as o,V as s,Vt as c,W as l,b as u,d,dt as f,f as p,h as m,i as h,m as g,nt as _,p as v,pt as y,tt as b,xt as x,y as S}from"./CSkxz2NX.js";import{c as C,f as ee,l as w,s as te}from"./D6uzXueg.js";import{n as ne}from"./DtYHUi5Z.js";import{t as re}from"./BHA40aHa.js";import{n as ie}from"./KZQX7xoM.js";import{t as ae}from"./DZtm4l-P2.js";import{t as T}from"./BDNMzG2s2.js";import{t as E}from"./D0ZBQrN_2.js";import{t as oe}from"./BC9wjTJK2.js";import{t as se}from"./CNs_Ozdc2.js";import{t as ce}from"./DTFCy6h-.js";import{a as le,i as ue,n as de,r as fe,t as pe}from"./DcsCcxp4.js";import{t as me}from"./D8qvkfyY.js";import{t as he}from"./C3J6FYKa.js";import{t as D}from"./CFxtLwjp.js";var O={class:`mono dim`},k={class:`mono ch`},ge=[`title`],_e=[`title`],ve={class:`trend-cell`},ye=[`title`],be=[`y1`,`y2`],xe=[`y1`,`y2`],Se=[`points`],A=[`y1`,`y2`],Ce={class:`mono`},we={class:`mono`},Te=[`title`],Ee=[`value`,`title`],De={value:``},Oe=[`value`],ke=[`title`],j={key:1,class:`run-pill na`},Ae={class:`prod-cell`},M=[`title`],N=[`title`],P={key:1,class:`dim`},je={class:`dev-binds`},Me=[`title`],Ne=[`onClick`],Pe=[`title`],F={value:``},Fe=[`value`,`disabled`],Ie={class:`right`},Le=[`title`],Re=120,I=26,ze=Object.assign(T(a({__name:`DaqNodeRow`,props:{n:{}},setup(t){let n=t,{t:r}=ie(),i=pe(),a=me(),f=he();function _(e){if(!e.lastAt)return!0;let t=e.intervalMs??i.controller.defaultIntervalMs;return Date.now()-Date.parse(e.lastAt)>Math.max(t*4,12e3)}function v(e){return e.enabled?e.lineId?a.lineStateOf(e.lineId).active?!i.controller.running||_(e)?`offline`:e.state:`idle`:`unassigned`:`disabled`}function y(e){let t=v(e);return t===`ok`||t===`warn`||t===`alarm`}function C(e){if(!e.lineId)return null;let t=a.lineStateOf(e.lineId);return!t.active||!t.recipeId?null:a.recipes.find(e=>e.id===t.recipeId)?.daqWindows?.find(t=>t.nodeId===e.id)??null}function ee(e){let t=C(e);return!t||e.value==null?!1:t.min!=null&&e.value<t.min||t.max!=null&&e.value>t.max}function w(e){let t=C(e);return t&&(t.min!=null||t.max!=null)?{min:t.min,max:t.max}:e.warnLow!=null||e.warnHigh!=null?{min:e.warnLow,max:e.warnHigh}:{min:null,max:null}}function te(e){let t=e.filter(Number.isFinite);if(t.length<2)return``;let n=Math.min(...t),r=Math.max(...t)-n||1;return t.map((e,i)=>`${(i/(t.length-1)*Re).toFixed(1)},${(I-(e-n)/r*24-1).toFixed(1)}`).join(` `)}function ne(e,t){if(t==null||!Number.isFinite(t))return null;let n=e.filter(Number.isFinite);if(n.length<2)return null;let r=Math.min(...n,t),i=Math.max(...n,t)-r||1;return Number((I-(t-r)/i*24-1).toFixed(1))}function ae(e){let t=v(e),n=r(`daq.k44c2n065`);if(t===`offline`)return e.lastError?{key:t,label:n,tip:e.lastError}:{key:t,label:n,tip:i.controller.running?r(`daq.k1staled129`,{p0:Math.round(Math.max((e.intervalMs??i.controller.defaultIntervalMs)*4,12e3)/1e3)}):r(`daq.k1gateoff140`)};let a={ok:r(`daq.k41k5c062`),warn:r(`daq.k49z8v063`),alarm:r(`daq.k3xmid064`),offline:n,idle:r(`daq.k3ozyqz117`),disabled:r(`daq.k1disabl130`),unassigned:r(`daq.k3ootr6053`)};if(t===`idle`)return{key:t,label:a.idle,tip:r(`daq.k1idlehin139`)};if((t===`ok`||t===`warn`||t===`alarm`)&&ee(e)){let t=C(e);return{key:`alarm`,label:r(`daq.k1l3pt51104`),tip:r(`daq.k1hrrqa1122`,{p0:t?.min??`-∞`,p1:t?.max??`+∞`,p2:``})}}return{key:t,label:a[t],tip:``}}function T(e){let t=i.templates.find(t=>t.key===le(e));return t?`${t.name} · ${t.ch}`:e||`-`}let oe=e=>e==null?r(`daq.k9vnp9h124`,{p0:i.controller.defaultIntervalMs}):`${e}ms`,se=e=>e==null?r(`daq.k9vnp9h124`,{p0:i.controller.defaultPublishIntervalMs}):e===0?r(`daq.k41mvv078`):`${e}ms`,ce=e=>i.meta.drivers.find(t=>t.kind===e)?.status===`planned`,ue=e=>e.deviceIds??(e.deviceBindingId?[e.deviceBindingId]:[]),de=e=>f.twins.find(t=>t.id===e)?.name??e,fe=d(()=>f.twins.filter(e=>e.kind!==`daq`&&!(e.modelRef??``).startsWith(`daq-`)&&!(e.modelRef??``).startsWith(`dcw-`))),D=d(()=>{let e=n.n,t=w(e),r=e.lineId?a.lineStateOf(e.lineId):null;return{tpl:T(e.templateRef),pill:ae(e),alarm:ee(e),live:y(e),trend:te(e.hist),limMin:ne(e.hist,t.min),limMax:ne(e.hist,t.max),interval:oe(e.intervalMs),publish:se(e.publishIntervalMs),lineActive:!!r?.active,lineProduct:r?.productName??``,lineRecipe:r?.recipeName??``}});async function ze(){let t=n.n,a=!t.enabled;try{await i.patchNode(t.id,{enabled:a}),t.enabled=a,a||(t.state=`offline`),e.success(r(a?`daq.k1nodestart147`:`daq.k1nodestop146`))}catch(t){e.error(E(t))}}async function Be(t){let r=t.target.value;try{await i.patchNode(n.n.id,{lineId:r});let e=n.n;e.lineId=r}catch(t){e.error(E(t))}}async function Ve(t){let r=t.target.value;if(!r)return;let a=n.n;if(!a.deviceIds?.includes(r)){try{await i.setNodeBindings(a.id,[...a.deviceIds??[],r])}catch(t){e.error(E(t))}t.target.value=``}}async function He(t){let r=n.n;try{await i.setNodeBindings(r.id,(r.deviceIds??[]).filter(e=>e!==t))}catch(t){e.error(E(t))}}return(e,n)=>{let r=re;return s(),m(`tr`,{class:c({"row-recipe-alarm":D.value.alarm})},[p(`td`,null,[p(`span`,O,o(t.n.id.slice(0,8)),1),p(`b`,null,o(t.n.name),1),p(`small`,k,o(D.value.tpl),1)]),p(`td`,null,[p(`span`,{class:c([`st-pill`,[D.value.pill.key]]),title:D.value.pill.tip},o(D.value.pill.label),11,ge)]),p(`td`,{class:c([`mono val`,{stale:!D.value.live,"val-alarm":t.n.state===`alarm`||D.value.alarm}]),title:D.value.live?void 0:D.value.pill.tip},[S(o(t.n.value==null?`--`:t.n.value.toFixed(t.n.decimals))+` `,1),p(`small`,null,o(t.n.unit),1)],10,_e),p(`td`,ve,[(s(),m(`svg`,{class:`trend`,viewBox:`0 0 120 26`,preserveAspectRatio:`none`,title:e.$t(`daq.k1trnd002`)},[D.value.limMin==null?g(``,!0):(s(),m(`line`,{key:0,class:`lim`,x1:`0`,y1:D.value.limMin,x2:`120`,y2:D.value.limMin},null,8,be)),D.value.limMax==null?g(``,!0):(s(),m(`line`,{key:1,class:`lim max`,x1:`0`,y1:D.value.limMax,x2:`120`,y2:D.value.limMax},null,8,xe)),D.value.trend?(s(),m(`polyline`,{key:2,class:c([`trace`,{alarm:t.n.state===`alarm`||D.value.alarm}]),points:D.value.trend},null,10,Se)):(s(),m(`line`,{key:3,class:`trace-idle`,x1:`0`,y1:I/2,x2:`120`,y2:I/2},null,8,A))],8,ye))]),p(`td`,Ce,o(D.value.interval),1),p(`td`,we,o(D.value.publish),1),p(`td`,null,[p(`span`,{class:c([`drv-tag`,{planned:ce(t.n.driver)}]),title:ce(t.n.driver)?e.$t(`daq.k1plndrv138`):``},o(t.n.driver),11,Te)]),p(`td`,null,[p(`select`,{class:`line-sel`,value:t.n.lineId,title:e.$t(`daq.k3q23v3010`),onChange:Be},[p(`option`,De,o(e.$t(`daq.k3ootr6053`)),1),(s(!0),m(h,null,l(x(a).lines,e=>(s(),m(`option`,{key:e.id,value:e.id},o(e.name),9,Oe))),128))],40,Ee)]),p(`td`,null,[t.n.lineId?(s(),m(`span`,{key:0,class:c([`run-pill`,{on:D.value.lineActive}]),title:e.$t(`daq.k1runtipc131`)},[n[0]||=p(`span`,{class:`rp-dot`},null,-1),S(` `+o(D.value.lineActive?e.$t(`daq.k3vp67i096`):e.$t(`daq.k3ozyqz117`)),1)],10,ke)):(s(),m(`span`,j,o(e.$t(`daq.k3ootr6053`)),1))]),p(`td`,Ae,[t.n.lineId&&D.value.lineActive?(s(),m(h,{key:0},[p(`b`,{title:e.$t(`daq.k1prdrtip132`)},o(D.value.lineProduct||`--`),9,M),p(`small`,{class:`mono`,title:e.$t(`daq.k1prdrtip132`)},o(D.value.lineRecipe||`--`),9,N)],64)):(s(),m(`span`,P,`--`))]),p(`td`,null,[p(`div`,je,[(s(!0),m(h,null,l(ue(t.n),t=>(s(),m(`span`,{key:t,class:`dev-bind-chip`,title:e.$t(`daq.k2bindtip137`)},[S(o(de(t))+` `,1),p(`span`,{class:`dev-unbind`,title:`unbind`,onClick:e=>He(t)},`✕`,8,Ne)],8,Me))),128)),p(`select`,{class:`line-sel dev-add`,value:``,title:e.$t(`daq.k2bindtip137`),onChange:Ve},[p(`option`,F,o(e.$t(`daq.k3own4q056`)),1),(s(!0),m(h,null,l(fe.value,e=>(s(),m(`option`,{key:e.id,value:e.id,disabled:(t.n.deviceIds??[]).includes(e.id)},o(de(e.id)),9,Fe))),128))],40,Pe)])]),p(`td`,Ie,[p(`button`,{class:c([`node-toggle`,{off:!t.n.enabled}]),title:t.n.enabled?e.$t(`daq.k1nodestop146`):e.$t(`daq.k1nodestart147`),onClick:ze},[p(`span`,{class:c(t.n.enabled?`i-tabler-player-pause`:`i-tabler-player-play`)},null,2),S(` `+o(t.n.enabled?e.$t(`daq.k1nodestop146`):e.$t(`daq.k1nodestart147`)),1)],10,Le),u(r,{class:`console-link`,to:`/daq/${t.n.id}`},{default:b(()=>[n[1]||=p(`span`,{class:`i-tabler-dashboard`},null,-1),S(` `+o(e.$t(`daq.k3o3jg2074`)),1)]),_:1},8,[`to`])])],2)}}}),[[`__scopeId`,`data-v-4b6f87e1`]]),{__name:`WorkshopDaqNodeRow`}),Be={class:`page`},Ve={class:`aw-page-head`},He={class:`sub`},Ue={class:`badges mono`},We=[`title`],Ge=[`title`],Ke={class:`txt`},qe={class:`mono`},Je={key:1,class:`infra-banner`},Ye={class:`txt`},Xe={key:2,class:`infra-banner`},Ze={class:`txt`},Qe=[`disabled`],$e={key:3,class:`alarm-bar`},et={class:`bar-label`},tt={class:`mono`},nt={class:`alarm-scroll`},rt=[`title`],it={class:`mono dim`},at={class:`mono`},ot={key:0,class:`esc mono`},st=[`onClick`],ct={class:`aw-tile ctrl-card`},lt={class:`ctrl-row`},ut={class:`ctrl-left`},dt=[`title`],ft={class:`cycle mono`},pt=[`title`],mt={class:`ctrl-right`},ht={class:`ctrl-metrics mono`},gt=[`title`],_t=[`title`],vt=[`title`],yt=[`title`],bt={class:`line-strip`},xt={class:`strip-label`},St={class:`mono`},Ct={class:`strip-scroll`},wt={key:0,class:`lp-run`},Tt={key:1,class:`lp-idle`},Et={class:`lp-idle`},Dt={class:`modal`},Ot={class:`m-title`},kt={class:`seg-row`},At={class:`f-grid`},jt={class:`f`},Mt=[`value`],Nt={class:`f`},Pt=[`placeholder`],Ft={key:0,class:`f`},It=[`placeholder`],Lt={class:`f-grid`},Rt={class:`f`},zt=[`value`],Bt={key:0,class:`f-grid driver-form`},Vt={key:0},Ht=[`onUpdate:modelValue`],Ut=[`value`],Wt=[`onUpdate:modelValue`,`type`,`placeholder`],Gt={key:2,class:`hint`},Kt={class:`test-row`},qt=[`disabled`],Jt={key:1,class:`m-err`},Yt={class:`m-actions`},Xt=[`disabled`,`title`],Zt={class:`modal`},Qt={class:`m-title`},$t={class:`sec-label`},en={class:`tpl-table`},tn={class:`mono dim`},nn={class:`mono range`},rn={class:`right actions`},an=[`onClick`],on=[`onClick`],sn={key:0},cn={colspan:`3`,class:`empty`},ln={class:`sec-label`},un={class:`f-grid`},dn={class:`f`},fn=[`placeholder`],pn={class:`f`},mn={class:`f`},hn=[`placeholder`],gn={class:`f`},_n=[`placeholder`],vn={class:`f`},yn={class:`f`},bn={class:`f`},xn={class:`f`},Sn=[`value`],Cn={class:`f`},wn={class:`hint`},Tn={class:`f`},En={class:`hint`},Dn={key:0,class:`m-err`},On={class:`m-actions`},kn=[`disabled`],An={class:`sec-label`},jn={class:`tpl-table`},Mn={class:`mono dim`},Nn={class:`mono range`},Pn={class:`right actions`},Fn=[`onClick`],In={class:`aw-tile opt-card`},Ln={class:`opt-count mono`},Rn={class:`opt-filters`},zn={value:``},Bn=[`value`],Vn={value:``},Hn=[`value`],Un={key:0,class:`opt-empty`},Wn={class:`opt-list`},Gn={class:`opt-line1`},Kn={class:`opt-node`},qn={class:`mono opt-params`},Jn={class:`mono opt-time`},Yn=[`disabled`,`onClick`],Xn=[`onClick`],Zn={class:`opt-line2 mono`},Qn={key:1,class:`opt-open-hint`},$n={key:2,class:`opt-agg`},er={key:3,class:`opt-agg`},tr={key:0,class:`opt-series`},nr={class:`opt-spark`,viewBox:`0 0 240 36`,preserveAspectRatio:`none`},rr=[`points`],ir={class:`mono`},ar={key:0,class:`opt-empty`},or={class:`aw-tile table-card`},sr={class:`tbl-toolbar`},cr={class:`filters`},lr={class:`flt`},ur={value:``},dr=[`value`],fr={value:`none`},pr={class:`flt`},mr={value:``},hr=[`value`],gr={value:`none`},_r=[`title`],vr={value:``},yr={value:`on`},br={value:`off`},xr={class:`flt`},Sr={value:``},Cr={value:`ok`},wr={value:`warn`},Tr={value:`alarm`},Er={value:`offline`},Dr={class:`flt`},Or={value:``},kr=[`value`],Ar={class:`flt`},jr={value:``},Mr=[`value`],Nr=[`title`],Pr={value:``},Fr={value:`live`},Ir={value:`hour`},Lr={value:`day`},Rr={value:`old`},zr={value:`never`},Br={class:`flt`},Vr=[`placeholder`],Hr={class:`count mono`},Ur={class:`ops-panels`},Wr={class:`panel-head`},Gr={class:`panel-body`},Kr={key:0,class:`panel-empty`},qr={class:`mono dim`},Jr={class:`mono`},Yr={key:0,class:`esc mono`},Xr=[`onClick`],Zr={class:`ops-panel event-panel`},Qr={class:`panel-head`},$r={class:`panel-body`},ei={key:0,class:`panel-empty`},ti={class:`mono dim t`},ni=[`title`],ri=[`title`],ii=[`title`],ai={class:`right`},oi={key:0,class:`vs-pad`,"aria-hidden":`true`},si={key:1,class:`vs-pad`,"aria-hidden":`true`},ci={key:2},li={colspan:`11`},ui={class:`pane-empty`,style:{"min-height":`120px`}},di={class:`pe-sub`},fi={key:3},pi={colspan:`11`},mi={class:`pane-empty`,style:{"min-height":`90px`}},hi={class:`pe-sub`},gi={key:6,class:`err`},_i=42,vi=8,yi=T(a({__name:`index`,setup(a){let{t:T}=ie();se({layout:`default`}),ne({title:()=>T(`titles.daq`)});let O=pe(),k=me(),ge=oe(),_e=d(()=>k.lines.some(e=>k.lineStateOf(e.id).active)),ve=D();function ye(e){return{write:T(`logs.kind.write`),manual:T(`logs.kind.manual`),alarm:T(`logs.kind.alarm`),line:T(`logs.kind.line`),recipe:T(`logs.kind.recipe`),rollback:T(`logs.kind.rollback`),daq:T(`logs.kind.daq`),system:T(`logs.kind.system`)}[e]??(e||T(`logs.kind.system`))}function be(e){let t=new Date(e);return Number.isFinite(t.getTime())?`${String(t.getHours()).padStart(2,`0`)}:${String(t.getMinutes()).padStart(2,`0`)}:${String(t.getSeconds()).padStart(2,`0`)}`:``}async function xe(t){try{await O.ackAlarm(t),e.success(T(`daq.k1acked144`))}catch(t){e.error(E(t))}}let Se=null;i(()=>{ge.ensureConnected(),Se=O.ensureWsFeed(),ve.ensureLive(),O.load(),O.fetchAlarms(),k.load(),ki.load(),k.loadOptimizations(),ce(()=>{O.load(),O.fetchAlarms()},5e3,{bgMs:3e4}),ce(()=>{k.load()},15e3,{bgMs:6e4})}),r(()=>{Se?.()});let A=f({lineId:``,deviceId:``,template:``,driver:``,lineRun:``,state:``,time:``,search:``}),Ce=d(()=>!!(A.lineId||A.deviceId||A.template||A.driver||A.lineRun||A.state||A.time||A.search.trim()));function we(){A.lineId=``,A.deviceId=``,A.template=``,A.driver=``,A.lineRun=``,A.state=``,A.time=``,A.search=``}let Te=d(()=>{let e=new Map;for(let t of O.nodes)e.set(t.templateRef,(e.get(t.templateRef)??0)+1);return[...e.entries()].map(([e,t])=>({ref:e,count:t,label:Vi(e)}))}),Ee=d(()=>{let e=new Map;for(let t of O.nodes)e.set(t.driver,(e.get(t.driver)??0)+1);return[...e.entries()].map(([e,t])=>({kind:e,count:t,label:O.meta.drivers.find(t=>t.kind===e)?.label??e}))});function De(e){if(!e.lastAt)return`never`;let t=Date.now()-Date.parse(e.lastAt);return t<=3e5?`live`:t<=36e5?`hour`:t<=864e5?`day`:`old`}function Oe(e){return!A.time||De(e)===A.time}function ke(e){let t=A.search.trim().toLowerCase();return!t||e.name.toLowerCase().includes(t)||e.id.toLowerCase().includes(t)}let j=y(!1),Ae=y(!1),M=y(``),N=y(``),P=y({}),je=y(``),Me=d(()=>k.recipes.filter(e=>!M.value||e.lineId===M.value));function Ne(e){return{open:`daq.k1optst001`,judged:`daq.k1optst008`,"judged-keep":`daq.k1optst002`,"rolled-back":`daq.k1optst003`,superseded:`daq.k1optst004`,"superseded-manual":`daq.k1optst005`,"closed-line-stop":`daq.k1optst006`,failed:`daq.k1optst007`}[e]??`daq.k1optst001`}async function Pe(){j.value=!j.value,j.value&&(Ae.value=!0,await F())}async function F(){await k.loadOptimizations({lineId:M.value||void 0,recipeId:N.value||void 0})}function Fe(){N.value&&!Me.value.some(e=>e.id===N.value)&&(N.value=``),F()}async function Ie(e){je.value=e;try{let t=await k.optimizationSeries(e);P.value={...P.value,[e]:t}}finally{je.value=``}}function Le(e,t=240,n=36){let r=e.map(e=>e.value??e.avg??0).filter(Number.isFinite);if(r.length<2)return``;let i=Math.min(...r),a=Math.max(...r)-i||1;return r.map((e,o)=>`${o/(r.length-1)*t},${n-(e-i)/a*n}`).join(` `)}async function Re(e){await k.rollbackOptimization(e),await F()}function I(e){return e==null?`--`:String(Number(e.toFixed(2)))}let yi=d(()=>{let e=new Map;for(let t of O.nodes)for(let n of t.deviceIds??(t.deviceBindingId?[t.deviceBindingId]:[]))e.set(n,(e.get(n)??0)+1);return ki.twins.filter(t=>e.has(t.id)).map(t=>({id:t.id,name:Ai.get(t.id)??t.name,count:e.get(t.id)}))});function bi(e){if(!A.lineRun)return!0;let t=!!e.lineId&&k.lineStateOf(e.lineId).active;return A.lineRun===`on`?t:!t}let L=d(()=>k.lines.find(e=>e.id===A.lineId)??null),R=d(()=>L.value?k.lineStateOf(L.value.id):null);function xi(e){if(!e.lastAt)return!0;let t=e.intervalMs??O.controller.defaultIntervalMs;return Date.now()-Date.parse(e.lastAt)>Math.max(t*4,12e3)}function Si(e){return e.enabled?e.lineId?k.lineStateOf(e.lineId).active?!O.controller.running||xi(e)?`offline`:e.state:`idle`:`unassigned`:`disabled`}let z=d(()=>O.nodes.filter(e=>{if(A.lineId&&(A.lineId===`none`?e.lineId:(e.lineId??``)!==A.lineId))return!1;let t=e.deviceIds??(e.deviceBindingId?[e.deviceBindingId]:[]);return!(A.deviceId&&(A.deviceId===`none`?t.length>0:!t.includes(A.deviceId))||A.template&&e.templateRef!==A.template||A.driver&&e.driver!==A.driver||!bi(e)||A.state&&Si(e)!==A.state||!Oe(e)||!ke(e))})),Ci=y(null),B=y(0),V=y(60),wi=d(()=>{let e=z.value,t=Math.min(B.value,Math.max(0,e.length-1));return e.slice(t,V.value)}),Ti=d(()=>B.value*_i),Ei=d(()=>Math.max(0,(z.value.length-V.value)*_i)),Di=0;function Oi(){let e=Ci.value;if(!e)return;let t=z.value.length,n=window.innerHeight||800,r=e.getBoundingClientRect().top+window.scrollY+40,i=Math.floor((window.scrollY-r)/_i),a=Math.ceil(n/_i)+16,o=Math.max(0,Math.min(i-vi,Math.max(0,t-1))),s=Math.max(o,Math.min(t,o+a));o!==B.value&&(B.value=o),s!==V.value&&(V.value=s)}function H(){Di||=requestAnimationFrame(()=>{Di=0,Oi()})}i(()=>{Oi(),window.addEventListener(`scroll`,H,{passive:!0}),window.addEventListener(`resize`,H,{passive:!0})}),r(()=>{window.removeEventListener(`scroll`,H),window.removeEventListener(`resize`,H),Di&&cancelAnimationFrame(Di)}),t(()=>z.value.length,()=>{B.value=0,V.value=Math.min(z.value.length,V.value||60),H()});let ki=he(),Ai=new Map;t(()=>ki.twins,e=>{for(let t of e)Ai.set(t.id,t.name)},{immediate:!0,deep:!0});let U=y(!1),W=y(`mock`),G=y(fe[0]?.key??`temp-tc`),K=y(`modbus-tcp`),q=y(``),ji=y(null),J=y({}),Mi=f({kind:`none`,scale:1,offset:0}),Ni=y(!1),Y=y(null),Pi=y(!1),Fi=y(``),Ii=d(()=>de.find(e=>e.kind===K.value)),Li=d(()=>Ii.value?.configFields??[]),Ri=e=>O.meta.drivers.find(t=>t.kind===e)?.status!==`planned`&&O.meta.driverAvailable?.[e]!==!1;t(K,()=>{let e={};for(let t of Li.value)t.default!==void 0&&(e[t.key]=t.default);J.value=e,Y.value=null},{immediate:!0});async function zi(){Ni.value=!0,Y.value=null;try{Y.value=await O.testDriver(K.value,J.value)}catch(e){Y.value={ok:!1,message:E(e)}}finally{Ni.value=!1}}async function Bi(){Pi.value=!0,Fi.value=``;try{let e=Mi.kind===`linear`?{kind:`linear`,scale:Number(Mi.scale),offset:Number(Mi.offset)}:void 0;if(W.value===`mock`)await O.createFromTemplate(`daq-${G.value}`,{name:q.value?{name:q.value}.name:void 0,transform:e});else{for(let e of Li.value)if(e.required&&!J.value[e.key]&&J.value[e.key]!==0)throw Error(T(`daq.kyuadl0125`,{p0:e.label}));let t=O.templates.find(e=>e.key===G.value);await O.createFromTemplate(`daq-${G.value}`,{name:q.value||void 0,driver:K.value,driverConfig:{...J.value},transform:e,intervalMs:ji.value,unit:t?.unit,min:t?.min,max:t?.max,decimals:t?.decimals})}U.value=!1,q.value=``,Y.value=null}catch(e){Fi.value=E(e)}finally{Pi.value=!1}}function Vi(e){let t=O.templates.find(t=>t.key===le(e));return t?`${t.name} · ${t.ch}`:e||`-`}let Hi=y(!1),X=y(null),Ui=y(!1),Z=y(``),Q=y(``),$=f({name:``,ch:``,code:``,unit:``,min:0,max:100,base:50,amp:2,decimals:2,icon:`thermo`}),Wi={thermo:T(`daq.k422b8079`),pressure:T(`daq.k3x6ff080`),tension:T(`daq.k3z9xc081`),encoder:T(`daq.k3subk4082`),camera:T(`daq.k47atw083`),gateway:T(`daq.kz7yhbj084`)},Gi=d(()=>O.templates.filter(e=>!e.builtin)),Ki=d(()=>O.templates.filter(e=>e.builtin));function qi(e,t=!1){$.name=t?T(`daq.k2hbo3c126`,{p0:e.name}):e.name,$.ch=e.ch,$.code=e.code,$.unit=e.unit,$.min=e.min,$.max=e.max,$.base=e.base,$.amp=e.amp,$.decimals=e.decimals,$.icon=e.icon}function Ji(){X.value=null,Z.value=``,Q.value=``,qi({key:``,name:``,code:``,ch:``,unit:``,base:50,amp:2,min:0,max:100,decimals:2,icon:`thermo`})}function Yi(e){X.value=e.key,Z.value=``,qi(e)}function Xi(e){X.value=null,Z.value=``,qi(e,!0)}async function Zi(){Ui.value=!0,Z.value=``;try{let e=e=>{let t=Number(e);return e===``||e==null||!Number.isFinite(t)?void 0:t},t={name:$.name.trim(),ch:$.ch.trim()||void 0,code:$.code.trim()||void 0,unit:$.unit.trim(),min:e($.min),max:e($.max),base:e($.base),amp:e($.amp),decimals:e($.decimals),icon:$.icon};X.value?await O.updateTemplate(X.value,t):await O.createTemplate(t),Ji()}catch(e){Z.value=E(e)}finally{Ui.value=!1}}async function Qi(e){if(Q.value!==e.key){Q.value=e.key;return}try{await O.removeTemplate(e.key)}catch(e){Z.value=E(e)}finally{Q.value=``}}let $i=y(!1);async function ea(){$i.value=!0;try{await O.reconnectInfra()}catch{}finally{$i.value=!1}}return(e,t)=>{let r=re,i=ze,a=ae;return s(),m(`div`,Be,[p(`div`,Ve,[p(`div`,null,[t[36]||=p(`p`,{class:`aw-kicker`},` AGENTWORKSHOP / DAQ CONSOLE `,-1),p(`h1`,null,o(e.$t(`daq.k1emg364011`)),1),p(`p`,He,o(e.$t(`daq.k1wmg2bz012`)),1)]),p(`div`,Ue,[p(`span`,{class:`badge`,title:e.$t(`daq.k1tsdbtip133`)},`TSDB · `+o(x(O).meta.tsdb),9,We),p(`span`,{class:`badge`,title:e.$t(`daq.k1queuet134`)},`QUEUE · `+o(x(O).meta.queue),9,Ge)])]),x(O).loaded&&L.value&&R.value?(s(),m(`div`,{key:0,class:c([`infra-banner`,{good:R.value.active}])},[p(`span`,{class:c(R.value.active?`i-tabler-circle-check`:`i-tabler-info-circle`)},null,2),p(`span`,Ke,[R.value.active?(s(),m(h,{key:0},[S(o(e.$t(`daq.k3ktxbr085`))+o(L.value.name)+`」`+o(e.$t(`daq.k15lvw0o105`)),1),p(`b`,null,o(R.value.productName),1),t[37]||=S(` · Recipe:`,-1),p(`b`,null,o(R.value.recipeName),1),p(`small`,qe,o(e.$t(`daq.k400lb086`))+` `+o(R.value.runId?.slice(0,8))+` · `+o(e.$t(`daq.k3zkt2106`))+` `+o(R.value.startedAt?.slice(11,19))+` `+o(e.$t(`daq.k69vag8108`))+` `+o(R.value.taggedSamples)+` `+o(e.$t(`daq.k4118o092`)),1)],64)):(s(),m(h,{key:1},[S(o(e.$t(`daq.k3ktxbr085`))+o(L.value.name)+`」`+o(e.$t(`daq.k12uge2o107`)),1)],64))]),u(r,{class:`pill-btn`,to:`/dcw/${L.value.id}`},{default:b(()=>[S(o(R.value.active?e.$t(`daq.k1ukoy0v093`):e.$t(`daq.k1cg78i8109`)),1)]),_:1},8,[`to`])],2)):x(O).loaded&&!_e.value?(s(),m(`div`,Je,[t[38]||=p(`span`,{class:`i-tabler-info-circle`},null,-1),p(`span`,Ye,[S(o(e.$t(`daq.k19onw5w013`)),1),u(r,{to:`/dcw`},{default:b(()=>[S(o(e.$t(`daq.k1b2tk5c014`)),1)]),_:1}),S(o(e.$t(`daq.k1u9wnlg015`)),1)])])):g(``,!0),x(O).meta.infra?.degraded?(s(),m(`div`,Xe,[t[39]||=p(`span`,{class:`i-tabler-alert-triangle`},null,-1),p(`span`,Ze,o(x(O).meta.infra.warning),1),p(`button`,{class:`pill-btn`,disabled:$i.value,onClick:ea},o($i.value?e.$t(`daq.k1ld43ur094`):e.$t(`daq.kzg9805110`)),9,Qe)])):g(``,!0),x(O).alarms.length?(s(),m(`div`,$e,[p(`span`,et,[t[40]||=p(`span`,{class:`i-tabler-bell-ringing bell`},null,-1),S(` `+o(e.$t(`daq.k1alarm141`))+` `,1),p(`b`,tt,o(x(O).alarms.length),1)]),p(`div`,nt,[(s(!0),m(h,null,l(x(O).alarms,t=>(s(),m(`span`,{key:t.id,class:`alarm-item`,title:e.$t(`daq.k1esc143`,{p0:t.escalation})},[p(`b`,null,o(t.nodeName),1),p(`span`,it,o(t.metric),1),p(`span`,at,o(t.value)+` `+o(t.rule===`lt-min`?`<`:`>`)+` `+o(t.threshold),1),t.escalation>0?(s(),m(`small`,ot,`+`+o(t.escalation),1)):g(``,!0),p(`button`,{class:`mini-btn ack`,onClick:e=>xe(t.id)},o(e.$t(`daq.k1ack142`)),9,st)],8,rt))),128))])])):g(``,!0),p(`section`,ct,[p(`div`,lt,[p(`div`,ut,[p(`button`,{class:c([`aw-pill`,{running:x(O).controller.running}]),title:e.$t(`daq.k1snap145`),onClick:t[0]||=e=>x(O).controllerAction(x(O).controller.running?`pause`:`resume`)},[p(`span`,{class:c(x(O).controller.running?`i-tabler-player-pause`:`i-tabler-player-play`)},null,2),S(` `+o(x(O).controller.running?e.$t(`daq.kpui00095`):e.$t(`daq.knxpdpt111`)),1)],10,dt),p(`label`,ft,[S(o(e.$t(`daq.k1ifahxj016`))+` `,1),_(p(`input`,{"onUpdate:modelValue":t[1]||=e=>x(O).controller.defaultIntervalMs=e,type:`number`,min:`200`,max:`60000`,step:`100`,onChange:t[2]||=e=>x(O).controllerAction(`config`,x(O).controller.defaultIntervalMs)},null,544),[[w,x(O).controller.defaultIntervalMs,void 0,{number:!0}]]),t[41]||=S(`ms `,-1)]),p(`label`,{class:`cycle mono`,title:e.$t(`daq.k1e8lcoo001`)},[S(o(e.$t(`daq.k1if98n0017`))+` `,1),_(p(`input`,{"onUpdate:modelValue":t[3]||=e=>x(O).controller.defaultPublishIntervalMs=e,type:`number`,min:`0`,max:`60000`,step:`100`,onChange:t[4]||=e=>x(O).controllerAction(`config`,x(O).controller.defaultIntervalMs,x(O).controller.defaultPublishIntervalMs)},null,544),[[w,x(O).controller.defaultPublishIntervalMs,void 0,{number:!0}]]),t[42]||=S(`ms `,-1)],8,pt)]),p(`div`,mt,[p(`span`,ht,[p(`span`,null,o(e.$t(`daq.k45uio067`))+` `+o(x(O).controller.nodesOnline)+`/`+o(x(O).controller.nodesTotal),1),t[43]||=p(`span`,{class:`sep`},`·`,-1),p(`span`,{title:e.$t(`daq.k1yztsu4002`)},o(e.$t(`daq.k3xagp087`))+` `+o(x(O).meta.produced),9,gt),t[44]||=p(`span`,{class:`sep`},`·`,-1),p(`span`,{title:e.$t(`daq.ko09iha003`)},o(e.$t(`daq.k427eu088`))+` `+o(x(O).meta.consumed),9,_t),t[45]||=p(`span`,{class:`sep`},`·`,-1),p(`span`,{class:c({warn:(x(O).meta.dropped??0)>0}),title:e.$t(`daq.k1droptip135`)},o(e.$t(`daq.k3w8go089`))+` `+o(x(O).meta.dropped),11,vt),t[46]||=p(`span`,{class:`sep`},`·`,-1),p(`span`,{title:e.$t(`daq.kj1jbmw004`)},o(e.$t(`daq.k3wusd090`))+` `+o(x(O).meta.samplesStored),9,yt)]),p(`button`,{class:`aw-pill outline add-btn`,onClick:t[5]||=e=>{Hi.value=!0,Ji()}},[t[47]||=p(`span`,{class:`i-tabler-adjustments-horizontal`},null,-1),S(` `+o(e.$t(`daq.k1f5cv0s018`)),1)]),p(`button`,{class:`aw-pill add-btn`,onClick:t[6]||=e=>U.value=!0},[t[48]||=p(`span`,{class:`i-tabler-plus`},null,-1),S(` `+o(e.$t(`daq.k1fn0ukb019`)),1)])])]),p(`div`,bt,[p(`span`,xt,[t[49]||=p(`span`,{class:`i-tabler-route`},null,-1),S(` `+o(e.$t(`daq.k1b2o3b6020`)),1),p(`small`,St,o(x(k).lines.length),1)]),p(`div`,Ct,[(s(!0),m(h,null,l(x(k).lines,i=>(s(),v(r,{key:i.id,class:c([`line-pill`,{on:x(k).lineStateOf(i.id).active}]),style:n({"--lc":i.color}),to:`/dcw/${i.id}`,title:x(k).lineStateOf(i.id).active?e.$t(`daq.k3v957u120`,{p0:i.name,p1:x(k).lineStateOf(i.id).productName,p2:x(k).lineStateOf(i.id).recipeName}):e.$t(`daq.k1x7jnru121`,{p0:i.name})},{default:b(()=>[t[50]||=p(`span`,{class:`lp-dot`},null,-1),p(`b`,null,o(i.name),1),x(k).lineStateOf(i.id).active?(s(),m(`small`,wt,o(x(k).lineStateOf(i.id).recipeName??e.$t(`daq.k3vp67i096`)),1)):(s(),m(`small`,Tt,o(e.$t(`daq.k3zgkk021`)),1))]),_:2},1032,[`class`,`style`,`to`,`title`]))),128)),x(k).lines.length===0?(s(),v(r,{key:0,class:`line-pill`,to:`/dcw`},{default:b(()=>[t[51]||=p(`span`,{class:`lp-dot`},null,-1),p(`b`,null,o(e.$t(`daq.k1el12b1022`)),1),p(`small`,Et,o(e.$t(`daq.k8jxxe8023`)),1)]),_:1})):g(``,!0)])])]),U.value?(s(),m(`div`,{key:4,class:`modal-mask`,onClick:t[14]||=ee(e=>U.value=!1,[`self`])},[p(`div`,Dt,[p(`h3`,Ot,o(e.$t(`daq.k19rioqa024`)),1),p(`div`,kt,[p(`button`,{class:c([`seg`,{on:W.value===`mock`}]),onClick:t[7]||=e=>W.value=`mock`},o(e.$t(`daq.k1p5c1un025`)),3),p(`button`,{class:c([`seg`,{on:W.value===`real`}]),onClick:t[8]||=e=>W.value=`real`},o(e.$t(`daq.k1cbcp3o026`)),3)]),p(`div`,At,[p(`label`,jt,[p(`span`,null,o(e.$t(`daq.k1fsgerc027`)),1),_(p(`select`,{"onUpdate:modelValue":t[9]||=e=>G.value=e,class:`inp`},[(s(!0),m(h,null,l(x(O).templates,t=>(s(),m(`option`,{key:t.key,value:t.key},o(t.name)+` · `+o(t.ch)+`(`+o(t.min)+`~`+o(t.max)+` `+o(t.unit)+`)`+o(t.builtin?``:e.$t(`daq.kr45rk9097`)),9,Mt))),128))],512),[[C,G.value]])]),p(`label`,Nt,[p(`span`,null,o(e.$t(`daq.k1ce2k1y028`)),1),_(p(`input`,{"onUpdate:modelValue":t[10]||=e=>q.value=e,class:`inp`,placeholder:e.$t(`daq.kgpxzy3005`)},null,8,Pt),[[w,q.value]])]),W.value===`real`?(s(),m(`label`,Ft,[p(`span`,null,o(e.$t(`daq.k13mfsfc029`)),1),_(p(`input`,{"onUpdate:modelValue":t[11]||=e=>ji.value=e,type:`number`,min:`1000`,max:`60000`,step:`500`,class:`inp`,placeholder:e.$t(`daq.k1eg1000a136`)},null,8,It),[[w,ji.value,void 0,{number:!0}]])])):g(``,!0)]),W.value===`real`?(s(),m(h,{key:0},[p(`div`,Lt,[p(`label`,Rt,[p(`span`,null,o(e.$t(`daq.k1kt87rx030`)),1),_(p(`select`,{"onUpdate:modelValue":t[12]||=e=>K.value=e,class:`inp`},[(s(!0),m(h,null,l(x(de).filter(e=>e.status!==`planned`),t=>(s(),m(`option`,{key:t.kind,value:t.kind},o(t.label)+o(Ri(t.kind)?``:e.$t(`daq.kjbqphp098`)),9,zt))),128))],512),[[C,K.value]])])]),Li.value.length?(s(),m(`div`,Bt,[(s(!0),m(h,null,l(Li.value,e=>(s(),m(`label`,{key:e.key,class:`f`},[p(`span`,null,[S(o(e.label),1),e.required?(s(),m(`em`,Vt,`*`)):g(``,!0)]),e.type===`select`?_((s(),m(`select`,{key:0,"onUpdate:modelValue":t=>J.value[e.key]=t,class:`inp`},[(s(!0),m(h,null,l(e.options,e=>(s(),m(`option`,{key:e.value,value:e.value},o(e.label),9,Ut))),128))],8,Ht)),[[C,J.value[e.key]]]):_((s(),m(`input`,{key:1,"onUpdate:modelValue":t=>J.value[e.key]=t,type:e.type===`number`?`number`:`text`,placeholder:e.placeholder,class:`inp`},null,8,Wt)),[[te,J.value[e.key]]]),e.hint?(s(),m(`small`,Gt,o(e.hint),1)):g(``,!0)]))),128))])):g(``,!0),p(`div`,Kt,[p(`button`,{class:`pill-btn`,disabled:Ni.value,onClick:zi},o(Ni.value?e.$t(`daq.k1fsh720099`):e.$t(`daq.k1fstglk112`)),9,qt),Y.value?(s(),m(`span`,{key:0,class:c([`test-result`,Y.value.ok?`ok`:`bad`])},[S(o(Y.value.ok?`✓`:`✗`)+` `+o(Y.value.message),1),Y.value.latencyMs==null?g(``,!0):(s(),m(h,{key:0},[S(`(`+o(Y.value.latencyMs)+`ms)`,1)],64))],2)):g(``,!0)])],64)):g(``,!0),Fi.value?(s(),m(`p`,Jt,o(Fi.value),1)):g(``,!0),p(`div`,Yt,[p(`button`,{class:`aw-pill outline`,onClick:t[13]||=e=>U.value=!1},o(e.$t(`daq.k3xdnn031`)),1),p(`button`,{class:`aw-pill`,disabled:Pi.value||W.value===`real`&&Y.value!=null&&!Y.value.ok,title:W.value===`real`&&!(Y.value&&Y.value.ok)?e.$t(`daq.k1needtst137`):``,onClick:Bi},o(Pi.value?e.$t(`daq.k1bg4759100`):W.value===`real`?e.$t(`daq.k7pxjxo113`):e.$t(`daq.k1bge46t118`)),9,Xt)])])])):g(``,!0),Hi.value?(s(),m(`div`,{key:5,class:`modal-mask`,onClick:t[25]||=ee(e=>Hi.value=!1,[`self`])},[p(`div`,Zt,[p(`h3`,Qt,o(e.$t(`daq.k11mv96s032`)),1),p(`p`,$t,o(e.$t(`daq.ktji4ky033`)),1),p(`table`,en,[p(`tbody`,null,[(s(!0),m(h,null,l(Gi.value,t=>(s(),m(`tr`,{key:t.key},[p(`td`,null,[p(`b`,null,o(t.name),1),p(`small`,tn,o(t.code),1)]),p(`td`,nn,o(t.min)+`~`+o(t.max)+` `+o(t.unit)+` · `+o(t.decimals)+` `+o(e.$t(`daq.k48oi091`)),1),p(`td`,rn,[p(`button`,{class:`mini-btn`,onClick:e=>Yi(t)},o(e.$t(`daq.k45eb0034`)),9,an),p(`button`,{class:`mini-btn danger`,onClick:e=>Qi(t)},o(Q.value===t.key?e.$t(`daq.k1hhheu3101`):e.$t(`daq.k3xakp114`)),9,on)])]))),128)),Gi.value.length?g(``,!0):(s(),m(`tr`,sn,[p(`td`,cn,o(e.$t(`daq.kztvzbo035`)),1)]))])]),p(`p`,ln,o(X.value?e.$t(`daq.k1iiph0s102`):e.$t(`daq.k1efixrj115`)),1),p(`div`,un,[p(`label`,dn,[p(`span`,null,[S(o(e.$t(`daq.k3xhia036`)),1),t[52]||=p(`em`,null,`*`,-1)]),_(p(`input`,{"onUpdate:modelValue":t[15]||=e=>x($).name=e,class:`inp`,placeholder:e.$t(`daq.k5opd2t006`)},null,8,fn),[[w,x($).name]])]),p(`label`,pn,[p(`span`,null,[S(o(e.$t(`daq.k3x4ef037`)),1),t[53]||=p(`em`,null,`*`,-1)]),_(p(`input`,{"onUpdate:modelValue":t[16]||=e=>x($).unit=e,class:`inp`,placeholder:`如 %RH`},null,512),[[w,x($).unit]])]),p(`label`,mn,[p(`span`,null,o(e.$t(`daq.k1l477m0038`)),1),_(p(`input`,{"onUpdate:modelValue":t[17]||=e=>x($).ch=e,class:`inp`,placeholder:e.$t(`daq.kk8o4tl007`)},null,8,hn),[[w,x($).ch]])]),p(`label`,gn,[p(`span`,null,o(e.$t(`daq.k1ayxrqb039`)),1),_(p(`input`,{"onUpdate:modelValue":t[18]||=e=>x($).code=e,class:`inp`,placeholder:e.$t(`daq.kzn3l7l008`)},null,8,_n),[[w,x($).code]])]),p(`label`,vn,[p(`span`,null,[S(o(e.$t(`daq.k1l9jv5m040`)),1),t[54]||=p(`em`,null,`*`,-1)]),_(p(`input`,{"onUpdate:modelValue":t[19]||=e=>x($).min=e,type:`number`,class:`inp`},null,512),[[w,x($).min,void 0,{number:!0}]])]),p(`label`,yn,[p(`span`,null,[S(o(e.$t(`daq.k1l9jv4p041`)),1),t[55]||=p(`em`,null,`*`,-1)]),_(p(`input`,{"onUpdate:modelValue":t[20]||=e=>x($).max=e,type:`number`,class:`inp`},null,512),[[w,x($).max,void 0,{number:!0}]])]),p(`label`,bn,[p(`span`,null,o(e.$t(`daq.k3mxmcx042`)),1),_(p(`input`,{"onUpdate:modelValue":t[21]||=e=>x($).decimals=e,type:`number`,min:`0`,max:`4`,class:`inp`},null,512),[[w,x($).decimals,void 0,{number:!0}]])]),p(`label`,xn,[p(`span`,null,o(e.$t(`daq.k3xx56043`)),1),_(p(`select`,{"onUpdate:modelValue":t[22]||=e=>x($).icon=e,class:`inp`},[(s(!0),m(h,null,l(x(ue),e=>(s(),m(`option`,{key:e,value:e},o(Wi[e]),9,Sn))),128))],512),[[C,x($).icon]])]),p(`label`,Cn,[p(`span`,null,o(e.$t(`daq.k1f4eknv044`)),1),_(p(`input`,{"onUpdate:modelValue":t[23]||=e=>x($).base=e,type:`number`,class:`inp`},null,512),[[w,x($).base,void 0,{number:!0}]]),p(`small`,wn,o(e.$t(`daq.kytd15s045`)),1)]),p(`label`,Tn,[p(`span`,null,o(e.$t(`daq.k1f4ifpo046`)),1),_(p(`input`,{"onUpdate:modelValue":t[24]||=e=>x($).amp=e,type:`number`,class:`inp`},null,512),[[w,x($).amp,void 0,{number:!0}]]),p(`small`,En,o(e.$t(`daq.ksp2aji047`)),1)])]),Z.value?(s(),m(`p`,Dn,o(Z.value),1)):g(``,!0),p(`div`,On,[p(`button`,{class:`aw-pill outline`,onClick:Ji},o(e.$t(`daq.k48p40048`)),1),p(`button`,{class:`pill-btn`,disabled:Ui.value,onClick:Zi},o(Ui.value?e.$t(`daq.k1b38d59103`):X.value?e.$t(`daq.k1b39281116`):e.$t(`daq.k1b3dtga119`)),9,kn)]),p(`p`,An,o(e.$t(`daq.k1w8s84s049`)),1),p(`table`,jn,[p(`tbody`,null,[(s(!0),m(h,null,l(Ki.value,t=>(s(),m(`tr`,{key:t.key},[p(`td`,null,[p(`b`,null,o(t.name),1),p(`small`,Mn,o(t.code),1)]),p(`td`,Nn,o(t.min)+`~`+o(t.max)+` `+o(t.unit)+` · `+o(t.decimals)+` `+o(e.$t(`daq.k48oi091`)),1),p(`td`,Pn,[p(`button`,{class:`mini-btn`,onClick:e=>Xi(t)},o(e.$t(`daq.k3y694050`)),9,Fn)])]))),128))])])])])):g(``,!0),p(`section`,In,[p(`button`,{class:`opt-head`,onClick:Pe},[t[56]||=p(`span`,{class:`i-tabler-flask`},null,-1),p(`b`,null,o(e.$t(`daq.k1optt001`)),1),p(`span`,Ln,o(x(k).optimizations.length),1),p(`span`,{class:c([`opt-chevron`,{open:j.value}])},null,2)]),p(`div`,{class:c([`opt-body`,{open:j.value}])},[Ae.value?(s(),m(h,{key:0},[p(`div`,Rn,[_(p(`select`,{"onUpdate:modelValue":t[26]||=e=>M.value=e,class:`inp-sel`,onChange:Fe},[p(`option`,zn,o(e.$t(`daq.k1optf001`)),1),(s(!0),m(h,null,l(x(k).lines,e=>(s(),m(`option`,{key:e.id,value:e.id},o(e.name),9,Bn))),128))],544),[[C,M.value]]),_(p(`select`,{"onUpdate:modelValue":t[27]||=e=>N.value=e,class:`inp-sel`,onChange:F},[p(`option`,Vn,o(e.$t(`daq.k1optf004`)),1),(s(!0),m(h,null,l(Me.value,e=>(s(),m(`option`,{key:e.id,value:e.id},o(e.name),9,Hn))),128))],544),[[C,N.value]]),p(`button`,{class:`mini-act`,onClick:F},o(e.$t(`daq.k1optf002`)),1)]),x(k).optimizations.length===0?(s(),m(`p`,Un,o(e.$t(`daq.k1opte001`)),1)):g(``,!0),p(`ul`,Wn,[(s(!0),m(h,null,l(x(k).optimizations.slice(0,30),t=>(s(),m(`li`,{key:t.id,class:c([`opt-row`,t.status])},[p(`div`,Gn,[p(`span`,{class:c([`opt-status`,t.status])},o(e.$t(Ne(t.status))),3),p(`b`,Kn,o(t.nodeName),1),p(`span`,qn,o(t.params[0]?.from??`?`)+` → `+o(t.params[0]?.to),1),p(`span`,Jn,o(t.setAt.slice(5,16).replace(`T`,` `)),1),P.value[t.id]?g(``,!0):(s(),m(`button`,{key:0,class:`mini-act`,disabled:je.value===t.id,onClick:e=>Ie(t.id)},o(e.$t(`daq.k1opta001`)),9,Yn)),t.status===`open`?(s(),m(`button`,{key:1,class:`mini-act danger`,onClick:e=>Re(t.id)},o(e.$t(`daq.k1opta002`)),9,Xn)):g(``,!0)]),p(`div`,Zn,[t.judge?(s(),m(`span`,{key:0,class:c([`opt-judge`,t.judge.verdict])},o(t.judge.verdict)+`(`+o(t.judge.by)+`): `+o(t.judge.reason.slice(0,70)),3)):t.status===`open`?(s(),m(`span`,Qn,o(e.$t(`daq.k1opto001`)),1)):g(``,!0),t.aggPending?(s(),m(`span`,$n,o(e.$t(`daq.k1optw001`)),1)):t.windowAgg&&t.windowAgg.channels.length?(s(),m(`span`,er,[(s(!0),m(h,null,l(t.windowAgg.channels,t=>(s(),m(h,{key:t.daqNodeId},[S(o(t.ch)+` `+o(I(t.min))+`~`+o(I(t.max))+`(`+o(e.$t(`daq.k1optw002`))+o(t.breaches<0?`-`:t.breaches)+`) `,1)],64))),128))])):g(``,!0)]),P.value[t.id]?(s(),m(`div`,tr,[(s(!0),m(h,null,l(P.value[t.id]?.channels??[],e=>(s(),m(`div`,{key:e.nodeId,class:`opt-ch`},[(s(),m(`svg`,nr,[p(`polyline`,{points:Le(e.points)},null,8,rr)])),p(`span`,ir,o(e.ch)+` `+o(I(e.points.at(-1)?.value??e.points.at(-1)?.avg))+o(e.unit),1)]))),128)),(P.value[t.id]?.channels.length??0)===0?(s(),m(`p`,ar,o(e.$t(`daq.k1opte002`)),1)):g(``,!0)])):g(``,!0)],2))),128))])],64)):g(``,!0)],2)]),u(a,{spinning:!x(O).loaded&&!x(O).error},{default:b(()=>[p(`section`,or,[p(`div`,sr,[p(`div`,cr,[p(`label`,lr,[p(`span`,null,o(e.$t(`daq.k3wj9n051`)),1),_(p(`select`,{"onUpdate:modelValue":t[28]||=e=>x(A).lineId=e,class:`inp-sel`},[p(`option`,ur,o(e.$t(`daq.k1bkl9uj052`)),1),(s(!0),m(h,null,l(x(k).lines,e=>(s(),m(`option`,{key:e.id,value:e.id},o(e.name),9,dr))),128)),p(`option`,fr,o(e.$t(`daq.k3ootr6053`)),1)],512),[[C,x(A).lineId]])]),p(`label`,pr,[p(`span`,null,o(e.$t(`daq.k1i8rtqt054`)),1),_(p(`select`,{"onUpdate:modelValue":t[29]||=e=>x(A).deviceId=e,class:`inp-sel`},[p(`option`,mr,o(e.$t(`daq.k1bkw4m2055`)),1),(s(!0),m(h,null,l(yi.value,e=>(s(),m(`option`,{key:e.id,value:e.id},o(e.name)+`(`+o(e.count)+`) `,9,hr))),128)),p(`option`,gr,o(e.$t(`daq.k3own4q056`)),1)],512),[[C,x(A).deviceId]])]),p(`label`,{class:`flt`,title:e.$t(`daq.khb8mru009`)},[p(`span`,null,o(e.$t(`daq.k1b2tkyv057`)),1),_(p(`select`,{"onUpdate:modelValue":t[30]||=e=>x(A).lineRun=e,class:`inp-sel`},[p(`option`,vr,o(e.$t(`daq.k3x4t1058`)),1),p(`option`,yr,o(e.$t(`daq.k1nxm3p7059`)),1),p(`option`,br,o(e.$t(`daq.k1ulx34e060`)),1)],512),[[C,x(A).lineRun]])],8,_r),p(`label`,xr,[p(`span`,null,o(e.$t(`daq.k1iwdfef061`)),1),_(p(`select`,{"onUpdate:modelValue":t[31]||=e=>x(A).state=e,class:`inp-sel`},[p(`option`,Sr,o(e.$t(`daq.k3x4t1058`)),1),p(`option`,Cr,o(e.$t(`daq.k41k5c062`)),1),p(`option`,wr,o(e.$t(`daq.k49z8v063`)),1),p(`option`,Tr,o(e.$t(`daq.k3xmid064`)),1),p(`option`,Er,o(e.$t(`daq.k44c2n065`)),1)],512),[[C,x(A).state]])]),p(`label`,Dr,[p(`span`,null,o(e.$t(`daq.k1flttpl010`)),1),_(p(`select`,{"onUpdate:modelValue":t[32]||=e=>x(A).template=e,class:`inp-sel`},[p(`option`,Or,o(e.$t(`daq.k1flttpl011`)),1),(s(!0),m(h,null,l(Te.value,e=>(s(),m(`option`,{key:e.ref,value:e.ref},o(e.label)+`(`+o(e.count)+`) `,9,kr))),128))],512),[[C,x(A).template]])]),p(`label`,Ar,[p(`span`,null,o(e.$t(`daq.k1fltdrv012`)),1),_(p(`select`,{"onUpdate:modelValue":t[33]||=e=>x(A).driver=e,class:`inp-sel`},[p(`option`,jr,o(e.$t(`daq.k1fltdrv013`)),1),(s(!0),m(h,null,l(Ee.value,e=>(s(),m(`option`,{key:e.kind,value:e.kind},o(e.label)+`(`+o(e.count)+`) `,9,Mr))),128))],512),[[C,x(A).driver]])]),p(`label`,{class:`flt`,title:e.$t(`daq.k1flttim014`)},[p(`span`,null,o(e.$t(`daq.k1flttim015`)),1),_(p(`select`,{"onUpdate:modelValue":t[34]||=e=>x(A).time=e,class:`inp-sel`},[p(`option`,Pr,o(e.$t(`daq.k1flttim016`)),1),p(`option`,Fr,o(e.$t(`daq.k1timlv017`)),1),p(`option`,Ir,o(e.$t(`daq.k1timhr018`)),1),p(`option`,Lr,o(e.$t(`daq.k1timdy019`)),1),p(`option`,Rr,o(e.$t(`daq.k1timld020`)),1),p(`option`,zr,o(e.$t(`daq.k1timnv021`)),1)],512),[[C,x(A).time]])],8,Nr),p(`label`,Br,[p(`span`,null,o(e.$t(`daq.k1fltsrc022`)),1),_(p(`input`,{"onUpdate:modelValue":t[35]||=e=>x(A).search=e,class:`inp-sel flt-search`,type:`search`,placeholder:e.$t(`daq.k1fltsph023`)},null,8,Vr),[[w,x(A).search]])]),Ce.value?(s(),m(`button`,{key:0,class:`mini-btn clear-btn`,onClick:we},o(e.$t(`daq.k1fygck2066`)),1)):g(``,!0)]),p(`span`,Hr,o(z.value.length)+` / `+o(x(O).nodes.length)+` `+o(e.$t(`daq.k45uio067`)),1)]),p(`div`,Ur,[p(`div`,{class:c([`ops-panel alarm-panel`,{live:x(O).alarms.length>0}])},[p(`div`,Wr,[t[57]||=p(`span`,{class:`i-tabler-bell-ringing bell`},null,-1),p(`b`,null,o(e.$t(`daq.k1alarm141`)),1),p(`span`,{class:c([`mono cnt`,{hot:x(O).alarms.length>0}])},o(x(O).alarms.length),3)]),p(`div`,Gr,[x(O).alarms.length===0?(s(),m(`p`,Kr,o(e.$t(`daq.k1evt001`)),1)):(s(!0),m(h,{key:1},l(x(O).alarms,n=>(s(),m(`div`,{key:n.id,class:`alarm-row`},[t[58]||=p(`span`,{class:`i-tabler-alert-triangle tri`},null,-1),p(`b`,null,o(n.nodeName),1),p(`span`,qr,o(n.metric),1),p(`span`,Jr,o(n.value)+` `+o(n.rule===`lt-min`?`<`:`>`)+` `+o(n.threshold),1),n.escalation>0?(s(),m(`small`,Yr,`+`+o(n.escalation),1)):g(``,!0),p(`button`,{class:`mini-btn ack`,onClick:e=>xe(n.id)},o(e.$t(`daq.k1ack142`)),9,Xr)]))),128))])],2),p(`div`,Zr,[p(`div`,Qr,[t[60]||=p(`span`,{class:`i-tabler-activity`},null,-1),p(`b`,null,o(e.$t(`daq.k1evt002`)),1),u(r,{class:`panel-link`,to:`/logs`},{default:b(()=>[S(o(e.$t(`daq.k1evt003`)),1),t[59]||=p(`span`,{class:`i-tabler-arrow-right`},null,-1)]),_:1})]),p(`div`,$r,[x(ve).recent.length===0?(s(),m(`p`,ei,o(e.$t(`daq.k1evt004`)),1)):(s(!0),m(h,{key:1},l(x(ve).recent,(t,n)=>(s(),m(`div`,{key:`${t.at}:${t.actor}:${t.action}:${n}`,class:`evt-row`},[p(`span`,ti,o(be(t.at)),1),p(`span`,{class:c([`src-badge`,t.actorKind])},o(t.actorKind===`agent`?`Agent`:t.actorKind===`user`?e.$t(`logs.src.user`):e.$t(`logs.src.system`)),3),p(`span`,{class:c([`kind-chip`,t.kind])},o(ye(t.kind)),3),p(`span`,{class:`txt`,title:t.summary},o(t.summary),9,ni)]))),128))])])]),p(`table`,{ref_key:`nodesTableRef`,ref:Ci,class:`nodes-table`},[p(`thead`,null,[p(`tr`,null,[p(`th`,null,o(e.$t(`daq.k45uio067`)),1),p(`th`,null,o(e.$t(`daq.k42w8s068`)),1),p(`th`,null,o(e.$t(`daq.k3mv305069`)),1),p(`th`,null,o(e.$t(`daq.k1trnd001`)),1),p(`th`,null,o(e.$t(`daq.k1l6g2ga070`)),1),p(`th`,null,o(e.$t(`daq.k3zi0nf071`)),1),p(`th`,null,o(e.$t(`daq.k4a0la072`)),1),p(`th`,null,o(e.$t(`daq.k3wj9n051`)),1),p(`th`,{title:e.$t(`daq.k1runtipc131`)},o(e.$t(`daq.k1b2tkyv057`)),9,ri),p(`th`,{title:e.$t(`daq.k1prdrtip132`)},o(e.$t(`daq.k1prodrc128`)),9,ii),p(`th`,null,o(e.$t(`daq.k1i8rtqt054`)),1),p(`th`,ai,o(e.$t(`daq.k40aa6073`)),1)])]),p(`tbody`,null,[Ti.value>0?(s(),m(`tr`,oi,[p(`td`,{colspan:11,style:n({height:Ti.value+`px`})},null,4)])):g(``,!0),(s(!0),m(h,null,l(wi.value,e=>(s(),v(i,{key:e.id,n:e},null,8,[`n`]))),128)),Ei.value>0?(s(),m(`tr`,si,[p(`td`,{colspan:11,style:n({height:Ei.value+`px`})},null,4)])):g(``,!0),x(O).loaded&&x(O).nodes.length===0?(s(),m(`tr`,ci,[p(`td`,li,[p(`div`,ui,[p(`p`,di,o(e.$t(`daq.kvhjyc3075`)),1)])])])):x(O).loaded&&z.value.length===0?(s(),m(`tr`,fi,[p(`td`,pi,[p(`div`,mi,[p(`p`,hi,o(e.$t(`daq.k1w20qew076`)),1)])])])):g(``,!0)])],512)])]),_:1},8,[`spinning`]),x(O).error?(s(),m(`p`,gi,[S(o(x(O).error)+`(`,1),u(r,{to:`/workshop`},{default:b(()=>[S(o(e.$t(`daq.k1bhhheq077`)),1)]),_:1}),t[61]||=S(`) `,-1)])):g(``,!0)])}}}),[[`__scopeId`,`data-v-8252d58d`]]);export{yi as default};
|