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.
Files changed (537) 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/0f65fbec-c4c0-45de-9c50-bb41ada375e5.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 +2674 -2347
  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-ui-wizard.mjs +125 -0
  488. package/scripts/test-config-precedence.ts +124 -0
  489. package/scripts/test-dcw-read.ts +153 -0
  490. package/server/api/workshop/dcw/[id]/read.post.ts +18 -0
  491. package/server/api/workshop/ws.ts +6 -4
  492. package/server/data/daqs.json +55 -9
  493. package/server/data/dcw-rollback.json +221 -1
  494. package/server/data/dcw-runs.json +41 -18
  495. package/server/data/dcw-writes.json +264 -0
  496. package/server/data/dcws.json +646 -4
  497. package/server/data/line-runs.json +12 -1
  498. package/server/plugins/backup.ts +7 -5
  499. package/server/plugins/retention.ts +59 -57
  500. package/server/plugins/workshop.ts +5 -4
  501. package/server/services/workshop/agents/industrial-tools.ts +50 -1
  502. package/server/services/workshop/agents/omp-agent.ts +10 -8
  503. package/server/services/workshop/agents/tool-approvals.ts +175 -174
  504. package/server/services/workshop/daq/alarm-notify.ts +102 -100
  505. package/server/services/workshop/daq/bus/mqtt.adapter.ts +14 -15
  506. package/server/services/workshop/daq/storage/sqlite.adapter.ts +5 -4
  507. package/server/services/workshop/daq/storage/timescale.adapter.ts +5 -4
  508. package/server/services/workshop/db/retention.ts +49 -50
  509. package/server/services/workshop/dcw/dcw-controller.ts +56 -1
  510. package/server/services/workshop/dcw/dcw-node.ts +233 -200
  511. package/server/services/workshop/dcw/dcw-runtime.ts +46 -9
  512. package/server/services/workshop/dcw/drivers.ts +98 -0
  513. package/server/services/workshop/dcw/recipe-rollback-manager.ts +16 -15
  514. package/server/services/workshop/logger.ts +65 -58
  515. package/server/services/workshop/runtime/embedding-provider.ts +9 -5
  516. package/server/services/workshop/runtime/manager.ts +16 -7
  517. package/server/services/workshop/runtime/memory.ts +14 -7
  518. package/server/services/workshop/settings.ts +143 -0
  519. package/shared/config/engine.mjs +14 -2
  520. package/shared/config/schema.json +48 -1
  521. package/shared/dcw-protocol.ts +21 -0
  522. package/.output/public/_nuxt/BD9D9pl4.js +0 -1
  523. package/.output/public/_nuxt/BxD8Fg_Z.js +0 -2
  524. package/.output/public/_nuxt/CwcOEM8m.js +0 -1
  525. package/.output/public/_nuxt/TownView.CI2Wpzty.css +0 -1
  526. package/.output/public/_nuxt/_id_.Ci4u30cR.css +0 -1
  527. package/.output/public/_nuxt/builds/meta/221de779-a113-4232-b9a1-31a614f5e3c7.json +0 -1
  528. package/.output/public/_nuxt/settings.BG0K9_MG.css +0 -1
  529. package/.output/server/chunks/build/_id_-CmKAEFHV.mjs.map +0 -1
  530. package/.output/server/chunks/build/_id_-xR3AChMO.mjs.map +0 -1
  531. package/.output/server/chunks/build/daq-Boz_dlAQ.mjs.map +0 -1
  532. package/.output/server/chunks/build/dcw-wTRwBAUi.mjs.map +0 -1
  533. package/.output/server/chunks/build/logs-Cdi-eXlN.mjs.map +0 -1
  534. package/.output/server/chunks/build/pages-bWKy0ZsA.mjs.map +0 -1
  535. package/.output/server/chunks/build/settings-C3T5hR2A.mjs.map +0 -1
  536. package/.output/server/chunks/build/town-CKg6Qxba.mjs.map +0 -1
  537. package/.output/server/chunks/build/useDcwStream-BkWDGaWp.mjs.map +0 -1
package/README.md CHANGED
@@ -44,12 +44,16 @@ The result: submit a goal like *"analyze the melt temperature trend and optimize
44
44
  |---|---|
45
45
  | **Agent teams, industrial scope** | Agents bind to DAQ/DCW nodes and see semantic cards — physical meaning, units, safe range, recipe window — never raw registers. |
46
46
  | **Human-approved write control** | DCW writes flow through **safe-range ∩ recipe-window** interlock → optional **HITL approval** → PLC write → **readback verification** → signed write history. |
47
+ | **Read-write DCW channels (v0.7)** | Every control node also **reads its PLC value back** through the same calibration path it writes with: periodic + on-demand + agent reads surface **SET vs ACT** side by side in the DCW console, the twin panel (green ACT row) and a new `dcw_read` agent tool — passive observation, never blocked by write interlocks. |
48
+ | **Fully config-driven runtime (v0.7)** | Every runtime knob (memory budgets, compaction, rollback guardrails, retention, backups, log level…) is declared once in the settings descriptor registry with precedence **config.yml < runtime-settings < env** — legacy env names kept as aliases, no hardcoded defaults left in code. Project-level `.AgentWorkShop` wins; `~/.AgentWorkShop` is the user-level fallback (auto-seeded on install). |
47
49
  | **Real field buses** | Modbus TCP with per-connection op queues; OPC UA with session pools. Linear calibration hooks (PLC value ↔ engineering unit) on every node. |
50
+ | **Multi-modal DAQ frame pipeline (v0.6)** | Multi-point profiles (thickness/scanner) and CCD image frames are processed through template sink pipelines before storage: vectors & metadata into Timescale (`daq_frames`), pixels into object storage (MinIO, auto disk fallback); derived-metric thresholds ride the existing alarm chain. |
51
+ | **Plugin extension API (v0.6)** | `ctx.daq.registerDriver / registerProcessor / registerTemplate` for custom acquisition and sink algorithms (drop into `plugins/`); `ctx.omp.registerTool` for custom agent tools, hot-injected into every running session on registry change. |
48
52
  | **Line operations** | Lines → products → recipes → batch runs. Recipe windows gate acquisition and interlock writes; every sample is tagged `product/recipe/run` for per-batch isolation. |
49
53
  | **Lead-agent orchestration** | Each channel has one lead: decomposes goals, dispatches to idle workers, reassigns failures, judges goal satisfaction. LLM decisions with a deterministic rule-engine fallback — the system never stalls. |
50
54
  | **Three execution modes** | `goal` (satisfaction judging) · `loop` (fixed-interval replay) · `pipeline` (ordered stages). 7-state task machine with progress, artifacts and full history. |
51
55
  | **Four entry points** | One manager behind every door: **WS** (AEP v1 event stream with seq-resume), **MCP** (in-process tools), **A2A** (JSON-RPC 2.0 + AgentCard), **REST**. |
52
- | **Persistent memory** | Private + channel-shared domains; FTS5 with CJK segmentation, optional vector hybrid recall, token-budgeted injection. |
56
+ | **Persistent memory** | Private + channel-shared domains; FTS5 with CJK segmentation, optional vector hybrid recall, token-budgeted injection; session compaction summaries auto-archived, team chronicle and idle reflections keep accumulating (v0.6). |
53
57
  | **Harness-agnostic** | One `AgentInterface`: `mock` (in-process), `omp` (real agent subprocess via RPC), `claude` (SDK adapter). The platform never knows which one runs. |
54
58
  | **3D digital twin** | Three.js town: place line equipment and channel territories, watch device health, alarms and live values — driven by the same event bus. |
55
59
 
@@ -22,6 +22,9 @@ export interface DcwLiveRow {
22
22
  unit: string
23
23
  /** 当前设定值(工程量;null = 从未下发) */
24
24
  value: number | null
25
+ /** PLC 当前读数(读写集成;null = 从未读到或驱动不支持) */
26
+ readValue: number | null
27
+ lastReadAt: string | null
25
28
  decimals: number
26
29
  /** 生效下/上限(活动配方工艺窗口优先,否则节点全局量程;-∞/+∞ 表示不限定) */
27
30
  lo: number
@@ -236,6 +239,18 @@ function doDcwWrite(r: DcwLiveRow): void {
236
239
  >{{ $t('deviceTwinPanel.k48grv006') }}</i></em>
237
240
  <b class="dcw-set">{{ r.value != null ? r.value.toFixed(r.decimals) : '--' }}<i>{{ r.unit }}</i></b>
238
241
  </div>
242
+ <div
243
+ v-if="r.readValue != null || r.lastReadAt"
244
+ class="dcw-act"
245
+ :title="$t('deviceTwinPanel.k9r7d4e030')"
246
+ >
247
+ <em>ACT</em>
248
+ <b>{{ r.readValue != null ? r.readValue.toFixed(r.decimals) : '--' }}<i>{{ r.unit }}</i></b>
249
+ <i
250
+ v-if="r.lastReadAt"
251
+ class="dcw-act-at"
252
+ >{{ r.lastReadAt.slice(11, 19) }}</i>
253
+ </div>
239
254
  <div class="dcw-win">
240
255
  <span :title="r.src === 'recipe' ? '当前运行配方工艺窗口' : '节点全局量程'">{{ dcwWinText(r) }}</span>
241
256
  </div>
@@ -545,6 +560,25 @@ function doDcwWrite(r: DcwLiveRow): void {
545
560
  margin-left: 2px;
546
561
  opacity: 0.75;
547
562
  }
563
+ .dcw-act {
564
+ display: flex;
565
+ justify-content: space-between;
566
+ align-items: baseline;
567
+ gap: 6px;
568
+ font-family: var(--font-mono);
569
+ font-size: 9px;
570
+ color: var(--hud-dim);
571
+ }
572
+ .dcw-act em { font-style: normal; font-size: 8px; letter-spacing: 0.08em; color: var(--hud-faint); }
573
+ .dcw-act b {
574
+ font-size: 11.5px;
575
+ font-weight: 700;
576
+ font-variant-numeric: tabular-nums;
577
+ color: var(--hud-accent, #35e0a0);
578
+ white-space: nowrap;
579
+ }
580
+ .dcw-act b i { font-style: normal; font-size: 8.5px; font-weight: 500; margin-left: 2px; opacity: 0.75; }
581
+ .dcw-act-at { font-style: normal; font-size: 8px; color: var(--hud-faint); }
548
582
  .dcw-win {
549
583
  font-family: var(--font-mono);
550
584
  font-size: 8.5px;
@@ -2215,6 +2215,9 @@ interface DcwLiveRow {
2215
2215
  name: string
2216
2216
  unit: string
2217
2217
  value: number | null
2218
+ /** PLC 当前读数(读写集成:周期读/手动读回填的物理值) */
2219
+ readValue: number | null
2220
+ lastReadAt: string | null
2218
2221
  decimals: number
2219
2222
  lo: number
2220
2223
  hi: number
@@ -2233,6 +2236,8 @@ const dcwLive = computed<Record<string, DcwLiveRow[]>>(() => {
2233
2236
  name: n.name,
2234
2237
  unit: n.unit,
2235
2238
  value: n.value,
2239
+ readValue: n.readValue,
2240
+ lastReadAt: n.lastReadAt,
2236
2241
  decimals: n.decimals,
2237
2242
  lo: w.lo,
2238
2243
  hi: w.hi,
@@ -8,7 +8,7 @@ import { reactive } from 'vue'
8
8
  import { useTownBus } from './useTownBus'
9
9
  import { apiFetch } from './apiClient'
10
10
  import type { AepEnvelope } from '#shared/workshop-protocol'
11
- import { DCW_TEMPLATES, type AepDcwControllerState, type AepDcwNodeChange, type AepDcwWritten, type DcwNodeView, type DcwParamLedger, type DcwTemplateDef, type DcwTemplateInput, type LineInput, type LineQueryOpts, type LineQueryResult, type LineRunState, type LineView, type OptimizationRecord, type OptimizationVerdict, type ProductInput, type ProductView, type RecipeInput, type RecipeRunView, type RecipeView, type RecipeRunData } from '#shared/dcw-protocol'
11
+ import { DCW_TEMPLATES, type AepDcwControllerState, type AepDcwNodeChange, type AepDcwRead, type AepDcwWritten, type DcwNodeView, type DcwParamLedger, type DcwTemplateDef, type DcwTemplateInput, type LineInput, type LineQueryOpts, type LineQueryResult, type LineRunState, type LineView, type OptimizationRecord, type OptimizationVerdict, type ProductInput, type ProductView, type RecipeInput, type RecipeRunView, type RecipeView, type RecipeRunData } from '#shared/dcw-protocol'
12
12
 
13
13
  export type { DcwNodeView }
14
14
 
@@ -17,6 +17,7 @@ const api = <T>(path: string, init?: RequestInit): Promise<T> =>
17
17
  apiFetch<T>({ base: '/api/workshop/dcw', path, init, retries: (init?.method ?? 'GET').toUpperCase() === 'GET' ? 2 : 0 })
18
18
 
19
19
  export interface DcwWriteOutcomeView { ok: boolean, message: string, raw: number | null, readback: number | null }
20
+ export interface DcwReadOutcomeView { ok: boolean, value: number | null, raw: number | null, message: string, at: string }
20
21
  export interface DcwWriteHistoryEntry { id: string, nodeId: string, nodeName: string, param: string, eng: number, raw: number | null, ok: boolean, message: string, recipeRunId: string | null, at: string }
21
22
 
22
23
  function createStore() {
@@ -66,6 +67,15 @@ function createStore() {
66
67
  history.unshift({ id: `${p.nodeId}-${p.at}`, nodeId: p.nodeId, nodeName: n?.name ?? p.nodeId, param: '', eng: p.value, raw: p.raw, ok: p.ok, message: p.message, recipeRunId: p.recipeRunId, at: p.at })
67
68
  if (history.length > 60) history.splice(60)
68
69
  }
70
+ else if (e.type === 'dcw.read') {
71
+ const p = e.payload as AepDcwRead
72
+ const n = nodes.find(x => x.id === p.nodeId)
73
+ if (n) {
74
+ if (p.ok) n.readValue = p.value
75
+ n.lastReadAt = p.at
76
+ n.lastReadError = p.ok ? null : p.message
77
+ }
78
+ }
69
79
  else if (e.type === 'dcw.node.changed') applyChange(e.payload as AepDcwNodeChange)
70
80
  else if (e.type === 'dcw.controller') Object.assign(controller, e.payload as AepDcwControllerState)
71
81
  else if (e.type === 'dcw.optimization.changed') {
@@ -172,6 +182,10 @@ function createStore() {
172
182
  write: async (id: string, value: number): Promise<DcwWriteOutcomeView> => {
173
183
  return api<{ outcome: DcwWriteOutcomeView }>(`/${id}/write`, { method: 'POST', body: JSON.stringify({ value }) }).then(r => r.outcome)
174
184
  },
185
+ /** 手动读取 PLC 当前值(读写集成的读半边;与周期读同源) */
186
+ readNode: async (id: string): Promise<DcwReadOutcomeView> => {
187
+ return api<{ read: DcwReadOutcomeView }>(`/${id}/read`, { method: 'POST', body: JSON.stringify({}) }).then(r => r.read)
188
+ },
175
189
  testDriver: async (driver: string, driverConfig: Record<string, unknown>): Promise<{ ok: boolean, message: string }> => {
176
190
  return api<{ test: { ok: boolean, message: string } }>('/test-driver', { method: 'POST', body: JSON.stringify({ driver, driverConfig }) }).then(r => r.test)
177
191
  },
@@ -43,6 +43,8 @@ export const appConfigSchema = z.object({
43
43
  sessionPassword: z.string().min(16, 'session 密钥至少 16 位').default(''),
44
44
  // R3:高危管理操作双人复核闸门(默认关;开启后 apply/controller/delete 需另一 admin 批核)
45
45
  approvalGate: z.boolean().default(false),
46
+ // HITL 审批超时窗(超时默认拒绝;security.hitl_timeout_ms / env HITL_TIMEOUT_MS)
47
+ hitl_timeout_ms: z.number().int().min(1000).max(86400000).default(180_000),
46
48
  }),
47
49
  daq: z.object({
48
50
  startInfrastructure: z.enum(['auto', 'always', 'never']).default('auto'),
@@ -54,6 +56,8 @@ export const appConfigSchema = z.object({
54
56
  password: z.string().default(''),
55
57
  secure: z.boolean().default(false), // true → mqtts://(8883 + CA)
56
58
  caFile: z.string().default(''), // 自签 CA 证书路径(mqtts 时建议设置)
59
+ qos: z.number().int().min(0).max(2).default(0), // 事件总线发布 QoS(legacy DAQ_MQTT_QOS)
60
+ rejectUnauthorized: z.boolean().default(true), // mqtts 证书校验(legacy DAQ_MQTT_REJECT_UNAUTHORIZED)
57
61
  }),
58
62
  timescale: z.object({
59
63
  host: z.string().default('127.0.0.1'),
@@ -70,7 +74,57 @@ export const appConfigSchema = z.object({
70
74
  secretKey: z.string().default('awshop-secret'),
71
75
  bucket: z.string().default('daq'),
72
76
  }).optional(),
77
+ // 保留策略(legacy DAQ_TS_RETENTION_H / DAQ_FRAME_RETENTION_H)
78
+ tsRetentionH: z.number().int().min(1).max(8760).default(168),
79
+ frameRetentionH: z.number().int().min(1).max(8760).default(720),
80
+ // 告警升级(legacy ALARM_WEBHOOK_URL / ALARM_ESCALATE_MINUTES)
81
+ alarmWebhookUrl: z.string().default(''),
82
+ alarmEscalateMinutes: z.number().int().min(1).max(1440).default(15),
73
83
  }).default({ startInfrastructure: 'auto', mqtt: { host: '127.0.0.1', port: 1883 }, timescale: { host: '127.0.0.1', port: 5432, user: 'postgres', password: 'awshop', database: 'awshop' } }),
84
+ // —— 以下运行语义组:config 缺省即用默认;env AW_<键>(点转下划线)/历史别名可覆盖 ——
85
+ memory: z.object({
86
+ primer_tokens: z.number().min(50).max(4000).default(300),
87
+ inject_total: z.number().min(100).max(8000).default(500),
88
+ maintenance_ms: z.number().min(60000).max(604800000).default(21_600_000),
89
+ expire_days: z.number().min(1).max(3650).default(180),
90
+ expire_session_days: z.number().min(1).max(365).default(14),
91
+ cap: z.number().min(50).max(50000).default(500),
92
+ reflect_trigger: z.number().min(1).max(100).default(8),
93
+ embed_base_url: z.string().default(''),
94
+ embed_model: z.string().default(''),
95
+ embed_api_key: z.string().default(''),
96
+ }).default({}),
97
+ omp: z.object({
98
+ compact_enabled: z.boolean().default(true),
99
+ compact_threshold: z.number().min(0.3).max(0.95).default(0.7),
100
+ compact_min_interval_ms: z.number().min(30000).max(3600000).default(300_000),
101
+ compact_wait_ms: z.number().min(10000).max(600000).default(120_000),
102
+ }).default({}),
103
+ dcw: z.object({
104
+ rollback_cooldown_ms: z.number().min(0).max(3600000).default(300_000),
105
+ rollback_min_window_ms: z.number().min(0).max(3600000).default(120_000),
106
+ rollback_baseline_ms: z.number().min(0).max(7200000).default(600_000),
107
+ rollback_stale_ms: z.number().min(60000).max(14400000).default(1_800_000),
108
+ }).default({}),
109
+ workshop: z.object({
110
+ idle_sweep_ms: z.number().min(5000).max(600000).default(30_000),
111
+ idle_grace_ms: z.number().min(10000).max(3600000).default(120_000),
112
+ }).default({}),
113
+ backup: z.object({
114
+ disabled: z.boolean().default(false),
115
+ interval_hours: z.number().min(1).max(720).default(24),
116
+ keep: z.number().min(1).max(100).default(7),
117
+ }).default({}),
118
+ retention: z.object({
119
+ disabled: z.boolean().default(false),
120
+ events_days: z.number().min(1).max(365).default(7),
121
+ messages_days: z.number().min(1).max(3650).default(30),
122
+ audit_days: z.number().min(1).max(3650).default(90),
123
+ approval_days: z.number().min(1).max(3650).default(180),
124
+ }).default({}),
125
+ log: z.object({
126
+ level: z.enum(['debug', 'info', 'warn', 'error']).default('info'),
127
+ }).default({}),
74
128
  })
75
129
 
76
130
  export type AppConfig = z.infer<typeof appConfigSchema>
@@ -131,6 +131,23 @@ async function doWrite(nodeId: string, value: number): Promise<void> {
131
131
  }
132
132
  }
133
133
 
134
+ // ---------- 读取(读写集成的读半边:手动读 PLC 当前值,周期读由服务端调度) ----------
135
+ const readingId = ref('')
136
+
137
+ async function doRead(nodeId: string): Promise<void> {
138
+ readingId.value = nodeId
139
+ writeError.value = ''
140
+ try {
141
+ await dcw.readNode(nodeId)
142
+ }
143
+ catch (err) {
144
+ writeError.value = err instanceof Error ? err.message : String(err)
145
+ }
146
+ finally {
147
+ readingId.value = ''
148
+ }
149
+ }
150
+
134
151
  // ---------- 逐节点 控制开启/暂停 ----------
135
152
  const togglingId = ref('')
136
153
  /** 开启/暂停单个节点的控制:暂停后服务端拒绝一切下发(409 当前节点暂停),本地即时收敛状态 */
@@ -161,6 +178,7 @@ const addTemplate = ref(dcw.templates[0]?.key ?? '')
161
178
  const addDriver = ref<'mock' | 'modbus-tcp' | 'opcua'>('mock')
162
179
  const addName = ref('')
163
180
  const addHold = ref<number | null>(null)
181
+ const addRead = ref<number | null>(null)
164
182
  const addCfg = ref<Record<string, string | number>>({})
165
183
  const addTransform = reactive({ kind: 'none' as 'none' | 'linear', scale: 1, offset: 0 })
166
184
  const addSemantics = ref('')
@@ -214,6 +232,7 @@ async function doAddNode(): Promise<void> {
214
232
  driverConfig: { ...addCfg.value },
215
233
  transform,
216
234
  holdIntervalMs: addHold.value,
235
+ readIntervalMs: addRead.value,
217
236
  lineId: lineId.value,
218
237
  semantics: addSemantics.value.trim() || undefined,
219
238
  })
@@ -964,6 +983,18 @@ function fmtPoint(p: { value?: number, avg?: number } | undefined): string {
964
983
  :placeholder="$t('dcwDetail.kb1srz0010')"
965
984
  >
966
985
  </label>
986
+ <label class="f">
987
+ <span>{{ $t('dcwDetail.k9r7d4e016') }}</span>
988
+ <input
989
+ v-model.number="addRead"
990
+ type="number"
991
+ min="0"
992
+ max="3600000"
993
+ step="500"
994
+ class="inp"
995
+ :placeholder="$t('dcwDetail.k9r7d4e017')"
996
+ >
997
+ </label>
967
998
  </div>
968
999
 
969
1000
  <!-- 数据语义标定 encode(物理设定值 → PLC 设定值;mock/真实均可用) -->
@@ -1123,6 +1154,7 @@ function fmtPoint(p: { value?: number, avg?: number } | undefined): string {
1123
1154
  <th>{{ $t('dcwDetail.k403cy054') }}</th>
1124
1155
  <th>{{ $t('dcwDetail.k42w8s055') }}</th>
1125
1156
  <th>{{ $t('dcwDetail.k1deqh0d056') }}</th>
1157
+ <th>{{ $t('dcwDetail.k9r7d4e018') }}</th>
1126
1158
  <th>{{ $t('dcwDetail.k1k79ec9057') }}</th>
1127
1159
  <th>{{ $t('dcwDetail.k1dexou6058') }}</th>
1128
1160
  <th>{{ $t('dcwDetail.k1b1nnaa059') }}</th>
@@ -1174,6 +1206,25 @@ function fmtPoint(p: { value?: number, avg?: number } | undefined): string {
1174
1206
  class="dim"
1175
1207
  > · {{ n.lastAckAt.slice(11, 19) }}</small>
1176
1208
  </td>
1209
+ <td class="mono val">
1210
+ <span
1211
+ :title="n.lastReadError ?? $t('dcwDetail.k9r7d4e019')"
1212
+ :class="{ 'read-stale': n.lastReadError }"
1213
+ >{{ n.readValue != null ? n.readValue.toFixed(n.decimals) : '--' }}</span>
1214
+ <small>{{ n.unit }}</small>
1215
+ <small
1216
+ v-if="n.lastReadAt"
1217
+ class="dim"
1218
+ > · {{ n.lastReadAt.slice(11, 19) }}</small>
1219
+ <button
1220
+ class="mini-btn read-btn"
1221
+ :disabled="readingId === n.id"
1222
+ :title="$t('dcwDetail.k9r7d4e020')"
1223
+ @click="doRead(n.id)"
1224
+ >
1225
+ {{ readingId === n.id ? '···' : $t('dcwDetail.k9r7d4e021') }}
1226
+ </button>
1227
+ </td>
1177
1228
  <td>
1178
1229
  <div class="write-row">
1179
1230
  <input
@@ -1202,6 +1253,10 @@ function fmtPoint(p: { value?: number, avg?: number } | undefined): string {
1202
1253
  </td>
1203
1254
  <td class="mono">
1204
1255
  {{ n.holdIntervalMs == null ? $t('dcwDetail.k3zul4160') : `${n.holdIntervalMs}ms` }}
1256
+ <small
1257
+ class="dim"
1258
+ :title="$t('dcwDetail.k9r7d4e016')"
1259
+ >· {{ n.readIntervalMs === 0 ? $t('dcwDetail.k9r7d4e022') : (n.readIntervalMs == null ? $t('dcwDetail.k9r7d4e023') : `${n.readIntervalMs}ms`) }}</small>
1205
1260
  </td>
1206
1261
  <td>{{ deviceName(n.deviceBindingId) }}</td>
1207
1262
  <td class="right">
@@ -2157,6 +2212,8 @@ h1 { margin: 2px 0 4px; font-size: 30px; font-weight: 400; letter-spacing: -0.01
2157
2212
  .right { text-align: right; }
2158
2213
  .val { font-size: 13px; }
2159
2214
  .val small { margin-left: 3px; color: var(--ink-faint); }
2215
+ .read-stale { color: var(--tone-danger-dot, #e05a5a); text-decoration: underline dotted; text-underline-offset: 3px; }
2216
+ .read-btn { margin-left: 8px; }
2160
2217
 
2161
2218
  .st-pill { display: inline-block; padding: 2px 9px; font-family: var(--font-mono); font-size: 10.5px; letter-spacing: 0.04em; border-radius: var(--radius-pill); }
2162
2219
  .st-pill.ok { color: var(--tone-success-dot); background: var(--tone-success-bg); }
@@ -80,7 +80,8 @@ async function resetAllRuntime() {
80
80
  }
81
81
 
82
82
  function groupLabel(group: string): string {
83
- return ({ server: t('settings.runtime.groupServer'), app: t('settings.runtime.groupApp'), api: 'API', theme: t('settings.runtime.groupTheme'), i18n: t('settings.runtime.groupI18n'), security: t('settings.runtime.groupSecurity'), daq: t('settings.runtime.groupDaq') })[group] ?? group
83
+ const known: Record<string, string> = { server: t('settings.runtime.groupServer'), app: t('settings.runtime.groupApp'), api: 'API', theme: t('settings.runtime.groupTheme'), i18n: t('settings.runtime.groupI18n'), security: t('settings.runtime.groupSecurity'), daq: t('settings.runtime.groupDaq'), memory: t('settings.runtime.groupMemory'), omp: t('settings.runtime.groupOmp'), dcw: t('settings.runtime.groupDcw'), workshop: t('settings.runtime.groupWorkshop'), backup: t('settings.runtime.groupBackup'), retention: t('settings.runtime.groupRetention'), log: t('settings.runtime.groupLog') }
84
+ return known[group] ?? group
84
85
  }
85
86
  function sourceClass(s: string): string {
86
87
  return s === 'runtime' ? 'src-runtime' : s === 'env' ? 'src-env' : 'src-yaml'
package/config.yml CHANGED
@@ -10,7 +10,7 @@
10
10
  app:
11
11
  name: AgentWorkShop
12
12
  title: AgentWorkShop
13
- version: 0.2.0
13
+ version: 0.7.1
14
14
  description: 基于 Nuxt 4 的配置驱动运行范式
15
15
 
16
16
  # 运行模式(dev/prod 实际由启动命令决定,此处仅作运行时展示)
@@ -75,3 +75,60 @@ security:
75
75
  # Session cookie 加密密钥(nuxt-auth-utils 使用)
76
76
  # 生产环境必须修改为强随机值;可用环境变量 NUXT_SESSION_PASSWORD 覆盖
77
77
  sessionPassword: awshop-dev-secret-change-me-0123456789
78
+ # HITL 审批超时窗 ms(超时默认拒绝;env HITL_TIMEOUT_MS 兼容)
79
+ # hitl_timeout_ms: 180000
80
+
81
+ # ------------------------------------------------------------
82
+ # 以下运行语义组:全部键均可被 env AW_<键>(点转下划线)或历史别名覆盖,
83
+ # 优先级 config.yml < data/runtime-settings.json < 环境变量。缺省即用默认。
84
+ # ------------------------------------------------------------
85
+
86
+ # Agent 记忆系统(env AW_MEMORY_*)
87
+ memory:
88
+ primer_tokens: 300 # 记忆引子 token 预算(AW_MEMORY_PRIMER_TOKENS)
89
+ inject_total: 500 # 单次注入总硬顶(AW_MEMORY_INJECT_TOTAL)
90
+ maintenance_ms: 21600000 # 维护调度周期(AW_MEMORY_MAINTENANCE_MS)
91
+ expire_days: 180 # 情景记忆保留天数(AW_MEMORY_EXPIRE_DAYS)
92
+ expire_session_days: 14 # 会话记忆保留天数(AW_MEMORY_EXPIRE_SESSION_DAYS)
93
+ cap: 500 # 条目驱逐上限(AW_MEMORY_CAP)
94
+ reflect_trigger: 8 # 空闲反思触发阈值(AW_MEMORY_REFLECT_TRIGGER)
95
+ embed_base_url: '' # OpenAI 兼容 /embeddings 基址(AW_MEMORY_EMBED_BASE_URL;空=纯 FTS)
96
+ embed_model: '' # 向量模型名(AW_MEMORY_EMBED_MODEL)
97
+ embed_api_key: '' # Bearer 密钥(AW_MEMORY_EMBED_API_KEY)
98
+
99
+ # omp Agent Harness(env AW_OMP_COMPACT_*)
100
+ omp:
101
+ compact_enabled: true # 上下文自动压缩总开关(AW_OMP_COMPACT_ENABLED=0 可关)
102
+ compact_threshold: 0.7 # 触发压缩的上下文占用比例(AW_OMP_COMPACT_THRESHOLD)
103
+ compact_min_interval_ms: 300000 # 两次压缩最小间隔(AW_OMP_COMPACT_MIN_INTERVAL_MS)
104
+ compact_wait_ms: 120000 # 等待压缩完成超时(AW_OMP_COMPACT_WAIT_MS)
105
+
106
+ # 数控写控制(env DCW_ROLLBACK_*)
107
+ dcw:
108
+ rollback_cooldown_ms: 300000 # 回退后同向重写冷却(DCW_ROLLBACK_COOLDOWN_MS)
109
+ rollback_min_window_ms: 120000 # 判定最小观察窗(DCW_ROLLBACK_MIN_WINDOW_MS)
110
+ rollback_baseline_ms: 600000 # 基线回看窗(DCW_ROLLBACK_BASELINE_MS)
111
+ rollback_stale_ms: 1800000 # open 记录接管阈值(DCW_ROLLBACK_STALE_MS)
112
+
113
+ # 车间运行(env WORKSHOP_IDLE_*)
114
+ workshop:
115
+ idle_sweep_ms: 30000 # 空闲 agent 扫描周期(WORKSHOP_IDLE_SWEEP_MS)
116
+ idle_grace_ms: 120000 # 空闲卸载宽限(WORKSHOP_IDLE_GRACE_MS)
117
+
118
+ # 数据备份(env BACKUP_*)
119
+ backup:
120
+ disabled: false # BACKUP_DISABLED=1 关闭
121
+ interval_hours: 24 # 备份间隔(BACKUP_INTERVAL_HOURS)
122
+ keep: 7 # 保留份数(BACKUP_KEEP)
123
+
124
+ # 数据保留清理(env RETENTION_DISABLED / AW_EVENTS_RETENTION_D 等)
125
+ retention:
126
+ disabled: false # RETENTION_DISABLED=1 / AW_RETENTION_DISABLED=1 关闭
127
+ events_days: 7 # WS 事件流保留天数(AW_EVENTS_RETENTION_D)
128
+ messages_days: 30 # Channel 消息(AW_MESSAGES_RETENTION_D)
129
+ audit_days: 90 # 审计日志(AW_AUDIT_RETENTION_D)
130
+ approval_days: 180 # 审批历史(AW_APPROVAL_RETENTION_D)
131
+
132
+ # 服务端日志(env AWSHOP_LOG_LEVEL)
133
+ log:
134
+ level: info # debug | info | warn | error
@@ -1098,5 +1098,59 @@
1098
1098
  "多点轮廓帧": "Profile frames",
1099
1099
  "暂无帧(产线运行中才有数据)": "No frames yet (data flows only while the line is running)",
1100
1100
  "指标": "Metrics",
1101
- "点击查看原图": "Click to view full image"
1102
- }
1101
+ "点击查看原图": "Click to view full image",
1102
+ "周期读(ms)": "Poll read (ms)",
1103
+ "缺省 5000ms;0 = 仅手动读取": "Default 5000ms; 0 = manual read only",
1104
+ "PLC 读数": "PLC reading",
1105
+ "暂无读数(周期读未开启或驱动不支持读取)": "No reading yet (poll read off or driver lacks read support)",
1106
+ "读取 PLC 当前值": "Read current PLC value",
1107
+ "读取": "Read",
1108
+ "默认 5s": "Default 5s",
1109
+ "PLC 当前读数(实际值)": "Current PLC reading (actual)",
1110
+ "记忆系统": "Memory",
1111
+ "Agent Harness": "Agent Harness",
1112
+ "数控写控": "Write Control",
1113
+ "车间运行": "Workshop",
1114
+ "数据备份": "Backup",
1115
+ "数据保留": "Retention",
1116
+ "日志": "Logs",
1117
+ "记忆引子预算": "Memory primer budget",
1118
+ "记忆注入硬顶": "Memory inject cap",
1119
+ "记忆维护周期(ms)": "Memory maintenance (ms)",
1120
+ "情景记忆过期(天)": "Episodic expiry (days)",
1121
+ "会话记忆过期(天)": "Session expiry (days)",
1122
+ "记忆条目上限": "Memory entry cap",
1123
+ "反思触发阈值": "Reflection trigger",
1124
+ "Embedding 端点": "Embedding endpoint",
1125
+ "Embedding 模型": "Embedding model",
1126
+ "Embedding 密钥": "Embedding key",
1127
+ "上下文自动压缩": "Auto compaction",
1128
+ "压缩阈值": "Compaction threshold",
1129
+ "压缩最小间隔(ms)": "Min compaction interval (ms)",
1130
+ "压缩等待超时(ms)": "Compaction wait timeout (ms)",
1131
+ "回退冷却(ms)": "Rollback cooldown (ms)",
1132
+ "回退最小观察窗(ms)": "Min observe window (ms)",
1133
+ "基线稳定窗(ms)": "Baseline window (ms)",
1134
+ "open 记录过期(ms)": "Open record staleness (ms)",
1135
+ "空产线扫描(ms)": "Idle sweep (ms)",
1136
+ "空闲宽限(ms)": "Idle grace (ms)",
1137
+ "禁用自动备份": "Disable auto backup",
1138
+ "备份间隔(h)": "Backup interval (h)",
1139
+ "备份保留份数": "Backups to keep",
1140
+ "禁用数据保留策略": "Disable retention sweep",
1141
+ "事件保留(天)": "Events retention (days)",
1142
+ "消息保留(天)": "Messages retention (days)",
1143
+ "审计日志保留(天)": "Audit retention (days)",
1144
+ "审批历史保留(天)": "Approval history retention (days)",
1145
+ "日志级别": "Log level",
1146
+ "MQTT QoS": "MQTT QoS",
1147
+ "MQTT 用户名": "MQTT username",
1148
+ "MQTT 密码": "MQTT password",
1149
+ "MQTT CA 证书": "MQTT CA certificate",
1150
+ "MQTT 校验证书": "MQTT verify certificate",
1151
+ "标量时序保留(h)": "Scalar TS retention (h)",
1152
+ "帧元数据保留(h)": "Frame retention (h)",
1153
+ "告警 Webhook": "Alarm webhook",
1154
+ "告警升级时限(min)": "Alarm escalate (min)",
1155
+ "HITL 审批超时(ms)": "HITL approval timeout (ms)"
1156
+ }
@@ -195,5 +195,13 @@
195
195
  "k1ledga001": "刷新",
196
196
  "k1ledga002": "单步回退",
197
197
  "k1ledgh001": "设定历史(账本)",
198
- "k1ledgr001": "优化记录"
198
+ "k1ledgr001": "优化记录",
199
+ "k9r7d4e016": "周期读(ms)",
200
+ "k9r7d4e017": "缺省 5000ms;0 = 仅手动读取",
201
+ "k9r7d4e018": "PLC 读数",
202
+ "k9r7d4e019": "暂无读数(周期读未开启或驱动不支持读取)",
203
+ "k9r7d4e020": "读取 PLC 当前值",
204
+ "k9r7d4e021": "读取",
205
+ "k9r7d4e022": "手动",
206
+ "k9r7d4e023": "默认 5s"
199
207
  }
@@ -8,5 +8,6 @@
8
8
  "k44653007": "确认",
9
9
  "kq2jssk008": "配方工艺窗口",
10
10
  "k1iwj796009": "节点量程",
11
- "kxddket010": "超出{p0} {p1}"
11
+ "kxddket010": "超出{p0} {p1}",
12
+ "k9r7d4e030": "PLC 当前读数(实际值)"
12
13
  }
@@ -1 +1,48 @@
1
- {}
1
+ {
2
+ "runtime.groupMemory": "记忆系统",
3
+ "runtime.groupOmp": "Agent Harness",
4
+ "runtime.groupDcw": "数控写控",
5
+ "runtime.groupWorkshop": "车间运行",
6
+ "runtime.groupBackup": "数据备份",
7
+ "runtime.groupRetention": "数据保留",
8
+ "runtime.groupLog": "日志",
9
+ "runtime.memory.primerTokens": "记忆引子预算",
10
+ "runtime.memory.injectTotal": "记忆注入硬顶",
11
+ "runtime.memory.maintenanceMs": "记忆维护周期(ms)",
12
+ "runtime.memory.expireDays": "情景记忆过期(天)",
13
+ "runtime.memory.expireSessionDays": "会话记忆过期(天)",
14
+ "runtime.memory.cap": "记忆条目上限",
15
+ "runtime.memory.reflectTrigger": "反思触发阈值",
16
+ "runtime.memory.embedBaseUrl": "Embedding 端点",
17
+ "runtime.memory.embedModel": "Embedding 模型",
18
+ "runtime.memory.embedApiKey": "Embedding 密钥",
19
+ "runtime.omp.compactEnabled": "上下文自动压缩",
20
+ "runtime.omp.compactThreshold": "压缩阈值",
21
+ "runtime.omp.compactMinIntervalMs": "压缩最小间隔(ms)",
22
+ "runtime.omp.compactWaitMs": "压缩等待超时(ms)",
23
+ "runtime.dcw.rollbackCooldownMs": "回退冷却(ms)",
24
+ "runtime.dcw.rollbackMinWindowMs": "回退最小观察窗(ms)",
25
+ "runtime.dcw.rollbackBaselineMs": "基线稳定窗(ms)",
26
+ "runtime.dcw.rollbackStaleMs": "open 记录过期(ms)",
27
+ "runtime.workshop.idleSweepMs": "空产线扫描(ms)",
28
+ "runtime.workshop.idleGraceMs": "空闲宽限(ms)",
29
+ "runtime.backup.disabled": "禁用自动备份",
30
+ "runtime.backup.intervalHours": "备份间隔(h)",
31
+ "runtime.backup.keep": "备份保留份数",
32
+ "runtime.retention.disabled": "禁用数据保留策略",
33
+ "runtime.retention.eventsDays": "事件保留(天)",
34
+ "runtime.retention.messagesDays": "消息保留(天)",
35
+ "runtime.retention.auditDays": "审计日志保留(天)",
36
+ "runtime.retention.approvalDays": "审批历史保留(天)",
37
+ "runtime.log.level": "日志级别",
38
+ "runtime.daq.mqttQos": "MQTT QoS",
39
+ "runtime.daq.mqttUsername": "MQTT 用户名",
40
+ "runtime.daq.mqttPassword": "MQTT 密码",
41
+ "runtime.daq.mqttCaFile": "MQTT CA 证书",
42
+ "runtime.daq.mqttRejectUnauthorized": "MQTT 校验证书",
43
+ "runtime.daq.tsRetentionH": "标量时序保留(h)",
44
+ "runtime.daq.frameRetentionH": "帧元数据保留(h)",
45
+ "runtime.daq.alarmWebhookUrl": "告警 Webhook",
46
+ "runtime.daq.alarmEscalateMinutes": "告警升级时限(min)",
47
+ "runtime.security.hitlTimeoutMs": "HITL 审批超时(ms)"
48
+ }