agentworkshop 0.7.59 → 0.7.60
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 +108 -0
- package/.output/.AgentWorkShop/prompts/host-tools.json +108 -0
- package/.output/.AgentWorkShop/schema.json +1 -0
- package/.output/nitro.json +1 -1
- package/.output/public/_nuxt/{CZwDnomB.js → 59a6cSgj.js} +1 -1
- package/.output/public/_nuxt/5juo_WO2.js +13 -0
- package/.output/public/_nuxt/9j2J4k4w.js +1 -0
- package/.output/public/_nuxt/B-WTxXEK2.js +1 -0
- package/.output/public/_nuxt/{DTx_DtUo.js → B0w8DZ4C.js} +1 -1
- package/.output/public/_nuxt/B1BCga5h2.js +13 -0
- package/.output/public/_nuxt/B5lMtA7I2.js +1 -0
- package/.output/public/_nuxt/B6_fJd2X.js +1 -0
- package/.output/public/_nuxt/B7K5B04W2.js +1 -0
- package/.output/public/_nuxt/B7KyS_q2.js +1 -0
- package/.output/public/_nuxt/B8q3BGY5.js +37 -0
- package/.output/public/_nuxt/B9IK8kDl2.js +1 -0
- package/.output/public/_nuxt/BFBysc2M2.js +1 -0
- package/.output/public/_nuxt/{BMUEVeOK.js → BGFhOMVM.js} +2 -2
- package/.output/public/_nuxt/{cBI0JqsV.js → BMlesJth.js} +1 -1
- package/.output/public/_nuxt/BNd2NDxg2.js +1 -0
- package/.output/public/_nuxt/BP629NAi.js +1 -0
- package/.output/public/_nuxt/BVinTfuN.js +1 -0
- package/.output/public/_nuxt/{DJZzthKt2.js → B_BYwIf22.js} +1 -1
- package/.output/public/_nuxt/{CW1HGp5X.js → B_JLVF30.js} +1 -1
- package/.output/public/_nuxt/BdE41Y_c.js +28 -0
- package/.output/public/_nuxt/Bdq2LNSO.js +1 -0
- package/.output/public/_nuxt/{BMZ1d25O.js → BeNdseTX.js} +1 -1
- package/.output/public/_nuxt/Be_StT8b2.js +1 -0
- package/.output/public/_nuxt/BhllzW3K2.js +1 -0
- package/.output/public/_nuxt/BjUpWKS6.js +1 -0
- package/.output/public/_nuxt/{CCCq9H7D2.js → BlEJRYAn2.js} +1 -1
- package/.output/public/_nuxt/{Du0zf-d3.js → BplhglEM.js} +1 -1
- package/.output/public/_nuxt/BsYEYxWv.js +24 -0
- package/.output/public/_nuxt/BtXwFpv42.js +1 -0
- package/.output/public/_nuxt/{BrFF_9742.js → BuNXYpib2.js} +1 -1
- package/.output/public/_nuxt/{BzKT-ne_2.js → C0sNwDTK2.js} +1 -1
- package/.output/public/_nuxt/{h46i74oE.js → C4AICl3l.js} +4 -4
- package/.output/public/_nuxt/{BuVH9MB-.js → C5OSTzBh.js} +1 -1
- package/.output/public/_nuxt/{DKhRushG.js → C8XVZGSZ.js} +1 -1
- package/.output/public/_nuxt/{zGDAozGA.js → C93LpBMF.js} +4 -4
- package/.output/public/_nuxt/CDaZC0_6.js +3 -0
- package/.output/public/_nuxt/CE43-V_L.js +2 -0
- package/.output/public/_nuxt/{B4R5CHkk.js → CEHT9inW.js} +1 -1
- package/.output/public/_nuxt/CGChCy-w2.js +1 -0
- package/.output/public/_nuxt/{DvUt9uMt2.js → CMDAjShv2.js} +1 -1
- package/.output/public/_nuxt/CUjdqsjC2.js +1 -0
- package/.output/public/_nuxt/CWfBtswB.js +70 -0
- package/.output/public/_nuxt/CYtH1bv2.js +1 -0
- package/.output/public/_nuxt/CZmMgjIK.js +1 -0
- package/.output/public/_nuxt/{iZa330UY.js → Cdw4juXw.js} +1 -1
- package/.output/public/_nuxt/{DMPpE41S2.js → Ce5SiMQR2.js} +1 -1
- package/.output/public/_nuxt/{B03LfmKR.js → Cfp00Rdo.js} +1 -1
- package/.output/public/_nuxt/{Dy-V8OEW2.js → CgbP5yJk2.js} +7 -7
- package/.output/public/_nuxt/ChPNKPw_.js +1 -0
- package/.output/public/_nuxt/{C5wBzGO7.js → CjeMxUv8.js} +1 -1
- package/.output/public/_nuxt/CktUrk8z.js +1 -0
- package/.output/public/_nuxt/Cst8yEet.js +1 -0
- package/.output/public/_nuxt/Cuw2--X2.js +2 -0
- package/.output/public/_nuxt/Cyd68Xbv2.js +1 -0
- package/.output/public/_nuxt/{pNy4V4kd.js → Cyuxcv5s2.js} +1 -1
- package/.output/public/_nuxt/{CIz7SM4H.js → D0vmf1z9.js} +1 -1
- package/.output/public/_nuxt/D5-QB_-l.js +1 -0
- package/.output/public/_nuxt/D9sgxxsM2.js +1 -0
- package/.output/public/_nuxt/DBdwjOGB2.js +1 -0
- package/.output/public/_nuxt/DBzdrPzw2.js +1 -0
- package/.output/public/_nuxt/DD4J2Otc.js +1 -0
- package/.output/public/_nuxt/DMCoWgSb2.js +1 -0
- package/.output/public/_nuxt/{CmTqFlYZ.js → DTcsb0fG.js} +1 -1
- package/.output/public/_nuxt/Ddc_Pn7D.js +19 -0
- package/.output/public/_nuxt/Dg1iMuZ-.js +1 -0
- package/.output/public/_nuxt/DhSlJyZD2.js +1 -0
- package/.output/public/_nuxt/DmwMkvoQ2.js +1 -0
- package/.output/public/_nuxt/EQijmkCh2.js +1 -0
- package/.output/public/_nuxt/KXQppTXc.js +1 -0
- package/.output/public/_nuxt/{CZ0Gt81h.js → KXvRkBgg.js} +2 -2
- package/.output/public/_nuxt/LwITbamf2.js +47 -0
- package/.output/public/_nuxt/N9TYd_Mk2.js +1 -0
- package/.output/public/_nuxt/VeOVO2sE2.js +1 -0
- package/.output/public/_nuxt/_jfzcYrl.js +1 -0
- package/.output/public/_nuxt/analysis.D2Pao1rm.css +1 -0
- package/.output/public/_nuxt/builds/latest.json +1 -1
- package/.output/public/_nuxt/builds/meta/f78a1992-e424-494d-ac4b-aa18971ffc10.json +1 -0
- package/.output/public/_nuxt/{default.8ac6QU28.css → default.Bx6RJSbr.css} +1 -1
- package/.output/public/_nuxt/{entry.BHNNQA9H.css → entry.BlbU43qz.css} +1 -1
- package/.output/public/_nuxt/{MEwEMEMl2.js → iCvdSYYN2.js} +6 -6
- package/.output/public/_nuxt/{CYGkUj5M2.js → p2sDc0tO2.js} +1 -1
- package/.output/public/_nuxt/{Drhta6gr.js → zVupTo2z2.js} +2 -2
- package/.output/server/chunks/_/LeftOutlined.mjs +1 -1
- package/.output/server/chunks/_/character-asset.repo.mjs +1 -1
- package/.output/server/chunks/_/host-bindings.mjs +1 -1
- package/.output/server/chunks/_/nitro.mjs +1651 -1268
- package/.output/server/chunks/_/nitro.mjs.map +1 -1
- package/.output/server/chunks/_/scene-layout.repo.mjs +1 -1
- package/.output/server/chunks/build/{AuthGate-DDPYswkA.mjs → AuthGate-CZYkvPrg.mjs} +5 -5
- package/.output/server/chunks/build/{AuthGate-DDPYswkA.mjs.map → AuthGate-CZYkvPrg.mjs.map} +1 -1
- package/.output/server/chunks/build/Checkbox-4EdGAAl_.mjs +1 -1
- package/.output/server/chunks/build/{FormItemContext-4ORSzhWv.mjs → FormItemContext-DcWIIAaK.mjs} +2 -2
- package/.output/server/chunks/build/{FormItemContext-4ORSzhWv.mjs.map → FormItemContext-DcWIIAaK.mjs.map} +1 -1
- package/.output/server/chunks/build/{OmpTerminalPanel-DZ2wHMS1.mjs → OmpTerminalPanel-CtFJ6Kc8.mjs} +4 -4
- package/.output/server/chunks/build/{OmpTerminalPanel-DZ2wHMS1.mjs.map → OmpTerminalPanel-CtFJ6Kc8.mjs.map} +1 -1
- package/.output/server/chunks/build/{PluginSlot-CT4YaNrB.mjs → PluginSlot-BT7kYQgK.mjs} +2 -2
- package/.output/server/chunks/build/{PluginSlot-CT4YaNrB.mjs.map → PluginSlot-BT7kYQgK.mjs.map} +1 -1
- package/.output/server/chunks/build/{TownView-CZbFn6mO.mjs → TownView-kQZFf4zj.mjs} +3 -3
- package/.output/server/chunks/build/{TownView-CZbFn6mO.mjs.map → TownView-kQZFf4zj.mjs.map} +1 -1
- package/.output/server/chunks/build/{_id_-Df2pgsAq.mjs → _id_-Bbx1b74O.mjs} +3 -3
- package/.output/server/chunks/build/{_id_-Df2pgsAq.mjs.map → _id_-Bbx1b74O.mjs.map} +1 -1
- package/.output/server/chunks/build/{_id_-CCVhpJtj.mjs → _id_-IijrRw3f.mjs} +3 -3
- package/.output/server/chunks/build/{_id_-CCVhpJtj.mjs.map → _id_-IijrRw3f.mjs.map} +1 -1
- package/.output/server/chunks/build/{_wsId_-CJqF-hmP.mjs → _wsId_-DOEw9jgZ.mjs} +22 -21
- package/.output/server/chunks/build/{_wsId_-CJqF-hmP.mjs.map → _wsId_-DOEw9jgZ.mjs.map} +1 -1
- package/.output/server/chunks/build/{agents-BTsbna5H.mjs → agents-C36wR56A.mjs} +18 -17
- package/.output/server/chunks/build/agents-C36wR56A.mjs.map +1 -0
- package/.output/server/chunks/build/{aml-BBKfWto1.mjs → aml-CBGndvHT.mjs} +7 -7
- package/.output/server/chunks/build/{aml-BBKfWto1.mjs.map → aml-CBGndvHT.mjs.map} +1 -1
- package/.output/server/chunks/build/analysis-tgzvOWmD.mjs +332 -0
- package/.output/server/chunks/build/analysis-tgzvOWmD.mjs.map +1 -0
- package/.output/server/chunks/build/{card-DJOYGuVH.mjs → card-Db7OB49d.mjs} +4 -4
- package/.output/server/chunks/build/{card-DJOYGuVH.mjs.map → card-Db7OB49d.mjs.map} +1 -1
- package/.output/server/chunks/build/{channel-templates-BPKJ8e4l.mjs → channel-templates-BixUrDmU.mjs} +11 -10
- package/.output/server/chunks/build/channel-templates-BixUrDmU.mjs.map +1 -0
- package/.output/server/chunks/build/{checkbox-C4AKj81e.mjs → checkbox-CyF96D30.mjs} +3 -3
- package/.output/server/chunks/build/{checkbox-C4AKj81e.mjs.map → checkbox-CyF96D30.mjs.map} +1 -1
- package/.output/server/chunks/build/{daq-Cz7TaUAM.mjs → daq-DLMLufDq.mjs} +5 -5
- package/.output/server/chunks/build/{daq-Cz7TaUAM.mjs.map → daq-DLMLufDq.mjs.map} +1 -1
- package/.output/server/chunks/build/dcw-EhjJpVQM.mjs +2 -2
- package/.output/server/chunks/build/{default-DweMY872.mjs → default-C7Qmdyz_.mjs} +30 -19
- package/.output/server/chunks/build/{default-DweMY872.mjs.map → default-C7Qmdyz_.mjs.map} +1 -1
- package/.output/server/chunks/build/{descriptions-CFaUq4y4.mjs → descriptions-1bH81YsZ.mjs} +2 -2
- package/.output/server/chunks/build/{descriptions-CFaUq4y4.mjs.map → descriptions-1bH81YsZ.mjs.map} +1 -1
- package/.output/server/chunks/build/{drawer-Cfh9_zft.mjs → drawer-C7shdEHy.mjs} +2 -2
- package/.output/server/chunks/build/{drawer-Cfh9_zft.mjs.map → drawer-C7shdEHy.mjs.map} +1 -1
- package/.output/server/chunks/build/{dropdown-CIsqbX4P.mjs → dropdown-BhLSIp5A.mjs} +2 -2
- package/.output/server/chunks/build/{dropdown-CIsqbX4P.mjs.map → dropdown-BhLSIp5A.mjs.map} +1 -1
- package/.output/server/chunks/build/{dropdown-CV9GW3z9.mjs → dropdown-BiwcuXDi.mjs} +6 -5
- package/.output/server/chunks/build/{dropdown-CV9GW3z9.mjs.map → dropdown-BiwcuXDi.mjs.map} +1 -1
- package/.output/server/chunks/build/{form-cs_RcfGx.mjs → form-nE8C0G8B.mjs} +7 -6
- package/.output/server/chunks/build/{form-cs_RcfGx.mjs.map → form-nE8C0G8B.mjs.map} +1 -1
- package/.output/server/chunks/build/{input-CobQ5LJ5.mjs → input-DwF72eVI.mjs} +93 -3449
- package/.output/server/chunks/build/input-DwF72eVI.mjs.map +1 -0
- package/.output/server/chunks/build/{input-number-BpPYAWMk.mjs → input-number-TSq6ltkz.mjs} +6 -5
- package/.output/server/chunks/build/{input-number-BpPYAWMk.mjs.map → input-number-TSq6ltkz.mjs.map} +1 -1
- package/.output/server/chunks/build/{logs-As9fZqU-.mjs → logs-hOEVuxqm.mjs} +3 -3
- package/.output/server/chunks/build/{logs-As9fZqU-.mjs.map → logs-hOEVuxqm.mjs.map} +1 -1
- package/.output/server/chunks/build/{menu-CVmvHyFT.mjs → menu-Cy5Nrecn.mjs} +4 -3
- package/.output/server/chunks/build/{menu-CVmvHyFT.mjs.map → menu-Cy5Nrecn.mjs.map} +1 -1
- package/.output/server/chunks/build/{monitor-CdFQ2z4g.mjs → monitor-CfVoiavp.mjs} +20 -19
- package/.output/server/chunks/build/{monitor-CdFQ2z4g.mjs.map → monitor-CfVoiavp.mjs.map} +1 -1
- package/.output/server/chunks/build/{operations-B2gHCWgZ.mjs → operations-fxI8lEBJ.mjs} +3 -3
- package/.output/server/chunks/build/{operations-B2gHCWgZ.mjs.map → operations-fxI8lEBJ.mjs.map} +1 -1
- package/.output/server/chunks/build/{pages-BItCt1ar.mjs → pages-6JD9VSbx.mjs} +5 -5
- package/.output/server/chunks/build/{pages-BItCt1ar.mjs.map → pages-6JD9VSbx.mjs.map} +1 -1
- package/.output/server/chunks/build/{permissions-D6mQw_9j.mjs → permissions-XPtQJSaO.mjs} +14 -13
- package/.output/server/chunks/build/permissions-XPtQJSaO.mjs.map +1 -0
- package/.output/server/chunks/build/{plugins-NAS9MQ5r.mjs → plugins-DjBSG9pV.mjs} +5 -5
- package/.output/server/chunks/build/{plugins-NAS9MQ5r.mjs.map → plugins-DjBSG9pV.mjs.map} +1 -1
- package/.output/server/chunks/build/{popconfirm-DFfoFhmt.mjs → popconfirm-DKeEbaGd.mjs} +3 -3
- package/.output/server/chunks/build/{popconfirm-DFfoFhmt.mjs.map → popconfirm-DKeEbaGd.mjs.map} +1 -1
- package/.output/server/chunks/build/{schedules-BjWNDWL5.mjs → schedules-PcDLCUWN.mjs} +20 -19
- package/.output/server/chunks/build/{schedules-BjWNDWL5.mjs.map → schedules-PcDLCUWN.mjs.map} +1 -1
- package/.output/server/chunks/build/{segmented-D7FkCgg7.mjs → segmented-BdWCdZUM.mjs} +3 -3
- package/.output/server/chunks/build/{segmented-D7FkCgg7.mjs.map → segmented-BdWCdZUM.mjs.map} +1 -1
- package/.output/server/chunks/build/{select-FqBNxgxT.mjs → select-C5yighj8.mjs} +5 -4
- package/.output/server/chunks/build/{select-FqBNxgxT.mjs.map → select-C5yighj8.mjs.map} +1 -1
- package/.output/server/chunks/build/{settings-Cl_KRyEn.mjs → settings-90zT_h9w.mjs} +14 -13
- package/.output/server/chunks/build/settings-90zT_h9w.mjs.map +1 -0
- package/.output/server/chunks/build/{space-B2uhHJG8.mjs → space-BCffbXIG.mjs} +3 -3
- package/.output/server/chunks/build/{space-B2uhHJG8.mjs.map → space-BCffbXIG.mjs.map} +1 -1
- package/.output/server/chunks/build/{switch-DZAUIbIN.mjs → switch-OG0SM_Px.mjs} +3 -3
- package/.output/server/chunks/build/{switch-DZAUIbIN.mjs.map → switch-OG0SM_Px.mjs.map} +1 -1
- package/.output/server/chunks/build/{table-CeOYERqr.mjs → table-UpVzu50c.mjs} +11 -10
- package/.output/server/chunks/build/{table-CeOYERqr.mjs.map → table-UpVzu50c.mjs.map} +1 -1
- package/.output/server/chunks/build/{tabs-LLNSdLl2.mjs → tabs-CWwoL33v.mjs} +6 -5
- package/.output/server/chunks/build/{tabs-LLNSdLl2.mjs.map → tabs-CWwoL33v.mjs.map} +1 -1
- package/.output/server/chunks/build/{tag-Dwvkh0Dj.mjs → tag-CS7mwrfG.mjs} +5 -4
- package/.output/server/chunks/build/{tag-Dwvkh0Dj.mjs.map → tag-CS7mwrfG.mjs.map} +1 -1
- package/.output/server/chunks/build/{teams-CGDZHaQl.mjs → teams-BIAFvRw1.mjs} +19 -18
- package/.output/server/chunks/build/teams-BIAFvRw1.mjs.map +1 -0
- package/.output/server/chunks/build/{tokens-BOYkZuoB.mjs → tokens-CLpdrzQ7.mjs} +19 -18
- package/.output/server/chunks/build/tokens-CLpdrzQ7.mjs.map +1 -0
- package/.output/server/chunks/build/tooltip-CJlH_8ZK.mjs +3362 -0
- package/.output/server/chunks/build/tooltip-CJlH_8ZK.mjs.map +1 -0
- package/.output/server/chunks/build/town-BV-hbwb5.mjs +1 -1
- package/.output/server/chunks/build/{town-P1rYoi0v.mjs → town-Bfme7P2I.mjs} +5 -5
- package/.output/server/chunks/build/{town-P1rYoi0v.mjs.map → town-Bfme7P2I.mjs.map} +1 -1
- package/.output/server/chunks/build/types-D6J7slEa.mjs +1 -1
- package/.output/server/chunks/build/types-DWqIeMRP.mjs +75 -0
- package/.output/server/chunks/build/types-DWqIeMRP.mjs.map +1 -0
- package/.output/server/chunks/build/{useAgentTemplateActions-DsBRUQni.mjs → useAgentTemplateActions-6VyAHgu5.mjs} +1 -1
- package/.output/server/chunks/build/{useAgentTemplateActions-DsBRUQni.mjs.map → useAgentTemplateActions-6VyAHgu5.mjs.map} +1 -1
- package/.output/server/chunks/build/{useAgentTemplateForm-DzQ_t2Ue.mjs → useAgentTemplateForm-DWa-ezNq.mjs} +1 -1
- package/.output/server/chunks/build/{useAgentTemplateForm-DzQ_t2Ue.mjs.map → useAgentTemplateForm-DWa-ezNq.mjs.map} +1 -1
- package/.output/server/chunks/build/{useAmlEntities-BMLHU_39.mjs → useAmlEntities-Co2fgjzh.mjs} +1 -1
- package/.output/server/chunks/build/{useAmlEntities-BMLHU_39.mjs.map → useAmlEntities-Co2fgjzh.mjs.map} +1 -1
- package/.output/server/chunks/build/{useAmlEnv-DdlyVzPu.mjs → useAmlEnv-JTiWPrzH.mjs} +1 -1
- package/.output/server/chunks/build/{useAmlEnv-DdlyVzPu.mjs.map → useAmlEnv-JTiWPrzH.mjs.map} +1 -1
- package/.output/server/chunks/build/{useAmlJobs-BG_v21hJ.mjs → useAmlJobs-By4pjOzc.mjs} +1 -1
- package/.output/server/chunks/build/{useAmlJobs-BG_v21hJ.mjs.map → useAmlJobs-By4pjOzc.mjs.map} +1 -1
- package/.output/server/chunks/build/{useAmlModels-D7MuOWOy.mjs → useAmlModels-B1_5vjMA.mjs} +1 -1
- package/.output/server/chunks/build/{useAmlModels-D7MuOWOy.mjs.map → useAmlModels-B1_5vjMA.mjs.map} +1 -1
- package/.output/server/chunks/build/{useAmlNotes-CTZe-GI0.mjs → useAmlNotes-5uwvCb3h.mjs} +1 -1
- package/.output/server/chunks/build/{useAmlNotes-CTZe-GI0.mjs.map → useAmlNotes-5uwvCb3h.mjs.map} +1 -1
- package/.output/server/chunks/build/{useAmlPredict-BToRrVRV.mjs → useAmlPredict-lxUv7lAO.mjs} +1 -1
- package/.output/server/chunks/build/{useAmlPredict-BToRrVRV.mjs.map → useAmlPredict-lxUv7lAO.mjs.map} +1 -1
- package/.output/server/chunks/build/useAnalysisFeed-B4OwUd7p.mjs +128 -0
- package/.output/server/chunks/build/useAnalysisFeed-B4OwUd7p.mjs.map +1 -0
- package/.output/server/chunks/build/useDaqAddNode-CaOCbe4-.mjs +1 -1
- package/.output/server/chunks/build/{useDaqDetailNode-DXgwAu5u.mjs → useDaqDetailNode-DtZ0oDAn.mjs} +3 -3
- package/.output/server/chunks/build/{useDaqDetailNode-DXgwAu5u.mjs.map → useDaqDetailNode-DtZ0oDAn.mjs.map} +1 -1
- package/.output/server/chunks/build/useDaqDetailParams-CrTMDs-2.mjs +1 -1
- package/.output/server/chunks/build/{useDaqFilters-Jx6EERfr.mjs → useDaqFilters-DYHGhECw.mjs} +3 -3
- package/.output/server/chunks/build/{useDaqFilters-Jx6EERfr.mjs.map → useDaqFilters-DYHGhECw.mjs.map} +1 -1
- package/.output/server/chunks/build/useDaqStream-DhzdoyIR.mjs +1 -1
- package/.output/server/chunks/build/useDaqTemplates-C7GzQmdJ.mjs +1 -1
- package/.output/server/chunks/build/{useDashboardData-Ce-EU5DJ.mjs → useDashboardData-B3lZjE7x.mjs} +3 -3
- package/.output/server/chunks/build/{useDashboardData-Ce-EU5DJ.mjs.map → useDashboardData-B3lZjE7x.mjs.map} +1 -1
- package/.output/server/chunks/build/useDcwAddNode-4mTPQ6T8.mjs +1 -1
- package/.output/server/chunks/build/{useDcwDetailScope-4j3B03Pi.mjs → useDcwDetailScope-BWH7jnVh.mjs} +2 -2
- package/.output/server/chunks/build/{useDcwDetailScope-4j3B03Pi.mjs.map → useDcwDetailScope-BWH7jnVh.mjs.map} +1 -1
- package/.output/server/chunks/build/useDcwStream-BXJ2V8HM.mjs +1 -1
- package/.output/server/chunks/build/{useLogsManual-CMjD62nt.mjs → useLogsManual-BLfiSU3u.mjs} +1 -1
- package/.output/server/chunks/build/{useLogsManual-CMjD62nt.mjs.map → useLogsManual-BLfiSU3u.mjs.map} +1 -1
- package/.output/server/chunks/build/{useMonitorData-D2gFSonG.mjs → useMonitorData-BZ6Z-Sy8.mjs} +1 -1
- package/.output/server/chunks/build/{useMonitorData-D2gFSonG.mjs.map → useMonitorData-BZ6Z-Sy8.mjs.map} +1 -1
- package/.output/server/chunks/build/{useTeamActions-BOLQkYxg.mjs → useTeamActions-ahht5J8Y.mjs} +1 -1
- package/.output/server/chunks/build/{useTeamActions-BOLQkYxg.mjs.map → useTeamActions-ahht5J8Y.mjs.map} +1 -1
- package/.output/server/chunks/build/{useTeamAddMemberDialog-BCgrLPxI.mjs → useTeamAddMemberDialog-DvXxsVy0.mjs} +1 -1
- package/.output/server/chunks/build/{useTeamAddMemberDialog-BCgrLPxI.mjs.map → useTeamAddMemberDialog-DvXxsVy0.mjs.map} +1 -1
- package/.output/server/chunks/build/{useTeamCreateDialog-CJk40LqS.mjs → useTeamCreateDialog-A_k-XX5B.mjs} +1 -1
- package/.output/server/chunks/build/{useTeamCreateDialog-CJk40LqS.mjs.map → useTeamCreateDialog-A_k-XX5B.mjs.map} +1 -1
- package/.output/server/chunks/build/{useTeamDeployDialog-49hdUXQP.mjs → useTeamDeployDialog-CfAFjIr_.mjs} +1 -1
- package/.output/server/chunks/build/{useTeamDeployDialog-49hdUXQP.mjs.map → useTeamDeployDialog-CfAFjIr_.mjs.map} +1 -1
- package/.output/server/chunks/build/{useTeamPluginDialog-Dh-QOoiU.mjs → useTeamPluginDialog-Djmkk1Nl.mjs} +1 -1
- package/.output/server/chunks/build/{useTeamPluginDialog-Dh-QOoiU.mjs.map → useTeamPluginDialog-Djmkk1Nl.mjs.map} +1 -1
- package/.output/server/chunks/build/{useTokenCreate-DkYvEQUD.mjs → useTokenCreate-CkWoxSI-.mjs} +1 -1
- package/.output/server/chunks/build/{useTokenCreate-DkYvEQUD.mjs.map → useTokenCreate-CkWoxSI-.mjs.map} +1 -1
- package/.output/server/chunks/build/{useTokenRename-DOCP4aeI.mjs → useTokenRename-BohjnGT0.mjs} +1 -1
- package/.output/server/chunks/build/{useTokenRename-DOCP4aeI.mjs.map → useTokenRename-BohjnGT0.mjs.map} +1 -1
- package/.output/server/chunks/build/{useTokenReveal-CybwwflV.mjs → useTokenReveal-BBN5iGz7.mjs} +1 -1
- package/.output/server/chunks/build/{useTokenReveal-CybwwflV.mjs.map → useTokenReveal-BBN5iGz7.mjs.map} +1 -1
- package/.output/server/chunks/build/{useTokensList-BLiMvrc4.mjs → useTokensList-BQX9WqfT.mjs} +1 -1
- package/.output/server/chunks/build/{useTokensList-BLiMvrc4.mjs.map → useTokensList-BQX9WqfT.mjs.map} +1 -1
- package/.output/server/chunks/build/{useWorkbenchAuth-DAabQl7X.mjs → useWorkbenchAuth-BTRlS2wZ.mjs} +1 -1
- package/.output/server/chunks/build/{useWorkbenchAuth-DAabQl7X.mjs.map → useWorkbenchAuth-BTRlS2wZ.mjs.map} +1 -1
- package/.output/server/chunks/build/{useWorkbenchWorkspaces-6-mpCGCR.mjs → useWorkbenchWorkspaces-C6ky7OJH.mjs} +1 -1
- package/.output/server/chunks/build/{useWorkbenchWorkspaces-6-mpCGCR.mjs.map → useWorkbenchWorkspaces-C6ky7OJH.mjs.map} +1 -1
- package/.output/server/chunks/build/{users-B_pHStEa.mjs → users-BHOEW3Az.mjs} +15 -14
- package/.output/server/chunks/build/users-BHOEW3Az.mjs.map +1 -0
- package/.output/server/chunks/build/{workshop-C0DefygA.mjs → workshop-DyJ1LXwu.mjs} +11 -10
- package/.output/server/chunks/build/workshop-DyJ1LXwu.mjs.map +1 -0
- package/.output/server/chunks/routes/api/mcp/workshop.mjs +1 -1
- package/.output/server/chunks/routes/api/system/backup/run.post.mjs +2 -2
- package/.output/server/chunks/routes/api/workshop/analysis/_id_.delete.mjs +46 -0
- package/.output/server/chunks/routes/api/workshop/analysis/_id_.delete.mjs.map +1 -0
- package/.output/server/chunks/routes/api/workshop/analysis/_id_.get.mjs +39 -0
- package/.output/server/chunks/routes/api/workshop/analysis/_id_.get.mjs.map +1 -0
- package/.output/server/chunks/routes/api/workshop/assets/index.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/assets/index2.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/channel-templates/_id/instantiate.post.mjs +2 -2
- package/.output/server/chunks/routes/api/workshop/channels/_id/activate.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/channels/_id/chat/index.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/channels/_id/index.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/channels/_id/index.put.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/channels/_id/index3.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/channels/_id/index4.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/channels/_id/index5.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/channels/_id/line.put.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/channels/_id/terminals.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/channels/_id/twin-profile.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/channels/_id/twin-profile.patch.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/channels/index.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/channels.post.mjs +7 -7
- package/.output/server/chunks/routes/api/workshop/daq/_id/samples.get.mjs +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/bindings.put.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/index3.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/index4.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/index5.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/index5.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/index6.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/index7.get.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/mes-artifacts/file.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/mes-hook-test.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/mes-test-read.post.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/params/_id/read.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/params/_id/write.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/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/recipes/_id_.delete.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/control.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/device-twins/_id/telemetry.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/device-twins/_id_.patch.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/exp/confirmations/_id/decide.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/exp/index.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/fs/dirs.get.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/index10.get.mjs +20 -23
- package/.output/server/chunks/routes/api/workshop/index10.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/index11.get.mjs +25 -11
- package/.output/server/chunks/routes/api/workshop/index11.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/index12.get.mjs +10 -4
- package/.output/server/chunks/routes/api/workshop/index12.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/index13.get.mjs +2 -3
- package/.output/server/chunks/routes/api/workshop/index13.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/index14.get.mjs +3 -2
- package/.output/server/chunks/routes/api/workshop/index14.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/index15.get.mjs +30 -0
- package/.output/server/chunks/routes/api/workshop/index15.get.mjs.map +1 -0
- package/.output/server/chunks/routes/api/workshop/index3.get.mjs +20 -9
- package/.output/server/chunks/routes/api/workshop/index3.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/index3.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/index4.get.mjs +10 -4
- package/.output/server/chunks/routes/api/workshop/index4.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/index4.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/index5.get.mjs +4 -29
- package/.output/server/chunks/routes/api/workshop/index5.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/index5.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/index6.get.mjs +25 -22
- package/.output/server/chunks/routes/api/workshop/index6.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/index7.get.mjs +26 -5
- package/.output/server/chunks/routes/api/workshop/index7.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/index8.get.mjs +4 -39
- package/.output/server/chunks/routes/api/workshop/index8.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/index9.get.mjs +40 -20
- package/.output/server/chunks/routes/api/workshop/index9.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/teams/_id/deploy.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/teams/_id/index.put.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/teams/_id/index2.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/workspaces/_id/channel-templates/_tplId_.post.mjs +2 -2
- package/.output/server/chunks/routes/renderer.mjs +2 -2
- package/.output/server/chunks/virtual/entry.mjs +551 -824
- 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 +17 -0
- package/README.md +20 -0
- package/app/components/AppSidebar.vue +1 -0
- package/app/components/analysis/AnalysisFilterCard.vue +160 -0
- package/app/components/analysis/AnalysisPageHead.vue +47 -0
- package/app/components/analysis/AnalysisTable.vue +306 -0
- package/app/composables/useRouteMeta.ts +1 -0
- package/app/config/schema.ts +1 -0
- package/app/pages/analysis/composables/useAnalysisFeed.ts +85 -0
- package/app/pages/analysis/index.vue +92 -0
- package/app/pages/analysis/types.ts +44 -0
- package/cli/commands/mcp.mjs +160 -160
- package/i18n/locales/en.ts +55 -0
- package/i18n/locales/zh-CN.ts +55 -0
- package/mcp/aw-mcp-server.mjs +799 -799
- package/package.json +2 -2
- package/scripts/onboarding/onboard.mjs +5 -2
- package/scripts/onboarding/sim-twin.mjs +312 -0
- package/server/api/workshop/analysis/[id].delete.ts +30 -0
- package/server/api/workshop/analysis/[id].get.ts +23 -0
- package/server/api/workshop/analysis/index.get.ts +33 -0
- package/server/plugins/workshop.ts +4 -0
- package/server/repositories/user.repository.ts +2 -2
- package/server/services/workshop/agents/host-tool-bridge/catalog.ts +4 -1
- package/server/services/workshop/agents/host-tool-bridge/tools/industrial.ts +5 -2
- package/server/services/workshop/agents/industrial/analysis-tools.ts +242 -0
- package/server/services/workshop/agents/industrial/index.ts +1 -0
- package/server/services/workshop/agents/industrial/ops-tools.ts +3 -2
- package/server/services/workshop/analysis/analysis.repo.ts +189 -0
- package/server/services/workshop/db/database/schema.ts +28 -1
- package/server/services/workshop/db/ops.repo.ts +1 -1
- package/server/services/workshop/db/retention.ts +2 -0
- package/server/services/workshop/db/schema.sql +27 -0
- package/server/services/workshop/settings.ts +1 -0
- package/shared/config/schema.json +1 -0
- package/.output/public/_nuxt/B-Y_rsfn.js +0 -106
- package/.output/public/_nuxt/B02cxZz72.js +0 -1
- package/.output/public/_nuxt/BAqtRt0q.js +0 -1
- package/.output/public/_nuxt/BKHd_sKD2.js +0 -47
- package/.output/public/_nuxt/BXKCB3rS.js +0 -1
- package/.output/public/_nuxt/BhrnGVGz.js +0 -1
- package/.output/public/_nuxt/BikIgp9R.js +0 -1
- package/.output/public/_nuxt/BkGqyjWm.js +0 -3
- package/.output/public/_nuxt/Bn1N3mJv.js +0 -1
- package/.output/public/_nuxt/Br2LgfbH2.js +0 -13
- package/.output/public/_nuxt/BtNT93vm2.js +0 -1
- package/.output/public/_nuxt/BtYg4aGR2.js +0 -1
- package/.output/public/_nuxt/C4X_Z1lA.js +0 -1
- package/.output/public/_nuxt/CBATzTUf.js +0 -13
- package/.output/public/_nuxt/CEP4UrDv.js +0 -1
- package/.output/public/_nuxt/CIPKYgrH2.js +0 -1
- package/.output/public/_nuxt/CPSHP_EI.js +0 -1
- package/.output/public/_nuxt/CSyIwYcJ2.js +0 -1
- package/.output/public/_nuxt/CZkTlW93.js +0 -2
- package/.output/public/_nuxt/CZyYdpqZ2.js +0 -1
- package/.output/public/_nuxt/CeDkXWCz.js +0 -1
- package/.output/public/_nuxt/Cl19UD7U.js +0 -1
- package/.output/public/_nuxt/ClrkV0C4.js +0 -1
- package/.output/public/_nuxt/CoGETbe-2.js +0 -1
- package/.output/public/_nuxt/CuRtzvsa2.js +0 -1
- package/.output/public/_nuxt/Cv_H1gOM2.js +0 -1
- package/.output/public/_nuxt/D5i2ofVw2.js +0 -1
- package/.output/public/_nuxt/D6XGn5vM.js +0 -2
- package/.output/public/_nuxt/D6c5ppqB.js +0 -1
- package/.output/public/_nuxt/D8VQGThE.js +0 -28
- package/.output/public/_nuxt/DBwuADr82.js +0 -1
- package/.output/public/_nuxt/DTZO6WMs2.js +0 -1
- package/.output/public/_nuxt/DfqRQSFn.js +0 -19
- package/.output/public/_nuxt/DraEWn4N2.js +0 -1
- package/.output/public/_nuxt/DyMgrV29.js +0 -1
- package/.output/public/_nuxt/H7Rbu32y2.js +0 -1
- package/.output/public/_nuxt/TjGWqrHo.js +0 -1
- package/.output/public/_nuxt/VVomhVqu2.js +0 -1
- package/.output/public/_nuxt/YDs3mbQu2.js +0 -1
- package/.output/public/_nuxt/Z3MSTcdu2.js +0 -1
- package/.output/public/_nuxt/_vR_sc7t.js +0 -24
- package/.output/public/_nuxt/builds/meta/92fd7e2e-18f2-45c3-8588-d93004dda6e3.json +0 -1
- package/.output/public/_nuxt/gbaq2UOO.js +0 -1
- package/.output/public/_nuxt/o-G6YtmK2.js +0 -1
- package/.output/public/_nuxt/ylowSquM2.js +0 -1
- package/.output/server/chunks/build/agents-BTsbna5H.mjs.map +0 -1
- package/.output/server/chunks/build/channel-templates-BPKJ8e4l.mjs.map +0 -1
- package/.output/server/chunks/build/input-CobQ5LJ5.mjs.map +0 -1
- package/.output/server/chunks/build/permissions-D6mQw_9j.mjs.map +0 -1
- package/.output/server/chunks/build/settings-Cl_KRyEn.mjs.map +0 -1
- package/.output/server/chunks/build/teams-CGDZHaQl.mjs.map +0 -1
- package/.output/server/chunks/build/tokens-BOYkZuoB.mjs.map +0 -1
- package/.output/server/chunks/build/users-B_pHStEa.mjs.map +0 -1
- package/.output/server/chunks/build/workshop-C0DefygA.mjs.map +0 -1
- package/scripts/_audit/.tmp/audit-data/dcw-params.json +0 -15
- package/scripts/_audit/.tmp/audit-data/dcws.json +0 -30
- package/scripts/_audit/aml-layout-diag.mjs +0 -83
- package/scripts/_audit/channel-inspect.mjs +0 -49
- package/scripts/_audit/cleanup-apply.mjs +0 -89
- package/scripts/_audit/cleanup-plan.mjs +0 -82
- package/scripts/_audit/contrast-check.mjs +0 -43
- package/scripts/_audit/dcw-controller-e2e.ts +0 -106
- package/scripts/_audit/dcw-flush-cost.ts +0 -43
- package/scripts/_audit/dcw-rollback-ledger.ts +0 -156
- package/scripts/_audit/dcw-unrecorded-write.ts +0 -171
- package/scripts/_audit/dcw-write-mutex.ts +0 -157
- package/scripts/_audit/design-shots.mjs +0 -145
- package/scripts/_audit/docs-font-probe.mjs +0 -68
- package/scripts/_audit/docs-probe.mjs +0 -107
- package/scripts/_audit/docs-shots.mjs +0 -171
- package/scripts/_audit/docs-v3-verify.mjs +0 -255
- package/scripts/_audit/docs-vue-lint.mjs +0 -81
- package/scripts/_audit/docs-vue-lint2.mjs +0 -91
- package/scripts/_audit/exp-cost-scaling.mjs +0 -57
- package/scripts/_audit/exp-envelope-and-png.mjs +0 -78
- package/scripts/_audit/exp-png-decode.mjs +0 -67
- package/scripts/_audit/exp-retention-plan.mjs +0 -61
- package/scripts/_audit/exp-retention-rescan.mjs +0 -42
- package/scripts/_audit/exp-sweep-fairness.mjs +0 -50
- package/scripts/_audit/feature-audit-e2e.mjs +0 -342
- package/scripts/_audit/fix-settings-count.mjs +0 -57
- package/scripts/_audit/full-e2e-adopt.mjs +0 -238
- package/scripts/_audit/full-e2e-close-loop.mjs +0 -134
- package/scripts/_audit/full-e2e-retrain.mjs +0 -320
- package/scripts/_audit/full-e2e-supplement.mjs +0 -192
- package/scripts/_audit/full-e2e-ui-final.mjs +0 -111
- package/scripts/_audit/full-e2e-ui-mount.mjs +0 -111
- package/scripts/_audit/full-feature-e2e-20260927.mjs +0 -627
- package/scripts/_audit/glass-verify.mjs +0 -155
- package/scripts/_audit/hydration-diff.mjs +0 -104
- package/scripts/_audit/hydration-head.mjs +0 -36
- package/scripts/_audit/hydration-probe.mjs +0 -59
- package/scripts/_audit/idd-scenarios-e2e.mjs +0 -239
- package/scripts/_audit/kb-diag-complete.mjs +0 -261
- package/scripts/_audit/kb-diag-complete2.mjs +0 -271
- package/scripts/_audit/kb-diag-loop-e2e.mjs +0 -357
- package/scripts/_audit/kb-diag-loop-mock.mjs +0 -416
- package/scripts/_audit/kb-diag-loop-v2.mjs +0 -314
- package/scripts/_audit/lead-matrix-test.mjs +0 -172
- package/scripts/_audit/plc-agent-task.mjs +0 -74
- package/scripts/_audit/plc-clean-scenario.mjs +0 -434
- package/scripts/_audit/plc-clean-shots.mjs +0 -161
- package/scripts/_audit/plc-fc10-probe.mjs +0 -30
- package/scripts/_audit/probe-binding.mjs +0 -114
- package/scripts/_audit/recipe-save-e2e.mjs +0 -365
- package/scripts/_audit/review-fix-verify.mjs +0 -158
- package/scripts/_audit/runtime-dir-e2e.mjs +0 -393
- package/scripts/_audit/town-focus-shot.mjs +0 -129
- package/scripts/_audit/town-reposition.mjs +0 -85
- package/scripts/_audit/verify-cleanup.mjs +0 -67
- package/scripts/_audit/verify-data-integrity.mjs +0 -112
- package/scripts/_audit/watchdog-recovery-test.mjs +0 -149
- package/scripts/_dbg-optloop-ui-shots.mjs +0 -52
- /package/.output/public/_nuxt/{4RTUlYvj2.js → 4RTUlYvj.js} +0 -0
- /package/.output/public/_nuxt/{BBhLVYdM.js → BBhLVYdM2.js} +0 -0
- /package/.output/public/_nuxt/{BG7XSX-S2.js → BG7XSX-S.js} +0 -0
- /package/.output/public/_nuxt/{BU7WuuKh.js → BU7WuuKh2.js} +0 -0
- /package/.output/public/_nuxt/{BrRX-l9B2.js → BrRX-l9B.js} +0 -0
- /package/.output/public/_nuxt/{CHyzK5m52.js → CHyzK5m5.js} +0 -0
- /package/.output/public/_nuxt/{Ckafrjnw2.js → Ckafrjnw.js} +0 -0
- /package/.output/public/_nuxt/{D1Xw30Dj2.js → D1Xw30Dj.js} +0 -0
- /package/.output/public/_nuxt/{DEhjFhZ2.js → DEhjFhZ22.js} +0 -0
- /package/.output/public/_nuxt/{DdNujZN5.js → DdNujZN52.js} +0 -0
- /package/.output/public/_nuxt/{DzwIZ81f.js → DzwIZ81f2.js} +0 -0
- /package/.output/public/_nuxt/{M6NcguDO.js → M6NcguDO2.js} +0 -0
- /package/.output/public/_nuxt/{MW-V7IIP2.js → MW-V7IIP.js} +0 -0
- /package/.output/public/_nuxt/{WmMwIS4y.js → WmMwIS4y2.js} +0 -0
- /package/.output/public/_nuxt/{qIQFsHtF.js → qIQFsHtF2.js} +0 -0
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "agentworkshop",
|
|
3
|
-
"version": "0.7.
|
|
3
|
+
"version": "0.7.60",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "AgentWorkShop 软件开发系统 - 基于 Nuxt 4 的配置驱动运行范式",
|
|
6
6
|
"license": "Apache-2.0",
|
|
@@ -136,7 +136,7 @@
|
|
|
136
136
|
"minio": "^8.0.7",
|
|
137
137
|
"modbus-serial": "^8.0.25",
|
|
138
138
|
"mqtt": "^5.15.2",
|
|
139
|
-
"node-opcua": "
|
|
139
|
+
"node-opcua": "2.178.0",
|
|
140
140
|
"nuxt": "^4.0.0",
|
|
141
141
|
"nuxt-auth-utils": "^0.5.0",
|
|
142
142
|
"pg": "^8.23.0",
|
|
@@ -35,6 +35,7 @@ if (!configPath) {
|
|
|
35
35
|
const cfg = JSON.parse(readFileSync(configPath, 'utf8'))
|
|
36
36
|
|
|
37
37
|
let pass = 0, fail = 0
|
|
38
|
+
let smokeRunId = null
|
|
38
39
|
const ok = (name, cond, detail = '') => {
|
|
39
40
|
console.log(`${cond ? '✅' : '❌'} ${name}${detail ? ` — ${String(detail).slice(0, 150)}` : ''}`)
|
|
40
41
|
cond ? pass++ : fail++
|
|
@@ -178,8 +179,8 @@ if (smoke) {
|
|
|
178
179
|
}
|
|
179
180
|
}
|
|
180
181
|
}
|
|
181
|
-
|
|
182
|
-
ok('冒烟闭环步(自动 HITL):批准→下发→设备证实', okDispatch, `${propTxt.split('\n')[0]?.slice(0, 90)} runId=${
|
|
182
|
+
smokeRunId = /runId[::]\s*(rr-[\w-]+)/.exec(propTxt)?.[1] ?? null
|
|
183
|
+
ok('冒烟闭环步(自动 HITL):批准→下发→设备证实', okDispatch, `${propTxt.split('\n')[0]?.slice(0, 90)} runId=${smokeRunId}`)
|
|
183
184
|
}
|
|
184
185
|
|
|
185
186
|
// ---------- 交接声明 ----------
|
|
@@ -192,5 +193,7 @@ console.log(`
|
|
|
192
193
|
③ 由人裁决首批真实提案后,方可视为正式投用。
|
|
193
194
|
(对产线负责:任何不确定 —— 量程/步限/SP-PV 判定/认证方式/场景目标 —— skill 必须先询问用户,禁止猜测。)
|
|
194
195
|
=====================================================`)
|
|
196
|
+
// 机器可读摘要(末行 JSON;与 provision-line/forge-channel 摘要惯例对齐,供管道解析)
|
|
197
|
+
console.log(JSON.stringify({ summary: true, lineId: prov.lineId, recipeId: prov.recipeId, channelId: chSummary.channelId, smokeRunId, pass, fail }))
|
|
195
198
|
console.log(`\n======== 一键接入: ${pass} 通过 / ${fail} 失败 ========`)
|
|
196
199
|
process.exit(fail === 0 ? 0 : 1)
|
|
@@ -0,0 +1,312 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* scripts/onboarding/sim-twin.mjs —— PLC 模拟器孪生生成器(aw-plc-sim-twin skill 的执行体)。
|
|
4
|
+
*
|
|
5
|
+
* 两种模式:
|
|
6
|
+
* A. 从平台既有节点反向构造孪生(最常用:虚拟预演/割接前演练):
|
|
7
|
+
* node scripts/onboarding/sim-twin.mjs --from-platform --line <lineId> [--sim-port 4034] \
|
|
8
|
+
* [--dynamics <dynamics.json>] [--shadow <dir>] [--keep-if-up]
|
|
9
|
+
* 拉取该线全部 DCW(SV)+ DAQ(PV),按协议族归并成孪生设备写入模拟器:
|
|
10
|
+
* SV→manual(可写),PV→hook 一阶滞后跟随同名 SP(无 SP 则有界随机游走);
|
|
11
|
+
* --dynamics 可对指定 PV 覆盖因果(base/follows[{sp,gain}]/tau/noise)。
|
|
12
|
+
* B. 从文档蓝图直接构造(文档协议/API 输入输出已提炼成蓝图 JSON):
|
|
13
|
+
* node scripts/onboarding/sim-twin.mjs --blueprint <blueprint.json> [--sim-port 4034]
|
|
14
|
+
*
|
|
15
|
+
* 蓝图 JSON 形状(模式 B;devices[] 同模式 A 的内部设备模型):
|
|
16
|
+
* { "simPort": 4034, "shadowDir": "..", "mqttPort": 41830?,
|
|
17
|
+
* "devices": [ { "id":"wb-machine", "name":"键合主机", "protocol":"modbus-tcp"|"modbus-rtu"|"mqtt",
|
|
18
|
+
* "port": 37532?, "unitId": 1?,
|
|
19
|
+
* "signals": [ { "id":"usPower-sp","name":"超声功率SP","unit":"%","min":20,"max":100,
|
|
20
|
+
* "decimals":0,"kind":"sp","initial":60 },
|
|
21
|
+
* { "id":"pullForce-pv","name":"拉力强度","unit":"gf","min":0,"max":120,
|
|
22
|
+
* "decimals":2,"kind":"pv",
|
|
23
|
+
* "dynamics":{ "base":18,"tau":8,"noise":1.1,
|
|
24
|
+
* "follows":[{"sp":"超声功率SP","gain":0.55}] } } ] } ] }
|
|
25
|
+
*
|
|
26
|
+
* 输出(末行 JSON):{simBase, shadowDir, devices:[{id,protocol,port,signals}],
|
|
27
|
+
* driverSource:"sim-export", next:"对每设备 GET /api/nodes/:id/export 取 driverConfig 喂给 provision-line/onboard"}
|
|
28
|
+
*
|
|
29
|
+
* 纪律:本脚本只写模拟器(影子树),绝不写平台;平台侧接入走 onboard.mjs/provision-line.mjs。
|
|
30
|
+
* 孪生协议归一:mes-rest/http/opcua 族节点映射到 modbus-tcp 孪生设备(语义/量程保留;
|
|
31
|
+
* 协议真实性由 onboard 期的 export driverConfig 保证——模拟器 export 什么,平台就接什么)。
|
|
32
|
+
*/
|
|
33
|
+
import { spawnSync } from 'node:child_process'
|
|
34
|
+
import { existsSync, readFileSync } from 'node:fs'
|
|
35
|
+
import { dirname, join, resolve } from 'node:path'
|
|
36
|
+
import { fileURLToPath } from 'node:url'
|
|
37
|
+
|
|
38
|
+
const REPO = resolve(dirname(fileURLToPath(import.meta.url)), '..', '..')
|
|
39
|
+
const args = process.argv.slice(2)
|
|
40
|
+
const argOf = (k, d = '') => {
|
|
41
|
+
const i = args.indexOf(k)
|
|
42
|
+
return i >= 0 && args[i + 1] && !args[i + 1].startsWith('--') ? args[i + 1] : d
|
|
43
|
+
}
|
|
44
|
+
const SIM_PORT = Number(argOf('--sim-port', '4034'))
|
|
45
|
+
const SIM = `http://127.0.0.1:${SIM_PORT}`
|
|
46
|
+
const SIM_DIR = resolve(argOf('--shadow', join(REPO, '..', `plc-node-simulator-twin-${SIM_PORT}`)))
|
|
47
|
+
const AW_BASE = process.env.AW_BASE ?? 'http://127.0.0.1:3001'
|
|
48
|
+
process.env.NO_PROXY = '127.0.0.1,localhost'
|
|
49
|
+
process.env.HTTP_PROXY = ''
|
|
50
|
+
process.env.HTTPS_PROXY = ''
|
|
51
|
+
|
|
52
|
+
let pass = 0
|
|
53
|
+
const fails = []
|
|
54
|
+
const ok = (name, cond, detail = '') => {
|
|
55
|
+
if (cond) {
|
|
56
|
+
pass++
|
|
57
|
+
console.log(` ✔ ${name}`)
|
|
58
|
+
}
|
|
59
|
+
else {
|
|
60
|
+
fails.push(name)
|
|
61
|
+
console.log(` ✖ ${name}${detail ? ` — ${String(detail).slice(0, 200)}` : ''}`)
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
const sleep = ms => new Promise(r => setTimeout(r, ms))
|
|
65
|
+
|
|
66
|
+
/* ── 平台 REST ── */
|
|
67
|
+
let TOKEN = process.env.AW_TOKEN ?? ''
|
|
68
|
+
async function platformLogin() {
|
|
69
|
+
if (TOKEN) return
|
|
70
|
+
const email = process.env.AW_EMAIL
|
|
71
|
+
const passW = process.env.AW_PASS
|
|
72
|
+
if (!email || !passW) throw new Error('未鉴权:设 AW_TOKEN 或 AW_EMAIL/AW_PASS')
|
|
73
|
+
const r = await fetch(`${AW_BASE}/api/users/login`, {
|
|
74
|
+
method: 'POST', headers: { 'content-type': 'application/json' },
|
|
75
|
+
body: JSON.stringify({ email, password: passW }), signal: AbortSignal.timeout(20000),
|
|
76
|
+
})
|
|
77
|
+
const j = await r.json()
|
|
78
|
+
TOKEN = j?.data?.token ?? ''
|
|
79
|
+
if (!TOKEN) throw new Error(`登录失败:${j?.message ?? r.status}`)
|
|
80
|
+
}
|
|
81
|
+
const platform = async (method, path) => {
|
|
82
|
+
await platformLogin()
|
|
83
|
+
const r = await fetch(AW_BASE + path, {
|
|
84
|
+
method, headers: { 'content-type': 'application/json', 'authorization': `Bearer ${TOKEN}` }, signal: AbortSignal.timeout(60000),
|
|
85
|
+
})
|
|
86
|
+
return { status: r.status, ...(await r.json().catch(() => ({}))) }
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/* ── 模拟器 REST(带就绪/HTML 容错) ── */
|
|
90
|
+
const simApi = async (method, path, body, tries = 5) => {
|
|
91
|
+
for (let i = 0; i < tries; i++) {
|
|
92
|
+
try {
|
|
93
|
+
const r = await fetch(SIM + path, {
|
|
94
|
+
method, headers: { 'content-type': 'application/json' },
|
|
95
|
+
body: body === undefined ? undefined : JSON.stringify(body), signal: AbortSignal.timeout(30000),
|
|
96
|
+
})
|
|
97
|
+
if (!String(r.headers.get('content-type') ?? '').includes('json')) {
|
|
98
|
+
await sleep(3000)
|
|
99
|
+
continue
|
|
100
|
+
}
|
|
101
|
+
return await r.json()
|
|
102
|
+
}
|
|
103
|
+
catch (e) {
|
|
104
|
+
if (i === tries - 1) return { code: -1, message: e.message }
|
|
105
|
+
await sleep(3000)
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
return { code: -1, message: 'sim 未就绪' }
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
/* ── 模拟器保活(影子树复用 bench/lib/sim.mjs 的 spawn 纪律) ── */
|
|
112
|
+
async function ensureSim() {
|
|
113
|
+
const psi = spawnSync('powershell', ['-NoProfile', '-Command',
|
|
114
|
+
`Get-NetTCPConnection -LocalPort ${SIM_PORT} -State Listen -ErrorAction SilentlyContinue | Select-Object -First 1 -ExpandProperty OwningProcess`], { encoding: 'utf8' })
|
|
115
|
+
const pid = Number(psi.stdout.trim())
|
|
116
|
+
if (Number.isInteger(pid) && pid > 0 && !args.includes('--restart')) return
|
|
117
|
+
if (Number.isInteger(pid) && pid > 0) spawnSync('taskkill', ['/PID', String(pid), '/T', '/F'], { stdio: 'ignore' })
|
|
118
|
+
await sleep(1500)
|
|
119
|
+
process.env.SIM_BASE = SIM
|
|
120
|
+
process.env.SIM_SHADOW_DIR = SIM_DIR
|
|
121
|
+
const { ensureSimulator } = await import('../../bench/lib/sim.mjs')
|
|
122
|
+
await ensureSimulator({ log: () => {} })
|
|
123
|
+
let ready = false
|
|
124
|
+
for (let i = 0; i < 30 && !ready; i++) {
|
|
125
|
+
const probe = await simApi('GET', '/api/nodes', undefined, 2)
|
|
126
|
+
if (probe?.code === 0) ready = true
|
|
127
|
+
else await sleep(2000)
|
|
128
|
+
}
|
|
129
|
+
if (!ready) throw new Error('模拟器路由未就绪(端口已开但 API 非 JSON)')
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
/* ── 信号动力学(hook 代码生成;首拍 state.v=undefined → 两项都必须取 fallback,否则 NaN 永久毒化) ── */
|
|
133
|
+
const lagHook = (spName, tau, noise, fallback) =>
|
|
134
|
+
`const cur = Number.isFinite(state.v)?state.v:${fallback};`
|
|
135
|
+
+ `const tgt = Number.isFinite(vars['${spName}']) ? vars['${spName}'] : ${fallback};`
|
|
136
|
+
+ `const k = Math.min(1, dt/1000/${tau}); state.v = cur + (tgt-cur)*k + (rand()-0.5)*${noise}; return state.v`
|
|
137
|
+
const causalHook = (d, fallback, nominals = {}) => {
|
|
138
|
+
// 偏差语义:base=标称点输出,每项增益作用于 (SP 当前值 − SP 标称值) —— 与文档「工艺耦合」公式同构
|
|
139
|
+
const terms = (d.follows ?? []).map((f) => {
|
|
140
|
+
const nom = Number.isFinite(f.at) ? f.at : (nominals[f.sp] ?? 0)
|
|
141
|
+
return `${f.gain}*((Number.isFinite(vars['${f.sp}'])?vars['${f.sp}']:0) - ${nom})`
|
|
142
|
+
})
|
|
143
|
+
const base = d.base ?? fallback
|
|
144
|
+
return `const tgt = ${base}${terms.length ? ' + ' + terms.join(' + ') : ''};`
|
|
145
|
+
+ `const cur = Number.isFinite(state.v)?state.v:${fallback};`
|
|
146
|
+
+ `const k = Math.min(1, dt/1000/${d.tau ?? 8}); state.v = cur + (tgt-cur)*k + (rand()-0.5)*${d.noise ?? 1}; return state.v`
|
|
147
|
+
}
|
|
148
|
+
const wanderHook = (mid, span) =>
|
|
149
|
+
`state.v = (Number.isFinite(state.v)?state.v:${mid}) + (rand()-0.5)*${span}; `
|
|
150
|
+
+ `if (state.v > ${mid + span * 4}) state.v = ${mid + span * 4}; if (state.v < ${mid - span * 4}) state.v = ${mid - span * 4}; return state.v`
|
|
151
|
+
|
|
152
|
+
const norm = n => String(n).replace(/(PV|实测|实际|回读|-回读|值)$/g, '').trim()
|
|
153
|
+
|
|
154
|
+
/* ── 模式 A:平台节点 → 孪生设备 ── */
|
|
155
|
+
async function fromPlatform(lineId, dynamicsFile) {
|
|
156
|
+
const dyn = dynamicsFile && existsSync(dynamicsFile) ? JSON.parse(readFileSync(dynamicsFile, 'utf8')) : {}
|
|
157
|
+
const dcw = (await platform('GET', '/api/workshop/dcw?limit=200'))?.data?.nodes?.filter(n => n.lineId === lineId) ?? []
|
|
158
|
+
const daq = (await platform('GET', '/api/workshop/daq?limit=300'))?.data?.nodes?.filter(n => n.lineId === lineId) ?? []
|
|
159
|
+
if (!dcw.length && !daq.length) throw new Error(`线 ${lineId} 无节点(dcw=${dcw.length} daq=${daq.length})`)
|
|
160
|
+
// 协议族归并(mes-rest/http/opcua → modbus-tcp 孪生;语义/量程保留)
|
|
161
|
+
const fam = n => (['modbus-tcp', 'modbus-rtu', 'mqtt'].includes(n.driver) ? n.driver : 'modbus-tcp')
|
|
162
|
+
const families = {}
|
|
163
|
+
for (const n of [...dcw, ...daq]) (families[fam(n)] ??= []).push(n)
|
|
164
|
+
const devices = []
|
|
165
|
+
for (const [family, nodes] of Object.entries(families)) {
|
|
166
|
+
const spNodes = nodes.filter(n => n.templateRef?.startsWith('dcw') || dcw.some(d => d.id === n.id))
|
|
167
|
+
const spNames = spNodes.map(n => norm(n.name))
|
|
168
|
+
const nominals = Object.fromEntries(spNodes.map(n => [norm(n.name), Number(n.value ?? ((Number(n.min ?? 0) + Number(n.max ?? 100)) / 2).toFixed(3))]))
|
|
169
|
+
const signals = []
|
|
170
|
+
for (const n of nodes) {
|
|
171
|
+
const isSp = dcw.some(d => d.id === n.id)
|
|
172
|
+
const min = Number(n.min ?? 0), max = Number(n.max ?? 100)
|
|
173
|
+
const mid = Number(((min + max) / 2).toFixed(3))
|
|
174
|
+
if (isSp) {
|
|
175
|
+
signals.push({ id: n.id, name: n.name, unit: n.unit ?? '', min, max, decimals: n.decimals ?? 2, kind: 'sp', initial: Number(n.value ?? mid) })
|
|
176
|
+
}
|
|
177
|
+
else {
|
|
178
|
+
const d = dyn[n.name] ?? {}
|
|
179
|
+
// 同设备同名 SP 归属:strip 后缀匹配
|
|
180
|
+
const spHit = spNames.find(sp => sp === norm(n.name))
|
|
181
|
+
let code
|
|
182
|
+
if (d.follows?.length || d.base != null) code = causalHook(d, mid, nominals)
|
|
183
|
+
else if (spHit) code = lagHook(spHit, d.tau ?? 10, d.noise ?? 0.8, mid)
|
|
184
|
+
else code = wanderHook(mid, Math.max((max - min) / 200, 0.2))
|
|
185
|
+
signals.push({ id: n.id, name: n.name, unit: n.unit ?? '', min, max, decimals: n.decimals ?? 3, kind: 'pv', code, dynamics: { tau: d.tau ?? 10, noise: d.noise ?? 0.8, sp: spHit ?? null } })
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
devices.push({ family, nodes, signals })
|
|
189
|
+
}
|
|
190
|
+
return { devices }
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
/* ── 蓝图 → 设备(模式 B 归一到同一内部模型) ── */
|
|
194
|
+
function fromBlueprint(file) {
|
|
195
|
+
const bp = JSON.parse(readFileSync(file, 'utf8'))
|
|
196
|
+
const devices = (bp.devices ?? []).map(d => ({
|
|
197
|
+
id: d.id,
|
|
198
|
+
family: d.protocol ?? 'modbus-tcp',
|
|
199
|
+
port: d.port,
|
|
200
|
+
unitId: d.unitId ?? 1,
|
|
201
|
+
mqtt: d.mqtt,
|
|
202
|
+
signals: (d.signals ?? []).map(s => ({
|
|
203
|
+
id: s.id, name: s.name, unit: s.unit ?? '', min: Number(s.min ?? 0), max: Number(s.max ?? 100),
|
|
204
|
+
decimals: s.decimals ?? 2, kind: s.kind ?? (String(s.id).endsWith('-sp') ? 'sp' : 'pv'),
|
|
205
|
+
initial: s.initial, code: s.code, dynamics: s.dynamics ?? {},
|
|
206
|
+
})),
|
|
207
|
+
}))
|
|
208
|
+
return { devices, mqttPort: bp.mqttPort }
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
/* ── 设备写入模拟器 ── */
|
|
212
|
+
let port = 37540
|
|
213
|
+
async function materialize(devices, mqttPort) {
|
|
214
|
+
const created = []
|
|
215
|
+
for (const dev of devices) {
|
|
216
|
+
const id = dev.id ?? `twin-${dev.family}-${created.length + 1}`
|
|
217
|
+
const protocol = dev.family
|
|
218
|
+
const config = {}
|
|
219
|
+
if (protocol === 'modbus-tcp' || protocol === 'modbus-rtu') {
|
|
220
|
+
config.host = '0.0.0.0'
|
|
221
|
+
config.port = dev.port ?? (port += 2)
|
|
222
|
+
config.unitId = dev.unitId ?? 1
|
|
223
|
+
config.registerMaps = dev.signals.map((s, i) => ({ address: 40001 + i * 2, area: 'holding', signalId: s.id, dataType: 'float32', byteOrder: 'big' }))
|
|
224
|
+
}
|
|
225
|
+
else if (protocol === 'mqtt') {
|
|
226
|
+
config.brokerUrl = `mqtt://127.0.0.1:${mqttPort}`
|
|
227
|
+
config.topics = dev.signals.filter(s => s.kind === 'pv').map(s => ({ topic: `aw/twin/${id}/${s.id}`, signalId: s.id, payloadTemplate: `{"data":{"${s.id}":\${value}}}`, qos: 0 }))
|
|
228
|
+
const sp = dev.signals.find(s => s.kind === 'sp')
|
|
229
|
+
if (sp) {
|
|
230
|
+
config.commandTopic = `aw/twin/${id}/set`
|
|
231
|
+
config.commandSignalId = sp.id
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
const nominals = Object.fromEntries(dev.signals.filter(s => s.kind === 'sp').map(s => [s.name, Number(s.initial ?? (s.min + s.max) / 2)]))
|
|
235
|
+
const signals = dev.signals.map(s => ({
|
|
236
|
+
id: s.id, name: s.name, description: `孪生:${s.name}`, unit: s.unit, min: s.min, max: s.max, decimals: s.decimals,
|
|
237
|
+
strategy: s.kind === 'sp'
|
|
238
|
+
? { kind: 'manual', value: s.initial ?? (s.min + s.max) / 2 }
|
|
239
|
+
: { kind: 'hook', code: s.code
|
|
240
|
+
?? (s.dynamics && (s.dynamics.follows?.length || s.dynamics.base != null)
|
|
241
|
+
? causalHook(s.dynamics, (s.min + s.max) / 2, nominals)
|
|
242
|
+
: wanderHook((s.min + s.max) / 2, Math.max((s.max - s.min) / 200, 0.2))) },
|
|
243
|
+
}))
|
|
244
|
+
const r = await simApi('POST', '/api/nodes', { id, name: `${id}(孪生)`, description: `aw-plc-sim-twin 生成:${dev.signals.length} 信号`, protocol, enabled: true, tickMs: 1000, signals, config })
|
|
245
|
+
ok(`设备 ${id}(${protocol},${signals.length} 信号)`, r?.code === 0, r?.message ?? '')
|
|
246
|
+
created.push({ id, protocol, port: config.port ?? null, signals: signals.length, sourceNodes: dev.nodes?.map(n => n.id) ?? null })
|
|
247
|
+
}
|
|
248
|
+
return created
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
/* ── 孪生活性自检(PV 应随时间波动;只查本轮创建的设备) ── */
|
|
252
|
+
async function livenessCheck(createdIds) {
|
|
253
|
+
await sleep(8000)
|
|
254
|
+
const a = await simApi('GET', '/api/nodes')
|
|
255
|
+
const devs = (a?.data ?? []).filter(n => createdIds.includes(n.id))
|
|
256
|
+
const snap = devs.map(n => ({ id: n.id, v: (n.signals ?? []).map(s => s.value) }))
|
|
257
|
+
await sleep(6000)
|
|
258
|
+
const b = await simApi('GET', '/api/nodes')
|
|
259
|
+
const devs2 = (b?.data ?? []).filter(n => createdIds.includes(n.id))
|
|
260
|
+
let moved = 0
|
|
261
|
+
const dead = []
|
|
262
|
+
for (const d2 of devs2) {
|
|
263
|
+
const before = snap.find(x => x.id === d2.id)
|
|
264
|
+
const pv = (d2.signals ?? []).filter(s => s.strategy?.kind === 'hook' || s.strategy?.kind === 'expression')
|
|
265
|
+
const changed = pv.some((s, i) => Number(s.value) !== Number(before?.v?.[before.v.length - pv.length + i]))
|
|
266
|
+
if (changed) moved++
|
|
267
|
+
else dead.push(d2.id)
|
|
268
|
+
}
|
|
269
|
+
ok(`孪生 tick 活性(${moved}/${devs2.length} 设备 PV 在动)`, moved === devs2.length && devs2.length > 0, dead.length ? `冻结:${dead.join(',')} — 处方:整树重启模拟器(POST 不可修)` : '')
|
|
270
|
+
return { devices: devs2.length, signals: devs2.reduce((a, n) => a + (n.signals ?? []).length, 0) }
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
/* ── 主流程 ── */
|
|
274
|
+
console.log(`[sim-twin] 模拟器 :${SIM_PORT} 影子树 ${SIM_DIR}`)
|
|
275
|
+
await ensureSim()
|
|
276
|
+
let created, liveness
|
|
277
|
+
if (args.includes('--from-platform')) {
|
|
278
|
+
const lineId = argOf('--line')
|
|
279
|
+
if (!lineId) {
|
|
280
|
+
console.error('用法:--from-platform 需要 --line <lineId>')
|
|
281
|
+
process.exit(1)
|
|
282
|
+
}
|
|
283
|
+
console.log(`[sim-twin] 从平台线 ${lineId} 反向构造孪生…`)
|
|
284
|
+
const { devices } = await fromPlatform(lineId, argOf('--dynamics'))
|
|
285
|
+
console.log(` 协议族归并:${devices.map(d => `${d.family}×${d.signals.length}`).join(' + ')}`)
|
|
286
|
+
created = await materialize(devices, Number(argOf('--mqtt-port', String(18830 + (SIM_PORT - 4010) * 1000))))
|
|
287
|
+
}
|
|
288
|
+
else if (args.includes('--blueprint')) {
|
|
289
|
+
const bpFile = argOf('--blueprint')
|
|
290
|
+
if (!bpFile || !existsSync(bpFile)) {
|
|
291
|
+
console.error('用法:--blueprint <file.json>')
|
|
292
|
+
process.exit(1)
|
|
293
|
+
}
|
|
294
|
+
const { devices, mqttPort } = fromBlueprint(bpFile)
|
|
295
|
+
created = await materialize(devices, Number(argOf('--mqtt-port', mqttPort ?? String(18830 + (SIM_PORT - 4010) * 1000))))
|
|
296
|
+
}
|
|
297
|
+
else {
|
|
298
|
+
console.error('用法:sim-twin.mjs --from-platform --line <id> | --blueprint <file> [--sim-port 4034] [--dynamics file]')
|
|
299
|
+
process.exit(1)
|
|
300
|
+
}
|
|
301
|
+
liveness = await livenessCheck(created.map(c => c.id))
|
|
302
|
+
console.log('')
|
|
303
|
+
console.log('════════════════════════════════════════')
|
|
304
|
+
console.log(` sim-twin:${pass} PASS / ${fails.length} FAIL`)
|
|
305
|
+
for (const f of fails) console.log(` ✖ ${f}`)
|
|
306
|
+
const summary = {
|
|
307
|
+
simBase: SIM, shadowDir: SIM_DIR, devices: created, totalSignals: liveness.signals,
|
|
308
|
+
driverSource: 'sim-export',
|
|
309
|
+
next: `对每设备 GET ${SIM}/api/nodes/<id>/export 取 items[].driverConfig,喂给 provision-line/onboard(driverConfig 替换为模拟器 export,量程/stepLimit 保留)`,
|
|
310
|
+
}
|
|
311
|
+
console.log(JSON.stringify(summary))
|
|
312
|
+
if (fails.length) process.exit(1)
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DELETE /api/workshop/analysis/:id —— 删除分析报告(仅 admin;台账 Agent 面无删,清污数据走此口)。
|
|
3
|
+
*/
|
|
4
|
+
import { getRouterParam } from 'h3'
|
|
5
|
+
import { requireRole } from '@/server/api/workshop/caller'
|
|
6
|
+
import { defineApiHandler } from '@/server/utils/response'
|
|
7
|
+
import { AppError } from '@/server/utils/errors'
|
|
8
|
+
import { getAnalysisRepo } from '@/server/services/workshop/analysis/analysis.repo'
|
|
9
|
+
import { recordOps } from '@/server/services/workshop/ops/ops'
|
|
10
|
+
|
|
11
|
+
export default defineApiHandler(async (event) => {
|
|
12
|
+
const user = requireRole(event)
|
|
13
|
+
const id = getRouterParam(event, 'id')!
|
|
14
|
+
const report = getAnalysisRepo().get(id)
|
|
15
|
+
if (!report) throw new AppError(404, 'NOT_FOUND', `分析报告不存在: ${id}`)
|
|
16
|
+
getAnalysisRepo().remove(id)
|
|
17
|
+
recordOps({
|
|
18
|
+
actor: user.id,
|
|
19
|
+
actorName: user.name,
|
|
20
|
+
actorKind: 'user',
|
|
21
|
+
action: 'analysis.delete',
|
|
22
|
+
kind: 'analysis',
|
|
23
|
+
targetKind: 'analysis',
|
|
24
|
+
targetId: id,
|
|
25
|
+
lineId: report.lineId,
|
|
26
|
+
recipeId: report.recipeId,
|
|
27
|
+
summary: `删除分析报告「${report.title}」(产线「${report.lineName || report.lineId || '-'}」)`,
|
|
28
|
+
})
|
|
29
|
+
return { ok: true }
|
|
30
|
+
})
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GET /api/workshop/analysis/:id —— 分析报告详情(含完整正文;产线可见性校验)。
|
|
3
|
+
*/
|
|
4
|
+
import { getRouterParam } from 'h3'
|
|
5
|
+
import { defineApiHandler } from '@/server/utils/response'
|
|
6
|
+
import { AppError } from '@/server/utils/errors'
|
|
7
|
+
import { resolveUser } from '@/server/api/workshop/caller'
|
|
8
|
+
import { visibleLineIds } from '@/server/services/workshop/permissions'
|
|
9
|
+
import { getAnalysisRepo } from '@/server/services/workshop/analysis/analysis.repo'
|
|
10
|
+
|
|
11
|
+
export default defineApiHandler(async (event) => {
|
|
12
|
+
const user = resolveUser(event)
|
|
13
|
+
const id = getRouterParam(event, 'id')!
|
|
14
|
+
const report = getAnalysisRepo().get(id)
|
|
15
|
+
if (!report) throw new AppError(404, 'NOT_FOUND', `分析报告不存在: ${id}`)
|
|
16
|
+
if (report.lineId) {
|
|
17
|
+
const visible = visibleLineIds(user)
|
|
18
|
+
if (visible && !visible.has(report.lineId)) {
|
|
19
|
+
throw new AppError(403, 'LINE_FORBIDDEN', `无权查看产线「${report.lineName || report.lineId}」的分析报告`)
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
return { report }
|
|
23
|
+
})
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GET /api/workshop/analysis —— 分析报告台账列表(线/配方/分类/关键词/时间窗过滤;产线可见性过滤)。
|
|
3
|
+
*/
|
|
4
|
+
import { getQuery } from 'h3'
|
|
5
|
+
import { defineApiHandler } from '@/server/utils/response'
|
|
6
|
+
import { resolveUser } from '@/server/api/workshop/caller'
|
|
7
|
+
import { filterByLine } from '@/server/services/workshop/permissions'
|
|
8
|
+
import { getAnalysisRepo } from '@/server/services/workshop/analysis/analysis.repo'
|
|
9
|
+
|
|
10
|
+
export default defineApiHandler(async (event) => {
|
|
11
|
+
const user = resolveUser(event)
|
|
12
|
+
const q = getQuery(event)
|
|
13
|
+
const s = (k: string): string | undefined => (typeof q[k] === 'string' && q[k] ? (q[k] as string) : undefined)
|
|
14
|
+
// 时间窗归一:列内 created_at 是本地时区 ISO(平台 toISOString 补丁),外部传入的
|
|
15
|
+
// Z 格式/epoch ms 必须归一到同一文本形态,否则 SQL 文本比较错位
|
|
16
|
+
const timeArg = (k: string): string | undefined => {
|
|
17
|
+
const raw = s(k)
|
|
18
|
+
if (!raw) return undefined
|
|
19
|
+
const ms = /^\d{10,}$/.test(raw) ? Number(raw) : Date.parse(raw)
|
|
20
|
+
return Number.isFinite(ms) ? new Date(ms).toISOString() : undefined
|
|
21
|
+
}
|
|
22
|
+
const rows = getAnalysisRepo().list({
|
|
23
|
+
lineId: s('lineId'),
|
|
24
|
+
recipeId: s('recipeId'),
|
|
25
|
+
category: s('category'),
|
|
26
|
+
q: s('q'),
|
|
27
|
+
from: timeArg('from'),
|
|
28
|
+
to: timeArg('to'),
|
|
29
|
+
limit: Math.min(500, Math.max(1, Number(q.limit) || 100)),
|
|
30
|
+
})
|
|
31
|
+
const visible = filterByLine(user, rows, r => r.lineId || null)
|
|
32
|
+
return { reports: visible, count: visible.length }
|
|
33
|
+
})
|
|
@@ -56,6 +56,7 @@ import { envStatus, startCreateVenv } from '../services/workshop/aml/env-manager
|
|
|
56
56
|
import { attachOmpPluginBridge } from '../services/workshop/agents/plugin-tools'
|
|
57
57
|
import { startAmlRetentionTimer, stopAmlRetentionTimer } from '../services/workshop/aml/retention'
|
|
58
58
|
import { configureMesDatasets, defaultDatasetsDir } from '../services/workshop/mes/mes-datasets'
|
|
59
|
+
import { configureAnalysisRepo } from '../services/workshop/analysis/analysis.repo'
|
|
59
60
|
import { configureMesHooks } from '../services/workshop/mes/mes-hook'
|
|
60
61
|
|
|
61
62
|
declare global {
|
|
@@ -156,6 +157,9 @@ export default function workshopPlugin(nitroApp: {
|
|
|
156
157
|
// MES 数据下沉 hook 运行时(产物落 <configRoot>/data/mes-artifacts/<nodeId>/)
|
|
157
158
|
configureMesHooks(dataDir)
|
|
158
159
|
|
|
160
|
+
// 数据分析系统:分析报告台账(v26 新表由 SCHEMA_SQL 启动建出)
|
|
161
|
+
configureAnalysisRepo(db)
|
|
162
|
+
|
|
159
163
|
// 插件 omp 工具注册桥:启动即接管 pending 队列(此前首次 spawn omp agent 才挂桥,
|
|
160
164
|
// 全新实例未 spawn 前 kb_agent/diag_run 等插件工具会一直"未知工具")
|
|
161
165
|
attachOmpPluginBridge()
|
|
@@ -398,7 +398,7 @@ export const userRepository = {
|
|
|
398
398
|
const current = this.findById(id)
|
|
399
399
|
if (!current) return undefined
|
|
400
400
|
const fields: string[] = []
|
|
401
|
-
const params: string
|
|
401
|
+
const params: Array<string | number> = []
|
|
402
402
|
if (input.name !== undefined) {
|
|
403
403
|
fields.push('name = ?')
|
|
404
404
|
params.push(input.name)
|
|
@@ -496,7 +496,7 @@ export const userRepository = {
|
|
|
496
496
|
/** 吊销某用户全部会话 token(管理面重置密码后强制重新登录,旧会话即死) */
|
|
497
497
|
revokeAllTokens(userId: string): number {
|
|
498
498
|
const d = getDb()
|
|
499
|
-
return d.prepare('DELETE FROM user_tokens WHERE user_id = ?').run(userId).changes
|
|
499
|
+
return Number(d.prepare('DELETE FROM user_tokens WHERE user_id = ?').run(userId).changes)
|
|
500
500
|
},
|
|
501
501
|
|
|
502
502
|
/** 测试钩子:替换内部 DB(重开内存库等) */
|
|
@@ -48,7 +48,8 @@ export const AML_MODEL_BACKED_TOOL_NAMES = new Set([
|
|
|
48
48
|
* 直接写族(agents/tool-classes 清单)在尾部 writesBlocked 再兜底过滤一道。
|
|
49
49
|
* kb_agent/diag_run/diag_status 等 KB/诊断工具走 rag-bridge/diag-bridge 插件面,照常按频道插件开关注入,不进本白名单。
|
|
50
50
|
*/
|
|
51
|
-
/** 只读观察读面(两档共用,全部只读;exp_collect
|
|
51
|
+
/** 只读观察读面(两档共用,全部只读;exp_collect 由经验采集底座注册,此处按名引用;
|
|
52
|
+
* analysis_save/query 为数据分析留痕台账面 —— 台账写入非产线写,观察档位同样要留痕诊断结论) */
|
|
52
53
|
export const OBSERVER_READ_TOOL_NAMES = new Set([
|
|
53
54
|
'ops_log',
|
|
54
55
|
'recipe_log',
|
|
@@ -57,6 +58,8 @@ export const OBSERVER_READ_TOOL_NAMES = new Set([
|
|
|
57
58
|
'dcw_journal',
|
|
58
59
|
'daq_query',
|
|
59
60
|
'exp_collect',
|
|
61
|
+
'analysis_save',
|
|
62
|
+
'analysis_query',
|
|
60
63
|
])
|
|
61
64
|
|
|
62
65
|
/**
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* 工业工具族(my_industrial_nodes / aml_* / dcw_* / param_* / daq_* / ops_log / recipe_* / line_context)。
|
|
2
|
+
* 工业工具族(my_industrial_nodes / aml_* / dcw_* / param_* / daq_* / ops_log / recipe_* / line_context / analysis_*)。
|
|
3
3
|
*
|
|
4
4
|
* 原 dispatchHostTool 首个 switch 的 26 个转发分支按行搬运到本模块:每个分支都只是
|
|
5
5
|
* 「按 agentId 查绑定与节点后转交 industrial 模块的同名函数」,因此把闭包捕获的
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
* 该族**不依赖 workspace**,由 dispatch 在 workspace 门控之前分流(保持原分发顺序)。
|
|
10
10
|
*/
|
|
11
11
|
import type { HostToolResult } from '../types'
|
|
12
|
-
import { toolLineStart, toolLineStop, toolLineStatus, toolAmlDatasetBuild, toolAmlDatasetStats, toolAmlJobCancel, toolAmlJobLogs, toolAmlJobStatus, toolAmlJobSubmit, toolAmlLeaderboard, toolAmlModelFind, toolAmlModelPromote, toolAmlModelReference, toolAmlNodeCatalog, toolAmlTrainingPlanCreate, toolAmlTrainingPlanList, toolAmlTrainingPlanTrain, toolDaqExport, toolDaqFrames, toolDaqQuery, toolDcwControl, toolDcwJudge, toolDcwJournal, toolDcwRead, toolDcwRollback, toolLineContext, toolMesCatalog, toolMesDatasetRead, toolMesDatasets, toolMesFetch, toolMyIndustrialNodes, toolOpsLog, toolParamControl, toolParamRead, toolRecipeApply, toolRecipeLog, toolRecipeRollback, toolRecipeTrial, toolRecipeUpdate, toolRecipeVersions, toolOptimizationExplore, toolTwinProviderCatalog, toolTwinSceneDiscover, toolTwinSceneCompile, toolTwinSceneFreeze, toolTwinSceneRead, toolTwinPhysicsSpecDraft, toolTwinPhysicsSpecValidate, toolTwinPhysicsSpecCompile, toolTwinSnapshotCreate, toolTwinTrialRun, toolMpcOptimize, toolTwinGateEvaluate, toolTwinBayesOptimize, toolTwinCalibrationRequest } from '../../industrial'
|
|
12
|
+
import { toolLineStart, toolLineStop, toolLineStatus, toolAmlDatasetBuild, toolAmlDatasetStats, toolAmlJobCancel, toolAmlJobLogs, toolAmlJobStatus, toolAmlJobSubmit, toolAmlLeaderboard, toolAmlModelFind, toolAmlModelPromote, toolAmlModelReference, toolAmlNodeCatalog, toolAmlTrainingPlanCreate, toolAmlTrainingPlanList, toolAmlTrainingPlanTrain, toolDaqExport, toolDaqFrames, toolDaqQuery, toolDcwControl, toolDcwJudge, toolDcwJournal, toolDcwRead, toolDcwRollback, toolLineContext, toolMesCatalog, toolMesDatasetRead, toolMesDatasets, toolMesFetch, toolMyIndustrialNodes, toolOpsLog, toolParamControl, toolParamRead, toolRecipeApply, toolRecipeLog, toolRecipeRollback, toolRecipeTrial, toolRecipeUpdate, toolRecipeVersions, toolOptimizationExplore, toolTwinProviderCatalog, toolTwinSceneDiscover, toolTwinSceneCompile, toolTwinSceneFreeze, toolTwinSceneRead, toolTwinPhysicsSpecDraft, toolTwinPhysicsSpecValidate, toolTwinPhysicsSpecCompile, toolTwinSnapshotCreate, toolTwinTrialRun, toolMpcOptimize, toolTwinGateEvaluate, toolTwinBayesOptimize, toolTwinCalibrationRequest, toolAnalysisSave, toolAnalysisQuery } from '../../industrial'
|
|
13
13
|
|
|
14
14
|
import { toolExpCollect } from '../../industrial/exp-tools'
|
|
15
15
|
import { toolRecipePropose } from '../../industrial/recipe-propose-tools'
|
|
@@ -78,6 +78,9 @@ const INDUSTRIAL_HANDLERS = new Map<string, IndustrialToolHandler>([
|
|
|
78
78
|
['line_stop', (agentId, args, channelId) => toolLineStop(agentId, args as Parameters<typeof toolLineStop>[1], channelId)],
|
|
79
79
|
['line_status', (agentId, args, channelId) => toolLineStatus(agentId, args as Parameters<typeof toolLineStatus>[1], channelId)],
|
|
80
80
|
['aml_activity', (agentId, args) => toolAmlActivity(agentId, args as { line_id?: string })],
|
|
81
|
+
// 数据分析系统:分析结果留痕台账(save 可写台账(非产线写);query 查历史留痕)
|
|
82
|
+
['analysis_save', (agentId, args, channelId) => toolAnalysisSave(agentId, args as Parameters<typeof toolAnalysisSave>[1], channelId)],
|
|
83
|
+
['analysis_query', (agentId, args) => toolAnalysisQuery(agentId, args as Parameters<typeof toolAnalysisQuery>[1])],
|
|
81
84
|
])
|
|
82
85
|
|
|
83
86
|
/** 工业工具名集合(与 INDUSTRIAL_HANDLERS 同源;dispatch 据此在 workspace 门控前分流) */
|