agentworkshop 0.6.1 → 0.7.1
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 +17 -0
- package/.env.example +37 -0
- package/.output/.AgentWorkShop/prompts/host-tools.json +17 -0
- package/.output/nitro.json +1 -1
- package/.output/public/_nuxt/{Bc_mM2cU.js → BH0Z05CS.js} +1 -1
- package/.output/public/_nuxt/Bxgaym6j.js +1 -0
- package/.output/public/_nuxt/{DRlJ2-4p.js → By-LNp3k.js} +1 -1
- package/.output/public/_nuxt/{C2QSTAWf.js → Bz40vyZS.js} +1 -1
- package/.output/public/_nuxt/{CwS_UHeH.js → CS8R0_J3.js} +1 -1
- package/.output/public/_nuxt/{ClptO7LA.js → CUxV8Bw_.js} +1 -1
- package/.output/public/_nuxt/CXmkVXS5.js +1 -0
- package/.output/public/_nuxt/DC-QMEk1.js +2 -0
- package/.output/public/_nuxt/{C-Y5ydB6.js → Dgp2wK2U.js} +6 -6
- package/.output/public/_nuxt/{Ck6tznoQ.js → DjqcbFBE.js} +1 -1
- package/.output/public/_nuxt/{B0haAGoq.js → GP2wXyuY.js} +1 -1
- package/.output/public/_nuxt/TownView.Bt33bo1M.css +1 -0
- package/.output/public/_nuxt/{MhK4buEJ.js → XVB9_zwP.js} +1 -1
- package/.output/public/_nuxt/_id_.BeqSLvl_.css +1 -0
- package/.output/public/_nuxt/builds/latest.json +1 -1
- package/.output/public/_nuxt/builds/meta/0f65fbec-c4c0-45de-9c50-bb41ada375e5.json +1 -0
- package/.output/public/_nuxt/{Bq_KKxCg.js → i_MKObHo.js} +1 -1
- package/.output/public/_nuxt/settings.DeRNNUcP.css +1 -0
- package/.output/public/_nuxt/{CclO6GyL.js → tpDMVY5w.js} +1 -1
- package/.output/public/_nuxt/{C0FogB-p.js → zwdqvGN_.js} +1 -1
- package/.output/server/chunks/_/nitro.mjs +2674 -2347
- package/.output/server/chunks/_/nitro.mjs.map +1 -1
- package/.output/server/chunks/build/{TownView-D9yCQe1T.mjs → TownView-BkHxMiwZ.mjs} +168 -159
- package/.output/server/chunks/build/{TownView-D9yCQe1T.mjs.map → TownView-BkHxMiwZ.mjs.map} +1 -1
- package/.output/server/chunks/build/{_id_-xR3AChMO.mjs → _id_-Bna1_JuB.mjs} +5 -4
- package/.output/server/chunks/build/_id_-Bna1_JuB.mjs.map +1 -0
- package/.output/server/chunks/build/{_id_-CmKAEFHV.mjs → _id_-GnRJPykX.mjs} +161 -119
- package/.output/server/chunks/build/_id_-GnRJPykX.mjs.map +1 -0
- package/.output/server/chunks/build/{_wsId_-C45nVrl-.mjs → _wsId_-CzLDGT_V.mjs} +6 -5
- package/.output/server/chunks/build/{_wsId_-C45nVrl-.mjs.map → _wsId_-CzLDGT_V.mjs.map} +1 -1
- package/.output/server/chunks/build/agents-D4l1icvn.mjs +1 -0
- package/.output/server/chunks/build/agents-D4l1icvn.mjs.map +1 -1
- package/.output/server/chunks/build/channel-templates-DqjtC-R0.mjs +1 -0
- package/.output/server/chunks/build/channel-templates-DqjtC-R0.mjs.map +1 -1
- package/.output/server/chunks/build/{daq-Boz_dlAQ.mjs → daq-D_W59QOe.mjs} +6 -5
- package/.output/server/chunks/build/daq-D_W59QOe.mjs.map +1 -0
- package/.output/server/chunks/build/{dcw-wTRwBAUi.mjs → dcw-BTM5YU-B.mjs} +3 -2
- package/.output/server/chunks/build/dcw-BTM5YU-B.mjs.map +1 -0
- package/.output/server/chunks/build/default-Dt6xLdpd.mjs +1 -0
- package/.output/server/chunks/build/{logs-Cdi-eXlN.mjs → logs-CUQt1z7D.mjs} +4 -3
- package/.output/server/chunks/build/logs-CUQt1z7D.mjs.map +1 -0
- package/.output/server/chunks/build/monitor-yNoV98rf.mjs +1 -0
- package/.output/server/chunks/build/{pages-bWKy0ZsA.mjs → pages-DR2bzczM.mjs} +4 -3
- package/.output/server/chunks/build/pages-DR2bzczM.mjs.map +1 -0
- package/.output/server/chunks/build/plugins-B-ZNey0Z.mjs +1 -0
- package/.output/server/chunks/build/plugins-B-ZNey0Z.mjs.map +1 -1
- package/.output/server/chunks/build/{settings-C3T5hR2A.mjs → settings-Cr06lbRy.mjs} +26 -18
- package/.output/server/chunks/build/settings-Cr06lbRy.mjs.map +1 -0
- package/.output/server/chunks/build/teams-QR3BBF7A.mjs +1 -0
- package/.output/server/chunks/build/teams-QR3BBF7A.mjs.map +1 -1
- package/.output/server/chunks/build/tokens-DFvr_TLj.mjs +1 -0
- package/.output/server/chunks/build/tokens-DFvr_TLj.mjs.map +1 -1
- package/.output/server/chunks/build/{town-CKg6Qxba.mjs → town-BN4vQPb8.mjs} +6 -5
- package/.output/server/chunks/build/town-BN4vQPb8.mjs.map +1 -0
- package/.output/server/chunks/build/town-BUqRobze.mjs +1 -0
- package/.output/server/chunks/build/town-BUqRobze.mjs.map +1 -1
- package/.output/server/chunks/build/{useDaqStream-zHEptJQ_.mjs → useDaqStream-hwkhJHFU.mjs} +2 -2
- package/.output/server/chunks/build/{useDaqStream-zHEptJQ_.mjs.map → useDaqStream-hwkhJHFU.mjs.map} +1 -1
- package/.output/server/chunks/build/{useDcwStream-BkWDGaWp.mjs → useDcwStream-Bdew_yrr.mjs} +16 -1
- package/.output/server/chunks/build/useDcwStream-Bdew_yrr.mjs.map +1 -0
- package/.output/server/chunks/build/{useDeviceTwins-NhtXqSkU.mjs → useDeviceTwins-C6EBg9oN.mjs} +2 -2
- package/.output/server/chunks/build/{useDeviceTwins-NhtXqSkU.mjs.map → useDeviceTwins-C6EBg9oN.mjs.map} +1 -1
- package/.output/server/chunks/build/{useOpsLog-CU64VDg5.mjs → useOpsLog-DdCqKVVG.mjs} +2 -2
- package/.output/server/chunks/build/{useOpsLog-CU64VDg5.mjs.map → useOpsLog-DdCqKVVG.mjs.map} +1 -1
- package/.output/server/chunks/build/users-4FZ0yFUO.mjs +1 -0
- package/.output/server/chunks/build/users-4FZ0yFUO.mjs.map +1 -1
- package/.output/server/chunks/build/workshop-CLhwe5eo.mjs +1 -0
- package/.output/server/chunks/build/workshop-CLhwe5eo.mjs.map +1 -1
- package/.output/server/chunks/routes/api/health.get.mjs +1 -0
- package/.output/server/chunks/routes/api/health.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/index.get.mjs +1 -0
- package/.output/server/chunks/routes/api/index.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/index.post.mjs +1 -0
- package/.output/server/chunks/routes/api/index.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/mcp/workshop.mjs +1 -0
- package/.output/server/chunks/routes/api/mcp/workshop.mjs.map +1 -1
- package/.output/server/chunks/routes/api/metrics.mjs +1 -0
- package/.output/server/chunks/routes/api/metrics.mjs.map +1 -1
- package/.output/server/chunks/routes/api/plugins/_name/_...path_.mjs +1 -0
- package/.output/server/chunks/routes/api/plugins/_name/_...path_.mjs.map +1 -1
- package/.output/server/chunks/routes/api/plugins/client/_name_.get.mjs +1 -0
- package/.output/server/chunks/routes/api/plugins/client/_name_.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/plugins/manifest.get.mjs +1 -0
- package/.output/server/chunks/routes/api/plugins/manifest.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/system/config.get.mjs +1 -0
- package/.output/server/chunks/routes/api/system/config.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/system/index.get.mjs +1 -0
- package/.output/server/chunks/routes/api/system/index.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/system/index.patch.mjs +1 -0
- package/.output/server/chunks/routes/api/system/index.patch.mjs.map +1 -1
- package/.output/server/chunks/routes/api/system/monitor/terminal/ws.mjs +1 -0
- package/.output/server/chunks/routes/api/system/monitor/terminal/ws.mjs.map +1 -1
- package/.output/server/chunks/routes/api/system/monitor/terminate.post.mjs +1 -0
- package/.output/server/chunks/routes/api/system/monitor/terminate.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/system/monitor.get.mjs +1 -0
- package/.output/server/chunks/routes/api/system/monitor.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/system/settings/events.get.mjs +1 -0
- package/.output/server/chunks/routes/api/system/settings/events.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/system/settings/reset.post.mjs +1 -0
- package/.output/server/chunks/routes/api/system/settings/reset.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/users/_id_.delete.mjs +1 -0
- package/.output/server/chunks/routes/api/users/_id_.delete.mjs.map +1 -1
- package/.output/server/chunks/routes/api/users/_id_.get.mjs +1 -0
- package/.output/server/chunks/routes/api/users/_id_.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/users/_id_.put.mjs +1 -0
- package/.output/server/chunks/routes/api/users/_id_.put.mjs.map +1 -1
- package/.output/server/chunks/routes/api/users/index.get.mjs +1 -0
- package/.output/server/chunks/routes/api/users/index.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/users/index.post.mjs +1 -0
- package/.output/server/chunks/routes/api/users/index.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/users/login.post.mjs +1 -0
- package/.output/server/chunks/routes/api/users/login.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/users/logout.post.mjs +1 -0
- package/.output/server/chunks/routes/api/users/logout.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/users/me.get.mjs +1 -0
- package/.output/server/chunks/routes/api/users/me.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/users/register.post.mjs +1 -0
- package/.output/server/chunks/routes/api/users/register.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/users/tokens/_id/token.get.mjs +1 -0
- package/.output/server/chunks/routes/api/users/tokens/_id/token.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/users/tokens/_id_.delete.mjs +1 -0
- package/.output/server/chunks/routes/api/users/tokens/_id_.delete.mjs.map +1 -1
- package/.output/server/chunks/routes/api/users/tokens/_id_.patch.mjs +1 -0
- package/.output/server/chunks/routes/api/users/tokens/_id_.patch.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/_...path_.mjs +1 -0
- package/.output/server/chunks/routes/api/workshop/_...path_.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/a2a/_agentId/index.get.mjs +1 -0
- package/.output/server/chunks/routes/api/workshop/a2a/_agentId/index.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/a2a/_agentId/index.post.mjs +1 -0
- package/.output/server/chunks/routes/api/workshop/a2a/_agentId/index.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/a2a/send.post.mjs +1 -0
- package/.output/server/chunks/routes/api/workshop/a2a/send.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/agent-tools/approvals/_id/decide.post.mjs +1 -0
- package/.output/server/chunks/routes/api/workshop/agent-tools/approvals/_id/decide.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/agent-tools/bindings/_id_.delete.mjs +1 -0
- package/.output/server/chunks/routes/api/workshop/agent-tools/bindings/_id_.delete.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/agent-tools/bindings/_id_.patch.mjs +1 -0
- package/.output/server/chunks/routes/api/workshop/agent-tools/bindings/_id_.patch.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/agent-tools/index.get.mjs +1 -0
- package/.output/server/chunks/routes/api/workshop/agent-tools/index.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/agent-tools/index.post.mjs +1 -0
- package/.output/server/chunks/routes/api/workshop/agent-tools/index.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/agent-tools/index2.get.mjs +1 -0
- package/.output/server/chunks/routes/api/workshop/agent-tools/index2.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/agent-tools/invoke.post.mjs +1 -0
- package/.output/server/chunks/routes/api/workshop/agent-tools/invoke.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/agents/_id_.delete.mjs +1 -0
- package/.output/server/chunks/routes/api/workshop/agents/_id_.delete.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/agents/_id_.get.mjs +1 -0
- package/.output/server/chunks/routes/api/workshop/agents/_id_.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/agents/_id_.patch.mjs +1 -0
- package/.output/server/chunks/routes/api/workshop/agents/_id_.patch.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/agents/subscribe.post.mjs +1 -0
- package/.output/server/chunks/routes/api/workshop/agents/subscribe.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/approvals/_id/decide.post.mjs +1 -0
- package/.output/server/chunks/routes/api/workshop/approvals/_id/decide.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/assets/character/_id_.delete.mjs +1 -0
- package/.output/server/chunks/routes/api/workshop/assets/character/_id_.delete.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/assets/devices/_id_.delete.mjs +1 -0
- package/.output/server/chunks/routes/api/workshop/assets/devices/_id_.delete.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/assets/index.get.mjs +1 -0
- package/.output/server/chunks/routes/api/workshop/assets/index.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/assets/index.post.mjs +1 -0
- package/.output/server/chunks/routes/api/workshop/assets/index.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/assets/index2.get.mjs +1 -0
- package/.output/server/chunks/routes/api/workshop/assets/index2.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/assets/index2.post.mjs +1 -0
- package/.output/server/chunks/routes/api/workshop/assets/index2.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/audit.get.mjs +1 -0
- package/.output/server/chunks/routes/api/workshop/audit.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/caller.mjs +1 -0
- package/.output/server/chunks/routes/api/workshop/caller.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/channel-templates/_id/instantiate.post.mjs +1 -0
- package/.output/server/chunks/routes/api/workshop/channel-templates/_id/instantiate.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/channel-templates/_id_.delete.mjs +1 -0
- package/.output/server/chunks/routes/api/workshop/channel-templates/_id_.delete.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/channel-templates/_id_.get.mjs +1 -0
- package/.output/server/chunks/routes/api/workshop/channel-templates/_id_.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/channel-templates/_id_.patch.mjs +1 -0
- package/.output/server/chunks/routes/api/workshop/channel-templates/_id_.patch.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/channel-templates/from-channel.post.mjs +1 -0
- package/.output/server/chunks/routes/api/workshop/channel-templates/from-channel.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/channels/_id/activate.post.mjs +1 -0
- package/.output/server/chunks/routes/api/workshop/channels/_id/activate.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/index.get.mjs +1 -0
- package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/index.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/index.post.mjs +1 -0
- package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/index.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/memories/_memoryId_.delete.mjs +1 -0
- package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/memories/_memoryId_.delete.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/memories/search.post.mjs +1 -0
- package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/memories/search.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/model.patch.mjs +1 -0
- package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/model.patch.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/position.patch.mjs +1 -0
- package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/position.patch.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/range.patch.mjs +1 -0
- package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/range.patch.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/stop.post.mjs +1 -0
- package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/stop.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId_.delete.mjs +1 -0
- package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId_.delete.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId_.patch.mjs +1 -0
- package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId_.patch.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/channels/_id/events.get.mjs +1 -0
- package/.output/server/chunks/routes/api/workshop/channels/_id/events.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/channels/_id/index.get.mjs +1 -0
- package/.output/server/chunks/routes/api/workshop/channels/_id/index.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/channels/_id/index.post.mjs +1 -0
- package/.output/server/chunks/routes/api/workshop/channels/_id/index.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/channels/_id/index2.get.mjs +1 -0
- package/.output/server/chunks/routes/api/workshop/channels/_id/index2.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/channels/_id/index2.post.mjs +1 -0
- package/.output/server/chunks/routes/api/workshop/channels/_id/index2.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/channels/_id/index3.get.mjs +1 -0
- package/.output/server/chunks/routes/api/workshop/channels/_id/index3.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/channels/_id/index3.post.mjs +1 -0
- package/.output/server/chunks/routes/api/workshop/channels/_id/index3.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/channels/_id/index4.get.mjs +1 -0
- package/.output/server/chunks/routes/api/workshop/channels/_id/index4.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/channels/_id/index4.post.mjs +1 -0
- package/.output/server/chunks/routes/api/workshop/channels/_id/index4.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/channels/_id/memories/_memoryId_.delete.mjs +1 -0
- package/.output/server/chunks/routes/api/workshop/channels/_id/memories/_memoryId_.delete.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/channels/_id/queue.get.mjs +1 -0
- package/.output/server/chunks/routes/api/workshop/channels/_id/queue.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/channels/_id/terminals.get.mjs +1 -0
- package/.output/server/chunks/routes/api/workshop/channels/_id/terminals.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/channels/_id_.delete.mjs +1 -0
- package/.output/server/chunks/routes/api/workshop/channels/_id_.delete.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/channels/index.get.mjs +1 -0
- package/.output/server/chunks/routes/api/workshop/channels/index.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/channels/index.patch.mjs +1 -0
- 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 -0
- package/.output/server/chunks/routes/api/workshop/channels.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/channels.post.mjs +1 -0
- package/.output/server/chunks/routes/api/workshop/channels.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/daq/_id/bind.post.mjs +1 -0
- package/.output/server/chunks/routes/api/workshop/daq/_id/bind.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/daq/_id/frames/content.get.mjs +1 -0
- package/.output/server/chunks/routes/api/workshop/daq/_id/frames/content.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/daq/_id/frames.get.mjs +1 -0
- package/.output/server/chunks/routes/api/workshop/daq/_id/frames.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/daq/_id/samples.get.mjs +1 -0
- 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 +1 -0
- package/.output/server/chunks/routes/api/workshop/daq/_id/test.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/daq/_id_.delete.mjs +1 -0
- package/.output/server/chunks/routes/api/workshop/daq/_id_.delete.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/daq/_id_.patch.mjs +1 -0
- package/.output/server/chunks/routes/api/workshop/daq/_id_.patch.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/daq/alarms/_id/ack.post.mjs +1 -0
- package/.output/server/chunks/routes/api/workshop/daq/alarms/_id/ack.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/daq/alarms.get.mjs +1 -0
- package/.output/server/chunks/routes/api/workshop/daq/alarms.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/daq/controller.post.mjs +1 -0
- package/.output/server/chunks/routes/api/workshop/daq/controller.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/daq/index.post.mjs +1 -0
- package/.output/server/chunks/routes/api/workshop/daq/index.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/daq/infra/reconnect.post.mjs +1 -0
- package/.output/server/chunks/routes/api/workshop/daq/infra/reconnect.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/daq/infra.get.mjs +1 -0
- package/.output/server/chunks/routes/api/workshop/daq/infra.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/daq/templates/_key_.delete.mjs +1 -0
- package/.output/server/chunks/routes/api/workshop/daq/templates/_key_.delete.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/daq/templates/_key_.patch.mjs +1 -0
- package/.output/server/chunks/routes/api/workshop/daq/templates/_key_.patch.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/daq/test-driver.post.mjs +1 -0
- package/.output/server/chunks/routes/api/workshop/daq/test-driver.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/_id/bind.post.mjs +1 -0
- package/.output/server/chunks/routes/api/workshop/dcw/_id/bind.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/_id/param-ledger.get.mjs +1 -0
- package/.output/server/chunks/routes/api/workshop/dcw/_id/param-ledger.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/_id/read.post.mjs +31 -0
- package/.output/server/chunks/routes/api/workshop/dcw/_id/read.post.mjs.map +1 -0
- package/.output/server/chunks/routes/api/workshop/dcw/_id/test.post.mjs +1 -0
- package/.output/server/chunks/routes/api/workshop/dcw/_id/test.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/_id/write.post.mjs +1 -0
- package/.output/server/chunks/routes/api/workshop/dcw/_id/write.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/_id_.delete.mjs +1 -0
- package/.output/server/chunks/routes/api/workshop/dcw/_id_.delete.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/_id_.patch.mjs +1 -0
- package/.output/server/chunks/routes/api/workshop/dcw/_id_.patch.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/controller.post.mjs +1 -0
- package/.output/server/chunks/routes/api/workshop/dcw/controller.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/index.get.mjs +1 -0
- package/.output/server/chunks/routes/api/workshop/dcw/index.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/index.post.mjs +1 -0
- package/.output/server/chunks/routes/api/workshop/dcw/index.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/index2.get.mjs +1 -0
- package/.output/server/chunks/routes/api/workshop/dcw/index2.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/index2.post.mjs +1 -0
- package/.output/server/chunks/routes/api/workshop/dcw/index2.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/index3.get.mjs +1 -0
- package/.output/server/chunks/routes/api/workshop/dcw/index3.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/index3.post.mjs +1 -0
- package/.output/server/chunks/routes/api/workshop/dcw/index3.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/index4.get.mjs +1 -0
- package/.output/server/chunks/routes/api/workshop/dcw/index4.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/index4.post.mjs +1 -0
- package/.output/server/chunks/routes/api/workshop/dcw/index4.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/index5.get.mjs +1 -0
- package/.output/server/chunks/routes/api/workshop/dcw/index5.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/journal/node/_nodeId/rollback.post.mjs +1 -0
- package/.output/server/chunks/routes/api/workshop/dcw/journal/node/_nodeId/rollback.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/line/query.get.mjs +1 -0
- package/.output/server/chunks/routes/api/workshop/dcw/line/query.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/lines/_id/start.post.mjs +1 -0
- package/.output/server/chunks/routes/api/workshop/dcw/lines/_id/start.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/lines/_id/stop.post.mjs +1 -0
- package/.output/server/chunks/routes/api/workshop/dcw/lines/_id/stop.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/lines/_id_.delete.mjs +1 -0
- package/.output/server/chunks/routes/api/workshop/dcw/lines/_id_.delete.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/lines/_id_.patch.mjs +1 -0
- package/.output/server/chunks/routes/api/workshop/dcw/lines/_id_.patch.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id/judge.post.mjs +1 -0
- package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id/judge.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id/rollback.post.mjs +1 -0
- package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id/rollback.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id/series.get.mjs +1 -0
- package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id/series.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id_.get.mjs +1 -0
- package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id_.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/products/_id_.delete.mjs +1 -0
- package/.output/server/chunks/routes/api/workshop/dcw/products/_id_.delete.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/products/_id_.patch.mjs +1 -0
- package/.output/server/chunks/routes/api/workshop/dcw/products/_id_.patch.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/apply.post.mjs +1 -0
- package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/apply.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/mark-good.post.mjs +1 -0
- package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/mark-good.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/rollback-good.post.mjs +1 -0
- package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/rollback-good.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id_.delete.mjs +1 -0
- package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id_.delete.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id_.patch.mjs +1 -0
- package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id_.patch.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/runs/_id/close.post.mjs +1 -0
- package/.output/server/chunks/routes/api/workshop/dcw/runs/_id/close.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/runs/_id/data.get.mjs +1 -0
- package/.output/server/chunks/routes/api/workshop/dcw/runs/_id/data.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/runs/_id/rollback.post.mjs +1 -0
- package/.output/server/chunks/routes/api/workshop/dcw/runs/_id/rollback.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/templates/_key_.delete.mjs +1 -0
- package/.output/server/chunks/routes/api/workshop/dcw/templates/_key_.delete.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/templates/_key_.patch.mjs +1 -0
- package/.output/server/chunks/routes/api/workshop/dcw/templates/_key_.patch.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/test-driver.post.mjs +1 -0
- package/.output/server/chunks/routes/api/workshop/dcw/test-driver.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/device-twins/_id/control.post.mjs +1 -0
- package/.output/server/chunks/routes/api/workshop/device-twins/_id/control.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/device-twins/_id/telemetry.post.mjs +1 -0
- package/.output/server/chunks/routes/api/workshop/device-twins/_id/telemetry.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/device-twins/_id_.delete.mjs +1 -0
- package/.output/server/chunks/routes/api/workshop/device-twins/_id_.delete.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/device-twins/_id_.patch.mjs +1 -0
- package/.output/server/chunks/routes/api/workshop/device-twins/_id_.patch.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/fs/dirs.get.mjs +1 -0
- package/.output/server/chunks/routes/api/workshop/fs/dirs.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/index.get.mjs +1 -0
- package/.output/server/chunks/routes/api/workshop/index.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/index.post.mjs +1 -0
- package/.output/server/chunks/routes/api/workshop/index.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/index10.get.mjs +1 -0
- package/.output/server/chunks/routes/api/workshop/index10.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/index2.get.mjs +1 -0
- package/.output/server/chunks/routes/api/workshop/index2.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/index2.post.mjs +1 -0
- package/.output/server/chunks/routes/api/workshop/index2.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/index3.get.mjs +1 -0
- package/.output/server/chunks/routes/api/workshop/index3.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/index3.post.mjs +1 -0
- package/.output/server/chunks/routes/api/workshop/index3.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/index4.get.mjs +1 -0
- package/.output/server/chunks/routes/api/workshop/index4.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/index4.post.mjs +1 -0
- package/.output/server/chunks/routes/api/workshop/index4.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/index5.get.mjs +1 -0
- package/.output/server/chunks/routes/api/workshop/index5.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/index5.post.mjs +1 -0
- package/.output/server/chunks/routes/api/workshop/index5.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/index6.get.mjs +1 -0
- package/.output/server/chunks/routes/api/workshop/index6.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/index6.post.mjs +1 -0
- package/.output/server/chunks/routes/api/workshop/index6.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/index7.get.mjs +1 -0
- package/.output/server/chunks/routes/api/workshop/index7.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/index7.post.mjs +1 -0
- package/.output/server/chunks/routes/api/workshop/index7.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/index8.get.mjs +1 -0
- package/.output/server/chunks/routes/api/workshop/index8.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/index8.post.mjs +1 -0
- package/.output/server/chunks/routes/api/workshop/index8.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/index9.get.mjs +1 -0
- package/.output/server/chunks/routes/api/workshop/index9.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/mailbox/all.get.mjs +1 -0
- package/.output/server/chunks/routes/api/workshop/mailbox/all.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/mailbox.get.mjs +1 -0
- package/.output/server/chunks/routes/api/workshop/mailbox.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/memories/maintenance.post.mjs +1 -0
- package/.output/server/chunks/routes/api/workshop/memories/maintenance.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/plugins/_name/disable.post.mjs +1 -0
- package/.output/server/chunks/routes/api/workshop/plugins/_name/disable.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/plugins/_name/enable.post.mjs +1 -0
- package/.output/server/chunks/routes/api/workshop/plugins/_name/enable.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/plugins/index.get.mjs +1 -0
- package/.output/server/chunks/routes/api/workshop/plugins/index.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/runtime.get.mjs +1 -0
- package/.output/server/chunks/routes/api/workshop/runtime.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/scene/layouts/_channelId_.delete.mjs +1 -0
- package/.output/server/chunks/routes/api/workshop/scene/layouts/_channelId_.delete.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/scene/layouts/_channelId_.put.mjs +1 -0
- package/.output/server/chunks/routes/api/workshop/scene/layouts/_channelId_.put.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/scene/layouts.get.mjs +1 -0
- package/.output/server/chunks/routes/api/workshop/scene/layouts.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/tasks/_id/complete.post.mjs +1 -0
- package/.output/server/chunks/routes/api/workshop/tasks/_id/complete.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/tasks/_id/dispatch.post.mjs +1 -0
- package/.output/server/chunks/routes/api/workshop/tasks/_id/dispatch.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/tasks/_id/index.post.mjs +1 -0
- package/.output/server/chunks/routes/api/workshop/tasks/_id/index.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/tasks/_id/report.post.mjs +1 -0
- package/.output/server/chunks/routes/api/workshop/tasks/_id/report.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/tasks/_id/retry.post.mjs +1 -0
- package/.output/server/chunks/routes/api/workshop/tasks/_id/retry.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/tasks/_id_.get.mjs +1 -0
- package/.output/server/chunks/routes/api/workshop/tasks/_id_.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/tasks.get.mjs +1 -0
- package/.output/server/chunks/routes/api/workshop/tasks.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/teams/_id/deploy.post.mjs +1 -0
- package/.output/server/chunks/routes/api/workshop/teams/_id/deploy.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/teams/_id/index.get.mjs +1 -0
- package/.output/server/chunks/routes/api/workshop/teams/_id/index.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/teams/_id/index.post.mjs +1 -0
- package/.output/server/chunks/routes/api/workshop/teams/_id/index.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/teams/_id/members/_agentId_.delete.mjs +1 -0
- package/.output/server/chunks/routes/api/workshop/teams/_id/members/_agentId_.delete.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/teams/_id_.delete.mjs +1 -0
- package/.output/server/chunks/routes/api/workshop/teams/_id_.delete.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/teams/_id_.get.mjs +1 -0
- package/.output/server/chunks/routes/api/workshop/teams/_id_.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/teams/_id_.patch.mjs +1 -0
- package/.output/server/chunks/routes/api/workshop/teams/_id_.patch.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/users/me.get.mjs +1 -0
- package/.output/server/chunks/routes/api/workshop/users/me.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/users/register.post.mjs +1 -0
- package/.output/server/chunks/routes/api/workshop/users/register.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/workspaces/_id/channel-templates/_tplId_.post.mjs +1 -0
- package/.output/server/chunks/routes/api/workshop/workspaces/_id/channel-templates/_tplId_.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/workspaces/_id/channels/_channelId_.delete.mjs +1 -0
- package/.output/server/chunks/routes/api/workshop/workspaces/_id/channels/_channelId_.delete.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/workspaces/_id/channels/_channelId_.post.mjs +1 -0
- package/.output/server/chunks/routes/api/workshop/workspaces/_id/channels/_channelId_.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/workspaces/index.delete.mjs +1 -0
- package/.output/server/chunks/routes/api/workshop/workspaces/index.delete.mjs.map +1 -1
- package/.output/server/chunks/routes/renderer.mjs +1 -1
- package/.output/server/chunks/virtual/entry.mjs +287 -85
- package/.output/server/chunks/virtual/precomputed.mjs +1 -1
- package/.output/server/index.mjs +1 -0
- package/.output/server/package.json +1 -1
- package/README-zh.md +434 -430
- package/README.md +5 -1
- package/app/components/workshop/DeviceTwinPanel.vue +34 -0
- package/app/components/workshop/town/TownView.vue +5 -0
- package/app/composables/workshop/useDcwStream.ts +15 -1
- package/app/config/schema.ts +54 -0
- package/app/pages/dcw/[id].vue +57 -0
- package/app/pages/settings.vue +2 -1
- package/config.yml +58 -1
- package/i18n/dicts/_en.json +56 -2
- package/i18n/dicts/dcwDetail.json +9 -1
- package/i18n/dicts/deviceTwinPanel.json +2 -1
- package/i18n/dicts/settings.json +48 -1
- package/i18n/locales/en.ts +139 -38
- package/i18n/locales/zh-CN.ts +139 -38
- package/package.json +1 -1
- package/scripts/_dbg-agent-dcw-rw.ts +131 -0
- package/scripts/_dbg-config-smoke.ts +28 -0
- package/scripts/_dbg-dcw-read-rest.mjs +103 -0
- package/scripts/_dbg-dcw-read-toolface.ts +13 -0
- package/scripts/_dbg-dcw-read-ui.mjs +74 -0
- package/scripts/_dbg-plugin-ui-wizard.mjs +125 -0
- package/scripts/test-config-precedence.ts +124 -0
- package/scripts/test-dcw-read.ts +153 -0
- package/server/api/workshop/dcw/[id]/read.post.ts +18 -0
- package/server/api/workshop/ws.ts +6 -4
- package/server/data/daqs.json +55 -9
- package/server/data/dcw-rollback.json +221 -1
- package/server/data/dcw-runs.json +41 -18
- package/server/data/dcw-writes.json +264 -0
- package/server/data/dcws.json +646 -4
- package/server/data/line-runs.json +12 -1
- package/server/plugins/backup.ts +7 -5
- package/server/plugins/retention.ts +59 -57
- package/server/plugins/workshop.ts +5 -4
- package/server/services/workshop/agents/industrial-tools.ts +50 -1
- package/server/services/workshop/agents/omp-agent.ts +10 -8
- package/server/services/workshop/agents/tool-approvals.ts +175 -174
- package/server/services/workshop/daq/alarm-notify.ts +102 -100
- package/server/services/workshop/daq/bus/mqtt.adapter.ts +14 -15
- package/server/services/workshop/daq/storage/sqlite.adapter.ts +5 -4
- package/server/services/workshop/daq/storage/timescale.adapter.ts +5 -4
- package/server/services/workshop/db/retention.ts +49 -50
- package/server/services/workshop/dcw/dcw-controller.ts +56 -1
- package/server/services/workshop/dcw/dcw-node.ts +233 -200
- package/server/services/workshop/dcw/dcw-runtime.ts +46 -9
- package/server/services/workshop/dcw/drivers.ts +98 -0
- package/server/services/workshop/dcw/recipe-rollback-manager.ts +16 -15
- package/server/services/workshop/logger.ts +65 -58
- package/server/services/workshop/runtime/embedding-provider.ts +9 -5
- package/server/services/workshop/runtime/manager.ts +16 -7
- package/server/services/workshop/runtime/memory.ts +14 -7
- package/server/services/workshop/settings.ts +143 -0
- package/shared/config/engine.mjs +14 -2
- package/shared/config/schema.json +48 -1
- package/shared/dcw-protocol.ts +21 -0
- package/.output/public/_nuxt/BD9D9pl4.js +0 -1
- package/.output/public/_nuxt/BxD8Fg_Z.js +0 -2
- package/.output/public/_nuxt/CwcOEM8m.js +0 -1
- package/.output/public/_nuxt/TownView.CI2Wpzty.css +0 -1
- package/.output/public/_nuxt/_id_.Ci4u30cR.css +0 -1
- package/.output/public/_nuxt/builds/meta/221de779-a113-4232-b9a1-31a614f5e3c7.json +0 -1
- package/.output/public/_nuxt/settings.BG0K9_MG.css +0 -1
- package/.output/server/chunks/build/_id_-CmKAEFHV.mjs.map +0 -1
- package/.output/server/chunks/build/_id_-xR3AChMO.mjs.map +0 -1
- package/.output/server/chunks/build/daq-Boz_dlAQ.mjs.map +0 -1
- package/.output/server/chunks/build/dcw-wTRwBAUi.mjs.map +0 -1
- package/.output/server/chunks/build/logs-Cdi-eXlN.mjs.map +0 -1
- package/.output/server/chunks/build/pages-bWKy0ZsA.mjs.map +0 -1
- package/.output/server/chunks/build/settings-C3T5hR2A.mjs.map +0 -1
- package/.output/server/chunks/build/town-CKg6Qxba.mjs.map +0 -1
- package/.output/server/chunks/build/useDcwStream-BkWDGaWp.mjs.map +0 -1
|
@@ -30,11 +30,12 @@ import { getDcwNodeRepo } from './dcw-node.repo'
|
|
|
30
30
|
import { getActiveLineRun } from './line-run'
|
|
31
31
|
import { getRecipeRollBackRepo, type RecipeRollBackRepo } from './recipe-rollback.repo'
|
|
32
32
|
import { recordOps } from '../ops/ops'
|
|
33
|
+
import { dcwSettings } from '../settings'
|
|
33
34
|
|
|
34
|
-
/** 回退后同向重写冷却 */
|
|
35
|
-
const COOLDOWN_MS =
|
|
36
|
-
/** 系统兜底评估的最小观察窗 */
|
|
37
|
-
const MIN_WINDOW_MS =
|
|
35
|
+
/** 回退后同向重写冷却(dcw.rollback_cooldown_ms;env DCW_ROLLBACK_COOLDOWN_MS 兼容) */
|
|
36
|
+
const COOLDOWN_MS = (): number => dcwSettings().rollback_cooldown_ms
|
|
37
|
+
/** 系统兜底评估的最小观察窗(env DCW_ROLLBACK_MIN_WINDOW_MS 兼容) */
|
|
38
|
+
const MIN_WINDOW_MS = (): number => dcwSettings().rollback_min_window_ms
|
|
38
39
|
/** 兜底评估复查间隔(未触发时) */
|
|
39
40
|
const RECHECK_MS = 30_000
|
|
40
41
|
/** 每节点链自动回退上限(超出升级人工) */
|
|
@@ -43,10 +44,10 @@ const MAX_AUTO_ROLLBACKS = 2
|
|
|
43
44
|
const BREACH_THRESHOLD = 3
|
|
44
45
|
/** 锚去重窗口(保写心跳防噪) */
|
|
45
46
|
const ANCHOR_DEDUP_MS = 5_000
|
|
46
|
-
/** 基线回看窗 */
|
|
47
|
-
const BASELINE_MS =
|
|
48
|
-
/** open 记录孤儿判定:属主超时未判定 → 后续 Agent 可接管(
|
|
49
|
-
const OPEN_RECORD_STALE_MS =
|
|
47
|
+
/** 基线回看窗(env DCW_ROLLBACK_BASELINE_MS 兼容) */
|
|
48
|
+
const BASELINE_MS = (): number => dcwSettings().rollback_baseline_ms
|
|
49
|
+
/** open 记录孤儿判定:属主超时未判定 → 后续 Agent 可接管(env DCW_ROLLBACK_STALE_MS 兼容) */
|
|
50
|
+
const OPEN_RECORD_STALE_MS = (): number => dcwSettings().rollback_stale_ms
|
|
50
51
|
|
|
51
52
|
/** 数值入参钳制(时间/桶宽:有限正整数,防越界透传) */
|
|
52
53
|
function clampMs(v: number | undefined): number | undefined {
|
|
@@ -91,12 +92,12 @@ export class RecipeRollBackManager {
|
|
|
91
92
|
const rb = this.repo.lastRollbackAnchor(node.id)
|
|
92
93
|
if (rb && rb.prevValue != null) {
|
|
93
94
|
const elapsed = Date.now() - Date.parse(rb.at)
|
|
94
|
-
if (elapsed < COOLDOWN_MS) {
|
|
95
|
+
if (elapsed < COOLDOWN_MS()) {
|
|
95
96
|
const restored = rb.newValue
|
|
96
97
|
const wrong = rb.prevValue
|
|
97
98
|
// 同向判定:偏离恢复值的方向与原错误方向一致(往回改不受限)
|
|
98
99
|
if (eng !== restored && Math.sign(eng - restored) === Math.sign(wrong - restored)) {
|
|
99
|
-
throw new AppError(409, ErrorCodes.CONFLICT, `回退冷却中:节点「${node.name}」${Math.ceil((COOLDOWN_MS - elapsed) / 1000)}s 内禁止同向重写(刚从 ${wrong} 回退到 ${restored});如确需调整请先 dcw_judge 复盘或反向操作`)
|
|
100
|
+
throw new AppError(409, ErrorCodes.CONFLICT, `回退冷却中:节点「${node.name}」${Math.ceil((COOLDOWN_MS() - elapsed) / 1000)}s 内禁止同向重写(刚从 ${wrong} 回退到 ${restored});如确需调整请先 dcw_judge 复盘或反向操作`)
|
|
100
101
|
}
|
|
101
102
|
}
|
|
102
103
|
}
|
|
@@ -156,7 +157,7 @@ export class RecipeRollBackManager {
|
|
|
156
157
|
})
|
|
157
158
|
anchor.recordId = record.id
|
|
158
159
|
this.repo.flushNow()
|
|
159
|
-
void this.fillMetrics(record, 'baseline', Date.parse(record.setAt) - BASELINE_MS, Date.parse(record.setAt))
|
|
160
|
+
void this.fillMetrics(record, 'baseline', Date.parse(record.setAt) - BASELINE_MS(), Date.parse(record.setAt))
|
|
160
161
|
this.emit('opened', record)
|
|
161
162
|
recordOps({
|
|
162
163
|
actor: meta.actor,
|
|
@@ -196,7 +197,7 @@ export class RecipeRollBackManager {
|
|
|
196
197
|
|
|
197
198
|
/** 孤儿判定:open 记录超时未判定(属主可能已消失)→ 可被后续 Agent 接管 */
|
|
198
199
|
isStale(record: OptimizationRecord): boolean {
|
|
199
|
-
return record.status === 'open' && Date.now() - Date.parse(record.setAt) > OPEN_RECORD_STALE_MS
|
|
200
|
+
return record.status === 'open' && Date.now() - Date.parse(record.setAt) > OPEN_RECORD_STALE_MS()
|
|
200
201
|
}
|
|
201
202
|
|
|
202
203
|
judge(recordId: string, verdict: OptimizationVerdict, reason: string, by: 'agent' | 'system' | 'user', actor: string, opts?: { takeover?: boolean }): OptimizationRecord {
|
|
@@ -401,8 +402,8 @@ export class RecipeRollBackManager {
|
|
|
401
402
|
const rb = this.repo.lastRollbackAnchor(nodeId)
|
|
402
403
|
if (rb) {
|
|
403
404
|
const elapsed = Date.now() - Date.parse(rb.at)
|
|
404
|
-
if (elapsed < COOLDOWN_MS)
|
|
405
|
-
throw new AppError(409, ErrorCodes.CONFLICT, `回退冷却中:节点 ${Math.ceil((COOLDOWN_MS - elapsed) / 1000)}s 内禁止再次回退`)
|
|
405
|
+
if (elapsed < COOLDOWN_MS())
|
|
406
|
+
throw new AppError(409, ErrorCodes.CONFLICT, `回退冷却中:节点 ${Math.ceil((COOLDOWN_MS() - elapsed) / 1000)}s 内禁止再次回退`)
|
|
406
407
|
}
|
|
407
408
|
}
|
|
408
409
|
|
|
@@ -415,7 +416,7 @@ export class RecipeRollBackManager {
|
|
|
415
416
|
if (record.policy === 'observe_only')
|
|
416
417
|
continue
|
|
417
418
|
const setMs = Date.parse(record.setAt)
|
|
418
|
-
if (now - setMs < MIN_WINDOW_MS)
|
|
419
|
+
if (now - setMs < MIN_WINDOW_MS())
|
|
419
420
|
continue
|
|
420
421
|
if (record.evaluatedAt && now - Date.parse(record.evaluatedAt) < RECHECK_MS)
|
|
421
422
|
continue
|
|
@@ -1,58 +1,65 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* 极简结构化日志(R4):级别 + JSON
|
|
3
|
-
* - AWSHOP_LOG_LEVEL = debug
|
|
4
|
-
* - 输出:单行 JSON(t/level/scope/msg/args),error/warn 走 stderr,其余 stdout
|
|
5
|
-
* - 范围收敛:仅替换 server/services/workshop 目录的 console 直出
|
|
6
|
-
* (request-log、plugins、mcp 的 console 保留,见计划 R4-2,避免全量替换的回归面)
|
|
7
|
-
*/
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
export
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
}
|
|
1
|
+
/**
|
|
2
|
+
* 极简结构化日志(R4):级别 + JSON 行,配置驱动。
|
|
3
|
+
* - log.level(设置描述符;env AWSHOP_LOG_LEVEL 兼容别名)= debug|info|warn|error(默认 info)
|
|
4
|
+
* - 输出:单行 JSON(t/level/scope/msg/args),error/warn 走 stderr,其余 stdout
|
|
5
|
+
* - 范围收敛:仅替换 server/services/workshop 目录的 console 直出
|
|
6
|
+
* (request-log、plugins、mcp 的 console 保留,见计划 R4-2,避免全量替换的回归面)
|
|
7
|
+
*/
|
|
8
|
+
import { settingOf } from './settings'
|
|
9
|
+
|
|
10
|
+
export type LogLevel = 'debug' | 'info' | 'warn' | 'error'
|
|
11
|
+
|
|
12
|
+
const LEVELS: Record<LogLevel, number> = { debug: 10, info: 20, warn: 30, error: 40 }
|
|
13
|
+
|
|
14
|
+
function minLevel(): LogLevel {
|
|
15
|
+
// 配置未就绪/解析失败回落 info(日志层永不因配置抛错)
|
|
16
|
+
try {
|
|
17
|
+
const v = settingOf('log.level') as LogLevel
|
|
18
|
+
return v && v in LEVELS ? v : 'info'
|
|
19
|
+
}
|
|
20
|
+
catch {
|
|
21
|
+
return 'info'
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/** 安全序列化:Error → stack,循环引用降级为 [Circular],序列化失败降级 String */
|
|
26
|
+
function safe(value: unknown): unknown {
|
|
27
|
+
if (value instanceof Error) return value.stack ?? String(value)
|
|
28
|
+
if (typeof value === 'object' && value !== null) {
|
|
29
|
+
try {
|
|
30
|
+
return JSON.parse(JSON.stringify(value))
|
|
31
|
+
}
|
|
32
|
+
catch {
|
|
33
|
+
return '[Unserializable]'
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
return value
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export interface Logger {
|
|
40
|
+
debug(msg: string, ...args: unknown[]): void
|
|
41
|
+
info(msg: string, ...args: unknown[]): void
|
|
42
|
+
warn(msg: string, ...args: unknown[]): void
|
|
43
|
+
error(msg: string, ...args: unknown[]): void
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
export function createLogger(scope: string): Logger {
|
|
47
|
+
const emit = (level: LogLevel, msg: string, args: unknown[]): void => {
|
|
48
|
+
if (LEVELS[level] < LEVELS[minLevel()]) return
|
|
49
|
+
const line = JSON.stringify({
|
|
50
|
+
t: new Date().toISOString(),
|
|
51
|
+
level,
|
|
52
|
+
scope,
|
|
53
|
+
msg,
|
|
54
|
+
...(args.length ? { args: args.map(safe) } : {}),
|
|
55
|
+
})
|
|
56
|
+
if (level === 'error' || level === 'warn') console.error(line)
|
|
57
|
+
else console.log(line)
|
|
58
|
+
}
|
|
59
|
+
return {
|
|
60
|
+
debug: (msg, ...args) => emit('debug', msg, args),
|
|
61
|
+
info: (msg, ...args) => emit('info', msg, args),
|
|
62
|
+
warn: (msg, ...args) => emit('warn', msg, args),
|
|
63
|
+
error: (msg, ...args) => emit('error', msg, args),
|
|
64
|
+
}
|
|
65
|
+
}
|
|
@@ -1,9 +1,12 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Embedding provider — OpenAI 兼容 /embeddings 端点(
|
|
3
|
-
* 未配置
|
|
2
|
+
* Embedding provider — OpenAI 兼容 /embeddings 端点(配置驱动,原生 fetch 零 SDK)。
|
|
3
|
+
* 未配置(memory.embed_base_url/embed_model 均空)→ 返回 null(向量分支整体关闭,记忆系统纯 FTS 降级)。
|
|
4
|
+
* 覆盖链:config.yml < runtime-settings < env(AW_MEMORY_EMBED_*);原生 fetch 零 SDK。
|
|
4
5
|
* 熔断:连续 3 次失败禁用 10 分钟(避免每个任务都白等超时)。
|
|
5
6
|
* 维度:首次成功 embed 的返回长度(不信任配置,以实测为准)。
|
|
6
7
|
*/
|
|
8
|
+
import { memorySettings } from '../settings'
|
|
9
|
+
|
|
7
10
|
export interface EmbeddingProvider {
|
|
8
11
|
embed(texts: string[]): Promise<Float32Array[]>
|
|
9
12
|
/** 已知维度(首次成功 embed 前 null) */
|
|
@@ -15,10 +18,11 @@ const COOLDOWN_MS = 10 * 60_000
|
|
|
15
18
|
const REQUEST_TIMEOUT_MS = 10_000
|
|
16
19
|
|
|
17
20
|
export function createEnvEmbeddingProvider(): EmbeddingProvider | null {
|
|
18
|
-
const
|
|
19
|
-
const
|
|
21
|
+
const memoryCfg = memorySettings()
|
|
22
|
+
const baseUrl = memoryCfg.embed_base_url || undefined
|
|
23
|
+
const model = memoryCfg.embed_model || undefined
|
|
20
24
|
if (!baseUrl || !model) return null
|
|
21
|
-
const apiKey =
|
|
25
|
+
const apiKey = memoryCfg.embed_api_key ?? ''
|
|
22
26
|
let dims: number | null = null
|
|
23
27
|
let fails = 0
|
|
24
28
|
let disabledUntil = 0
|
|
@@ -37,7 +37,8 @@ import type { ChannelBus, MemberChangeEvent, TaskEngine, TaskEventTask } from '.
|
|
|
37
37
|
import { ChannelRuntime } from './channel-runtime'
|
|
38
38
|
import { SchedulerLoop, type SchedulerLoopOptions } from './scheduler-loop'
|
|
39
39
|
import { TaskEngine as TaskEngineImpl } from './task-engine'
|
|
40
|
-
import { AgentMemory,
|
|
40
|
+
import { AgentMemory, runMemoryMaintenance, segmentCJK, unsegmentCJK, vectorizeMemory, type MaintenanceResult, type MemorySnippet } from './memory'
|
|
41
|
+
import { memorySettings } from '../settings'
|
|
41
42
|
import { createEnvEmbeddingProvider } from './embedding-provider'
|
|
42
43
|
import { listHarnessProcesses, listAliveHarnessProcessesByAgent, sweepHarnessProcesses, killHarnessProcess } from '../agents/harness-process'
|
|
43
44
|
import { hasTerminalSession, sweepTerminalSessions } from '../agents/harness-terminal'
|
|
@@ -323,7 +324,7 @@ export class AgentChannelManager {
|
|
|
323
324
|
catch (err) {
|
|
324
325
|
log.error('[memory] 反思任务异常', err)
|
|
325
326
|
}
|
|
326
|
-
},
|
|
327
|
+
}, memorySettings().maintenance_ms)
|
|
327
328
|
this.memoryTimer.unref?.()
|
|
328
329
|
}
|
|
329
330
|
|
|
@@ -444,7 +445,7 @@ export class AgentChannelManager {
|
|
|
444
445
|
for (const rt of this.agentIndex.values()) {
|
|
445
446
|
if (rt.getState() === 'busy') return
|
|
446
447
|
}
|
|
447
|
-
const trigger =
|
|
448
|
+
const trigger = memorySettings().reflect_trigger
|
|
448
449
|
const month = new Date().toISOString().slice(0, 7)
|
|
449
450
|
for (const agentId of this.deps.repos.memories.listMemoryAgentIds()) {
|
|
450
451
|
const rows = this.deps.repos.memories.listByAgentWithRowid(agentId, 1_000_000)
|
|
@@ -2545,9 +2546,12 @@ export class AgentChannelManager {
|
|
|
2545
2546
|
* 协同工作流的第一步——先看别的团队在做什么/做过什么,再决定是否发信请求协作。
|
|
2546
2547
|
*/
|
|
2547
2548
|
listOtherTeamsOverview(channelId: string, agentId: string): Array<{
|
|
2548
|
-
channelId: string
|
|
2549
|
-
|
|
2550
|
-
|
|
2549
|
+
channelId: string
|
|
2550
|
+
name: string
|
|
2551
|
+
description: string
|
|
2552
|
+
leadName: string | null
|
|
2553
|
+
activeTasks: Array<{ id: string, title: string, state: string }>
|
|
2554
|
+
recentCompleted: Array<{ title: string }>
|
|
2551
2555
|
}> {
|
|
2552
2556
|
this.requireMember(channelId, agentId)
|
|
2553
2557
|
const sender = this.deps.repos.channelAgents.findByChannelAgent(channelId, agentId)
|
|
@@ -2582,7 +2586,12 @@ export class AgentChannelManager {
|
|
|
2582
2586
|
* 无需跨 channel 发信;查无所得而有协作必要时,再由 lead 发起跨 channel 通信。
|
|
2583
2587
|
*/
|
|
2584
2588
|
recallOtherTeamsMemory(channelId: string, agentId: string, input: { query: string, limit?: number }): Array<{
|
|
2585
|
-
channelId: string
|
|
2589
|
+
channelId: string
|
|
2590
|
+
channelName: string
|
|
2591
|
+
title: string
|
|
2592
|
+
content: string
|
|
2593
|
+
importance: number
|
|
2594
|
+
createdAt: string
|
|
2586
2595
|
}> {
|
|
2587
2596
|
this.requireMember(channelId, agentId)
|
|
2588
2597
|
const q = input.query.trim()
|
|
@@ -13,6 +13,7 @@ import type { MemoryRow } from '../db/database'
|
|
|
13
13
|
import type { WorkspaceTask } from '../types/task'
|
|
14
14
|
import type { A2AMessage, Part } from '../types/a2a'
|
|
15
15
|
import type { EmbeddingProvider } from './embedding-provider'
|
|
16
|
+
import { memorySettings } from '../settings'
|
|
16
17
|
|
|
17
18
|
const W_RELEVANCE = 0.5
|
|
18
19
|
const W_RECENCY = 0.3
|
|
@@ -44,12 +45,18 @@ const RECENCY_HALF_LIFE_DAYS: Record<string, number> = {
|
|
|
44
45
|
}
|
|
45
46
|
const CONTENT_STORE_LIMIT = 800
|
|
46
47
|
|
|
47
|
-
/** 环境变量安全数值(非有限/非正数 → fallback;防 NaN/0 破坏预算与定时器)
|
|
48
|
+
/** 环境变量安全数值(非有限/非正数 → fallback;防 NaN/0 破坏预算与定时器)。
|
|
49
|
+
* @deprecated 配置驱动迁移后仅存量测试使用;新代码读 memorySettings().*
|
|
48
50
|
export function envNum(name: string, fallback: number): number {
|
|
49
51
|
const n = Number(process.env[name])
|
|
50
52
|
return Number.isFinite(n) && n > 0 ? n : fallback
|
|
51
53
|
}
|
|
52
54
|
|
|
55
|
+
/** memory 组配置(单次解析,进程缓存;env AW_MEMORY_* 经 schema 描述符通用覆盖) */
|
|
56
|
+
function memoryCfg() {
|
|
57
|
+
return memorySettings()
|
|
58
|
+
}
|
|
59
|
+
|
|
53
60
|
export interface AgentMemoryOptions {
|
|
54
61
|
channelId: string
|
|
55
62
|
agentId: string
|
|
@@ -264,10 +271,10 @@ export class AgentMemory {
|
|
|
264
271
|
async recall(query: string, recallOpts: RecallOptions = {}): Promise<string | null> {
|
|
265
272
|
const doTouch = recallOpts.touch !== false
|
|
266
273
|
// 显式 budgetTokens(实例/调用级)= 整块记忆硬顶(L0 简报+L1 引子+提示全计入);
|
|
267
|
-
// 未显式设置 = 双预算:L1 引子 ≤
|
|
274
|
+
// 未显式设置 = 双预算:L1 引子 ≤ memory.primer_tokens(300),整块 ≤ memory.inject_total(500)
|
|
268
275
|
const explicit = recallOpts.budgetTokens ?? this.opts.budgetTokens
|
|
269
|
-
const budget = explicit ??
|
|
270
|
-
const totalBudget = explicit ??
|
|
276
|
+
const budget = explicit ?? memoryCfg().primer_tokens
|
|
277
|
+
const totalBudget = explicit ?? memoryCfg().inject_total
|
|
271
278
|
const scope = recallOpts.scope ?? 'auto'
|
|
272
279
|
const scored = await this.rank(query, scope, { excludeCurated: true, relatedTaskIds: recallOpts.relatedTaskIds })
|
|
273
280
|
|
|
@@ -624,9 +631,9 @@ export function runMemoryMaintenance(
|
|
|
624
631
|
repo: MemoryRepo,
|
|
625
632
|
opts: { expireDays?: number, cap?: number } = {},
|
|
626
633
|
): MaintenanceResult {
|
|
627
|
-
const expireDays = opts.expireDays ??
|
|
628
|
-
const sessionExpireDays =
|
|
629
|
-
const cap = opts.cap ??
|
|
634
|
+
const expireDays = opts.expireDays ?? memoryCfg().expire_days
|
|
635
|
+
const sessionExpireDays = memoryCfg().expire_session_days
|
|
636
|
+
const cap = opts.cap ?? memoryCfg().cap
|
|
630
637
|
const now = Date.now()
|
|
631
638
|
let deletedExpired = 0
|
|
632
639
|
let evicted = 0
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 运行语义设置读取(服务端唯一入口;配置驱动 first)。
|
|
3
|
+
*
|
|
4
|
+
* 与构建期 loadConfig(app/config)解耦:server 树内引用树外模块会触发 nitro dev
|
|
5
|
+
* 的外部化缺陷(相对路径溢出盘符根),故本模块走 @/shared 别名 + 描述符体系。
|
|
6
|
+
*
|
|
7
|
+
* 值的解析链(shared/config/schema.json 描述符为单一事实来源):
|
|
8
|
+
* 描述符默认 < config.yml < <configRoot>/runtime-settings.json < 环境变量(AW_<键> / 历史别名)
|
|
9
|
+
* 键=描述符 key(config.yml 中同形;zod 于构建期校验,运行时以描述符默认兜底)。
|
|
10
|
+
* 结果进程内缓存 3s(键均为 restart 级;热改配置重启生效,无需更低延迟)。
|
|
11
|
+
*/
|
|
12
|
+
import { join } from 'node:path'
|
|
13
|
+
import {
|
|
14
|
+
loadEffective,
|
|
15
|
+
} from '@/shared/config/engine.mjs'
|
|
16
|
+
import { resolveRunMode } from '@/shared/config/home.mjs'
|
|
17
|
+
|
|
18
|
+
let cache: { at: number, effective: Record<string, unknown> } | null = null
|
|
19
|
+
const TTL_MS = 3000
|
|
20
|
+
|
|
21
|
+
function effective(): Record<string, unknown> {
|
|
22
|
+
if (cache && Date.now() - cache.at < TTL_MS) return cache.effective
|
|
23
|
+
const runMode = resolveRunMode({
|
|
24
|
+
cwd: process.cwd(),
|
|
25
|
+
packageRoot: process.env.AW_PACKAGE_ROOT ?? process.cwd(),
|
|
26
|
+
env: process.env,
|
|
27
|
+
})
|
|
28
|
+
const eff = loadEffective({
|
|
29
|
+
configPath: runMode.configPath,
|
|
30
|
+
settingsPath: runMode.settingsPath ?? join(runMode.configRoot, 'runtime-settings.json'),
|
|
31
|
+
env: process.env,
|
|
32
|
+
})
|
|
33
|
+
cache = { at: Date.now(), effective: eff.effective }
|
|
34
|
+
return eff.effective
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/** 按描述符键读单值(键必已注册 schema.json;缺键 = 描述符默认) */
|
|
38
|
+
export function settingOf(key: string): unknown {
|
|
39
|
+
return effective()[key]
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/** 聚合组(前缀匹配;dotted 键 → 平铺键名,如 memory.primer_tokens → { primer_tokens }) */
|
|
43
|
+
function section<G extends string>(group: string): G {
|
|
44
|
+
const out: Record<string, unknown> = {}
|
|
45
|
+
const prefix = `${group}.`
|
|
46
|
+
for (const [k, v] of Object.entries(effective())) {
|
|
47
|
+
if (k.startsWith(prefix)) out[k.slice(prefix.length)] = v
|
|
48
|
+
}
|
|
49
|
+
return out as G
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
// ---------- 类型化组(形状与 app/config zod、schema.json 描述符三处一致) ----------
|
|
53
|
+
|
|
54
|
+
export interface MemorySettings {
|
|
55
|
+
primer_tokens: number
|
|
56
|
+
inject_total: number
|
|
57
|
+
maintenance_ms: number
|
|
58
|
+
expire_days: number
|
|
59
|
+
expire_session_days: number
|
|
60
|
+
cap: number
|
|
61
|
+
reflect_trigger: number
|
|
62
|
+
embed_base_url: string
|
|
63
|
+
embed_model: string
|
|
64
|
+
embed_api_key: string
|
|
65
|
+
}
|
|
66
|
+
export interface OmpSettings {
|
|
67
|
+
compact_enabled: boolean
|
|
68
|
+
compact_threshold: number
|
|
69
|
+
compact_min_interval_ms: number
|
|
70
|
+
compact_wait_ms: number
|
|
71
|
+
}
|
|
72
|
+
export interface DcwSettings {
|
|
73
|
+
rollback_cooldown_ms: number
|
|
74
|
+
rollback_min_window_ms: number
|
|
75
|
+
rollback_baseline_ms: number
|
|
76
|
+
rollback_stale_ms: number
|
|
77
|
+
}
|
|
78
|
+
export interface WorkshopSettings {
|
|
79
|
+
idle_sweep_ms: number
|
|
80
|
+
idle_grace_ms: number
|
|
81
|
+
}
|
|
82
|
+
export interface BackupSettings {
|
|
83
|
+
disabled: boolean
|
|
84
|
+
interval_hours: number
|
|
85
|
+
keep: number
|
|
86
|
+
}
|
|
87
|
+
export interface RetentionSettings {
|
|
88
|
+
disabled: boolean
|
|
89
|
+
events_days: number
|
|
90
|
+
messages_days: number
|
|
91
|
+
audit_days: number
|
|
92
|
+
approval_days: number
|
|
93
|
+
}
|
|
94
|
+
export interface LogSettings {
|
|
95
|
+
level: 'debug' | 'info' | 'warn' | 'error'
|
|
96
|
+
}
|
|
97
|
+
export interface DaqRuntimeSettings {
|
|
98
|
+
mqtt: {
|
|
99
|
+
host: string
|
|
100
|
+
port: number
|
|
101
|
+
username: string
|
|
102
|
+
password: string
|
|
103
|
+
secure: boolean
|
|
104
|
+
caFile: string
|
|
105
|
+
qos: number
|
|
106
|
+
rejectUnauthorized: boolean
|
|
107
|
+
}
|
|
108
|
+
tsRetentionH: number
|
|
109
|
+
frameRetentionH: number
|
|
110
|
+
alarmWebhookUrl: string
|
|
111
|
+
alarmEscalateMinutes: number
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
export const memorySettings = (): MemorySettings => section<MemorySettings>('memory')
|
|
115
|
+
export const ompSettings = (): OmpSettings => section<OmpSettings>('omp')
|
|
116
|
+
export const dcwSettings = (): DcwSettings => section<DcwSettings>('dcw')
|
|
117
|
+
export const workshopSettings = (): WorkshopSettings => section<WorkshopSettings>('workshop')
|
|
118
|
+
export const backupSettings = (): BackupSettings => section<BackupSettings>('backup')
|
|
119
|
+
export const retentionSettings = (): RetentionSettings => section<RetentionSettings>('retention')
|
|
120
|
+
export const logSettings = (): LogSettings => section<LogSettings>('log')
|
|
121
|
+
export function daqRuntimeSettings(): DaqRuntimeSettings {
|
|
122
|
+
const e = effective()
|
|
123
|
+
const get = (k: string, dflt: unknown): unknown => (e[`daq.${k}`] === undefined ? dflt : e[`daq.${k}`])
|
|
124
|
+
return {
|
|
125
|
+
mqtt: {
|
|
126
|
+
host: String(get('mqtt.host', '127.0.0.1')),
|
|
127
|
+
port: Number(get('mqtt.port', 1883)),
|
|
128
|
+
username: String(get('mqtt.username', '')),
|
|
129
|
+
password: String(get('mqtt.password', '')),
|
|
130
|
+
secure: Boolean(get('mqtt.secure', false)),
|
|
131
|
+
caFile: String(get('mqtt.caFile', '')),
|
|
132
|
+
qos: Number(get('mqtt.qos', 0)),
|
|
133
|
+
rejectUnauthorized: Boolean(get('mqtt.rejectUnauthorized', true)),
|
|
134
|
+
},
|
|
135
|
+
tsRetentionH: Number(get('tsRetentionH', 168)),
|
|
136
|
+
frameRetentionH: Number(get('frameRetentionH', 720)),
|
|
137
|
+
alarmWebhookUrl: String(get('alarmWebhookUrl', '')),
|
|
138
|
+
alarmEscalateMinutes: Number(get('alarmEscalateMinutes', 15)),
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
export function securityHitlTimeoutMs(): number {
|
|
142
|
+
return Number(effective()['security.hitl_timeout_ms'] ?? 180_000)
|
|
143
|
+
}
|
package/shared/config/engine.mjs
CHANGED
|
@@ -61,6 +61,14 @@ export function loadDescriptors() {
|
|
|
61
61
|
resolve(process.cwd(), 'shared', 'config', 'schema.json'),
|
|
62
62
|
resolve(process.cwd(), 'config', 'schema.json'),
|
|
63
63
|
]
|
|
64
|
+
// 启动器注入的载荷根(start.mjs / dev-guard 恒设置;全局安装 = 包根,shared/ 随包发布)
|
|
65
|
+
if (process.env.AW_PACKAGE_ROOT) {
|
|
66
|
+
candidates.push(join(process.env.AW_PACKAGE_ROOT, 'shared', 'config', 'schema.json'))
|
|
67
|
+
}
|
|
68
|
+
// 用户级兜底(home 中枢,AW_HOME 可重定向)
|
|
69
|
+
if (process.env.AW_HOME) {
|
|
70
|
+
candidates.push(join(process.env.AW_HOME, 'shared', 'config', 'schema.json'))
|
|
71
|
+
}
|
|
64
72
|
for (const candidate of candidates) {
|
|
65
73
|
try {
|
|
66
74
|
if (existsSync(candidate)) {
|
|
@@ -203,8 +211,12 @@ export function envOverridesFromEnv(env = process.env, descriptors = loadDescrip
|
|
|
203
211
|
const out = {}
|
|
204
212
|
for (const desc of descriptors) {
|
|
205
213
|
const varName = `AW_${desc.key.toUpperCase().replace(/\./g, '_')}`
|
|
206
|
-
|
|
207
|
-
|
|
214
|
+
// aliases:历史环境变量名兼容(迁移前已在用的非 AW_ 前缀/异序名,如 DAQ_FRAME_RETENTION_H;
|
|
215
|
+
// 优先级 AW_<KEY> > aliases 中声明顺序)
|
|
216
|
+
const legacy = (desc.aliases ?? []).map(a => env[a]).find(v => v !== undefined)
|
|
217
|
+
const rawEnv = env[varName] !== undefined ? env[varName] : legacy
|
|
218
|
+
if (rawEnv !== undefined) {
|
|
219
|
+
const coerced = coerceValue(desc, rawEnv)
|
|
208
220
|
if (coerced !== null) out[desc.key] = coerced
|
|
209
221
|
}
|
|
210
222
|
}
|
|
@@ -20,6 +20,7 @@
|
|
|
20
20
|
{ "key": "i18n.defaultLocale", "type": "select", "group": "i18n", "label": "默认语言", "labelKey": "settings.runtime.i18n.defaultLocale", "description": "未做本地选择时的界面语言", "applies": "live", "default": "zh-CN", "options": ["zh-CN", "en"] },
|
|
21
21
|
|
|
22
22
|
{ "key": "security.approvalGate", "type": "boolean", "group": "security", "label": "高危操作双人复核", "labelKey": "settings.runtime.security.approvalGate", "description": "R3:开启后写控/删除等高风险操作需另一位管理员批核", "applies": "live", "default": false },
|
|
23
|
+
{ "key": "security.hitl_timeout_ms", "type": "number", "group": "security", "label": "HITL 审批超时(ms)", "labelKey": "settings.runtime.security.hitlTimeoutMs", "description": "手动确认模式下发审批的等待超时(超时按拒绝收敛)", "applies": "restart", "default": 180000, "min": 1000, "max": 86400000, "aliases": ["HITL_TIMEOUT_MS"] },
|
|
23
24
|
|
|
24
25
|
{ "key": "daq.startInfrastructure", "type": "select", "group": "daq", "label": "数采基础设施拉起策略", "labelKey": "settings.runtime.daq.startInfrastructure", "description": "auto=启动探测,不通且有 Docker 则自动拉起;always=仅 Docker 拉起;never=只直连", "applies": "live", "default": "auto", "options": ["auto", "always", "never"] },
|
|
25
26
|
{ "key": "daq.mqtt.host", "type": "string", "group": "daq", "label": "MQTT Broker 地址", "labelKey": "settings.runtime.daq.mqttHost", "description": "数采事件总线 MQTT 主机", "applies": "restart", "default": "127.0.0.1" },
|
|
@@ -30,6 +31,52 @@
|
|
|
30
31
|
{ "key": "daq.objectstore.port", "type": "number", "group": "daq", "label": "对象存储端口", "labelKey": "settings.runtime.daq.osPort", "description": "MinIO S3 API 端口", "applies": "restart", "default": 9000, "min": 1, "max": 65535 },
|
|
31
32
|
{ "key": "daq.objectstore.accessKey", "type": "string", "group": "daq", "label": "对象存储 AccessKey", "labelKey": "settings.runtime.daq.osAccess", "description": "MinIO 访问账号", "applies": "restart", "default": "awshop" },
|
|
32
33
|
{ "key": "daq.objectstore.secretKey", "type": "string", "group": "daq", "label": "对象存储 SecretKey", "labelKey": "settings.runtime.daq.osSecret", "description": "MinIO 访问密钥", "applies": "restart", "default": "awshop-secret" },
|
|
33
|
-
{ "key": "daq.objectstore.bucket", "type": "string", "group": "daq", "label": "对象存储桶", "labelKey": "settings.runtime.daq.osBucket", "description": "图像帧存储桶(不存在时自动创建)", "applies": "restart", "default": "daq" }
|
|
34
|
+
{ "key": "daq.objectstore.bucket", "type": "string", "group": "daq", "label": "对象存储桶", "labelKey": "settings.runtime.daq.osBucket", "description": "图像帧存储桶(不存在时自动创建)", "applies": "restart", "default": "daq" },
|
|
35
|
+
|
|
36
|
+
{ "key": "daq.mqtt.qos", "type": "number", "group": "daq", "label": "MQTT QoS", "labelKey": "settings.runtime.daq.mqttQos", "description": "数采事件总线发布 QoS(0/1/2)", "applies": "restart", "default": 0, "min": 0, "max": 2, "aliases": ["DAQ_MQTT_QOS"] },
|
|
37
|
+
{ "key": "daq.mqtt.username", "type": "string", "group": "daq", "label": "MQTT 用户名", "labelKey": "settings.runtime.daq.mqttUsername", "description": "数采事件总线 MQTT 鉴权用户名(空=匿名)", "applies": "restart", "default": "", "aliases": ["DAQ_MQTT_USERNAME"] },
|
|
38
|
+
{ "key": "daq.mqtt.password", "type": "string", "group": "daq", "label": "MQTT 密码", "labelKey": "settings.runtime.daq.mqttPassword", "description": "数采事件总线 MQTT 鉴权密码", "applies": "restart", "default": "", "aliases": ["DAQ_MQTT_PASSWORD"] },
|
|
39
|
+
{ "key": "daq.mqtt.caFile", "type": "string", "group": "daq", "label": "MQTT CA 证书", "labelKey": "settings.runtime.daq.mqttCaFile", "description": "mqtts 自签 CA 证书文件路径", "applies": "restart", "default": "", "aliases": ["DAQ_MQTT_CA_FILE"] },
|
|
40
|
+
{ "key": "daq.mqtt.rejectUnauthorized", "type": "boolean", "group": "daq", "label": "MQTT 校验证书", "labelKey": "settings.runtime.daq.mqttRejectUnauthorized", "description": "mqtts 是否校验服务端证书(自签调试可关)", "applies": "restart", "default": true, "aliases": ["DAQ_MQTT_REJECT_UNAUTHORIZED"] },
|
|
41
|
+
{ "key": "daq.tsRetentionH", "type": "number", "group": "daq", "label": "标量时序保留(h)", "labelKey": "settings.runtime.daq.tsRetentionH", "description": "SQLite 仿真库标量样本保留小时数(Timescale 由 hypertable 策略管理)", "applies": "restart", "default": 168, "min": 1, "max": 8760, "aliases": ["DAQ_TS_RETENTION_H"] },
|
|
42
|
+
{ "key": "daq.frameRetentionH", "type": "number", "group": "daq", "label": "帧元数据保留(h)", "labelKey": "settings.runtime.daq.frameRetentionH", "description": "daq_frames 帧元数据保留小时数", "applies": "restart", "default": 720, "min": 1, "max": 8760, "aliases": ["DAQ_FRAME_RETENTION_H"] },
|
|
43
|
+
{ "key": "daq.alarmWebhookUrl", "type": "string", "group": "daq", "label": "告警 Webhook", "labelKey": "settings.runtime.daq.alarmWebhookUrl", "description": "告警升级推送的 Webhook 地址(空=不推送)", "applies": "restart", "default": "", "aliases": ["ALARM_WEBHOOK_URL"] },
|
|
44
|
+
{ "key": "daq.alarmEscalateMinutes", "type": "number", "group": "daq", "label": "告警升级时限(min)", "labelKey": "settings.runtime.daq.alarmEscalateMinutes", "description": "未确认告警升级通知的时延(分钟)", "applies": "restart", "default": 15, "min": 1, "max": 1440, "aliases": ["ALARM_ESCALATE_MINUTES"] },
|
|
45
|
+
|
|
46
|
+
{ "key": "memory.primer_tokens", "type": "number", "group": "memory", "label": "记忆引子预算", "labelKey": "settings.runtime.memory.primerTokens", "description": "注入 Agent 上下文的记忆引子 token 预算(AW_MEMORY_PRIMER_TOKENS)", "applies": "restart", "default": 300, "min": 50, "max": 4000 },
|
|
47
|
+
{ "key": "memory.inject_total", "type": "number", "group": "memory", "label": "记忆注入硬顶", "labelKey": "settings.runtime.memory.injectTotal", "description": "单次记忆注入总 token 硬顶(AW_MEMORY_INJECT_TOTAL)", "applies": "restart", "default": 500, "min": 100, "max": 8000 },
|
|
48
|
+
{ "key": "memory.maintenance_ms", "type": "number", "group": "memory", "label": "记忆维护周期(ms)", "labelKey": "settings.runtime.memory.maintenanceMs", "description": "记忆维护(衰减/驱逐/策展)调度周期", "applies": "restart", "default": 21600000, "min": 60000, "max": 604800000 },
|
|
49
|
+
{ "key": "memory.expire_days", "type": "number", "group": "memory", "label": "情景记忆过期(天)", "labelKey": "settings.runtime.memory.expireDays", "description": "情景任务记忆默认保留天数", "applies": "restart", "default": 180, "min": 1, "max": 3650 },
|
|
50
|
+
{ "key": "memory.expire_session_days", "type": "number", "group": "memory", "label": "会话记忆过期(天)", "labelKey": "settings.runtime.memory.expireSessionDays", "description": "会话级记忆保留天数", "applies": "restart", "default": 14, "min": 1, "max": 365 },
|
|
51
|
+
{ "key": "memory.cap", "type": "number", "group": "memory", "label": "记忆条目上限", "labelKey": "settings.runtime.memory.cap", "description": "单通道记忆条目驱逐上限", "applies": "restart", "default": 500, "min": 50, "max": 50000 },
|
|
52
|
+
{ "key": "memory.reflect_trigger", "type": "number", "group": "memory", "label": "反思触发阈值", "labelKey": "settings.runtime.memory.reflectTrigger", "description": "空闲反思(sleep-time compute)的已积压任务数触发阈值", "applies": "restart", "default": 8, "min": 1, "max": 100 },
|
|
53
|
+
{ "key": "memory.embed_base_url", "type": "string", "group": "memory", "label": "Embedding 端点", "labelKey": "settings.runtime.memory.embedBaseUrl", "description": "OpenAI 兼容 /embeddings 基址(空=向量分支关闭,纯 FTS 检索)", "applies": "restart", "default": "" },
|
|
54
|
+
{ "key": "memory.embed_model", "type": "string", "group": "memory", "label": "Embedding 模型", "labelKey": "settings.runtime.memory.embedModel", "description": "向量编码模型名", "applies": "restart", "default": "" },
|
|
55
|
+
{ "key": "memory.embed_api_key", "type": "string", "group": "memory", "label": "Embedding 密钥", "labelKey": "settings.runtime.memory.embedApiKey", "description": "Embedding 端点鉴权密钥(Bearer)", "applies": "restart", "default": "" },
|
|
56
|
+
|
|
57
|
+
{ "key": "omp.compact_enabled", "type": "boolean", "group": "omp", "label": "上下文自动压缩", "labelKey": "settings.runtime.omp.compactEnabled", "description": "上下文越过阈值时自动压缩(可被 env 显式关闭)", "applies": "restart", "default": true },
|
|
58
|
+
{ "key": "omp.compact_threshold", "type": "number", "group": "omp", "label": "压缩阈值", "labelKey": "settings.runtime.omp.compactThreshold", "description": "触发压缩的上下文占用比例(0~1)", "applies": "restart", "default": 0.7, "min": 0.3, "max": 0.95 },
|
|
59
|
+
{ "key": "omp.compact_min_interval_ms", "type": "number", "group": "omp", "label": "压缩最小间隔(ms)", "labelKey": "settings.runtime.omp.compactMinIntervalMs", "description": "两次自动压缩之间的最小间隔", "applies": "restart", "default": 300000, "min": 30000, "max": 3600000 },
|
|
60
|
+
{ "key": "omp.compact_wait_ms", "type": "number", "group": "omp", "label": "压缩等待超时(ms)", "labelKey": "settings.runtime.omp.compactWaitMs", "description": "等待 compaction_end 完成事件的超时", "applies": "restart", "default": 120000, "min": 10000, "max": 600000 },
|
|
61
|
+
|
|
62
|
+
{ "key": "dcw.rollback_cooldown_ms", "type": "number", "group": "dcw", "label": "回退冷却(ms)", "labelKey": "settings.runtime.dcw.rollbackCooldownMs", "description": "回退执行后的同向冷却窗", "applies": "restart", "default": 300000, "min": 0, "max": 3600000 },
|
|
63
|
+
{ "key": "dcw.rollback_min_window_ms", "type": "number", "group": "dcw", "label": "回退最小观察窗(ms)", "labelKey": "settings.runtime.dcw.rollbackMinWindowMs", "description": "开记录后允许判定的最小观察窗", "applies": "restart", "default": 120000, "min": 0, "max": 3600000 },
|
|
64
|
+
{ "key": "dcw.rollback_baseline_ms", "type": "number", "group": "dcw", "label": "基线稳定窗(ms)", "labelKey": "settings.runtime.dcw.rollbackBaselineMs", "description": "上一稳定锚的稳定时间要求", "applies": "restart", "default": 600000, "min": 0, "max": 7200000 },
|
|
65
|
+
{ "key": "dcw.rollback_stale_ms", "type": "number", "group": "dcw", "label": "open 记录过期(ms)", "labelKey": "settings.runtime.dcw.rollbackStaleMs", "description": "open 优化记录多久后允许他人接管", "applies": "restart", "default": 1800000, "min": 60000, "max": 14400000 },
|
|
66
|
+
|
|
67
|
+
{ "key": "workshop.idle_sweep_ms", "type": "number", "group": "workshop", "label": "空产线扫描(ms)", "labelKey": "settings.runtime.workshop.idleSweepMs", "description": "车间空闲产线扫描周期", "applies": "restart", "default": 30000, "min": 5000, "max": 600000 },
|
|
68
|
+
{ "key": "workshop.idle_grace_ms", "type": "number", "group": "workshop", "label": "空闲宽限(ms)", "labelKey": "settings.runtime.workshop.idleGraceMs", "description": "产线空闲判定的宽限时长", "applies": "restart", "default": 120000, "min": 10000, "max": 3600000 },
|
|
69
|
+
|
|
70
|
+
{ "key": "backup.disabled", "type": "boolean", "group": "backup", "label": "禁用自动备份", "labelKey": "settings.runtime.backup.disabled", "description": "关闭运行数据自动备份", "applies": "restart", "default": false, "aliases": ["BACKUP_DISABLED"] },
|
|
71
|
+
{ "key": "backup.interval_hours", "type": "number", "group": "backup", "label": "备份间隔(h)", "labelKey": "settings.runtime.backup.intervalHours", "description": "自动备份间隔小时数", "applies": "restart", "default": 24, "min": 1, "max": 720, "aliases": ["BACKUP_INTERVAL_HOURS"] },
|
|
72
|
+
{ "key": "backup.keep", "type": "number", "group": "backup", "label": "备份保留份数", "labelKey": "settings.runtime.backup.keep", "description": "保留的最近备份份数", "applies": "restart", "default": 7, "min": 1, "max": 100, "aliases": ["BACKUP_KEEP"] },
|
|
73
|
+
|
|
74
|
+
{ "key": "retention.disabled", "type": "boolean", "group": "retention", "label": "禁用数据保留策略", "labelKey": "settings.runtime.retention.disabled", "description": "关闭过期数据清理(调试用)", "applies": "restart", "default": false, "aliases": ["RETENTION_DISABLED", "AW_RETENTION_DISABLED"] },
|
|
75
|
+
{ "key": "retention.events_days", "type": "number", "group": "retention", "label": "事件保留(天)", "labelKey": "settings.runtime.retention.eventsDays", "description": "WS 事件流保留天数", "applies": "restart", "default": 7, "min": 1, "max": 365, "aliases": ["AW_EVENTS_RETENTION_D"] },
|
|
76
|
+
{ "key": "retention.messages_days", "type": "number", "group": "retention", "label": "消息保留(天)", "labelKey": "settings.runtime.retention.messagesDays", "description": "Channel 消息保留天数", "applies": "restart", "default": 30, "min": 1, "max": 3650 },
|
|
77
|
+
{ "key": "retention.audit_days", "type": "number", "group": "retention", "label": "审计日志保留(天)", "labelKey": "settings.runtime.retention.auditDays", "description": "审计日志保留天数(合规观察期,从严保留)", "applies": "restart", "default": 90, "min": 1, "max": 3650 },
|
|
78
|
+
{ "key": "retention.approval_days", "type": "number", "group": "retention", "label": "审批历史保留(天)", "labelKey": "settings.runtime.retention.approvalDays", "description": "审批历史保留天数(历史裁决主张不可变,放宽)", "applies": "restart", "default": 180, "min": 1, "max": 3650 },
|
|
79
|
+
|
|
80
|
+
{ "key": "log.level", "type": "string", "group": "log", "label": "日志级别", "labelKey": "settings.runtime.log.level", "description": "服务端日志级别(debug/info/warn/error)", "applies": "restart", "default": "info", "aliases": ["AWSHOP_LOG_LEVEL"] }
|
|
34
81
|
]
|
|
35
82
|
}
|