agentworkshop 0.7.5 → 0.7.7
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/C-GarxYC.js +1 -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/{CyygA0q4.js → CQiKcuoG.js} +4 -4
- 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/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/{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/14df171d-89cb-43ec-ad6f-9df72d6da7f5.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/{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/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 +4967 -2035
- 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} +4 -4
- 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} +119 -119
- 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} +42 -38
- 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} +102 -102
- 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 +1 -1
- 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/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-iCzNRifn.mjs} +9 -9
- package/.output/server/chunks/build/{workshop-k0XZTFKg.mjs.map → workshop-iCzNRifn.mjs.map} +1 -1
- 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/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 +1 -1
- package/.output/server/chunks/routes/api/workshop/channel-templates/_id/instantiate.post.mjs +2 -2
- 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 +2 -2
- 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 +6 -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 +1 -1
- package/.output/server/chunks/routes/api/workshop/hitl/respond.post.mjs +19 -7
- 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 +1 -1
- package/.output/server/chunks/routes/api/workshop/plugins/_name/enable.post.mjs +1 -1
- 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 +1 -1
- package/.output/server/chunks/routes/api/workshop/scene/layouts/_channelId_.put.mjs +1 -1
- 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 +2 -2
- 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 +1 -1
- package/.output/server/chunks/virtual/entry.mjs +123 -113
- 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/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/bin/aw.mjs +0 -0
- package/cli/aw.mjs +8 -1
- package/cli/commands/stop.mjs +111 -108
- package/cli/commands/tui.mjs +10 -1
- package/cli/core/registry.mjs +5 -3
- package/cli/infra.mjs +108 -109
- package/config.yml +134 -134
- package/docs/tui.md +1 -1
- package/i18n/locales/en.ts +5 -0
- package/i18n/locales/zh-CN.ts +5 -0
- package/package.json +148 -140
- package/scripts/_dbg-catalog-smoke.ts +20 -0
- package/scripts/_dbg-codex-probe.mjs +58 -0
- package/scripts/_dbg-dsh-probe.mjs +31 -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-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-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 +60 -9
- package/server/api/system/settings/index.get.ts +3 -3
- 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 +6 -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 +1366 -16
- package/server/data/dcw-lines.json +266 -0
- package/server/data/dcw-products.json +203 -0
- package/server/data/dcw-recipes.json +784 -0
- package/server/data/dcw-rollback.json +1144 -1
- package/server/data/dcw-runs.json +983 -791
- package/server/data/dcw-writes.json +1080 -0
- package/server/data/dcws.json +3278 -203
- 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 +24 -3
- package/server/plugins/workshop.ts +156 -153
- package/server/repositories/user.repository.ts +414 -391
- package/server/services/system-config.ts +30 -6
- 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 +108 -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 +592 -0
- package/server/services/workshop/agents/industrial-tools.ts +5 -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 +8 -4
- package/server/services/workshop/daq/daq-node.repo.ts +3 -5
- package/server/services/workshop/daq/daq-node.ts +2 -2
- 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 +3 -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 +7 -0
- package/shared/config/schema.json +5 -0
- package/shared/config/single-instance.mjs +133 -86
- 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/config.mjs +62 -58
- 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/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
|
@@ -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()
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 模拟工况看护:每 5s 探测各模拟器端口,死亡则以 detached 方式重启。
|
|
3
|
+
* node scripts/_dbg-sim-keeper.mjs (常驻;Ctrl+C 退出,不影响已拉起的模拟器)
|
|
4
|
+
* node scripts/_dbg-sim-keeper.mjs --once (单轮自愈后退出;供 schtasks 每分钟调度)
|
|
5
|
+
* 附带 dev server(:3000)看护:死亡且锁 pid 不存活 → 清陈旧锁后重启。
|
|
6
|
+
*/
|
|
7
|
+
import net from 'node:net'
|
|
8
|
+
import { spawn, spawnSync } from 'node:child_process'
|
|
9
|
+
import { openSync, existsSync, readFileSync, unlinkSync } from 'node:fs'
|
|
10
|
+
import { dirname, resolve } from 'node:path'
|
|
11
|
+
import { fileURLToPath } from 'node:url'
|
|
12
|
+
|
|
13
|
+
/** Windows 可靠的 pid 存活探测(process.kill(pid,0) 在 Windows 对死 pid 常误报存活) */
|
|
14
|
+
function pidAlive(pid) {
|
|
15
|
+
if (!Number.isInteger(pid) || pid <= 0) return false
|
|
16
|
+
const out = spawnSync('tasklist', ['/FI', `PID eq ${pid}`, '/FO', 'CSV', '/NH'], { encoding: 'utf-8' })
|
|
17
|
+
const line = (out.stdout ?? '').trim()
|
|
18
|
+
return line.length > 0 && !/INFO:\s*no tasks/i.test(line)
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
const repo = resolve(dirname(fileURLToPath(import.meta.url)), '..')
|
|
22
|
+
const out = resolve(repo, '.AgentWorkShop', 'data')
|
|
23
|
+
const ONCE = process.argv.includes('--once')
|
|
24
|
+
|
|
25
|
+
const SIMS = [
|
|
26
|
+
{ name: 'mqtt-http', port: 18830, cmd: 'scripts/dev-protocol-simulators.mjs', env: { MQTT_SIM_PORT: '18830', HTTP_SIM_PORT: '1889' }, log: 'sim-mqtt-http.log' },
|
|
27
|
+
{ name: 'http-sim', port: 1889, cmd: null },
|
|
28
|
+
{ name: 'modbus-tcp', port: 1502, cmd: 'scripts/dev-modbus-simulator.mjs', env: {}, log: 'sim-modbus-tcp.log' },
|
|
29
|
+
{ name: 'opcua', port: 4840, cmd: 'scripts/dev-opcua-simulator.mjs', env: { OPCUA_SIM_PORT: '4840' }, log: 'sim-opcua.log' },
|
|
30
|
+
{ name: 'plc', port: 15040, cmd: 'scripts/dev-plc-simulator.mjs', env: {}, args: ['--port', '15040'], log: 'sim-plc.log' },
|
|
31
|
+
{ name: 'rtu', port: 15030, cmd: 'scripts/_rtu-mini-slave.mjs', env: {}, log: 'sim-rtu.log' },
|
|
32
|
+
]
|
|
33
|
+
|
|
34
|
+
function portUp(port) {
|
|
35
|
+
return new Promise((resolveDone) => {
|
|
36
|
+
const s = net.connect(port, '127.0.0.1')
|
|
37
|
+
const t = setTimeout(() => { s.destroy(); resolveDone(false) }, 1200)
|
|
38
|
+
s.on('connect', () => { clearTimeout(t); s.destroy(); resolveDone(true) })
|
|
39
|
+
s.on('error', () => { clearTimeout(t); resolveDone(false) })
|
|
40
|
+
})
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
function launch(sim) {
|
|
44
|
+
if (!sim.cmd) return
|
|
45
|
+
const fd = openSync(resolve(out, sim.log), 'a')
|
|
46
|
+
const child = spawn(process.execPath, [resolve(repo, sim.cmd), ...(sim.args ?? [])], {
|
|
47
|
+
cwd: repo,
|
|
48
|
+
env: { ...process.env, NO_PROXY: '127.0.0.1,localhost', no_proxy: '127.0.0.1,localhost', ...sim.env },
|
|
49
|
+
detached: true,
|
|
50
|
+
stdio: ['ignore', fd, fd],
|
|
51
|
+
})
|
|
52
|
+
child.unref()
|
|
53
|
+
console.log(`[keeper ${new Date().toISOString()}] ${sim.name} down → respawn pid=${child.pid}`)
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
async function tick() {
|
|
57
|
+
for (const sim of SIMS) {
|
|
58
|
+
const up = await portUp(sim.port)
|
|
59
|
+
if (!up) launch(sim)
|
|
60
|
+
}
|
|
61
|
+
// dev server 看护:down → 锁 pid 活着(启动中)等它;锁 pid 死/无锁 → 清锁重启
|
|
62
|
+
const devUp = await portUp(3000)
|
|
63
|
+
if (!devUp) {
|
|
64
|
+
const lockPath = resolve(repo, '.AgentWorkShop', '.runtime', 'aw.lock')
|
|
65
|
+
let lockPid = 0
|
|
66
|
+
try {
|
|
67
|
+
if (existsSync(lockPath)) {
|
|
68
|
+
const lock = JSON.parse(readFileSync(lockPath, 'utf-8'))
|
|
69
|
+
lockPid = Number(lock.pid ?? 0)
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
catch { /* 无锁/坏锁 */ }
|
|
73
|
+
if (lockPid && pidAlive(lockPid)) {
|
|
74
|
+
// 僵尸 guard:占锁不服务(worker 被外部击杀后 guard 悬挂)→ 强杀进程树再重启
|
|
75
|
+
spawnSync('taskkill', ['/PID', String(lockPid), '/T', '/F'])
|
|
76
|
+
console.log(`[keeper ${new Date().toISOString()}] dev-server 僵尸 guard(pid=${lockPid})已强杀`)
|
|
77
|
+
}
|
|
78
|
+
try { unlinkSync(lockPath) } catch { /* 无锁 */ }
|
|
79
|
+
const fd = openSync(resolve(out, 'dev-server.log'), 'a')
|
|
80
|
+
const child = spawn(process.execPath, ['bin/aw.mjs', 'dev'], {
|
|
81
|
+
cwd: repo,
|
|
82
|
+
env: { ...process.env, NO_PROXY: '127.0.0.1,localhost', no_proxy: '127.0.0.1,localhost' },
|
|
83
|
+
detached: true,
|
|
84
|
+
stdio: ['ignore', fd, fd],
|
|
85
|
+
})
|
|
86
|
+
child.unref()
|
|
87
|
+
console.log(`[keeper ${new Date().toISOString()}] dev-server down(锁已清)→ respawn pid=${child.pid}`)
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
const sleep = ms => new Promise(r => setTimeout(r, ms))
|
|
92
|
+
console.log(`[keeper] watching(once=${ONCE}):`, SIMS.map(s => `${s.name}:${s.port}`).join(' '), '+ dev:3000')
|
|
93
|
+
if (ONCE) {
|
|
94
|
+
try { await tick() } catch (err) { console.error('[keeper] tick error:', err?.message ?? err) }
|
|
95
|
+
} else {
|
|
96
|
+
for (;;) {
|
|
97
|
+
try { await tick() } catch (err) { console.error('[keeper] tick error:', err?.message ?? err) }
|
|
98
|
+
await sleep(5000)
|
|
99
|
+
}
|
|
100
|
+
}
|
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 四引擎班组精简演练(真实服务 + 模拟工况数据):
|
|
3
|
+
* lead=omp;worker-dsh=数采(daq_query);worker-codex=数控写入(dcw_control,HITL)+复读;
|
|
4
|
+
* worker-opencode=数控读(dcw_read)。单 goal 任务,审批到达即批准,最小 token 消耗。
|
|
5
|
+
* 运行:node scripts/_dbg-team-drill.mjs
|
|
6
|
+
*/
|
|
7
|
+
const BASE = process.env.AW_BASE ?? 'http://127.0.0.1:3000'
|
|
8
|
+
let failures = 0
|
|
9
|
+
const check = (name, ok, detail = '') => {
|
|
10
|
+
console.log(` ${ok ? 'PASS' : 'FAIL'} ${name}${detail ? ` — ${detail}` : ''}`)
|
|
11
|
+
if (ok) passed += 1
|
|
12
|
+
else failures += 1
|
|
13
|
+
}
|
|
14
|
+
let passed = 0
|
|
15
|
+
const sleep = (ms) => new Promise(r => setTimeout(r, ms))
|
|
16
|
+
const log = (l) => console.log(`[${new Date().toISOString().slice(11, 19)}] ${l}`)
|
|
17
|
+
|
|
18
|
+
const reg = await fetch(`${BASE}/api/workshop/users/register`, { method: 'POST', headers: { 'content-type': 'application/json' }, body: JSON.stringify({ name: 'drill-' + Math.random().toString(36).slice(2, 8) }) }).then(r => r.json())
|
|
19
|
+
const T = reg?.data?.token
|
|
20
|
+
if (!T) { console.error('注册失败(服务未启动?)'); process.exit(1) }
|
|
21
|
+
const sleep2 = (ms) => new Promise(r => setTimeout(r, ms))
|
|
22
|
+
const api = async (method, path, body, attempt = 0) => {
|
|
23
|
+
try {
|
|
24
|
+
const res = await fetch(`${BASE}${path}`, { method, headers: { 'content-type': 'application/json', authorization: `Bearer ${T}` }, body: body !== undefined ? JSON.stringify(body) : undefined })
|
|
25
|
+
return await res.json().catch(() => ({}))
|
|
26
|
+
}
|
|
27
|
+
catch (e) {
|
|
28
|
+
if (attempt < 3) {
|
|
29
|
+
await sleep2(1500)
|
|
30
|
+
return await api(method, path, body, attempt + 1)
|
|
31
|
+
}
|
|
32
|
+
throw e
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
// ── WS 录制流(事件持久化由首个订阅触发)──
|
|
37
|
+
const { createRequire } = await import('node:module')
|
|
38
|
+
const { WebSocket } = createRequire(import.meta.url)('D:/codes/ABO/AgentWorkShop/node_modules/.pnpm/ws@8.21.3/node_modules/ws')
|
|
39
|
+
|
|
40
|
+
const seen = []
|
|
41
|
+
let lastSeq = 0
|
|
42
|
+
let ws = null
|
|
43
|
+
function startWs(channelId) {
|
|
44
|
+
ws = new WebSocket(BASE.replace(/^http/, 'ws') + '/api/workshop/ws')
|
|
45
|
+
ws.on('open', () => ws.send(JSON.stringify({ type: 'sub', channelId, token: T })))
|
|
46
|
+
ws.on('message', (raw) => {
|
|
47
|
+
try {
|
|
48
|
+
const f = JSON.parse(String(raw))
|
|
49
|
+
if (f.type === 'hitl.request') log(`[WS] HITL ${f.payload?.kind}: ${String(f.payload?.detail ?? f.payload?.title ?? '').slice(0, 90)}`)
|
|
50
|
+
if (f.type === 'hitl.resolved') log(`[WS] HITL resolved outcome=${f.payload?.outcome}`)
|
|
51
|
+
if (f.type === 'task.status') log(`[WS] task ${f.payload?.state} ${(f.payload?.title ?? '').slice(0, 40)}`)
|
|
52
|
+
}
|
|
53
|
+
catch { /* ignore */ }
|
|
54
|
+
})
|
|
55
|
+
ws.on('error', () => {})
|
|
56
|
+
}
|
|
57
|
+
async function pollEvents(channelId) {
|
|
58
|
+
const res = await api('GET', `/api/workshop/channels/${channelId}/events?limit=500`)
|
|
59
|
+
for (const f of (res?.data?.items ?? [])) {
|
|
60
|
+
if (Number(f.seq ?? 0) > lastSeq) {
|
|
61
|
+
lastSeq = Number(f.seq)
|
|
62
|
+
seen.push(f)
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
async function waitUntil(cond, timeoutMs, intervalMs = 1500) {
|
|
67
|
+
const deadline = Date.now() + timeoutMs
|
|
68
|
+
while (Date.now() < deadline) {
|
|
69
|
+
try {
|
|
70
|
+
if (await cond()) return true
|
|
71
|
+
}
|
|
72
|
+
catch { /* 瞬态网络/重载抖动,按条件未满足继续轮询 */ }
|
|
73
|
+
await sleep(intervalMs)
|
|
74
|
+
}
|
|
75
|
+
return false
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
// ── 1. 产线 + 模拟工况节点 ──
|
|
79
|
+
const line = await api('POST', '/api/workshop/dcw/lines', { name: '四引擎演练线' })
|
|
80
|
+
const dcw = await api('POST', '/api/workshop/dcw', { templateRef: 'dcw-temp-sp', name: '演练温度设定器', driver: 'mock', lineId: line?.data?.line?.id })
|
|
81
|
+
const daq = await api('POST', '/api/workshop/daq', { templateRef: 'daq-temp-tc', name: '演练温度采集', driver: 'mock', lineId: line?.data?.line?.id, intervalMs: 1000 })
|
|
82
|
+
const dcwId = dcw?.data?.node?.id
|
|
83
|
+
const daqId = daq?.data?.node?.id
|
|
84
|
+
check('产线+数控节点+数采节点(mock 工况)创建', !!dcwId && !!daqId, `dcw=${dcwId} daq=${daqId}`)
|
|
85
|
+
|
|
86
|
+
// ── 2. 四引擎班组 ──
|
|
87
|
+
const ch = await api('POST', '/api/workshop/channels', {
|
|
88
|
+
name: '四引擎班组演练',
|
|
89
|
+
leadAgent: { name: 'lead-omp', harness: 'omp', config: { provider: 'zhipu-coding-plan', model: 'glm-5.2' } },
|
|
90
|
+
})
|
|
91
|
+
const cid = ch?.data?.channelId
|
|
92
|
+
check('创建班组(lead=omp)', !!cid)
|
|
93
|
+
startWs(cid)
|
|
94
|
+
|
|
95
|
+
async function addWorker(name, harness, config) {
|
|
96
|
+
const w = await api('POST', `/api/workshop/channels/${cid}/agents`, { name, harness, role: 'worker', config })
|
|
97
|
+
return w?.data?.id ?? null
|
|
98
|
+
}
|
|
99
|
+
const dsh = await addWorker('worker-dsh', 'dsh', { promptTimeoutMs: 480_000 })
|
|
100
|
+
// codex 需 per-agent CODEX_HOME(种子化全局凭据/网关配置;impl 追加 [mcp_servers.aw] 平台工具面)
|
|
101
|
+
const { mkdtempSync, copyFileSync, existsSync } = await import('node:fs')
|
|
102
|
+
const { tmpdir, homedir } = await import('node:os')
|
|
103
|
+
const { join } = await import('node:path')
|
|
104
|
+
const codexHome = mkdtempSync(join(tmpdir(), 'aw-drill-codex-'))
|
|
105
|
+
for (const f of ['auth.json', 'config.toml', 'cc-switch-model-catalog.json']) {
|
|
106
|
+
try { if (existsSync(join(homedir(), '.codex', f))) copyFileSync(join(homedir(), '.codex', f), join(codexHome, f)) } catch { /* ignore */ }
|
|
107
|
+
}
|
|
108
|
+
const codex = await addWorker('worker-codex', 'codex', { codexHome, approvalPolicy: 'on-request', sandbox: 'workspace-write', promptTimeoutMs: 480_000, systemPromptPrefix: '执行要直接:按指令调用平台工具并汇报,不探索文件系统。' })
|
|
109
|
+
const ocTmp = (await import('node:fs')).mkdtempSync((await import('node:os')).tmpdir() + '/aw-drill-oc-')
|
|
110
|
+
const ocCfg = (await import('node:fs')).mkdtempSync((await import('node:os')).tmpdir() + '/aw-drill-occ-')
|
|
111
|
+
try { (await import('node:fs')).mkdirSync(ocTmp + '/opencode', { recursive: true }); (await import('node:fs')).copyFileSync((await import('node:os')).homedir() + '/.local/share/opencode/auth.json', ocTmp + '/opencode/auth.json') } catch { /* ignore */ }
|
|
112
|
+
const opencode = await addWorker('worker-opencode', 'opencode', { promptTimeoutMs: 480_000, model: 'zhipuai-coding-plan/glm-5.3-flash', dataDir: ocTmp, configDir: ocCfg, baseUrl: BASE })
|
|
113
|
+
check('三 worker 入组(dsh/codex/opencode)', !!dsh && !!codex && !!opencode, `dsh=${dsh?.slice(0, 8)} codex=${codex?.slice(0, 8)} oc=${opencode?.slice(0, 8)}`)
|
|
114
|
+
|
|
115
|
+
// ── 3. 绑定工业节点 ──
|
|
116
|
+
await api('POST', '/api/workshop/agent-tools/bindings', { agentId: dsh, nodeId: daqId, kind: 'daq', mode: 'auto' })
|
|
117
|
+
await api('POST', '/api/workshop/agent-tools/bindings', { agentId: codex, nodeId: dcwId, kind: 'dcw', mode: 'manual' })
|
|
118
|
+
await api('POST', '/api/workshop/agent-tools/bindings', { agentId: opencode, nodeId: dcwId, kind: 'dcw', mode: 'manual' })
|
|
119
|
+
check('绑定完成(dsh↔DAQ auto;codex/opencode↔DCW manual)', true)
|
|
120
|
+
|
|
121
|
+
// ── 4. 团队作业(单 goal,三步,指令点对点到人)──
|
|
122
|
+
const task = await api('POST', `/api/workshop/channels/${cid}/tasks`, {
|
|
123
|
+
title: '四引擎数采数控联调',
|
|
124
|
+
mode: 'goal',
|
|
125
|
+
description: [
|
|
126
|
+
'按以下分工执行,每步只做一次,不要额外发挥:',
|
|
127
|
+
'1. worker-dsh:用 daq_query 工具查询你绑定的温度采集节点最近 5 分钟数据,把样本数与均值汇报给 lead;',
|
|
128
|
+
'2. worker-codex:用 dcw_control 工具把你绑定的「演练温度设定器」写入 172.0(会触发人工审批,等待批准后再继续),然后用 dcw_read 复读并把读数汇报给 lead;',
|
|
129
|
+
'3. worker-opencode:用 dcw_read 工具读取你绑定的「演练温度设定器」当前设定值,汇报给 lead;',
|
|
130
|
+
'4. lead:三项结果齐后调用 complete_task 汇总。',
|
|
131
|
+
].join('\n'),
|
|
132
|
+
})
|
|
133
|
+
const taskId = task?.data?.id
|
|
134
|
+
check('团队作业 goal 已提交', !!taskId, `taskId=${taskId?.slice(0, 8)}`)
|
|
135
|
+
|
|
136
|
+
// ── 5. HITL:审批到达即批准 ──
|
|
137
|
+
const approvalsDone = new Set()
|
|
138
|
+
const approved = await waitUntil(async () => {
|
|
139
|
+
const p = await api('GET', '/api/workshop/hitl/pending')
|
|
140
|
+
const items = (p?.data?.items ?? []).filter(i => i.kind === 'dcw-approval' && !approvalsDone.has(i.id))
|
|
141
|
+
for (const item of items) {
|
|
142
|
+
log(`审批到达: ${String(item.detail ?? '').slice(0, 80)} → 批准`)
|
|
143
|
+
const r = await api('POST', '/api/workshop/hitl/respond', { kind: 'dcw-approval', id: item.id, confirmed: true, comment: '演练批准' })
|
|
144
|
+
approvalsDone.add(item.id)
|
|
145
|
+
if (r?.data?.ok) log(`已批准 ${item.id}`)
|
|
146
|
+
}
|
|
147
|
+
return approvalsDone.size > 0 && (pollEvents(), seen.some(f => f.type === 'hitl.resolved' && f.payload?.outcome === 'answered'))
|
|
148
|
+
}, 600_000)
|
|
149
|
+
check('数控写入审批触发并批准', approved, `批准数=${approvalsDone.size}`)
|
|
150
|
+
|
|
151
|
+
// ── 6. 任务闭环 + 写入落地 ──
|
|
152
|
+
const done = await waitUntil(async () => {
|
|
153
|
+
const t = await api('GET', `/api/workshop/tasks/${taskId}`)
|
|
154
|
+
const st = t?.data?.state
|
|
155
|
+
if (st === 'COMPLETED' || st === 'FAILED' || st === 'CANCELED') return st
|
|
156
|
+
await pollEvents(cid)
|
|
157
|
+
return null
|
|
158
|
+
}, 900_000)
|
|
159
|
+
check('团队任务闭环 COMPLETED', done === 'COMPLETED', `state=${done}`)
|
|
160
|
+
|
|
161
|
+
const read = await api('POST', '/api/workshop/agent-tools/invoke', { agentId: codex, tool: 'dcw_read', args: { node_id: dcwId } })
|
|
162
|
+
const rb = String(read?.data?.result?.text ?? '')
|
|
163
|
+
check('写入物理生效(读回 ~172)', /17[12]/.test(rb), rb.replace(/\n/g, ' ').slice(0, 110))
|
|
164
|
+
|
|
165
|
+
await pollEvents(cid)
|
|
166
|
+
const byType = {}
|
|
167
|
+
for (const f of seen) byType[f.type] = (byType[f.type] ?? 0) + 1
|
|
168
|
+
console.log('事件帧分布:', JSON.stringify(byType))
|
|
169
|
+
check('事件流覆盖(task/message/hitl)', (byType['task.status'] ?? 0) > 0 && (byType['a2a.message'] ?? 0) > 0)
|
|
170
|
+
|
|
171
|
+
console.log(`\n━━━ 演练结论:PASS=${passed} FAIL=${failures} ━━━`)
|
|
172
|
+
try { ws?.close() } catch { /* ignore */ }
|
|
173
|
+
process.exit(failures === 0 ? 0 : 1)
|
package/scripts/dev-guard.mjs
CHANGED
|
@@ -29,6 +29,10 @@ const { existsSync, readFileSync } = await import('node:fs')
|
|
|
29
29
|
const { dirname, resolve } = await import('node:path')
|
|
30
30
|
const { fileURLToPath: u2f } = await import('node:url')
|
|
31
31
|
|
|
32
|
+
// dev 进程时间输出统一本地时区(重入实例同样生效;nitro worker 由 00-local-time 插件覆盖)
|
|
33
|
+
const { installLocalIso } = await import('../shared/local-time.mjs')
|
|
34
|
+
installLocalIso()
|
|
35
|
+
|
|
32
36
|
const root = resolve(dirname(u2f(import.meta.url)), '..')
|
|
33
37
|
|
|
34
38
|
// --- 预载 .env(与 start.mjs 同策略;已导出环境变量优先) ---
|
|
@@ -43,9 +47,13 @@ if (existsSync(envPath)) {
|
|
|
43
47
|
|
|
44
48
|
// --- 共享配置引擎:计算有效开发端口/主机 ---
|
|
45
49
|
const { loadEffective } = await import('../shared/config/engine.mjs')
|
|
50
|
+
// 模式感知路径单一入口:settings/锁根必须与 start/CLI 同源,
|
|
51
|
+
// 否则"检出内无 .AgentWorkShop"场景下 dev 写 data/、start 锁 home,互斥与设置双双失效。
|
|
52
|
+
const { resolveRunMode } = await import('../shared/config/home.mjs')
|
|
53
|
+
const rmDev = resolveRunMode({ cwd: process.cwd(), packageRoot: root, env: process.env })
|
|
46
54
|
const eff = loadEffective({
|
|
47
|
-
configPath:
|
|
48
|
-
settingsPath:
|
|
55
|
+
configPath: rmDev.configPath,
|
|
56
|
+
settingsPath: rmDev.settingsPath,
|
|
49
57
|
env: process.env,
|
|
50
58
|
mode: 'dev',
|
|
51
59
|
})
|
|
@@ -76,7 +84,7 @@ console.log(`[config] worker PORT env -> ${effectivePort}`)
|
|
|
76
84
|
// --- 单实例互斥 + 端口占用显式报错(hardening ST-1/ST-4):不再静默换端口 ---
|
|
77
85
|
{
|
|
78
86
|
const { acquireLock, checkPort } = await import('../shared/config/single-instance.mjs')
|
|
79
|
-
const lock = acquireLock(
|
|
87
|
+
const lock = acquireLock(rmDev.configRoot, { mode: 'dev', port: effectivePort })
|
|
80
88
|
if (!lock.ok) {
|
|
81
89
|
const h = lock.holder
|
|
82
90
|
console.error(`✖ 已有实例在运行(pid=${h.pid}${h.port ? `,端口=${h.port}` : ''},启动于 ${h.startedAt ?? '未知'},模式=${h.mode ?? '未知'})`)
|
|
@@ -8,6 +8,12 @@
|
|
|
8
8
|
import net from 'node:net'
|
|
9
9
|
import http from 'node:http'
|
|
10
10
|
import { createRequire } from 'node:module'
|
|
11
|
+
import { appendFileSync } from 'node:fs'
|
|
12
|
+
import { join } from 'node:path'
|
|
13
|
+
import { installLocalIso } from '../shared/local-time.mjs'
|
|
14
|
+
|
|
15
|
+
// 模拟器日志时间统一本地时区(覆盖 node-opcua 等库内部的 toISOString 输出)
|
|
16
|
+
installLocalIso()
|
|
11
17
|
|
|
12
18
|
const reqRoot = createRequire(import.meta.url)
|
|
13
19
|
// pnpm 严格布局:mqtt-packet 是 mqtt 的传递依赖,从 mqtt 包入口路径解析
|
|
@@ -31,6 +37,14 @@ const clients = new Set()
|
|
|
31
37
|
|
|
32
38
|
function brokerPublish(topic, payload) {
|
|
33
39
|
const frame = mqttPacket.generate({ cmd: 'publish', topic, payload, qos: 0 })
|
|
40
|
+
console.log(`[mqtt-sim] route topic=${topic} clients=${clients.size} filters=[${[...clients].map(c => c.filters.join('|')).join(' ; ')}]`)
|
|
41
|
+
// 控制下行审计:broker 真实收到的路由落盘(供 e2e 做确定性验收,不依赖订阅端时序)
|
|
42
|
+
if (topic.startsWith('aw/sim/setpoint')) {
|
|
43
|
+
try {
|
|
44
|
+
appendFileSync(join(process.env.AW_SIM_AUDIT_DIR ?? '.AgentWorkShop/data', 'sim-setpoint-routes.log'), `${new Date().toISOString()} ${topic} ${payload.toString()}\n`)
|
|
45
|
+
}
|
|
46
|
+
catch { /* 审计失败不影响路由 */ }
|
|
47
|
+
}
|
|
34
48
|
for (const c of clients) {
|
|
35
49
|
if (c.filters.some(f => topicMatch(f, topic))) {
|
|
36
50
|
try {
|
|
@@ -45,7 +59,20 @@ const mqttServer = net.createServer((sock) => {
|
|
|
45
59
|
const client = { sock, filters: [] }
|
|
46
60
|
clients.add(client)
|
|
47
61
|
const parser = mqttPacket.parser({ protocolVersion: 4 })
|
|
48
|
-
sock.on('data', d =>
|
|
62
|
+
sock.on('data', (d) => {
|
|
63
|
+
// 畸形帧(截断/坏头字节)只弃帧断该链,不许杀掉整个模拟工况
|
|
64
|
+
try {
|
|
65
|
+
parser.parse(d)
|
|
66
|
+
}
|
|
67
|
+
catch (err) {
|
|
68
|
+
console.error('[mqtt-sim] 弃帧(解析异常):', err instanceof Error ? err.message : err)
|
|
69
|
+
try {
|
|
70
|
+
sock.destroy()
|
|
71
|
+
}
|
|
72
|
+
catch { /* 已断 */ }
|
|
73
|
+
clients.delete(client)
|
|
74
|
+
}
|
|
75
|
+
})
|
|
49
76
|
sock.on('error', () => clients.delete(client))
|
|
50
77
|
sock.on('close', () => clients.delete(client))
|
|
51
78
|
parser.on('packet', (packet) => {
|