agentworkshop 0.7.6 → 0.7.8
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/{rzGB_ojX.js → 3612gD2V.js} +2 -2
- package/.output/public/_nuxt/8eIQAVlb.js +1 -0
- package/.output/public/_nuxt/Ah9qOv1m.js +1 -0
- package/.output/public/_nuxt/{DdPeifHR.js → B4Fia4FB.js} +1 -1
- package/.output/public/_nuxt/B7aqqzkY.js +1 -0
- package/.output/public/_nuxt/BJ-fxrSw.js +1 -0
- package/.output/public/_nuxt/{DPDqAD1e.js → BSXx2vqR.js} +1 -1
- package/.output/public/_nuxt/{CdSgfcYR.js → BVZjSVs2.js} +1 -1
- package/.output/public/_nuxt/{DP6bdyIp.js → BVzDoF8t.js} +1 -1
- package/.output/public/_nuxt/BYL0Rjqj.js +7 -0
- package/.output/public/_nuxt/{CXmkVXS5.js → BjVLsC3M.js} +1 -1
- package/.output/public/_nuxt/{7ZABjMRh2.js → BkfchkK62.js} +1 -1
- package/.output/public/_nuxt/BnVoQ74r.js +1 -0
- package/.output/public/_nuxt/Bnp4vIAf.js +1 -0
- package/.output/public/_nuxt/BsMpJf7S.js +70 -0
- package/.output/public/_nuxt/{Z8k0uMSI.js → Bt_HDizI.js} +1 -1
- package/.output/public/_nuxt/Bu-P92Pe.js +18 -0
- package/.output/public/_nuxt/ButLXkjo.js +2 -0
- package/.output/public/_nuxt/{D8DDDzV62.js → C2iWjzEC2.js} +1 -1
- package/.output/public/_nuxt/{HWXLx5Hz.js → C8dxXc6K.js} +5 -5
- package/.output/public/_nuxt/CGdPdJPP.js +1 -0
- package/.output/public/_nuxt/{CN7Zh8GQ.js → CRGlf1Gb.js} +1 -1
- package/.output/public/_nuxt/{DSBfvCi5.js → CblLEiCZ.js} +7 -7
- package/.output/public/_nuxt/Cd15nPnG2.js +1 -0
- package/.output/public/_nuxt/{OwJ1LJkF.js → CsCpu2Zh.js} +1 -1
- package/.output/public/_nuxt/CvbHIGQY2.js +1 -0
- package/.output/public/_nuxt/Cyk3du4K2.js +1 -0
- package/.output/public/_nuxt/{DVQAz9WI.js → D4qXvjuV.js} +2 -2
- package/.output/public/_nuxt/{CfIXY-ET.js → DCEyMaN-.js} +1 -1
- package/.output/public/_nuxt/{BFYNhG9S.js → DCXIGxzT.js} +1 -1
- package/.output/public/_nuxt/{B9aPoQvt.js → DM8DS9MA.js} +1 -1
- package/.output/public/_nuxt/{ChnfyQHz.js → DNzaswei.js} +1 -1
- package/.output/public/_nuxt/{CrFGZYVB2.js → DYZBdSSg2.js} +1 -1
- package/.output/public/_nuxt/{dObsRdSQ.js → DZk24ego.js} +1 -1
- package/.output/public/_nuxt/{CyygA0q4.js → Dc46i75T.js} +4 -4
- package/.output/public/_nuxt/DeYsUzhr.js +1 -0
- package/.output/public/_nuxt/Dk6pq9JB2.js +1 -0
- package/.output/public/_nuxt/{ByGNWgAr.js → Do88WZG2.js} +3 -3
- package/.output/public/_nuxt/{R_WxTozV2.js → Du-eSpo2.js} +1 -1
- package/.output/public/_nuxt/OmpTerminalPanel.B_Pl5Ynm.css +1 -0
- package/.output/public/_nuxt/R_Wv_Nd9.js +1 -0
- package/.output/public/_nuxt/{Bsc69G4x.js → VnIWJ0ts.js} +3 -3
- package/.output/public/_nuxt/_id_.BzKMZnLe.css +1 -0
- package/.output/public/_nuxt/_id_.CbpDAWRh.css +1 -0
- package/.output/public/_nuxt/{_wsId_.DET_GinP.css → _wsId_.COUzMXpP.css} +1 -1
- package/.output/public/_nuxt/agents.BlejnOOC.css +1 -0
- package/.output/public/_nuxt/builds/latest.json +1 -1
- package/.output/public/_nuxt/builds/meta/e5bb1803-86d9-43b3-85be-dc787dc9a978.json +1 -0
- package/.output/public/_nuxt/daq.zZ8GR433.css +1 -0
- package/.output/public/_nuxt/{default.D17kXlD6.css → default.V3_hUJq1.css} +1 -1
- package/.output/public/_nuxt/{entry.DvlXlPwx.css → entry.5qf6EqfN.css} +1 -1
- package/.output/public/_nuxt/{B4GHHF6d2.js → fQUs58kX2.js} +1 -1
- package/.output/public/_nuxt/p7wSGMtc.js +1 -0
- package/.output/public/_nuxt/tRBT-plo.js +1 -0
- package/.output/public/_nuxt/workshop.3kAcLB_M.css +1 -0
- package/.output/server/chunks/_/SearchOutlined.mjs +4 -4
- package/.output/server/chunks/_/SearchOutlined.mjs.map +1 -1
- package/.output/server/chunks/_/character-asset.repo.mjs +3 -6
- package/.output/server/chunks/_/character-asset.repo.mjs.map +1 -1
- package/.output/server/chunks/_/host-bindings.mjs +1 -1
- package/.output/server/chunks/_/nitro.mjs +12807 -9814
- package/.output/server/chunks/_/nitro.mjs.map +1 -1
- package/.output/server/chunks/_/scene-layout.repo.mjs +4 -10
- package/.output/server/chunks/_/scene-layout.repo.mjs.map +1 -1
- package/.output/server/chunks/build/{Col-D7fjGDF6.mjs → Col-biaNnEPf.mjs} +2 -2
- package/.output/server/chunks/build/{Col-D7fjGDF6.mjs.map → Col-biaNnEPf.mjs.map} +1 -1
- package/.output/server/chunks/build/{OmpTerminalPanel-B_SYhmgb.mjs → OmpTerminalPanel-COphA1br.mjs} +20 -19
- package/.output/server/chunks/build/OmpTerminalPanel-COphA1br.mjs.map +1 -0
- package/.output/server/chunks/build/{TownView-Bl8Gkcxi.mjs → TownView-B5KifIaT.mjs} +5 -5
- package/.output/server/chunks/build/{TownView-Bl8Gkcxi.mjs.map → TownView-B5KifIaT.mjs.map} +1 -1
- package/.output/server/chunks/build/{_id_-GnRJPykX.mjs → _id_-C-ewLgfl.mjs} +120 -120
- package/.output/server/chunks/build/{_id_-GnRJPykX.mjs.map → _id_-C-ewLgfl.mjs.map} +1 -1
- package/.output/server/chunks/build/{_id_-CWLFGZjV.mjs → _id_-Ct4Jhvl1.mjs} +43 -39
- package/.output/server/chunks/build/_id_-Ct4Jhvl1.mjs.map +1 -0
- package/.output/server/chunks/build/{_wsId_-BhQMjyHG.mjs → _wsId_-CanI_6Su.mjs} +591 -53
- package/.output/server/chunks/build/{_wsId_-BhQMjyHG.mjs.map → _wsId_-CanI_6Su.mjs.map} +1 -1
- package/.output/server/chunks/build/{agents-D4l1icvn.mjs → agents-DSOptxXA.mjs} +146 -91
- package/.output/server/chunks/build/agents-DSOptxXA.mjs.map +1 -0
- package/.output/server/chunks/build/{alert-gH-s7yIh.mjs → alert-qJnjyRcP.mjs} +3 -3
- package/.output/server/chunks/build/{alert-gH-s7yIh.mjs.map → alert-qJnjyRcP.mjs.map} +1 -1
- package/.output/server/chunks/build/{button-BhbX5ACI.mjs → button-DEcZFcqN.mjs} +3 -3
- package/.output/server/chunks/build/{button-BhbX5ACI.mjs.map → button-DEcZFcqN.mjs.map} +1 -1
- package/.output/server/chunks/build/{card-l4BbX67w.mjs → card-Dipvaykh.mjs} +5 -5
- package/.output/server/chunks/build/{card-l4BbX67w.mjs.map → card-Dipvaykh.mjs.map} +1 -1
- package/.output/server/chunks/build/{channel-templates-DqjtC-R0.mjs → channel-templates-BK0KuPOd.mjs} +13 -12
- package/.output/server/chunks/build/channel-templates-BK0KuPOd.mjs.map +1 -0
- package/.output/server/chunks/build/{checkbox-BF11p3dH.mjs → checkbox-dzcpU_Cd.mjs} +4 -4
- package/.output/server/chunks/build/{checkbox-BF11p3dH.mjs.map → checkbox-dzcpU_Cd.mjs.map} +1 -1
- package/.output/server/chunks/build/{daq-BOgpn9sl.mjs → daq-D9RA_uze.mjs} +103 -103
- package/.output/server/chunks/build/{daq-BOgpn9sl.mjs.map → daq-D9RA_uze.mjs.map} +1 -1
- package/.output/server/chunks/build/dcw-BTM5YU-B.mjs +2 -2
- package/.output/server/chunks/build/{default-CKJWhkot.mjs → default-BfWGTlbj.mjs} +81 -23
- package/.output/server/chunks/build/{default-CKJWhkot.mjs.map → default-BfWGTlbj.mjs.map} +1 -1
- package/.output/server/chunks/build/{drawer-CVValqoh.mjs → drawer-Cmh90erI.mjs} +3 -3
- package/.output/server/chunks/build/{drawer-CVValqoh.mjs.map → drawer-Cmh90erI.mjs.map} +1 -1
- package/.output/server/chunks/build/{dropdown-ByCsEWlQ.mjs → dropdown-CGQ0KAzA.mjs} +2 -2
- package/.output/server/chunks/build/{dropdown-ByCsEWlQ.mjs.map → dropdown-CGQ0KAzA.mjs.map} +1 -1
- package/.output/server/chunks/build/{dropdown-Dex8PXu6.mjs → dropdown-vhn1NPFs.mjs} +4 -4
- package/.output/server/chunks/build/{dropdown-Dex8PXu6.mjs.map → dropdown-vhn1NPFs.mjs.map} +1 -1
- package/.output/server/chunks/build/{input-number-BBlRoAJ7.mjs → input-number-Bd55elNN.mjs} +5 -5
- package/.output/server/chunks/build/{input-number-BBlRoAJ7.mjs.map → input-number-Bd55elNN.mjs.map} +1 -1
- package/.output/server/chunks/build/{input--KMeLYqZ.mjs → input-sf_BT6o6.mjs} +3 -3
- package/.output/server/chunks/build/{input--KMeLYqZ.mjs.map → input-sf_BT6o6.mjs.map} +1 -1
- package/.output/server/chunks/build/logs-Dyk0I2I9.mjs +1 -1
- package/.output/server/chunks/build/{menu-xN-SXb9Q.mjs → menu-WCrlpYVh.mjs} +3 -3
- package/.output/server/chunks/build/{menu-xN-SXb9Q.mjs.map → menu-WCrlpYVh.mjs.map} +1 -1
- package/.output/server/chunks/build/{modal-DrCOcjrl.mjs → modal-yvUquPj5.mjs} +4 -4
- package/.output/server/chunks/build/{modal-DrCOcjrl.mjs.map → modal-yvUquPj5.mjs.map} +1 -1
- package/.output/server/chunks/build/{monitor-KW8WLOJd.mjs → monitor-MIOvsyLa.mjs} +21 -21
- package/.output/server/chunks/build/{monitor-KW8WLOJd.mjs.map → monitor-MIOvsyLa.mjs.map} +1 -1
- package/.output/server/chunks/build/pages-DR2bzczM.mjs +1 -1
- package/.output/server/chunks/build/{plugins-B-ZNey0Z.mjs → plugins-DnOBIWGg.mjs} +7 -7
- package/.output/server/chunks/build/{plugins-B-ZNey0Z.mjs.map → plugins-DnOBIWGg.mjs.map} +1 -1
- package/.output/server/chunks/build/{popconfirm-C5H1Qoh3.mjs → popconfirm-CRaHcz5O.mjs} +4 -4
- package/.output/server/chunks/build/{popconfirm-C5H1Qoh3.mjs.map → popconfirm-CRaHcz5O.mjs.map} +1 -1
- package/.output/server/chunks/build/{useWorkshopApi-Bh5VUHWu.mjs → segmented-DPe9ZzLO.mjs} +7 -78
- package/.output/server/chunks/build/segmented-DPe9ZzLO.mjs.map +1 -0
- package/.output/server/chunks/build/{select-D7H2ysgT.mjs → select-D-CeE5vY.mjs} +3 -3
- package/.output/server/chunks/build/{select-D7H2ysgT.mjs.map → select-D-CeE5vY.mjs.map} +1 -1
- package/.output/server/chunks/build/{settings-Cr06lbRy.mjs → settings-DA8IkGLo.mjs} +11 -11
- package/.output/server/chunks/build/{settings-Cr06lbRy.mjs.map → settings-DA8IkGLo.mjs.map} +1 -1
- package/.output/server/chunks/build/{space-DCwIlnkI.mjs → space-CCBYAkXt.mjs} +2 -2
- package/.output/server/chunks/build/{space-DCwIlnkI.mjs.map → space-CCBYAkXt.mjs.map} +1 -1
- package/.output/server/chunks/build/{switch-VC0m9ede.mjs → switch-CelRXpcy.mjs} +3 -3
- package/.output/server/chunks/build/{switch-VC0m9ede.mjs.map → switch-CelRXpcy.mjs.map} +1 -1
- package/.output/server/chunks/build/{table-BksLg3Q_.mjs → table-Cswq-l2r.mjs} +10 -10
- package/.output/server/chunks/build/{table-BksLg3Q_.mjs.map → table-Cswq-l2r.mjs.map} +1 -1
- package/.output/server/chunks/build/{tabs-CzUfD3iX.mjs → tabs-BM3tAh_J.mjs} +5 -5
- package/.output/server/chunks/build/{tabs-CzUfD3iX.mjs.map → tabs-BM3tAh_J.mjs.map} +1 -1
- package/.output/server/chunks/build/{tag-oQI3VtqM.mjs → tag-NO9jEqKy.mjs} +4 -4
- package/.output/server/chunks/build/{tag-oQI3VtqM.mjs.map → tag-NO9jEqKy.mjs.map} +1 -1
- package/.output/server/chunks/build/{teams-QR3BBF7A.mjs → teams-BhSKBBBM.mjs} +15 -14
- package/.output/server/chunks/build/teams-BhSKBBBM.mjs.map +1 -0
- package/.output/server/chunks/build/{tokens-DFvr_TLj.mjs → tokens-D_eyxmcv.mjs} +16 -16
- package/.output/server/chunks/build/{tokens-DFvr_TLj.mjs.map → tokens-D_eyxmcv.mjs.map} +1 -1
- package/.output/server/chunks/build/town-BUqRobze.mjs +1 -1
- package/.output/server/chunks/build/{town-_4tEEEVW.mjs → town-DPtOPRRO.mjs} +4 -4
- package/.output/server/chunks/build/{town-_4tEEEVW.mjs.map → town-DPtOPRRO.mjs.map} +1 -1
- package/.output/server/chunks/build/useDaqStream-hwkhJHFU.mjs +1 -1
- package/.output/server/chunks/build/useDcwStream-Bdew_yrr.mjs +1 -1
- package/.output/server/chunks/build/useLocalTime-9a4B-aHv.mjs +42 -0
- package/.output/server/chunks/build/useLocalTime-9a4B-aHv.mjs.map +1 -0
- package/.output/server/chunks/build/useWorkshopApi-D2gq06N2.mjs +81 -0
- package/.output/server/chunks/build/useWorkshopApi-D2gq06N2.mjs.map +1 -0
- package/.output/server/chunks/build/useWorkshopWs-B3j5wIAK.mjs +1 -1
- package/.output/server/chunks/build/user-Dk-ytEUV.mjs +1 -1
- package/.output/server/chunks/build/{users-4FZ0yFUO.mjs → users-CmVvb1oq.mjs} +16 -16
- package/.output/server/chunks/build/{users-4FZ0yFUO.mjs.map → users-CmVvb1oq.mjs.map} +1 -1
- package/.output/server/chunks/build/{workshop-k0XZTFKg.mjs → workshop-D5CQj2A8.mjs} +53 -47
- package/.output/server/chunks/build/workshop-D5CQj2A8.mjs.map +1 -0
- package/.output/server/chunks/build/workspaces-IfORCDJE.mjs +1 -1
- package/.output/server/chunks/routes/api/health.get.mjs +1 -1
- package/.output/server/chunks/routes/api/index.get.mjs +1 -1
- package/.output/server/chunks/routes/api/index.post.mjs +1 -1
- package/.output/server/chunks/routes/api/mcp/workshop.mjs +1 -1
- package/.output/server/chunks/routes/api/metrics.mjs +1 -1
- package/.output/server/chunks/routes/api/plugins/_name/_...path_.mjs +1 -1
- package/.output/server/chunks/routes/api/plugins/client/_name_.get.mjs +1 -1
- package/.output/server/chunks/routes/api/plugins/manifest.get.mjs +1 -1
- package/.output/server/chunks/routes/api/system/config.get.mjs +1 -1
- package/.output/server/chunks/routes/api/system/index.get.mjs +3 -3
- package/.output/server/chunks/routes/api/system/index.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/system/index.patch.mjs +1 -1
- package/.output/server/chunks/routes/api/system/monitor/terminal/ws.mjs +1 -1
- package/.output/server/chunks/routes/api/system/monitor/terminate.post.mjs +1 -1
- package/.output/server/chunks/routes/api/system/monitor.get.mjs +1 -1
- package/.output/server/chunks/routes/api/system/settings/events.get.mjs +1 -1
- package/.output/server/chunks/routes/api/system/settings/reset.post.mjs +1 -1
- package/.output/server/chunks/routes/api/users/_id_.delete.mjs +1 -1
- package/.output/server/chunks/routes/api/users/_id_.get.mjs +1 -1
- package/.output/server/chunks/routes/api/users/_id_.put.mjs +1 -1
- package/.output/server/chunks/routes/api/users/index.get.mjs +1 -1
- package/.output/server/chunks/routes/api/users/index.post.mjs +1 -1
- package/.output/server/chunks/routes/api/users/login.post.mjs +1 -1
- package/.output/server/chunks/routes/api/users/logout.post.mjs +1 -1
- package/.output/server/chunks/routes/api/users/me.get.mjs +1 -1
- package/.output/server/chunks/routes/api/users/register.post.mjs +1 -1
- 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/users/tokens/_id/token.get.mjs +1 -1
- package/.output/server/chunks/routes/api/users/tokens/_id_.delete.mjs +1 -1
- package/.output/server/chunks/routes/api/users/tokens/_id_.patch.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/_...path_.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/a2a/_agentId/index.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/a2a/_agentId/index.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/a2a/send.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/agent-tools/approvals/_id/decide.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/agent-tools/bindings/_id_.delete.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/agent-tools/bindings/_id_.patch.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/agent-tools/index.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/agent-tools/index.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/agent-tools/index2.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/agent-tools/invoke.post.mjs +6 -14
- package/.output/server/chunks/routes/api/workshop/agent-tools/invoke.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/agent-tools/list.get.mjs +39 -0
- package/.output/server/chunks/routes/api/workshop/agent-tools/list.get.mjs.map +1 -0
- package/.output/server/chunks/routes/api/workshop/agents/_id_.delete.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/agents/_id_.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/agents/_id_.patch.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/agents/subscribe.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/approvals/_id/decide.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/assets/character/_id_.delete.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/assets/devices/_id_.delete.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/assets/index.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/assets/index.post.mjs +2 -2
- package/.output/server/chunks/routes/api/workshop/assets/index2.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/assets/index2.post.mjs +2 -2
- package/.output/server/chunks/routes/api/workshop/audit.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/caller.mjs +2 -2
- package/.output/server/chunks/routes/api/workshop/channel-templates/_id/instantiate.post.mjs +3 -3
- package/.output/server/chunks/routes/api/workshop/channel-templates/_id_.delete.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/channel-templates/_id_.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/channel-templates/_id_.patch.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/channel-templates/from-channel.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/channels/_id/activate.post.mjs +2 -2
- package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/index.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/index.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/memories/_memoryId_.delete.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/memories/search.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/model.patch.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/position.patch.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/range.patch.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/stop.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId_.delete.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId_.patch.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/channels/_id/events.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/channels/_id/index.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/channels/_id/index.post.mjs +2 -2
- package/.output/server/chunks/routes/api/workshop/channels/_id/index2.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/channels/_id/index2.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/channels/_id/index3.get.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.get.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/memories/_memoryId_.delete.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/channels/_id/queue.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/channels/_id/terminals.get.mjs +2 -2
- package/.output/server/chunks/routes/api/workshop/channels/_id_.delete.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/channels/index.get.mjs +2 -2
- package/.output/server/chunks/routes/api/workshop/channels/index.patch.mjs +9 -2
- package/.output/server/chunks/routes/api/workshop/channels/index.patch.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/channels.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/channels.post.mjs +3 -3
- package/.output/server/chunks/routes/api/workshop/daq/_id/bind.post.mjs +2 -2
- package/.output/server/chunks/routes/api/workshop/daq/_id/frames/content.get.mjs +2 -2
- package/.output/server/chunks/routes/api/workshop/daq/_id/frames.get.mjs +2 -2
- package/.output/server/chunks/routes/api/workshop/daq/_id/samples.get.mjs +7 -4
- package/.output/server/chunks/routes/api/workshop/daq/_id/samples.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/daq/_id/test.post.mjs +2 -2
- package/.output/server/chunks/routes/api/workshop/daq/_id_.delete.mjs +2 -2
- package/.output/server/chunks/routes/api/workshop/daq/_id_.patch.mjs +2 -2
- package/.output/server/chunks/routes/api/workshop/daq/alarms/_id/ack.post.mjs +2 -2
- package/.output/server/chunks/routes/api/workshop/daq/alarms.get.mjs +2 -2
- package/.output/server/chunks/routes/api/workshop/daq/controller.post.mjs +2 -2
- package/.output/server/chunks/routes/api/workshop/daq/index.post.mjs +2 -2
- package/.output/server/chunks/routes/api/workshop/daq/infra/reconnect.post.mjs +2 -2
- package/.output/server/chunks/routes/api/workshop/daq/infra.get.mjs +2 -2
- package/.output/server/chunks/routes/api/workshop/daq/templates/_key_.delete.mjs +2 -2
- package/.output/server/chunks/routes/api/workshop/daq/templates/_key_.patch.mjs +2 -2
- package/.output/server/chunks/routes/api/workshop/daq/test-driver.post.mjs +2 -2
- package/.output/server/chunks/routes/api/workshop/dcw/_id/bind.post.mjs +2 -2
- package/.output/server/chunks/routes/api/workshop/dcw/_id/param-ledger.get.mjs +2 -2
- package/.output/server/chunks/routes/api/workshop/dcw/_id/read.post.mjs +2 -2
- package/.output/server/chunks/routes/api/workshop/dcw/_id/test.post.mjs +2 -2
- package/.output/server/chunks/routes/api/workshop/dcw/_id/write.post.mjs +2 -2
- package/.output/server/chunks/routes/api/workshop/dcw/_id_.delete.mjs +2 -2
- package/.output/server/chunks/routes/api/workshop/dcw/_id_.patch.mjs +2 -2
- package/.output/server/chunks/routes/api/workshop/dcw/controller.post.mjs +2 -2
- package/.output/server/chunks/routes/api/workshop/dcw/index.get.mjs +2 -2
- package/.output/server/chunks/routes/api/workshop/dcw/index.post.mjs +2 -2
- package/.output/server/chunks/routes/api/workshop/dcw/index2.get.mjs +2 -2
- package/.output/server/chunks/routes/api/workshop/dcw/index2.post.mjs +2 -2
- package/.output/server/chunks/routes/api/workshop/dcw/index3.get.mjs +2 -2
- package/.output/server/chunks/routes/api/workshop/dcw/index3.post.mjs +2 -2
- package/.output/server/chunks/routes/api/workshop/dcw/index4.get.mjs +2 -2
- package/.output/server/chunks/routes/api/workshop/dcw/index4.post.mjs +2 -2
- package/.output/server/chunks/routes/api/workshop/dcw/index5.get.mjs +2 -2
- package/.output/server/chunks/routes/api/workshop/dcw/journal/node/_nodeId/rollback.post.mjs +2 -2
- package/.output/server/chunks/routes/api/workshop/dcw/line/query.get.mjs +2 -2
- package/.output/server/chunks/routes/api/workshop/dcw/lines/_id/start.post.mjs +2 -2
- package/.output/server/chunks/routes/api/workshop/dcw/lines/_id/stop.post.mjs +2 -2
- package/.output/server/chunks/routes/api/workshop/dcw/lines/_id_.delete.mjs +2 -2
- package/.output/server/chunks/routes/api/workshop/dcw/lines/_id_.patch.mjs +2 -2
- package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id/judge.post.mjs +2 -2
- package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id/rollback.post.mjs +2 -2
- package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id/series.get.mjs +2 -2
- package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id_.get.mjs +2 -2
- package/.output/server/chunks/routes/api/workshop/dcw/products/_id_.delete.mjs +2 -2
- package/.output/server/chunks/routes/api/workshop/dcw/products/_id_.patch.mjs +2 -2
- package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/apply.post.mjs +2 -2
- package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/mark-good.post.mjs +2 -2
- package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/rollback-good.post.mjs +2 -2
- package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id_.delete.mjs +2 -2
- package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id_.patch.mjs +2 -2
- package/.output/server/chunks/routes/api/workshop/dcw/runs/_id/close.post.mjs +2 -2
- package/.output/server/chunks/routes/api/workshop/dcw/runs/_id/data.get.mjs +2 -2
- package/.output/server/chunks/routes/api/workshop/dcw/runs/_id/rollback.post.mjs +2 -2
- package/.output/server/chunks/routes/api/workshop/dcw/templates/_key_.delete.mjs +2 -2
- package/.output/server/chunks/routes/api/workshop/dcw/templates/_key_.patch.mjs +2 -2
- package/.output/server/chunks/routes/api/workshop/dcw/test-driver.post.mjs +2 -2
- 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 +2 -2
- package/.output/server/chunks/routes/api/workshop/device-twins/_id_.patch.mjs +2 -2
- 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 +247 -0
- package/.output/server/chunks/routes/api/workshop/harnesses/_id/providers.get.mjs.map +1 -0
- package/.output/server/chunks/routes/api/workshop/harnesses.get.mjs +27 -0
- package/.output/server/chunks/routes/api/workshop/harnesses.get.mjs.map +1 -0
- package/.output/server/chunks/routes/api/workshop/hitl/pending.get.mjs +2 -2
- package/.output/server/chunks/routes/api/workshop/hitl/respond.post.mjs +20 -8
- package/.output/server/chunks/routes/api/workshop/hitl/respond.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/index.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/index.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/index10.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/index2.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/index2.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/index3.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/index3.post.mjs +2 -2
- package/.output/server/chunks/routes/api/workshop/index4.get.mjs +2 -2
- package/.output/server/chunks/routes/api/workshop/index4.post.mjs +2 -2
- package/.output/server/chunks/routes/api/workshop/index5.get.mjs +2 -2
- package/.output/server/chunks/routes/api/workshop/index5.post.mjs +2 -2
- package/.output/server/chunks/routes/api/workshop/index6.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/index6.post.mjs +2 -2
- package/.output/server/chunks/routes/api/workshop/index7.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/index7.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/index8.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/index8.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/index9.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/mailbox/all.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/mailbox.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/memories/maintenance.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/plugins/_name/disable.post.mjs +2 -2
- package/.output/server/chunks/routes/api/workshop/plugins/_name/enable.post.mjs +2 -2
- package/.output/server/chunks/routes/api/workshop/plugins/index.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/runtime.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/scene/layouts/_channelId_.delete.mjs +2 -2
- package/.output/server/chunks/routes/api/workshop/scene/layouts/_channelId_.put.mjs +2 -2
- package/.output/server/chunks/routes/api/workshop/scene/layouts.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/tasks/_id/complete.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/tasks/_id/dispatch.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/tasks/_id/index.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/tasks/_id/report.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/tasks/_id/retry.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/tasks/_id_.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/tasks.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/teams/_id/deploy.post.mjs +2 -2
- package/.output/server/chunks/routes/api/workshop/teams/_id/index.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/teams/_id/index.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/teams/_id/members/_agentId_.delete.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/teams/_id_.delete.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/teams/_id_.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/teams/_id_.patch.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/users/me.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/users/register.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/workspaces/_id/channel-templates/_tplId_.post.mjs +3 -3
- package/.output/server/chunks/routes/api/workshop/workspaces/_id/channels/_channelId_.delete.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/workspaces/_id/channels/_channelId_.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/workspaces/index.delete.mjs +1 -1
- package/.output/server/chunks/routes/renderer.mjs +2 -2
- package/.output/server/chunks/virtual/entry.mjs +132 -114
- package/.output/server/chunks/virtual/entry.mjs.map +1 -1
- package/.output/server/chunks/virtual/precomputed.mjs +1 -1
- package/.output/server/index.mjs +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 +56 -2
- package/app/components/workshop/ChannelSessionList.vue +703 -593
- package/app/components/workshop/terminal/OmpTerminalPanel.vue +2 -1
- package/app/composables/workshop/useLocalTime.ts +16 -0
- package/app/composables/workshop/useSceneLayouts.ts +2 -1
- package/app/composables/workshop/useWorkshopApi.ts +249 -224
- package/app/pages/daq/[id].vue +7 -6
- package/app/pages/daq/index.vue +2 -2
- package/app/pages/dcw/[id].vue +3 -3
- package/app/pages/workshop/agents.vue +432 -382
- package/app/pages/workshop/index.vue +25 -6
- package/bin/aw.mjs +0 -0
- package/cli/aw.mjs +8 -1
- package/cli/commands/stop.mjs +7 -4
- package/cli/commands/tui.mjs +10 -1
- package/cli/core/registry.mjs +5 -3
- package/config.yml +144 -134
- package/docs/tui.md +1 -1
- package/i18n/dicts/settings.json +4 -0
- package/i18n/locales/en.ts +9 -0
- package/i18n/locales/zh-CN.ts +9 -0
- package/package.json +148 -140
- package/scripts/_dbg-catalog-smoke.ts +20 -0
- package/scripts/_dbg-codex-handshake.ts +30 -0
- package/scripts/_dbg-codex-probe.mjs +58 -0
- package/scripts/_dbg-codex-sandbox.ts +58 -0
- package/scripts/_dbg-codex-turn.ts +65 -0
- package/scripts/_dbg-dsh-probe.mjs +31 -0
- package/scripts/_dbg-interval-config.mjs +145 -0
- package/scripts/_dbg-interval-scenario.mjs +126 -0
- package/scripts/_dbg-line-spawn.ts +31 -0
- package/scripts/_dbg-live-engine-probe.mjs +80 -0
- package/scripts/_dbg-mcp-bridge-probe.mjs +147 -0
- package/scripts/_dbg-opencode-sse.mjs +101 -0
- package/scripts/_dbg-opencode-start.ts +57 -0
- package/scripts/_dbg-plugin-matrix.mjs +212 -0
- package/scripts/_dbg-protocol-matrix.mjs +425 -0
- package/scripts/_dbg-real-scenario-timeline.log +123 -0
- package/scripts/_dbg-registry-smoke.ts +14 -0
- package/scripts/_dbg-setup-e2e.mjs +88 -0
- package/scripts/_dbg-sim-keeper.mjs +100 -0
- package/scripts/_dbg-team-drill.mjs +173 -0
- package/scripts/dev-guard.mjs +11 -3
- package/scripts/dev-protocol-simulators.mjs +28 -1
- package/scripts/e2e-harness-provider-task.mjs +126 -0
- package/scripts/e2e-multi-harness.ts +374 -0
- package/scripts/e2e-multiharness-team.mjs +319 -0
- package/scripts/e2e-plc-scenario.mjs +292 -0
- package/scripts/e2e-real-scenario.mjs +452 -0
- package/scripts/migrate-local-time.mjs +123 -0
- package/scripts/start.mjs +30 -2
- package/server/api/system/settings/index.get.ts +3 -3
- package/server/api/users/setup-status.get.ts +8 -0
- package/server/api/workshop/agent-tools/invoke.post.ts +27 -41
- package/server/api/workshop/agent-tools/list.get.ts +25 -0
- package/server/api/workshop/channels/[id]/index.patch.ts +38 -30
- package/server/api/workshop/daq/[id]/samples.get.ts +8 -3
- package/server/api/workshop/harnesses/[id]/providers.get.ts +16 -0
- package/server/api/workshop/harnesses.get.ts +12 -0
- package/server/api/workshop/hitl/respond.post.ts +87 -67
- package/server/api/workshop/ws.ts +13 -0
- package/server/data/daqs.json +1421 -19
- package/server/data/dcw-lines.json +273 -0
- package/server/data/dcw-products.json +224 -0
- package/server/data/dcw-recipes.json +868 -0
- package/server/data/dcw-rollback.json +1177 -1
- package/server/data/dcw-runs.json +3032 -2834
- package/server/data/dcw-writes.json +1116 -0
- package/server/data/dcws.json +3447 -297
- package/server/data/line-runs.json +52 -2
- package/server/harness/aw-mcp-bridge.mjs +153 -0
- package/server/plugins/00-local-time.ts +10 -0
- package/server/plugins/aw-plugins.ts +3 -0
- package/server/plugins/backup.ts +116 -97
- package/server/plugins/dev-stability-guard.ts +24 -15
- package/server/plugins/retention.ts +1 -0
- package/server/plugins/security.ts +46 -29
- package/server/plugins/workshop.ts +156 -153
- package/server/repositories/user.repository.ts +15 -22
- package/server/services/system-config.ts +32 -6
- package/server/services/user.service.ts +8 -3
- package/server/services/workshop/.mimosa/hook-state/sess_fed429fb-c8b7-4a50-bbd6-45afc580893f.json +1 -0
- package/server/services/workshop/.mimosa/hook-status/sess_fed429fb-c8b7-4a50-bbd6-45afc580893f-e6b75bbfe6.json +14 -0
- package/server/services/workshop/agents/adapters/line-spawn.ts +111 -0
- package/server/services/workshop/agents/adapters/stdio-jsonrpc.ts +316 -0
- package/server/services/workshop/agents/agent-interface.ts +17 -0
- package/server/services/workshop/agents/codex-agent.ts +822 -0
- package/server/services/workshop/agents/dsh-agent.ts +670 -0
- package/server/services/workshop/agents/factory.ts +4 -16
- package/server/services/workshop/agents/harness-env.ts +54 -0
- package/server/services/workshop/agents/harness-models.ts +270 -0
- package/server/services/workshop/agents/host-tool-bridge.ts +612 -0
- package/server/services/workshop/agents/industrial-tools.ts +7 -1
- package/server/services/workshop/agents/node-bindings.repo.ts +4 -5
- package/server/services/workshop/agents/omp-agent.ts +1178 -1957
- package/server/services/workshop/agents/opencode-agent.ts +987 -0
- package/server/services/workshop/agents/prompt-builder.ts +393 -0
- package/server/services/workshop/agents/registry.ts +125 -0
- package/server/services/workshop/assets/character-asset.repo.ts +3 -5
- package/server/services/workshop/assets/device-twin.repo.ts +3 -5
- package/server/services/workshop/daq/daq-controller.ts +38 -6
- package/server/services/workshop/daq/daq-node.repo.ts +3 -5
- 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/daq-templates.ts +3 -5
- package/server/services/workshop/daq/drivers.ts +41 -12
- package/server/services/workshop/daq/storage/sqlite.adapter.ts +313 -309
- package/server/services/workshop/db/backup-registry.ts +33 -0
- package/server/services/workshop/db/channel.repo.ts +104 -101
- package/server/services/workshop/db/database.ts +956 -949
- package/server/services/workshop/dcw/dcw-controller.ts +5 -1
- package/server/services/workshop/dcw/dcw-line.repo.ts +4 -11
- package/server/services/workshop/dcw/dcw-node.repo.ts +3 -5
- package/server/services/workshop/dcw/dcw-node.ts +13 -1
- package/server/services/workshop/dcw/dcw-product.repo.ts +3 -4
- package/server/services/workshop/dcw/dcw-recipe.repo.ts +3 -19
- package/server/services/workshop/dcw/dcw-templates.ts +3 -5
- package/server/services/workshop/dcw/drivers.ts +37 -13
- package/server/services/workshop/dcw/line-run.ts +3 -5
- package/server/services/workshop/dcw/recipe-rollback.repo.ts +4 -10
- package/server/services/workshop/json-store.mjs +72 -0
- package/server/services/workshop/plugins/host.mjs +2 -1
- package/server/services/workshop/runtime/agent-runtime.ts +44 -0
- package/server/services/workshop/runtime/manager.ts +2953 -2868
- package/server/services/workshop/scene/scene-layout.repo.ts +4 -11
- package/server/services/workshop/settings.ts +30 -0
- package/shared/config/schema.json +9 -0
- package/shared/config/single-instance.mjs +5 -1
- package/shared/local-time.mjs +36 -0
- package/shared/workshop-protocol.ts +11 -5
- package/tui/aw-tui.mjs +28 -10
- package/tui/components/hitl-card.mjs +47 -36
- package/tui/lib/ws.mjs +2 -1
- package/.output/public/_nuxt/9X0fVBD7.js +0 -57
- package/.output/public/_nuxt/B6M2WJWm2.js +0 -1
- package/.output/public/_nuxt/B9Yie5HN.js +0 -2
- package/.output/public/_nuxt/BF9XPEuw.js +0 -1
- package/.output/public/_nuxt/BbQornXa.js +0 -1
- package/.output/public/_nuxt/Bxgaym6j.js +0 -1
- package/.output/public/_nuxt/Bxh5nf8j.js +0 -1
- package/.output/public/_nuxt/CXLI50Sq.js +0 -1
- package/.output/public/_nuxt/CdfAP_IH2.js +0 -1
- package/.output/public/_nuxt/Ce1zyNYu.js +0 -1
- package/.output/public/_nuxt/D-Ne4C9a.js +0 -1
- package/.output/public/_nuxt/DEHNjlTq2.js +0 -1
- package/.output/public/_nuxt/DFnGFEav.js +0 -18
- package/.output/public/_nuxt/DYWgGHNo.js +0 -7
- package/.output/public/_nuxt/OmpTerminalPanel.Bc9GjNU5.css +0 -1
- package/.output/public/_nuxt/W1E3-5ML.js +0 -14
- package/.output/public/_nuxt/XVB9_zwP.js +0 -1
- package/.output/public/_nuxt/Xaf_HIR3.js +0 -1
- package/.output/public/_nuxt/_id_.BeqSLvl_.css +0 -1
- package/.output/public/_nuxt/_id_.DN3U6EF9.css +0 -1
- package/.output/public/_nuxt/agents.BJwgTLFZ.css +0 -1
- package/.output/public/_nuxt/builds/meta/55c10854-ee0e-4be4-924b-a1b0e100fe11.json +0 -1
- package/.output/public/_nuxt/daq.BXsnevQv.css +0 -1
- package/.output/public/_nuxt/workshop.B98sHiJq.css +0 -1
- package/.output/public/_nuxt/yIKY_V1P.js +0 -1
- package/.output/server/chunks/build/OmpTerminalPanel-B_SYhmgb.mjs.map +0 -1
- package/.output/server/chunks/build/_id_-CWLFGZjV.mjs.map +0 -1
- package/.output/server/chunks/build/agents-D4l1icvn.mjs.map +0 -1
- package/.output/server/chunks/build/channel-templates-DqjtC-R0.mjs.map +0 -1
- package/.output/server/chunks/build/interval-WlxgjTzO.mjs +0 -9
- package/.output/server/chunks/build/interval-WlxgjTzO.mjs.map +0 -1
- package/.output/server/chunks/build/teams-QR3BBF7A.mjs.map +0 -1
- package/.output/server/chunks/build/useWorkshopApi-Bh5VUHWu.mjs.map +0 -1
- package/.output/server/chunks/build/workshop-k0XZTFKg.mjs.map +0 -1
|
@@ -0,0 +1,425 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 全协议连通矩阵实测(真实模拟工况;DAQ 只读 + DCW 读/写闭环)。
|
|
3
|
+
* NO_PROXY='*' node scripts/_dbg-protocol-matrix.mjs [--base http://127.0.0.1:3000]
|
|
4
|
+
*
|
|
5
|
+
* 前置(模拟工况,全部在跑):
|
|
6
|
+
* MQTT :1883(aw/sim/temp 每 2s) · HTTP :1889(/api/value;/api/setpoint)
|
|
7
|
+
* ModbusTCP :1502(40001 压力 f32 0.6~1.1 / 40003 温度 f32 165~175)
|
|
8
|
+
* ModbusRTU :15030(40001 f32 40.25↔44.25) · OPC UA :4840(ns=2;s=AW.Temp/AW.SetTemp)
|
|
9
|
+
* PLC 涂布产线 :15040(PV 温度 40001 / SP 温度 40021 可写,一阶热惯性)
|
|
10
|
+
*
|
|
11
|
+
* 矩阵:
|
|
12
|
+
* DAQ 读取 ×5(mqtt/http/modbus-tcp/modbus-rtu/opcua):test-connection → 采样落库(Timescale)→ WS 帧
|
|
13
|
+
* DCW 读/写 ×4:modbus-tcp(PLC 真闭环 SP→PV 收敛)/ opcua(回读)/ mqtt(发布+订阅验证)/ http(POST 落达验证)
|
|
14
|
+
* 联锁:配方窗口负例(越窗 400)
|
|
15
|
+
*/
|
|
16
|
+
const BASE = (() => {
|
|
17
|
+
const i = process.argv.indexOf('--base')
|
|
18
|
+
return i > 0 ? process.argv[i + 1] : 'http://127.0.0.1:3000'
|
|
19
|
+
})()
|
|
20
|
+
const WS_BASE = BASE.replace(/^http/, 'ws')
|
|
21
|
+
const TAG = Date.now().toString(36)
|
|
22
|
+
import net from 'node:net'
|
|
23
|
+
import { spawnSync } from 'node:child_process'
|
|
24
|
+
import fs from 'node:fs'
|
|
25
|
+
import { spawn } from 'node:child_process'
|
|
26
|
+
import { resolve } from 'node:path'
|
|
27
|
+
|
|
28
|
+
let failures = 0
|
|
29
|
+
let passed = 0
|
|
30
|
+
const results = []
|
|
31
|
+
const check = (id, name, ok, detail = '') => {
|
|
32
|
+
console.log(` ${ok ? 'PASS' : 'FAIL'} ${id} ${name}${detail ? ` — ${detail}` : ''}`)
|
|
33
|
+
results.push({ id, name, ok, detail })
|
|
34
|
+
ok ? passed++ : failures++
|
|
35
|
+
}
|
|
36
|
+
const sleep = ms => new Promise(r => setTimeout(r, ms))
|
|
37
|
+
|
|
38
|
+
const api = async (method, path, { body, token } = {}, attempt = 0) => {
|
|
39
|
+
const headers = { 'content-type': 'application/json' }
|
|
40
|
+
if (token) headers.authorization = `Bearer ${token}`
|
|
41
|
+
try {
|
|
42
|
+
const res = await fetch(`${BASE}${path}`, { method, headers, body: body !== undefined ? JSON.stringify(body) : undefined })
|
|
43
|
+
return { status: res.status, ...(await res.json().catch(() => ({}))) }
|
|
44
|
+
}
|
|
45
|
+
catch (err) {
|
|
46
|
+
// dev server 可能正被外部击杀/自愈重启:短重试跨过死亡窗口
|
|
47
|
+
if (attempt < 3) { await sleep(2500); return api(method, path, { body, token }, attempt + 1) }
|
|
48
|
+
throw err
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
async function waitUntil(name, cond, timeoutMs = 30_000, intervalMs = 800) {
|
|
53
|
+
const deadline = Date.now() + timeoutMs
|
|
54
|
+
let last = null
|
|
55
|
+
while (Date.now() < deadline) {
|
|
56
|
+
try { last = await cond(); if (last) return last } catch (e) { last = e }
|
|
57
|
+
await sleep(intervalMs)
|
|
58
|
+
}
|
|
59
|
+
throw new Error(`timeout:${name} last=${String(last).slice(0, 160)}`)
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/** AEP WS(全局 peer:daq.reading/daq.frame 等场景帧) */
|
|
63
|
+
function openAep(token) {
|
|
64
|
+
const frames = []
|
|
65
|
+
const ws = new WebSocket(`${WS_BASE}/api/workshop/ws?token=${encodeURIComponent(token)}`)
|
|
66
|
+
ws.addEventListener('message', (ev) => {
|
|
67
|
+
try {
|
|
68
|
+
const e = JSON.parse(ev.data)
|
|
69
|
+
if (e.type && e.type !== 'pong') frames.push(e)
|
|
70
|
+
}
|
|
71
|
+
catch { /* ignore */ }
|
|
72
|
+
})
|
|
73
|
+
return { ws, frames, ready: new Promise(r => ws.addEventListener('open', () => r())) }
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
async function main() {
|
|
77
|
+
console.log(`\n━━━ 全协议矩阵实测 @ ${BASE} (tag=${TAG}) ━━━`)
|
|
78
|
+
|
|
79
|
+
// ── P0. 模拟工况 preflight(自愈):并行会话的端口清理可能杀掉模拟器,开跑前逐一拉活 ──
|
|
80
|
+
const SIMS = [
|
|
81
|
+
{ name: 'mqtt-http', ports: [18830, 1889], cmd: 'scripts/dev-protocol-simulators.mjs', env: { MQTT_SIM_PORT: '18830', HTTP_SIM_PORT: '1889' }, log: 'sim-mqtt-http.log' },
|
|
82
|
+
{ name: 'modbus-tcp', ports: [1502], cmd: 'scripts/dev-modbus-simulator.mjs', env: {}, log: 'sim-modbus-tcp.log' },
|
|
83
|
+
{ name: 'opcua', ports: [4840], cmd: 'scripts/dev-opcua-simulator.mjs', env: { OPCUA_SIM_PORT: '4840' }, log: 'sim-opcua.log' },
|
|
84
|
+
{ name: 'plc', ports: [15040], cmd: 'scripts/dev-plc-simulator.mjs', env: {}, args: ['--port', '15040'], log: 'sim-plc.log' },
|
|
85
|
+
{ name: 'rtu', ports: [15030], cmd: 'scripts/_rtu-mini-slave.mjs', env: {}, log: 'sim-rtu.log' },
|
|
86
|
+
]
|
|
87
|
+
const portUp = (port) => new Promise((res) => {
|
|
88
|
+
const s = net.connect(port, '127.0.0.1')
|
|
89
|
+
const t = setTimeout(() => { s.destroy(); res(false) }, 1000)
|
|
90
|
+
s.on('connect', () => { clearTimeout(t); s.destroy(); res(true) })
|
|
91
|
+
s.on('error', () => { clearTimeout(t); res(false) })
|
|
92
|
+
})
|
|
93
|
+
const portOwners = (port) => {
|
|
94
|
+
// netstat 找出该端口所有 LISTENING 持有者(Windows 双绑竞态:僵尸实例会导致读写分家)
|
|
95
|
+
const out = spawnSync('cmd', ['/c', `netstat -ano | findstr :${port} | findstr LISTENING`], { encoding: 'utf-8' })
|
|
96
|
+
const pids = new Set()
|
|
97
|
+
for (const line of (out.stdout ?? '').split('\n')) {
|
|
98
|
+
const m = line.trim().match(/\s(\d+)\s*$/)
|
|
99
|
+
if (m) pids.add(m[1])
|
|
100
|
+
}
|
|
101
|
+
return [...pids]
|
|
102
|
+
}
|
|
103
|
+
for (const sim of SIMS) {
|
|
104
|
+
// 清场:杀掉端口上所有旧持有者(僵尸/双绑),保证唯一新实例
|
|
105
|
+
for (const pid of portOwners(sim.ports[0])) {
|
|
106
|
+
spawnSync('cmd', ['/c', `taskkill /F /PID ${pid}`])
|
|
107
|
+
console.log(` [preflight] ${sim.name} 清掉旧持有者 pid=${pid}`)
|
|
108
|
+
await sleep(300)
|
|
109
|
+
}
|
|
110
|
+
let up = false
|
|
111
|
+
{
|
|
112
|
+
const fd = fs.openSync(resolve('.AgentWorkShop/data', sim.log), 'a')
|
|
113
|
+
const child = spawn(process.execPath, [sim.cmd, ...(sim.args ?? [])], {
|
|
114
|
+
cwd: process.cwd(), env: { ...process.env, NO_PROXY: '127.0.0.1,localhost', ...sim.env },
|
|
115
|
+
detached: true, stdio: ['ignore', fd, fd],
|
|
116
|
+
})
|
|
117
|
+
child.unref()
|
|
118
|
+
console.log(` [preflight] ${sim.name} → 拉起唯一实例 pid=${child.pid}`)
|
|
119
|
+
for (let i = 0; i < 15 && !up; i++) { await sleep(1000); up = await portUp(sim.ports[0]) }
|
|
120
|
+
if (!up) throw new Error(`preflight:${sim.name} 拉起失败`)
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
check('0.0', '模拟工况 preflight(六端口唯一实例)', true)
|
|
124
|
+
|
|
125
|
+
// dev server 健康(被外部击杀 → 清僵尸 guard 自愈;最多等 90s)
|
|
126
|
+
{
|
|
127
|
+
let ok = false
|
|
128
|
+
for (let i = 0; i < 30 && !ok; i++) {
|
|
129
|
+
try { ok = (await fetch(`${BASE}/api/health`)).status === 200 } catch { ok = false }
|
|
130
|
+
if (!ok) {
|
|
131
|
+
if (i === 0) {
|
|
132
|
+
const lockPath = resolve('.AgentWorkShop/.runtime/aw.lock')
|
|
133
|
+
let lockPid = 0
|
|
134
|
+
try { lockPid = Number(JSON.parse(fs.readFileSync(lockPath, 'utf-8')).pid ?? 0) } catch { /* 无锁 */ }
|
|
135
|
+
if (lockPid) {
|
|
136
|
+
spawnSync('cmd', ['/c', `taskkill /F /PID ${lockPid}`])
|
|
137
|
+
try { fs.unlinkSync(lockPath) } catch { /* 无锁 */ }
|
|
138
|
+
console.log(` [preflight] dev server 僵尸 guard(pid=${lockPid})已清,重启…`)
|
|
139
|
+
const fd = fs.openSync(resolve('.AgentWorkShop/data/dev-server.log'), 'a')
|
|
140
|
+
const child = spawn(process.execPath, ['bin/aw.mjs', 'dev'], {
|
|
141
|
+
cwd: process.cwd(), env: { ...process.env, NO_PROXY: '127.0.0.1,localhost' },
|
|
142
|
+
detached: true, stdio: ['ignore', fd, fd],
|
|
143
|
+
})
|
|
144
|
+
child.unref()
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
await sleep(3000)
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
if (!ok) throw new Error('preflight:dev server 90s 未恢复')
|
|
151
|
+
}
|
|
152
|
+
console.log(' [preflight] dev server 健康')
|
|
153
|
+
|
|
154
|
+
// ── 0. 注册 + 产线 ──
|
|
155
|
+
const reg = await api('POST', '/api/users/register', {
|
|
156
|
+
body: { email: `proto-${TAG}@test.local`, password: 'Passw0rd!123', name: `proto-${TAG}` },
|
|
157
|
+
})
|
|
158
|
+
const token = reg.data?.token
|
|
159
|
+
if (!token) throw new Error(`注册失败: ${JSON.stringify(reg).slice(0, 200)}`)
|
|
160
|
+
|
|
161
|
+
const line = (await api('POST', '/api/workshop/dcw/lines', { body: { name: `全协议产线-${TAG}` }, token })).data?.line
|
|
162
|
+
check('0.1', '建产线', Boolean(line?.id))
|
|
163
|
+
|
|
164
|
+
// ── 1. DAQ 五协议节点(配置连接 + 连接测试) ──
|
|
165
|
+
const daqDefs = [
|
|
166
|
+
{ id: 'mqtt', driver: 'mqtt', templateRef: 'daq-temp-tc', name: `MQTT温度-${TAG}`, expect: [30, 75],
|
|
167
|
+
cfg: { host: '127.0.0.1', port: 18830, topic: 'aw/sim/temp', jsonPath: 'data.temp' } },
|
|
168
|
+
{ id: 'http', driver: 'http', templateRef: 'daq-temp-tc', name: `HTTP流量-${TAG}`, expect: [38, 48],
|
|
169
|
+
cfg: { url: 'http://127.0.0.1:1889/api/value', jsonPath: 'data.value' } },
|
|
170
|
+
{ id: 'mbtcp', driver: 'modbus-tcp', templateRef: 'daq-pressure-tx', name: `ModbusTCP压力-${TAG}`, expect: [0.5, 1.25],
|
|
171
|
+
cfg: { host: '127.0.0.1', port: 1502, unitId: 1, register: 40001, registerType: 'holding', dataType: 'float32', byteOrder: 'big' } },
|
|
172
|
+
{ id: 'rtu', driver: 'modbus-rtu', templateRef: 'daq-temp-tc', name: `RTU温度-${TAG}`, expect: [60, 72],
|
|
173
|
+
cfg: { host: '127.0.0.1', port: 15030, unitId: 1, register: 40001, registerType: 'holding', dataType: 'uint16' } },
|
|
174
|
+
{ id: 'opcua', driver: 'opcua', templateRef: 'daq-temp-tc', name: `OPCUA温度-${TAG}`, expect: [140, 200],
|
|
175
|
+
cfg: { endpoint: 'opc.tcp://127.0.0.1:4840', nodeId: 'ns=2;s=AW.Temp' } },
|
|
176
|
+
{ id: 'plcpv', driver: 'modbus-tcp', templateRef: 'daq-temp-tc', name: `PLC-PV温度-${TAG}`, expect: [0, 260],
|
|
177
|
+
cfg: { host: '127.0.0.1', port: 15040, unitId: 1, register: 40001, registerType: 'holding', dataType: 'float32', byteOrder: 'big' } },
|
|
178
|
+
]
|
|
179
|
+
const daqNodes = {}
|
|
180
|
+
for (const d of daqDefs) {
|
|
181
|
+
const t = await api('POST', '/api/workshop/daq/test-driver', { body: { driver: d.driver, driverConfig: d.cfg }, token })
|
|
182
|
+
check(`1.${d.id}-test`, `${d.driver} 连接测试`, t.data?.test?.ok === true, JSON.stringify(t.data?.test ?? t.message ?? {}).slice(0, 120))
|
|
183
|
+
const created = await api('POST', '/api/workshop/daq', {
|
|
184
|
+
body: { templateRef: d.templateRef, name: d.name, driver: d.driver, driverConfig: d.cfg, lineId: line.id, intervalMs: 800, publishIntervalMs: 0 }, token,
|
|
185
|
+
})
|
|
186
|
+
daqNodes[d.id] = created.data?.node
|
|
187
|
+
check(`1.${d.id}-create`, `${d.driver} 节点创建`, Boolean(daqNodes[d.id]?.id), created.message ?? '')
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
// ── 2. DCW 节点(四路下发通道) ──
|
|
191
|
+
const dcwDefs = [
|
|
192
|
+
{ id: 'plcsp', driver: 'modbus-tcp', name: `PLC-SP温度-${TAG}`, recipe: true,
|
|
193
|
+
cfg: { host: '127.0.0.1', port: 15040, unitId: 1, register: 40021, dataType: 'float32', byteOrder: 'big' } },
|
|
194
|
+
{ id: 'ocusp', driver: 'opcua', name: `OPCUA-SP-${TAG}`,
|
|
195
|
+
cfg: { endpoint: 'opc.tcp://127.0.0.1:4840', nodeId: 'ns=2;s=AW.SetTemp' } },
|
|
196
|
+
{ id: 'mqsp', driver: 'mqtt', name: `MQTT-SP-${TAG}`,
|
|
197
|
+
cfg: { host: '127.0.0.1', port: 18830, topic: `aw/sim/setpoint-${TAG}`, jsonKey: 'setpoint', qos: 1 } },
|
|
198
|
+
{ id: 'htsp', driver: 'http', name: `HTTP-SP-${TAG}`,
|
|
199
|
+
cfg: { url: 'http://127.0.0.1:1889/api/setpoint', bodyKey: 'setpoint' } },
|
|
200
|
+
]
|
|
201
|
+
const dcwNodes = {}
|
|
202
|
+
for (const d of dcwDefs) {
|
|
203
|
+
const t = await api('POST', '/api/workshop/dcw/test-driver', { body: { driver: d.driver, driverConfig: d.cfg }, token })
|
|
204
|
+
check(`2.${d.id}-test`, `DCW ${d.driver} 连接测试`, t.data?.test?.ok === true, JSON.stringify(t.data?.test ?? t.message ?? {}).slice(0, 120))
|
|
205
|
+
const created = await api('POST', '/api/workshop/dcw', {
|
|
206
|
+
body: { templateRef: 'dcw-temp-sp', name: d.name, driver: d.driver, driverConfig: d.cfg, lineId: line.id }, token,
|
|
207
|
+
})
|
|
208
|
+
dcwNodes[d.id] = created.data?.node
|
|
209
|
+
check(`2.${d.id}-create`, `DCW ${d.driver} 节点创建`, Boolean(dcwNodes[d.id]?.id), created.message ?? '')
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
// ── 3. 产品/配方/开跑(激活数采门控 + 配方窗口) ──
|
|
213
|
+
// 预置:先把 PLC SP 裸写到 25℃,让 PV 从上轮残留收敛到低温 —— 6.4c 的"爬升"才有确定性基线
|
|
214
|
+
{
|
|
215
|
+
const net = await import('node:net')
|
|
216
|
+
await new Promise((resolve) => {
|
|
217
|
+
const sock = net.connect(15040, '127.0.0.1')
|
|
218
|
+
const b = Buffer.alloc(4)
|
|
219
|
+
b.writeFloatBE(25)
|
|
220
|
+
const words = [b.readUInt16BE(0), b.readUInt16BE(2)]
|
|
221
|
+
const frame = Buffer.alloc(17)
|
|
222
|
+
frame.writeUInt16BE(1, 0) // txn
|
|
223
|
+
frame.writeUInt16BE(0, 2) // proto
|
|
224
|
+
frame.writeUInt16BE(11, 4) // len(unit+PDU)
|
|
225
|
+
frame.writeUInt8(1, 6) // unit
|
|
226
|
+
frame.writeUInt8(16, 7) // FC16
|
|
227
|
+
frame.writeUInt16BE(20, 8) // start = 40021-40001
|
|
228
|
+
frame.writeUInt16BE(2, 10) // qty words
|
|
229
|
+
frame.writeUInt8(4, 12) // byte count
|
|
230
|
+
frame.writeUInt16BE(words[0], 13)
|
|
231
|
+
frame.writeUInt16BE(words[1], 15)
|
|
232
|
+
sock.on('connect', () => sock.write(frame))
|
|
233
|
+
sock.on('data', () => { sock.destroy(); resolve() })
|
|
234
|
+
sock.on('error', () => resolve())
|
|
235
|
+
setTimeout(() => { sock.destroy(); resolve() }, 3000)
|
|
236
|
+
})
|
|
237
|
+
await sleep(22_000) // τ=8s ×3,PV 充分回落(<60)
|
|
238
|
+
}
|
|
239
|
+
const prod = (await api('POST', '/api/workshop/dcw/products', { body: { name: `全协议产品-${TAG}`, lineId: line.id }, token })).data?.product
|
|
240
|
+
const plcSp = dcwNodes.plcsp
|
|
241
|
+
const recipe = (await api('POST', '/api/workshop/dcw/recipes', {
|
|
242
|
+
body: {
|
|
243
|
+
productId: prod.id, name: `全协议配方-${TAG}`,
|
|
244
|
+
params: [{ templateRef: 'dcw-temp-sp', nodeId: plcSp.id, value: 180, min: 176, max: 188 }],
|
|
245
|
+
daqWindows: [{ nodeId: daqNodes.plcpv.id, min: 100, max: 260 }],
|
|
246
|
+
}, token,
|
|
247
|
+
})).data?.recipe
|
|
248
|
+
check('3.1', '产品+配方(PLC-SP 绑工艺窗 176~188)', Boolean(prod?.id && recipe?.id))
|
|
249
|
+
const start = await api('POST', `/api/workshop/dcw/lines/${line.id}/start`, { body: { recipeId: recipe.id }, token })
|
|
250
|
+
check('3.2', '产线开跑(数采门控激活)', start.code === 0, start.message ?? '')
|
|
251
|
+
|
|
252
|
+
// ── 4. DAQ 采样落库 + 数值域 + WS 帧 ──
|
|
253
|
+
const aep = openAep(token)
|
|
254
|
+
await aep.ready
|
|
255
|
+
await sleep(9000)
|
|
256
|
+
for (const d of daqDefs) {
|
|
257
|
+
const node = daqNodes[d.id]
|
|
258
|
+
const s = await api('GET', `/api/workshop/daq/${node.id}/samples?bucketMs=1000`, { token })
|
|
259
|
+
const points = s.data?.points ?? s.data ?? []
|
|
260
|
+
const n = Array.isArray(points) ? points.length : 0
|
|
261
|
+
const lastVal = n > 0 ? Number(Object.values(points[n - 1] ?? {})[1] ?? NaN) : NaN
|
|
262
|
+
const inRange = Number.isFinite(lastVal) && lastVal >= d.expect[0] && lastVal <= d.expect[1]
|
|
263
|
+
check(`4.${d.id}`, `${d.driver} 持续采样落库(Timescale)`, n >= 4 && inRange,
|
|
264
|
+
`points=${n} last=${lastVal} 期望域[${d.expect.join(',')}] ${s.message ?? ''}`)
|
|
265
|
+
}
|
|
266
|
+
const daqFrames = aep.frames.filter(f => f.type === 'daq.reading' || f.type === 'daq.frame')
|
|
267
|
+
check('4.ws', 'WS 实时推送(daq.reading/frame 场景帧)', daqFrames.length >= 10, `frames=${daqFrames.length} total=${aep.frames.length}`)
|
|
268
|
+
|
|
269
|
+
// ── 5. DCW 读(读回设备参数);响应形状 { read: {...} } ──
|
|
270
|
+
const rPlc = await api('POST', `/api/workshop/dcw/${dcwNodes.plcsp.id}/read`, { token })
|
|
271
|
+
const plcRead = Number(rPlc.data?.read?.value ?? rPlc.data?.value ?? NaN)
|
|
272
|
+
check('5.1', 'DCW Modbus 读 SP 寄存器', rPlc.code === 0 && Number.isFinite(plcRead), `value=${plcRead} ${JSON.stringify(rPlc.data ?? {}).slice(0, 120)} ${rPlc.message ?? ''}`)
|
|
273
|
+
const rOpc = await api('POST', `/api/workshop/dcw/${dcwNodes.ocusp.id}/read`, { token })
|
|
274
|
+
const opcRead = Number(rOpc.data?.read?.value ?? rOpc.data?.value ?? NaN)
|
|
275
|
+
check('5.2', 'DCW OPC UA 读节点', rOpc.code === 0 && Number.isFinite(opcRead), `value=${opcRead} ${rOpc.message ?? ''}`)
|
|
276
|
+
const rMq = await api('POST', `/api/workshop/dcw/${dcwNodes.mqsp.id}/read`, { token })
|
|
277
|
+
const mqReadVal = rMq.data?.read?.value ?? rMq.data?.value
|
|
278
|
+
check('5.3', 'DCW MQTT 读=能力外优雅报错(仅下行)', !Number.isFinite(Number(mqReadVal)) && (rMq.code !== 0 || rMq.data?.read?.ok === false || rMq.data?.ok === false), `code=${rMq.code} read=${JSON.stringify(rMq.data?.read ?? {}).slice(0, 100)}`)
|
|
279
|
+
|
|
280
|
+
// ── 6. DCW 写 ×4 ──
|
|
281
|
+
// 6.1 MQTT 下行:先建订阅(不等待)→ 驱动写 → 收到的报文即真实链路证据
|
|
282
|
+
let mqttRx = null
|
|
283
|
+
try {
|
|
284
|
+
const { default: mqtt } = await import('mqtt')
|
|
285
|
+
const sub = await new Promise((resolve) => {
|
|
286
|
+
const c = mqtt.connect('mqtt://127.0.0.1:18830', { connectTimeout: 4000 })
|
|
287
|
+
const timer = setTimeout(() => { c.end(true); resolve(null) }, 8000)
|
|
288
|
+
c.on('connect', () => c.subscribe(`aw/sim/setpoint-${TAG}`, { qos: 1 }, () => { clearTimeout(timer); resolve(c) }))
|
|
289
|
+
c.on('error', () => { clearTimeout(timer); resolve(null) })
|
|
290
|
+
})
|
|
291
|
+
if (sub) {
|
|
292
|
+
const wMq = await api('POST', `/api/workshop/dcw/${dcwNodes.mqsp.id}/write`, { body: { value: 165.5 }, token })
|
|
293
|
+
check("6.1a", "DCW MQTT 下发执行", wMq.code === 0 && wMq.data?.outcome?.ok === true, JSON.stringify(wMq.data ?? wMq.message ?? {}).slice(0, 140))
|
|
294
|
+
mqttRx = await new Promise((resolve) => {
|
|
295
|
+
const timer = setTimeout(() => { sub.end(true); resolve(null) }, 10_000)
|
|
296
|
+
sub.on('message', (_t, payload) => { clearTimeout(timer); sub.end(true); resolve(payload.toString()) })
|
|
297
|
+
})
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
catch { /* mqtt 包不可用则跳过订阅验证 */ }
|
|
301
|
+
// broker 侧确定性验收:模拟器把真实路由落盘(broker 收到即证据,不依赖订阅端时序)
|
|
302
|
+
let auditHit = null
|
|
303
|
+
{
|
|
304
|
+
const auditPath = resolve('.AgentWorkShop/data/sim-setpoint-routes.log')
|
|
305
|
+
for (let i = 0; i < 10 && !auditHit; i++) {
|
|
306
|
+
await sleep(1000)
|
|
307
|
+
try {
|
|
308
|
+
const content = fs.readFileSync(auditPath, 'utf-8')
|
|
309
|
+
auditHit = content.split('\n').reverse().find(l => l.includes(`aw/sim/setpoint-${TAG}`)) ?? null
|
|
310
|
+
}
|
|
311
|
+
catch { /* 文件未生成 */ }
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
check('6.1b', 'DCW MQTT 真实报文抵达 Broker(broker 路由审计)', auditHit !== null && auditHit.includes('165.5'), `audit=${auditHit?.trim() ?? 'null'}`)
|
|
315
|
+
// 环境噪声重试:broker 实例可能在订阅/发布之间被杀换新,换全新订阅再写一次
|
|
316
|
+
if (auditHit === null) {
|
|
317
|
+
try {
|
|
318
|
+
const { default: mqtt2 } = await import('mqtt')
|
|
319
|
+
const sub2 = await new Promise((resolve) => {
|
|
320
|
+
const c = mqtt2.connect('mqtt://127.0.0.1:18830', { connectTimeout: 3000 })
|
|
321
|
+
const timer = setTimeout(() => { c.end(true); resolve(null) }, 6000)
|
|
322
|
+
c.on('connect', () => c.subscribe(`aw/sim/setpoint-${TAG}`, { qos: 1 }, () => { clearTimeout(timer); resolve(c) }))
|
|
323
|
+
c.on('error', () => { clearTimeout(timer); resolve(null) })
|
|
324
|
+
})
|
|
325
|
+
if (sub2) {
|
|
326
|
+
await api('POST', `/api/workshop/dcw/${dcwNodes.mqsp.id}/write`, { body: { value: 165.5 }, token })
|
|
327
|
+
mqttRx = await new Promise((resolve) => {
|
|
328
|
+
const timer = setTimeout(() => { sub2.end(true); resolve(null) }, 8000)
|
|
329
|
+
sub2.on('message', (_t, payload) => { clearTimeout(timer); sub2.end(true); resolve(payload.toString()) })
|
|
330
|
+
})
|
|
331
|
+
check('6.1b-retry', 'DCW MQTT 报文抵达(重订重写)', mqttRx !== null && mqttRx.includes('165.5'), `payload=${mqttRx}`)
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
catch { /* ignore */ }
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
// 6.2 HTTP 下发:经驱动 POST,模拟器日志留痕
|
|
338
|
+
const wHt = await api('POST', `/api/workshop/dcw/${dcwNodes.htsp.id}/write`, { body: { value: 168.25 }, token })
|
|
339
|
+
check("6.2a", "DCW HTTP 下发执行", wHt.code === 0 && wHt.data?.outcome?.ok === true, JSON.stringify(wHt.data ?? wHt.message ?? {}).slice(0, 140))
|
|
340
|
+
|
|
341
|
+
// 6.3 OPC UA 写 + 回读校验
|
|
342
|
+
const wOpc = await api('POST', `/api/workshop/dcw/${dcwNodes.ocusp.id}/write`, { body: { value: 172.5 }, token })
|
|
343
|
+
check("6.3a", "DCW OPC UA 写入", wOpc.code === 0 && wOpc.data?.outcome?.ok === true, JSON.stringify(wOpc.data ?? wOpc.message ?? {}).slice(0, 140))
|
|
344
|
+
await sleep(1200)
|
|
345
|
+
const rOpc2 = await api('POST', `/api/workshop/dcw/${dcwNodes.ocusp.id}/read`, { token })
|
|
346
|
+
const opc2 = Number(rOpc2.data?.read?.value ?? rOpc2.data?.value ?? NaN)
|
|
347
|
+
check('6.3b', 'DCW OPC UA 回读=172.5±1', Number.isFinite(opc2) && Math.abs(opc2 - 172.5) <= 1, `read=${opc2}`)
|
|
348
|
+
|
|
349
|
+
// 6.4 PLC Modbus 写(配方窗内)+ 真闭环 SP→PV 收敛
|
|
350
|
+
const wPlc = await api('POST', `/api/workshop/dcw/${plcSp.id}/write`, { body: { value: 182 }, token })
|
|
351
|
+
check("6.4a", "DCW Modbus 写 SP=182(配方窗内)", wPlc.code === 0 && wPlc.data?.outcome?.ok === true, JSON.stringify(wPlc.data ?? wPlc.message ?? {}).slice(0, 140))
|
|
352
|
+
const wPlcBad = await api('POST', `/api/workshop/dcw/${plcSp.id}/write`, { body: { value: 195 }, token })
|
|
353
|
+
check('6.4b', '配方窗联锁负例(195 越窗 → 400)', wPlcBad.status === 400, `status=${wPlcBad.status} msg=${String(wPlcBad.message ?? '').slice(0, 80)}`)
|
|
354
|
+
|
|
355
|
+
// PLC 一阶热惯性:PV 从 ~26(预置衰减后)随配方 SP=180 + 写 182 爬升收敛
|
|
356
|
+
const pvNode = daqNodes.plcpv
|
|
357
|
+
const pvStart = await api('GET', `/api/workshop/daq/${pvNode.id}/samples?bucketMs=1000`, { token })
|
|
358
|
+
const pv0 = (pvStart.data?.points ?? []).slice(-3).map(p => Number(Object.values(p)[1])).filter(Number.isFinite).at(-1)
|
|
359
|
+
let pvLastSeen = null
|
|
360
|
+
let pvEnd = null
|
|
361
|
+
let pvDiag = ''
|
|
362
|
+
try {
|
|
363
|
+
pvEnd = await waitUntil('PV 收敛', async () => {
|
|
364
|
+
const s = await api('GET', `/api/workshop/daq/${pvNode.id}/samples?bucketMs=1000`, { token })
|
|
365
|
+
const pts = s.data?.points ?? []
|
|
366
|
+
const v = pts.slice(-2).map(p => Number(Object.values(p)[1])).find(Number.isFinite)
|
|
367
|
+
if (Number.isFinite(v)) pvLastSeen = v
|
|
368
|
+
const view = await api('GET', '/api/workshop/daq', { token })
|
|
369
|
+
const me = (Array.isArray(view.data) ? view.data : (view.data?.nodes ?? [])).find(x => x.id === pvNode.id)
|
|
370
|
+
const lines = await api('GET', '/api/workshop/dcw/lines', { token })
|
|
371
|
+
const ln = (Array.isArray(lines.data) ? lines.data : (lines.data?.lines ?? [])).find(l => l.id === line.id)
|
|
372
|
+
pvDiag = `pts=${pts.length} node=${me?.state} err=${String(me?.lastError ?? '-').slice(0, 40)} lineRun=${ln && (ln.activeRun || ln.run) ? 'on' : 'off'}`
|
|
373
|
+
return Number.isFinite(v) && v >= 170 ? v : null
|
|
374
|
+
}, 90_000, 2500)
|
|
375
|
+
} catch { /* keep null */ }
|
|
376
|
+
// 物理真值回退:DAQ 观测链若被环境中断(模拟器运行中被杀/ revived),直接裸读寄存器验证闭环
|
|
377
|
+
let rawSp = null
|
|
378
|
+
let rawPv = null
|
|
379
|
+
if (!pvEnd) {
|
|
380
|
+
await new Promise((resolveRaw) => {
|
|
381
|
+
const sock = net.connect(15040, '127.0.0.1')
|
|
382
|
+
let buf = Buffer.alloc(0)
|
|
383
|
+
sock.on('connect', () => sock.write(Buffer.from([0, 1, 0, 0, 0, 6, 1, 3, 0, 0, 0, 0x16])))
|
|
384
|
+
sock.on('data', (d) => {
|
|
385
|
+
buf = Buffer.concat([buf, d])
|
|
386
|
+
if (buf.length >= 9 + 44) {
|
|
387
|
+
rawPv = Number(buf.subarray(9, 13).readFloatBE(0).toFixed(1))
|
|
388
|
+
rawSp = Number(buf.subarray(49, 53).readFloatBE(0).toFixed(1))
|
|
389
|
+
sock.destroy(); resolveRaw()
|
|
390
|
+
}
|
|
391
|
+
})
|
|
392
|
+
sock.on('error', () => resolveRaw())
|
|
393
|
+
setTimeout(() => { sock.destroy(); resolveRaw() }, 4000)
|
|
394
|
+
})
|
|
395
|
+
}
|
|
396
|
+
const loopProven = (Number.isFinite(pv0) && pv0 < 60 && Number.isFinite(pvEnd) && pvEnd >= 170)
|
|
397
|
+
|| (rawSp !== null && Math.abs(rawSp - 182) <= 2 && rawPv !== null && Math.abs(rawPv - rawSp) <= 6)
|
|
398
|
+
check('6.4c', '真实闭环:PLC PV 随 SP 收敛(≈26→≥170)', loopProven, `pv0=${pv0} pvEnd=${pvEnd} lastSeen=${pvLastSeen} | rawSP=${rawSp} rawPV=${rawPv} ${pvDiag}`)
|
|
399
|
+
|
|
400
|
+
// ── 7. 写后节点视图一致性 + journal ──
|
|
401
|
+
const list = await api('GET', '/api/workshop/dcw', { token })
|
|
402
|
+
const nodes = Array.isArray(list.data) ? list.data : (list.data?.nodes ?? [])
|
|
403
|
+
const plcNow = nodes.find(n => n.id === plcSp.id)
|
|
404
|
+
check('7.1', 'DCW 节点 readValue 收敛 182±2', plcNow && Math.abs(Number(plcNow.readValue) - 182) <= 2, `readValue=${plcNow?.readValue}`)
|
|
405
|
+
const journal = await api('GET', `/api/workshop/dcw/journal?nodeId=${plcSp.id}`, { token })
|
|
406
|
+
check('7.2', '写账本留痕(journal anchors)', (journal.data?.anchors ?? []).length >= 1, `anchors=${(journal.data?.anchors ?? []).length}`)
|
|
407
|
+
|
|
408
|
+
// ── 清理 ──
|
|
409
|
+
await api('POST', `/api/workshop/dcw/lines/${line.id}/stop`, { token }).catch(() => {})
|
|
410
|
+
for (const n of Object.values(daqNodes)) await api('DELETE', `/api/workshop/daq/${n.id}`, { token }).catch(() => {})
|
|
411
|
+
for (const n of Object.values(dcwNodes)) await api('DELETE', `/api/workshop/dcw/${n.id}`, { token }).catch(() => {})
|
|
412
|
+
await api('DELETE', `/api/workshop/dcw/lines/${line.id}`, { token }).catch(() => {})
|
|
413
|
+
|
|
414
|
+
console.log(`\n━━━ 矩阵结果: ${passed} passed / ${failures} failed ━━━`)
|
|
415
|
+
if (failures) {
|
|
416
|
+
console.log('失败项:')
|
|
417
|
+
for (const r of results.filter(x => !x.ok)) console.log(` ${r.id} ${r.name} — ${r.detail}`)
|
|
418
|
+
}
|
|
419
|
+
process.exit(failures === 0 ? 0 : 1)
|
|
420
|
+
}
|
|
421
|
+
|
|
422
|
+
main().catch((err) => {
|
|
423
|
+
console.error('FATAL', err)
|
|
424
|
+
process.exit(1)
|
|
425
|
+
})
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
[03:22:04.847] 测试用户已注册(token=ut-b725d…)BASE=http://127.0.0.1:3000
|
|
2
|
+
[03:22:04.968] PASS 服务可达且为多引擎版本(注册表含 codex/dsh/opencode) — harnesses=mock,omp,opencode,codex,dsh,claude
|
|
3
|
+
[03:22:05.003] PASS 新建产线 — line=多引擎联调线
|
|
4
|
+
[03:22:05.042] PASS 新建 DCW 数控节点(mock 温控) — id=dw-c5cc2e42
|
|
5
|
+
[03:22:05.050] PASS 新建 DAQ 数采节点(mock 温度) — id=dn-960ca8da driver=mock
|
|
6
|
+
[03:22:05.056] PASS 创建 AgentChannel(lead=omp) — channelId=7decac99-c3f6-45d7-820d-a571976c0381
|
|
7
|
+
[03:22:05.065] PASS 创建 worker-codex 并入组(harness=codex) — 051d24dc-2b2f-4f2e-94a5-0711b187866e
|
|
8
|
+
[03:22:05.078] PASS 创建 worker-dsh 并入组(harness=dsh) — 4eb98cb2-fcc9-4781-88c9-ca7cbc135d3d
|
|
9
|
+
[03:22:05.096] WS 监控已接入(AEP 实时帧)
|
|
10
|
+
[03:22:07.640] PASS 绑定 dsh↔DCW(manual,HITL 模式) — mode=manual
|
|
11
|
+
[03:22:07.646] PASS 绑定 dsh↔DAQ(auto,数采)
|
|
12
|
+
[03:22:07.652] PASS 绑定 codex↔DCW(manual)
|
|
13
|
+
[03:22:07.659] PASS dsh 工具面可见绑定节点(my_industrial_nodes) — #### ◆ 联调温度设定器 [id=dw-c5cc2e42] - 物理量: 烘箱温度设定,单位 ℃,精度 1 位小数 - 工艺语义: 烘箱/熔体温度设定:升高使热塑温度上升(成膜更均匀但能耗高、过热降解风险),降低则偏冷易厚度不均。调整后
|
|
14
|
+
[03:22:07.711] PASS 人类→codex 消息已投递 — status=200
|
|
15
|
+
[03:22:08.767] [事件] #3 a2a.message ?→?: 兼容性检查:请用一句话汇报你正在运行的引擎类型(如 codex),然后调用 report_progress 工具上报 10% 进度(无任务上下文则忽略报错),最后原样回复"codex 在线"。
|
|
16
|
+
[03:25:29.004] [事件] #32 a2a.artifact artifact(output)
|
|
17
|
+
[03:25:29.004] PASS codex 回执到达(真实引擎回合) — 内容=
|
|
18
|
+
[03:25:29.032] PASS 人类→dsh 消息已投递 — status=200
|
|
19
|
+
[03:25:29.891] [事件] #35 a2a.message ?→?: 兼容性检查:请用一句话汇报你正在运行的引擎类型(如 dsh/ACP),然后原样回复"dsh 在线"。
|
|
20
|
+
[03:25:39.365] [事件] #38 a2a.artifact artifact(output)
|
|
21
|
+
[03:25:39.365] PASS dsh 回执到达(真实引擎回合) — 内容=
|
|
22
|
+
[03:25:39.372] PASS 人类→codex(要求跨引擎发信)已投递 — status=200
|
|
23
|
+
[03:25:39.937] [事件] #41 a2a.message ?→?: 请使用 send_message_to_agent 工具向同事 worker-dsh 发送一句话:"跨引擎测试:请回复你的引擎类型",并设置 require_reply=true;发送完成后回复我"已发送"。
|
|
24
|
+
[03:27:03.462] [事件] #77 a2a.artifact artifact(output)
|
|
25
|
+
[03:27:03.462] PASS codex 经工具跨引擎发信完成 — 内容=
|
|
26
|
+
[03:29:03.828] FAIL dsh 侧收到 codex 来信
|
|
27
|
+
[03:29:03.878] PASS 团队作业(goal)已提交至 lead — taskId=2d2d0a82-1efd-4d8e-afb7-86fd4049e2ee state=SUBMITTED
|
|
28
|
+
[03:29:04.736] [事件] #81 task.status 温度工艺整定(数采+数控) → SUBMITTED
|
|
29
|
+
[03:29:04.736] [事件] #82 a2a.message ?→?:
|
|
30
|
+
[03:30:18.590] [事件] #84 task.status 温度工艺整定(数采+数控) → WORKING
|
|
31
|
+
[03:30:18.590] [事件] #85 task.status 温度工艺整定(数采+数控) → WAITING
|
|
32
|
+
[03:30:18.590] [事件] #86 task.status 温度工艺整定(数采+数控) → ASSIGNED
|
|
33
|
+
[03:30:18.590] [事件] #88 task.status 温度工艺整定(数采+数控) → WORKING
|
|
34
|
+
[03:31:50.861] [事件] #91 a2a.message ?→?: 【去重协调】你的任务 b1b6ba41「温度工艺整定(数采+数控)」与我的父任务 2d2d0a82 是同一作业目标(我已于 03:29:49 将正式执行子任务 0396b351 派给 worker-dsh:daq_que
|
|
35
|
+
[03:31:57.360] [事件] #92 a2a.message ?→?: 【单一执行路径声明】你队列中的子任务 0396b351「温度整定执行:数采均值查询+审批写入175.0+复读确认」是本次温度整定的唯一正式执行任务,按其步骤执行即可。
|
|
36
|
+
注意:worker-codex 名下有一个同目标任务
|
|
37
|
+
[03:31:57.360] [事件] #94 task.status 温度整定执行:数采均值查询+审批写入175.0+复读确认 → WORKING
|
|
38
|
+
[03:32:31.864] [WS/hitl.request] dcw-approval: DCW 下发审批
|
|
39
|
+
[03:32:31.864] [WS/hitl.request] dcw-approval: DCW 下发审批
|
|
40
|
+
[03:32:31.864] [WS/hitl.request] dcw-approval: DCW 下发审批
|
|
41
|
+
[03:32:31.868] PASS 数控写入触发 dcw-approval HITL(worker-dsh) — id=ap-8c34b592 detail=联调温度设定器(烘箱温度设定)设定 175℃,安全量程 150~200℃
|
|
42
|
+
[03:32:31.869] 审批从提交到出现耗时 207.99s
|
|
43
|
+
[03:32:31.869] 测试员批准审批(模拟用户确认)…
|
|
44
|
+
[03:32:31.880] [WS/hitl.resolved] dcw-approval outcome=answered
|
|
45
|
+
[03:32:31.881] PASS HITL 批准应答成功(respond 200) — status=200 {"status":200,"code":0,"message":"ok","data":{"ok":true,"kind":"dcw-approval","id":"ap-8c34b592","ap
|
|
46
|
+
[03:32:31.881] [WS/hitl.resolved] dcw-approval outcome=answered
|
|
47
|
+
[03:32:31.881] [WS/hitl.resolved] dcw-approval outcome=answered
|
|
48
|
+
[03:32:32.959] [事件] #101 hitl.request dcw-approval:DCW 下发审批
|
|
49
|
+
[03:32:32.959] [事件] #102 hitl.resolved dcw-approval outcome=answered
|
|
50
|
+
[03:32:43.503] [事件] #105 a2a.message ?→?: 【温度整定执行汇报】任务 0396b351(三步:数采均值→审批写入175.0→复读确认)已完成,四项结果如下(数值均经标定、带时间,可复核):
|
|
51
|
+
|
|
52
|
+
① 数采均值:最近5分钟窗口(2026-09-05T03:27~03:3
|
|
53
|
+
[03:32:46.626] [事件] #106 task.status 温度整定执行:数采均值查询+审批写入175.0+复读确认 → COMPLETED
|
|
54
|
+
[03:32:55.013] [事件] #112 a2a.artifact artifact(output)
|
|
55
|
+
[03:32:59.279] [事件] #115 a2a.message ?→?: 【收到,确认对齐】明白:0396b351 是本次温度整定的唯一正式执行任务。该任务我已按步骤完成并上报(COMPLETED,队列已空):审批写入 175.0℃ 一次成功,dcw_read 复读 ACT=SET=175℃
|
|
56
|
+
[03:33:01.388] [事件] #120 a2a.artifact artifact(output)
|
|
57
|
+
[03:33:18.184] [事件] #150 a2a.message ?→?: 【汇报已验收】四项结果收到并确认:①数采无数据(节点 offline/停线,如实记录未伪造,处理正确) ②审批放行 ③写入 175.0℃ 成功(opt-23a51812) ④复读 ACT=SET=175℃ 一致。任务 0
|
|
58
|
+
[03:33:21.365] [事件] #155 a2a.artifact artifact(output)
|
|
59
|
+
[03:33:26.614] [事件] #157 a2a.message ?→?: 【证据转发,请收口 b1b6ba41】唯一一次物理执行已由 worker-dsh 完成(正式子任务 0396b351,状态 COMPLETED),你任务判定标准所需的每一步证据如下:
|
|
60
|
+
① 数采均值:daq_query 查
|
|
61
|
+
[03:33:41.809] [事件] #171 a2a.message ?→?: 两条均已知悉:① 0396b351 派发回执无待办(该任务已 COMPLETED,成果已验收);② 对齐确认收到——维持「唯一一次写入、不重复执行」纪律即可,无需补充材料。你的部分已收尾,后续若有复线复测再另行安排。
|
|
62
|
+
[03:33:43.400] [事件] #176 a2a.artifact artifact(output)
|
|
63
|
+
[03:34:26.492] [事件] #238 a2a.artifact artifact(output)
|
|
64
|
+
[03:36:18.851] [事件] #252 a2a.message ?→?: 任务「温度工艺整定(数采+数控)」进度 0% 已 360s 未变化,请确认是否仍在推进;若卡住请说明阻塞并请求协助
|
|
65
|
+
[03:38:25.031] [事件] #270 error {"code":"CODEX_ERROR","message":"[object Object]"}
|
|
66
|
+
[03:38:25.031] [事件] #271 task.status 温度工艺整定(数采+数控) → FAILED
|
|
67
|
+
[03:38:54.565] [WS/hitl.request] codex-approval: codex 命令审批:"C:\\WINDOWS\\System32\\WindowsPowerShell\\v1.0\\powershell.exe" -Command '$src='"'D:\\codes\\ABO\\AgentWorkShop\\data\\workshop.sqlite'; "'$dst="$PWD'"\\workshop-copy.sqlite\"; Copy-Item -LiteralPath
|
|
68
|
+
[03:38:54.565] [WS/hitl.request] codex-approval: codex 命令审批:"C:\\WINDOWS\\System32\\WindowsPowerShell\\v1.0\\powershell.exe" -Command '$src='"'D:\\codes\\ABO\\AgentWorkShop\\data\\workshop.sqlite'; "'$dst="$PWD'"\\workshop-copy.sqlite\"; Copy-Item -LiteralPath
|
|
69
|
+
[03:38:54.565] [WS/hitl.request] codex-approval: codex 命令审批:"C:\\WINDOWS\\System32\\WindowsPowerShell\\v1.0\\powershell.exe" -Command '$src='"'D:\\codes\\ABO\\AgentWorkShop\\data\\workshop.sqlite'; "'$dst="$PWD'"\\workshop-copy.sqlite\"; Copy-Item -LiteralPath
|
|
70
|
+
[03:38:55.160] [事件] #274 hitl.request codex-approval:codex 命令审批:"C:\\WINDOWS\\System32\\WindowsPowerShell\\v1.0\\powershell.exe" -Command '$src='"'D:\\codes\\ABO\\AgentWorkShop\\data\\workshop.sqlite'; "'$dst="$PWD'"\\workshop-copy.sqlite\"; Copy-Item -LiteralPath
|
|
71
|
+
[03:39:35.331] [事件] #277 task.status 温度工艺整定(数采+数控) → ASSIGNED
|
|
72
|
+
[03:39:35.331] [事件] #279 task.status 温度工艺整定(数采+数控) → WORKING
|
|
73
|
+
[03:39:42.696] [事件] #280 a2a.message ?→?: 【收口请求,只做簿记不做执行】背景:平台曾把同目标 goal 任务 b1b6ba41「温度工艺整定(数采+数控)」重复派给 worker-codex,其停滞后被结算 FAILED;父任务 2d2d0a82 在它未 set
|
|
74
|
+
[03:40:22.373] [WS/hitl.request] dcw-approval: DCW 下发审批
|
|
75
|
+
[03:40:22.373] [WS/hitl.request] dcw-approval: DCW 下发审批
|
|
76
|
+
[03:40:22.373] [WS/hitl.request] dcw-approval: DCW 下发审批
|
|
77
|
+
[03:40:23.530] [事件] #286 hitl.request dcw-approval:DCW 下发审批
|
|
78
|
+
[03:42:11.972] [事件] #291 task.status 温度工艺整定(数采+数控) → COMPLETED
|
|
79
|
+
[03:42:11.972] [事件] #292 a2a.artifact artifact(goal-summary)
|
|
80
|
+
[03:42:11.972] [事件] #293 task.status 温度工艺整定(数采+数控) → WORKING
|
|
81
|
+
[03:42:11.972] [事件] #294 a2a.message ?→?: b1b6ba41 已收口(complete_task 已调用,deliverable 采用 03:32:42 四项证据)。补充两点如实汇报:① 本回合我复核过现场——daq_query 近5分钟无数据(停线),dcw_r
|
|
82
|
+
[03:42:23.565] [事件] #298 a2a.artifact artifact(output)
|
|
83
|
+
[03:42:26.704] [事件] #300 a2a.message ?→?: 两点均已知悉:① b1b6ba41 收口确认,感谢复核(无数据/设定仍生效)且遵守了未再写入;② dw-c5cc2e42 上那条 175.0 待审批指令(审批超时遗留,值与现设定相同)——我会在父任务收口交付与班组时间线
|
|
84
|
+
[03:42:30.871] [事件] #303 a2a.artifact artifact(output)
|
|
85
|
+
[03:42:35.112] PASS 团队任务闭环 COMPLETED — state=COMPLETED
|
|
86
|
+
[03:42:35.127] PASS 写入生效:dcw_read 读回 175 附近 — 读取成功:联调温度设定器(烘箱温度设定) PLC 读数(ACT): 175℃ @ 03:42:35 当前设定(SET): 175℃ 对照: 读数与设定一致(设定已生效) 原始值(raw): 175
|
|
87
|
+
[03:42:35.154] PASS 超时场景消息已投递(下调 160) — status=200
|
|
88
|
+
[03:42:35.162] [事件] #305 task.status 温度工艺整定(数采+数控) → COMPLETED
|
|
89
|
+
[03:42:35.162] [事件] #306 a2a.message ?→?: 请用 dcw_control 工具将「联调温度设定器」下调至 160.0(hypothesis=超时路径验证)。该写入需要人工审批:请发起审批后耐心等待;若审批被拒绝或超时未批,请如实汇报等待与结果,不要重复发起。
|
|
90
|
+
[03:42:35.174] PASS 第二次写入触发审批 — id=ap-623e8813 expiresAt=2026-09-05T03:43:22.373Z
|
|
91
|
+
[03:42:35.174] 测试员故意不批准 — 等待审批超时上限(security.hitl_timeout_ms,默认 180s)…
|
|
92
|
+
[03:43:22.252] [事件] #315 a2a.message ?→?: 需要你协调:测试员(非名册成员,我无法直接寻址回复)刚指示我将 dw-c5cc2e42 下调至 160.0(hypothesis=超时路径验证,走人工审批)。问题:我调用 dcw_control 被平台拒绝——该节点上仍
|
|
93
|
+
[03:43:22.386] [WS/hitl.resolved] dcw-approval outcome=expired
|
|
94
|
+
[03:43:22.386] [WS/hitl.resolved] dcw-approval outcome=expired
|
|
95
|
+
[03:43:22.386] [WS/hitl.resolved] dcw-approval outcome=expired
|
|
96
|
+
[03:43:23.654] [事件] #316 hitl.resolved dcw-approval outcome=expired
|
|
97
|
+
[03:43:23.654] PASS 审批到上限自动收敛(expired) — outcome=expired
|
|
98
|
+
[03:43:23.658] PASS 审批从待办清单移除
|
|
99
|
+
[03:43:23.666] PASS 拒绝后值未变(仍 ~175,非 160) — 读取成功:联调温度设定器(烘箱温度设定) PLC 读数(ACT): 175℃ @ 03:43:23 当前设定(SET): 175℃ 对照: 读数与设定一致(设定已生效) 原始值(raw): 175
|
|
100
|
+
[03:43:52.390] [事件] #318 a2a.message ?→?: 【升级确认】收到你的阻塞上报:dw-c5cc2e42 残留的 175.0 待审批指令使新的 dcw_control(160.0)被平台拒绝——这是节点级「单挂起审批」约束,你处理正确(未重复发起)。
|
|
101
|
+
处置:我正通过决策弹
|
|
102
|
+
[03:43:54.568] [WS/hitl.resolved] codex-approval outcome=cancelled
|
|
103
|
+
[03:43:54.568] [WS/hitl.resolved] codex-approval outcome=cancelled
|
|
104
|
+
[03:43:54.568] [WS/hitl.resolved] codex-approval outcome=cancelled
|
|
105
|
+
[03:43:55.747] [事件] #319 hitl.resolved codex-approval outcome=cancelled
|
|
106
|
+
[03:43:56.401] [事件] #322 a2a.message ?→?: 收到,明确执行:收到你的 go 信号前不调用 dcw_control,仅以 dcw_read 保持对 dw-c5cc2e42 的设定/读数观察、被问及时汇报;收到 go 后仅重新发起一次 160.0(hypothesis
|
|
107
|
+
[03:43:58.008] [WS/hitl.request] omp-dialog: dw-c5cc2e42「联调温度设定器」残留一条 175.0 待审批指令(此前审批超时遗留,值与当前设定相同),它已阻塞 worker-dsh 按您的指示发起 160.0 下调(平台拒绝同节点并发挂起审批)。请选择处置方式:
|
|
108
|
+
[03:43:58.008] [WS/hitl.request] omp-dialog: dw-c5cc2e42「联调温度设定器」残留一条 175.0 待审批指令(此前审批超时遗留,值与当前设定相同),它已阻塞 worker-dsh 按您的指示发起 160.0 下调(平台拒绝同节点并发挂起审批)。请选择处置方式:
|
|
109
|
+
[03:43:58.008] [WS/hitl.request] omp-dialog: dw-c5cc2e42「联调温度设定器」残留一条 175.0 待审批指令(此前审批超时遗留,值与当前设定相同),它已阻塞 worker-dsh 按您的指示发起 160.0 下调(平台拒绝同节点并发挂起审批)。请选择处置方式:
|
|
110
|
+
[03:43:58.400] [事件] #323 hitl.request omp-dialog:dw-c5cc2e42「联调温度设定器」残留一条 175.0 待审批指令(此前审批超时遗留,值与当前设定相同),它已阻塞 worker-dsh 按您的指示发起 160.0 下调(平台拒绝同节点并发挂起审批)。请选择处置方式:
|
|
111
|
+
[03:43:59.867] [事件] #325 a2a.artifact artifact(output)
|
|
112
|
+
[03:45:51.597] [WS/hitl.resolved] omp-dialog outcome=cancelled
|
|
113
|
+
[03:45:51.597] [WS/hitl.resolved] omp-dialog outcome=cancelled
|
|
114
|
+
[03:45:51.597] [WS/hitl.resolved] omp-dialog outcome=cancelled
|
|
115
|
+
[03:45:52.854] [事件] #329 hitl.resolved omp-dialog outcome=cancelled
|
|
116
|
+
[03:46:05.125] [WS/hitl.request] omp-dialog: dw-c5cc2e42「联调温度设定器」残留一条 175.0 待审批指令(审批超时遗留,值与当前设定相同),平台的防堆积机制已拒绝 worker-dsh 发起您的 160.0 下调(非对 160.0 的否决;当前 ACT=SET=175℃ 未变,dsh 已按规挂起)。请处置:
|
|
117
|
+
[03:46:05.125] [WS/hitl.request] omp-dialog: dw-c5cc2e42「联调温度设定器」残留一条 175.0 待审批指令(审批超时遗留,值与当前设定相同),平台的防堆积机制已拒绝 worker-dsh 发起您的 160.0 下调(非对 160.0 的否决;当前 ACT=SET=175℃ 未变,dsh 已按规挂起)。请处置:
|
|
118
|
+
[03:46:05.125] [WS/hitl.request] omp-dialog: dw-c5cc2e42「联调温度设定器」残留一条 175.0 待审批指令(审批超时遗留,值与当前设定相同),平台的防堆积机制已拒绝 worker-dsh 发起您的 160.0 下调(非对 160.0 的否决;当前 ACT=SET=175℃ 未变,dsh 已按规挂起)。请处置:
|
|
119
|
+
[03:46:06.561] [事件] #345 hitl.request omp-dialog:dw-c5cc2e42「联调温度设定器」残留一条 175.0 待审批指令(审批超时遗留,值与当前设定相同),平台的防堆积机制已拒绝 worker-dsh 发起您的 160.0 下调(非对 160.0 的否决;当前 ACT=SET=175℃ 未变,dsh 已按规挂起)。请处置:
|
|
120
|
+
[03:48:23.717] FAIL worker 回执汇报超时/拒绝结果 — 300s 未回
|
|
121
|
+
[03:48:23.717] REST 事件历史共 350 帧;WS 实时收到 51916 帧
|
|
122
|
+
[03:48:23.717] 帧分布: {"agent.member":4,"a2a.message":19,"agent.status":40,"agent.delta":178,"agent.status.message":65,"a2a.artifact":12,"agent.message":4,"task.status":13,"task.progress":2,"hitl.request":5,"hitl.resolved":4,"memory.saved":3,"error":1}
|
|
123
|
+
[03:48:23.718] PASS 事件流覆盖关键类型(task/status/message/hitl) — {"agent.member":4,"a2a.message":19,"agent.status":40,"agent.delta":178,"agent.status.message":65,"a2a.artifact":12,"agent.message":4,"task.status":13,"task.prog
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* registry 冒烟:全部 harness 注册与能力面(调试脚本)。
|
|
3
|
+
* 运行:npx tsx scripts/_dbg-registry-smoke.ts
|
|
4
|
+
*/
|
|
5
|
+
async function main() {
|
|
6
|
+
const m = await import('../server/services/workshop/agents/registry')
|
|
7
|
+
const metas = m.harnessMetas()
|
|
8
|
+
console.log('harnesses:', metas.map(h => h.id).join(','))
|
|
9
|
+
for (const h of metas) {
|
|
10
|
+
console.log(` ${h.id}: caps=${JSON.stringify(h.capabilities)}`)
|
|
11
|
+
}
|
|
12
|
+
void main
|
|
13
|
+
}
|
|
14
|
+
void main()
|