agentworkshop 0.7.7 → 0.7.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.AgentWorkShop/prompts/host-tools.json +1 -1
- package/.output/.AgentWorkShop/prompts/host-tools.json +1 -1
- package/.output/nitro.json +1 -1
- package/.output/public/_nuxt/-6OnbLFb.js +1 -0
- package/.output/public/_nuxt/{BUxYN2mw.js → -nb2uqVg.js} +1 -1
- package/.output/public/_nuxt/{DM8DS9MA.js → 6PZPfFcO.js} +1 -1
- package/.output/public/_nuxt/91DZTUMJ.js +1 -0
- package/.output/public/_nuxt/B0HpdCKS.js +1 -0
- package/.output/public/_nuxt/B1g8pJmr.js +2 -0
- package/.output/public/_nuxt/B1kA8LhC.js +14 -0
- package/.output/public/_nuxt/{uBbDCfTz.js → B5S_UyaC.js} +1 -1
- package/.output/public/_nuxt/{DZk24ego.js → B7wL3pDk.js} +1 -1
- package/.output/public/_nuxt/B9MUiDFl.js +1 -0
- package/.output/public/_nuxt/B9dLFSYI.js +1 -0
- package/.output/public/_nuxt/BC8s1Guv.js +1 -0
- package/.output/public/_nuxt/{BSXx2vqR.js → BCJFMBQ6.js} +1 -1
- package/.output/public/_nuxt/{BYL0Rjqj.js → BDASpD_i.js} +3 -3
- package/.output/public/_nuxt/{VnIWJ0ts.js → BN_PdN3J.js} +1 -1
- package/.output/public/_nuxt/BUPj10t4.js +1 -0
- package/.output/public/_nuxt/BZGNTgTQ2.js +1 -0
- package/.output/public/_nuxt/{NIM0Wglj2.js → BaMkWl5i2.js} +1 -1
- package/.output/public/_nuxt/BmHvC_OU.js +1 -0
- package/.output/public/_nuxt/{BkfchkK62.js → Bp5luxkg2.js} +1 -1
- package/.output/public/_nuxt/{ZugRk0CM2.js → BuktKVqK2.js} +1 -1
- package/.output/public/_nuxt/By8BpbKH.js +1 -0
- package/.output/public/_nuxt/{pRQri7vQ2.js → BytVi9VX2.js} +1 -1
- package/.output/public/_nuxt/{D5KJ7_0V.js → C3tCneTM.js} +1 -1
- package/.output/public/_nuxt/{CblLEiCZ.js → C9cU_Ujd.js} +3 -3
- package/.output/public/_nuxt/{BJ-fxrSw.js → CBciOiTQ.js} +1 -1
- package/.output/public/_nuxt/CFn4vHwD.js +1 -0
- package/.output/public/_nuxt/{DCXIGxzT.js → CKfhtOt7.js} +2 -2
- package/.output/public/_nuxt/CUMdhxg9.js +1 -0
- package/.output/public/_nuxt/{ChEKFMxj.js → CUXCQXjG.js} +1 -1
- package/.output/public/_nuxt/CfVAr2nf.js +1 -0
- package/.output/public/_nuxt/{CvbHIGQY2.js → CgvGu2IO.js} +1 -1
- package/.output/public/_nuxt/CjDQPXfv.js +1 -0
- package/.output/public/_nuxt/{B4Fia4FB.js → CmHzfVc5.js} +1 -1
- package/.output/public/_nuxt/{Do88WZG2.js → Cn3J3NXR.js} +1 -1
- package/.output/public/_nuxt/{DNzaswei.js → Cst47G4-.js} +1 -1
- package/.output/public/_nuxt/{DYZBdSSg2.js → Ct68Z0232.js} +1 -1
- package/.output/public/_nuxt/{BsMpJf7S.js → D-Ca4BGY.js} +6 -6
- package/.output/public/_nuxt/D0Szyn_D.js +1 -0
- package/.output/public/_nuxt/{CsCpu2Zh.js → D1z7i2UP.js} +1 -1
- package/.output/public/_nuxt/{Du-eSpo2.js → D3VJ3lex.js} +1 -1
- package/.output/public/_nuxt/D8CqF0yy.js +1 -0
- package/.output/public/_nuxt/D8EfUxO2.js +1 -0
- package/.output/public/_nuxt/D8wyHvcz2.js +1 -0
- package/.output/public/_nuxt/{zwdqvGN_.js → DDdEnkdw.js} +1 -1
- package/.output/public/_nuxt/DM4CNkXz.js +1 -0
- package/.output/public/_nuxt/DN5RuZ8k.js +18 -0
- package/.output/public/_nuxt/DXRZPxGs.js +1 -0
- package/.output/public/_nuxt/{C2iWjzEC2.js → DoLasgPj2.js} +1 -1
- package/.output/public/_nuxt/{DRq09ZmT.js → DpojD719.js} +1 -1
- package/.output/public/_nuxt/Dqj2h40U.js +1 -0
- package/.output/public/_nuxt/{BCipft_k2.js → DsUUYP292.js} +1 -1
- package/.output/public/_nuxt/DtBu71ev.js +32 -0
- package/.output/public/_nuxt/{fQUs58kX2.js → DvgKXPgu2.js} +1 -1
- package/.output/public/_nuxt/{C_gFA2H_2.js → DxrgFxIr2.js} +1 -1
- package/.output/public/_nuxt/Dy-mxvXY2.js +1 -0
- package/.output/public/_nuxt/G0qIw7Gq2.js +1 -0
- package/.output/public/_nuxt/{DCEyMaN-.js → MyA0Oeqd.js} +3 -3
- package/.output/public/_nuxt/{tRBT-plo.js → OV6PBW2z.js} +1 -1
- package/.output/public/_nuxt/TownView.BHLKAjEu.css +1 -0
- package/.output/public/_nuxt/VLI2Zy4t.js +5 -0
- package/.output/public/_nuxt/_id_.DIxEKj88.css +1 -0
- package/.output/public/_nuxt/_id_.DTvjd6VN.css +1 -0
- package/.output/public/_nuxt/{_wsId_.COUzMXpP.css → _wsId_.BFyCuUwS.css} +1 -1
- package/.output/public/_nuxt/agents.CEbox5-D.css +1 -0
- package/.output/public/_nuxt/builds/latest.json +1 -1
- package/.output/public/_nuxt/builds/meta/92d6bd39-dbc5-46d5-90d8-8387f36715fa.json +1 -0
- package/.output/public/_nuxt/channel-templates.De5ZvrGz.css +1 -0
- package/.output/public/_nuxt/daq.6IrhVVfy.css +1 -0
- package/.output/public/_nuxt/dcw.DcDjwvqv.css +1 -0
- package/.output/public/_nuxt/{default.V3_hUJq1.css → default.BR3e5fPY.css} +1 -1
- package/.output/public/_nuxt/{entry.DvlXlPwx.css → entry.5qf6EqfN.css} +1 -1
- package/.output/public/_nuxt/{Cyk3du4K2.js → kZV5TQvh2.js} +1 -1
- package/.output/public/_nuxt/logs.BO-BSyjm.css +1 -0
- package/.output/public/_nuxt/{D4qXvjuV.js → niDwBOZW.js} +2 -2
- package/.output/public/_nuxt/pKv_VWR4.js +1 -0
- package/.output/public/_nuxt/plugins.Clsky_kl.css +1 -0
- package/.output/public/_nuxt/rqZ-1SoP.js +2 -0
- package/.output/public/_nuxt/teams.CUMnbQGf.css +1 -0
- package/.output/public/_nuxt/tokens.BPLe9ioQ.css +1 -0
- package/.output/public/_nuxt/{C8dxXc6K.js → u7KWCGSb.js} +1 -1
- package/.output/public/_nuxt/{Bi6AiCuP.js → vJ4FPb-_.js} +1 -1
- package/.output/public/_nuxt/wirVyscc.js +1 -0
- package/.output/public/_nuxt/workshop.BIdoGfoC.css +1 -0
- package/.output/server/chunks/_/nitro.mjs +2042 -1967
- package/.output/server/chunks/_/nitro.mjs.map +1 -1
- package/.output/server/chunks/build/{TownView-B5KifIaT.mjs → TownView-D8DSdO3H.mjs} +182 -181
- package/.output/server/chunks/build/{TownView-B5KifIaT.mjs.map → TownView-D8DSdO3H.mjs.map} +1 -1
- package/.output/server/chunks/build/{_id_-Ct4Jhvl1.mjs → _id_-BV4FfiYd.mjs} +37 -36
- package/.output/server/chunks/build/_id_-BV4FfiYd.mjs.map +1 -0
- package/.output/server/chunks/build/{_id_-C-ewLgfl.mjs → _id_-TP9hvnBM.mjs} +126 -125
- package/.output/server/chunks/build/_id_-TP9hvnBM.mjs.map +1 -0
- package/.output/server/chunks/build/{_wsId_-CanI_6Su.mjs → _wsId_-Mm9sQSz2.mjs} +125 -124
- package/.output/server/chunks/build/{_wsId_-CanI_6Su.mjs.map → _wsId_-Mm9sQSz2.mjs.map} +1 -1
- package/.output/server/chunks/build/{agents-DSOptxXA.mjs → agents-To3a5xcZ.mjs} +16 -15
- package/.output/server/chunks/build/agents-To3a5xcZ.mjs.map +1 -0
- package/.output/server/chunks/build/api-error-dul30BYQ.mjs +47 -0
- package/.output/server/chunks/build/api-error-dul30BYQ.mjs.map +1 -0
- package/.output/server/chunks/build/{channel-templates-BK0KuPOd.mjs → channel-templates-DRsP-qxl.mjs} +23 -22
- package/.output/server/chunks/build/channel-templates-DRsP-qxl.mjs.map +1 -0
- package/.output/server/chunks/build/{daq-D9RA_uze.mjs → daq-_hCEaYLd.mjs} +112 -111
- package/.output/server/chunks/build/daq-_hCEaYLd.mjs.map +1 -0
- package/.output/server/chunks/build/{dcw-BTM5YU-B.mjs → dcw-C7pJ4Y0p.mjs} +47 -46
- package/.output/server/chunks/build/dcw-C7pJ4Y0p.mjs.map +1 -0
- package/.output/server/chunks/build/{default-BfWGTlbj.mjs → default-Dnjs36e8.mjs} +16 -15
- package/.output/server/chunks/build/{default-BfWGTlbj.mjs.map → default-Dnjs36e8.mjs.map} +1 -1
- package/.output/server/chunks/build/{logs-Dyk0I2I9.mjs → logs-C039TFW1.mjs} +38 -37
- package/.output/server/chunks/build/logs-C039TFW1.mjs.map +1 -0
- package/.output/server/chunks/build/{pages-DR2bzczM.mjs → pages-C_VSGSGo.mjs} +5 -4
- package/.output/server/chunks/build/pages-C_VSGSGo.mjs.map +1 -0
- package/.output/server/chunks/build/{plugins-DnOBIWGg.mjs → plugins-4FMWkN8d.mjs} +25 -22
- package/.output/server/chunks/build/plugins-4FMWkN8d.mjs.map +1 -0
- package/.output/server/chunks/build/table-Cswq-l2r.mjs +1 -1
- package/.output/server/chunks/build/{teams-BhSKBBBM.mjs → teams-DA1lkf1n.mjs} +19 -18
- package/.output/server/chunks/build/teams-DA1lkf1n.mjs.map +1 -0
- package/.output/server/chunks/build/{tokens-D_eyxmcv.mjs → tokens-DKMvvk3e.mjs} +18 -17
- package/.output/server/chunks/build/tokens-DKMvvk3e.mjs.map +1 -0
- package/.output/server/chunks/build/{town-DPtOPRRO.mjs → town-D0thZ7PK.mjs} +6 -5
- package/.output/server/chunks/build/town-D0thZ7PK.mjs.map +1 -0
- package/.output/server/chunks/build/{useDaqStream-hwkhJHFU.mjs → useDaqStream-BVTRw8_H.mjs} +5 -4
- package/.output/server/chunks/build/useDaqStream-BVTRw8_H.mjs.map +1 -0
- package/.output/server/chunks/build/{useDcwStream-Bdew_yrr.mjs → useDcwStream-DNsivqI_.mjs} +5 -4
- package/.output/server/chunks/build/useDcwStream-DNsivqI_.mjs.map +1 -0
- package/.output/server/chunks/build/{useDeviceTwins-C6EBg9oN.mjs → useDeviceTwins-WeIom7A6.mjs} +4 -3
- package/.output/server/chunks/build/useDeviceTwins-WeIom7A6.mjs.map +1 -0
- package/.output/server/chunks/build/useLocalTime-9a4B-aHv.mjs +1 -1
- package/.output/server/chunks/build/{useOpsLog-DdCqKVVG.mjs → useOpsLog-DcKnPO43.mjs} +5 -4
- package/.output/server/chunks/build/useOpsLog-DcKnPO43.mjs.map +1 -0
- package/.output/server/chunks/build/useWorkshopApi-D2gq06N2.mjs +1 -1
- package/.output/server/chunks/build/{workshop-iCzNRifn.mjs → workshop-BhWnJMWs.mjs} +50 -43
- package/.output/server/chunks/build/workshop-BhWnJMWs.mjs.map +1 -0
- package/.output/server/chunks/routes/api/users/setup-status.get.mjs +25 -0
- package/.output/server/chunks/routes/api/users/setup-status.get.mjs.map +1 -0
- package/.output/server/chunks/routes/api/workshop/caller.mjs +1 -1
- 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 +1 -1
- package/.output/server/chunks/routes/api/workshop/daq/_id/samples.get.mjs +3 -2
- package/.output/server/chunks/routes/api/workshop/daq/_id/samples.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/daq/index.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/daq/infra/reconnect.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/daq/infra.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/daq/templates/_key_.delete.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/daq/templates/_key_.patch.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/daq/test-driver.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/_id/bind.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/_id/param-ledger.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/_id/read.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/_id/test.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/_id/write.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/_id_.delete.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/_id_.patch.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/controller.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/index.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/index.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/index2.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/index2.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/index3.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/index4.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/journal/node/_nodeId/rollback.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/line/query.get.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/lines/_id_.delete.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/lines/_id_.patch.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id/judge.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id/rollback.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id/series.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id_.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/products/_id_.delete.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/products/_id_.patch.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/apply.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/mark-good.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/rollback-good.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/runs/_id/close.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/runs/_id/data.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/runs/_id/rollback.post.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/dcw/test-driver.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/device-twins/_id_.delete.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/index4.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/index4.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/index5.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/index6.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/plugins/_name/disable.post.mjs +3 -3
- package/.output/server/chunks/routes/api/workshop/plugins/_name/disable.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/plugins/_name/enable.post.mjs +3 -3
- package/.output/server/chunks/routes/api/workshop/plugins/_name/enable.post.mjs.map +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 +57 -23
- package/.output/server/chunks/virtual/precomputed.mjs +1 -1
- package/.output/server/package.json +1 -1
- package/README-zh.md +27 -7
- package/README.md +455 -435
- package/app/components/AppHeader.vue +1 -1
- package/app/components/workshop/A2aRpcDebugger.vue +1 -1
- package/app/components/workshop/AgentInspectorDrawer.vue +3 -3
- package/app/components/workshop/AgentLanesView.vue +6 -6
- package/app/components/workshop/AssetLibrary.vue +2 -2
- package/app/components/workshop/ChannelSessionList.vue +5 -5
- package/app/components/workshop/Composer.vue +1 -1
- package/app/components/workshop/DeviceTwinPanel.vue +2 -2
- package/app/components/workshop/TaskBoardView.vue +1 -1
- package/app/components/workshop/TaskInspectorDrawer.vue +2 -2
- package/app/components/workshop/town/TownView.vue +23 -23
- package/app/composables/workshop/apiClient.ts +1 -1
- package/app/composables/workshop/useCharacterAssets.ts +1 -1
- package/app/composables/workshop/useDaqStream.ts +1 -1
- package/app/composables/workshop/useDcwStream.ts +1 -1
- package/app/composables/workshop/useDeviceTwins.ts +1 -1
- package/app/composables/workshop/useOpsLog.ts +2 -2
- package/app/composables/workshop/useSceneLayouts.ts +1 -1
- package/app/pages/daq/[id].vue +1 -1
- package/app/pages/daq/index.vue +8 -8
- package/app/pages/dcw/[id].vue +13 -13
- package/app/pages/dcw/index.vue +7 -7
- package/app/pages/logs/index.vue +1 -1
- package/app/pages/plugins/index.vue +14 -6
- package/app/pages/tokens.vue +3 -3
- package/app/pages/workshop/agents.vue +2 -2
- package/app/pages/workshop/channel-templates.vue +3 -3
- package/app/pages/workshop/index.vue +29 -10
- package/app/pages/workshop/teams.vue +3 -3
- package/app/utils/api-error.ts +75 -0
- package/cli/commands/plugin.mjs +2 -2
- package/config.yml +11 -1
- package/i18n/dicts/settings.json +4 -0
- package/i18n/locales/en.ts +20 -3
- package/i18n/locales/zh-CN.ts +20 -3
- package/package.json +1 -1
- package/scripts/_dbg-codex-handshake.ts +30 -0
- package/scripts/_dbg-codex-sandbox.ts +58 -0
- package/scripts/_dbg-codex-turn.ts +65 -0
- package/scripts/_dbg-interval-config.mjs +156 -0
- package/scripts/_dbg-plugins-e2e.mjs +101 -0
- package/scripts/_dbg-repo-setup-verify.mjs +31 -0
- package/scripts/_dbg-setup-e2e.mjs +88 -0
- package/scripts/e2e-harness-provider-task.mjs +126 -0
- package/server/api/users/setup-status.get.ts +8 -0
- package/server/api/workshop/daq/[id]/samples.get.ts +4 -2
- package/server/api/workshop/plugins/[name]/disable.post.ts +5 -3
- package/server/api/workshop/plugins/[name]/enable.post.ts +5 -3
- package/server/data/daqs.json +138 -42
- package/server/data/dcw-lines.json +28 -0
- package/server/data/dcw-products.json +140 -0
- package/server/data/dcw-recipes.json +506 -0
- package/server/data/dcw-rollback.json +226 -6
- package/server/data/dcw-runs.json +1807 -1690
- package/server/data/dcw-writes.json +240 -0
- package/server/data/dcws.json +673 -173
- package/server/data/line-runs.json +26 -6
- package/server/plugins/security.ts +46 -50
- package/server/repositories/user.repository.ts +384 -414
- package/server/services/system-config.ts +7 -0
- package/server/services/user.service.ts +8 -3
- package/server/services/workshop/agents/adapters/line-spawn.ts +6 -3
- package/server/services/workshop/agents/host-tool-bridge.ts +21 -1
- package/server/services/workshop/agents/industrial-tools.ts +5 -3
- package/server/services/workshop/daq/daq-controller.ts +34 -6
- package/server/services/workshop/daq/daq-node.ts +3 -3
- package/server/services/workshop/daq/daq-runtime.ts +4 -3
- package/server/services/workshop/daq/storage/sqlite.adapter.ts +10 -5
- package/server/services/workshop/dcw/dcw-controller.ts +4 -2
- package/server/services/workshop/plugins/host.mjs +2 -1
- package/server/services/workshop/settings.ts +33 -0
- package/shared/config/schema.json +4 -0
- package/.output/public/_nuxt/2LwEn9gX.js +0 -2
- package/.output/public/_nuxt/3612gD2V.js +0 -32
- package/.output/public/_nuxt/8eIQAVlb.js +0 -1
- package/.output/public/_nuxt/Ah9qOv1m.js +0 -1
- package/.output/public/_nuxt/B7aqqzkY.js +0 -1
- package/.output/public/_nuxt/BH0Z05CS.js +0 -1
- package/.output/public/_nuxt/BJvGPTpC.js +0 -1
- package/.output/public/_nuxt/BVZjSVs2.js +0 -1
- package/.output/public/_nuxt/BVzDoF8t.js +0 -1
- package/.output/public/_nuxt/BjVLsC3M.js +0 -1
- package/.output/public/_nuxt/BnVoQ74r.js +0 -1
- package/.output/public/_nuxt/Bnp4vIAf.js +0 -1
- package/.output/public/_nuxt/Bt_HDizI.js +0 -5
- package/.output/public/_nuxt/Bu-P92Pe.js +0 -18
- package/.output/public/_nuxt/ButLXkjo.js +0 -2
- package/.output/public/_nuxt/By-LNp3k.js +0 -1
- package/.output/public/_nuxt/C-GarxYC.js +0 -1
- package/.output/public/_nuxt/CGdPdJPP.js +0 -1
- package/.output/public/_nuxt/CQiKcuoG.js +0 -14
- package/.output/public/_nuxt/CRGlf1Gb.js +0 -1
- package/.output/public/_nuxt/CS8R0_J3.js +0 -1
- package/.output/public/_nuxt/CUxV8Bw_.js +0 -1
- package/.output/public/_nuxt/Cd15nPnG2.js +0 -1
- package/.output/public/_nuxt/DNJSkm3Q.js +0 -1
- package/.output/public/_nuxt/DXK1U43I.js +0 -1
- package/.output/public/_nuxt/Dk6pq9JB2.js +0 -1
- package/.output/public/_nuxt/GP2wXyuY.js +0 -1
- package/.output/public/_nuxt/PQLnLxYe.js +0 -1
- package/.output/public/_nuxt/TownView.Bt33bo1M.css +0 -1
- package/.output/public/_nuxt/_id_.BzKMZnLe.css +0 -1
- package/.output/public/_nuxt/_id_.CbpDAWRh.css +0 -1
- package/.output/public/_nuxt/agents.BlejnOOC.css +0 -1
- package/.output/public/_nuxt/builds/meta/14df171d-89cb-43ec-ad6f-9df72d6da7f5.json +0 -1
- package/.output/public/_nuxt/channel-templates.lkqEYlWY.css +0 -1
- package/.output/public/_nuxt/daq.zZ8GR433.css +0 -1
- package/.output/public/_nuxt/dcw.C46dGiF_.css +0 -1
- package/.output/public/_nuxt/eHGLpQSg2.js +0 -1
- package/.output/public/_nuxt/logs.DaIsHWZE.css +0 -1
- package/.output/public/_nuxt/p7wSGMtc.js +0 -1
- package/.output/public/_nuxt/plugins.FTm0PcEe.css +0 -1
- package/.output/public/_nuxt/teams.B8JNbUZg.css +0 -1
- package/.output/public/_nuxt/tokens.CWOTXM-Z.css +0 -1
- package/.output/public/_nuxt/ubPfs9mQ.js +0 -1
- package/.output/public/_nuxt/workshop.B98sHiJq.css +0 -1
- package/.output/server/chunks/build/_id_-C-ewLgfl.mjs.map +0 -1
- package/.output/server/chunks/build/_id_-Ct4Jhvl1.mjs.map +0 -1
- package/.output/server/chunks/build/agents-DSOptxXA.mjs.map +0 -1
- package/.output/server/chunks/build/channel-templates-BK0KuPOd.mjs.map +0 -1
- package/.output/server/chunks/build/daq-D9RA_uze.mjs.map +0 -1
- package/.output/server/chunks/build/dcw-BTM5YU-B.mjs.map +0 -1
- package/.output/server/chunks/build/logs-Dyk0I2I9.mjs.map +0 -1
- package/.output/server/chunks/build/pages-DR2bzczM.mjs.map +0 -1
- package/.output/server/chunks/build/plugins-DnOBIWGg.mjs.map +0 -1
- package/.output/server/chunks/build/teams-BhSKBBBM.mjs.map +0 -1
- package/.output/server/chunks/build/tokens-D_eyxmcv.mjs.map +0 -1
- package/.output/server/chunks/build/town-DPtOPRRO.mjs.map +0 -1
- package/.output/server/chunks/build/useDaqStream-hwkhJHFU.mjs.map +0 -1
- package/.output/server/chunks/build/useDcwStream-Bdew_yrr.mjs.map +0 -1
- package/.output/server/chunks/build/useDeviceTwins-C6EBg9oN.mjs.map +0 -1
- package/.output/server/chunks/build/useOpsLog-DdCqKVVG.mjs.map +0 -1
- package/.output/server/chunks/build/workshop-iCzNRifn.mjs.map +0 -1
|
@@ -97,6 +97,11 @@ export class SystemConfigService {
|
|
|
97
97
|
private disposed = false
|
|
98
98
|
private applyWarned = false
|
|
99
99
|
|
|
100
|
+
/** 是否已完成 init()(descriptors 装载完毕;settings.ts 据此决定消费内存权威还是文件链) */
|
|
101
|
+
get ready(): boolean {
|
|
102
|
+
return this.descriptors.length > 0
|
|
103
|
+
}
|
|
104
|
+
|
|
100
105
|
constructor(readonly root: string) {
|
|
101
106
|
this.configPath = join(root, 'config.yml')
|
|
102
107
|
// 设置文件必须与 CLI(aw config set)/start/dev-guard 同源(resolveRunMode 单一入口):
|
|
@@ -222,6 +227,8 @@ export class SystemConfigService {
|
|
|
222
227
|
}
|
|
223
228
|
this.overrides = validated
|
|
224
229
|
this.recompute()
|
|
230
|
+
// 运行语义设置读取层(settings.ts effective 3s TTL)即时失效:live 键热重载零延迟
|
|
231
|
+
void import('./workshop/settings').then(m => m.invalidateRuntimeSettingsCache()).catch(() => {})
|
|
225
232
|
return { changed }
|
|
226
233
|
}
|
|
227
234
|
|
|
@@ -83,7 +83,8 @@ export const userService = {
|
|
|
83
83
|
|
|
84
84
|
// ===== 认证(公开端点)=====
|
|
85
85
|
|
|
86
|
-
/** 注册:创建账号 + 签发首个 token(邮箱/用户名占用 → 409
|
|
86
|
+
/** 注册:创建账号 + 签发首个 token(邮箱/用户名占用 → 409)。
|
|
87
|
+
* 首启初始化:系统尚无活跃管理员时,首个注册账号授予 admin(空库自注册建站) */
|
|
87
88
|
register(input: UserRegister): AuthResult {
|
|
88
89
|
if (userRepository.findByEmail(input.email)) {
|
|
89
90
|
throw new AppError(409, ErrorCodes.CONFLICT, '邮箱已被注册')
|
|
@@ -91,8 +92,12 @@ export const userService = {
|
|
|
91
92
|
if (userRepository.findByName(input.name)) {
|
|
92
93
|
throw new AppError(409, 'USER_EXISTS', `用户名已存在: ${input.name}`)
|
|
93
94
|
}
|
|
94
|
-
const
|
|
95
|
-
|
|
95
|
+
const needsBootstrap = !userRepository.hasActiveAdmin()
|
|
96
|
+
if (needsBootstrap) {
|
|
97
|
+
console.log(`[users] 初始化:尚无管理员账号,首个注册账号授予管理员角色(${input.email})`)
|
|
98
|
+
}
|
|
99
|
+
const user = userRepository.create({ ...input, role: needsBootstrap ? 'admin' : 'user', status: 'active' })
|
|
100
|
+
const { raw } = userRepository.createToken(user.id, needsBootstrap ? 'bootstrap-admin' : 'default')
|
|
96
101
|
return { user: this.publicProfile(user), token: raw }
|
|
97
102
|
},
|
|
98
103
|
|
|
@@ -84,11 +84,14 @@ export function spawnLineProcess(command: string, args: string[], options: LineS
|
|
|
84
84
|
const { file, needsCmd } = resolveExecutable(command)
|
|
85
85
|
const env = { ...process.env, ...options.env }
|
|
86
86
|
if (needsCmd) {
|
|
87
|
-
// Windows .cmd shim:固定包装器 'cmd.exe' + /d /s /c
|
|
88
|
-
|
|
87
|
+
// Windows .cmd shim:固定包装器 'cmd.exe' + /d /s /c。
|
|
88
|
+
// 可执行文件路径无条件引号包裹:无空格路径裸奔时,/s 模式的 cmd 会吞掉
|
|
89
|
+
// 路径中的反斜杠(C:\Users\... → C:Users...),引擎进程立即退出(code=1)。
|
|
90
|
+
// 参数仍逐个经 assertCmdSafeArg 校验(拒绝引号与控制字符),引号包裹不引入注入面。
|
|
91
|
+
const line = [`"${file}"`, ...args.map(a => assertCmdSafeArg(a)).map((token) => {
|
|
89
92
|
token = token.replace(/[\];&`<>$]/g, '^$1')
|
|
90
93
|
return token.includes(' ') ? `"${token}"` : token
|
|
91
|
-
}).join(' ')
|
|
94
|
+
})].join(' ')
|
|
92
95
|
return launchChildProcess('cmd.exe', ['/d', '/s', '/c', line], {
|
|
93
96
|
stdio: ['pipe', 'pipe', 'pipe'],
|
|
94
97
|
cwd: options.cwd ?? process.cwd(),
|
|
@@ -20,6 +20,7 @@ import type { A2AArtifact, Part } from '../types/a2a'
|
|
|
20
20
|
import type { WorkspaceTask } from '../types/task'
|
|
21
21
|
import type { RpcHostToolDefinition } from './adapters/omp-rpc-client'
|
|
22
22
|
import { loadHostToolDefs } from '../prompts/loader'
|
|
23
|
+
import { daqRuntimeSettings } from '../settings'
|
|
23
24
|
import { toolDaqFrames, toolDaqQuery, toolDcwControl, toolDcwJudge, toolDcwJournal, toolDcwRead, toolDcwRollback, toolMyIndustrialNodes } from './industrial-tools'
|
|
24
25
|
import { listPluginTools } from './plugin-tools'
|
|
25
26
|
import { extractTaskMode } from '../runtime/execution-mode'
|
|
@@ -39,6 +40,25 @@ export const LEAD_ONLY_TOOL_NAMES = new Set([
|
|
|
39
40
|
'remove_team_agent',
|
|
40
41
|
])
|
|
41
42
|
|
|
43
|
+
/** 占位符动态注入:工具描述里的运行时配置值(每次装配实时计算,配置热重载后 Agent 拿到新值) */
|
|
44
|
+
function applyDescriptionPlaceholders(tools: RpcHostToolDefinition[]): RpcHostToolDefinition[] {
|
|
45
|
+
let q: { defaultBucketMs: number, minBucketMs: number } | null = null
|
|
46
|
+
try {
|
|
47
|
+
q = daqRuntimeSettings().query
|
|
48
|
+
}
|
|
49
|
+
catch { /* 设置系统不可用(单测) → 保留原始描述 */ }
|
|
50
|
+
if (!q) return tools
|
|
51
|
+
const map: Record<string, string> = {
|
|
52
|
+
queryDefaultBucketMs: String(q.defaultBucketMs),
|
|
53
|
+
queryMinBucketMs: String(q.minBucketMs),
|
|
54
|
+
}
|
|
55
|
+
return tools.map(t => ({
|
|
56
|
+
...t,
|
|
57
|
+
description: t.description.replace(/\{(queryDefaultBucketMs|queryMinBucketMs)\}/g, (_, k) => map[k] ?? _),
|
|
58
|
+
parameters: JSON.parse(JSON.stringify(t.parameters ?? {}).replace(/\{(queryDefaultBucketMs|queryMinBucketMs)\}/g, (_m: string, k: string) => map[k] ?? _m)),
|
|
59
|
+
}))
|
|
60
|
+
}
|
|
61
|
+
|
|
42
62
|
/**
|
|
43
63
|
* 按角色装配 host tools:lead = 全量;worker = 剔除 lead 专属(执行面 + 通信面 + 记忆面);
|
|
44
64
|
* 尾部合并插件注册工具(roles 过滤,缺省双角色可用)。
|
|
@@ -54,7 +74,7 @@ export function hostToolsForRole(role: 'lead' | 'worker'): RpcHostToolDefinition
|
|
|
54
74
|
if (tool.roles && !tool.roles.includes(role)) continue
|
|
55
75
|
out.push({ name, label: tool.label ?? name, description: tool.description, parameters: tool.parameters ?? {} })
|
|
56
76
|
}
|
|
57
|
-
return out
|
|
77
|
+
return applyDescriptionPlaceholders(out)
|
|
58
78
|
}
|
|
59
79
|
|
|
60
80
|
/** 工具调用请求(与引擎协议解耦的规范化形状) */
|
|
@@ -14,6 +14,7 @@ import { nodeSemanticCards } from './industrial-context'
|
|
|
14
14
|
import { getDcwController } from '../dcw/dcw-controller'
|
|
15
15
|
import { getActiveLineRun } from '../dcw/line-run'
|
|
16
16
|
import { findDcwTemplate } from '../dcw/dcw-templates'
|
|
17
|
+
import { daqRuntimeSettings } from '../settings'
|
|
17
18
|
import { getDaqNodeRepo } from '../daq/daq-node.repo'
|
|
18
19
|
import { findDaqTemplate } from '../daq/daq-templates'
|
|
19
20
|
import { getRecipeRollBackManager } from '../dcw/recipe-rollback-manager'
|
|
@@ -258,11 +259,12 @@ export async function toolDaqQuery(agentId: string, args: {
|
|
|
258
259
|
|
|
259
260
|
const toMs = Number(args.to_ms) || Date.now()
|
|
260
261
|
const fromMs = Number(args.from_ms) || toMs - (Number(args.last_minutes) || 30) * 60_000
|
|
261
|
-
// 时间间隔参数(bucket_ms 降采样桶宽)
|
|
262
|
+
// 时间间隔参数(bucket_ms 降采样桶宽):缺省与下限来自 daq.query.*(live 配置,热重载)
|
|
263
|
+
const qCfg = daqRuntimeSettings().query
|
|
262
264
|
const rawBucket = Number(args.bucket_ms)
|
|
263
265
|
const bucketMs = Number.isFinite(rawBucket) && rawBucket > 0
|
|
264
|
-
? Math.max(
|
|
265
|
-
:
|
|
266
|
+
? Math.max(qCfg.minBucketMs, Math.min(3_600_000, Math.round(rawBucket)))
|
|
267
|
+
: qCfg.defaultBucketMs
|
|
266
268
|
const limit = Math.min(Number(args.limit) || 500, 2000)
|
|
267
269
|
const { getTsdb, tsdbReady } = await import('../daq/storage')
|
|
268
270
|
await tsdbReady
|
|
@@ -23,6 +23,8 @@
|
|
|
23
23
|
|
|
24
24
|
import { createLogger } from '../logger'
|
|
25
25
|
import { randomUUID } from 'node:crypto'
|
|
26
|
+
import { daqRuntimeSettings } from '../settings'
|
|
27
|
+
import { getSystemConfigService } from '../../system-config'
|
|
26
28
|
import { daqKeyFromRef, normalizeDataTransform, normalizeSignalKind, DAQ_DRIVERS, type AepDaqControllerState, type AepDaqFrame, type AepDaqReading, type AepDaqNodeChange, type DaqDriverKind, type DaqNodeView, type DataTransform, type DriverTestResult } from '../../../../shared/daq-protocol'
|
|
27
29
|
import { AppError, ErrorCodes } from '../../../utils/errors'
|
|
28
30
|
import { normalizeDriverKind, resolveDaqDriver, probeDriverAvailability, listPluginDrivers, type DaqFrameSample } from './drivers'
|
|
@@ -135,10 +137,15 @@ class DaqController {
|
|
|
135
137
|
private queueUnsub: (() => void) | null = null
|
|
136
138
|
/** 管线就绪前生产者静默(队列/消费必须先在位) */
|
|
137
139
|
private pipelineReady = false
|
|
140
|
+
/** 配置同步/订阅状态(daq.sampling live 配置 → 网关节拍;仅挂一次) */
|
|
141
|
+
private settingsSynced = false
|
|
142
|
+
private settingsUnsub: (() => void) | null = null
|
|
138
143
|
|
|
139
144
|
running = true
|
|
140
|
-
/** 全局缺省采集间隔(节点 intervalMs=null
|
|
145
|
+
/** 全局缺省采集间隔(节点 intervalMs=null 跟随;来源 = daq.sampling 配置,live 可调) */
|
|
141
146
|
defaultIntervalMs = 5000
|
|
147
|
+
/** 采样节拍下限(create/patch/存量收敛统一钳制;来源 = daq.sampling.minIntervalMs) */
|
|
148
|
+
minIntervalMs = 1000
|
|
142
149
|
/** 全局缺省 WS 下发间隔(节点 publishIntervalMs=null 跟随;0 = 随采样节拍) */
|
|
143
150
|
defaultPublishIntervalMs = 0
|
|
144
151
|
private producedCount = 0
|
|
@@ -150,6 +157,7 @@ class DaqController {
|
|
|
150
157
|
// ---------- 生命周期 ----------
|
|
151
158
|
|
|
152
159
|
private ensureLoop(): void {
|
|
160
|
+
this.applyRuntimeSettings()
|
|
153
161
|
this.syncRuntimes()
|
|
154
162
|
if (!this.queueInit) {
|
|
155
163
|
this.queueInit = (async () => {
|
|
@@ -169,8 +177,27 @@ class DaqController {
|
|
|
169
177
|
|
|
170
178
|
// ---------- 网关服务面(runtime host 实现;运行时只依赖此接口) ----------
|
|
171
179
|
|
|
172
|
-
|
|
173
|
-
|
|
180
|
+
/** 从运行时设置(daq.sampling.*)同步采样节拍默认值与下限。
|
|
181
|
+
* live 配置链:config.yml < runtime-settings.json < 环境变量 < 设置页/CLI;
|
|
182
|
+
* 设置变更经 system-config 订阅即时回流到这里(热重载,无需重启)。 */
|
|
183
|
+
applyRuntimeSettings(): void {
|
|
184
|
+
if (!this.settingsSynced) {
|
|
185
|
+
this.settingsSynced = true
|
|
186
|
+
try {
|
|
187
|
+
this.settingsUnsub = getSystemConfigService().subscribe(() => this.applyRuntimeSettings())
|
|
188
|
+
}
|
|
189
|
+
catch { /* 设置系统不可用(单测) → 用字段默认值 */ }
|
|
190
|
+
}
|
|
191
|
+
try {
|
|
192
|
+
const s = daqRuntimeSettings().sampling
|
|
193
|
+
if (Number.isFinite(s.defaultIntervalMs) && s.defaultIntervalMs > 0) this.defaultIntervalMs = Math.min(60_000, s.defaultIntervalMs)
|
|
194
|
+
if (Number.isFinite(s.minIntervalMs) && s.minIntervalMs > 0) this.minIntervalMs = Math.max(100, Math.min(this.defaultIntervalMs, s.minIntervalMs))
|
|
195
|
+
}
|
|
196
|
+
catch { /* settings 未就绪 → 保持当前值 */ }
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
private runtimeDefaults(): { intervalMs: number, publishIntervalMs: number, minIntervalMs: number } {
|
|
200
|
+
return { intervalMs: this.defaultIntervalMs, publishIntervalMs: this.defaultPublishIntervalMs, minIntervalMs: this.minIntervalMs }
|
|
174
201
|
}
|
|
175
202
|
|
|
176
203
|
/** 生产面:驱动采样一次(模板域 + 协议参数解析;mock/PLC 统一走驱动注册表)。
|
|
@@ -662,6 +689,7 @@ class DaqController {
|
|
|
662
689
|
return {
|
|
663
690
|
running: this.running,
|
|
664
691
|
defaultIntervalMs: this.defaultIntervalMs,
|
|
692
|
+
minIntervalMs: this.minIntervalMs,
|
|
665
693
|
defaultPublishIntervalMs: this.defaultPublishIntervalMs,
|
|
666
694
|
nodesTotal: nodes.length,
|
|
667
695
|
nodesOnline: this.running ? nodes.filter(n => n.enabled).length : 0,
|
|
@@ -768,7 +796,7 @@ class DaqController {
|
|
|
768
796
|
|
|
769
797
|
configure(opts: { defaultIntervalMs?: number, defaultPublishIntervalMs?: number }): AepDaqControllerState {
|
|
770
798
|
let changed = false
|
|
771
|
-
if (typeof opts.defaultIntervalMs === 'number' && opts.defaultIntervalMs >=
|
|
799
|
+
if (typeof opts.defaultIntervalMs === 'number' && opts.defaultIntervalMs >= this.minIntervalMs) {
|
|
772
800
|
this.defaultIntervalMs = Math.min(60_000, Math.round(opts.defaultIntervalMs))
|
|
773
801
|
changed = true
|
|
774
802
|
}
|
|
@@ -806,7 +834,7 @@ class DaqController {
|
|
|
806
834
|
driverConfig: input.driverConfig ?? {},
|
|
807
835
|
transform: normalizeDataTransform(input.transform),
|
|
808
836
|
enabled: input.enabled,
|
|
809
|
-
intervalMs: input.intervalMs == null ? null : Math.max(
|
|
837
|
+
intervalMs: input.intervalMs == null ? null : Math.max(this.minIntervalMs, Math.min(60_000, Math.round(input.intervalMs))),
|
|
810
838
|
publishIntervalMs: input.publishIntervalMs ?? null,
|
|
811
839
|
unit: input.unit,
|
|
812
840
|
decimals: input.decimals,
|
|
@@ -846,7 +874,7 @@ class DaqController {
|
|
|
846
874
|
if (patch.warnHigh !== undefined) node.warnHigh = patch.warnHigh
|
|
847
875
|
let rearm = false
|
|
848
876
|
if (patch.intervalMs !== undefined) {
|
|
849
|
-
node.intervalMs = patch.intervalMs == null ? null : Math.max(
|
|
877
|
+
node.intervalMs = patch.intervalMs == null ? null : Math.max(this.minIntervalMs, Math.min(60_000, Math.round(patch.intervalMs)))
|
|
850
878
|
rearm = true
|
|
851
879
|
}
|
|
852
880
|
if (patch.publishIntervalMs !== undefined) {
|
|
@@ -110,9 +110,9 @@ export class DaqNode {
|
|
|
110
110
|
return daqKeyFromRef(this.templateRef)
|
|
111
111
|
}
|
|
112
112
|
|
|
113
|
-
/** 有效采样周期(ms):节点覆盖 >
|
|
114
|
-
effectiveInterval(defaultIntervalMs: number): number {
|
|
115
|
-
return Math.max(
|
|
113
|
+
/** 有效采样周期(ms):节点覆盖 > 全局缺省;下限 = daq.sampling.minIntervalMs(live 可调,缺省 1s) */
|
|
114
|
+
effectiveInterval(defaultIntervalMs: number, minIntervalMs = 1000): number {
|
|
115
|
+
return Math.max(minIntervalMs, this.intervalMs ?? defaultIntervalMs)
|
|
116
116
|
}
|
|
117
117
|
|
|
118
118
|
/** 越限派生:硬限外 = alarm;预警带 2% 滞回(退出需越过内缩边界,防临界抖动)。
|
|
@@ -22,8 +22,8 @@ export const PUBLISH_INTERVAL_MAX = 60_000
|
|
|
22
22
|
|
|
23
23
|
/** 网关注入的服务面(运行时只依赖此接口;管线汇聚在网关侧) */
|
|
24
24
|
export interface DaqRuntimeHost {
|
|
25
|
-
/** 网关全局缺省(节点元数据为 null 时回退) */
|
|
26
|
-
defaults(): { intervalMs: number, publishIntervalMs: number }
|
|
25
|
+
/** 网关全局缺省(节点元数据为 null 时回退);minIntervalMs = 采样节拍下限(daq.sampling 配置) */
|
|
26
|
+
defaults(): { intervalMs: number, publishIntervalMs: number, minIntervalMs?: number }
|
|
27
27
|
/** 生产面:驱动采样一次(网关实现协议解析与模板域;多形态模板返回帧信封 ——
|
|
28
28
|
* 驱动原生形态或 controller 生产侧处理形态[图像已落对象存储]) */
|
|
29
29
|
sample(node: DaqNode, now: number): Promise<number | DaqFrameSample | { frame: NonNullable<DaqSampleEnvelope['frame']> } | null> | number | DaqFrameSample | { frame: NonNullable<DaqSampleEnvelope['frame']> } | null
|
|
@@ -84,7 +84,8 @@ export class DaqNodeRuntime {
|
|
|
84
84
|
async tick(now: number): Promise<void> {
|
|
85
85
|
const node = this.node
|
|
86
86
|
if (this.sampling || !node.enabled) return
|
|
87
|
-
|
|
87
|
+
const defs = this.host.defaults()
|
|
88
|
+
if (now < this.lastSampleAt + node.effectiveInterval(defs.intervalMs, defs.minIntervalMs)) return
|
|
88
89
|
this.sampling = true
|
|
89
90
|
try {
|
|
90
91
|
let v: number | DaqFrameSample | null = null
|
|
@@ -129,14 +129,17 @@ export class SqliteTimeSeriesAdapter implements TsdbPort {
|
|
|
129
129
|
const from = opts.fromMs ?? 0
|
|
130
130
|
const to = opts.toMs ?? Date.now()
|
|
131
131
|
if (opts.bucketMs && opts.bucketMs >= 100) {
|
|
132
|
-
|
|
132
|
+
// 桶宽是服务端 clamp 后的整数(Number.isInteger 由调用方保证);必须内插:
|
|
133
|
+
// node:sqlite 把整数值参数绑为 REAL 时 ts_ms/:b 走浮点除,同桶样本得到互不
|
|
134
|
+
// 相同的浮点桶键,GROUP BY 塌不了(输出≈原始点)。整数字面量保证整数除法。
|
|
135
|
+
const bucket = Math.round(Number(opts.bucketMs))
|
|
133
136
|
const rows = this.db.prepare(`
|
|
134
|
-
SELECT (ts_ms /
|
|
137
|
+
SELECT (ts_ms / ${bucket}) * ${bucket} AS b_at,
|
|
135
138
|
AVG(value) AS avg, MIN(value) AS min, MAX(value) AS max, COUNT(*) AS cnt
|
|
136
139
|
FROM daq_samples
|
|
137
140
|
WHERE node_id = :id AND ts_ms >= :from AND ts_ms <= :to
|
|
138
141
|
GROUP BY b_at ORDER BY b_at DESC LIMIT :lim
|
|
139
|
-
`).all({ ':id': nodeId, ':from': from, ':to': to, ':
|
|
142
|
+
`).all({ ':id': nodeId, ':from': from, ':to': to, ':lim': limit }) as Array<{ b_at: number, avg: number, min: number, max: number, cnt: number }>
|
|
140
143
|
return rows.map(r => ({ at: Number(r.b_at), avg: r.avg, min: r.min, max: r.max, cnt: Number(r.cnt) }))
|
|
141
144
|
}
|
|
142
145
|
const rows = this.db.prepare(`
|
|
@@ -178,11 +181,13 @@ export class SqliteTimeSeriesAdapter implements TsdbPort {
|
|
|
178
181
|
params.push(q.toMs ?? Date.now())
|
|
179
182
|
const limit = Math.min(q.limit ?? 2000, 10_000)
|
|
180
183
|
if (q.bucketMs && q.bucketMs >= 100) {
|
|
184
|
+
// 桶宽内插(整数,同 query():绑定参数会走 REAL 浮点除,塌不了桶)
|
|
185
|
+
const bucket = Math.round(Number(q.bucketMs))
|
|
181
186
|
const rows2 = (this.db.prepare(`
|
|
182
|
-
SELECT node_id, (ts_ms /
|
|
187
|
+
SELECT node_id, (ts_ms / ${bucket}) * ${bucket} AS b_at, AVG(value) AS avg, MIN(value) AS min, MAX(value) AS max, COUNT(*) AS cnt
|
|
183
188
|
FROM daq_samples WHERE ${where.join(' AND ')}
|
|
184
189
|
GROUP BY node_id, b_at ORDER BY b_at ASC LIMIT ?
|
|
185
|
-
`).all(
|
|
190
|
+
`).all(...params, limit)) as Array<{ node_id: string, b_at: number, avg: number, min: number, max: number, cnt: number }>
|
|
186
191
|
for (const r of rows2) {
|
|
187
192
|
const list = out.get(r.node_id) ?? []
|
|
188
193
|
list.push({ at: Number(r.b_at), avg: r.avg, min: r.min, max: r.max, cnt: Number(r.cnt) })
|
|
@@ -26,6 +26,7 @@ import { emitDcwWrite } from '@/server/services/workshop/plugins/host.mjs'
|
|
|
26
26
|
import { clearActiveLineRun, getActiveLineRun, getAllActiveLineRuns, setActiveLineRun } from './line-run'
|
|
27
27
|
import { getRecipeRollBackManager } from './recipe-rollback-manager'
|
|
28
28
|
import { recordOps } from '../ops/ops'
|
|
29
|
+
import { daqRuntimeSettings } from '../settings'
|
|
29
30
|
|
|
30
31
|
/** 运维日志写下发防噪:同节点同值 10s 内的心跳重下发不重复入册 */
|
|
31
32
|
const opsWriteMemo = new Map<string, { eng: number, at: number }>()
|
|
@@ -770,8 +771,9 @@ class DcwController {
|
|
|
770
771
|
await tsdbReady
|
|
771
772
|
const { getDaqNodeRepo } = await import('../daq/daq-node.repo')
|
|
772
773
|
const { findDaqTemplate } = await import('../daq/daq-templates')
|
|
773
|
-
// 时间间隔参数(bucketMs)
|
|
774
|
-
const
|
|
774
|
+
// 时间间隔参数(bucketMs):缺省与下限来自 daq.query.*(live 配置,热重载)
|
|
775
|
+
const { defaultBucketMs, minBucketMs } = daqRuntimeSettings().query
|
|
776
|
+
const bucketMs = opts.bucketMs == null ? defaultBucketMs : Math.max(minBucketMs, Math.min(3_600_000, Math.round(opts.bucketMs)))
|
|
775
777
|
const nodeFilter = opts.nodeId ? opts.nodeId.split(',').map(x => x.trim()).filter(Boolean) : []
|
|
776
778
|
const nodes = getDaqNodeRepo().all().filter((n) => {
|
|
777
779
|
if (opts.paramKey && n.templateKey !== opts.paramKey) return false
|
|
@@ -445,7 +445,7 @@ export function readClientScript(name) {
|
|
|
445
445
|
return { status: 200, code: readFileSync(rec.clientPath, 'utf8'), contentType: 'text/javascript; charset=utf-8' }
|
|
446
446
|
}
|
|
447
447
|
|
|
448
|
-
/** 清单(非敏感只读;含启停状态与路由) */
|
|
448
|
+
/** 清单(非敏感只读;含启停状态与路由)。builtin = 随项目检出提供的内置示例插件 */
|
|
449
449
|
export function pluginManifest() {
|
|
450
450
|
const host = getPluginHost()
|
|
451
451
|
if (!host) return []
|
|
@@ -454,6 +454,7 @@ export function pluginManifest() {
|
|
|
454
454
|
version: r.version,
|
|
455
455
|
description: r.description,
|
|
456
456
|
scope: r.scope,
|
|
457
|
+
builtin: r.scope === 'project',
|
|
457
458
|
enabled: r.enabled !== false,
|
|
458
459
|
hasClient: Boolean(r.clientPath),
|
|
459
460
|
routes: host.routes.byPlugin(r.name),
|
|
@@ -19,6 +19,16 @@ let cache: { at: number, effective: Record<string, unknown> } | null = null
|
|
|
19
19
|
const TTL_MS = 3000
|
|
20
20
|
|
|
21
21
|
function effective(): Record<string, unknown> {
|
|
22
|
+
// 首选:SystemConfigService 内存权威(设置页/CLI/文件监听三路写入的同一份即时状态,
|
|
23
|
+
// 热重载零延迟)。未装配(restart 键生效前的极早期/单测)回落文件链 + 3s TTL 缓存。
|
|
24
|
+
try {
|
|
25
|
+
const svc = (globalThis as { __systemConfig?: { ready?: boolean, snapshot?: () => { effective: Record<string, unknown> } } }).__systemConfig
|
|
26
|
+
if (svc?.ready && svc.snapshot) {
|
|
27
|
+
const snap = svc.snapshot()
|
|
28
|
+
if (Object.keys(snap.effective).length > 0) return snap.effective
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
catch { /* 服务不可用 → 文件链 */ }
|
|
22
32
|
if (cache && Date.now() - cache.at < TTL_MS) return cache.effective
|
|
23
33
|
const runMode = resolveRunMode({
|
|
24
34
|
cwd: process.cwd(),
|
|
@@ -34,6 +44,11 @@ function effective(): Record<string, unknown> {
|
|
|
34
44
|
return eff.effective
|
|
35
45
|
}
|
|
36
46
|
|
|
47
|
+
/** 主动失效进程内缓存:settings 写路径(PATCH/CLI/文件监听)变更后调用,使 live 键即时可见 */
|
|
48
|
+
export function invalidateRuntimeSettingsCache(): void {
|
|
49
|
+
cache = null
|
|
50
|
+
}
|
|
51
|
+
|
|
37
52
|
/** 按描述符键读单值(键必已注册 schema.json;缺键 = 描述符默认) */
|
|
38
53
|
export function settingOf(key: string): unknown {
|
|
39
54
|
return effective()[key]
|
|
@@ -111,6 +126,16 @@ export interface DaqRuntimeSettings {
|
|
|
111
126
|
qos: number
|
|
112
127
|
rejectUnauthorized: boolean
|
|
113
128
|
}
|
|
129
|
+
/** 采样节拍(节点 intervalMs 未显式指定时的默认值与可配置下限;live 可调) */
|
|
130
|
+
sampling: {
|
|
131
|
+
defaultIntervalMs: number
|
|
132
|
+
minIntervalMs: number
|
|
133
|
+
}
|
|
134
|
+
/** 时序查询节拍(bucketMs 缺省值与下限;samples/产线查询/Agent daq_query 共用) */
|
|
135
|
+
query: {
|
|
136
|
+
defaultBucketMs: number
|
|
137
|
+
minBucketMs: number
|
|
138
|
+
}
|
|
114
139
|
tsRetentionH: number
|
|
115
140
|
frameRetentionH: number
|
|
116
141
|
alarmWebhookUrl: string
|
|
@@ -143,6 +168,14 @@ export function daqRuntimeSettings(): DaqRuntimeSettings {
|
|
|
143
168
|
frameRetentionH: Number(get('frameRetentionH', 720)),
|
|
144
169
|
alarmWebhookUrl: String(get('alarmWebhookUrl', '')),
|
|
145
170
|
alarmEscalateMinutes: Number(get('alarmEscalateMinutes', 15)),
|
|
171
|
+
sampling: {
|
|
172
|
+
defaultIntervalMs: Number(get('sampling.defaultIntervalMs', 5000)),
|
|
173
|
+
minIntervalMs: Number(get('sampling.minIntervalMs', 1000)),
|
|
174
|
+
},
|
|
175
|
+
query: {
|
|
176
|
+
defaultBucketMs: Number(get('query.defaultBucketMs', 15000)),
|
|
177
|
+
minBucketMs: Number(get('query.minBucketMs', 1000)),
|
|
178
|
+
},
|
|
146
179
|
}
|
|
147
180
|
}
|
|
148
181
|
export function securityHitlTimeoutMs(): number {
|
|
@@ -38,6 +38,10 @@
|
|
|
38
38
|
{ "key": "daq.mqtt.password", "type": "string", "group": "daq", "label": "MQTT 密码", "labelKey": "settings.runtime.daq.mqttPassword", "description": "数采事件总线 MQTT 鉴权密码", "applies": "restart", "default": "", "aliases": ["DAQ_MQTT_PASSWORD"] },
|
|
39
39
|
{ "key": "daq.mqtt.caFile", "type": "string", "group": "daq", "label": "MQTT CA 证书", "labelKey": "settings.runtime.daq.mqttCaFile", "description": "mqtts 自签 CA 证书文件路径", "applies": "restart", "default": "", "aliases": ["DAQ_MQTT_CA_FILE"] },
|
|
40
40
|
{ "key": "daq.mqtt.rejectUnauthorized", "type": "boolean", "group": "daq", "label": "MQTT 校验证书", "labelKey": "settings.runtime.daq.mqttRejectUnauthorized", "description": "mqtts 是否校验服务端证书(自签调试可关)", "applies": "restart", "default": true, "aliases": ["DAQ_MQTT_REJECT_UNAUTHORIZED"] },
|
|
41
|
+
{ "key": "daq.sampling.defaultIntervalMs", "type": "number", "group": "daq", "label": "节点采样默认间隔(ms)", "labelKey": "settings.runtime.daq.samplingDefaultIntervalMs", "description": "数采节点未显式指定 intervalMs 时的采集周期(采样→入库→事件一拍)", "applies": "live", "default": 5000, "min": 200, "max": 60000, "aliases": ["DAQ_SAMPLING_DEFAULT_INTERVAL_MS"] },
|
|
42
|
+
{ "key": "daq.sampling.minIntervalMs", "type": "number", "group": "daq", "label": "节点采样下限(ms)", "labelKey": "settings.runtime.daq.samplingMinIntervalMs", "description": "数采节点允许配置的最小采样周期(create/patch/存量收敛统一钳制)", "applies": "live", "default": 1000, "min": 200, "max": 60000, "aliases": ["DAQ_SAMPLING_MIN_INTERVAL_MS"] },
|
|
43
|
+
{ "key": "daq.query.defaultBucketMs", "type": "number", "group": "daq", "label": "时序查询默认间隔(ms)", "labelKey": "settings.runtime.daq.queryDefaultBucketMs", "description": "Timescale 查询未指定 bucketMs 时的降采样桶宽(samples/产线查询/Agent daq_query 共用)", "applies": "live", "default": 15000, "min": 100, "max": 3600000, "aliases": ["DAQ_QUERY_DEFAULT_BUCKET_MS"] },
|
|
44
|
+
{ "key": "daq.query.minBucketMs", "type": "number", "group": "daq", "label": "时序查询下限(ms)", "labelKey": "settings.runtime.daq.queryMinBucketMs", "description": "时序查询允许的最小降采样桶宽(传入更小值时钳到该下限)", "applies": "live", "default": 1000, "min": 100, "max": 3600000, "aliases": ["DAQ_QUERY_MIN_BUCKET_MS"] },
|
|
41
45
|
{ "key": "daq.tsRetentionH", "type": "number", "group": "daq", "label": "标量时序保留(h)", "labelKey": "settings.runtime.daq.tsRetentionH", "description": "SQLite 仿真库标量样本保留小时数(Timescale 由 hypertable 策略管理)", "applies": "restart", "default": 168, "min": 1, "max": 8760, "aliases": ["DAQ_TS_RETENTION_H"] },
|
|
42
46
|
{ "key": "daq.frameRetentionH", "type": "number", "group": "daq", "label": "帧元数据保留(h)", "labelKey": "settings.runtime.daq.frameRetentionH", "description": "daq_frames 帧元数据保留小时数", "applies": "restart", "default": 720, "min": 1, "max": 8760, "aliases": ["DAQ_FRAME_RETENTION_H"] },
|
|
43
47
|
{ "key": "daq.alarmWebhookUrl", "type": "string", "group": "daq", "label": "告警 Webhook", "labelKey": "settings.runtime.daq.alarmWebhookUrl", "description": "告警升级推送的 Webhook 地址(空=不推送)", "applies": "restart", "default": "", "aliases": ["ALARM_WEBHOOK_URL"] },
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{$ as e,At as t,Bt as n,Ct as r,Dt as i,E as a,Et as o,Ft as s,Gt as c,It as l,Lt as u,M as d,Mt as f,Nt as p,Ot as m,Rt as ee,T as te,Tt as h,V as ne,Vt as g,X as _,Z as v,_ as re,_t as ie,a as ae,jt as oe,kt as y,n as b,r as x,u as se,v as ce,w as le,wt as ue,x as de,zt as S}from"./BSCpFtzG.js";var C=void 0,fe=typeof window<`u`&&window.trustedTypes;if(fe)try{C=fe.createPolicy(`vue`,{createHTML:e=>e})}catch{}var pe=C?e=>C.createHTML(e):e=>e,me=`http://www.w3.org/2000/svg`,he=`http://www.w3.org/1998/Math/MathML`,w=typeof document<`u`?document:null,ge=w&&w.createElement(`template`),_e={insert:(e,t,n)=>{t.insertBefore(e,n||null)},remove:e=>{let t=e.parentNode;t&&t.removeChild(e)},createElement:(e,t,n,r)=>{let i=t===`svg`?w.createElementNS(me,e):t===`mathml`?w.createElementNS(he,e):n?w.createElement(e,{is:n}):w.createElement(e);return e===`select`&&r&&r.multiple!=null&&i.setAttribute(`multiple`,r.multiple),i},createText:e=>w.createTextNode(e),createComment:e=>w.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>w.querySelector(e),setScopeId(e,t){e.setAttribute(t,``)},insertStaticContent(e,t,n,r,i,a){let o=n?n.previousSibling:t.lastChild;if(i&&(i===a||i.nextSibling))for(;t.insertBefore(i.cloneNode(!0),n),!(i===a||!(i=i.nextSibling)););else{ge.innerHTML=pe(r===`svg`?`<svg>${e}</svg>`:r===`mathml`?`<math>${e}</math>`:e);let i=ge.content;if(r===`svg`||r===`mathml`){let e=i.firstChild;for(;e.firstChild;)i.appendChild(e.firstChild);i.removeChild(e)}t.insertBefore(i,n)}return[o?o.nextSibling:t.firstChild,n?n.previousSibling:t.lastChild]}},T=`transition`,E=`animation`,D=Symbol(`_vtc`),ve={name:String,type:String,css:{type:Boolean,default:!0},duration:[String,Number,Object],enterFromClass:String,enterActiveClass:String,enterToClass:String,appearFromClass:String,appearActiveClass:String,appearToClass:String,leaveFromClass:String,leaveActiveClass:String,leaveToClass:String},ye=h({},x,ve),be=(e=>(e.displayName=`Transition`,e.props=ye,e))((e,{slots:t})=>a(b,Se(e),t)),O=(e,t=[])=>{y(e)?e.forEach(e=>e(...t)):e&&e(...t)},xe=e=>e?y(e)?e.some(e=>e.length>1):e.length>1:!1;function Se(e){let t={};for(let n in e)n in ve||(t[n]=e[n]);if(e.css===!1)return t;let{name:n=`v`,type:r,duration:i,enterFromClass:a=`${n}-enter-from`,enterActiveClass:o=`${n}-enter-active`,enterToClass:s=`${n}-enter-to`,appearFromClass:c=a,appearActiveClass:l=o,appearToClass:u=s,leaveFromClass:d=`${n}-leave-from`,leaveActiveClass:f=`${n}-leave-active`,leaveToClass:p=`${n}-leave-to`}=e,m=Ce(i),ee=m&&m[0],te=m&&m[1],{onBeforeEnter:ne,onEnter:g,onEnterCancelled:_,onLeave:v,onLeaveCancelled:re,onBeforeAppear:ie=ne,onAppear:ae=g,onAppearCancelled:oe=_}=t,y=(e,t,n,r)=>{e._enterCancelled=r,j(e,t?u:s),j(e,t?l:o),n&&n()},b=(e,t)=>{e._isLeaving=!1,j(e,d),j(e,p),j(e,f),t&&t()},x=e=>(t,n)=>{let i=e?ae:g,o=()=>y(t,e,n);O(i,[t,o]),we(()=>{j(t,e?c:a),A(t,e?u:s),xe(i)||Ee(t,r,ee,o)})};return h(t,{onBeforeEnter(e){O(ne,[e]),A(e,a),A(e,o)},onBeforeAppear(e){O(ie,[e]),A(e,c),A(e,l)},onEnter:x(!1),onAppear:x(!0),onLeave(e,t){e._isLeaving=!0;let n=()=>b(e,t);A(e,d),e._enterCancelled?(A(e,f),M(e)):(M(e),A(e,f)),we(()=>{e._isLeaving&&(j(e,d),A(e,p),xe(v)||Ee(e,r,te,n))}),O(v,[e,n])},onEnterCancelled(e){y(e,!1,void 0,!0),O(_,[e])},onAppearCancelled(e){y(e,!0,void 0,!0),O(oe,[e])},onLeaveCancelled(e){b(e),O(re,[e])}})}function Ce(e){if(e==null)return null;if(f(e))return[k(e.enter),k(e.leave)];{let t=k(e);return[t,t]}}function k(e){return c(e)}function A(e,t){t.split(/\s+/).forEach(t=>t&&e.classList.add(t)),(e[D]||(e[D]=new Set)).add(t)}function j(e,t){t.split(/\s+/).forEach(t=>t&&e.classList.remove(t));let n=e[D];n&&(n.delete(t),n.size||(e[D]=void 0))}function we(e){requestAnimationFrame(()=>{requestAnimationFrame(e)})}var Te=0;function Ee(e,t,n,r){let i=e._endId=++Te,a=()=>{i===e._endId&&r()};if(n!=null)return setTimeout(a,n);let{type:o,timeout:s,propCount:c}=De(e,t);if(!o)return r();let l=o+`end`,u=0,d=()=>{e.removeEventListener(l,f),a()},f=t=>{t.target===e&&++u>=c&&d()};setTimeout(()=>{u<c&&d()},s+1),e.addEventListener(l,f)}function De(e,t){let n=window.getComputedStyle(e),r=e=>(n[e]||``).split(`, `),i=r(`${T}Delay`),a=r(`${T}Duration`),o=Oe(i,a),s=r(`${E}Delay`),c=r(`${E}Duration`),l=Oe(s,c),u=null,d=0,f=0;t===T?o>0&&(u=T,d=o,f=a.length):t===E?l>0&&(u=E,d=l,f=c.length):(d=Math.max(o,l),u=d>0?o>l?T:E:null,f=u?u===T?a.length:c.length:0);let p=u===T&&/\b(?:transform|all)(?:,|$)/.test(r(`${T}Property`).toString());return{type:u,timeout:d,propCount:f,hasTransform:p}}function Oe(e,t){for(;e.length<t.length;)e=e.concat(e);return Math.max(...t.map((t,n)=>ke(t)+ke(e[n])))}function ke(e){return e===`auto`?0:Number(e.slice(0,-1).replace(`,`,`.`))*1e3}function M(e){return(e?e.ownerDocument:document).body.offsetHeight}function Ae(e,t,n){let r=e[D];r&&(t=(t?[t,...r]:[...r]).join(` `)),t==null?e.removeAttribute(`class`):n?e.setAttribute(`class`,t):e.className=t}var N=Symbol(`_vod`),P=Symbol(`_vsh`),je={name:`show`,beforeMount(e,{value:t},{transition:n}){e[N]=e.style.display===`none`?``:e.style.display,n&&t?n.beforeEnter(e):F(e,t)},mounted(e,{value:t},{transition:n}){n&&t&&n.enter(e)},updated(e,{value:t,oldValue:n},{transition:r}){!t!=!n&&(r?t?(r.beforeEnter(e),F(e,!0),r.enter(e)):r.leave(e,()=>{F(e,!1)}):F(e,t))},beforeUnmount(e,{value:t}){F(e,t)}};function F(e,t){e.style.display=t?e[N]:`none`,e[P]=!t}var Me=Symbol(``),Ne=/(?:^|;)\s*display\s*:/;function Pe(e,t,n){let r=e.style,i=u(n),a=!1;if(n&&!i){if(t){if(u(t))for(let e of t.split(`;`)){let t=e.slice(0,e.indexOf(`:`)).trim();n[t]??I(r,t,``)}else for(let e in t)n[e]??I(r,e,``)}for(let i in n){i===`display`&&(a=!0);let o=n[i];o==null?I(r,i,``):Re(e,i,!u(t)&&t?t[i]:void 0,o)||I(r,i,o)}}else if(i){if(t!==n){let e=r[Me];e&&(n+=`;`+e),r.cssText=n,a=Ne.test(n)}}else t&&e.removeAttribute(`style`);N in e&&(e[N]=a?r.display:``,e[P]&&(r.display=`none`))}var Fe=/\s*!important$/;function I(e,t,n){if(y(n))n.forEach(n=>I(e,t,n));else if(n??=``,t.startsWith(`--`))e.setProperty(t,n);else{let r=Le(e,t);Fe.test(n)?e.setProperty(o(r),n.replace(Fe,``),`important`):e[r]=n}}var Ie=[`Webkit`,`Moz`,`ms`],L={};function Le(e,t){let n=L[t];if(n)return n;let i=r(t);if(i!==`filter`&&i in e)return L[t]=i;i=ue(i);for(let n=0;n<Ie.length;n++){let r=Ie[n]+i;if(r in e)return L[t]=r}return t}function Re(e,t,n,r){return e.tagName===`TEXTAREA`&&(t===`width`||t===`height`)&&u(r)&&n===r}var ze=`http://www.w3.org/1999/xlink`;function Be(e,t,n,r,a,o=l(t)){r&&t.startsWith(`xlink:`)?n==null?e.removeAttributeNS(ze,t.slice(6,t.length)):e.setAttributeNS(ze,t,n):n==null||o&&!i(n)?e.removeAttribute(t):e.setAttribute(t,o?``:ee(n)?String(n):n)}function Ve(e,t,n,r,a){if(t===`innerHTML`||t===`textContent`){n!=null&&(e[t]=t===`innerHTML`?pe(n):n);return}let o=e.tagName;if(t===`value`&&o!==`PROGRESS`&&!o.includes(`-`)){let r=o===`OPTION`?e.getAttribute(`value`)||``:e.value,i=n==null?e.type===`checkbox`?`on`:``:String(n);(r!==i||!(`_value`in e))&&(e.value=i),n??e.removeAttribute(t),e._value=n;return}let s=!1;if(n===``||n==null){let r=typeof e[t];r===`boolean`?n=i(n):n==null&&r===`string`?(n=``,s=!0):r===`number`&&(n=0,s=!0)}try{e[t]=n}catch{}s&&e.removeAttribute(a||t)}function R(e,t,n,r){e.addEventListener(t,n,r)}function He(e,t,n,r){e.removeEventListener(t,n,r)}var Ue=Symbol(`_vei`);function We(e,t,n,r,i=null){let a=e[Ue]||(e[Ue]={}),o=a[t];if(r&&o)o.value=r;else{let[n,s]=qe(t);r?R(e,n,a[t]=Ze(r,i),s):o&&(He(e,n,o,s),a[t]=void 0)}}var Ge=/(Once|Passive|Capture)$/,Ke=/^on:?(?:Once|Passive|Capture)$/;function qe(e){let t,n;for(;(n=e.match(Ge))&&!Ke.test(e);)t||={},e=e.slice(0,e.length-n[1].length),t[n[1].toLowerCase()]=!0;return[e[2]===`:`?e.slice(3):o(e.slice(2)),t]}var Je=0,Ye=Promise.resolve(),Xe=()=>Je||=(Ye.then(()=>Je=0),Date.now());function Ze(e,t){let n=e=>{if(!e._vts)e._vts=Date.now();else if(e._vts<=n.attached)return;let r=n.value;if(y(r)){let n=e.stopImmediatePropagation;e.stopImmediatePropagation=()=>{n.call(e),e._stopped=!0};let i=r.slice(),a=[e];for(let n=0;n<i.length&&!e._stopped;n++){let e=i[n];e&&se(e,t,5,a)}}else se(r,t,5,[e])};return n.value=e,n.attached=Xe(),n}var Qe=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&e.charCodeAt(2)>96&&e.charCodeAt(2)<123,$e=(e,t,n,i,a,o)=>{let s=a===`svg`;t===`class`?Ae(e,i,s):t===`style`?Pe(e,n,i):p(t)?oe(t)||We(e,t,n,i,o):(t[0]===`.`?(t=t.slice(1),!0):t[0]===`^`?(t=t.slice(1),!1):et(e,t,i,s))?(Ve(e,t,i),!e.tagName.includes(`-`)&&(t===`value`||t===`checked`||t===`selected`)&&Be(e,t,i,s,o,t!==`value`)):e._isVueCE&&(tt(e,t)||e._def.__asyncLoader&&(/[A-Z]/.test(t)||!u(i)))?Ve(e,r(t),i,o,t):(t===`true-value`?e._trueValue=i:t===`false-value`&&(e._falseValue=i),Be(e,t,i,s))};function et(e,n,r,i){if(i)return!!(n===`innerHTML`||n===`textContent`||n in e&&Qe(n)&&t(r));if(n===`spellcheck`||n===`draggable`||n===`translate`||n===`autocorrect`||n===`sandbox`&&e.tagName===`IFRAME`||n===`form`||n===`list`&&e.tagName===`INPUT`||n===`type`&&e.tagName===`TEXTAREA`)return!1;if(n===`width`||n===`height`){let t=e.tagName;if(t===`IMG`||t===`VIDEO`||t===`CANVAS`||t===`SOURCE`)return!1}return Qe(n)&&u(r)?!1:n in e}function tt(e,t){let n=e._def.props;if(!n)return!1;let i=r(t);return Array.isArray(n)?n.some(e=>r(e)===i):Object.keys(n).some(e=>r(e)===i)}var nt=new WeakMap,rt=new WeakMap,z=Symbol(`_moveCb`),it=Symbol(`_enterCb`),at=(e=>(delete e.props.mode,e))({name:`TransitionGroup`,props:h({},ye,{tag:String,moveClass:String}),setup(t,{slots:n}){let r=le(),i=e(),a,o;return ne(()=>{if(!a.length)return;let e=t.moveClass||`${t.name||`v`}-move`;if(!ut(a[0].el,r.vnode.el,e)){a=[];return}a.forEach(ot),a.forEach(st);let n=a.filter(ct);M(r.vnode.el),n.forEach(t=>{let n=t.el,r=n.style;A(n,e),r.transform=r.webkitTransform=r.transitionDuration=``;let i=n[z]=t=>{t&&t.target!==n||(!t||t.propertyName.endsWith(`transform`))&&(n.removeEventListener(`transitionend`,i),n[z]=null,j(n,e))};n.addEventListener(`transitionend`,i)}),a=[]}),()=>{let e=ie(t),s=Se(e),c=e.tag||ae;if(a=[],o)for(let e=0;e<o.length;e++){let t=o[e];t.el&&t.el instanceof Element&&!t.el[P]&&(a.push(t),v(t,_(t,s,i,r)),nt.set(t,lt(t.el)))}o=n.default?te(n.default()):[];for(let e=0;e<o.length;e++){let t=o[e];t.key!=null&&v(t,_(t,s,i,r))}return de(c,null,o)}}});function ot(e){let t=e.el;t[z]&&t[z](),t[it]&&t[it]()}function st(e){rt.set(e,lt(e.el))}function ct(e){let t=nt.get(e),n=rt.get(e),r=t.left-n.left,i=t.top-n.top;if(r||i){let t=e.el,n=t.style,a=t.getBoundingClientRect(),o=1,s=1;return t.offsetWidth&&(o=a.width/t.offsetWidth),t.offsetHeight&&(s=a.height/t.offsetHeight),(!Number.isFinite(o)||o===0)&&(o=1),(!Number.isFinite(s)||s===0)&&(s=1),Math.abs(o-1)<.01&&(o=1),Math.abs(s-1)<.01&&(s=1),n.transform=n.webkitTransform=`translate(${r/o}px,${i/s}px)`,n.transitionDuration=`0s`,e}}function lt(e){let t=e.getBoundingClientRect();return{left:t.left,top:t.top}}function ut(e,t,n){let r=e.cloneNode(),i=e[D];i&&i.forEach(e=>{e.split(/\s+/).forEach(e=>e&&r.classList.remove(e))}),n.split(/\s+/).forEach(e=>e&&r.classList.add(e)),r.style.display=`none`;let a=t.nodeType===1?t:t.parentNode;a.appendChild(r);let{hasTransform:o}=De(r);return a.removeChild(r),o}var B=e=>{let t=e.props[`onUpdate:modelValue`]||!1;return y(t)?e=>m(t,e):t};function dt(e){e.target.composing=!0}function ft(e){let t=e.target;t.composing&&(t.composing=!1,t.dispatchEvent(new Event(`input`)))}var V=Symbol(`_assign`),H=Symbol(`_initialValue`);function U(e,t,n){return t&&(e=e.trim()),n&&(e=g(e)),e}var W={created(e,{modifiers:{lazy:t,trim:n,number:r}},i){e.parentNode&&(e.type===`text`?e[H]=e.defaultValue.replace(/[\r\n]/g,``):e.type===`textarea`&&(e[H]=e.defaultValue.replace(/\r\n?/g,`
|
|
2
|
-
`))),e[V]=B(i);let a=r||i.props&&i.props.type===`number`;R(e,t?`change`:`input`,t=>{t.target.composing||e[V](U(e.value,n,a))}),(n||a)&&R(e,`change`,()=>{e.value=U(e.value,n,a)}),t||(R(e,`compositionstart`,dt),R(e,`compositionend`,ft),R(e,`change`,ft))},mounted(e,{value:t,modifiers:{trim:n,number:r}}){let i=t??``,a=e[H];delete e[H],a!==void 0&&(e.type===`text`||e.type===`textarea`)&&e.value!==a?e[V](U(e.value,n,r)):e.value=i},beforeUpdate(e,{value:t,oldValue:n,modifiers:{lazy:r,trim:i,number:a}},o){if(e[V]=B(o),e.composing)return;let s=(a||e.type===`number`)&&!/^0\d/.test(e.value)?g(e.value):e.value,c=t??``;if(s===c)return;let l=e.getRootNode();(l instanceof Document||l instanceof ShadowRoot)&&l.activeElement===e&&e.type!==`range`&&(r&&t===n||i&&e.value.trim()===c)||(e.value=c)}},pt={deep:!0,created(e,t,r){e[V]=B(r),R(e,`change`,()=>{let t=e._modelValue,r=G(e),i=e.checked,a=e[V];if(y(t)){let e=n(t,r),o=e!==-1;if(i&&!o)a(t.concat(r));else if(!i&&o){let n=[...t];n.splice(e,1),a(n)}}else if(s(t)){let e=new Set(t);i?e.add(r):e.delete(r),a(e)}else a(vt(e,i))})},mounted:mt,beforeUpdate(e,t,n){e[V]=B(n),mt(e,t,n)}};function mt(e,{value:t,oldValue:r},i){e._modelValue=t;let a;if(y(t))a=n(t,i.props.value)>-1;else if(s(t))a=t.has(i.props.value);else{if(t===r)return;a=S(t,vt(e,!0))}e.checked!==a&&(e.checked=a)}var ht={created(e,{value:t},n){e.checked=S(t,n.props.value),e[V]=B(n),R(e,`change`,()=>{e[V](G(e))})},beforeUpdate(e,{value:t,oldValue:n},r){e[V]=B(r),t!==n&&(e.checked=S(t,r.props.value))}},gt={deep:!0,created(e,{value:t,modifiers:{number:n}},r){e._modelValue=t,R(e,`change`,()=>{let t=Array.prototype.filter.call(e.options,e=>e.selected).map(e=>n?g(G(e)):G(e));e[V](e.multiple?s(e._modelValue)?new Set(t):t:t[0]),e._assigning=!0,d(()=>{e._assigning=!1})}),e[V]=B(r)},mounted(e,{value:t}){_t(e,t)},beforeUpdate(e,{value:t},n){e._modelValue=t,e[V]=B(n)},updated(e,{value:t}){e._assigning||_t(e,t)}};function _t(e,t){let r=e.multiple,i=y(t);if(!(r&&!i&&!s(t))){for(let a=0,o=e.options.length;a<o;a++){let o=e.options[a],s=G(o);if(r){if(i){let e=typeof s;o.selected=e===`string`||e===`number`?t.some(e=>String(e)===String(s)):n(t,s)>-1}else o.selected=t.has(s)}else if(S(G(o),t)){e.selectedIndex!==a&&(e.selectedIndex=a);return}}!r&&e.selectedIndex!==-1&&(e.selectedIndex=-1)}}function G(e){return`_value`in e?e._value:e.value}function vt(e,t){let n=t?`_trueValue`:`_falseValue`;return n in e?e[n]:t}var yt={created(e,t,n){K(e,t,n,null,`created`)},mounted(e,t,n){K(e,t,n,null,`mounted`)},beforeUpdate(e,t,n,r){K(e,t,n,r,`beforeUpdate`)},updated(e,t,n,r){K(e,t,n,r,`updated`)}};function bt(e,t){switch(e){case`SELECT`:return gt;case`TEXTAREA`:return W;default:switch(t){case`checkbox`:return pt;case`radio`:return ht;default:return W}}}function K(e,t,n,r,i){let a=bt(e.tagName,n.props&&n.props.type)[i];a&&a(e,t,n,r)}var xt=[`ctrl`,`shift`,`alt`,`meta`],St={stop:e=>e.stopPropagation(),prevent:e=>e.preventDefault(),self:e=>e.target!==e.currentTarget,ctrl:e=>!e.ctrlKey,shift:e=>!e.shiftKey,alt:e=>!e.altKey,meta:e=>!e.metaKey,left:e=>`button`in e&&e.button!==0,middle:e=>`button`in e&&e.button!==1,right:e=>`button`in e&&e.button!==2,exact:(e,t)=>xt.some(n=>e[`${n}Key`]&&!t.includes(n))},Ct=(e,t)=>{if(!e)return e;let n=e._withMods||={},r=t.join(`.`);return n[r]||(n[r]=((n,...r)=>{for(let e=0;e<t.length;e++){let r=St[t[e]];if(r&&r(n,t))return}return e(n,...r)}))},wt={esc:`escape`,space:` `,up:`arrow-up`,left:`arrow-left`,right:`arrow-right`,down:`arrow-down`,delete:`backspace`},Tt=(e,t)=>{let n=e._withKeys||={},r=t.join(`.`);return n[r]||(n[r]=(n=>{if(!(`key`in n))return;let r=o(n.key);if(t.some(e=>e===r||wt[e]===r))return e(n)}))},Et=h({patchProp:$e},_e),q,Dt=!1;function Ot(){return q||=ce(Et)}function kt(){return q=Dt?q:re(Et),Dt=!0,q}var At=((...e)=>{Ot().render(...e)}),jt=((...e)=>{let n=Ot().createApp(...e),{mount:r}=n;return n.mount=e=>{let i=Pt(e);if(!i)return;let a=n._component;!t(a)&&!a.render&&!a.template&&(a.template=i.innerHTML),i.nodeType===1&&(i.textContent=``);let o=r(i,!1,Nt(i));return i instanceof Element&&(i.removeAttribute(`v-cloak`),i.setAttribute(`data-v-app`,``)),o},n}),Mt=((...e)=>{let t=kt().createApp(...e),{mount:n}=t;return t.mount=e=>{let t=Pt(e);if(t)return n(t,!0,Nt(t))},t});function Nt(e){if(e instanceof SVGElement)return`svg`;if(typeof MathMLElement==`function`&&e instanceof MathMLElement)return`mathml`}function Pt(e){return u(e)?document.querySelector(e):e}var Ft={name:`page-fade`,mode:`out-in`},It={meta:[{charset:`utf-8`},{name:`viewport`,content:`width=device-width, initial-scale=1`},{name:`description`,content:`基于 Nuxt 4 的配置驱动运行范式`}],link:[{rel:`icon`,type:`image/svg+xml`,href:`/favicon.svg`}],style:[],script:[],noscript:[],title:`AgentWorkShop`,htmlAttrs:{lang:`zh-CN`}},Lt={id:`__nuxt-loader`},Rt={componentName:`NuxtLink`,prefetch:!0,prefetchOn:{visibility:!0}},zt={deep:!1},Bt={},Vt=`#__nuxt`,Ht=`nuxt-app`,Ut=36e5,Wt=`vite:preloadError`,Gt=/bot\b|chrome-lighthouse|facebookexternalhit|google\b/i;function Kt(e){return Gt.test(e)}import.meta.url.replace(/\/app\/.*$/,`/`),String.fromCharCode;var qt=/#/g,Jt=/&/g,Yt=/\//g,Xt=/=/g,Zt=/\?/g,J=/\+/g,Qt=/%5e/gi,$t=/%60/gi,en=/%7c/gi,tn=/%20/gi,nn=/%2f/gi,rn=/%252f/gi;function an(e){return encodeURI(``+e).replace(en,`|`)}function on(e){return an(typeof e==`string`?e:JSON.stringify(e)).replace(J,`%2B`).replace(tn,`+`).replace(qt,`%23`).replace(Jt,`%26`).replace($t,"`").replace(Qt,`^`).replace(Yt,`%2F`)}function sn(e){return on(e).replace(Xt,`%3D`)}function cn(e){return an(e).replace(qt,`%23`).replace(Zt,`%3F`).replace(rn,`%2F`).replace(Jt,`%26`).replace(J,`%2B`)}function Y(e=``){try{return decodeURIComponent(``+e)}catch{return``+e}}function ln(e){return Y(e.replace(nn,`%252F`))}function un(e){return Y(e.replace(J,` `))}function dn(e){return Y(e.replace(J,` `))}function fn(e=``){let t=Object.create(null);e[0]===`?`&&(e=e.slice(1));for(let n of e.split(`&`)){let e=n.match(/([^=]+)=?(.*)/)||[];if(e.length<2)continue;let r=un(e[1]);if(r===`__proto__`||r===`constructor`)continue;let i=dn(e[2]||``);t[r]===void 0?t[r]=i:Array.isArray(t[r])?t[r].push(i):t[r]=[t[r],i]}return t}function pn(e,t){return(typeof t==`number`||typeof t==`boolean`)&&(t=String(t)),t?Array.isArray(t)?t.map(t=>`${sn(e)}=${on(t)}`).join(`&`):`${sn(e)}=${on(t)}`:sn(e)}function mn(e){return Object.keys(e).filter(t=>e[t]!==void 0).map(t=>pn(t,e[t])).filter(Boolean).join(`&`)}var hn=/^[\s\w\0+.-]{2,}:([/\\]{1,2})/,gn=/^[\s\w\0+.-]{2,}:([/\\]{2})?/,_n=/^([/\\]\s*){2,}[^/\\]/,vn=/^[\s\0]*(blob|data|javascript|vbscript):$/i,yn=/\/$|\/\?|\/#/,bn=/^\.?\//;function X(e,t={}){return typeof t==`boolean`&&(t={acceptRelative:t}),t.strict?hn.test(e):gn.test(e)||(t.acceptRelative?_n.test(e):!1)}function xn(e){return!!e&&vn.test(e)}function Sn(e=``,t){return t?yn.test(e):e.endsWith(`/`)}function Z(e=``,t){if(!t)return(Sn(e)?e.slice(0,-1):e)||`/`;if(!Sn(e,!0))return e||`/`;let n=e,r=``,i=e.indexOf(`#`);i!==-1&&(n=e.slice(0,i),r=e.slice(i));let[a,...o]=n.split(`?`);return((a.endsWith(`/`)?a.slice(0,-1):a)||`/`)+(o.length>0?`?${o.join(`?`)}`:``)+r}function Q(e=``,t){if(!t)return e.endsWith(`/`)?e:e+`/`;if(Sn(e,!0))return e||`/`;let n=e,r=``,i=e.indexOf(`#`);if(i!==-1&&(n=e.slice(0,i),r=e.slice(i),!n))return r;let[a,...o]=n.split(`?`);return a+`/`+(o.length>0?`?${o.join(`?`)}`:``)+r}function Cn(e=``){return e.startsWith(`/`)}function wn(e=``){return Cn(e)?e:`/`+e}function Tn(e,t){if(On(t)||X(e))return e;let n=Z(t);if(e.startsWith(n)){let t=e[n.length];if(!t||t===`/`||t===`?`)return e}return An(n,e)}function En(e,t){if(On(t))return e;let n=Z(t);if(!e.startsWith(n))return e;let r=e[n.length];return r&&r!==`/`&&r!==`?`?e:`/`+e.slice(n.length).replace(/^\/+/,``)}function Dn(e,t){let n=$(e);return n.search=mn({...fn(n.search),...t}),Ln(n)}function On(e){return!e||e===`/`}function kn(e){return e&&e!==`/`}function An(e,...t){let n=e||``;for(let e of t.filter(e=>kn(e)))if(n){let t=e.replace(bn,``);n=Q(n)+t}else n=e;return n}function jn(...e){let t=/\/(?!\/)/,n=e.filter(Boolean),r=[],i=0;for(let e of n)if(!(!e||e===`/`)){for(let[n,a]of e.split(t).entries())if(!(!a||a===`.`)){if(a===`..`){if(r.length===1&&X(r[0]))continue;r.pop(),i--;continue}if(n===1&&r[r.length-1]?.endsWith(`:/`)){r[r.length-1]+=`/`+a;continue}r.push(a),i++}}let a=r.join(`/`);return i>=0?n[0]?.startsWith(`/`)&&!a.startsWith(`/`)?a=`/`+a:n[0]?.startsWith(`./`)&&!a.startsWith(`./`)&&(a=`./`+a):a=`../`.repeat(-1*i)+a,n[n.length-1]?.endsWith(`/`)&&!a.endsWith(`/`)&&(a+=`/`),a}function Mn(e,t){return Y(Z(e))===Y(Z(t))}function Nn(e,t,n={}){return n.trailingSlash||(e=Q(e),t=Q(t)),n.leadingSlash||(e=wn(e),t=wn(t)),n.encoding||(e=Y(e),t=Y(t)),e===t}function Pn(e){return Ln({...$(e),hash:``})}var Fn=Symbol.for(`ufo:protocolRelative`);function $(e=``,t){let n=e.match(/^[\s\0]*(blob:|data:|javascript:|vbscript:)(.*)/i);if(n){let[,e,t=``]=n;return{protocol:e.toLowerCase(),pathname:t,href:e+t,auth:``,host:``,search:``,hash:``}}if(!X(e,{acceptRelative:!0}))return t?$(t+e):In(e);let[,r=``,i,a=``]=e.replace(/\\/g,`/`).match(/^[\s\0]*([\w+.-]{2,}:)?\/\/([^/@]+@)?(.*)/)||[],[,o=``,s=``]=a.match(/([^#/?]*)(.*)?/)||[];r===`file:`&&(s=s.replace(/\/(?=[A-Za-z]:)/,``));let{pathname:c,search:l,hash:u}=In(s);return{protocol:r.toLowerCase(),auth:i?i.slice(0,Math.max(0,i.length-1)):``,host:o,pathname:c,search:l,hash:u,[Fn]:!r}}function In(e=``){let[t=``,n=``,r=``]=(e.match(/([^#?]*)(\?[^#]*)?(#.*)?/)||[]).splice(1);return{pathname:t,search:n,hash:r}}function Ln(e){let t=e.pathname||``,n=e.search?(e.search.startsWith(`?`)?``:`?`)+e.search:``,r=e.hash||``,i=e.auth?e.auth+`@`:``,a=e.host||``;return(e.protocol||e[Fn]?(e.protocol||``)+`//`:``)+i+a+t+n+r}export{at as A,Ct as B,zt as C,Ut as D,Rt as E,yt as F,gt as I,W as L,Mt as M,At as N,Vt as O,pt as P,je as R,Lt as S,Bt as T,Z as _,Mn as a,Ht as b,An as c,$ as d,Tn as f,Pn as g,En as h,Nn as i,jt as j,be as k,In as l,Q as m,cn as n,xn as o,Dn as p,X as r,jn as s,ln as t,fn as u,Kt as v,Wt as w,Ft as x,It as y,Tt as z};
|