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
|
@@ -26,6 +26,7 @@ import { emitDcwWrite } from '@/server/services/workshop/plugins/host.mjs'
|
|
|
26
26
|
import { clearActiveLineRun, getActiveLineRun, getAllActiveLineRuns, setActiveLineRun } from './line-run'
|
|
27
27
|
import { getRecipeRollBackManager } from './recipe-rollback-manager'
|
|
28
28
|
import { recordOps } from '../ops/ops'
|
|
29
|
+
import { daqRuntimeSettings } from '../settings'
|
|
29
30
|
|
|
30
31
|
/** 运维日志写下发防噪:同节点同值 10s 内的心跳重下发不重复入册 */
|
|
31
32
|
const opsWriteMemo = new Map<string, { eng: number, at: number }>()
|
|
@@ -770,6 +771,9 @@ class DcwController {
|
|
|
770
771
|
await tsdbReady
|
|
771
772
|
const { getDaqNodeRepo } = await import('../daq/daq-node.repo')
|
|
772
773
|
const { findDaqTemplate } = await import('../daq/daq-templates')
|
|
774
|
+
// 时间间隔参数(bucketMs):缺省与下限来自 daq.query.*(live 配置,热重载)
|
|
775
|
+
const { defaultBucketMs, minBucketMs } = daqRuntimeSettings().query
|
|
776
|
+
const bucketMs = opts.bucketMs == null ? defaultBucketMs : Math.max(minBucketMs, Math.min(3_600_000, Math.round(opts.bucketMs)))
|
|
773
777
|
const nodeFilter = opts.nodeId ? opts.nodeId.split(',').map(x => x.trim()).filter(Boolean) : []
|
|
774
778
|
const nodes = getDaqNodeRepo().all().filter((n) => {
|
|
775
779
|
if (opts.paramKey && n.templateKey !== opts.paramKey) return false
|
|
@@ -785,7 +789,7 @@ class DcwController {
|
|
|
785
789
|
nodeIds: nodes.map(n => n.id),
|
|
786
790
|
fromMs: opts.fromMs,
|
|
787
791
|
toMs: opts.toMs,
|
|
788
|
-
bucketMs
|
|
792
|
+
bucketMs,
|
|
789
793
|
limit: opts.limit,
|
|
790
794
|
})
|
|
791
795
|
const channels: LineQueryResult['channels'] = []
|
|
@@ -6,27 +6,20 @@
|
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
8
|
import { randomUUID } from 'node:crypto'
|
|
9
|
-
import fs from 'node:fs'
|
|
10
9
|
import path from 'node:path'
|
|
11
10
|
import { dcwLineColorFor, type LineInput, type LineView } from '../../../../shared/dcw-protocol'
|
|
12
11
|
import { AppError, ErrorCodes } from '../../../utils/errors'
|
|
12
|
+
import { loadJsonFile, saveJsonFileAtomic } from '../json-store.mjs'
|
|
13
13
|
|
|
14
14
|
const DB_PATH = process.cwd().endsWith('server') ? 'data/dcw-lines.json' : path.join(process.cwd(), 'server', 'data', 'dcw-lines.json')
|
|
15
15
|
|
|
16
16
|
function load(): LineView[] {
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
const parsed = JSON.parse(raw)
|
|
20
|
-
return Array.isArray(parsed) ? parsed : []
|
|
21
|
-
}
|
|
22
|
-
catch {
|
|
23
|
-
return []
|
|
24
|
-
}
|
|
17
|
+
const parsed = loadJsonFile(DB_PATH, [])
|
|
18
|
+
return Array.isArray(parsed) ? parsed as LineView[] : []
|
|
25
19
|
}
|
|
26
20
|
|
|
27
21
|
function save(list: LineView[]): void {
|
|
28
|
-
|
|
29
|
-
fs.writeFileSync(DB_PATH, JSON.stringify(list, null, 2), 'utf-8')
|
|
22
|
+
saveJsonFileAtomic(DB_PATH, list)
|
|
30
23
|
}
|
|
31
24
|
|
|
32
25
|
export class DcwLineRepo {
|
|
@@ -5,9 +5,9 @@
|
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
7
|
import { createLogger } from '../logger'
|
|
8
|
-
import fs from 'node:fs'
|
|
9
8
|
import path from 'node:path'
|
|
10
9
|
import { DcwNode } from './dcw-node'
|
|
10
|
+
import { loadJsonFile, saveJsonFileAtomic } from '../json-store.mjs'
|
|
11
11
|
|
|
12
12
|
const log = createLogger('dcw.node-repo')
|
|
13
13
|
|
|
@@ -17,8 +17,7 @@ const DB_PATH = process.cwd().endsWith('server')
|
|
|
17
17
|
|
|
18
18
|
function load(): DcwNode[] {
|
|
19
19
|
try {
|
|
20
|
-
const
|
|
21
|
-
const parsed = JSON.parse(raw)
|
|
20
|
+
const parsed = loadJsonFile(DB_PATH, null)
|
|
22
21
|
return Array.isArray(parsed) ? parsed.map(r => DcwNode.fromRow(r as Record<string, unknown>)) : []
|
|
23
22
|
}
|
|
24
23
|
catch {
|
|
@@ -72,8 +71,7 @@ class DcwNodeRepo {
|
|
|
72
71
|
this.flushTimer = null
|
|
73
72
|
}
|
|
74
73
|
try {
|
|
75
|
-
|
|
76
|
-
fs.writeFileSync(DB_PATH, JSON.stringify(this.list.map(n => n.toRow()), null, 2), 'utf-8')
|
|
74
|
+
saveJsonFileAtomic(DB_PATH, this.list.map(n => n.toRow()))
|
|
77
75
|
}
|
|
78
76
|
catch (err) {
|
|
79
77
|
log.error('[dcw] 快照落盘失败:', err)
|
|
@@ -194,7 +194,19 @@ export class DcwNode {
|
|
|
194
194
|
if (row.lastReadError != null) node.lastReadError = String(row.lastReadError)
|
|
195
195
|
if (row.lastAckAt != null) node.lastAckAt = String(row.lastAckAt)
|
|
196
196
|
if (row.lastWriteAt != null) node.lastWriteAt = String(row.lastWriteAt)
|
|
197
|
-
if (row.state != null)
|
|
197
|
+
if (row.state != null) {
|
|
198
|
+
const restored = String(row.state)
|
|
199
|
+
// 持久化恢复消毒:'writing' 是进程内瞬态(写事务在飞)。若被快照带出后进程
|
|
200
|
+
// 硬杀重启,原样恢复会让该节点所有写永久 409(startAll 只复位 offline)。
|
|
201
|
+
// 归一为 error:写路径放行,同时显式提示"上次写入结果未知,需核销"。
|
|
202
|
+
if (restored === 'writing') {
|
|
203
|
+
node.state = 'error'
|
|
204
|
+
node.lastError = node.lastError || '进程中断于写入,状态已复位为 error(上次写入结果未知,请回读核销)'
|
|
205
|
+
}
|
|
206
|
+
else {
|
|
207
|
+
node.state = restored as DcwNodeState
|
|
208
|
+
}
|
|
209
|
+
}
|
|
198
210
|
if (row.lastError != null) node.lastError = String(row.lastError)
|
|
199
211
|
return node
|
|
200
212
|
}
|
|
@@ -4,11 +4,11 @@
|
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
6
|
import { createLogger } from '../logger'
|
|
7
|
-
import fs from 'node:fs'
|
|
8
7
|
import path from 'node:path'
|
|
9
8
|
import { randomUUID } from 'node:crypto'
|
|
10
9
|
import type { ProductInput, ProductView } from '../../../../shared/dcw-protocol'
|
|
11
10
|
import { AppError, ErrorCodes } from '../../../utils/errors'
|
|
11
|
+
import { loadJsonFile, saveJsonFileAtomic } from '../json-store.mjs'
|
|
12
12
|
|
|
13
13
|
const log = createLogger('dcw.product-repo')
|
|
14
14
|
|
|
@@ -18,7 +18,7 @@ const DB_PATH = process.cwd().endsWith('server')
|
|
|
18
18
|
|
|
19
19
|
function load(): ProductView[] {
|
|
20
20
|
try {
|
|
21
|
-
const parsed =
|
|
21
|
+
const parsed = loadJsonFile(DB_PATH, null)
|
|
22
22
|
return Array.isArray(parsed) ? parsed as ProductView[] : []
|
|
23
23
|
}
|
|
24
24
|
catch {
|
|
@@ -78,8 +78,7 @@ class DcwProductRepo {
|
|
|
78
78
|
|
|
79
79
|
private flush(): void {
|
|
80
80
|
try {
|
|
81
|
-
|
|
82
|
-
fs.writeFileSync(DB_PATH, JSON.stringify(this.list, null, 2), 'utf-8')
|
|
81
|
+
saveJsonFileAtomic(DB_PATH, this.list)
|
|
83
82
|
}
|
|
84
83
|
catch (err) {
|
|
85
84
|
log.error('[dcw-product] 落盘失败:', err)
|
|
@@ -5,8 +5,6 @@
|
|
|
5
5
|
* 按批次时间窗归属产品;写历史追加式落盘(上限 3000 条,超出丢最旧)。
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
|
-
import { createLogger } from '../logger'
|
|
9
|
-
import fs from 'node:fs'
|
|
10
8
|
import path from 'node:path'
|
|
11
9
|
import { randomUUID } from 'node:crypto'
|
|
12
10
|
import type { RecipeDaqWindow, RecipeInput, RecipeParam, RecipeRunView, RecipeView } from '../../../../shared/dcw-protocol'
|
|
@@ -15,8 +13,7 @@ import { AppError, ErrorCodes } from '../../../utils/errors'
|
|
|
15
13
|
import { getDcwProductRepo } from './dcw-product.repo'
|
|
16
14
|
import { getDcwNodeRepo } from './dcw-node.repo'
|
|
17
15
|
import { getDaqNodeRepo } from '../daq/daq-node.repo'
|
|
18
|
-
|
|
19
|
-
const log = createLogger('dcw.recipe-repo')
|
|
16
|
+
import { loadJsonFile, saveJsonFileAtomic } from '../json-store.mjs'
|
|
20
17
|
|
|
21
18
|
const DATA_DIR = process.cwd().endsWith('server')
|
|
22
19
|
? 'data'
|
|
@@ -29,24 +26,11 @@ const RUNS_CAP = 200
|
|
|
29
26
|
const WRITES_CAP = 3000
|
|
30
27
|
|
|
31
28
|
function loadJson<T>(file: string, fallback: T): T {
|
|
32
|
-
|
|
33
|
-
const raw = fs.readFileSync(file, 'utf-8')
|
|
34
|
-
const parsed = JSON.parse(raw)
|
|
35
|
-
return parsed ?? fallback
|
|
36
|
-
}
|
|
37
|
-
catch {
|
|
38
|
-
return fallback
|
|
39
|
-
}
|
|
29
|
+
return loadJsonFile(file, fallback) as T
|
|
40
30
|
}
|
|
41
31
|
|
|
42
32
|
function saveJson(file: string, data: unknown): void {
|
|
43
|
-
|
|
44
|
-
fs.mkdirSync(path.dirname(file), { recursive: true })
|
|
45
|
-
fs.writeFileSync(file, JSON.stringify(data, null, 2), 'utf-8')
|
|
46
|
-
}
|
|
47
|
-
catch (err) {
|
|
48
|
-
log.error('[dcw-recipe] 落盘失败:', file, err)
|
|
49
|
-
}
|
|
33
|
+
saveJsonFileAtomic(file, data)
|
|
50
34
|
}
|
|
51
35
|
|
|
52
36
|
export interface DcwWriteHistoryEntry {
|
|
@@ -4,13 +4,13 @@
|
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
6
|
import { createLogger } from '../logger'
|
|
7
|
-
import fs from 'node:fs'
|
|
8
7
|
import path from 'node:path'
|
|
9
8
|
import { randomUUID } from 'node:crypto'
|
|
10
9
|
import { DCW_TEMPLATES, DCW_TEMPLATE_ICONS, dcwTemplateByKey, type DcwTemplateDef, type DcwTemplateIcon, type DcwTemplateInput } from '../../../../shared/dcw-protocol'
|
|
11
10
|
|
|
12
11
|
// dcwTemplateByKey 用于内置判别
|
|
13
12
|
import { AppError, ErrorCodes } from '../../../utils/errors'
|
|
13
|
+
import { loadJsonFile, saveJsonFileAtomic } from '../json-store.mjs'
|
|
14
14
|
|
|
15
15
|
const log = createLogger('dcw.templates')
|
|
16
16
|
|
|
@@ -20,8 +20,7 @@ const DB_PATH = process.cwd().endsWith('server')
|
|
|
20
20
|
|
|
21
21
|
function load(): DcwTemplateDef[] {
|
|
22
22
|
try {
|
|
23
|
-
const
|
|
24
|
-
const parsed = JSON.parse(raw)
|
|
23
|
+
const parsed = loadJsonFile(DB_PATH, null)
|
|
25
24
|
return Array.isArray(parsed) ? parsed as DcwTemplateDef[] : []
|
|
26
25
|
}
|
|
27
26
|
catch {
|
|
@@ -113,8 +112,7 @@ class DcwTemplateRegistry {
|
|
|
113
112
|
|
|
114
113
|
private flush(): void {
|
|
115
114
|
try {
|
|
116
|
-
|
|
117
|
-
fs.writeFileSync(DB_PATH, JSON.stringify(this.customs, null, 2), 'utf-8')
|
|
115
|
+
saveJsonFileAtomic(DB_PATH, this.customs)
|
|
118
116
|
}
|
|
119
117
|
catch (err) {
|
|
120
118
|
log.error('[dcw] 模板落盘失败:', err)
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
import { createRequire } from 'node:module'
|
|
11
11
|
import type { DcwDriverKind } from '../../../../shared/dcw-protocol'
|
|
12
12
|
import { AppError } from '../../../utils/errors'
|
|
13
|
-
import { classifyCommError, decodeRegisters, evictModbusConn, getModbusConn, getOpcUaConn, modbusKey, registerOffset, withModbusConn } from '../daq/drivers'
|
|
13
|
+
import { classifyCommError, decodeRegisters, evictModbusConn, evictOpcUaConn, getModbusConn, getOpcUaConn, modbusKey, registerOffset, withModbusConn } from '../daq/drivers'
|
|
14
14
|
|
|
15
15
|
const reqNative = createRequire(import.meta.url)
|
|
16
16
|
|
|
@@ -286,6 +286,20 @@ async function opcuaWrite(input: DcwWriteInput): Promise<DcwWriteResult> {
|
|
|
286
286
|
if (!cfg.endpoint) throw new AppError(400, 'BAD_REQUEST', '缺少端点 endpoint(opc.tcp://…)')
|
|
287
287
|
if (!cfg.nodeId) throw new AppError(400, 'BAD_REQUEST', '缺少节点 ID nodeId(ns=…;s=…)')
|
|
288
288
|
const conn = await getOpcUaConn(cfg)
|
|
289
|
+
// 会话死亡自愈:连续 3 次故障驱逐重建(与数采采样路径同策略)。此前纯写控节点
|
|
290
|
+
// 会拿同一个死 session 反复失败,直到 10 分钟空闲 sweep 才可能重建。
|
|
291
|
+
try {
|
|
292
|
+
return await opcuaWriteOnce(conn, input)
|
|
293
|
+
}
|
|
294
|
+
catch (err) {
|
|
295
|
+
conn.errors++
|
|
296
|
+
if (conn.errors >= 3) void evictOpcUaConn(cfg)
|
|
297
|
+
throw err
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
async function opcuaWriteOnce(conn: { session: import('node-opcua').ClientSession, errors: number }, input: DcwWriteInput): Promise<DcwWriteResult> {
|
|
302
|
+
const cfg = input.driverConfig
|
|
289
303
|
const opcua = reqNative('node-opcua') as typeof import('node-opcua')
|
|
290
304
|
const node = opcua.coerceNodeId(String(cfg.nodeId))
|
|
291
305
|
const writeResult = await conn.session.write({
|
|
@@ -480,6 +494,8 @@ export const mqttDcwDriver: DcwWriteDriver = {
|
|
|
480
494
|
username: cfg.username ? String(cfg.username) : undefined,
|
|
481
495
|
password: cfg.password ? String(cfg.password) : undefined,
|
|
482
496
|
connectTimeout: 4000,
|
|
497
|
+
// 一次性连接:发布即断,绝不能让 mqtt.js 默认的 1s 无限重连在后台空转
|
|
498
|
+
reconnectPeriod: 0,
|
|
483
499
|
})
|
|
484
500
|
c.once('connect', () => resolve(c))
|
|
485
501
|
c.once('error', (err) => {
|
|
@@ -490,19 +506,27 @@ export const mqttDcwDriver: DcwWriteDriver = {
|
|
|
490
506
|
reject(new Error(err.message))
|
|
491
507
|
})
|
|
492
508
|
})
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
509
|
+
const qos = Math.min(2, Math.max(0, Number(cfg.qos ?? 1))) as 0 | 1 | 2
|
|
510
|
+
try {
|
|
511
|
+
await new Promise<void>((resolve, reject) => {
|
|
512
|
+
client.publish(String(cfg.topic), payload, { qos }, (err) => {
|
|
513
|
+
if (err)
|
|
514
|
+
reject(new Error(err.message))
|
|
515
|
+
else
|
|
516
|
+
resolve()
|
|
517
|
+
})
|
|
518
|
+
// 发布确认超时(QoS1 等 puback):8s 未确认按失败收敛,不悬挂工具调用
|
|
519
|
+
const timer = setTimeout(() => reject(new Error('发布确认超时(8s)')), 8000)
|
|
520
|
+
timer.unref?.()
|
|
499
521
|
})
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
522
|
+
}
|
|
523
|
+
finally {
|
|
524
|
+
// 失败/超时路径同样关闭连接(此前只在成功后 end,超时会泄漏 client +
|
|
525
|
+
// broker session),已关闭的 client 重复 end 幂等安全
|
|
526
|
+
await new Promise<void>((resolve) => {
|
|
527
|
+
client.end(false, {}, resolve)
|
|
528
|
+
})
|
|
529
|
+
}
|
|
506
530
|
return {
|
|
507
531
|
ok: true,
|
|
508
532
|
message: `已发布 ${input.eng} → ${String(cfg.topic)}(QoS ${Number(cfg.qos ?? 1)};MQTT 无回读,建议以同主题数采节点验证)`,
|
|
@@ -11,8 +11,8 @@
|
|
|
11
11
|
* 落盘(写放大),恢复时从最近一次结构变更的值继续。
|
|
12
12
|
*/
|
|
13
13
|
|
|
14
|
-
import fs from 'node:fs'
|
|
15
14
|
import path from 'node:path'
|
|
15
|
+
import { loadJsonFile, saveJsonFileAtomic } from '../json-store.mjs'
|
|
16
16
|
|
|
17
17
|
export interface ActiveLineRun {
|
|
18
18
|
lineId: string
|
|
@@ -40,8 +40,7 @@ function restore(): void {
|
|
|
40
40
|
if (g.__lineRunsLoaded) return
|
|
41
41
|
g.__lineRunsLoaded = true
|
|
42
42
|
try {
|
|
43
|
-
const
|
|
44
|
-
const arr: unknown = JSON.parse(raw)
|
|
43
|
+
const arr: unknown = loadJsonFile(PERSIST_PATH, null)
|
|
45
44
|
if (!Array.isArray(arr)) return
|
|
46
45
|
for (const run of arr as ActiveLineRun[]) {
|
|
47
46
|
if (run?.lineId && run.runId && run.recipeId) registry().set(run.lineId, run)
|
|
@@ -55,8 +54,7 @@ function restore(): void {
|
|
|
55
54
|
/** 结构性变更落盘(开跑/停线;非热路径) */
|
|
56
55
|
function persist(): void {
|
|
57
56
|
try {
|
|
58
|
-
|
|
59
|
-
fs.writeFileSync(PERSIST_PATH, JSON.stringify(getAllActiveLineRuns(), null, 2), 'utf-8')
|
|
57
|
+
saveJsonFileAtomic(PERSIST_PATH, getAllActiveLineRuns())
|
|
60
58
|
}
|
|
61
59
|
catch {
|
|
62
60
|
// 落盘失败不阻断主流程:内存窗口仍是权威;下次结构性变更再试
|
|
@@ -10,9 +10,9 @@
|
|
|
10
10
|
*/
|
|
11
11
|
|
|
12
12
|
import { randomUUID } from 'node:crypto'
|
|
13
|
-
import fs from 'node:fs'
|
|
14
13
|
import path from 'node:path'
|
|
15
14
|
import type { DcwJournalAnchor, OptimizationRecord } from '../../../../shared/dcw-protocol'
|
|
15
|
+
import { loadJsonFile, saveJsonFileAtomic } from '../json-store.mjs'
|
|
16
16
|
|
|
17
17
|
const DATA_DIR = process.cwd().endsWith('server')
|
|
18
18
|
? 'data'
|
|
@@ -27,13 +27,8 @@ interface RollbackDb {
|
|
|
27
27
|
}
|
|
28
28
|
|
|
29
29
|
function loadDb(): RollbackDb {
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
return { anchors: parsed.anchors ?? [], records: parsed.records ?? [] }
|
|
33
|
-
}
|
|
34
|
-
catch {
|
|
35
|
-
return { anchors: [], records: [] }
|
|
36
|
-
}
|
|
30
|
+
const parsed = loadJsonFile(ROLLBACK_PATH, { anchors: [], records: [] }) as Partial<RollbackDb>
|
|
31
|
+
return { anchors: parsed.anchors ?? [], records: parsed.records ?? [] }
|
|
37
32
|
}
|
|
38
33
|
|
|
39
34
|
export class RecipeRollBackRepo {
|
|
@@ -64,8 +59,7 @@ export class RecipeRollBackRepo {
|
|
|
64
59
|
|
|
65
60
|
flushNow(): void {
|
|
66
61
|
try {
|
|
67
|
-
|
|
68
|
-
fs.writeFileSync(ROLLBACK_PATH, JSON.stringify(this.db, null, 2), 'utf-8')
|
|
62
|
+
saveJsonFileAtomic(ROLLBACK_PATH, this.db)
|
|
69
63
|
}
|
|
70
64
|
catch (err) {
|
|
71
65
|
console.error('[recipe-rollback] 落盘失败:', err)
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
// ============================================================
|
|
2
|
+
// JSON 文件存储原语 —— 全部 JSON 仓库共用(hardening:防数据丢失)。
|
|
3
|
+
//
|
|
4
|
+
// 背景(2026-09-05 QA 审计 P0-2):各仓库原先直接 writeFileSync 落盘 +
|
|
5
|
+
// load 时 catch 后静默返回空库。一次写入中断(崩溃/断电/磁盘满)即产生
|
|
6
|
+
// 截断文件,下次启动静默以空库运行,首次落盘用空数据覆盖原文件 ——
|
|
7
|
+
// recipes/产线配置/回滚锚点永久丢失。
|
|
8
|
+
//
|
|
9
|
+
// 约定:
|
|
10
|
+
// - loadJsonFile:损坏时把坏文件保留为 <name>.corrupt-<ts>(现场可追责),
|
|
11
|
+
// 再返回 fallback;ENOTDIR/ENOENT 等缺失场景静默 fallback。
|
|
12
|
+
// - saveJsonFileAtomic:先写同目录临时文件再 rename(同卷原子替换);
|
|
13
|
+
// rename 失败(Windows 杀软占用等)退回直写,保证可用性。
|
|
14
|
+
// ============================================================
|
|
15
|
+
import { mkdirSync, readFileSync, renameSync, writeFileSync } from 'node:fs'
|
|
16
|
+
import { dirname } from 'node:path'
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* 读取 JSON 文件;缺失或损坏时返回 fallback。
|
|
20
|
+
* @param {string} filePath
|
|
21
|
+
* @param {unknown} fallback 缺省结构(如 { anchors: [], records: [] } 或 [])
|
|
22
|
+
* @returns
|
|
23
|
+
*/
|
|
24
|
+
export function loadJsonFile(filePath, fallback) {
|
|
25
|
+
let raw
|
|
26
|
+
try {
|
|
27
|
+
raw = readFileSync(filePath, 'utf-8')
|
|
28
|
+
}
|
|
29
|
+
catch {
|
|
30
|
+
return fallback
|
|
31
|
+
}
|
|
32
|
+
try {
|
|
33
|
+
return JSON.parse(raw)
|
|
34
|
+
}
|
|
35
|
+
catch (err) {
|
|
36
|
+
// 损坏现场保留:改名留档,绝不用空库静默顶替用户数据
|
|
37
|
+
const stamp = new Date().toISOString().replace(/[:.]/g, '-')
|
|
38
|
+
const backupPath = `${filePath}.corrupt-${stamp}`
|
|
39
|
+
try {
|
|
40
|
+
renameSync(filePath, backupPath)
|
|
41
|
+
console.error(`[json-store] ⚠ ${filePath} 解析失败(${err.message}),坏文件已保留为 ${backupPath},本次以空数据启动`)
|
|
42
|
+
}
|
|
43
|
+
catch {
|
|
44
|
+
console.error(`[json-store] ⚠ ${filePath} 解析失败(${err.message}),且保留坏文件失败,本次以空数据启动`)
|
|
45
|
+
}
|
|
46
|
+
return fallback
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* 原子落盘:写临时文件 → rename 替换;失败退回直写。
|
|
52
|
+
* @param {string} filePath
|
|
53
|
+
* @param {unknown} data
|
|
54
|
+
*/
|
|
55
|
+
export function saveJsonFileAtomic(filePath, data) {
|
|
56
|
+
mkdirSync(dirname(filePath), { recursive: true })
|
|
57
|
+
const tmp = `${filePath}.tmp-${process.pid}`
|
|
58
|
+
try {
|
|
59
|
+
writeFileSync(tmp, JSON.stringify(data, null, 2), 'utf-8')
|
|
60
|
+
try {
|
|
61
|
+
renameSync(tmp, filePath)
|
|
62
|
+
return
|
|
63
|
+
}
|
|
64
|
+
catch {
|
|
65
|
+
// rename 失败(目标被占用等):退回直写,可用性优先
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
catch (tmpErr) {
|
|
69
|
+
console.error(`[json-store] 临时文件写入失败(${tmpErr.message}),退回直写`)
|
|
70
|
+
}
|
|
71
|
+
writeFileSync(filePath, JSON.stringify(data, null, 2), 'utf-8')
|
|
72
|
+
}
|
|
@@ -169,7 +169,8 @@ async function loadAllPlugins(host, { config, paths }) {
|
|
|
169
169
|
for (const { dir, scope } of entries) {
|
|
170
170
|
const entry = join(dir, 'index.mjs')
|
|
171
171
|
try {
|
|
172
|
-
|
|
172
|
+
// cache-busting:热重载时 ESM 按 URL 缓存,不带 query 永远拿到旧模块(插件改代码不生效)
|
|
173
|
+
const mod = await import(`${pathToUrl(entry)}?t=${Date.now()}`)
|
|
173
174
|
const check = validatePluginModule(mod, entry)
|
|
174
175
|
if (!check.ok) throw new Error(check.error)
|
|
175
176
|
const def = check.def
|
|
@@ -406,6 +406,28 @@ export class AgentRuntime {
|
|
|
406
406
|
}
|
|
407
407
|
}
|
|
408
408
|
|
|
409
|
+
/**
|
|
410
|
+
* harness 无关工具直调面(REST agent-tools / stdio MCP 桥回程)。
|
|
411
|
+
* impl 未实现(老引擎/进程内 mock)返回 null,调用方回退协作工具族。
|
|
412
|
+
*/
|
|
413
|
+
async dispatchHostTool(toolName: string, args: Record<string, unknown>): Promise<{ text: string, isError?: boolean } | null> {
|
|
414
|
+
if (!this.impl.dispatchHostTool) return null
|
|
415
|
+
return await this.impl.dispatchHostTool(toolName, args)
|
|
416
|
+
}
|
|
417
|
+
|
|
418
|
+
/** HITL 应答传导:impl 未实现返回 false(上层据此 409);异常上抛由 HTTP 层收口 */
|
|
419
|
+
async respondHitl(kind: string, id: string, outcome: {
|
|
420
|
+
confirmed?: boolean
|
|
421
|
+
cancelled?: boolean
|
|
422
|
+
value?: string
|
|
423
|
+
response?: string
|
|
424
|
+
comment?: string
|
|
425
|
+
}): Promise<boolean> {
|
|
426
|
+
if (!this.impl.respondHitl) return false
|
|
427
|
+
await this.impl.respondHitl(kind, id, outcome)
|
|
428
|
+
return true
|
|
429
|
+
}
|
|
430
|
+
|
|
409
431
|
/** 暴露 TaskEngine(供 SchedulerLoop 收集快照与执行调度决策) */
|
|
410
432
|
get taskEngine(): TaskEngine {
|
|
411
433
|
return this.deps.taskEngine
|
|
@@ -571,6 +593,28 @@ export class AgentRuntime {
|
|
|
571
593
|
sawRunError = true
|
|
572
594
|
log.error(`[AgentRuntime:${this.agentId}] 回合异常:`, err)
|
|
573
595
|
}
|
|
596
|
+
// 人类 requireReply 的平台兜底回执:实测部分引擎/模型不遵从 send_message_to_agent
|
|
597
|
+
// (回合只产 artifact 文本),请求方将收不到任何应答。平台把回合聚合文本代投回
|
|
598
|
+
// 时间线(in_reply_to 关联 + x-aw-relayed 标记),保证"要求回复"必有确定应答;
|
|
599
|
+
// 模型已自行回执时时间线会出现两条,属可接受的冗余(宁多勿丢)。
|
|
600
|
+
if (msg.metadata?.['x-aw-require-reply'] === 'true'
|
|
601
|
+
&& typeof msg.metadata?.['x-aw-from-label'] === 'string'
|
|
602
|
+
&& replyText.trim()) {
|
|
603
|
+
this.emitExternal({
|
|
604
|
+
kind: 'message',
|
|
605
|
+
message: {
|
|
606
|
+
messageId: randomUUID(),
|
|
607
|
+
contextId: this.channelId,
|
|
608
|
+
role: 'ROLE_AGENT',
|
|
609
|
+
parts: [{ text: replyText }],
|
|
610
|
+
metadata: {
|
|
611
|
+
'x-aw-in-reply-to': msg.messageId,
|
|
612
|
+
'x-aw-to-label': String(msg.metadata['x-aw-from-label']),
|
|
613
|
+
'x-aw-relayed': 'true',
|
|
614
|
+
},
|
|
615
|
+
},
|
|
616
|
+
})
|
|
617
|
+
}
|
|
574
618
|
// 交付兜底(harness 回合结束 ≠ 任务完成):
|
|
575
619
|
// - 回合产出过实质 artifact(LLM 完成了工作但跳过 complete_task 工具)→ 隐式完成,
|
|
576
620
|
// 交付物即回合规避的输出,平台代为收口(进度 100)。
|