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
|
@@ -1,153 +1,156 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Workshop 启动插件(设计文档 §8)。
|
|
3
|
-
* Nitro 启动时:创建 data/ 目录 → openWorkshopDb(data/workshop.sqlite)→ 装配 5 个 repo
|
|
4
|
-
* + createAgentImpl 工厂 → createAgentChannelManager → restore() 恢复运行时
|
|
5
|
-
* → 为有 lead 的 channel 启动 SchedulerLoop → 挂 globalThis.__workshopManager。
|
|
6
|
-
*
|
|
7
|
-
* 导出:
|
|
8
|
-
* - getWorkshopManager():读取进程级 manager 单例(先检查已设置;未初始化抛 503)
|
|
9
|
-
* - ensureLeadSchedulerLoop():为 channel 装配并启动 lead 的 SchedulerLoop(幂等)
|
|
10
|
-
*
|
|
11
|
-
* 注意:不静态 import 'nitropack/runtime/plugin'——defineNitroPlugin 是恒等函数,
|
|
12
|
-
* 插件 default 直接导出普通函数即可,避免把 nitropack 依赖引入可被 tsx 直跑测试
|
|
13
|
-
* 导入的模块图(顶层 node_modules 无 nitropack 符号链接)。
|
|
14
|
-
*/
|
|
15
|
-
import { mkdirSync } from 'node:fs'
|
|
16
|
-
import { resolve } from 'node:path'
|
|
17
|
-
import { ensureDataDir } from '@/shared/config/home.mjs'
|
|
18
|
-
import { openWorkshopDb, initWorkshopDb } from '../services/workshop/db/database'
|
|
19
|
-
import {
|
|
20
|
-
import {
|
|
21
|
-
import {
|
|
22
|
-
import {
|
|
23
|
-
import {
|
|
24
|
-
import {
|
|
25
|
-
import {
|
|
26
|
-
import {
|
|
27
|
-
import {
|
|
28
|
-
import {
|
|
29
|
-
import {
|
|
30
|
-
import {
|
|
31
|
-
import {
|
|
32
|
-
import {
|
|
33
|
-
import {
|
|
34
|
-
import {
|
|
35
|
-
import {
|
|
36
|
-
import {
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
type
|
|
40
|
-
type
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
import {
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
*
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
*
|
|
74
|
-
*
|
|
75
|
-
*
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
//
|
|
82
|
-
//
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
//
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
//
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
const
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
//
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
//
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
//
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
1
|
+
/**
|
|
2
|
+
* Workshop 启动插件(设计文档 §8)。
|
|
3
|
+
* Nitro 启动时:创建 data/ 目录 → openWorkshopDb(data/workshop.sqlite)→ 装配 5 个 repo
|
|
4
|
+
* + createAgentImpl 工厂 → createAgentChannelManager → restore() 恢复运行时
|
|
5
|
+
* → 为有 lead 的 channel 启动 SchedulerLoop → 挂 globalThis.__workshopManager。
|
|
6
|
+
*
|
|
7
|
+
* 导出:
|
|
8
|
+
* - getWorkshopManager():读取进程级 manager 单例(先检查已设置;未初始化抛 503)
|
|
9
|
+
* - ensureLeadSchedulerLoop():为 channel 装配并启动 lead 的 SchedulerLoop(幂等)
|
|
10
|
+
*
|
|
11
|
+
* 注意:不静态 import 'nitropack/runtime/plugin'——defineNitroPlugin 是恒等函数,
|
|
12
|
+
* 插件 default 直接导出普通函数即可,避免把 nitropack 依赖引入可被 tsx 直跑测试
|
|
13
|
+
* 导入的模块图(顶层 node_modules 无 nitropack 符号链接)。
|
|
14
|
+
*/
|
|
15
|
+
import { mkdirSync } from 'node:fs'
|
|
16
|
+
import { resolve } from 'node:path'
|
|
17
|
+
import { ensureDataDir } from '@/shared/config/home.mjs'
|
|
18
|
+
import { openWorkshopDb, initWorkshopDb } from '../services/workshop/db/database'
|
|
19
|
+
import { backupRegistry } from '../services/workshop/db/backup-registry'
|
|
20
|
+
import { createChannelRepo } from '../services/workshop/db/channel.repo'
|
|
21
|
+
import { createAgentRepo } from '../services/workshop/db/agent.repo'
|
|
22
|
+
import { createChannelAgentRepo } from '../services/workshop/db/channel-agent.repo'
|
|
23
|
+
import { createTeamRepo } from '../services/workshop/db/team.repo'
|
|
24
|
+
import { createTeamMemberRepo } from '../services/workshop/db/team-member.repo'
|
|
25
|
+
import { createChannelTemplateRepo } from '../services/workshop/db/channel-template.repo'
|
|
26
|
+
import { createTaskRepo } from '../services/workshop/db/task.repo'
|
|
27
|
+
import { createMessageRepo } from '../services/workshop/db/message.repo'
|
|
28
|
+
import { createSubscriptionRepo } from '../services/workshop/db/subscription.repo'
|
|
29
|
+
import { createMemoryRepo } from '../services/workshop/db/memory.repo'
|
|
30
|
+
import { createUserRepo } from '../services/workshop/db/user.repo'
|
|
31
|
+
import { createChannelEventRepo } from '../services/workshop/db/channel-event.repo'
|
|
32
|
+
import { createApprovalHistoryRepo, createAlarmEventRepo, createAuditRepo, createApprovalRequestRepo } from '../services/workshop/db/ops.repo'
|
|
33
|
+
import { bindOpsRepos } from '../services/workshop/ops/ops'
|
|
34
|
+
import { configureHitlResolver } from '../services/workshop/agents/hitl-registry'
|
|
35
|
+
import { ensureAllEventRecorders } from '../api/workshop/ws'
|
|
36
|
+
import { createAgentImpl } from '../services/workshop/agents/factory'
|
|
37
|
+
import {
|
|
38
|
+
createAgentChannelManager,
|
|
39
|
+
type AgentChannelManager,
|
|
40
|
+
type AllRepos,
|
|
41
|
+
type ManagerDeps,
|
|
42
|
+
} from '../services/workshop/runtime/manager'
|
|
43
|
+
import { AppError } from '../utils/errors'
|
|
44
|
+
import { workshopSettings } from '../services/workshop/settings'
|
|
45
|
+
|
|
46
|
+
declare global {
|
|
47
|
+
|
|
48
|
+
var __workshopManager: AgentChannelManager | undefined
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/** 读取进程级 manager 单例(先检查已设置;未初始化抛 503) */
|
|
52
|
+
export function getWorkshopManager(): AgentChannelManager {
|
|
53
|
+
const manager = globalThis.__workshopManager
|
|
54
|
+
if (!manager) {
|
|
55
|
+
throw new AppError(503, 'WORKSHOP_NOT_READY', 'workshop 尚未初始化(plugin 未执行)')
|
|
56
|
+
}
|
|
57
|
+
return manager
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* 为 channel 装配并启动 lead 的 SchedulerLoop(幂等)。
|
|
62
|
+
* 委托 manager.ensureChannelActive(懒加载:装配 lead + 调度循环)。
|
|
63
|
+
*/
|
|
64
|
+
export function ensureLeadSchedulerLoop(
|
|
65
|
+
manager: AgentChannelManager,
|
|
66
|
+
channelId: string,
|
|
67
|
+
options?: { tickMs?: number, stallMs?: number },
|
|
68
|
+
): void {
|
|
69
|
+
manager.ensureChannelActive(channelId, options)
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* Nitro 启动插件(默认导出普通函数;defineNitroPlugin 为恒等包装)。
|
|
74
|
+
* 注意:runNitroPlugins 同步调用 plugin,不 await 返回值;manager.restore() 方法体全同步
|
|
75
|
+
* (无 await 语句),直接调用即同步完成恢复,故此处不 await。
|
|
76
|
+
* 幂等:globalThis.__workshopManager 已设置(如测试预置)则跳过初始化。
|
|
77
|
+
*/
|
|
78
|
+
export default function workshopPlugin(nitroApp: {
|
|
79
|
+
hooks: { hook(name: string, fn: (...args: unknown[]) => void | Promise<void>): void }
|
|
80
|
+
}): void {
|
|
81
|
+
// 进程级未处理拒绝兜底(Node ≥23 默认对 unhandledRejection 抛错可击穿整个服务)。
|
|
82
|
+
// 环境型连接复位(休眠/断网后陈旧 socket read ECONNRESET、omp 子进程管道抖动等)
|
|
83
|
+
// 不应让服务崩溃;记录上下文后继续运行(正常业务错误仍走各自显式处理路径)。
|
|
84
|
+
process.on('unhandledRejection', (reason) => {
|
|
85
|
+
console.error('[workshop] 未处理 Promise rejection(已兜底,不影响服务):', reason)
|
|
86
|
+
})
|
|
87
|
+
|
|
88
|
+
// 先检查已设置:避免重复装配覆盖既有单例
|
|
89
|
+
if (globalThis.__workshopManager) return
|
|
90
|
+
|
|
91
|
+
// 数据目录经配置根解析(repo: <repo>/.AgentWorkShop/data;home: ~/.AgentWorkShop/data;
|
|
92
|
+
// ensureDataDir 自动迁移旧 cwd/data 位置,目录不存在则创建)
|
|
93
|
+
const dataDir = ensureDataDir()
|
|
94
|
+
mkdirSync(dataDir, { recursive: true })
|
|
95
|
+
|
|
96
|
+
// 打开(或创建)数据库 → 初始化(建表 + PRAGMA;openWorkshopDb 已内置,显式再调一次保持幂等)
|
|
97
|
+
const db = openWorkshopDb(resolve(dataDir, 'workshop.sqlite'))
|
|
98
|
+
initWorkshopDb(db)
|
|
99
|
+
// 登记主连接(备份插件 serialize 跑在主连接上,杜绝第二连接失效语句的事故)
|
|
100
|
+
backupRegistry.register(resolve(dataDir, 'workshop.sqlite'), db)
|
|
101
|
+
|
|
102
|
+
// 装配 repos + Agent impl 工厂
|
|
103
|
+
const repos: AllRepos = {
|
|
104
|
+
users: createUserRepo(db),
|
|
105
|
+
channelEvents: createChannelEventRepo(db),
|
|
106
|
+
channels: createChannelRepo(db),
|
|
107
|
+
agents: createAgentRepo(db),
|
|
108
|
+
teams: createTeamRepo(db),
|
|
109
|
+
teamMembers: createTeamMemberRepo(db),
|
|
110
|
+
channelTemplates: createChannelTemplateRepo(db),
|
|
111
|
+
channelAgents: createChannelAgentRepo(db),
|
|
112
|
+
messages: createMessageRepo(db),
|
|
113
|
+
subscriptions: createSubscriptionRepo(db),
|
|
114
|
+
tasks: createTaskRepo(db),
|
|
115
|
+
memories: createMemoryRepo(db),
|
|
116
|
+
}
|
|
117
|
+
// S4/S5/R1/R3:合规三表仓储接线(审批历史/报警事件/审计日志/高危复核)
|
|
118
|
+
bindOpsRepos({
|
|
119
|
+
approvalHistory: createApprovalHistoryRepo(db),
|
|
120
|
+
alarmEvents: createAlarmEventRepo(db),
|
|
121
|
+
audit: createAuditRepo(db),
|
|
122
|
+
approvalRequests: createApprovalRequestRepo(db),
|
|
123
|
+
})
|
|
124
|
+
const deps: ManagerDeps = { repos, implFactory: createAgentImpl, db }
|
|
125
|
+
|
|
126
|
+
// 创建 manager → 挂全局单例(后续 REST/A2A/WS 经 getWorkshopManager() 读取)
|
|
127
|
+
const manager = createAgentChannelManager(deps)
|
|
128
|
+
globalThis.__workshopManager = manager
|
|
129
|
+
|
|
130
|
+
// HITL 全局待办:agentId → channelId/agentName 解析器(避免 registry 反向依赖 manager)
|
|
131
|
+
configureHitlResolver((agentId) => {
|
|
132
|
+
const row = repos.channelAgents.findById(agentId)
|
|
133
|
+
return row ? { channelId: row.channelId, agentName: row.name } : null
|
|
134
|
+
})
|
|
135
|
+
|
|
136
|
+
// 懒加载恢复:仅激活有待办任务的 channel(装配 lead + 调度循环);其余纯持久化
|
|
137
|
+
manager.restore()
|
|
138
|
+
|
|
139
|
+
// 全时事件录制:为全部存量 channel 建立常驻流(事件 server 驱动落库,与 client 无关)
|
|
140
|
+
void ensureAllEventRecorders(manager).catch(err => console.error('[workshop] 事件录制器初始化失败:', err))
|
|
141
|
+
|
|
142
|
+
// idle sweeper:空闲 agent 超时自动卸载(释放 omp 子进程与内存)。
|
|
143
|
+
// busy 成员有三重守卫(state!==idle / 信箱 pending / lead 活跃任务)不会被卸载,
|
|
144
|
+
// "作业期间进程不断开"由守卫保证;空闲宽限可经 workshop.idle_grace_ms 调整 ——
|
|
145
|
+
// 需要进程更长常驻(免冷启动 30~90s)时调大(env WORKSHOP_IDLE_GRACE_MS 兼容)。
|
|
146
|
+
const idleSweepMs = workshopSettings().idle_sweep_ms
|
|
147
|
+
const idleGraceMs = workshopSettings().idle_grace_ms
|
|
148
|
+
const stopSweeper = manager.startIdleSweeper({ intervalMs: idleSweepMs, graceMs: idleGraceMs })
|
|
149
|
+
|
|
150
|
+
// 关机:完整关闭 manager(sweeper + 调度循环 + agent 运行时),关闭数据库
|
|
151
|
+
nitroApp.hooks.hook('close', async () => {
|
|
152
|
+
stopSweeper()
|
|
153
|
+
await manager.shutdown()
|
|
154
|
+
db.close()
|
|
155
|
+
})
|
|
156
|
+
}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { existsSync } from 'node:fs'
|
|
2
|
+
import { backupRegistry } from '../services/workshop/db/backup-registry'
|
|
2
3
|
import { join, resolve } from 'node:path'
|
|
3
4
|
import { randomBytes, randomUUID, scryptSync, createHash, timingSafeEqual } from 'node:crypto'
|
|
4
5
|
import { DatabaseSync } from 'node:sqlite'
|
|
@@ -41,25 +42,19 @@ CREATE TABLE IF NOT EXISTS user_tokens (
|
|
|
41
42
|
CREATE INDEX IF NOT EXISTS idx_user_tokens_user ON user_tokens(user_id);
|
|
42
43
|
`
|
|
43
44
|
|
|
44
|
-
/** 种子用户(首次建库时写入;默认密码 Awshop@123,便于开箱登录) */
|
|
45
|
-
const SEED_USERS = [
|
|
46
|
-
{ name: '张伟', email: 'zhangwei@awshop.io', role: 'admin', status: 'active' },
|
|
47
|
-
{ name: '王芳', email: 'wangfang@awshop.io', role: 'editor', status: 'active' },
|
|
48
|
-
{ name: '李娜', email: 'lina@awshop.io', role: 'user', status: 'disabled' },
|
|
49
|
-
{ name: '刘洋', email: 'liuyang@awshop.io', role: 'editor', status: 'active' },
|
|
50
|
-
{ name: '陈静', email: 'chenjing@awshop.io', role: 'user', status: 'active' },
|
|
51
|
-
{ name: 'Michael Chen', email: 'michael@awshop.io', role: 'user', status: 'active' },
|
|
52
|
-
]
|
|
53
|
-
|
|
54
45
|
let db: DatabaseSync | null = null
|
|
55
46
|
|
|
56
47
|
function getDb(): DatabaseSync {
|
|
57
48
|
if (!db) {
|
|
58
49
|
// 目录由 ensureDataDir 内部创建(含旧位置迁移)
|
|
59
50
|
db = new DatabaseSync(DB_PATH)
|
|
51
|
+
// 主连接登记(备份 serialize 用;见 backup-registry 说明)
|
|
52
|
+
backupRegistry.register(DB_PATH, db)
|
|
53
|
+
db.exec('PRAGMA busy_timeout = 5000')
|
|
60
54
|
db.exec(SCHEMA_SQL)
|
|
61
55
|
migrateSchema(db)
|
|
62
|
-
|
|
56
|
+
// 首启零用户:不播种任何账号,由使用者在登录页注册第一个账号(自动成为管理员,
|
|
57
|
+
// 见 user.service.register 的初始化判定)
|
|
63
58
|
importLegacyWorkshopUsers(db)
|
|
64
59
|
}
|
|
65
60
|
return db
|
|
@@ -91,17 +86,6 @@ function maskPreview(raw: string): string {
|
|
|
91
86
|
return `${raw.slice(0, 6)}${'•'.repeat(8)}${raw.slice(-4)}`
|
|
92
87
|
}
|
|
93
88
|
|
|
94
|
-
/** 首次建库写入种子用户(幂等:users 非空即跳过) */
|
|
95
|
-
function seedIfEmpty(): void {
|
|
96
|
-
const d = db!
|
|
97
|
-
const { n } = d.prepare('SELECT COUNT(*) AS n FROM users').get() as { n: number }
|
|
98
|
-
if (n > 0) return
|
|
99
|
-
const insert = d.prepare('INSERT INTO users (id, name, email, password_hash, role, status, created_at) VALUES (?, ?, ?, ?, ?, ?, ?)')
|
|
100
|
-
const hash = hashPassword('Awshop@123')
|
|
101
|
-
for (const u of SEED_USERS) {
|
|
102
|
-
insert.run(randomUUID(), u.name, u.email, hash, u.role, u.status, now())
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
89
|
/**
|
|
106
90
|
* 一次性迁移:旧 workshop 本地用户(data/workshop.sqlite 的 users 表)导入全局用户系统。
|
|
107
91
|
* - 保留原 id/name(资源归属 owner_user_id 不变,历史数据不丢)
|
|
@@ -215,6 +199,8 @@ WHERE t.token_hash = ?`,
|
|
|
215
199
|
if (!row) return null
|
|
216
200
|
// R2:过期单点判定(resolveUser/resolveAgentOrUser/me 全部经此收敛)
|
|
217
201
|
if (row.expiresAt && Date.parse(row.expiresAt) < Date.now()) return null
|
|
202
|
+
// 禁用账号即时失效(此前存量 token 在禁用后最长 30 天仍可用)
|
|
203
|
+
if (row.status && row.status !== 'active') return null
|
|
218
204
|
d.prepare('UPDATE user_tokens SET last_used_at = ? WHERE token_hash = ?').run(now(), hash)
|
|
219
205
|
return row
|
|
220
206
|
}
|
|
@@ -265,6 +251,13 @@ export const userRepository = {
|
|
|
265
251
|
return row ? toUser(row) : undefined
|
|
266
252
|
},
|
|
267
253
|
|
|
254
|
+
/** 是否存在活跃管理员(初始化判定:false → 系统处于首启注册模式,首个注册账号将成为管理员) */
|
|
255
|
+
hasActiveAdmin(): boolean {
|
|
256
|
+
const d = getDb()
|
|
257
|
+
const { n } = d.prepare("SELECT COUNT(*) AS n FROM users WHERE role = 'admin' AND status = 'active'").get() as { n: number }
|
|
258
|
+
return n > 0
|
|
259
|
+
},
|
|
260
|
+
|
|
268
261
|
/** 内部:取密码哈希(仅认证路径使用,不参与领域对象外泄) */
|
|
269
262
|
getPasswordHash(email: string): { id: string, hash: string } | null {
|
|
270
263
|
const d = getDb()
|
|
@@ -14,9 +14,10 @@
|
|
|
14
14
|
* 使用:server/plugins/system-config.ts 在 Nitro 启动时 init();
|
|
15
15
|
* 业务经 getSystemConfigService() 读取(不存在则惰性初始化,幂等)。
|
|
16
16
|
*/
|
|
17
|
-
import { watch, existsSync } from 'node:fs'
|
|
18
|
-
import { join } from 'node:path'
|
|
17
|
+
import { watch, existsSync, mkdirSync, copyFileSync } from 'node:fs'
|
|
18
|
+
import { join, dirname } from 'node:path'
|
|
19
19
|
import { useRuntimeConfig } from '#imports'
|
|
20
|
+
import { resolveRunMode } from '@/shared/config/home.mjs'
|
|
20
21
|
import { AppError } from '../utils/errors'
|
|
21
22
|
import {
|
|
22
23
|
loadDescriptors,
|
|
@@ -82,7 +83,8 @@ declare global {
|
|
|
82
83
|
|
|
83
84
|
export class SystemConfigService {
|
|
84
85
|
private descriptors: SettingsDescriptor[] = []
|
|
85
|
-
|
|
86
|
+
/** key → 描述符(loadDescriptorMap 返回普通对象,非 Map;下标访问) */
|
|
87
|
+
private map: Record<string, SettingsDescriptor> = {}
|
|
86
88
|
private overrides: Record<string, unknown> = {}
|
|
87
89
|
private envOverrides: Record<string, unknown> = {}
|
|
88
90
|
private effective: Record<string, unknown> = {}
|
|
@@ -97,7 +99,29 @@ export class SystemConfigService {
|
|
|
97
99
|
|
|
98
100
|
constructor(readonly root: string) {
|
|
99
101
|
this.configPath = join(root, 'config.yml')
|
|
100
|
-
|
|
102
|
+
// 设置文件必须与 CLI(aw config set)/start/dev-guard 同源(resolveRunMode 单一入口):
|
|
103
|
+
// 原先写死 <cwd>/data/runtime-settings.json 造成"API 写 A、子系统读 B"的脑裂 —— 备份
|
|
104
|
+
// 周期/保留期/DAQ 覆盖等运行时设置对服务端静默无效。
|
|
105
|
+
const rm = resolveRunMode({ cwd: root, packageRoot: process.env.AW_PACKAGE_ROOT, env: process.env })
|
|
106
|
+
this.configPath = rm.configPath ?? this.configPath
|
|
107
|
+
this.settingsPath = rm.settingsPath ?? this.settingsPath
|
|
108
|
+
// 一次性收敛:遗留 <cwd>/data/runtime-settings.json 且目标不存在 → 迁移;两者并存 → 告警遗留被忽略
|
|
109
|
+
try {
|
|
110
|
+
const legacy = join(root, 'data', 'runtime-settings.json')
|
|
111
|
+
if (existsSync(legacy) && legacy !== this.settingsPath) {
|
|
112
|
+
if (!existsSync(this.settingsPath)) {
|
|
113
|
+
mkdirSync(dirname(this.settingsPath), { recursive: true })
|
|
114
|
+
copyFileSync(legacy, this.settingsPath)
|
|
115
|
+
console.log(`[system-config] 遗留设置已迁移: ${legacy} -> ${this.settingsPath}`)
|
|
116
|
+
}
|
|
117
|
+
else {
|
|
118
|
+
console.warn(`[system-config] 检测到遗留设置文件 ${legacy}(现以 ${this.settingsPath} 为准,该文件被忽略)`)
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
catch (err) {
|
|
123
|
+
console.warn('[system-config] 遗留设置迁移失败(不阻断启动):', String(err?.message ?? err))
|
|
124
|
+
}
|
|
101
125
|
}
|
|
102
126
|
|
|
103
127
|
/** Nitro 启动时调用:加载覆盖 → 应用到 runtimeConfig → 挂文件监听 */
|
|
@@ -183,7 +207,7 @@ export class SystemConfigService {
|
|
|
183
207
|
const validated: Record<string, unknown> = {}
|
|
184
208
|
const changed: string[] = []
|
|
185
209
|
for (const [key, value] of Object.entries(raw)) {
|
|
186
|
-
const desc = this.map
|
|
210
|
+
const desc = this.map[key]
|
|
187
211
|
if (!desc) continue // 未知键:忽略(schema 演进容错)
|
|
188
212
|
const errs = validateValue(desc, value)
|
|
189
213
|
if (errs.length) {
|
|
@@ -198,6 +222,8 @@ export class SystemConfigService {
|
|
|
198
222
|
}
|
|
199
223
|
this.overrides = validated
|
|
200
224
|
this.recompute()
|
|
225
|
+
// 运行语义设置读取层(settings.ts effective 3s TTL)即时失效:live 键热重载零延迟
|
|
226
|
+
void import('./workshop/settings').then(m => m.invalidateRuntimeSettingsCache()).catch(() => {})
|
|
201
227
|
return { changed }
|
|
202
228
|
}
|
|
203
229
|
|
|
@@ -249,7 +275,7 @@ export class SystemConfigService {
|
|
|
249
275
|
const next = { ...this.overrides }
|
|
250
276
|
const changed: string[] = []
|
|
251
277
|
for (const [key, rawValue] of Object.entries(patch)) {
|
|
252
|
-
const desc = this.map
|
|
278
|
+
const desc = this.map[key]
|
|
253
279
|
if (!desc) {
|
|
254
280
|
errors[key] = ['未知设置项(不在 shared/config/schema.json 中)']
|
|
255
281
|
continue
|
|
@@ -83,7 +83,8 @@ export const userService = {
|
|
|
83
83
|
|
|
84
84
|
// ===== 认证(公开端点)=====
|
|
85
85
|
|
|
86
|
-
/** 注册:创建账号 + 签发首个 token(邮箱/用户名占用 → 409
|
|
86
|
+
/** 注册:创建账号 + 签发首个 token(邮箱/用户名占用 → 409)。
|
|
87
|
+
* 首启初始化:系统尚无活跃管理员时,首个注册账号授予 admin(空库自注册建站) */
|
|
87
88
|
register(input: UserRegister): AuthResult {
|
|
88
89
|
if (userRepository.findByEmail(input.email)) {
|
|
89
90
|
throw new AppError(409, ErrorCodes.CONFLICT, '邮箱已被注册')
|
|
@@ -91,8 +92,12 @@ export const userService = {
|
|
|
91
92
|
if (userRepository.findByName(input.name)) {
|
|
92
93
|
throw new AppError(409, 'USER_EXISTS', `用户名已存在: ${input.name}`)
|
|
93
94
|
}
|
|
94
|
-
const
|
|
95
|
-
|
|
95
|
+
const needsBootstrap = !userRepository.hasActiveAdmin()
|
|
96
|
+
if (needsBootstrap) {
|
|
97
|
+
console.log(`[users] 初始化:尚无管理员账号,首个注册账号授予管理员角色(${input.email})`)
|
|
98
|
+
}
|
|
99
|
+
const user = userRepository.create({ ...input, role: needsBootstrap ? 'admin' : 'user', status: 'active' })
|
|
100
|
+
const { raw } = userRepository.createToken(user.id, needsBootstrap ? 'bootstrap-admin' : 'default')
|
|
96
101
|
return { user: this.publicProfile(user), token: raw }
|
|
97
102
|
},
|
|
98
103
|
|
package/server/services/workshop/.mimosa/hook-state/sess_fed429fb-c8b7-4a50-bbd6-45afc580893f.json
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"touched":[],"bashMutation":true,"reportedFindings":[],"findingEvents":[],"baseline":null,"stateErrors":[],"omittedReportedFindings":0,"omittedFindingEvents":0,"processing":null,"updatedAt":"2026-09-04T17:27:52.487Z"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schemaVersion": "mimosa-hook-status/v1",
|
|
3
|
+
"recordedAt": "2026-09-04T17:28:09.989Z",
|
|
4
|
+
"sessionId": "sess_fed429fb-c8b7-4a50-bbd6-45afc580893f",
|
|
5
|
+
"event": "PostToolUse",
|
|
6
|
+
"toolName": "Write",
|
|
7
|
+
"file": "D:\\codes\\ABO\\AgentWorkShop\\.omc\\plans\\codemod-fix-helper.cjs",
|
|
8
|
+
"outcome": "clear",
|
|
9
|
+
"coverage": "complete",
|
|
10
|
+
"findingCount": 0,
|
|
11
|
+
"durationMs": 4,
|
|
12
|
+
"hostState": "hook_complete",
|
|
13
|
+
"reportHint": ".mimosa/reports/"
|
|
14
|
+
}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 受控子进程拉起工具(harness 适配器共用)。
|
|
3
|
+
*
|
|
4
|
+
* 安全约束:
|
|
5
|
+
* - 永不走 shell —— 除一种 Windows 特例:.cmd/.bat shim(如 npm 全局安装的
|
|
6
|
+
* codex.cmd)不能被 CreateProcess 直接执行,须经固定的 'cmd.exe' /d /s /c
|
|
7
|
+
* 包装;此时逐参数做严格校验(拒绝引号与控制字符)并全量引号包裹,参数面
|
|
8
|
+
* 仍是结构化且无元字符的,不存在可注入的自由文本。
|
|
9
|
+
* - 包装器是字面量 'cmd.exe',不由环境变量或请求决定;
|
|
10
|
+
* - 命令先经 assertPlainExecutable(拒绝 shell 元字符)与 PATH 解析
|
|
11
|
+
* (必须解析为磁盘上真实存在的文件)才可拉起。
|
|
12
|
+
*/
|
|
13
|
+
import { spawn as launchChildProcess, type ChildProcess } from 'node:child_process'
|
|
14
|
+
import { existsSync, statSync } from 'node:fs'
|
|
15
|
+
import { join } from 'node:path'
|
|
16
|
+
|
|
17
|
+
const SHELL_META = /[\r\n;&|`<>$]/
|
|
18
|
+
|
|
19
|
+
/** 拒绝 shell 元字符(命令只能是纯可执行路径) */
|
|
20
|
+
export function assertPlainExecutable(command: string): string {
|
|
21
|
+
if (!command || SHELL_META.test(command)) {
|
|
22
|
+
throw new Error(`非法 harness 命令(含 shell 元字符或为空): ${JSON.stringify(command.slice(0, 80))}`)
|
|
23
|
+
}
|
|
24
|
+
return command
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/** PATH + PATHEXT 解析裸命令名 → 绝对路径(win32;非 Windows 返回 null)。带扩展名优先,裸名(sh 脚本)最后 */
|
|
28
|
+
function resolveOnPath(command: string): string | null {
|
|
29
|
+
if (process.platform !== 'win32') return null
|
|
30
|
+
const isFile = (p: string): boolean => {
|
|
31
|
+
try {
|
|
32
|
+
return existsSync(p) && statSync(p).isFile()
|
|
33
|
+
}
|
|
34
|
+
catch {
|
|
35
|
+
return false
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
const hasDir = command.includes('/') || command.includes('\\') || /^[A-Za-z]:/.test(command)
|
|
39
|
+
const exts = (process.env.PATHEXT?.split(';').filter(Boolean) ?? ['.EXE', '.CMD', '.BAT', '.COM']).map(e => e.toLowerCase())
|
|
40
|
+
const bases = hasDir
|
|
41
|
+
? [command]
|
|
42
|
+
: (process.env.PATH ?? '').split(';').filter(Boolean).map(dir => join(dir, command))
|
|
43
|
+
// PATHEXT 顺序(.exe → .cmd → …)优先;裸名兜底(npm sh 脚本,win 上不可执行,仅最后回退)
|
|
44
|
+
for (const base of bases) {
|
|
45
|
+
for (const ext of exts) {
|
|
46
|
+
const full = base + ext
|
|
47
|
+
if (isFile(full)) return full
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
for (const base of bases) {
|
|
51
|
+
if (isFile(base)) return base
|
|
52
|
+
}
|
|
53
|
+
return null
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* 命令解析:裸名经 PATH 解析,返回磁盘上的绝对路径;.cmd/.bat 标记 needsCmd。
|
|
58
|
+
*/
|
|
59
|
+
function resolveExecutable(command: string): { file: string, needsCmd: boolean } {
|
|
60
|
+
assertPlainExecutable(command)
|
|
61
|
+
const file = resolveOnPath(command) ?? command
|
|
62
|
+
if (process.platform === 'win32') {
|
|
63
|
+
const lower = file.toLowerCase()
|
|
64
|
+
if (lower.endsWith('.cmd') || lower.endsWith('.bat')) return { file, needsCmd: true }
|
|
65
|
+
}
|
|
66
|
+
return { file, needsCmd: false }
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
export interface LineSpawnOptions {
|
|
70
|
+
cwd?: string
|
|
71
|
+
env?: Record<string, string>
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/** .cmd 包装时的逐参数校验(引号/控制字符会改变 cmd 解析,拒绝) */
|
|
75
|
+
function assertCmdSafeArg(arg: string): string {
|
|
76
|
+
if (/["\r\n\0]/.test(arg)) {
|
|
77
|
+
throw new Error(`参数含引号/控制字符,拒绝经 cmd 包装执行: ${JSON.stringify(arg.slice(0, 80))}`)
|
|
78
|
+
}
|
|
79
|
+
return arg
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/** 拉起逐行 stdio 子进程(命令已经 resolveExecutable 校验) */
|
|
83
|
+
export function spawnLineProcess(command: string, args: string[], options: LineSpawnOptions = {}): ChildProcess {
|
|
84
|
+
const { file, needsCmd } = resolveExecutable(command)
|
|
85
|
+
const env = { ...process.env, ...options.env }
|
|
86
|
+
if (needsCmd) {
|
|
87
|
+
// Windows .cmd shim:固定包装器 'cmd.exe' + /d /s /c。
|
|
88
|
+
// 可执行文件路径无条件引号包裹:无空格路径裸奔时,/s 模式的 cmd 会吞掉
|
|
89
|
+
// 路径中的反斜杠(C:\Users\... → C:Users...),引擎进程立即退出(code=1)。
|
|
90
|
+
// 参数仍逐个经 assertCmdSafeArg 校验(拒绝引号与控制字符),引号包裹不引入注入面。
|
|
91
|
+
const line = [`"${file}"`, ...args.map(a => assertCmdSafeArg(a)).map((token) => {
|
|
92
|
+
token = token.replace(/[\];&`<>$]/g, '^$1')
|
|
93
|
+
return token.includes(' ') ? `"${token}"` : token
|
|
94
|
+
})].join(' ')
|
|
95
|
+
return launchChildProcess('cmd.exe', ['/d', '/s', '/c', line], {
|
|
96
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
97
|
+
cwd: options.cwd ?? process.cwd(),
|
|
98
|
+
env,
|
|
99
|
+
windowsHide: true,
|
|
100
|
+
shell: false,
|
|
101
|
+
windowsVerbatimArguments: true,
|
|
102
|
+
})
|
|
103
|
+
}
|
|
104
|
+
return launchChildProcess(file, args, {
|
|
105
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
106
|
+
cwd: options.cwd ?? process.cwd(),
|
|
107
|
+
env,
|
|
108
|
+
windowsHide: true,
|
|
109
|
+
shell: false,
|
|
110
|
+
})
|
|
111
|
+
}
|