agentworkshop 0.6.0 → 0.7.0

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.
Files changed (540) hide show
  1. package/.AgentWorkShop/prompts/host-tools.json +17 -0
  2. package/.env.example +37 -0
  3. package/.output/.AgentWorkShop/prompts/host-tools.json +17 -0
  4. package/.output/nitro.json +1 -1
  5. package/.output/public/_nuxt/{Bc_mM2cU.js → BH0Z05CS.js} +1 -1
  6. package/.output/public/_nuxt/Bxgaym6j.js +1 -0
  7. package/.output/public/_nuxt/{DRlJ2-4p.js → By-LNp3k.js} +1 -1
  8. package/.output/public/_nuxt/{C2QSTAWf.js → Bz40vyZS.js} +1 -1
  9. package/.output/public/_nuxt/{CwS_UHeH.js → CS8R0_J3.js} +1 -1
  10. package/.output/public/_nuxt/{ClptO7LA.js → CUxV8Bw_.js} +1 -1
  11. package/.output/public/_nuxt/CXmkVXS5.js +1 -0
  12. package/.output/public/_nuxt/DC-QMEk1.js +2 -0
  13. package/.output/public/_nuxt/{C-Y5ydB6.js → Dgp2wK2U.js} +6 -6
  14. package/.output/public/_nuxt/{Ck6tznoQ.js → DjqcbFBE.js} +1 -1
  15. package/.output/public/_nuxt/{B0haAGoq.js → GP2wXyuY.js} +1 -1
  16. package/.output/public/_nuxt/TownView.Bt33bo1M.css +1 -0
  17. package/.output/public/_nuxt/{MhK4buEJ.js → XVB9_zwP.js} +1 -1
  18. package/.output/public/_nuxt/_id_.BeqSLvl_.css +1 -0
  19. package/.output/public/_nuxt/builds/latest.json +1 -1
  20. package/.output/public/_nuxt/builds/meta/90ae66f6-f649-4b44-8df9-bcd9e9a957a2.json +1 -0
  21. package/.output/public/_nuxt/{Bq_KKxCg.js → i_MKObHo.js} +1 -1
  22. package/.output/public/_nuxt/settings.DeRNNUcP.css +1 -0
  23. package/.output/public/_nuxt/{CclO6GyL.js → tpDMVY5w.js} +1 -1
  24. package/.output/public/_nuxt/{C0FogB-p.js → zwdqvGN_.js} +1 -1
  25. package/.output/server/chunks/_/nitro.mjs +2672 -2350
  26. package/.output/server/chunks/_/nitro.mjs.map +1 -1
  27. package/.output/server/chunks/build/{TownView-D9yCQe1T.mjs → TownView-BkHxMiwZ.mjs} +168 -159
  28. package/.output/server/chunks/build/{TownView-D9yCQe1T.mjs.map → TownView-BkHxMiwZ.mjs.map} +1 -1
  29. package/.output/server/chunks/build/{_id_-xR3AChMO.mjs → _id_-Bna1_JuB.mjs} +5 -4
  30. package/.output/server/chunks/build/_id_-Bna1_JuB.mjs.map +1 -0
  31. package/.output/server/chunks/build/{_id_-CmKAEFHV.mjs → _id_-GnRJPykX.mjs} +161 -119
  32. package/.output/server/chunks/build/_id_-GnRJPykX.mjs.map +1 -0
  33. package/.output/server/chunks/build/{_wsId_-C45nVrl-.mjs → _wsId_-CzLDGT_V.mjs} +6 -5
  34. package/.output/server/chunks/build/{_wsId_-C45nVrl-.mjs.map → _wsId_-CzLDGT_V.mjs.map} +1 -1
  35. package/.output/server/chunks/build/agents-D4l1icvn.mjs +1 -0
  36. package/.output/server/chunks/build/agents-D4l1icvn.mjs.map +1 -1
  37. package/.output/server/chunks/build/channel-templates-DqjtC-R0.mjs +1 -0
  38. package/.output/server/chunks/build/channel-templates-DqjtC-R0.mjs.map +1 -1
  39. package/.output/server/chunks/build/{daq-Boz_dlAQ.mjs → daq-D_W59QOe.mjs} +6 -5
  40. package/.output/server/chunks/build/daq-D_W59QOe.mjs.map +1 -0
  41. package/.output/server/chunks/build/{dcw-wTRwBAUi.mjs → dcw-BTM5YU-B.mjs} +3 -2
  42. package/.output/server/chunks/build/dcw-BTM5YU-B.mjs.map +1 -0
  43. package/.output/server/chunks/build/default-Dt6xLdpd.mjs +1 -0
  44. package/.output/server/chunks/build/{logs-Cdi-eXlN.mjs → logs-CUQt1z7D.mjs} +4 -3
  45. package/.output/server/chunks/build/logs-CUQt1z7D.mjs.map +1 -0
  46. package/.output/server/chunks/build/monitor-yNoV98rf.mjs +1 -0
  47. package/.output/server/chunks/build/{pages-bWKy0ZsA.mjs → pages-DR2bzczM.mjs} +4 -3
  48. package/.output/server/chunks/build/pages-DR2bzczM.mjs.map +1 -0
  49. package/.output/server/chunks/build/plugins-B-ZNey0Z.mjs +1 -0
  50. package/.output/server/chunks/build/plugins-B-ZNey0Z.mjs.map +1 -1
  51. package/.output/server/chunks/build/{settings-C3T5hR2A.mjs → settings-Cr06lbRy.mjs} +26 -18
  52. package/.output/server/chunks/build/settings-Cr06lbRy.mjs.map +1 -0
  53. package/.output/server/chunks/build/teams-QR3BBF7A.mjs +1 -0
  54. package/.output/server/chunks/build/teams-QR3BBF7A.mjs.map +1 -1
  55. package/.output/server/chunks/build/tokens-DFvr_TLj.mjs +1 -0
  56. package/.output/server/chunks/build/tokens-DFvr_TLj.mjs.map +1 -1
  57. package/.output/server/chunks/build/{town-CKg6Qxba.mjs → town-BN4vQPb8.mjs} +6 -5
  58. package/.output/server/chunks/build/town-BN4vQPb8.mjs.map +1 -0
  59. package/.output/server/chunks/build/town-BUqRobze.mjs +1 -0
  60. package/.output/server/chunks/build/town-BUqRobze.mjs.map +1 -1
  61. package/.output/server/chunks/build/{useDaqStream-zHEptJQ_.mjs → useDaqStream-hwkhJHFU.mjs} +2 -2
  62. package/.output/server/chunks/build/{useDaqStream-zHEptJQ_.mjs.map → useDaqStream-hwkhJHFU.mjs.map} +1 -1
  63. package/.output/server/chunks/build/{useDcwStream-BkWDGaWp.mjs → useDcwStream-Bdew_yrr.mjs} +16 -1
  64. package/.output/server/chunks/build/useDcwStream-Bdew_yrr.mjs.map +1 -0
  65. package/.output/server/chunks/build/{useDeviceTwins-NhtXqSkU.mjs → useDeviceTwins-C6EBg9oN.mjs} +2 -2
  66. package/.output/server/chunks/build/{useDeviceTwins-NhtXqSkU.mjs.map → useDeviceTwins-C6EBg9oN.mjs.map} +1 -1
  67. package/.output/server/chunks/build/{useOpsLog-CU64VDg5.mjs → useOpsLog-DdCqKVVG.mjs} +2 -2
  68. package/.output/server/chunks/build/{useOpsLog-CU64VDg5.mjs.map → useOpsLog-DdCqKVVG.mjs.map} +1 -1
  69. package/.output/server/chunks/build/users-4FZ0yFUO.mjs +1 -0
  70. package/.output/server/chunks/build/users-4FZ0yFUO.mjs.map +1 -1
  71. package/.output/server/chunks/build/workshop-CLhwe5eo.mjs +1 -0
  72. package/.output/server/chunks/build/workshop-CLhwe5eo.mjs.map +1 -1
  73. package/.output/server/chunks/routes/api/health.get.mjs +1 -0
  74. package/.output/server/chunks/routes/api/health.get.mjs.map +1 -1
  75. package/.output/server/chunks/routes/api/index.get.mjs +1 -0
  76. package/.output/server/chunks/routes/api/index.get.mjs.map +1 -1
  77. package/.output/server/chunks/routes/api/index.post.mjs +1 -0
  78. package/.output/server/chunks/routes/api/index.post.mjs.map +1 -1
  79. package/.output/server/chunks/routes/api/mcp/workshop.mjs +1 -0
  80. package/.output/server/chunks/routes/api/mcp/workshop.mjs.map +1 -1
  81. package/.output/server/chunks/routes/api/metrics.mjs +1 -0
  82. package/.output/server/chunks/routes/api/metrics.mjs.map +1 -1
  83. package/.output/server/chunks/routes/api/plugins/_name/_...path_.mjs +1 -0
  84. package/.output/server/chunks/routes/api/plugins/_name/_...path_.mjs.map +1 -1
  85. package/.output/server/chunks/routes/api/plugins/client/_name_.get.mjs +1 -0
  86. package/.output/server/chunks/routes/api/plugins/client/_name_.get.mjs.map +1 -1
  87. package/.output/server/chunks/routes/api/plugins/manifest.get.mjs +1 -0
  88. package/.output/server/chunks/routes/api/plugins/manifest.get.mjs.map +1 -1
  89. package/.output/server/chunks/routes/api/system/config.get.mjs +1 -0
  90. package/.output/server/chunks/routes/api/system/config.get.mjs.map +1 -1
  91. package/.output/server/chunks/routes/api/system/index.get.mjs +1 -0
  92. package/.output/server/chunks/routes/api/system/index.get.mjs.map +1 -1
  93. package/.output/server/chunks/routes/api/system/index.patch.mjs +1 -0
  94. package/.output/server/chunks/routes/api/system/index.patch.mjs.map +1 -1
  95. package/.output/server/chunks/routes/api/system/monitor/terminal/ws.mjs +1 -0
  96. package/.output/server/chunks/routes/api/system/monitor/terminal/ws.mjs.map +1 -1
  97. package/.output/server/chunks/routes/api/system/monitor/terminate.post.mjs +1 -0
  98. package/.output/server/chunks/routes/api/system/monitor/terminate.post.mjs.map +1 -1
  99. package/.output/server/chunks/routes/api/system/monitor.get.mjs +1 -0
  100. package/.output/server/chunks/routes/api/system/monitor.get.mjs.map +1 -1
  101. package/.output/server/chunks/routes/api/system/settings/events.get.mjs +1 -0
  102. package/.output/server/chunks/routes/api/system/settings/events.get.mjs.map +1 -1
  103. package/.output/server/chunks/routes/api/system/settings/reset.post.mjs +1 -0
  104. package/.output/server/chunks/routes/api/system/settings/reset.post.mjs.map +1 -1
  105. package/.output/server/chunks/routes/api/users/_id_.delete.mjs +1 -0
  106. package/.output/server/chunks/routes/api/users/_id_.delete.mjs.map +1 -1
  107. package/.output/server/chunks/routes/api/users/_id_.get.mjs +1 -0
  108. package/.output/server/chunks/routes/api/users/_id_.get.mjs.map +1 -1
  109. package/.output/server/chunks/routes/api/users/_id_.put.mjs +1 -0
  110. package/.output/server/chunks/routes/api/users/_id_.put.mjs.map +1 -1
  111. package/.output/server/chunks/routes/api/users/index.get.mjs +1 -0
  112. package/.output/server/chunks/routes/api/users/index.get.mjs.map +1 -1
  113. package/.output/server/chunks/routes/api/users/index.post.mjs +1 -0
  114. package/.output/server/chunks/routes/api/users/index.post.mjs.map +1 -1
  115. package/.output/server/chunks/routes/api/users/login.post.mjs +1 -0
  116. package/.output/server/chunks/routes/api/users/login.post.mjs.map +1 -1
  117. package/.output/server/chunks/routes/api/users/logout.post.mjs +1 -0
  118. package/.output/server/chunks/routes/api/users/logout.post.mjs.map +1 -1
  119. package/.output/server/chunks/routes/api/users/me.get.mjs +1 -0
  120. package/.output/server/chunks/routes/api/users/me.get.mjs.map +1 -1
  121. package/.output/server/chunks/routes/api/users/register.post.mjs +1 -0
  122. package/.output/server/chunks/routes/api/users/register.post.mjs.map +1 -1
  123. package/.output/server/chunks/routes/api/users/tokens/_id/token.get.mjs +1 -0
  124. package/.output/server/chunks/routes/api/users/tokens/_id/token.get.mjs.map +1 -1
  125. package/.output/server/chunks/routes/api/users/tokens/_id_.delete.mjs +1 -0
  126. package/.output/server/chunks/routes/api/users/tokens/_id_.delete.mjs.map +1 -1
  127. package/.output/server/chunks/routes/api/users/tokens/_id_.patch.mjs +1 -0
  128. package/.output/server/chunks/routes/api/users/tokens/_id_.patch.mjs.map +1 -1
  129. package/.output/server/chunks/routes/api/workshop/_...path_.mjs +1 -0
  130. package/.output/server/chunks/routes/api/workshop/_...path_.mjs.map +1 -1
  131. package/.output/server/chunks/routes/api/workshop/a2a/_agentId/index.get.mjs +1 -0
  132. package/.output/server/chunks/routes/api/workshop/a2a/_agentId/index.get.mjs.map +1 -1
  133. package/.output/server/chunks/routes/api/workshop/a2a/_agentId/index.post.mjs +1 -0
  134. package/.output/server/chunks/routes/api/workshop/a2a/_agentId/index.post.mjs.map +1 -1
  135. package/.output/server/chunks/routes/api/workshop/a2a/send.post.mjs +1 -0
  136. package/.output/server/chunks/routes/api/workshop/a2a/send.post.mjs.map +1 -1
  137. package/.output/server/chunks/routes/api/workshop/agent-tools/approvals/_id/decide.post.mjs +1 -0
  138. package/.output/server/chunks/routes/api/workshop/agent-tools/approvals/_id/decide.post.mjs.map +1 -1
  139. package/.output/server/chunks/routes/api/workshop/agent-tools/bindings/_id_.delete.mjs +1 -0
  140. package/.output/server/chunks/routes/api/workshop/agent-tools/bindings/_id_.delete.mjs.map +1 -1
  141. package/.output/server/chunks/routes/api/workshop/agent-tools/bindings/_id_.patch.mjs +1 -0
  142. package/.output/server/chunks/routes/api/workshop/agent-tools/bindings/_id_.patch.mjs.map +1 -1
  143. package/.output/server/chunks/routes/api/workshop/agent-tools/index.get.mjs +1 -0
  144. package/.output/server/chunks/routes/api/workshop/agent-tools/index.get.mjs.map +1 -1
  145. package/.output/server/chunks/routes/api/workshop/agent-tools/index.post.mjs +1 -0
  146. package/.output/server/chunks/routes/api/workshop/agent-tools/index.post.mjs.map +1 -1
  147. package/.output/server/chunks/routes/api/workshop/agent-tools/index2.get.mjs +1 -0
  148. package/.output/server/chunks/routes/api/workshop/agent-tools/index2.get.mjs.map +1 -1
  149. package/.output/server/chunks/routes/api/workshop/agent-tools/invoke.post.mjs +1 -0
  150. package/.output/server/chunks/routes/api/workshop/agent-tools/invoke.post.mjs.map +1 -1
  151. package/.output/server/chunks/routes/api/workshop/agents/_id_.delete.mjs +1 -0
  152. package/.output/server/chunks/routes/api/workshop/agents/_id_.delete.mjs.map +1 -1
  153. package/.output/server/chunks/routes/api/workshop/agents/_id_.get.mjs +1 -0
  154. package/.output/server/chunks/routes/api/workshop/agents/_id_.get.mjs.map +1 -1
  155. package/.output/server/chunks/routes/api/workshop/agents/_id_.patch.mjs +1 -0
  156. package/.output/server/chunks/routes/api/workshop/agents/_id_.patch.mjs.map +1 -1
  157. package/.output/server/chunks/routes/api/workshop/agents/subscribe.post.mjs +1 -0
  158. package/.output/server/chunks/routes/api/workshop/agents/subscribe.post.mjs.map +1 -1
  159. package/.output/server/chunks/routes/api/workshop/approvals/_id/decide.post.mjs +1 -0
  160. package/.output/server/chunks/routes/api/workshop/approvals/_id/decide.post.mjs.map +1 -1
  161. package/.output/server/chunks/routes/api/workshop/assets/character/_id_.delete.mjs +1 -0
  162. package/.output/server/chunks/routes/api/workshop/assets/character/_id_.delete.mjs.map +1 -1
  163. package/.output/server/chunks/routes/api/workshop/assets/devices/_id_.delete.mjs +1 -0
  164. package/.output/server/chunks/routes/api/workshop/assets/devices/_id_.delete.mjs.map +1 -1
  165. package/.output/server/chunks/routes/api/workshop/assets/index.get.mjs +1 -0
  166. package/.output/server/chunks/routes/api/workshop/assets/index.get.mjs.map +1 -1
  167. package/.output/server/chunks/routes/api/workshop/assets/index.post.mjs +1 -0
  168. package/.output/server/chunks/routes/api/workshop/assets/index.post.mjs.map +1 -1
  169. package/.output/server/chunks/routes/api/workshop/assets/index2.get.mjs +1 -0
  170. package/.output/server/chunks/routes/api/workshop/assets/index2.get.mjs.map +1 -1
  171. package/.output/server/chunks/routes/api/workshop/assets/index2.post.mjs +1 -0
  172. package/.output/server/chunks/routes/api/workshop/assets/index2.post.mjs.map +1 -1
  173. package/.output/server/chunks/routes/api/workshop/audit.get.mjs +1 -0
  174. package/.output/server/chunks/routes/api/workshop/audit.get.mjs.map +1 -1
  175. package/.output/server/chunks/routes/api/workshop/caller.mjs +1 -0
  176. package/.output/server/chunks/routes/api/workshop/caller.mjs.map +1 -1
  177. package/.output/server/chunks/routes/api/workshop/channel-templates/_id/instantiate.post.mjs +1 -0
  178. package/.output/server/chunks/routes/api/workshop/channel-templates/_id/instantiate.post.mjs.map +1 -1
  179. package/.output/server/chunks/routes/api/workshop/channel-templates/_id_.delete.mjs +1 -0
  180. package/.output/server/chunks/routes/api/workshop/channel-templates/_id_.delete.mjs.map +1 -1
  181. package/.output/server/chunks/routes/api/workshop/channel-templates/_id_.get.mjs +1 -0
  182. package/.output/server/chunks/routes/api/workshop/channel-templates/_id_.get.mjs.map +1 -1
  183. package/.output/server/chunks/routes/api/workshop/channel-templates/_id_.patch.mjs +1 -0
  184. package/.output/server/chunks/routes/api/workshop/channel-templates/_id_.patch.mjs.map +1 -1
  185. package/.output/server/chunks/routes/api/workshop/channel-templates/from-channel.post.mjs +1 -0
  186. package/.output/server/chunks/routes/api/workshop/channel-templates/from-channel.post.mjs.map +1 -1
  187. package/.output/server/chunks/routes/api/workshop/channels/_id/activate.post.mjs +1 -0
  188. package/.output/server/chunks/routes/api/workshop/channels/_id/activate.post.mjs.map +1 -1
  189. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/index.get.mjs +1 -0
  190. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/index.get.mjs.map +1 -1
  191. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/index.post.mjs +1 -0
  192. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/index.post.mjs.map +1 -1
  193. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/memories/_memoryId_.delete.mjs +1 -0
  194. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/memories/_memoryId_.delete.mjs.map +1 -1
  195. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/memories/search.post.mjs +1 -0
  196. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/memories/search.post.mjs.map +1 -1
  197. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/model.patch.mjs +1 -0
  198. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/model.patch.mjs.map +1 -1
  199. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/position.patch.mjs +1 -0
  200. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/position.patch.mjs.map +1 -1
  201. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/range.patch.mjs +1 -0
  202. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/range.patch.mjs.map +1 -1
  203. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/stop.post.mjs +1 -0
  204. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/stop.post.mjs.map +1 -1
  205. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId_.delete.mjs +1 -0
  206. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId_.delete.mjs.map +1 -1
  207. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId_.patch.mjs +1 -0
  208. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId_.patch.mjs.map +1 -1
  209. package/.output/server/chunks/routes/api/workshop/channels/_id/events.get.mjs +1 -0
  210. package/.output/server/chunks/routes/api/workshop/channels/_id/events.get.mjs.map +1 -1
  211. package/.output/server/chunks/routes/api/workshop/channels/_id/index.get.mjs +1 -0
  212. package/.output/server/chunks/routes/api/workshop/channels/_id/index.get.mjs.map +1 -1
  213. package/.output/server/chunks/routes/api/workshop/channels/_id/index.post.mjs +1 -0
  214. package/.output/server/chunks/routes/api/workshop/channels/_id/index.post.mjs.map +1 -1
  215. package/.output/server/chunks/routes/api/workshop/channels/_id/index2.get.mjs +1 -0
  216. package/.output/server/chunks/routes/api/workshop/channels/_id/index2.get.mjs.map +1 -1
  217. package/.output/server/chunks/routes/api/workshop/channels/_id/index2.post.mjs +1 -0
  218. package/.output/server/chunks/routes/api/workshop/channels/_id/index2.post.mjs.map +1 -1
  219. package/.output/server/chunks/routes/api/workshop/channels/_id/index3.get.mjs +1 -0
  220. package/.output/server/chunks/routes/api/workshop/channels/_id/index3.get.mjs.map +1 -1
  221. package/.output/server/chunks/routes/api/workshop/channels/_id/index3.post.mjs +1 -0
  222. package/.output/server/chunks/routes/api/workshop/channels/_id/index3.post.mjs.map +1 -1
  223. package/.output/server/chunks/routes/api/workshop/channels/_id/index4.get.mjs +1 -0
  224. package/.output/server/chunks/routes/api/workshop/channels/_id/index4.get.mjs.map +1 -1
  225. package/.output/server/chunks/routes/api/workshop/channels/_id/index4.post.mjs +1 -0
  226. package/.output/server/chunks/routes/api/workshop/channels/_id/index4.post.mjs.map +1 -1
  227. package/.output/server/chunks/routes/api/workshop/channels/_id/memories/_memoryId_.delete.mjs +1 -0
  228. package/.output/server/chunks/routes/api/workshop/channels/_id/memories/_memoryId_.delete.mjs.map +1 -1
  229. package/.output/server/chunks/routes/api/workshop/channels/_id/queue.get.mjs +1 -0
  230. package/.output/server/chunks/routes/api/workshop/channels/_id/queue.get.mjs.map +1 -1
  231. package/.output/server/chunks/routes/api/workshop/channels/_id/terminals.get.mjs +1 -0
  232. package/.output/server/chunks/routes/api/workshop/channels/_id/terminals.get.mjs.map +1 -1
  233. package/.output/server/chunks/routes/api/workshop/channels/_id_.delete.mjs +1 -0
  234. package/.output/server/chunks/routes/api/workshop/channels/_id_.delete.mjs.map +1 -1
  235. package/.output/server/chunks/routes/api/workshop/channels/index.get.mjs +1 -0
  236. package/.output/server/chunks/routes/api/workshop/channels/index.get.mjs.map +1 -1
  237. package/.output/server/chunks/routes/api/workshop/channels/index.patch.mjs +1 -0
  238. package/.output/server/chunks/routes/api/workshop/channels/index.patch.mjs.map +1 -1
  239. package/.output/server/chunks/routes/api/workshop/channels.get.mjs +1 -0
  240. package/.output/server/chunks/routes/api/workshop/channels.get.mjs.map +1 -1
  241. package/.output/server/chunks/routes/api/workshop/channels.post.mjs +1 -0
  242. package/.output/server/chunks/routes/api/workshop/channels.post.mjs.map +1 -1
  243. package/.output/server/chunks/routes/api/workshop/daq/_id/bind.post.mjs +1 -0
  244. package/.output/server/chunks/routes/api/workshop/daq/_id/bind.post.mjs.map +1 -1
  245. package/.output/server/chunks/routes/api/workshop/daq/_id/frames/content.get.mjs +1 -0
  246. package/.output/server/chunks/routes/api/workshop/daq/_id/frames/content.get.mjs.map +1 -1
  247. package/.output/server/chunks/routes/api/workshop/daq/_id/frames.get.mjs +1 -0
  248. package/.output/server/chunks/routes/api/workshop/daq/_id/frames.get.mjs.map +1 -1
  249. package/.output/server/chunks/routes/api/workshop/daq/_id/samples.get.mjs +1 -0
  250. package/.output/server/chunks/routes/api/workshop/daq/_id/samples.get.mjs.map +1 -1
  251. package/.output/server/chunks/routes/api/workshop/daq/_id/test.post.mjs +1 -0
  252. package/.output/server/chunks/routes/api/workshop/daq/_id/test.post.mjs.map +1 -1
  253. package/.output/server/chunks/routes/api/workshop/daq/_id_.delete.mjs +1 -0
  254. package/.output/server/chunks/routes/api/workshop/daq/_id_.delete.mjs.map +1 -1
  255. package/.output/server/chunks/routes/api/workshop/daq/_id_.patch.mjs +1 -0
  256. package/.output/server/chunks/routes/api/workshop/daq/_id_.patch.mjs.map +1 -1
  257. package/.output/server/chunks/routes/api/workshop/daq/alarms/_id/ack.post.mjs +1 -0
  258. package/.output/server/chunks/routes/api/workshop/daq/alarms/_id/ack.post.mjs.map +1 -1
  259. package/.output/server/chunks/routes/api/workshop/daq/alarms.get.mjs +1 -0
  260. package/.output/server/chunks/routes/api/workshop/daq/alarms.get.mjs.map +1 -1
  261. package/.output/server/chunks/routes/api/workshop/daq/controller.post.mjs +1 -0
  262. package/.output/server/chunks/routes/api/workshop/daq/controller.post.mjs.map +1 -1
  263. package/.output/server/chunks/routes/api/workshop/daq/index.post.mjs +1 -0
  264. package/.output/server/chunks/routes/api/workshop/daq/index.post.mjs.map +1 -1
  265. package/.output/server/chunks/routes/api/workshop/daq/infra/reconnect.post.mjs +1 -0
  266. package/.output/server/chunks/routes/api/workshop/daq/infra/reconnect.post.mjs.map +1 -1
  267. package/.output/server/chunks/routes/api/workshop/daq/infra.get.mjs +1 -0
  268. package/.output/server/chunks/routes/api/workshop/daq/infra.get.mjs.map +1 -1
  269. package/.output/server/chunks/routes/api/workshop/daq/templates/_key_.delete.mjs +1 -0
  270. package/.output/server/chunks/routes/api/workshop/daq/templates/_key_.delete.mjs.map +1 -1
  271. package/.output/server/chunks/routes/api/workshop/daq/templates/_key_.patch.mjs +1 -0
  272. package/.output/server/chunks/routes/api/workshop/daq/templates/_key_.patch.mjs.map +1 -1
  273. package/.output/server/chunks/routes/api/workshop/daq/test-driver.post.mjs +1 -0
  274. package/.output/server/chunks/routes/api/workshop/daq/test-driver.post.mjs.map +1 -1
  275. package/.output/server/chunks/routes/api/workshop/dcw/_id/bind.post.mjs +1 -0
  276. package/.output/server/chunks/routes/api/workshop/dcw/_id/bind.post.mjs.map +1 -1
  277. package/.output/server/chunks/routes/api/workshop/dcw/_id/param-ledger.get.mjs +1 -0
  278. package/.output/server/chunks/routes/api/workshop/dcw/_id/param-ledger.get.mjs.map +1 -1
  279. package/.output/server/chunks/routes/api/workshop/dcw/_id/read.post.mjs +31 -0
  280. package/.output/server/chunks/routes/api/workshop/dcw/_id/read.post.mjs.map +1 -0
  281. package/.output/server/chunks/routes/api/workshop/dcw/_id/test.post.mjs +1 -0
  282. package/.output/server/chunks/routes/api/workshop/dcw/_id/test.post.mjs.map +1 -1
  283. package/.output/server/chunks/routes/api/workshop/dcw/_id/write.post.mjs +1 -0
  284. package/.output/server/chunks/routes/api/workshop/dcw/_id/write.post.mjs.map +1 -1
  285. package/.output/server/chunks/routes/api/workshop/dcw/_id_.delete.mjs +1 -0
  286. package/.output/server/chunks/routes/api/workshop/dcw/_id_.delete.mjs.map +1 -1
  287. package/.output/server/chunks/routes/api/workshop/dcw/_id_.patch.mjs +1 -0
  288. package/.output/server/chunks/routes/api/workshop/dcw/_id_.patch.mjs.map +1 -1
  289. package/.output/server/chunks/routes/api/workshop/dcw/controller.post.mjs +1 -0
  290. package/.output/server/chunks/routes/api/workshop/dcw/controller.post.mjs.map +1 -1
  291. package/.output/server/chunks/routes/api/workshop/dcw/index.get.mjs +1 -0
  292. package/.output/server/chunks/routes/api/workshop/dcw/index.get.mjs.map +1 -1
  293. package/.output/server/chunks/routes/api/workshop/dcw/index.post.mjs +1 -0
  294. package/.output/server/chunks/routes/api/workshop/dcw/index.post.mjs.map +1 -1
  295. package/.output/server/chunks/routes/api/workshop/dcw/index2.get.mjs +1 -0
  296. package/.output/server/chunks/routes/api/workshop/dcw/index2.get.mjs.map +1 -1
  297. package/.output/server/chunks/routes/api/workshop/dcw/index2.post.mjs +1 -0
  298. package/.output/server/chunks/routes/api/workshop/dcw/index2.post.mjs.map +1 -1
  299. package/.output/server/chunks/routes/api/workshop/dcw/index3.get.mjs +1 -0
  300. package/.output/server/chunks/routes/api/workshop/dcw/index3.get.mjs.map +1 -1
  301. package/.output/server/chunks/routes/api/workshop/dcw/index3.post.mjs +1 -0
  302. package/.output/server/chunks/routes/api/workshop/dcw/index3.post.mjs.map +1 -1
  303. package/.output/server/chunks/routes/api/workshop/dcw/index4.get.mjs +1 -0
  304. package/.output/server/chunks/routes/api/workshop/dcw/index4.get.mjs.map +1 -1
  305. package/.output/server/chunks/routes/api/workshop/dcw/index4.post.mjs +1 -0
  306. package/.output/server/chunks/routes/api/workshop/dcw/index4.post.mjs.map +1 -1
  307. package/.output/server/chunks/routes/api/workshop/dcw/index5.get.mjs +1 -0
  308. package/.output/server/chunks/routes/api/workshop/dcw/index5.get.mjs.map +1 -1
  309. package/.output/server/chunks/routes/api/workshop/dcw/journal/node/_nodeId/rollback.post.mjs +1 -0
  310. package/.output/server/chunks/routes/api/workshop/dcw/journal/node/_nodeId/rollback.post.mjs.map +1 -1
  311. package/.output/server/chunks/routes/api/workshop/dcw/line/query.get.mjs +1 -0
  312. package/.output/server/chunks/routes/api/workshop/dcw/line/query.get.mjs.map +1 -1
  313. package/.output/server/chunks/routes/api/workshop/dcw/lines/_id/start.post.mjs +1 -0
  314. package/.output/server/chunks/routes/api/workshop/dcw/lines/_id/start.post.mjs.map +1 -1
  315. package/.output/server/chunks/routes/api/workshop/dcw/lines/_id/stop.post.mjs +1 -0
  316. package/.output/server/chunks/routes/api/workshop/dcw/lines/_id/stop.post.mjs.map +1 -1
  317. package/.output/server/chunks/routes/api/workshop/dcw/lines/_id_.delete.mjs +1 -0
  318. package/.output/server/chunks/routes/api/workshop/dcw/lines/_id_.delete.mjs.map +1 -1
  319. package/.output/server/chunks/routes/api/workshop/dcw/lines/_id_.patch.mjs +1 -0
  320. package/.output/server/chunks/routes/api/workshop/dcw/lines/_id_.patch.mjs.map +1 -1
  321. package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id/judge.post.mjs +1 -0
  322. package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id/judge.post.mjs.map +1 -1
  323. package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id/rollback.post.mjs +1 -0
  324. package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id/rollback.post.mjs.map +1 -1
  325. package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id/series.get.mjs +1 -0
  326. package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id/series.get.mjs.map +1 -1
  327. package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id_.get.mjs +1 -0
  328. package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id_.get.mjs.map +1 -1
  329. package/.output/server/chunks/routes/api/workshop/dcw/products/_id_.delete.mjs +1 -0
  330. package/.output/server/chunks/routes/api/workshop/dcw/products/_id_.delete.mjs.map +1 -1
  331. package/.output/server/chunks/routes/api/workshop/dcw/products/_id_.patch.mjs +1 -0
  332. package/.output/server/chunks/routes/api/workshop/dcw/products/_id_.patch.mjs.map +1 -1
  333. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/apply.post.mjs +1 -0
  334. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/apply.post.mjs.map +1 -1
  335. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/mark-good.post.mjs +1 -0
  336. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/mark-good.post.mjs.map +1 -1
  337. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/rollback-good.post.mjs +1 -0
  338. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/rollback-good.post.mjs.map +1 -1
  339. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id_.delete.mjs +1 -0
  340. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id_.delete.mjs.map +1 -1
  341. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id_.patch.mjs +1 -0
  342. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id_.patch.mjs.map +1 -1
  343. package/.output/server/chunks/routes/api/workshop/dcw/runs/_id/close.post.mjs +1 -0
  344. package/.output/server/chunks/routes/api/workshop/dcw/runs/_id/close.post.mjs.map +1 -1
  345. package/.output/server/chunks/routes/api/workshop/dcw/runs/_id/data.get.mjs +1 -0
  346. package/.output/server/chunks/routes/api/workshop/dcw/runs/_id/data.get.mjs.map +1 -1
  347. package/.output/server/chunks/routes/api/workshop/dcw/runs/_id/rollback.post.mjs +1 -0
  348. package/.output/server/chunks/routes/api/workshop/dcw/runs/_id/rollback.post.mjs.map +1 -1
  349. package/.output/server/chunks/routes/api/workshop/dcw/templates/_key_.delete.mjs +1 -0
  350. package/.output/server/chunks/routes/api/workshop/dcw/templates/_key_.delete.mjs.map +1 -1
  351. package/.output/server/chunks/routes/api/workshop/dcw/templates/_key_.patch.mjs +1 -0
  352. package/.output/server/chunks/routes/api/workshop/dcw/templates/_key_.patch.mjs.map +1 -1
  353. package/.output/server/chunks/routes/api/workshop/dcw/test-driver.post.mjs +1 -0
  354. package/.output/server/chunks/routes/api/workshop/dcw/test-driver.post.mjs.map +1 -1
  355. package/.output/server/chunks/routes/api/workshop/device-twins/_id/control.post.mjs +1 -0
  356. package/.output/server/chunks/routes/api/workshop/device-twins/_id/control.post.mjs.map +1 -1
  357. package/.output/server/chunks/routes/api/workshop/device-twins/_id/telemetry.post.mjs +1 -0
  358. package/.output/server/chunks/routes/api/workshop/device-twins/_id/telemetry.post.mjs.map +1 -1
  359. package/.output/server/chunks/routes/api/workshop/device-twins/_id_.delete.mjs +1 -0
  360. package/.output/server/chunks/routes/api/workshop/device-twins/_id_.delete.mjs.map +1 -1
  361. package/.output/server/chunks/routes/api/workshop/device-twins/_id_.patch.mjs +1 -0
  362. package/.output/server/chunks/routes/api/workshop/device-twins/_id_.patch.mjs.map +1 -1
  363. package/.output/server/chunks/routes/api/workshop/fs/dirs.get.mjs +1 -0
  364. package/.output/server/chunks/routes/api/workshop/fs/dirs.get.mjs.map +1 -1
  365. package/.output/server/chunks/routes/api/workshop/index.get.mjs +1 -0
  366. package/.output/server/chunks/routes/api/workshop/index.get.mjs.map +1 -1
  367. package/.output/server/chunks/routes/api/workshop/index.post.mjs +1 -0
  368. package/.output/server/chunks/routes/api/workshop/index.post.mjs.map +1 -1
  369. package/.output/server/chunks/routes/api/workshop/index10.get.mjs +1 -0
  370. package/.output/server/chunks/routes/api/workshop/index10.get.mjs.map +1 -1
  371. package/.output/server/chunks/routes/api/workshop/index2.get.mjs +1 -0
  372. package/.output/server/chunks/routes/api/workshop/index2.get.mjs.map +1 -1
  373. package/.output/server/chunks/routes/api/workshop/index2.post.mjs +1 -0
  374. package/.output/server/chunks/routes/api/workshop/index2.post.mjs.map +1 -1
  375. package/.output/server/chunks/routes/api/workshop/index3.get.mjs +1 -0
  376. package/.output/server/chunks/routes/api/workshop/index3.get.mjs.map +1 -1
  377. package/.output/server/chunks/routes/api/workshop/index3.post.mjs +1 -0
  378. package/.output/server/chunks/routes/api/workshop/index3.post.mjs.map +1 -1
  379. package/.output/server/chunks/routes/api/workshop/index4.get.mjs +1 -0
  380. package/.output/server/chunks/routes/api/workshop/index4.get.mjs.map +1 -1
  381. package/.output/server/chunks/routes/api/workshop/index4.post.mjs +1 -0
  382. package/.output/server/chunks/routes/api/workshop/index4.post.mjs.map +1 -1
  383. package/.output/server/chunks/routes/api/workshop/index5.get.mjs +1 -0
  384. package/.output/server/chunks/routes/api/workshop/index5.get.mjs.map +1 -1
  385. package/.output/server/chunks/routes/api/workshop/index5.post.mjs +1 -0
  386. package/.output/server/chunks/routes/api/workshop/index5.post.mjs.map +1 -1
  387. package/.output/server/chunks/routes/api/workshop/index6.get.mjs +1 -0
  388. package/.output/server/chunks/routes/api/workshop/index6.get.mjs.map +1 -1
  389. package/.output/server/chunks/routes/api/workshop/index6.post.mjs +1 -0
  390. package/.output/server/chunks/routes/api/workshop/index6.post.mjs.map +1 -1
  391. package/.output/server/chunks/routes/api/workshop/index7.get.mjs +1 -0
  392. package/.output/server/chunks/routes/api/workshop/index7.get.mjs.map +1 -1
  393. package/.output/server/chunks/routes/api/workshop/index7.post.mjs +1 -0
  394. package/.output/server/chunks/routes/api/workshop/index7.post.mjs.map +1 -1
  395. package/.output/server/chunks/routes/api/workshop/index8.get.mjs +1 -0
  396. package/.output/server/chunks/routes/api/workshop/index8.get.mjs.map +1 -1
  397. package/.output/server/chunks/routes/api/workshop/index8.post.mjs +1 -0
  398. package/.output/server/chunks/routes/api/workshop/index8.post.mjs.map +1 -1
  399. package/.output/server/chunks/routes/api/workshop/index9.get.mjs +1 -0
  400. package/.output/server/chunks/routes/api/workshop/index9.get.mjs.map +1 -1
  401. package/.output/server/chunks/routes/api/workshop/mailbox/all.get.mjs +1 -0
  402. package/.output/server/chunks/routes/api/workshop/mailbox/all.get.mjs.map +1 -1
  403. package/.output/server/chunks/routes/api/workshop/mailbox.get.mjs +1 -0
  404. package/.output/server/chunks/routes/api/workshop/mailbox.get.mjs.map +1 -1
  405. package/.output/server/chunks/routes/api/workshop/memories/maintenance.post.mjs +1 -0
  406. package/.output/server/chunks/routes/api/workshop/memories/maintenance.post.mjs.map +1 -1
  407. package/.output/server/chunks/routes/api/workshop/plugins/_name/disable.post.mjs +1 -0
  408. package/.output/server/chunks/routes/api/workshop/plugins/_name/disable.post.mjs.map +1 -1
  409. package/.output/server/chunks/routes/api/workshop/plugins/_name/enable.post.mjs +1 -0
  410. package/.output/server/chunks/routes/api/workshop/plugins/_name/enable.post.mjs.map +1 -1
  411. package/.output/server/chunks/routes/api/workshop/plugins/index.get.mjs +1 -0
  412. package/.output/server/chunks/routes/api/workshop/plugins/index.get.mjs.map +1 -1
  413. package/.output/server/chunks/routes/api/workshop/runtime.get.mjs +1 -0
  414. package/.output/server/chunks/routes/api/workshop/runtime.get.mjs.map +1 -1
  415. package/.output/server/chunks/routes/api/workshop/scene/layouts/_channelId_.delete.mjs +1 -0
  416. package/.output/server/chunks/routes/api/workshop/scene/layouts/_channelId_.delete.mjs.map +1 -1
  417. package/.output/server/chunks/routes/api/workshop/scene/layouts/_channelId_.put.mjs +1 -0
  418. package/.output/server/chunks/routes/api/workshop/scene/layouts/_channelId_.put.mjs.map +1 -1
  419. package/.output/server/chunks/routes/api/workshop/scene/layouts.get.mjs +1 -0
  420. package/.output/server/chunks/routes/api/workshop/scene/layouts.get.mjs.map +1 -1
  421. package/.output/server/chunks/routes/api/workshop/tasks/_id/complete.post.mjs +1 -0
  422. package/.output/server/chunks/routes/api/workshop/tasks/_id/complete.post.mjs.map +1 -1
  423. package/.output/server/chunks/routes/api/workshop/tasks/_id/dispatch.post.mjs +1 -0
  424. package/.output/server/chunks/routes/api/workshop/tasks/_id/dispatch.post.mjs.map +1 -1
  425. package/.output/server/chunks/routes/api/workshop/tasks/_id/index.post.mjs +1 -0
  426. package/.output/server/chunks/routes/api/workshop/tasks/_id/index.post.mjs.map +1 -1
  427. package/.output/server/chunks/routes/api/workshop/tasks/_id/report.post.mjs +1 -0
  428. package/.output/server/chunks/routes/api/workshop/tasks/_id/report.post.mjs.map +1 -1
  429. package/.output/server/chunks/routes/api/workshop/tasks/_id/retry.post.mjs +1 -0
  430. package/.output/server/chunks/routes/api/workshop/tasks/_id/retry.post.mjs.map +1 -1
  431. package/.output/server/chunks/routes/api/workshop/tasks/_id_.get.mjs +1 -0
  432. package/.output/server/chunks/routes/api/workshop/tasks/_id_.get.mjs.map +1 -1
  433. package/.output/server/chunks/routes/api/workshop/tasks.get.mjs +1 -0
  434. package/.output/server/chunks/routes/api/workshop/tasks.get.mjs.map +1 -1
  435. package/.output/server/chunks/routes/api/workshop/teams/_id/deploy.post.mjs +1 -0
  436. package/.output/server/chunks/routes/api/workshop/teams/_id/deploy.post.mjs.map +1 -1
  437. package/.output/server/chunks/routes/api/workshop/teams/_id/index.get.mjs +1 -0
  438. package/.output/server/chunks/routes/api/workshop/teams/_id/index.get.mjs.map +1 -1
  439. package/.output/server/chunks/routes/api/workshop/teams/_id/index.post.mjs +1 -0
  440. package/.output/server/chunks/routes/api/workshop/teams/_id/index.post.mjs.map +1 -1
  441. package/.output/server/chunks/routes/api/workshop/teams/_id/members/_agentId_.delete.mjs +1 -0
  442. package/.output/server/chunks/routes/api/workshop/teams/_id/members/_agentId_.delete.mjs.map +1 -1
  443. package/.output/server/chunks/routes/api/workshop/teams/_id_.delete.mjs +1 -0
  444. package/.output/server/chunks/routes/api/workshop/teams/_id_.delete.mjs.map +1 -1
  445. package/.output/server/chunks/routes/api/workshop/teams/_id_.get.mjs +1 -0
  446. package/.output/server/chunks/routes/api/workshop/teams/_id_.get.mjs.map +1 -1
  447. package/.output/server/chunks/routes/api/workshop/teams/_id_.patch.mjs +1 -0
  448. package/.output/server/chunks/routes/api/workshop/teams/_id_.patch.mjs.map +1 -1
  449. package/.output/server/chunks/routes/api/workshop/users/me.get.mjs +1 -0
  450. package/.output/server/chunks/routes/api/workshop/users/me.get.mjs.map +1 -1
  451. package/.output/server/chunks/routes/api/workshop/users/register.post.mjs +1 -0
  452. package/.output/server/chunks/routes/api/workshop/users/register.post.mjs.map +1 -1
  453. package/.output/server/chunks/routes/api/workshop/workspaces/_id/channel-templates/_tplId_.post.mjs +1 -0
  454. package/.output/server/chunks/routes/api/workshop/workspaces/_id/channel-templates/_tplId_.post.mjs.map +1 -1
  455. package/.output/server/chunks/routes/api/workshop/workspaces/_id/channels/_channelId_.delete.mjs +1 -0
  456. package/.output/server/chunks/routes/api/workshop/workspaces/_id/channels/_channelId_.delete.mjs.map +1 -1
  457. package/.output/server/chunks/routes/api/workshop/workspaces/_id/channels/_channelId_.post.mjs +1 -0
  458. package/.output/server/chunks/routes/api/workshop/workspaces/_id/channels/_channelId_.post.mjs.map +1 -1
  459. package/.output/server/chunks/routes/api/workshop/workspaces/index.delete.mjs +1 -0
  460. package/.output/server/chunks/routes/api/workshop/workspaces/index.delete.mjs.map +1 -1
  461. package/.output/server/chunks/routes/renderer.mjs +1 -1
  462. package/.output/server/chunks/virtual/entry.mjs +287 -85
  463. package/.output/server/chunks/virtual/precomputed.mjs +1 -1
  464. package/.output/server/index.mjs +1 -0
  465. package/.output/server/package.json +1 -1
  466. package/README-zh.md +434 -430
  467. package/README.md +5 -1
  468. package/app/components/workshop/DeviceTwinPanel.vue +34 -0
  469. package/app/components/workshop/town/TownView.vue +5 -0
  470. package/app/composables/workshop/useDcwStream.ts +15 -1
  471. package/app/config/schema.ts +54 -0
  472. package/app/pages/dcw/[id].vue +57 -0
  473. package/app/pages/settings.vue +2 -1
  474. package/config.yml +58 -1
  475. package/i18n/dicts/_en.json +56 -2
  476. package/i18n/dicts/dcwDetail.json +9 -1
  477. package/i18n/dicts/deviceTwinPanel.json +2 -1
  478. package/i18n/dicts/settings.json +48 -1
  479. package/i18n/locales/en.ts +139 -38
  480. package/i18n/locales/zh-CN.ts +139 -38
  481. package/package.json +1 -1
  482. package/scripts/_dbg-agent-dcw-rw.ts +131 -0
  483. package/scripts/_dbg-config-smoke.ts +28 -0
  484. package/scripts/_dbg-dcw-read-rest.mjs +103 -0
  485. package/scripts/_dbg-dcw-read-toolface.ts +13 -0
  486. package/scripts/_dbg-dcw-read-ui.mjs +74 -0
  487. package/scripts/_dbg-plugin-tools-inject.ts +80 -0
  488. package/scripts/_dbg-plugin-ui-wizard.mjs +125 -0
  489. package/scripts/_dbg-plugin-verify-e2e.mjs +123 -0
  490. package/scripts/test-config-precedence.ts +124 -0
  491. package/scripts/test-dcw-read.ts +153 -0
  492. package/server/api/workshop/dcw/[id]/read.post.ts +18 -0
  493. package/server/api/workshop/ws.ts +6 -4
  494. package/server/data/daqs.json +78 -8
  495. package/server/data/dcw-rollback.json +221 -1
  496. package/server/data/dcw-runs.json +123 -54
  497. package/server/data/dcw-writes.json +312 -0
  498. package/server/data/dcws.json +646 -4
  499. package/server/data/line-runs.json +12 -1
  500. package/server/plugins/backup.ts +7 -5
  501. package/server/plugins/retention.ts +59 -57
  502. package/server/plugins/workshop.ts +5 -4
  503. package/server/services/workshop/agents/industrial-tools.ts +50 -1
  504. package/server/services/workshop/agents/omp-agent.ts +10 -8
  505. package/server/services/workshop/agents/tool-approvals.ts +175 -174
  506. package/server/services/workshop/daq/alarm-notify.ts +102 -100
  507. package/server/services/workshop/daq/bus/mqtt.adapter.ts +14 -15
  508. package/server/services/workshop/daq/daq-controller.ts +3 -3
  509. package/server/services/workshop/daq/storage/sqlite.adapter.ts +5 -4
  510. package/server/services/workshop/daq/storage/timescale.adapter.ts +5 -4
  511. package/server/services/workshop/db/retention.ts +49 -50
  512. package/server/services/workshop/dcw/dcw-controller.ts +56 -1
  513. package/server/services/workshop/dcw/dcw-node.ts +233 -200
  514. package/server/services/workshop/dcw/dcw-runtime.ts +46 -9
  515. package/server/services/workshop/dcw/drivers.ts +98 -0
  516. package/server/services/workshop/dcw/recipe-rollback-manager.ts +16 -15
  517. package/server/services/workshop/logger.ts +65 -58
  518. package/server/services/workshop/runtime/embedding-provider.ts +9 -5
  519. package/server/services/workshop/runtime/manager.ts +16 -7
  520. package/server/services/workshop/runtime/memory.ts +14 -7
  521. package/server/services/workshop/settings.ts +143 -0
  522. package/shared/config/engine.mjs +6 -2
  523. package/shared/config/schema.json +48 -1
  524. package/shared/dcw-protocol.ts +21 -0
  525. package/.output/public/_nuxt/BD9D9pl4.js +0 -1
  526. package/.output/public/_nuxt/BxD8Fg_Z.js +0 -2
  527. package/.output/public/_nuxt/CwcOEM8m.js +0 -1
  528. package/.output/public/_nuxt/TownView.CI2Wpzty.css +0 -1
  529. package/.output/public/_nuxt/_id_.Ci4u30cR.css +0 -1
  530. package/.output/public/_nuxt/builds/meta/a0ac51ef-51c0-4ff9-8484-7c90d8dd10ba.json +0 -1
  531. package/.output/public/_nuxt/settings.BG0K9_MG.css +0 -1
  532. package/.output/server/chunks/build/_id_-CmKAEFHV.mjs.map +0 -1
  533. package/.output/server/chunks/build/_id_-xR3AChMO.mjs.map +0 -1
  534. package/.output/server/chunks/build/daq-Boz_dlAQ.mjs.map +0 -1
  535. package/.output/server/chunks/build/dcw-wTRwBAUi.mjs.map +0 -1
  536. package/.output/server/chunks/build/logs-Cdi-eXlN.mjs.map +0 -1
  537. package/.output/server/chunks/build/pages-bWKy0ZsA.mjs.map +0 -1
  538. package/.output/server/chunks/build/settings-C3T5hR2A.mjs.map +0 -1
  539. package/.output/server/chunks/build/town-CKg6Qxba.mjs.map +0 -1
  540. 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 = Number(process.env.DCW_ROLLBACK_COOLDOWN_MS ?? 300_000)
36
- /** 系统兜底评估的最小观察窗 */
37
- const MIN_WINDOW_MS = Number(process.env.DCW_ROLLBACK_MIN_WINDOW_MS ?? 120_000)
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 = Number(process.env.DCW_ROLLBACK_BASELINE_MS ?? 600_000)
48
- /** open 记录孤儿判定:属主超时未判定 → 后续 Agent 可接管(判定/回退/顶替) */
49
- const OPEN_RECORD_STALE_MS = Number(process.env.DCW_ROLLBACK_STALE_MS ?? 1_800_000)
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 行,env 开关。
3
- * - 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
-
9
- export type LogLevel = 'debug' | 'info' | 'warn' | 'error'
10
-
11
- const LEVELS: Record<LogLevel, number> = { debug: 10, info: 20, warn: 30, error: 40 }
12
-
13
- function minLevel(): LogLevel {
14
- const v = process.env.AWSHOP_LOG_LEVEL as LogLevel | undefined
15
- return v && v in LEVELS ? v : 'info'
16
- }
17
-
18
- /** 安全序列化:Error → stack,循环引用降级为 [Circular],序列化失败降级 String */
19
- function safe(value: unknown): unknown {
20
- if (value instanceof Error) return value.stack ?? String(value)
21
- if (typeof value === 'object' && value !== null) {
22
- try {
23
- return JSON.parse(JSON.stringify(value))
24
- }
25
- catch {
26
- return '[Unserializable]'
27
- }
28
- }
29
- return value
30
- }
31
-
32
- export interface Logger {
33
- debug(msg: string, ...args: unknown[]): void
34
- info(msg: string, ...args: unknown[]): void
35
- warn(msg: string, ...args: unknown[]): void
36
- error(msg: string, ...args: unknown[]): void
37
- }
38
-
39
- export function createLogger(scope: string): Logger {
40
- const emit = (level: LogLevel, msg: string, args: unknown[]): void => {
41
- if (LEVELS[level] < LEVELS[minLevel()]) return
42
- const line = JSON.stringify({
43
- t: new Date().toISOString(),
44
- level,
45
- scope,
46
- msg,
47
- ...(args.length ? { args: args.map(safe) } : {}),
48
- })
49
- if (level === 'error' || level === 'warn') console.error(line)
50
- else console.log(line)
51
- }
52
- return {
53
- debug: (msg, ...args) => emit('debug', msg, args),
54
- info: (msg, ...args) => emit('info', msg, args),
55
- warn: (msg, ...args) => emit('warn', msg, args),
56
- error: (msg, ...args) => emit('error', msg, args),
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 端点(env 驱动,原生 fetch 零 SDK)。
3
- * 未配置 env → 返回 null(向量分支整体关闭,记忆系统纯 FTS 降级)。
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 baseUrl = process.env.AW_MEMORY_EMBED_BASE_URL
19
- const model = process.env.AW_MEMORY_EMBED_MODEL
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 = process.env.AW_MEMORY_EMBED_API_KEY ?? ''
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, envNum, runMemoryMaintenance, segmentCJK, unsegmentCJK, vectorizeMemory, type MaintenanceResult, type MemorySnippet } from './memory'
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
- }, envNum('AW_MEMORY_MAINTENANCE_MS', 6 * 3600_000))
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 = envNum('AW_MEMORY_REFLECT_TRIGGER', 8)
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, name: string, description: string, leadName: string | null,
2549
- activeTasks: Array<{ id: string, title: string, state: string }>,
2550
- recentCompleted: Array<{ title: string }>,
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, channelName: string, title: string, content: string, importance: number, createdAt: 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 引子 ≤ AW_MEMORY_PRIMER_TOKENS(300),整块 ≤ AW_MEMORY_INJECT_TOTAL(500)
274
+ // 未显式设置 = 双预算:L1 引子 ≤ memory.primer_tokens(300),整块 ≤ memory.inject_total(500)
268
275
  const explicit = recallOpts.budgetTokens ?? this.opts.budgetTokens
269
- const budget = explicit ?? envNum('AW_MEMORY_PRIMER_TOKENS', 300)
270
- const totalBudget = explicit ?? envNum('AW_MEMORY_INJECT_TOTAL', 500)
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 ?? envNum('AW_MEMORY_EXPIRE_DAYS', 180)
628
- const sessionExpireDays = envNum('AW_MEMORY_EXPIRE_SESSION_DAYS', 14)
629
- const cap = opts.cap ?? envNum('AW_MEMORY_CAP', 500)
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
+ }
@@ -203,8 +203,12 @@ export function envOverridesFromEnv(env = process.env, descriptors = loadDescrip
203
203
  const out = {}
204
204
  for (const desc of descriptors) {
205
205
  const varName = `AW_${desc.key.toUpperCase().replace(/\./g, '_')}`
206
- if (env[varName] !== undefined) {
207
- const coerced = coerceValue(desc, env[varName])
206
+ // aliases:历史环境变量名兼容(迁移前已在用的非 AW_ 前缀/异序名,如 DAQ_FRAME_RETENTION_H;
207
+ // 优先级 AW_<KEY> > aliases 中声明顺序)
208
+ const legacy = (desc.aliases ?? []).map(a => env[a]).find(v => v !== undefined)
209
+ const rawEnv = env[varName] !== undefined ? env[varName] : legacy
210
+ if (rawEnv !== undefined) {
211
+ const coerced = coerceValue(desc, rawEnv)
208
212
  if (coerced !== null) out[desc.key] = coerced
209
213
  }
210
214
  }
@@ -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
  }
@@ -257,6 +257,14 @@ export interface DcwNodeView {
257
257
  lineId: string
258
258
  /** 当前设定值(工程量;null = 从未下发) */
259
259
  value: number | null
260
+ /** PLC 当前读数(工程量物理值;周期读/手动读回填,null = 从未读到或不支持) */
261
+ readValue: number | null
262
+ /** 最近一次读到 PLC 值的时刻 */
263
+ lastReadAt: string | null
264
+ /** 最近一次读失败原因(成功后清空) */
265
+ lastReadError: string | null
266
+ /** 周期读间隔 ms(null = 走网关默认;0 = 关闭周期读,仅手动读取) */
267
+ readIntervalMs: number | null
260
268
  /** 最近一次成功下发时刻 / 最近一次写尝试时刻 */
261
269
  lastAckAt: string | null
262
270
  lastWriteAt: string | null
@@ -286,6 +294,19 @@ export interface AepDcwNodeChange {
286
294
  node: DcwNodeView | null
287
295
  }
288
296
 
297
+ /** dcw.read 帧载荷(每次 PLC 读数直推;周期读 + 手动读共用) */
298
+ export interface AepDcwRead {
299
+ nodeId: string
300
+ templateRef: string
301
+ /** 工程量物理值(读回原始值经换算/标定解码;读失败为 null) */
302
+ value: number | null
303
+ /** 原始值(PLC 语义,换算后;非寄存器驱动与 value 同源) */
304
+ raw: number | null
305
+ ok: boolean
306
+ message: string
307
+ at: string
308
+ }
309
+
289
310
  /** dcw.controller 帧载荷 */
290
311
  export interface AepDcwControllerState {
291
312
  running: boolean