agentworkshop 0.7.27 → 0.7.34

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 (1033) hide show
  1. package/.AgentWorkShop/prompts/aml-mission-default.md +20 -0
  2. package/.AgentWorkShop/prompts/aml-playbook.md +49 -0
  3. package/.AgentWorkShop/prompts/host-tools.json +314 -0
  4. package/.output/.AgentWorkShop/prompts/aml-mission-default.md +20 -0
  5. package/.output/.AgentWorkShop/prompts/aml-playbook.md +49 -0
  6. package/.output/.AgentWorkShop/prompts/host-tools.json +314 -0
  7. package/.output/.AgentWorkShop/schema.json +120 -0
  8. package/.output/nitro.json +1 -1
  9. package/.output/public/_nuxt/{BTLEvDxM.js → 4bHdIqEg.js} +8 -8
  10. package/.output/public/_nuxt/B9nXmjSB.js +19 -0
  11. package/.output/public/_nuxt/BASN8nZ0.js +1 -0
  12. package/.output/public/_nuxt/{DNQF_TXX.js → BBBtwOpo.js} +1 -1
  13. package/.output/public/_nuxt/{DoAlYsiF.js → BBwMH_hG.js} +1 -1
  14. package/.output/public/_nuxt/BWSE6hR6.js +1 -0
  15. package/.output/public/_nuxt/BZv4RFYN.js +1 -0
  16. package/.output/public/_nuxt/{BgCrZKv_2.js → Bc0AmjfT.js} +1 -1
  17. package/.output/public/_nuxt/BcmbLh2z2.js +1 -0
  18. package/.output/public/_nuxt/BgTB6h_q.js +2 -0
  19. package/.output/public/_nuxt/BkLJA9J5.js +1 -0
  20. package/.output/public/_nuxt/{XY2z78rj.js → BuCHayqN.js} +1 -1
  21. package/.output/public/_nuxt/{0jKrzLuM.js → BuvcLKh1.js} +1 -1
  22. package/.output/public/_nuxt/C-mDhyEd.js +1 -0
  23. package/.output/public/_nuxt/{DosOJEmZ2.js → C77oC8yC2.js} +1 -1
  24. package/.output/public/_nuxt/CQvmN-Mi.js +1 -0
  25. package/.output/public/_nuxt/CUDrOuW7.js +1 -0
  26. package/.output/public/_nuxt/{DjU9Dx5Y.js → CZcC-gpk.js} +1 -1
  27. package/.output/public/_nuxt/{Cz9gD2Yo.js → CbzsPO5H.js} +1 -1
  28. package/.output/public/_nuxt/CdSOrh2c.js +1 -0
  29. package/.output/public/_nuxt/Cgx818r-.js +1 -0
  30. package/.output/public/_nuxt/Cjm7VogC.js +1 -0
  31. package/.output/public/_nuxt/Cm5mDxzH.js +1 -0
  32. package/.output/public/_nuxt/Cp6z0RN7.js +1 -0
  33. package/.output/public/_nuxt/Ct-WOVr4.js +1 -0
  34. package/.output/public/_nuxt/CwqIxJGj.js +2 -0
  35. package/.output/public/_nuxt/{BGhOrgle.js → D0fhp-Ga.js} +2 -2
  36. package/.output/public/_nuxt/DIaTPH1M.js +1 -0
  37. package/.output/public/_nuxt/DLljr7g0.js +1 -0
  38. package/.output/public/_nuxt/DTYBfjRY.js +1 -0
  39. package/.output/public/_nuxt/DYKVPzN-.js +1 -0
  40. package/.output/public/_nuxt/DZzGarBE2.js +13 -0
  41. package/.output/public/_nuxt/DaMCzQhv.js +1 -0
  42. package/.output/public/_nuxt/DoMxCWN52.js +4 -0
  43. package/.output/public/_nuxt/{CucID8qg2.js → DoTdlVVe2.js} +1 -1
  44. package/.output/public/_nuxt/DsVcWfyR.js +1 -0
  45. package/.output/public/_nuxt/{BCJFMBQ6.js → DzuC31-i.js} +2 -2
  46. package/.output/public/_nuxt/FQri3dV3.js +1 -0
  47. package/.output/public/_nuxt/Lp7Ll94I.js +1 -0
  48. package/.output/public/_nuxt/PluginSlot.DmjNbrcX.css +1 -0
  49. package/.output/public/_nuxt/_id_.hRYo-EAB.css +1 -0
  50. package/.output/public/_nuxt/_wsId_.gXMEOYgX.css +1 -0
  51. package/.output/public/_nuxt/agents.BV70ioCv.css +1 -0
  52. package/.output/public/_nuxt/aml.WU_bh87J.css +1 -0
  53. package/.output/public/_nuxt/builds/latest.json +1 -1
  54. package/.output/public/_nuxt/builds/meta/adc365b6-f636-4a2b-9527-79819c1e874b.json +1 -0
  55. package/.output/public/_nuxt/daq.Bb6l44-O.css +1 -0
  56. package/.output/public/_nuxt/default.jNT73_hq.css +1 -0
  57. package/.output/public/_nuxt/ekuGmQ7R.js +1 -0
  58. package/.output/public/_nuxt/entry.jFrFAWuA.css +1 -0
  59. package/.output/public/_nuxt/pMoIO6rr.js +14 -0
  60. package/.output/public/_nuxt/pages.Cc8GX9T1.css +1 -0
  61. package/.output/public/_nuxt/plugins.wIPyfPn-.css +1 -0
  62. package/.output/public/_nuxt/settings.BCm4NZIc.css +1 -0
  63. package/.output/public/_nuxt/teams.BC75EGnR.css +1 -0
  64. package/.output/server/chunks/_/binding-authz.mjs +23 -0
  65. package/.output/server/chunks/_/binding-authz.mjs.map +1 -0
  66. package/.output/server/chunks/_/character-asset.repo.mjs +1 -1
  67. package/.output/server/chunks/_/host-bindings.mjs +1 -1
  68. package/.output/server/chunks/_/nitro.mjs +15929 -9198
  69. package/.output/server/chunks/_/nitro.mjs.map +1 -1
  70. package/.output/server/chunks/_/scene-layout.repo.mjs +3 -3
  71. package/.output/server/chunks/_/scene-layout.repo.mjs.map +1 -1
  72. package/.output/server/chunks/build/Checkbox-eax2M3o-.mjs +207 -0
  73. package/.output/server/chunks/build/Checkbox-eax2M3o-.mjs.map +1 -0
  74. package/.output/server/chunks/build/{OmpTerminalPanel-Cw_Vw9oO.mjs → OmpTerminalPanel-Cu_s4i0A.mjs} +2 -2
  75. package/.output/server/chunks/build/{OmpTerminalPanel-Cw_Vw9oO.mjs.map → OmpTerminalPanel-Cu_s4i0A.mjs.map} +1 -1
  76. package/.output/server/chunks/build/{alert-qJnjyRcP.mjs → PluginSlot-CcR4Ys3T.mjs} +140 -4
  77. package/.output/server/chunks/build/PluginSlot-CcR4Ys3T.mjs.map +1 -0
  78. package/.output/server/chunks/build/{TownView-ftIylqiD.mjs → TownView-BdHnAilw.mjs} +5 -5
  79. package/.output/server/chunks/build/{TownView-ftIylqiD.mjs.map → TownView-BdHnAilw.mjs.map} +1 -1
  80. package/.output/server/chunks/build/{_id_-CahfkmEt.mjs → _id_-Cb845FHR.mjs} +7 -5
  81. package/.output/server/chunks/build/_id_-Cb845FHR.mjs.map +1 -0
  82. package/.output/server/chunks/build/{_id_-3Axz2-gV.mjs → _id_-fadFPl2i.mjs} +50 -35
  83. package/.output/server/chunks/build/_id_-fadFPl2i.mjs.map +1 -0
  84. package/.output/server/chunks/build/{_wsId_-BymlQhzS.mjs → _wsId_-CTZswnm5.mjs} +181 -22
  85. package/.output/server/chunks/build/{_wsId_-BymlQhzS.mjs.map → _wsId_-CTZswnm5.mjs.map} +1 -1
  86. package/.output/server/chunks/build/{agents-DuMiSWKp.mjs → agents-Bvin73QY.mjs} +82 -32
  87. package/.output/server/chunks/build/agents-Bvin73QY.mjs.map +1 -0
  88. package/.output/server/chunks/build/aml-uBNIppIf.mjs +508 -0
  89. package/.output/server/chunks/build/aml-uBNIppIf.mjs.map +1 -0
  90. package/.output/server/chunks/build/apiClient-BwnfOQU8.mjs +81 -0
  91. package/.output/server/chunks/build/apiClient-BwnfOQU8.mjs.map +1 -0
  92. package/.output/server/chunks/build/{channel-templates-BStqJ-of.mjs → channel-templates-BTq8570n.mjs} +6 -5
  93. package/.output/server/chunks/build/channel-templates-BTq8570n.mjs.map +1 -0
  94. package/.output/server/chunks/build/{checkbox-C1gABOca.mjs → checkbox-8fB-wI-T.mjs} +2 -2
  95. package/.output/server/chunks/build/{checkbox-C1gABOca.mjs.map → checkbox-8fB-wI-T.mjs.map} +1 -1
  96. package/.output/server/chunks/build/{daq-ChYCABz1.mjs → daq-BvihjQyW.mjs} +111 -109
  97. package/.output/server/chunks/build/daq-BvihjQyW.mjs.map +1 -0
  98. package/.output/server/chunks/build/{dcw-CcQNGggh.mjs → dcw-Ks2vJ4PF.mjs} +5 -3
  99. package/.output/server/chunks/build/dcw-Ks2vJ4PF.mjs.map +1 -0
  100. package/.output/server/chunks/build/{default-95-zOTPt.mjs → default-GgHt4O2R.mjs} +164 -101
  101. package/.output/server/chunks/build/{default-95-zOTPt.mjs.map → default-GgHt4O2R.mjs.map} +1 -1
  102. package/.output/server/chunks/build/{input-number-Bd55elNN.mjs → input-number-DzpyYB99.mjs} +2 -2
  103. package/.output/server/chunks/build/{input-number-Bd55elNN.mjs.map → input-number-DzpyYB99.mjs.map} +1 -1
  104. package/.output/server/chunks/build/{logs-D-2UyGtE.mjs → logs-CYBhkQwh.mjs} +5 -3
  105. package/.output/server/chunks/build/logs-CYBhkQwh.mjs.map +1 -0
  106. package/.output/server/chunks/build/{monitor-mfG5jBtz.mjs → monitor-CyfDt4nR.mjs} +7 -6
  107. package/.output/server/chunks/build/{monitor-mfG5jBtz.mjs.map → monitor-CyfDt4nR.mjs.map} +1 -1
  108. package/.output/server/chunks/build/{pages-Dfosfchr.mjs → pages-C-6BRtv8.mjs} +57 -47
  109. package/.output/server/chunks/build/pages-C-6BRtv8.mjs.map +1 -0
  110. package/.output/server/chunks/build/{permissions-B-hhZuzm.mjs → permissions-B52oOmaO.mjs} +6 -5
  111. package/.output/server/chunks/build/permissions-B52oOmaO.mjs.map +1 -0
  112. package/.output/server/chunks/build/{plugins-DZR0T4Mh.mjs → plugins-dZRegC7m.mjs} +22 -18
  113. package/.output/server/chunks/build/plugins-dZRegC7m.mjs.map +1 -0
  114. package/.output/server/chunks/build/{segmented-LPPREMtZ.mjs → segmented-3TrWo0lS.mjs} +3 -3
  115. package/.output/server/chunks/build/{segmented-LPPREMtZ.mjs.map → segmented-3TrWo0lS.mjs.map} +1 -1
  116. package/.output/server/chunks/build/{settings-BajN9TQW.mjs → settings-CgDLkP3s.mjs} +437 -62
  117. package/.output/server/chunks/build/settings-CgDLkP3s.mjs.map +1 -0
  118. package/.output/server/chunks/build/{table-Bf1r2JjE.mjs → table-BjSWwmic.mjs} +4 -4
  119. package/.output/server/chunks/build/{table-Bf1r2JjE.mjs.map → table-BjSWwmic.mjs.map} +1 -1
  120. package/.output/server/chunks/build/{tag-NO9jEqKy.mjs → tag-DNE9vXc0.mjs} +3 -131
  121. package/.output/server/chunks/build/tag-DNE9vXc0.mjs.map +1 -0
  122. package/.output/server/chunks/build/{teams-t2SkRlJP.mjs → teams-2kz3CusY.mjs} +31 -30
  123. package/.output/server/chunks/build/teams-2kz3CusY.mjs.map +1 -0
  124. package/.output/server/chunks/build/{tokens-DiCojbN8.mjs → tokens-BbWLqtVz.mjs} +6 -5
  125. package/.output/server/chunks/build/tokens-BbWLqtVz.mjs.map +1 -0
  126. package/.output/server/chunks/build/town-BUqRobze.mjs +1 -0
  127. package/.output/server/chunks/build/town-BUqRobze.mjs.map +1 -1
  128. package/.output/server/chunks/build/{town-C7QM8DYK.mjs → town-DJ-V5G9U.mjs} +7 -5
  129. package/.output/server/chunks/build/town-DJ-V5G9U.mjs.map +1 -0
  130. package/.output/server/chunks/build/{useDaqStream-BeA2X8KR.mjs → useDaqStream-CIBaiGAl.mjs} +4 -3
  131. package/.output/server/chunks/build/useDaqStream-CIBaiGAl.mjs.map +1 -0
  132. package/.output/server/chunks/build/{useDcwStream-BJW_MitY.mjs → useDcwStream-CBbiYnWe.mjs} +4 -80
  133. package/.output/server/chunks/build/useDcwStream-CBbiYnWe.mjs.map +1 -0
  134. package/.output/server/chunks/build/{useDeviceTwins-Dwz_EY_i.mjs → useDeviceTwins-Yko6nNPF.mjs} +2 -2
  135. package/.output/server/chunks/build/{useDeviceTwins-Dwz_EY_i.mjs.map → useDeviceTwins-Yko6nNPF.mjs.map} +1 -1
  136. package/.output/server/chunks/build/{useOpsLog-Dm8QEb1I.mjs → useOpsLog-CO_VWh7t.mjs} +2 -2
  137. package/.output/server/chunks/build/{useOpsLog-Dm8QEb1I.mjs.map → useOpsLog-CO_VWh7t.mjs.map} +1 -1
  138. package/.output/server/chunks/build/{useWorkshopApi-B-L3MmIX.mjs → useWorkshopApi-NyjL0L3j.mjs} +4 -2
  139. package/.output/server/chunks/build/{useWorkshopApi-B-L3MmIX.mjs.map → useWorkshopApi-NyjL0L3j.mjs.map} +1 -1
  140. package/.output/server/chunks/build/{users-B9SAdEtH.mjs → users-4nzxTjFT.mjs} +6 -5
  141. package/.output/server/chunks/build/users-4nzxTjFT.mjs.map +1 -0
  142. package/.output/server/chunks/build/workshop-81xhz368.mjs +1 -0
  143. package/.output/server/chunks/build/workshop-81xhz368.mjs.map +1 -1
  144. package/.output/server/chunks/routes/api/health.get.mjs +1 -0
  145. package/.output/server/chunks/routes/api/health.get.mjs.map +1 -1
  146. package/.output/server/chunks/routes/api/index.get.mjs +1 -1
  147. package/.output/server/chunks/routes/api/index.post.mjs +1 -1
  148. package/.output/server/chunks/routes/api/metrics.mjs +1 -0
  149. package/.output/server/chunks/routes/api/metrics.mjs.map +1 -1
  150. package/.output/server/chunks/routes/api/plugins/_name/_...path_.mjs +1 -0
  151. package/.output/server/chunks/routes/api/plugins/_name/_...path_.mjs.map +1 -1
  152. package/.output/server/chunks/routes/api/plugins/client/_name_.get.mjs +1 -0
  153. package/.output/server/chunks/routes/api/plugins/client/_name_.get.mjs.map +1 -1
  154. package/.output/server/chunks/routes/api/plugins/i18n.get.mjs +26 -0
  155. package/.output/server/chunks/routes/api/plugins/i18n.get.mjs.map +1 -0
  156. package/.output/server/chunks/routes/api/plugins/manifest.get.mjs +2 -1
  157. package/.output/server/chunks/routes/api/plugins/manifest.get.mjs.map +1 -1
  158. package/.output/server/chunks/routes/api/system/config-groups/_id_.delete.mjs +32 -0
  159. package/.output/server/chunks/routes/api/system/config-groups/_id_.delete.mjs.map +1 -0
  160. package/.output/server/chunks/routes/api/system/config-groups/_id_.patch.mjs +36 -0
  161. package/.output/server/chunks/routes/api/system/config-groups/_id_.patch.mjs.map +1 -0
  162. package/.output/server/chunks/routes/api/system/config.get.mjs +1 -0
  163. package/.output/server/chunks/routes/api/system/config.get.mjs.map +1 -1
  164. package/.output/server/chunks/routes/api/system/index.get.mjs +7 -2
  165. package/.output/server/chunks/routes/api/system/index.get.mjs.map +1 -1
  166. package/.output/server/chunks/routes/api/system/index.patch.mjs +2 -1
  167. package/.output/server/chunks/routes/api/system/index.patch.mjs.map +1 -1
  168. package/.output/server/chunks/routes/api/system/index.post.mjs +36 -0
  169. package/.output/server/chunks/routes/api/system/index.post.mjs.map +1 -0
  170. package/.output/server/chunks/routes/api/system/index2.get.mjs +28 -0
  171. package/.output/server/chunks/routes/api/system/index2.get.mjs.map +1 -0
  172. package/.output/server/chunks/routes/api/system/monitor/terminal/ws.mjs +2 -1
  173. package/.output/server/chunks/routes/api/system/monitor/terminal/ws.mjs.map +1 -1
  174. package/.output/server/chunks/routes/api/system/monitor/terminate.post.mjs +2 -1
  175. package/.output/server/chunks/routes/api/system/monitor/terminate.post.mjs.map +1 -1
  176. package/.output/server/chunks/routes/api/system/monitor.get.mjs +1 -0
  177. package/.output/server/chunks/routes/api/system/monitor.get.mjs.map +1 -1
  178. package/.output/server/chunks/routes/api/system/settings/events.get.mjs +8 -5
  179. package/.output/server/chunks/routes/api/system/settings/events.get.mjs.map +1 -1
  180. package/.output/server/chunks/routes/api/system/settings/reset.post.mjs +2 -1
  181. package/.output/server/chunks/routes/api/system/settings/reset.post.mjs.map +1 -1
  182. package/.output/server/chunks/routes/api/users/_id_.delete.mjs +2 -1
  183. package/.output/server/chunks/routes/api/users/_id_.delete.mjs.map +1 -1
  184. package/.output/server/chunks/routes/api/users/_id_.get.mjs +2 -1
  185. package/.output/server/chunks/routes/api/users/_id_.get.mjs.map +1 -1
  186. package/.output/server/chunks/routes/api/users/_id_.put.mjs +1 -1
  187. package/.output/server/chunks/routes/api/users/index.get.mjs +2 -1
  188. package/.output/server/chunks/routes/api/users/index.get.mjs.map +1 -1
  189. package/.output/server/chunks/routes/api/users/index.post.mjs +1 -1
  190. package/.output/server/chunks/routes/api/users/login.post.mjs +1 -1
  191. package/.output/server/chunks/routes/api/users/logout.post.mjs +2 -1
  192. package/.output/server/chunks/routes/api/users/logout.post.mjs.map +1 -1
  193. package/.output/server/chunks/routes/api/users/me.get.mjs +2 -1
  194. package/.output/server/chunks/routes/api/users/me.get.mjs.map +1 -1
  195. package/.output/server/chunks/routes/api/users/register.post.mjs +1 -1
  196. package/.output/server/chunks/routes/api/users/setup-status.get.mjs +2 -1
  197. package/.output/server/chunks/routes/api/users/setup-status.get.mjs.map +1 -1
  198. package/.output/server/chunks/routes/api/users/tokens/_id/token.get.mjs +2 -1
  199. package/.output/server/chunks/routes/api/users/tokens/_id/token.get.mjs.map +1 -1
  200. package/.output/server/chunks/routes/api/users/tokens/_id_.delete.mjs +2 -1
  201. package/.output/server/chunks/routes/api/users/tokens/_id_.delete.mjs.map +1 -1
  202. package/.output/server/chunks/routes/api/users/tokens/_id_.patch.mjs +1 -1
  203. package/.output/server/chunks/routes/api/workshop/_...path_.mjs +2 -1
  204. package/.output/server/chunks/routes/api/workshop/_...path_.mjs.map +1 -1
  205. package/.output/server/chunks/routes/api/workshop/a2a/_agentId/index.get.mjs +2 -1
  206. package/.output/server/chunks/routes/api/workshop/a2a/_agentId/index.get.mjs.map +1 -1
  207. package/.output/server/chunks/routes/api/workshop/a2a/_agentId/index.post.mjs +1 -1
  208. package/.output/server/chunks/routes/api/workshop/a2a/send.post.mjs +1 -1
  209. package/.output/server/chunks/routes/api/workshop/agent-tools/approvals/_id/decide.post.mjs +2 -1
  210. package/.output/server/chunks/routes/api/workshop/agent-tools/approvals/_id/decide.post.mjs.map +1 -1
  211. package/.output/server/chunks/routes/api/workshop/agent-tools/bindings/_id_.delete.mjs +5 -2
  212. package/.output/server/chunks/routes/api/workshop/agent-tools/bindings/_id_.delete.mjs.map +1 -1
  213. package/.output/server/chunks/routes/api/workshop/agent-tools/bindings/_id_.patch.mjs +9 -3
  214. package/.output/server/chunks/routes/api/workshop/agent-tools/bindings/_id_.patch.mjs.map +1 -1
  215. package/.output/server/chunks/routes/api/workshop/agent-tools/index.get.mjs +2 -1
  216. package/.output/server/chunks/routes/api/workshop/agent-tools/index.get.mjs.map +1 -1
  217. package/.output/server/chunks/routes/api/workshop/agent-tools/index.post.mjs +2 -1
  218. package/.output/server/chunks/routes/api/workshop/agent-tools/index.post.mjs.map +1 -1
  219. package/.output/server/chunks/routes/api/workshop/agent-tools/index2.get.mjs +23 -3
  220. package/.output/server/chunks/routes/api/workshop/agent-tools/index2.get.mjs.map +1 -1
  221. package/.output/server/chunks/routes/api/workshop/agent-tools/invoke.post.mjs +21 -3
  222. package/.output/server/chunks/routes/api/workshop/agent-tools/invoke.post.mjs.map +1 -1
  223. package/.output/server/chunks/routes/api/workshop/agent-tools/list.get.mjs +2 -1
  224. package/.output/server/chunks/routes/api/workshop/agent-tools/list.get.mjs.map +1 -1
  225. package/.output/server/chunks/routes/api/workshop/agents/_id_.delete.mjs +2 -1
  226. package/.output/server/chunks/routes/api/workshop/agents/_id_.delete.mjs.map +1 -1
  227. package/.output/server/chunks/routes/api/workshop/agents/_id_.get.mjs +2 -1
  228. package/.output/server/chunks/routes/api/workshop/agents/_id_.get.mjs.map +1 -1
  229. package/.output/server/chunks/routes/api/workshop/agents/_id_.patch.mjs +1 -1
  230. package/.output/server/chunks/routes/api/workshop/agents/subscribe.post.mjs +1 -1
  231. package/.output/server/chunks/routes/api/workshop/aml/datasets/_id/preview.get.mjs +75 -0
  232. package/.output/server/chunks/routes/api/workshop/aml/datasets/_id/preview.get.mjs.map +1 -0
  233. package/.output/server/chunks/routes/api/workshop/aml/datasets/_id_.get.mjs +35 -0
  234. package/.output/server/chunks/routes/api/workshop/aml/datasets/_id_.get.mjs.map +1 -0
  235. package/.output/server/chunks/routes/api/workshop/aml/index.get.mjs +35 -0
  236. package/.output/server/chunks/routes/api/workshop/aml/index.get.mjs.map +1 -0
  237. package/.output/server/chunks/routes/api/workshop/aml/index.post.mjs +46 -0
  238. package/.output/server/chunks/routes/api/workshop/aml/index.post.mjs.map +1 -0
  239. package/.output/server/chunks/routes/api/workshop/aml/index2.get.mjs +47 -0
  240. package/.output/server/chunks/routes/api/workshop/aml/index2.get.mjs.map +1 -0
  241. package/.output/server/chunks/routes/api/workshop/aml/index2.post.mjs +48 -0
  242. package/.output/server/chunks/routes/api/workshop/aml/index2.post.mjs.map +1 -0
  243. package/.output/server/chunks/routes/api/workshop/aml/index3.get.mjs +41 -0
  244. package/.output/server/chunks/routes/api/workshop/aml/index3.get.mjs.map +1 -0
  245. package/.output/server/chunks/routes/api/workshop/aml/index4.get.mjs +62 -0
  246. package/.output/server/chunks/routes/api/workshop/aml/index4.get.mjs.map +1 -0
  247. package/.output/server/chunks/routes/api/workshop/aml/jobs/_id/cancel.post.mjs +35 -0
  248. package/.output/server/chunks/routes/api/workshop/aml/jobs/_id/cancel.post.mjs.map +1 -0
  249. package/.output/server/chunks/routes/api/workshop/aml/jobs/_id/logs.get.mjs +36 -0
  250. package/.output/server/chunks/routes/api/workshop/aml/jobs/_id/logs.get.mjs.map +1 -0
  251. package/.output/server/chunks/routes/api/workshop/aml/jobs/_id/retry.post.mjs +34 -0
  252. package/.output/server/chunks/routes/api/workshop/aml/jobs/_id/retry.post.mjs.map +1 -0
  253. package/.output/server/chunks/routes/api/workshop/aml/jobs/_id_.get.mjs +38 -0
  254. package/.output/server/chunks/routes/api/workshop/aml/jobs/_id_.get.mjs.map +1 -0
  255. package/.output/server/chunks/routes/api/workshop/aml/models/_id/predict.post.mjs +37 -0
  256. package/.output/server/chunks/routes/api/workshop/aml/models/_id/predict.post.mjs.map +1 -0
  257. package/.output/server/chunks/routes/api/workshop/aml/models/_id/promote.post.mjs +42 -0
  258. package/.output/server/chunks/routes/api/workshop/aml/models/_id/promote.post.mjs.map +1 -0
  259. package/.output/server/chunks/routes/api/workshop/approvals/_id/decide.post.mjs +2 -1
  260. package/.output/server/chunks/routes/api/workshop/approvals/_id/decide.post.mjs.map +1 -1
  261. package/.output/server/chunks/routes/api/workshop/assets/character/_id_.delete.mjs +2 -1
  262. package/.output/server/chunks/routes/api/workshop/assets/character/_id_.delete.mjs.map +1 -1
  263. package/.output/server/chunks/routes/api/workshop/assets/devices/_id_.delete.mjs +2 -1
  264. package/.output/server/chunks/routes/api/workshop/assets/devices/_id_.delete.mjs.map +1 -1
  265. package/.output/server/chunks/routes/api/workshop/assets/index.get.mjs +2 -1
  266. package/.output/server/chunks/routes/api/workshop/assets/index.get.mjs.map +1 -1
  267. package/.output/server/chunks/routes/api/workshop/assets/index.post.mjs +2 -1
  268. package/.output/server/chunks/routes/api/workshop/assets/index.post.mjs.map +1 -1
  269. package/.output/server/chunks/routes/api/workshop/assets/index2.get.mjs +1 -0
  270. package/.output/server/chunks/routes/api/workshop/assets/index2.get.mjs.map +1 -1
  271. package/.output/server/chunks/routes/api/workshop/assets/index2.post.mjs +2 -1
  272. package/.output/server/chunks/routes/api/workshop/assets/index2.post.mjs.map +1 -1
  273. package/.output/server/chunks/routes/api/workshop/audit.get.mjs +2 -1
  274. package/.output/server/chunks/routes/api/workshop/audit.get.mjs.map +1 -1
  275. package/.output/server/chunks/routes/api/workshop/caller.mjs +2 -1
  276. package/.output/server/chunks/routes/api/workshop/caller.mjs.map +1 -1
  277. package/.output/server/chunks/routes/api/workshop/channel-templates/_id/instantiate.post.mjs +2 -2
  278. package/.output/server/chunks/routes/api/workshop/channel-templates/_id_.delete.mjs +2 -1
  279. package/.output/server/chunks/routes/api/workshop/channel-templates/_id_.delete.mjs.map +1 -1
  280. package/.output/server/chunks/routes/api/workshop/channel-templates/_id_.get.mjs +2 -1
  281. package/.output/server/chunks/routes/api/workshop/channel-templates/_id_.get.mjs.map +1 -1
  282. package/.output/server/chunks/routes/api/workshop/channel-templates/_id_.patch.mjs +1 -1
  283. package/.output/server/chunks/routes/api/workshop/channel-templates/from-channel.post.mjs +1 -1
  284. package/.output/server/chunks/routes/api/workshop/channels/_id/activate.post.mjs +2 -1
  285. package/.output/server/chunks/routes/api/workshop/channels/_id/activate.post.mjs.map +1 -1
  286. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/index.get.mjs +2 -1
  287. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/index.get.mjs.map +1 -1
  288. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/index.post.mjs +1 -1
  289. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/memories/_memoryId_.delete.mjs +2 -1
  290. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/memories/_memoryId_.delete.mjs.map +1 -1
  291. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/memories/search.post.mjs +1 -1
  292. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/model.patch.mjs +2 -1
  293. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/model.patch.mjs.map +1 -1
  294. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/position.patch.mjs +2 -1
  295. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/position.patch.mjs.map +1 -1
  296. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/range.patch.mjs +2 -1
  297. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/range.patch.mjs.map +1 -1
  298. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/stop.post.mjs +2 -1
  299. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/stop.post.mjs.map +1 -1
  300. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId_.delete.mjs +2 -1
  301. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId_.delete.mjs.map +1 -1
  302. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId_.patch.mjs +2 -1
  303. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId_.patch.mjs.map +1 -1
  304. package/.output/server/chunks/routes/api/workshop/channels/_id/events.get.mjs +1 -1
  305. package/.output/server/chunks/routes/api/workshop/channels/_id/index.get.mjs +2 -1
  306. package/.output/server/chunks/routes/api/workshop/channels/_id/index.get.mjs.map +1 -1
  307. package/.output/server/chunks/routes/api/workshop/channels/_id/index.post.mjs +1 -1
  308. package/.output/server/chunks/routes/api/workshop/channels/_id/index.put.mjs +2 -1
  309. package/.output/server/chunks/routes/api/workshop/channels/_id/index.put.mjs.map +1 -1
  310. package/.output/server/chunks/routes/api/workshop/channels/_id/index2.get.mjs +2 -1
  311. package/.output/server/chunks/routes/api/workshop/channels/_id/index2.get.mjs.map +1 -1
  312. package/.output/server/chunks/routes/api/workshop/channels/_id/index2.post.mjs +1 -1
  313. package/.output/server/chunks/routes/api/workshop/channels/_id/index3.get.mjs +1 -1
  314. package/.output/server/chunks/routes/api/workshop/channels/_id/index3.post.mjs +1 -1
  315. package/.output/server/chunks/routes/api/workshop/channels/_id/index4.get.mjs +2 -1
  316. package/.output/server/chunks/routes/api/workshop/channels/_id/index4.get.mjs.map +1 -1
  317. package/.output/server/chunks/routes/api/workshop/channels/_id/index4.post.mjs +1 -1
  318. package/.output/server/chunks/routes/api/workshop/channels/_id/index5.get.mjs +1 -0
  319. package/.output/server/chunks/routes/api/workshop/channels/_id/index5.get.mjs.map +1 -1
  320. package/.output/server/chunks/routes/api/workshop/channels/_id/memories/_memoryId_.delete.mjs +2 -1
  321. package/.output/server/chunks/routes/api/workshop/channels/_id/memories/_memoryId_.delete.mjs.map +1 -1
  322. package/.output/server/chunks/routes/api/workshop/channels/_id/queue.get.mjs +2 -1
  323. package/.output/server/chunks/routes/api/workshop/channels/_id/queue.get.mjs.map +1 -1
  324. package/.output/server/chunks/routes/api/workshop/channels/_id/terminals.get.mjs +2 -1
  325. package/.output/server/chunks/routes/api/workshop/channels/_id/terminals.get.mjs.map +1 -1
  326. package/.output/server/chunks/routes/api/workshop/channels/_id_.delete.mjs +1 -0
  327. package/.output/server/chunks/routes/api/workshop/channels/_id_.delete.mjs.map +1 -1
  328. package/.output/server/chunks/routes/api/workshop/channels/index.get.mjs +2 -1
  329. package/.output/server/chunks/routes/api/workshop/channels/index.get.mjs.map +1 -1
  330. package/.output/server/chunks/routes/api/workshop/channels/index.patch.mjs +1 -1
  331. package/.output/server/chunks/routes/api/workshop/channels.get.mjs +1 -0
  332. package/.output/server/chunks/routes/api/workshop/channels.get.mjs.map +1 -1
  333. package/.output/server/chunks/routes/api/workshop/channels.post.mjs +4 -4
  334. package/.output/server/chunks/routes/api/workshop/daq/_id/bind.post.mjs +2 -1
  335. package/.output/server/chunks/routes/api/workshop/daq/_id/bind.post.mjs.map +1 -1
  336. package/.output/server/chunks/routes/api/workshop/daq/_id/bindings.put.mjs +2 -1
  337. package/.output/server/chunks/routes/api/workshop/daq/_id/bindings.put.mjs.map +1 -1
  338. package/.output/server/chunks/routes/api/workshop/daq/_id/frames/content.get.mjs +2 -1
  339. package/.output/server/chunks/routes/api/workshop/daq/_id/frames/content.get.mjs.map +1 -1
  340. package/.output/server/chunks/routes/api/workshop/daq/_id/frames.get.mjs +2 -1
  341. package/.output/server/chunks/routes/api/workshop/daq/_id/frames.get.mjs.map +1 -1
  342. package/.output/server/chunks/routes/api/workshop/daq/_id/samples.get.mjs +2 -1
  343. package/.output/server/chunks/routes/api/workshop/daq/_id/samples.get.mjs.map +1 -1
  344. package/.output/server/chunks/routes/api/workshop/daq/_id/test.post.mjs +2 -1
  345. package/.output/server/chunks/routes/api/workshop/daq/_id/test.post.mjs.map +1 -1
  346. package/.output/server/chunks/routes/api/workshop/daq/_id_.delete.mjs +3 -1
  347. package/.output/server/chunks/routes/api/workshop/daq/_id_.delete.mjs.map +1 -1
  348. package/.output/server/chunks/routes/api/workshop/daq/_id_.patch.mjs +2 -1
  349. package/.output/server/chunks/routes/api/workshop/daq/_id_.patch.mjs.map +1 -1
  350. package/.output/server/chunks/routes/api/workshop/daq/alarms/_id/ack.post.mjs +2 -1
  351. package/.output/server/chunks/routes/api/workshop/daq/alarms/_id/ack.post.mjs.map +1 -1
  352. package/.output/server/chunks/routes/api/workshop/daq/alarms.get.mjs +2 -1
  353. package/.output/server/chunks/routes/api/workshop/daq/alarms.get.mjs.map +1 -1
  354. package/.output/server/chunks/routes/api/workshop/daq/controller.post.mjs +2 -1
  355. package/.output/server/chunks/routes/api/workshop/daq/controller.post.mjs.map +1 -1
  356. package/.output/server/chunks/routes/api/workshop/daq/index.post.mjs +2 -1
  357. package/.output/server/chunks/routes/api/workshop/daq/index.post.mjs.map +1 -1
  358. package/.output/server/chunks/routes/api/workshop/daq/infra/reconnect.post.mjs +2 -1
  359. package/.output/server/chunks/routes/api/workshop/daq/infra/reconnect.post.mjs.map +1 -1
  360. package/.output/server/chunks/routes/api/workshop/daq/infra.get.mjs +2 -1
  361. package/.output/server/chunks/routes/api/workshop/daq/infra.get.mjs.map +1 -1
  362. package/.output/server/chunks/routes/api/workshop/daq/templates/_key_.delete.mjs +2 -1
  363. package/.output/server/chunks/routes/api/workshop/daq/templates/_key_.delete.mjs.map +1 -1
  364. package/.output/server/chunks/routes/api/workshop/daq/templates/_key_.patch.mjs +2 -1
  365. package/.output/server/chunks/routes/api/workshop/daq/templates/_key_.patch.mjs.map +1 -1
  366. package/.output/server/chunks/routes/api/workshop/daq/test-driver.post.mjs +2 -1
  367. package/.output/server/chunks/routes/api/workshop/daq/test-driver.post.mjs.map +1 -1
  368. package/.output/server/chunks/routes/api/workshop/dcw/_id/bind.post.mjs +2 -1
  369. package/.output/server/chunks/routes/api/workshop/dcw/_id/bind.post.mjs.map +1 -1
  370. package/.output/server/chunks/routes/api/workshop/dcw/_id/bindings.put.mjs +2 -1
  371. package/.output/server/chunks/routes/api/workshop/dcw/_id/bindings.put.mjs.map +1 -1
  372. package/.output/server/chunks/routes/api/workshop/dcw/_id/param-ledger.get.mjs +2 -1
  373. package/.output/server/chunks/routes/api/workshop/dcw/_id/param-ledger.get.mjs.map +1 -1
  374. package/.output/server/chunks/routes/api/workshop/dcw/_id/read.post.mjs +2 -1
  375. package/.output/server/chunks/routes/api/workshop/dcw/_id/read.post.mjs.map +1 -1
  376. package/.output/server/chunks/routes/api/workshop/dcw/_id/test.post.mjs +2 -1
  377. package/.output/server/chunks/routes/api/workshop/dcw/_id/test.post.mjs.map +1 -1
  378. package/.output/server/chunks/routes/api/workshop/dcw/_id/write.post.mjs +2 -1
  379. package/.output/server/chunks/routes/api/workshop/dcw/_id/write.post.mjs.map +1 -1
  380. package/.output/server/chunks/routes/api/workshop/dcw/_id_.delete.mjs +2 -1
  381. package/.output/server/chunks/routes/api/workshop/dcw/_id_.delete.mjs.map +1 -1
  382. package/.output/server/chunks/routes/api/workshop/dcw/_id_.patch.mjs +7 -2
  383. package/.output/server/chunks/routes/api/workshop/dcw/_id_.patch.mjs.map +1 -1
  384. package/.output/server/chunks/routes/api/workshop/dcw/controller.post.mjs +2 -1
  385. package/.output/server/chunks/routes/api/workshop/dcw/controller.post.mjs.map +1 -1
  386. package/.output/server/chunks/routes/api/workshop/dcw/index.get.mjs +2 -1
  387. package/.output/server/chunks/routes/api/workshop/dcw/index.get.mjs.map +1 -1
  388. package/.output/server/chunks/routes/api/workshop/dcw/index.post.mjs +2 -1
  389. package/.output/server/chunks/routes/api/workshop/dcw/index.post.mjs.map +1 -1
  390. package/.output/server/chunks/routes/api/workshop/dcw/index2.get.mjs +2 -1
  391. package/.output/server/chunks/routes/api/workshop/dcw/index2.get.mjs.map +1 -1
  392. package/.output/server/chunks/routes/api/workshop/dcw/index2.post.mjs +2 -1
  393. package/.output/server/chunks/routes/api/workshop/dcw/index2.post.mjs.map +1 -1
  394. package/.output/server/chunks/routes/api/workshop/dcw/index3.get.mjs +2 -1
  395. package/.output/server/chunks/routes/api/workshop/dcw/index3.get.mjs.map +1 -1
  396. package/.output/server/chunks/routes/api/workshop/dcw/index3.post.mjs +2 -1
  397. package/.output/server/chunks/routes/api/workshop/dcw/index3.post.mjs.map +1 -1
  398. package/.output/server/chunks/routes/api/workshop/dcw/index4.get.mjs +2 -1
  399. package/.output/server/chunks/routes/api/workshop/dcw/index4.get.mjs.map +1 -1
  400. package/.output/server/chunks/routes/api/workshop/dcw/index4.post.mjs +2 -1
  401. package/.output/server/chunks/routes/api/workshop/dcw/index4.post.mjs.map +1 -1
  402. package/.output/server/chunks/routes/api/workshop/dcw/index5.get.mjs +2 -1
  403. package/.output/server/chunks/routes/api/workshop/dcw/index5.get.mjs.map +1 -1
  404. package/.output/server/chunks/routes/api/workshop/dcw/journal/node/_nodeId/rollback.post.mjs +2 -1
  405. package/.output/server/chunks/routes/api/workshop/dcw/journal/node/_nodeId/rollback.post.mjs.map +1 -1
  406. package/.output/server/chunks/routes/api/workshop/dcw/line/query.get.mjs +2 -1
  407. package/.output/server/chunks/routes/api/workshop/dcw/line/query.get.mjs.map +1 -1
  408. package/.output/server/chunks/routes/api/workshop/dcw/lines/_id/start.post.mjs +2 -1
  409. package/.output/server/chunks/routes/api/workshop/dcw/lines/_id/start.post.mjs.map +1 -1
  410. package/.output/server/chunks/routes/api/workshop/dcw/lines/_id/stop.post.mjs +2 -1
  411. package/.output/server/chunks/routes/api/workshop/dcw/lines/_id/stop.post.mjs.map +1 -1
  412. package/.output/server/chunks/routes/api/workshop/dcw/lines/_id_.delete.mjs +2 -1
  413. package/.output/server/chunks/routes/api/workshop/dcw/lines/_id_.delete.mjs.map +1 -1
  414. package/.output/server/chunks/routes/api/workshop/dcw/lines/_id_.patch.mjs +2 -1
  415. package/.output/server/chunks/routes/api/workshop/dcw/lines/_id_.patch.mjs.map +1 -1
  416. package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id/judge.post.mjs +2 -1
  417. package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id/judge.post.mjs.map +1 -1
  418. package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id/rollback.post.mjs +2 -1
  419. package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id/rollback.post.mjs.map +1 -1
  420. package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id/series.get.mjs +2 -1
  421. package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id/series.get.mjs.map +1 -1
  422. package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id_.get.mjs +2 -1
  423. package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id_.get.mjs.map +1 -1
  424. package/.output/server/chunks/routes/api/workshop/dcw/products/_id_.delete.mjs +2 -1
  425. package/.output/server/chunks/routes/api/workshop/dcw/products/_id_.delete.mjs.map +1 -1
  426. package/.output/server/chunks/routes/api/workshop/dcw/products/_id_.patch.mjs +2 -1
  427. package/.output/server/chunks/routes/api/workshop/dcw/products/_id_.patch.mjs.map +1 -1
  428. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/apply.post.mjs +2 -1
  429. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/apply.post.mjs.map +1 -1
  430. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/mark-good.post.mjs +2 -1
  431. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/mark-good.post.mjs.map +1 -1
  432. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/revert.post.mjs +2 -1
  433. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/revert.post.mjs.map +1 -1
  434. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/rollback-good.post.mjs +2 -1
  435. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/rollback-good.post.mjs.map +1 -1
  436. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/versions.get.mjs +2 -1
  437. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/versions.get.mjs.map +1 -1
  438. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id_.delete.mjs +2 -1
  439. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id_.delete.mjs.map +1 -1
  440. package/.output/server/chunks/routes/api/workshop/dcw/recipes/index.patch.mjs +2 -1
  441. package/.output/server/chunks/routes/api/workshop/dcw/recipes/index.patch.mjs.map +1 -1
  442. package/.output/server/chunks/routes/api/workshop/dcw/runs/_id/close.post.mjs +2 -1
  443. package/.output/server/chunks/routes/api/workshop/dcw/runs/_id/close.post.mjs.map +1 -1
  444. package/.output/server/chunks/routes/api/workshop/dcw/runs/_id/data.get.mjs +2 -1
  445. package/.output/server/chunks/routes/api/workshop/dcw/runs/_id/data.get.mjs.map +1 -1
  446. package/.output/server/chunks/routes/api/workshop/dcw/runs/_id/rollback.post.mjs +2 -1
  447. package/.output/server/chunks/routes/api/workshop/dcw/runs/_id/rollback.post.mjs.map +1 -1
  448. package/.output/server/chunks/routes/api/workshop/dcw/templates/_key_.delete.mjs +2 -1
  449. package/.output/server/chunks/routes/api/workshop/dcw/templates/_key_.delete.mjs.map +1 -1
  450. package/.output/server/chunks/routes/api/workshop/dcw/templates/_key_.patch.mjs +2 -1
  451. package/.output/server/chunks/routes/api/workshop/dcw/templates/_key_.patch.mjs.map +1 -1
  452. package/.output/server/chunks/routes/api/workshop/dcw/test-driver.post.mjs +2 -1
  453. package/.output/server/chunks/routes/api/workshop/dcw/test-driver.post.mjs.map +1 -1
  454. package/.output/server/chunks/routes/api/workshop/device-twins/_id/control.post.mjs +2 -1
  455. package/.output/server/chunks/routes/api/workshop/device-twins/_id/control.post.mjs.map +1 -1
  456. package/.output/server/chunks/routes/api/workshop/device-twins/_id/telemetry.post.mjs +2 -1
  457. package/.output/server/chunks/routes/api/workshop/device-twins/_id/telemetry.post.mjs.map +1 -1
  458. package/.output/server/chunks/routes/api/workshop/device-twins/_id_.delete.mjs +2 -1
  459. package/.output/server/chunks/routes/api/workshop/device-twins/_id_.delete.mjs.map +1 -1
  460. package/.output/server/chunks/routes/api/workshop/device-twins/_id_.patch.mjs +2 -1
  461. package/.output/server/chunks/routes/api/workshop/device-twins/_id_.patch.mjs.map +1 -1
  462. package/.output/server/chunks/routes/api/workshop/fs/dirs.get.mjs +2 -1
  463. package/.output/server/chunks/routes/api/workshop/fs/dirs.get.mjs.map +1 -1
  464. package/.output/server/chunks/routes/api/workshop/harnesses/_id/providers.get.mjs +32 -1
  465. package/.output/server/chunks/routes/api/workshop/harnesses/_id/providers.get.mjs.map +1 -1
  466. package/.output/server/chunks/routes/api/workshop/harnesses.get.mjs +2 -1
  467. package/.output/server/chunks/routes/api/workshop/harnesses.get.mjs.map +1 -1
  468. package/.output/server/chunks/routes/api/workshop/hitl/pending.get.mjs +2 -1
  469. package/.output/server/chunks/routes/api/workshop/hitl/pending.get.mjs.map +1 -1
  470. package/.output/server/chunks/routes/api/workshop/hitl/respond.post.mjs +3 -2
  471. package/.output/server/chunks/routes/api/workshop/hitl/respond.post.mjs.map +1 -1
  472. package/.output/server/chunks/routes/api/workshop/index.get.mjs +1 -0
  473. package/.output/server/chunks/routes/api/workshop/index.get.mjs.map +1 -1
  474. package/.output/server/chunks/routes/api/workshop/index.post.mjs +1 -1
  475. package/.output/server/chunks/routes/api/workshop/index.put.mjs +2 -1
  476. package/.output/server/chunks/routes/api/workshop/index.put.mjs.map +1 -1
  477. package/.output/server/chunks/routes/api/workshop/index10.get.mjs +12 -6
  478. package/.output/server/chunks/routes/api/workshop/index10.get.mjs.map +1 -1
  479. package/.output/server/chunks/routes/api/workshop/index11.get.mjs +4 -2
  480. package/.output/server/chunks/routes/api/workshop/index11.get.mjs.map +1 -1
  481. package/.output/server/chunks/routes/api/workshop/index12.get.mjs +28 -0
  482. package/.output/server/chunks/routes/api/workshop/index12.get.mjs.map +1 -0
  483. package/.output/server/chunks/routes/api/workshop/index2.get.mjs +17 -11
  484. package/.output/server/chunks/routes/api/workshop/index2.get.mjs.map +1 -1
  485. package/.output/server/chunks/routes/api/workshop/index2.post.mjs +1 -1
  486. package/.output/server/chunks/routes/api/workshop/index3.get.mjs +11 -4
  487. package/.output/server/chunks/routes/api/workshop/index3.get.mjs.map +1 -1
  488. package/.output/server/chunks/routes/api/workshop/index3.post.mjs +2 -1
  489. package/.output/server/chunks/routes/api/workshop/index3.post.mjs.map +1 -1
  490. package/.output/server/chunks/routes/api/workshop/index4.get.mjs +5 -27
  491. package/.output/server/chunks/routes/api/workshop/index4.get.mjs.map +1 -1
  492. package/.output/server/chunks/routes/api/workshop/index4.post.mjs +2 -1
  493. package/.output/server/chunks/routes/api/workshop/index4.post.mjs.map +1 -1
  494. package/.output/server/chunks/routes/api/workshop/index5.get.mjs +24 -18
  495. package/.output/server/chunks/routes/api/workshop/index5.get.mjs.map +1 -1
  496. package/.output/server/chunks/routes/api/workshop/index5.post.mjs +2 -1
  497. package/.output/server/chunks/routes/api/workshop/index5.post.mjs.map +1 -1
  498. package/.output/server/chunks/routes/api/workshop/index6.get.mjs +23 -5
  499. package/.output/server/chunks/routes/api/workshop/index6.get.mjs.map +1 -1
  500. package/.output/server/chunks/routes/api/workshop/index6.post.mjs +2 -1
  501. package/.output/server/chunks/routes/api/workshop/index6.post.mjs.map +1 -1
  502. package/.output/server/chunks/routes/api/workshop/index7.get.mjs +4 -17
  503. package/.output/server/chunks/routes/api/workshop/index7.get.mjs.map +1 -1
  504. package/.output/server/chunks/routes/api/workshop/index7.post.mjs +8 -3
  505. package/.output/server/chunks/routes/api/workshop/index7.post.mjs.map +1 -1
  506. package/.output/server/chunks/routes/api/workshop/index8.get.mjs +20 -21
  507. package/.output/server/chunks/routes/api/workshop/index8.get.mjs.map +1 -1
  508. package/.output/server/chunks/routes/api/workshop/index8.post.mjs +1 -1
  509. package/.output/server/chunks/routes/api/workshop/index9.get.mjs +24 -11
  510. package/.output/server/chunks/routes/api/workshop/index9.get.mjs.map +1 -1
  511. package/.output/server/chunks/routes/api/workshop/mailbox/all.get.mjs +1 -0
  512. package/.output/server/chunks/routes/api/workshop/mailbox/all.get.mjs.map +1 -1
  513. package/.output/server/chunks/routes/api/workshop/mailbox.get.mjs +1 -0
  514. package/.output/server/chunks/routes/api/workshop/mailbox.get.mjs.map +1 -1
  515. package/.output/server/chunks/routes/api/workshop/memories/maintenance.post.mjs +2 -1
  516. package/.output/server/chunks/routes/api/workshop/memories/maintenance.post.mjs.map +1 -1
  517. package/.output/server/chunks/routes/api/workshop/plugins/_name/disable.post.mjs +2 -1
  518. package/.output/server/chunks/routes/api/workshop/plugins/_name/disable.post.mjs.map +1 -1
  519. package/.output/server/chunks/routes/api/workshop/plugins/_name/enable.post.mjs +2 -1
  520. package/.output/server/chunks/routes/api/workshop/plugins/_name/enable.post.mjs.map +1 -1
  521. package/.output/server/chunks/routes/api/workshop/plugins/index.get.mjs +2 -1
  522. package/.output/server/chunks/routes/api/workshop/plugins/index.get.mjs.map +1 -1
  523. package/.output/server/chunks/routes/api/workshop/runtime.get.mjs +1 -0
  524. package/.output/server/chunks/routes/api/workshop/runtime.get.mjs.map +1 -1
  525. package/.output/server/chunks/routes/api/workshop/scene/layouts/_channelId_.delete.mjs +2 -1
  526. package/.output/server/chunks/routes/api/workshop/scene/layouts/_channelId_.delete.mjs.map +1 -1
  527. package/.output/server/chunks/routes/api/workshop/scene/layouts/_channelId_.put.mjs +2 -1
  528. package/.output/server/chunks/routes/api/workshop/scene/layouts/_channelId_.put.mjs.map +1 -1
  529. package/.output/server/chunks/routes/api/workshop/scene/layouts.get.mjs +1 -0
  530. package/.output/server/chunks/routes/api/workshop/scene/layouts.get.mjs.map +1 -1
  531. package/.output/server/chunks/routes/api/workshop/tasks/_id/complete.post.mjs +1 -1
  532. package/.output/server/chunks/routes/api/workshop/tasks/_id/dispatch.post.mjs +1 -1
  533. package/.output/server/chunks/routes/api/workshop/tasks/_id/index.post.mjs +2 -1
  534. package/.output/server/chunks/routes/api/workshop/tasks/_id/index.post.mjs.map +1 -1
  535. package/.output/server/chunks/routes/api/workshop/tasks/_id/report.post.mjs +1 -1
  536. package/.output/server/chunks/routes/api/workshop/tasks/_id/retry.post.mjs +2 -1
  537. package/.output/server/chunks/routes/api/workshop/tasks/_id/retry.post.mjs.map +1 -1
  538. package/.output/server/chunks/routes/api/workshop/tasks/_id_.get.mjs +2 -1
  539. package/.output/server/chunks/routes/api/workshop/tasks/_id_.get.mjs.map +1 -1
  540. package/.output/server/chunks/routes/api/workshop/tasks.get.mjs +1 -0
  541. package/.output/server/chunks/routes/api/workshop/tasks.get.mjs.map +1 -1
  542. package/.output/server/chunks/routes/api/workshop/teams/_id/deploy.post.mjs +1 -1
  543. package/.output/server/chunks/routes/api/workshop/teams/_id/index.get.mjs +2 -1
  544. package/.output/server/chunks/routes/api/workshop/teams/_id/index.get.mjs.map +1 -1
  545. package/.output/server/chunks/routes/api/workshop/teams/_id/index.post.mjs +1 -1
  546. package/.output/server/chunks/routes/api/workshop/teams/_id/index.put.mjs +44 -0
  547. package/.output/server/chunks/routes/api/workshop/teams/_id/index.put.mjs.map +1 -0
  548. package/.output/server/chunks/routes/api/workshop/teams/_id/index2.get.mjs +47 -0
  549. package/.output/server/chunks/routes/api/workshop/teams/_id/index2.get.mjs.map +1 -0
  550. package/.output/server/chunks/routes/api/workshop/teams/_id/members/_agentId_.delete.mjs +2 -1
  551. package/.output/server/chunks/routes/api/workshop/teams/_id/members/_agentId_.delete.mjs.map +1 -1
  552. package/.output/server/chunks/routes/api/workshop/teams/_id_.delete.mjs +2 -1
  553. package/.output/server/chunks/routes/api/workshop/teams/_id_.delete.mjs.map +1 -1
  554. package/.output/server/chunks/routes/api/workshop/teams/_id_.get.mjs +2 -1
  555. package/.output/server/chunks/routes/api/workshop/teams/_id_.get.mjs.map +1 -1
  556. package/.output/server/chunks/routes/api/workshop/teams/_id_.patch.mjs +1 -1
  557. package/.output/server/chunks/routes/api/workshop/users/me.get.mjs +2 -0
  558. package/.output/server/chunks/routes/api/workshop/users/me.get.mjs.map +1 -1
  559. package/.output/server/chunks/routes/api/workshop/users/register.post.mjs +1 -1
  560. package/.output/server/chunks/routes/api/workshop/workspaces/_id/channel-templates/_tplId_.post.mjs +2 -2
  561. package/.output/server/chunks/routes/api/workshop/workspaces/_id/channels/_channelId_.delete.mjs +1 -0
  562. package/.output/server/chunks/routes/api/workshop/workspaces/_id/channels/_channelId_.delete.mjs.map +1 -1
  563. package/.output/server/chunks/routes/api/workshop/workspaces/_id/channels/_channelId_.post.mjs +1 -0
  564. package/.output/server/chunks/routes/api/workshop/workspaces/_id/channels/_channelId_.post.mjs.map +1 -1
  565. package/.output/server/chunks/routes/api/workshop/workspaces/index.delete.mjs +1 -0
  566. package/.output/server/chunks/routes/api/workshop/workspaces/index.delete.mjs.map +1 -1
  567. package/.output/server/chunks/routes/renderer.mjs +2 -2
  568. package/.output/server/chunks/virtual/entry.mjs +601 -36
  569. package/.output/server/chunks/virtual/entry.mjs.map +1 -1
  570. package/.output/server/chunks/virtual/precomputed.mjs +1 -1
  571. package/.output/server/index.mjs +1 -0
  572. package/.output/server/node_modules/@anthropic-ai/claude-agent-sdk/package.json +84 -0
  573. package/.output/server/node_modules/@anthropic-ai/claude-agent-sdk/sdk.mjs +225 -0
  574. package/.output/server/package.json +2 -1
  575. package/README-zh.md +507 -478
  576. package/README.md +517 -486
  577. package/app/app.vue +17 -2
  578. package/app/assets/css/main.css +421 -30
  579. package/app/components/AppHeader.vue +17 -0
  580. package/app/components/AppSidebar.vue +162 -63
  581. package/app/components/AwChart.vue +57 -54
  582. package/app/components/workshop/ChannelSessionList.vue +802 -703
  583. package/app/components/workshop/DaqNodeRow.vue +156 -0
  584. package/app/components/workshop/PluginSlot.vue +120 -0
  585. package/app/composables/workshop/useAmlStream.ts +136 -0
  586. package/app/composables/workshop/useDaqStream.ts +8 -1
  587. package/app/composables/workshop/usePluginPanels.ts +72 -0
  588. package/app/composables/workshop/useWorkshopApi.ts +7 -0
  589. package/app/pages/aml/index.vue +1949 -0
  590. package/app/pages/daq/[id].vue +60 -2
  591. package/app/pages/daq/index.vue +7 -148
  592. package/app/pages/index.vue +235 -213
  593. package/app/pages/plugins/index.vue +280 -274
  594. package/app/pages/settings.vue +555 -78
  595. package/app/pages/workshop/agents.vue +23 -1
  596. package/app/pages/workshop/teams.vue +2 -2
  597. package/app/plugins/aw-plugins.client.ts +95 -6
  598. package/app/plugins/runtime-config.client.ts +4 -14
  599. package/app/plugins/theme.client.ts +13 -3
  600. package/app/stores/app.ts +9 -2
  601. package/app/stores/runtime-config.ts +113 -7
  602. package/cli/aw.mjs +16 -3
  603. package/cli/commands/build.mjs +8 -8
  604. package/cli/commands/dev.mjs +5 -13
  605. package/cli/commands/init.mjs +1 -1
  606. package/cli/commands/start.mjs +10 -17
  607. package/cli/core/args.mjs +85 -4
  608. package/cli/core/child-lifecycle.mjs +136 -0
  609. package/config.yml +24 -0
  610. package/docs/plugins.md +128 -220
  611. package/docs/sdk.md +1 -1
  612. package/i18n/dicts/_en.json +43 -2
  613. package/i18n/dicts/aml.json +163 -0
  614. package/i18n/dicts/channelSessionList.json +4 -1
  615. package/i18n/dicts/daqDetail.json +1 -0
  616. package/i18n/dicts/settings.json +33 -1
  617. package/i18n/dicts/teams.json +9 -1
  618. package/i18n/locales/en.ts +364 -132
  619. package/i18n/locales/zh-CN.ts +433 -201
  620. package/nuxt.config.ts +18 -3
  621. package/package.json +153 -149
  622. package/scripts/_audit/.tmp/audit-data/dcws.json +28 -0
  623. package/scripts/_audit/.tmp/dcw-writes.json +15650 -0
  624. package/scripts/_audit/.tmp/dcws.json +9033 -0
  625. package/scripts/_audit/.tmp/pollution-backup/dcw-rollback.polluted.json +470006 -0
  626. package/scripts/_audit/.tmp/pollution-backup/dcws.polluted.json +9085 -0
  627. package/scripts/_audit/.tmp/probe-cwd.txt +1 -0
  628. package/scripts/_audit/audit-harness-adapters.md +664 -0
  629. package/scripts/_audit/awhome/commands/README.md +3 -0
  630. package/scripts/_audit/awhome/commands/hello.mjs +12 -0
  631. package/scripts/_audit/dcw-controller-e2e.ts +99 -0
  632. package/scripts/_audit/dcw-flush-cost.ts +43 -0
  633. package/scripts/_audit/dcw-rollback-ledger.ts +153 -0
  634. package/scripts/_audit/dcw-unrecorded-write.ts +171 -0
  635. package/scripts/_audit/dcw-write-mutex.ts +157 -0
  636. package/scripts/_audit/diag-cwd.ts +20 -0
  637. package/scripts/_audit/diag-cwd2.ts +19 -0
  638. package/scripts/_audit/exp-cost-scaling.mjs +54 -0
  639. package/scripts/_audit/exp-envelope-and-png.mjs +77 -0
  640. package/scripts/_audit/exp-png-decode.mjs +67 -0
  641. package/scripts/_audit/exp-retention-plan.mjs +61 -0
  642. package/scripts/_audit/exp-retention-rescan.mjs +42 -0
  643. package/scripts/_audit/exp-sweep-fairness.mjs +48 -0
  644. package/scripts/_audit/hello.mjs +12 -0
  645. package/scripts/_audit/http-api-authz-audit.md +657 -0
  646. package/scripts/_audit/ndjson-partial-line-repro.mjs +77 -0
  647. package/scripts/_audit/opencode-await-ternary-repro.mjs +20 -0
  648. package/scripts/_audit/part-frag.txt +84 -0
  649. package/scripts/_audit/part-head.txt +45 -0
  650. package/scripts/_audit/probe-binding.mjs +103 -0
  651. package/scripts/_audit/probe-child.mjs +17 -0
  652. package/scripts/_audit/probe-envelope.mjs +49 -0
  653. package/scripts/_audit/probe-packlist.mjs +67 -0
  654. package/scripts/_audit/probe-routes.mjs +47 -0
  655. package/scripts/_audit/probe-routes2.mjs +38 -0
  656. package/scripts/_audit/probe.ts +9 -0
  657. package/scripts/_audit/probe2.ts +6 -0
  658. package/scripts/_audit/probe3.ts +3 -0
  659. package/scripts/_audit/probe4.ts +3 -0
  660. package/scripts/_audit/proj/.AgentWorkShop/commands/echoargs.mjs +13 -0
  661. package/scripts/_audit/proj/config.yml +1 -0
  662. package/scripts/_audit/run.mjs +30 -0
  663. package/scripts/_audit/runtime-audit.md +716 -0
  664. package/scripts/_audit/ts-resolve-hook.mjs +41 -0
  665. package/scripts/_audit/tsconfig.probe.json +24 -0
  666. package/scripts/_audit/typecheck-out.txt +466 -0
  667. package/scripts/_audit/verify-data-integrity.mjs +112 -0
  668. package/scripts/_dbg-agents-dropdown-shot.py +33 -0
  669. package/scripts/_dbg-anim-verify.mjs +1 -1
  670. package/scripts/_dbg-audit-all-pages.mjs +1 -1
  671. package/scripts/_dbg-availability-probe.ts +11 -0
  672. package/scripts/_dbg-bind-bidi-e2e.mjs +1 -1
  673. package/scripts/_dbg-cf-line-shot.mjs +18 -0
  674. package/scripts/_dbg-channel-plugin-ui.mjs +94 -0
  675. package/scripts/_dbg-configroot-audit.mjs +84 -0
  676. package/scripts/_dbg-crash-recovery.mjs +1 -1
  677. package/scripts/_dbg-crush-probe.sh +21 -0
  678. package/scripts/_dbg-crush-spawn-probe.ts +22 -0
  679. package/scripts/_dbg-daq-acc-probe.mjs +1 -1
  680. package/scripts/_dbg-daq-attrib.mjs +1 -1
  681. package/scripts/_dbg-daq-debug.mjs +1 -1
  682. package/scripts/_dbg-daq-diag.mjs +1 -1
  683. package/scripts/_dbg-daq-e2e.mjs +1 -1
  684. package/scripts/_dbg-daq-filter-e2e.mjs +1 -1
  685. package/scripts/_dbg-daq-filter-e2e2.mjs +1 -1
  686. package/scripts/_dbg-daq-final-regression.mjs +1 -1
  687. package/scripts/_dbg-daq-frame-alarm.mjs +1 -1
  688. package/scripts/_dbg-daq-frame-ui.mjs +1 -1
  689. package/scripts/_dbg-daq-frame-ws.mjs +1 -1
  690. package/scripts/_dbg-daq-frames-e2e.mjs +1 -1
  691. package/scripts/_dbg-daq-full-check.mjs +1 -1
  692. package/scripts/_dbg-daq-intervals-func.mjs +94 -0
  693. package/scripts/_dbg-daq-pages-shot.mjs +1 -1
  694. package/scripts/_dbg-daq-perf.mjs +1 -1
  695. package/scripts/_dbg-daq-probe.mjs +1 -1
  696. package/scripts/_dbg-daq-recipe-e2e.mjs +1 -1
  697. package/scripts/_dbg-daq-rows-probe.mjs +1 -1
  698. package/scripts/_dbg-daq-rowstate-e2e.mjs +1 -1
  699. package/scripts/_dbg-daq-rowstate-shot.mjs +1 -1
  700. package/scripts/_dbg-daq-rowstate-shot2.mjs +1 -1
  701. package/scripts/_dbg-daq-rowstyle-verify.mjs +112 -0
  702. package/scripts/_dbg-dash-console-check.mjs +1 -1
  703. package/scripts/_dbg-dash-deep-probe.mjs +1 -1
  704. package/scripts/_dbg-dash-hitpoint.mjs +1 -1
  705. package/scripts/_dbg-dcw-read-rest.mjs +1 -1
  706. package/scripts/_dbg-dcw-read-ui.mjs +1 -1
  707. package/scripts/_dbg-dcw-shot2.mjs +1 -1
  708. package/scripts/_dbg-diag-mock-loop.mjs +89 -0
  709. package/scripts/_dbg-diag-watch.mjs +95 -0
  710. package/scripts/_dbg-error-probe.mjs +2 -2
  711. package/scripts/_dbg-filter-light-verify.mjs +1 -1
  712. package/scripts/_dbg-final-acceptance-2.mjs +1 -1
  713. package/scripts/_dbg-final-acceptance.mjs +1 -1
  714. package/scripts/_dbg-final-full-e2e.mjs +1 -1
  715. package/scripts/_dbg-final-shots.mjs +32 -0
  716. package/scripts/_dbg-final-t6-hitl.mjs +1 -1
  717. package/scripts/_dbg-fix-unused-imports.py +41 -0
  718. package/scripts/_dbg-fresh-scene-e2e.mjs +1 -1
  719. package/scripts/_dbg-goose-probe.mjs +33 -0
  720. package/scripts/_dbg-goose-probe.sh +10 -0
  721. package/scripts/_dbg-groups-ui-verify.mjs +122 -0
  722. package/scripts/_dbg-harness-cancel-repro.mjs +81 -0
  723. package/scripts/_dbg-harness-ui-shot.py +109 -0
  724. package/scripts/_dbg-hidden-check.mjs +1 -1
  725. package/scripts/_dbg-home-repro.mjs +1 -1
  726. package/scripts/_dbg-home-stack.mjs +1 -1
  727. package/scripts/_dbg-hydration-detail.mjs +1 -1
  728. package/scripts/_dbg-infra-lifecycle.mjs +1 -1
  729. package/scripts/_dbg-line-live-e2e.mjs +1 -1
  730. package/scripts/_dbg-line-repo-test.ts +10 -0
  731. package/scripts/_dbg-login-debug.py +23 -0
  732. package/scripts/_dbg-modbus-latency.mjs +22 -0
  733. package/scripts/_dbg-mqtt-chain-e2e.mjs +1 -1
  734. package/scripts/_dbg-oneshot-impl-probe.ts +67 -0
  735. package/scripts/_dbg-opslog-agent-e2e.mjs +5 -2
  736. package/scripts/_dbg-opt-team-e2e.mjs +1 -1
  737. package/scripts/_dbg-panesplitter-fix-check.mjs +1 -1
  738. package/scripts/_dbg-phase-e3-monitor.mjs +1 -1
  739. package/scripts/_dbg-pi-spawn-probe.ts +33 -0
  740. package/scripts/_dbg-plc-e2e.mjs +1 -1
  741. package/scripts/_dbg-plugin-config-ui.mjs +111 -0
  742. package/scripts/_dbg-plugin-panels-ui.mjs +54 -0
  743. package/scripts/_dbg-plugin-sink-rest.mjs +1 -1
  744. package/scripts/_dbg-plugin-sink-ui.mjs +1 -1
  745. package/scripts/_dbg-plugin-ui-wizard.mjs +1 -1
  746. package/scripts/_dbg-plugin-verify-e2e.mjs +1 -1
  747. package/scripts/_dbg-pop-clamp-verify.mjs +1 -1
  748. package/scripts/_dbg-preview-console.mjs +1 -1
  749. package/scripts/_dbg-preview-minrepro.mjs +1 -1
  750. package/scripts/_dbg-preview-pixels.mjs +1 -1
  751. package/scripts/_dbg-quality-pages-e2e.mjs +1 -1
  752. package/scripts/_dbg-qwen-acp-probe.mjs +30 -0
  753. package/scripts/_dbg-qwen-capture.mjs +21 -0
  754. package/scripts/_dbg-rail-tree-e2e.mjs +1 -1
  755. package/scripts/_dbg-real-driver-e2e.mjs +1 -1
  756. package/scripts/_dbg-real-scenario-timeline.log +55 -123
  757. package/scripts/_dbg-redesign-shots.mjs +1 -1
  758. package/scripts/_dbg-release-smoke.mjs +1 -1
  759. package/scripts/_dbg-resolve-probe.ts +6 -0
  760. package/scripts/_dbg-restart-persist.mjs +1 -1
  761. package/scripts/_dbg-sc001-dispatch.mjs +1 -1
  762. package/scripts/_dbg-scenario-final-shot.mjs +1 -1
  763. package/scripts/_dbg-scenario-phase-e2.mjs +1 -1
  764. package/scripts/_dbg-scenario-phase-e3.mjs +1 -1
  765. package/scripts/_dbg-scenario-phase1.mjs +1 -1
  766. package/scripts/_dbg-scenario-phase2.mjs +1 -1
  767. package/scripts/_dbg-scenario-phase3-monitor.mjs +1 -1
  768. package/scripts/_dbg-scenario-phase3.mjs +1 -1
  769. package/scripts/_dbg-settings-draft-probe.mjs +39 -0
  770. package/scripts/_dbg-settings-probe.mjs +33 -0
  771. package/scripts/_dbg-task-cancel-probe.mjs +66 -0
  772. package/scripts/_dbg-town-alarm-e2e.mjs +1 -1
  773. package/scripts/_dbg-town-daq-shot.mjs +1 -1
  774. package/scripts/_dbg-town-full-e2e.mjs +1 -1
  775. package/scripts/_dbg-town-gate.mjs +1 -1
  776. package/scripts/_dbg-town-ins-probe.mjs +1 -1
  777. package/scripts/_dbg-town-perf.mjs +1 -1
  778. package/scripts/_dbg-town-realtime.mjs +1 -1
  779. package/scripts/_dbg-town-shot.py +25 -0
  780. package/scripts/_dbg-town-shot3.mjs +1 -1
  781. package/scripts/_dbg-town-smoke.mjs +54 -0
  782. package/scripts/_dbg-town-truth.mjs +1 -1
  783. package/scripts/_dbg-town-truth2.mjs +1 -1
  784. package/scripts/_dbg-trend-expand-test.mjs +1 -1
  785. package/scripts/_dbg-twindaq-focus.mjs +1 -1
  786. package/scripts/_dbg-ui-polish-shot.mjs +1 -1
  787. package/scripts/_dbg-ui-polish-verify1.mjs +1 -1
  788. package/scripts/_dbg-ui-polish-verify2.mjs +1 -1
  789. package/scripts/_dbg-ui-polish-verify3.mjs +1 -1
  790. package/scripts/_dbg-ui-polish-verify4.mjs +1 -1
  791. package/scripts/_dbg-unify-shot.mjs +1 -1
  792. package/scripts/_dbg-uplink-probe.mjs +1 -1
  793. package/scripts/_dbg-wizard-preview-shot.mjs +1 -1
  794. package/scripts/_dbg-wizard-ui-e2e.mjs +1 -1
  795. package/scripts/_dbg-ws-probe.mjs +1 -1
  796. package/scripts/_dbg-wsdot-sanity.mjs +1 -1
  797. package/scripts/_node-state-probe.mjs +1 -1
  798. package/scripts/_tmp-args-probe.mjs +20 -0
  799. package/scripts/_tmp-cyc-entry.mjs +8 -0
  800. package/scripts/_tmp-cyc-main.mjs +5 -0
  801. package/scripts/_tmp-cyc-mod.mjs +2 -0
  802. package/scripts/_tmp-cycle-a.mjs +6 -0
  803. package/scripts/_tmp-cycle-b.mjs +2 -0
  804. package/scripts/_tmp-cycle-probe.mjs +4 -0
  805. package/scripts/_tmp-entry-variant.mjs +2 -0
  806. package/scripts/_tmp-help-probe.mjs +19 -0
  807. package/scripts/_tmp-help-probe2.mjs +2 -0
  808. package/scripts/_tmp-trace-preload.mjs +1 -0
  809. package/scripts/aml-agent-bridge.ts +230 -0
  810. package/scripts/aml-industrial-loop.ts +232 -0
  811. package/scripts/aml-ui-smoke.mjs +67 -0
  812. package/scripts/aw-start-smoke.mjs +194 -0
  813. package/scripts/design-verify-templates.mjs +1 -1
  814. package/scripts/device-line-restore.mjs +1 -1
  815. package/scripts/e2e-aml.ts +259 -0
  816. package/scripts/e2e-config-groups.mjs +238 -0
  817. package/scripts/e2e-full-closedloop.mjs +911 -0
  818. package/scripts/e2e-full-scenario.ts +321 -0
  819. package/scripts/e2e-harness-consistency.ts +204 -0
  820. package/scripts/e2e-multi-harness.ts +233 -76
  821. package/scripts/e2e-plc-plugin-closedloop.mjs +518 -0
  822. package/scripts/e2e-real-scenario.mjs +466 -452
  823. package/scripts/e2e-template-isolation.mjs +2 -2
  824. package/scripts/experiment-castfilm-closedloop.mjs +423 -0
  825. package/scripts/experiment-castfilm-finish.mjs +194 -0
  826. package/scripts/experiment-castfilm-ui-shot.mjs +52 -0
  827. package/scripts/experiment-castfilm-viz.mjs +172 -0
  828. package/scripts/production-closed-loop-e2e.mjs +78 -29
  829. package/scripts/test-aml-integration.ts +159 -0
  830. package/scripts/test-aml-job.ts +174 -0
  831. package/scripts/test-aml-unit.ts +184 -0
  832. package/scripts/test-cli-exit.mjs +235 -0
  833. package/scripts/test-daq-frame-race.mjs +310 -0
  834. package/scripts/test-data-root.mjs +208 -0
  835. package/scripts/test-log-flooding.mjs +160 -0
  836. package/scripts/test-lru.mjs +78 -0
  837. package/scripts/test-memory-month-query.mjs +62 -0
  838. package/scripts/test-plugin-hardening.mjs +45 -0
  839. package/scripts/test-rollback-index.mjs +79 -0
  840. package/scripts/test-sdk-surface.mjs +155 -0
  841. package/scripts/three-system-e2e.mjs +662 -448
  842. package/scripts/town-scene-clear.mjs +1 -1
  843. package/sdk/client.d.mts +110 -0
  844. package/sdk/client.mjs +144 -124
  845. package/sdk/context.mjs +161 -1
  846. package/sdk/index.d.mts +37 -5
  847. package/sdk/index.mjs +44 -41
  848. package/sdk/lifecycle.mjs +4 -1
  849. package/server/api/plugins/i18n.get.ts +12 -0
  850. package/server/api/system/config-groups/[id].delete.ts +21 -0
  851. package/server/api/system/config-groups/[id].patch.ts +26 -0
  852. package/server/api/system/config-groups/index.get.ts +21 -0
  853. package/server/api/system/config-groups/index.post.ts +33 -0
  854. package/server/api/system/settings/events.get.ts +8 -4
  855. package/server/api/workshop/agent-tools/bindings/[id].delete.ts +6 -1
  856. package/server/api/workshop/agent-tools/bindings/[id].patch.ts +12 -3
  857. package/server/api/workshop/agent-tools/bindings/index.get.ts +29 -2
  858. package/server/api/workshop/agent-tools/invoke.post.ts +30 -5
  859. package/server/api/workshop/aml/datasets/[id]/preview.get.ts +68 -0
  860. package/server/api/workshop/aml/datasets/[id].get.ts +24 -0
  861. package/server/api/workshop/aml/datasets/index.get.ts +20 -0
  862. package/server/api/workshop/aml/datasets/index.post.ts +27 -0
  863. package/server/api/workshop/aml/experiments/index.get.ts +35 -0
  864. package/server/api/workshop/aml/index.get.ts +24 -0
  865. package/server/api/workshop/aml/jobs/[id]/cancel.post.ts +21 -0
  866. package/server/api/workshop/aml/jobs/[id]/logs.get.ts +23 -0
  867. package/server/api/workshop/aml/jobs/[id]/retry.post.ts +20 -0
  868. package/server/api/workshop/aml/jobs/[id].get.ts +23 -0
  869. package/server/api/workshop/aml/jobs/index.get.ts +26 -0
  870. package/server/api/workshop/aml/jobs/index.post.ts +44 -0
  871. package/server/api/workshop/aml/models/[id]/predict.post.ts +24 -0
  872. package/server/api/workshop/aml/models/[id]/promote.post.ts +30 -0
  873. package/server/api/workshop/aml/models/index.get.ts +48 -0
  874. package/server/api/workshop/daq/[id].delete.ts +6 -0
  875. package/server/api/workshop/dcw/[id].patch.ts +14 -2
  876. package/server/api/workshop/hitl/respond.post.ts +3 -1
  877. package/server/api/workshop/teams/[id]/plugins/index.get.ts +36 -0
  878. package/server/api/workshop/teams/[id]/plugins/index.put.ts +42 -0
  879. package/server/api/workshop/teams/index.post.ts +13 -0
  880. package/server/api/workshop/users/me.get.ts +5 -0
  881. package/server/api/workshop/ws.ts +14 -2
  882. package/server/data/daqs.json +1648 -123
  883. package/server/data/dcw-lines.json +301 -0
  884. package/server/data/dcw-products.json +140 -0
  885. package/server/data/dcw-recipes.json +890 -0
  886. package/server/data/dcw-rollback.json +11591 -5740
  887. package/server/data/dcw-runs.json +3745 -3559
  888. package/server/data/dcw-templates.json +120 -0
  889. package/server/data/dcw-writes.json +1800 -0
  890. package/server/data/dcws.json +1576 -287
  891. package/server/data/line-runs.json +137 -27
  892. package/server/harness/pi-aw-tools.mjs +51 -0
  893. package/server/plugins/dev-stability-guard.ts +63 -63
  894. package/server/plugins/system-config.ts +10 -11
  895. package/server/plugins/workshop.ts +10 -0
  896. package/server/plugins-builtin/diag-bridge/client.mjs +84 -0
  897. package/server/plugins-builtin/diag-bridge/i18n.json +72 -0
  898. package/server/plugins-builtin/diag-bridge/index.mjs +127 -22
  899. package/server/plugins-builtin/rag-bridge/client.mjs +108 -0
  900. package/server/plugins-builtin/rag-bridge/i18n.json +60 -0
  901. package/server/plugins-builtin/rag-bridge/index.mjs +67 -20
  902. package/server/services/system-config.ts +610 -396
  903. package/server/services/workshop/agents/adapters/line-spawn.ts +15 -6
  904. package/server/services/workshop/agents/adapters/one-shot-cli-agent.ts +530 -0
  905. package/server/services/workshop/agents/base-agent.ts +219 -0
  906. package/server/services/workshop/agents/binding-authz.ts +57 -0
  907. package/server/services/workshop/agents/claude-agent.ts +546 -30
  908. package/server/services/workshop/agents/codex-agent.ts +40 -116
  909. package/server/services/workshop/agents/copilot-agent.ts +136 -0
  910. package/server/services/workshop/agents/crush-agent.ts +107 -0
  911. package/server/services/workshop/agents/cursor-agent.ts +102 -0
  912. package/server/services/workshop/agents/dsh-agent.ts +578 -670
  913. package/server/services/workshop/agents/gemini-agent.ts +121 -0
  914. package/server/services/workshop/agents/goose-agent.ts +98 -0
  915. package/server/services/workshop/agents/harness-models.ts +305 -270
  916. package/server/services/workshop/agents/hermes-agent.ts +528 -0
  917. package/server/services/workshop/agents/host-tool-bridge.ts +53 -2
  918. package/server/services/workshop/agents/industrial-tools.ts +659 -7
  919. package/server/services/workshop/agents/omp-agent.ts +74 -59
  920. package/server/services/workshop/agents/opencode-agent.ts +936 -987
  921. package/server/services/workshop/agents/pi-agent.ts +108 -0
  922. package/server/services/workshop/agents/qwen-agent.ts +540 -0
  923. package/server/services/workshop/agents/registry.ts +117 -5
  924. package/server/services/workshop/agents/tool-approvals.ts +3 -3
  925. package/server/services/workshop/aml/aml.repo.ts +368 -0
  926. package/server/services/workshop/aml/clean.ts +120 -0
  927. package/server/services/workshop/aml/dataset-builder.ts +491 -0
  928. package/server/services/workshop/aml/gates.ts +121 -0
  929. package/server/services/workshop/aml/job-orchestrator.ts +650 -0
  930. package/server/services/workshop/aml/model-registry.ts +169 -0
  931. package/server/services/workshop/aml/predictor.ts +262 -0
  932. package/server/services/workshop/aml/python/aml_eval.py +171 -0
  933. package/server/services/workshop/aml/python/amlkit.py +120 -0
  934. package/server/services/workshop/aml/python/requirements.txt +7 -0
  935. package/server/services/workshop/aml/python/train-example.py +92 -0
  936. package/server/services/workshop/aml/python-runtime.ts +217 -0
  937. package/server/services/workshop/aml/retention.ts +98 -0
  938. package/server/services/workshop/aml/runtime.ts +45 -0
  939. package/server/services/workshop/aml/spec.ts +63 -0
  940. package/server/services/workshop/aml/stats.ts +140 -0
  941. package/server/services/workshop/daq/bus/mqtt.adapter.ts +8 -1
  942. package/server/services/workshop/daq/daq-controller.ts +147 -19
  943. package/server/services/workshop/daq/daq-node.repo.ts +13 -11
  944. package/server/services/workshop/daq/daq-runtime.ts +11 -0
  945. package/server/services/workshop/daq/drivers.ts +89 -8
  946. package/server/services/workshop/db/aml-team-seeds.ts +118 -0
  947. package/server/services/workshop/db/channel-plugins.repo.ts +27 -1
  948. package/server/services/workshop/db/database.ts +89 -1
  949. package/server/services/workshop/db/memory.repo.ts +31 -0
  950. package/server/services/workshop/db/user.repo.ts +9 -0
  951. package/server/services/workshop/dcw/dcw-controller.ts +33 -7
  952. package/server/services/workshop/dcw/dcw-line.repo.ts +5 -3
  953. package/server/services/workshop/dcw/dcw-node.repo.ts +4 -4
  954. package/server/services/workshop/dcw/dcw-product.repo.ts +8 -8
  955. package/server/services/workshop/dcw/dcw-recipe.repo.ts +6 -7
  956. package/server/services/workshop/dcw/dcw-runtime.ts +16 -2
  957. package/server/services/workshop/dcw/dcw-templates.ts +4 -4
  958. package/server/services/workshop/dcw/line-run.ts +5 -5
  959. package/server/services/workshop/dcw/recipe-rollback-manager.ts +3 -1
  960. package/server/services/workshop/dcw/recipe-rollback.repo.ts +155 -52
  961. package/server/services/workshop/logger.ts +145 -3
  962. package/server/services/workshop/plugins/host.mjs +854 -566
  963. package/server/services/workshop/prompts/loader.ts +32 -6
  964. package/server/services/workshop/runtime/agent-runtime.ts +32 -3
  965. package/server/services/workshop/runtime/manager.ts +53 -13
  966. package/server/services/workshop/runtime/scheduler-loop.ts +18 -1
  967. package/server/services/workshop/scene/scene-layout.repo.ts +5 -5
  968. package/server/services/workshop/settings.ts +64 -0
  969. package/shared/config/engine.mjs +5 -0
  970. package/shared/config/groups.mjs +220 -0
  971. package/shared/config/home.mjs +11 -2
  972. package/shared/config/schema.json +31 -6
  973. package/shared/daq-protocol.ts +6 -0
  974. package/shared/lru.mjs +94 -0
  975. package/shared/workshop-protocol.ts +2 -2
  976. package/.output/public/_nuxt/2jaJHWIJ.js +0 -1
  977. package/.output/public/_nuxt/B8kt898d.js +0 -1
  978. package/.output/public/_nuxt/BFGpEo8S.js +0 -1
  979. package/.output/public/_nuxt/BG4zduPf.js +0 -14
  980. package/.output/public/_nuxt/BHcpzI2n.js +0 -19
  981. package/.output/public/_nuxt/BWyR3awA.js +0 -1
  982. package/.output/public/_nuxt/Bc89zKq2.js +0 -1
  983. package/.output/public/_nuxt/BetmGSO4.js +0 -1
  984. package/.output/public/_nuxt/BowTbasd.js +0 -1
  985. package/.output/public/_nuxt/BvtknqSC2.js +0 -1
  986. package/.output/public/_nuxt/BytVi9VX2.js +0 -4
  987. package/.output/public/_nuxt/CJviSvm-.js +0 -1
  988. package/.output/public/_nuxt/CTfqWGdy.js +0 -1
  989. package/.output/public/_nuxt/Cb3SnTM8.js +0 -1
  990. package/.output/public/_nuxt/Chc5pfAA.js +0 -1
  991. package/.output/public/_nuxt/CobSUzQv.js +0 -2
  992. package/.output/public/_nuxt/D95h62Jn.js +0 -1
  993. package/.output/public/_nuxt/DGAOugLt.js +0 -1
  994. package/.output/public/_nuxt/DHbTyoAV.js +0 -1
  995. package/.output/public/_nuxt/DfLUN8kY.js +0 -1
  996. package/.output/public/_nuxt/DnziMlcX.js +0 -1
  997. package/.output/public/_nuxt/DvgKXPgu2.js +0 -13
  998. package/.output/public/_nuxt/Q_SJDSgx.js +0 -1
  999. package/.output/public/_nuxt/_id_.DdbYeLqn.css +0 -1
  1000. package/.output/public/_nuxt/_wsId_.BqWBlY7X.css +0 -1
  1001. package/.output/public/_nuxt/agents.CB9Ck7VQ.css +0 -1
  1002. package/.output/public/_nuxt/bFnZa2yd.js +0 -1
  1003. package/.output/public/_nuxt/builds/meta/f7a8e33d-5422-45ac-895d-27168f97e3ad.json +0 -1
  1004. package/.output/public/_nuxt/daq.DGV9QS8d.css +0 -1
  1005. package/.output/public/_nuxt/default.BbgdTDCk.css +0 -1
  1006. package/.output/public/_nuxt/entry.BN02X8iR.css +0 -1
  1007. package/.output/public/_nuxt/pages.CG8UJ2TK.css +0 -1
  1008. package/.output/public/_nuxt/plugins.DpCuwaJt.css +0 -1
  1009. package/.output/public/_nuxt/rkVgzg62.js +0 -1
  1010. package/.output/public/_nuxt/settings.W6qrYAui.css +0 -1
  1011. package/.output/public/_nuxt/teams.BBXVkyKq.css +0 -1
  1012. package/.output/server/chunks/build/_id_-3Axz2-gV.mjs.map +0 -1
  1013. package/.output/server/chunks/build/_id_-CahfkmEt.mjs.map +0 -1
  1014. package/.output/server/chunks/build/agents-DuMiSWKp.mjs.map +0 -1
  1015. package/.output/server/chunks/build/alert-qJnjyRcP.mjs.map +0 -1
  1016. package/.output/server/chunks/build/channel-templates-BStqJ-of.mjs.map +0 -1
  1017. package/.output/server/chunks/build/daq-ChYCABz1.mjs.map +0 -1
  1018. package/.output/server/chunks/build/dcw-CcQNGggh.mjs.map +0 -1
  1019. package/.output/server/chunks/build/logs-D-2UyGtE.mjs.map +0 -1
  1020. package/.output/server/chunks/build/pages-Dfosfchr.mjs.map +0 -1
  1021. package/.output/server/chunks/build/permissions-B-hhZuzm.mjs.map +0 -1
  1022. package/.output/server/chunks/build/plugins-DZR0T4Mh.mjs.map +0 -1
  1023. package/.output/server/chunks/build/responsiveObserve-CS0UB6wQ.mjs +0 -78
  1024. package/.output/server/chunks/build/responsiveObserve-CS0UB6wQ.mjs.map +0 -1
  1025. package/.output/server/chunks/build/settings-BajN9TQW.mjs.map +0 -1
  1026. package/.output/server/chunks/build/tag-NO9jEqKy.mjs.map +0 -1
  1027. package/.output/server/chunks/build/teams-t2SkRlJP.mjs.map +0 -1
  1028. package/.output/server/chunks/build/tokens-DiCojbN8.mjs.map +0 -1
  1029. package/.output/server/chunks/build/town-C7QM8DYK.mjs.map +0 -1
  1030. package/.output/server/chunks/build/useDaqStream-BeA2X8KR.mjs.map +0 -1
  1031. package/.output/server/chunks/build/useDcwStream-BJW_MitY.mjs.map +0 -1
  1032. package/.output/server/chunks/build/users-B9SAdEtH.mjs.map +0 -1
  1033. /package/.output/public/_nuxt/{ORt9oDIy.js → ORt9oDIy2.js} +0 -0
@@ -237,7 +237,7 @@ export async function closeModbusSafely(client: import('modbus-serial').ModbusRT
237
237
  Promise.resolve()
238
238
  .then(() => client.close())
239
239
  .catch(() => { /* 已断 */ }),
240
- new Promise((r) => setTimeout(r, 500)),
240
+ new Promise(r => setTimeout(r, 500)),
241
241
  ])
242
242
  }
243
243
 
@@ -267,8 +267,14 @@ export function withModbusConn<R>(conn: ModbusConn, fn: () => Promise<R>): Promi
267
267
  ] as Promise<R>)
268
268
  void guarded.catch(() => { /* 超时分支先 reject,防 unhandled */ })
269
269
  conn.tail = guarded.then(
270
- () => { clearTimeout(timer); conn.pending-- },
271
- () => { clearTimeout(timer); conn.pending-- },
270
+ () => {
271
+ clearTimeout(timer)
272
+ conn.pending--
273
+ },
274
+ () => {
275
+ clearTimeout(timer)
276
+ conn.pending--
277
+ },
272
278
  ).then(() => {
273
279
  if (dead) conn.tail = Promise.resolve()
274
280
  })
@@ -311,6 +317,11 @@ export async function getModbusConn(cfg: Record<string, unknown>, transport: Mod
311
317
  throw err
312
318
  })
313
319
  client.setID(Number(cfg.unitId ?? 1))
320
+ // 吸收底层 socket 错误(write-after-end / ECONNRESET 等):超时作废重连路径关闭 socket 后,
321
+ // 队列中滞留的写入会触发 modbus-serial 内部 socket.write 异步错误 —— 若不挂 error 处理器,
322
+ // 会以 unhandledRejection 打崩进程(stability-guard fatal)。池层已有 evict 自愈,这里只需静默。
323
+ const sock = (client as unknown as { port?: { client?: { on?: (ev: string, cb: (e: Error) => void) => void } } }).port?.client
324
+ sock?.on?.('error', () => {})
314
325
  const conn: ModbusConn = { client, lastUsed: Date.now(), tail: Promise.resolve(), pending: 0, errors: 0 }
315
326
  modbusPool.set(key, conn)
316
327
  return conn
@@ -503,6 +514,13 @@ if (!opcuaSweepGlobal.__daqOpcUaSweep) {
503
514
  opcuaSweepGlobal.__daqOpcUaSweep.unref?.()
504
515
  }
505
516
 
517
+ /** 已告警过的 OPC UA 端点(进程内,按 `类别|安全模式|endpoint` 键;同端点重连风暴只告警一次)。
518
+ * 与 logger 的同指纹限流互补:Set 管「同端点反复重连」,限流器管「大量不同端点」的同形文本。 */
519
+ const gOpcUaSecWarned = globalThis as typeof globalThis & { __daqOpcUaSecWarned?: Set<string> }
520
+ function opcUaSecWarned(): Set<string> {
521
+ return gOpcUaSecWarned.__daqOpcUaSecWarned ??= new Set()
522
+ }
523
+
506
524
  export function opcuaKey(cfg: Record<string, unknown>): string {
507
525
  // S3:证书/安全模式必须纳入池 key——不同证书/安全策略绝不能复用同一连接
508
526
  return `${cfg.endpoint}|${cfg.username ?? ''}|${cfg.securityMode ?? 'None'}|${cfg.certificateFile ?? ''}|${cfg.privateKeyFile ?? ''}`
@@ -520,7 +538,13 @@ export async function getOpcUaConn(cfg: Record<string, unknown>): Promise<OpcUaC
520
538
  ? (cfg.securityMode as 'None')
521
539
  : 'None'
522
540
  if (securityMode === 'None' && process.env.NODE_ENV === 'production') {
523
- log.warn(`[daq-opcua] WARN:节点 endpoint=${String(cfg.endpoint)} 使用 securityMode=None(匿名/明文),仅限测试环境;生产请配置 Sign/SignAndEncrypt + 证书`)
541
+ // P0:该告警原先每次建连都写一行(实测把生产日志灌到 18MB 且全是同一句)。
542
+ // 去重键 = endpoint:同端点反复重连只告警一次;warnThrottled 再兜一层同形文本洪水。
543
+ const noneKey = `none|${String(cfg.endpoint)}`
544
+ if (!opcUaSecWarned().has(noneKey)) {
545
+ opcUaSecWarned().add(noneKey)
546
+ log.warnThrottled(`[daq-opcua] WARN:节点 endpoint=${String(cfg.endpoint)} 使用 securityMode=None(匿名/明文),仅限测试环境;生产请配置 Sign/SignAndEncrypt + 证书`)
547
+ }
524
548
  }
525
549
  const clientOpts: Record<string, unknown> = {
526
550
  endpointMustExist: false,
@@ -540,7 +564,12 @@ export async function getOpcUaConn(cfg: Record<string, unknown>): Promise<OpcUaC
540
564
  }
541
565
  else {
542
566
  // 无证书时由 node-opcua 自动生成自签证书(仍加密,但身份不可信);生产建议显式证书
543
- log.warn(`[daq-opcua] WARN:securityMode=${securityMode} 但未配置 certificateFile/privateKeyFile,将使用自动生成自签证书`)
567
+ // 同端点同模式只告警一次(重连不再重复);限流器兜同形文本洪水
568
+ const noCertKey = `nocert|${securityMode}|${String(cfg.endpoint)}`
569
+ if (!opcUaSecWarned().has(noCertKey)) {
570
+ opcUaSecWarned().add(noCertKey)
571
+ log.warnThrottled(`[daq-opcua] WARN:securityMode=${securityMode} 但未配置 certificateFile/privateKeyFile,将使用自动生成自签证书`)
572
+ }
544
573
  }
545
574
  }
546
575
  const client = opcua.OPCUAClient.create(clientOpts as Parameters<typeof opcua.OPCUAClient.create>[0])
@@ -871,11 +900,44 @@ export const httpDaqDriver: DaqDriver = {
871
900
  async available() {
872
901
  return true
873
902
  },
874
- async sample({ driverConfig }) {
903
+ async sample({ driverConfig, signalKind }) {
875
904
  if (!driverConfig.url) throw new Error('缺少接口地址 url')
876
905
  const headers = parseHeaders(driverConfig.headersJSON)
877
906
  const res = await fetch(String(driverConfig.url), { headers, signal: AbortSignal.timeout(5000) })
878
907
  if (!res.ok) throw new Error(`HTTP ${res.status}`)
908
+ // v2 多形态分支(vector/image 由模板信号形态门控;标量端点零感知)
909
+ if (signalKind === 'vector') {
910
+ const j: unknown = JSON.parse(await res.text())
911
+ const path = driverConfig.jsonPath ? String(driverConfig.jsonPath) : 'points'
912
+ const target = path.split('.').reduce<unknown>((acc, k) => (acc == null ? undefined : (acc as Record<string, unknown>)[k]), j)
913
+ if (!Array.isArray(target)) throw new Error(`vector 帧报文缺少点列(jsonPath=${path})`)
914
+ const points = (target as unknown[]).map(Number)
915
+ if (points.length === 0 || points.length > 4096 || !points.every(Number.isFinite)) {
916
+ throw new Error(`vector 帧点列非法(1~4096 个有限数值,实际 ${points.length})`)
917
+ }
918
+ return { frame: { kind: 'vector', points } }
919
+ }
920
+ if (signalKind === 'image') {
921
+ const ct = res.headers.get('content-type') ?? ''
922
+ if (ct.includes('image/')) {
923
+ const blob = Buffer.from(await res.arrayBuffer())
924
+ if (blob.length === 0) throw new Error('image 帧响应体为空')
925
+ // PNG 尺寸兜底:IHDR 宽高在固定偏移(width@16, height@20;大端)——端点不必额外传
926
+ let width = Number(driverConfig.width ?? 0) || 0
927
+ let height = Number(driverConfig.height ?? 0) || 0
928
+ if ((!width || !height) && blob.length >= 24 && blob.readUInt32BE(12) === 0x49484452) {
929
+ width = width || blob.readUInt32BE(16)
930
+ height = height || blob.readUInt32BE(20)
931
+ }
932
+ return { frame: { kind: 'image', blob, mime: ct.split(';')[0]!, width, height } }
933
+ }
934
+ // JSON 报文:{ png: base64, width?, height? }
935
+ const j = JSON.parse(await res.text()) as Record<string, unknown>
936
+ const b64 = typeof j.png === 'string' ? j.png : typeof j.blob === 'string' ? j.blob : ''
937
+ const blob = Buffer.from(b64, 'base64')
938
+ if (blob.length === 0) throw new Error('image 帧报文缺少 png/blob(base64)字段')
939
+ return { frame: { kind: 'image', blob, mime: 'image/png', width: Number(j.width ?? 0) || 0, height: Number(j.height ?? 0) || 0 } }
940
+ }
879
941
  const text = await res.text()
880
942
  return extractNumeric(text, driverConfig.jsonPath ? String(driverConfig.jsonPath) : undefined)
881
943
  },
@@ -886,9 +948,28 @@ export const httpDaqDriver: DaqDriver = {
886
948
  const headers = parseHeaders(driverConfig.headersJSON)
887
949
  const res = await fetch(String(driverConfig.url), { headers, signal: AbortSignal.timeout(5000) })
888
950
  if (!res.ok) return { ok: false, message: `接口返回 HTTP ${res.status}` }
951
+ const ct = res.headers.get('content-type') ?? ''
952
+ // 帧形态感知测试:同一端点形态可能是 vector(JSON 点列)/ image(PNG 或 base64)/ 标量
953
+ if (ct.includes('image/')) {
954
+ const n = (await res.arrayBuffer()).byteLength
955
+ return { ok: true, message: `接口可达,image 帧 ${n}B(${ct.split(';')[0]})`, latencyMs: Date.now() - t0 }
956
+ }
889
957
  const text = await res.text()
890
- const v = extractNumeric(text, driverConfig.jsonPath ? String(driverConfig.jsonPath) : undefined)
891
- return { ok: true, message: `接口可达,取值 = ${v}`, sampleValue: v, latencyMs: Date.now() - t0 }
958
+ try {
959
+ const j = JSON.parse(text) as Record<string, unknown>
960
+ if (Array.isArray(j.points) && (j.points as unknown[]).length > 0) {
961
+ return { ok: true, message: `接口可达,vector 帧 ${(j.points as unknown[]).length} 点`, latencyMs: Date.now() - t0 }
962
+ }
963
+ if (typeof j.png === 'string' || typeof j.blob === 'string') {
964
+ return { ok: true, message: `接口可达,image 帧(base64, ${(j.png ?? j.blob as string).length} chars)`, latencyMs: Date.now() - t0 }
965
+ }
966
+ const v = extractNumeric(text, driverConfig.jsonPath ? String(driverConfig.jsonPath) : undefined)
967
+ return { ok: true, message: `接口可达,取值 = ${v}`, sampleValue: v, latencyMs: Date.now() - t0 }
968
+ }
969
+ catch {
970
+ const v = extractNumeric(text, driverConfig.jsonPath ? String(driverConfig.jsonPath) : undefined)
971
+ return { ok: true, message: `接口可达,取值 = ${v}`, sampleValue: v, latencyMs: Date.now() - t0 }
972
+ }
892
973
  }
893
974
  catch (err) {
894
975
  return { ok: false, message: `HTTP 请求失败: ${err instanceof Error ? err.message : String(err)}` }
@@ -0,0 +1,118 @@
1
+ /**
2
+ * AML 自动建模平台内置种子(4 个 Agent 模板 + 1 个编组)。
3
+ * - harness 一律 'omp'(真实 LLM 执行器;config.systemPromptPrefix 注入角色场景提示)
4
+ * - id 固定,由 database.ts seedDefaultWorkshopData 以 INSERT OR IGNORE 幂等注入(重启安全)
5
+ * - 门禁 G1-G5 语义与默认阈值对齐 server/services/workshop/aml/gates.ts
6
+ * (G1 0.10 / G2 0.25 / G3 20% / G4 500 行 × 3 批次 / G5 工件完整,均 live 可调)
7
+ * - 团队共同作业手册:.AgentWorkShop/prompts/aml-playbook.md;
8
+ * 各模板 systemPromptPrefix 只写角色差异,与手册互补不重复
9
+ */
10
+
11
+ /** Agent 模板种子条目(与 database.ts DEFAULT_AGENT_TEMPLATES 元素同形) */
12
+ export interface AmlAgentTemplateSeed {
13
+ id: string
14
+ name: string
15
+ harness: string
16
+ config: Record<string, unknown>
17
+ }
18
+
19
+ /** 编组种子条目(与 database.ts DEFAULT_TEAMS 元素同形) */
20
+ export interface AmlTeamSeed {
21
+ id: string
22
+ name: string
23
+ description: string
24
+ members: Array<{ templateId: string, role: 'lead' | 'worker' }>
25
+ }
26
+
27
+ export const AML_AGENT_TEMPLATES: AmlAgentTemplateSeed[] = [
28
+ {
29
+ id: 'tpl-aml-lead',
30
+ name: 'AML 首席数据科学家',
31
+ harness: 'omp',
32
+ config: {
33
+ role: 'lead',
34
+ intro: 'AML 自动建模 lead;统筹使命拆解、派工与预算,唯一有权发起模型晋升(aml_model_promote)的人',
35
+ systemPromptPrefix: [
36
+ '你是「AML 影子建模团队」首席数据科学家(lead):统筹使命拆解、派工与预算,是门禁守门人,也是唯一有权发起模型晋升的人(aml_model_promote,内部走人工审批)。',
37
+ '## 作业流',
38
+ '1. 先 aml_node_catalog 盘点可建模资产(节点语义 × 近 24h 数据量),确认使命(产品/配方/horizon/预算)可满足;',
39
+ '2. 派数据工程师 aml_dataset_build 建数据集,核对其统计报告:行数≥500、批次≥3、清洗剔除率≤5%;',
40
+ '3. 派训练工程师迭代:首轮先线性基线,此后每轮 change_note 只声明单组件改动;',
41
+ '4. 派评测工程师审 aml_leaderboard 与门禁 G1-G5,重点防数据泄漏与过拟合;',
42
+ '5. 全过后由你调 aml_model_promote 发起晋升申请;未全过一律打回并写明缺哪项门禁。',
43
+ '## 诚实纪律',
44
+ '预算耗尽或连续两轮无改进:如实汇报瓶颈(数据不足/噪声/变量缺失),禁止虚报精度,禁止在人工批准前宣称模型已投产。',
45
+ ].join('\n'),
46
+ },
47
+ },
48
+ {
49
+ id: 'tpl-aml-data',
50
+ name: 'AML 数据工程师',
51
+ harness: 'omp',
52
+ config: {
53
+ role: 'worker',
54
+ intro: 'AML 数据工程师;时序清洗与统计判读,负责数据集构建与质量复核',
55
+ systemPromptPrefix: [
56
+ '你是 AML 团队数据工程师,精通工业时序清洗与统计判读。工具:aml_node_catalog / aml_dataset_build / aml_dataset_stats。',
57
+ '## 硬约束',
58
+ '隔离三元组:产品 × 热 Recipe × run 绝不混。建集前先 aml_node_catalog 核对本产品本配方下的授权节点;跨 Recipe 取数平台直接报错,不得尝试绕过。',
59
+ '## 窗口设计(时滞先行)',
60
+ '先 aml_dataset_stats 读控制→目标滞后估计:historySteps ≥ 时滞格数(时滞/beatMs 向上取整);horizon 按使命给定;beatMs 依数据密度选取并控制行数不超上限(必要时加粗 beatMs)。',
61
+ '## 清洗红线',
62
+ 'Hampel 剔除率>5% 或缺失率>15% 时,先复核(换 beatMs / 收窄时间窗 / 上报 lead)再交付训练,不把脏数据甩给下游;单 run 缺失过高按平台策略整 run 丢弃并记录。',
63
+ '## 交付物',
64
+ 'datasetId + 行数/批次数 + 清洗参数 + 时滞结论与 historySteps 建议,供训练与评测直接引用。',
65
+ ].join('\n'),
66
+ },
67
+ },
68
+ {
69
+ id: 'tpl-aml-trainer',
70
+ name: 'AML 训练工程师',
71
+ harness: 'omp',
72
+ config: {
73
+ role: 'worker',
74
+ intro: 'AML 训练工程师;写 train.py 提交训练作业,按排行榜反馈迭代模型结构',
75
+ systemPromptPrefix: [
76
+ '你是 AML 团队训练工程师:写 train.py → aml_job_submit 提交实验,aml_job_logs 排错,按 aml_leaderboard 反馈迭代。',
77
+ '## 代码契约',
78
+ 'import amlkit;bundle = amlkit.load_bundle(job[\'datasetPath\']);x/u/y 为归一化 float32,形状 [N,H,nAll] / [N,F,nCtrl] / [N,F,nTgt];训练循环内用 amlkit.report_progress 上报进度;结束时 amlkit.export_torch_onnx(model, manifest) 导出契约工件——模型是一步预测:输入 [batch,H,nAll] → 输出 [batch,nTgt];梯度收敛后再 eval() + torch.no_grad() 评估,禁止在训练态导出。',
79
+ '## 迭代纪律(AIDE 树搜索)',
80
+ '1. 首轮必做线性基线(ridge/ARX 类)校准数据可学性;',
81
+ '2. 逐步升级:GBDT → MLP → LSTM/TCN;',
82
+ '3. 每轮只改一个组件(结构/特征/超参/采样),并在 change_note 写明(MLE-STAR);',
83
+ '4. 连续两轮指标变差→回溯最优父节点换方向(greedy-then-restore),不在坏分支上加码。',
84
+ ].join('\n'),
85
+ },
86
+ },
87
+ {
88
+ id: 'tpl-aml-eval',
89
+ name: 'AML 评测工程师',
90
+ harness: 'omp',
91
+ config: {
92
+ role: 'worker',
93
+ intro: 'AML 评测工程师;对抗性审查数据泄漏/过拟合/漂移,守门禁并沉淀案例',
94
+ systemPromptPrefix: [
95
+ '你是 AML 团队评测工程师,职责是对抗性审查——默认怀疑指标,不替训练工程师乐观。',
96
+ '## 审查清单',
97
+ '1. 数据泄漏:切分是否严格 byRun(同一 run 的窗口不得跨 train/test),归一化统计是否只用训练段;',
98
+ '2. 过拟合:G3 泛化差(|test−val|/val≤20%)逼近上限、train/test 曲线背离即打回;',
99
+ '3. 分布漂移:结合 aml_dataset_stats 逐 run 轮廓,判断 test 批次代表性是否不足;',
100
+ '4. 清洗异常:剔除率>5% 或缺失>15% 且未解释的实验直接存疑。',
101
+ '## 日常动作',
102
+ '用 aml_leaderboard 解读谱系树与门禁明细(G1 单步≤0.10 / G2 滚动≤0.25 / G4 行数≥500 且批次≥3 / G5 工件完整),输出「过 / 打回+原因」;通过后用 save_memory 沉淀「配方 × 有效结构 × 超参 × 陷阱」案例(DS-Agent 式)供全队复用。',
103
+ ].join('\n'),
104
+ },
105
+ },
106
+ ]
107
+
108
+ export const AML_TEAM: AmlTeamSeed = {
109
+ id: 'team-aml-shadow',
110
+ name: 'AML 影子建模团队',
111
+ description: '内置自动建模编组:数据科学家(lead)+ 数据/训练/评测工程师;自主完成拉数→训练→评测→晋升申请',
112
+ members: [
113
+ { templateId: 'tpl-aml-lead', role: 'lead' },
114
+ { templateId: 'tpl-aml-data', role: 'worker' },
115
+ { templateId: 'tpl-aml-trainer', role: 'worker' },
116
+ { templateId: 'tpl-aml-eval', role: 'worker' },
117
+ ],
118
+ }
@@ -4,6 +4,8 @@
4
4
  * 语义:无显式行 = 未配置 → 全部启用插件对团队可见(向后兼容,存量 channel 不受影响);
5
5
  * 显式行(建队勾选/团队设置切换)写入后按行过滤 —— 关闭的插件其工具不注入该团队
6
6
  * Agent,dispatch 同源拒绝,防止不需要插件的 channel 上下文被污染。
7
+ * 主键列同时承载两种作用域 id:channel id(部署实例)与 team id(团队偏好,部署时传导),
8
+ * 故不设外键(migrateDropOwnerFks 同理:列仅存 id 引用;悬挂行无行为影响,读取即忽略)。
7
9
  * 自持连接(user.repository.ts 同模式):workshop.sqlite 单文件 WAL。
8
10
  */
9
11
  import { DatabaseSync } from 'node:sqlite'
@@ -18,16 +20,40 @@ function getDb(): DatabaseSync {
18
20
  db = new DatabaseSync(DB_PATH)
19
21
  db.exec('PRAGMA busy_timeout=4000')
20
22
  db.exec(`CREATE TABLE IF NOT EXISTS channel_plugins (
21
- channel_id TEXT NOT NULL REFERENCES channels(id) ON DELETE CASCADE,
23
+ channel_id TEXT NOT NULL,
22
24
  plugin TEXT NOT NULL,
23
25
  enabled INTEGER NOT NULL DEFAULT 1,
24
26
  updated_at TEXT NOT NULL,
25
27
  PRIMARY KEY (channel_id, plugin)
26
28
  )`)
29
+ migrateDropChannelFk(db)
27
30
  }
28
31
  return db
29
32
  }
30
33
 
34
+ /** 早期建表带 REFERENCES channels(id):team 作用域 id 写入会触发 FK 拒绝 → 重建剥壳 */
35
+ function migrateDropChannelFk(db: DatabaseSync): void {
36
+ const fks = db.prepare('PRAGMA foreign_key_list(channel_plugins)').all() as Array<{ table: string }>
37
+ if (!fks.some(f => f.table === 'channels')) return
38
+ db.exec('PRAGMA foreign_keys = OFF;')
39
+ try {
40
+ db.exec(`CREATE TABLE channel_plugins_new (
41
+ channel_id TEXT NOT NULL,
42
+ plugin TEXT NOT NULL,
43
+ enabled INTEGER NOT NULL DEFAULT 1,
44
+ updated_at TEXT NOT NULL,
45
+ PRIMARY KEY (channel_id, plugin)
46
+ );
47
+ INSERT OR IGNORE INTO channel_plugins_new (channel_id, plugin, enabled, updated_at)
48
+ SELECT channel_id, plugin, enabled, updated_at FROM channel_plugins;
49
+ DROP TABLE channel_plugins;
50
+ ALTER TABLE channel_plugins_new RENAME TO channel_plugins;`)
51
+ }
52
+ finally {
53
+ db.exec('PRAGMA foreign_keys = ON;')
54
+ }
55
+ }
56
+
31
57
  export interface ChannelPluginToggle {
32
58
  name: string
33
59
  enabled: boolean
@@ -15,6 +15,7 @@
15
15
  import { createRequire } from 'node:module'
16
16
  import { DatabaseSync } from 'node:sqlite'
17
17
  import type * as sqliteVec from 'sqlite-vec'
18
+ import { AML_AGENT_TEMPLATES, AML_TEAM } from './aml-team-seeds'
18
19
 
19
20
  const require = createRequire(import.meta.url)
20
21
 
@@ -279,7 +280,83 @@ CREATE TABLE IF NOT EXISTS approval_requests (
279
280
  decided_at TEXT,
280
281
  comment TEXT NOT NULL DEFAULT ''
281
282
  );
282
- CREATE INDEX IF NOT EXISTS idx_approval_requests_status ON approval_requests(status, requested_at DESC);`
283
+ CREATE INDEX IF NOT EXISTS idx_approval_requests_status ON approval_requests(status, requested_at DESC);
284
+ -- v15:AML 自动建模平台(数据集快照 / 训练作业 / 实验谱系 / 模型注册表)
285
+ -- 级联:删数据集连带作业与实验行(模型挂实验下随之消失);GC 删除前代码层先查引用,
286
+ -- CASCADE 仅作 FK 兜底(杜绝 ws.ts FK 毒化式永久错误)。
287
+ CREATE TABLE IF NOT EXISTS aml_datasets (
288
+ id TEXT PRIMARY KEY,
289
+ line_id TEXT NOT NULL,
290
+ product_id TEXT NOT NULL,
291
+ recipe_id TEXT NOT NULL,
292
+ run_ids_json TEXT NOT NULL DEFAULT '[]',
293
+ spec_json TEXT NOT NULL,
294
+ sha256 TEXT NOT NULL,
295
+ row_count INTEGER NOT NULL DEFAULT 0,
296
+ from_ms INTEGER,
297
+ to_ms INTEGER,
298
+ path TEXT NOT NULL,
299
+ created_by TEXT NOT NULL DEFAULT '',
300
+ created_by_kind TEXT NOT NULL DEFAULT 'user',
301
+ note TEXT NOT NULL DEFAULT '',
302
+ created_at TEXT NOT NULL
303
+ );
304
+ CREATE INDEX IF NOT EXISTS idx_aml_datasets_recipe ON aml_datasets(recipe_id, created_at DESC);
305
+ CREATE TABLE IF NOT EXISTS aml_jobs (
306
+ id TEXT PRIMARY KEY,
307
+ dataset_id TEXT NOT NULL REFERENCES aml_datasets(id) ON DELETE CASCADE,
308
+ purpose TEXT NOT NULL DEFAULT 'mpc_surrogate',
309
+ status TEXT NOT NULL DEFAULT 'queued', -- queued|provisioning|training|evaluating|done|failed|cancelled|timeout|interrupted
310
+ stage TEXT NOT NULL DEFAULT '',
311
+ progress INTEGER NOT NULL DEFAULT 0,
312
+ budget_json TEXT NOT NULL DEFAULT '{}',
313
+ metrics_json TEXT,
314
+ gates_json TEXT,
315
+ artifacts_path TEXT,
316
+ error TEXT,
317
+ retry_count INTEGER NOT NULL DEFAULT 0,
318
+ agent_id TEXT NOT NULL DEFAULT '',
319
+ channel_id TEXT NOT NULL DEFAULT '',
320
+ task_id TEXT NOT NULL DEFAULT '',
321
+ created_at TEXT NOT NULL,
322
+ started_at TEXT,
323
+ ended_at TEXT
324
+ );
325
+ CREATE INDEX IF NOT EXISTS idx_aml_jobs_status ON aml_jobs(status, created_at DESC);
326
+ CREATE INDEX IF NOT EXISTS idx_aml_jobs_dataset ON aml_jobs(dataset_id, created_at DESC);
327
+ CREATE TABLE IF NOT EXISTS aml_experiments (
328
+ id TEXT PRIMARY KEY,
329
+ job_id TEXT NOT NULL REFERENCES aml_jobs(id) ON DELETE CASCADE,
330
+ dataset_id TEXT NOT NULL REFERENCES aml_datasets(id) ON DELETE CASCADE,
331
+ parent_experiment_id TEXT,
332
+ change_note TEXT NOT NULL DEFAULT '',
333
+ config_json TEXT NOT NULL DEFAULT '{}',
334
+ metrics_json TEXT NOT NULL DEFAULT '{}',
335
+ gates_json TEXT NOT NULL DEFAULT '{}',
336
+ status TEXT NOT NULL DEFAULT 'running', -- running|gates_passed|gates_failed|failed
337
+ seed INTEGER,
338
+ created_at TEXT NOT NULL
339
+ );
340
+ CREATE INDEX IF NOT EXISTS idx_aml_experiments_dataset ON aml_experiments(dataset_id, created_at DESC);
341
+ CREATE TABLE IF NOT EXISTS aml_models (
342
+ id TEXT PRIMARY KEY,
343
+ experiment_id TEXT NOT NULL REFERENCES aml_experiments(id) ON DELETE CASCADE,
344
+ dataset_id TEXT NOT NULL REFERENCES aml_datasets(id) ON DELETE CASCADE,
345
+ product_id TEXT NOT NULL,
346
+ recipe_id TEXT NOT NULL,
347
+ purpose TEXT NOT NULL DEFAULT 'mpc_surrogate',
348
+ stage TEXT NOT NULL DEFAULT 'candidate', -- candidate|shadow|production|retired
349
+ io_spec_json TEXT NOT NULL DEFAULT '{}',
350
+ metrics_json TEXT NOT NULL DEFAULT '{}',
351
+ path TEXT NOT NULL DEFAULT '',
352
+ artifacts_pruned INTEGER NOT NULL DEFAULT 0,
353
+ created_by TEXT NOT NULL DEFAULT '',
354
+ promoted_by TEXT,
355
+ promoted_at TEXT,
356
+ note TEXT NOT NULL DEFAULT '',
357
+ created_at TEXT NOT NULL
358
+ );
359
+ CREATE INDEX IF NOT EXISTS idx_aml_models_lookup ON aml_models(product_id, recipe_id, purpose, stage);`
283
360
 
284
361
  // ===== 默认种子数据(首轮初始化注入;owner NULL = 公共资源,所有登录用户只读共享) =====
285
362
 
@@ -430,6 +507,10 @@ function seedDefaultWorkshopData(db: DatabaseSync): void {
430
507
  for (const t of DEFAULT_AGENT_TEMPLATES) {
431
508
  insertAgent.run(t.id, t.name, t.harness, JSON.stringify(t.config), now, now)
432
509
  }
510
+ // v15:AML 自动建模团队种子(内置公共,同款 INSERT OR IGNORE 幂等)
511
+ for (const t of AML_AGENT_TEMPLATES) {
512
+ insertAgent.run(t.id, t.name, t.harness, JSON.stringify(t.config), now, now)
513
+ }
433
514
  const insertTeam = db.prepare(
434
515
  'INSERT OR IGNORE INTO teams (id, name, description, visibility, owner_user_id, created_at, updated_at) VALUES (?, ?, ?, \'public\', NULL, ?, ?)',
435
516
  )
@@ -442,6 +523,13 @@ function seedDefaultWorkshopData(db: DatabaseSync): void {
442
523
  insertMember.run(team.id, m.templateId, m.role, now)
443
524
  }
444
525
  }
526
+ // v15:AML 编组种子(team + team_members 同款幂等注入)
527
+ for (const team of [AML_TEAM]) {
528
+ insertTeam.run(team.id, team.name, team.description, now, now)
529
+ for (const m of team.members) {
530
+ insertMember.run(team.id, m.templateId, m.role, now)
531
+ }
532
+ }
445
533
  const insertChannelTpl = db.prepare(
446
534
  'INSERT OR IGNORE INTO channel_templates (id, name, description, scenario_prompt, workspace, lead_json, members_json, visibility, owner_user_id, created_at, updated_at) VALUES (?, ?, ?, ?, \'\', \'\', ?, \'public\', NULL, ?, ?)',
447
535
  )
@@ -11,6 +11,12 @@ import type { MemoryKind, MemoryRow } from './database'
11
11
  /** 团队共享记忆域 sentinel(单 channel 内全员可读) */
12
12
  export const TEAM_AGENT_ID = '__team__'
13
13
 
14
+ /** '2026-09' → '2026-10'(跨年安全);用于半开区间 [本月1日, 下月1日) 查询 */
15
+ function nextMonth(month: string): string {
16
+ const [y, m] = month.split('-').map(Number)
17
+ return m === 12 ? `${(y ?? 0) + 1}-01` : `${y}-${String((m ?? 0) + 1).padStart(2, '0')}`
18
+ }
19
+
14
20
  export interface MemoryUpsertInput {
15
21
  channelId: string
16
22
  agentId: string
@@ -194,6 +200,31 @@ export function createMemoryRepo(db: DatabaseSync) {
194
200
  return listByAgentRowidStmt.all(agentId, limit) as unknown as Array<MemoryRow & { rowid: number }>
195
201
  },
196
202
 
203
+ /**
204
+ * 按 (agent, kind, 年月) 精确取行 —— 供空闲反思使用。
205
+ * 替代原先「limit=1_000_000 拉全量再由 JS filter」的退化作法:
206
+ * 过滤条件下推到 SQL(走 agent_id+kind 前缀),返回量与实际增量同阶,
207
+ * 不再随记忆总量线性放大内存与 CPU。
208
+ * month 形如 '2026-09'(与 createdAt 的 ISO 前 7 位一致)。
209
+ */
210
+ listByAgentKindMonth(agentId: string, kind: MemoryKind, month: string): MemoryRow[] {
211
+ return db.prepare(
212
+ `SELECT ${COLS} FROM agent_memories m
213
+ WHERE m.agent_id = ? AND m.kind = ?
214
+ AND m.created_at >= ? AND m.created_at < ?
215
+ ORDER BY m.created_at ASC`,
216
+ ).all(agentId, kind, `${month}-01`, `${nextMonth(month)}-01`) as unknown as MemoryRow[]
217
+ },
218
+
219
+ /** 当月某 kind 的计数(反思触发阈值判断用;不取行体,零拷贝) */
220
+ countByAgentKindMonth(agentId: string, kind: MemoryKind, month: string): number {
221
+ const row = db.prepare(
222
+ `SELECT COUNT(*) AS c FROM agent_memories
223
+ WHERE agent_id = ? AND kind = ? AND created_at >= ? AND created_at < ?`,
224
+ ).get(agentId, kind, `${month}-01`, `${nextMonth(month)}-01`) as { c: number } | undefined
225
+ return Number(row?.c ?? 0)
226
+ },
227
+
197
228
  touch(id: string): void {
198
229
  touchStmt.run(new Date().toISOString(), id)
199
230
  },
@@ -41,6 +41,9 @@ export function createUserRepo(db: DatabaseSync) {
41
41
  const deleteMount = db.prepare(
42
42
  `DELETE FROM workspace_channels WHERE workspace_id = ? AND channel_id = ?`,
43
43
  )
44
+ const deleteMountsByChannel = db.prepare(
45
+ `DELETE FROM workspace_channels WHERE channel_id = ?`,
46
+ )
44
47
  const listMounts = db.prepare(
45
48
  `SELECT channel_id AS channelId FROM workspace_channels WHERE workspace_id = ? ORDER BY created_at ASC`,
46
49
  )
@@ -93,6 +96,12 @@ export function createUserRepo(db: DatabaseSync) {
93
96
  unmountChannel(workspaceId: string, channelId: string): void {
94
97
  deleteMount.run(workspaceId, channelId)
95
98
  },
99
+ /** channel 删除级联:清掉所有 workspace 对它的挂载引用(返回清理行数)。
100
+ * 早先没有这个级联,只能靠 listWorkspaces 在**读路径**里顺手 DELETE 兜底 ——
101
+ * 那让 GET /workspaces 变成有副作用的写操作。改为删除时主动收敛。 */
102
+ unmountChannelEverywhere(channelId: string): number {
103
+ return Number(deleteMountsByChannel.run(channelId).changes ?? 0)
104
+ },
96
105
  listMountedChannels(workspaceId: string): string[] {
97
106
  return (listMounts.all(workspaceId) as Array<{ channelId: string }>).map(r => r.channelId)
98
107
  },
@@ -372,9 +372,31 @@ class DcwController {
372
372
  node.transform = normalizeDataTransform(patch.transform)
373
373
  }
374
374
  if (patch.unit !== undefined) node.unit = patch.unit
375
- if (patch.decimals !== undefined) node.decimals = patch.decimals
376
- if (patch.min !== undefined) node.min = patch.min
377
- if (patch.max !== undefined) node.max = patch.max
375
+ // decimals 必须 0..6 整数:它同时喂给 toFixed() —— 越界值会在**驱动已经写进 PLC 之后**
376
+ // 由 applyWriteResult/applyReadResult 抛 RangeError,造成「硬件已改、账本无记录、
377
+ // 调用方吃 500」(审计实测:decimals=101 → PLC 写入成功、无锚点、无写历史)。
378
+ // 在校验入口一次性拒掉,别让脏值走到写路径。
379
+ if (patch.decimals !== undefined) {
380
+ const d = Number(patch.decimals)
381
+ if (!Number.isInteger(d) || d < 0 || d > 6) {
382
+ throw new AppError(400, ErrorCodes.VALIDATION_ERROR, `decimals 必须为 0..6 的整数(当前: ${String(patch.decimals)})`)
383
+ }
384
+ node.decimals = d
385
+ }
386
+ if (patch.min !== undefined) {
387
+ const v = Number(patch.min)
388
+ if (!Number.isFinite(v)) throw new AppError(400, ErrorCodes.VALIDATION_ERROR, `min 必须为有限数字(当前: ${String(patch.min)})`)
389
+ node.min = v
390
+ }
391
+ if (patch.max !== undefined) {
392
+ const v = Number(patch.max)
393
+ if (!Number.isFinite(v)) throw new AppError(400, ErrorCodes.VALIDATION_ERROR, `max 必须为有限数字(当前: ${String(patch.max)})`)
394
+ node.max = v
395
+ }
396
+ // 量程交叉校验放在两者都应用之后:min>max 会让 writeTolerance 变负、越界判定恒真
397
+ if (node.max < node.min) {
398
+ throw new AppError(400, ErrorCodes.VALIDATION_ERROR, `量程无效:max(${node.max}) 不得小于 min(${node.min})`)
399
+ }
378
400
  if (patch.holdIntervalMs !== undefined) {
379
401
  node.holdIntervalMs = patch.holdIntervalMs == null ? null : Math.max(0, Math.min(3_600_000, Math.round(patch.holdIntervalMs)))
380
402
  rearm = true
@@ -480,15 +502,17 @@ class DcwController {
480
502
  return node
481
503
  }
482
504
 
483
- /** 设备删除级联解绑(device-twins 删除路由调用) */
505
+ /** 设备删除级联解绑(device-twins 删除路由调用)。flushNow 移出循环(同 daq 侧) */
484
506
  unbindDevice(deviceId: string): void {
507
+ let touched = false
485
508
  for (const node of this.repo.all()) {
486
509
  if (!node.deviceIds.includes(deviceId)) continue
487
510
  node.deviceIds = node.deviceIds.filter(d => d !== deviceId)
488
511
  node.deviceBindingId = node.deviceIds[0] ?? null
489
- this.repo.flushNow()
512
+ touched = true
490
513
  this.emitNodeChanged('updated', node)
491
514
  }
515
+ if (touched) this.repo.flushNow()
492
516
  }
493
517
 
494
518
  // ---------- 写命令(上位机核心操作)----------
@@ -972,8 +996,10 @@ class DcwController {
972
996
  await tsdbReady
973
997
  const bucketMs = endMs - startMs > 60_000 ? Math.max(1000, Math.round((endMs - startMs) / 200)) : undefined
974
998
  const daq = [] as Array<{ templateRef: string, nodeId: string, nodeName: string, ch: string, unit: string, latest: number | null, avg: number | null, min: number | null, max: number | null, cnt: number }>
975
- // 并行查询(tsdb 往返一次/节点,互不依赖):N+1 串行会让 50 节点产线的批次视图放大 50 倍时延
976
- const results = await Promise.all(getDaqNodeRepo().all().map(async (node) => {
999
+ // 并行查询(tsdb 往返一次/节点,互不依赖):N+1 串行会让 50 节点产线的批次视图放大 50 倍时延。
1000
+ // 只查本批次产线的节点:批次归属单线,跨线节点的 tsdb 往返是纯浪费(节点数增长线性放大)
1001
+ const lineNodes = getDaqNodeRepo().all().filter(n => !run.lineId || n.lineId === run.lineId)
1002
+ const results = await Promise.all(lineNodes.map(async (node) => {
977
1003
  try {
978
1004
  const points = await getTsdb().query(node.id, { fromMs: startMs, toMs: endMs, bucketMs, limit: 500 })
979
1005
  return { node, points }
@@ -6,12 +6,14 @@
6
6
  */
7
7
 
8
8
  import { randomUUID } from 'node:crypto'
9
- import path from 'node:path'
9
+ import { join } from 'node:path'
10
10
  import { dcwLineColorFor, type LineInput, type LineView } from '../../../../shared/dcw-protocol'
11
+ import { ensureDataDir } from '@/shared/config/home.mjs'
11
12
  import { AppError, ErrorCodes } from '../../../utils/errors'
12
- import { loadJsonFile, saveJsonFileAtomic } from '../json-store.mjs'
13
+ import { loadJsonFile, saveJsonFileAtomic } from '../json-store.mjs'
13
14
 
14
- const DB_PATH = process.cwd().endsWith('server') ? 'data/dcw-lines.json' : path.join(process.cwd(), 'server', 'data', 'dcw-lines.json')
15
+ // 配置根 .AgentWorkShop/data(ensureDataDir 自动迁移旧 cwd/server/data 位置)
16
+ const DB_PATH = join(ensureDataDir(), 'dcw-lines.json')
15
17
 
16
18
  function load(): LineView[] {
17
19
  const parsed = loadJsonFile(DB_PATH, [])
@@ -5,15 +5,15 @@
5
5
  */
6
6
 
7
7
  import { createLogger } from '../logger'
8
- import path from 'node:path'
8
+ import { join } from 'node:path'
9
9
  import { DcwNode } from './dcw-node'
10
+ import { ensureDataDir } from '@/shared/config/home.mjs'
10
11
  import { loadJsonFile, saveJsonFileAtomic } from '../json-store.mjs'
11
12
 
12
13
  const log = createLogger('dcw.node-repo')
13
14
 
14
- const DB_PATH = process.cwd().endsWith('server')
15
- ? 'data/dcws.json'
16
- : path.join(process.cwd(), 'server', 'data', 'dcws.json')
15
+ // 配置根 .AgentWorkShop/data(ensureDataDir 自动迁移旧 cwd/server/data 位置)
16
+ const DB_PATH = join(ensureDataDir(), 'dcws.json')
17
17
 
18
18
  function load(): DcwNode[] {
19
19
  try {
@@ -3,18 +3,18 @@
3
3
  * 产品 = 数据隔离顶层维度:一个产品多个配方;批次/样本逐条携带 productId。
4
4
  */
5
5
 
6
- import { createLogger } from '../logger'
7
- import path from 'node:path'
6
+ import { createLogger } from '../logger'
7
+ import { join } from 'node:path'
8
8
  import { randomUUID } from 'node:crypto'
9
9
  import type { ProductInput, ProductView } from '../../../../shared/dcw-protocol'
10
+ import { ensureDataDir } from '@/shared/config/home.mjs'
10
11
  import { AppError, ErrorCodes } from '../../../utils/errors'
11
- import { loadJsonFile, saveJsonFileAtomic } from '../json-store.mjs'
12
+ import { loadJsonFile, saveJsonFileAtomic } from '../json-store.mjs'
12
13
 
13
- const log = createLogger('dcw.product-repo')
14
-
15
- const DB_PATH = process.cwd().endsWith('server')
16
- ? 'data/dcw-products.json'
17
- : path.join(process.cwd(), 'server', 'data', 'dcw-products.json')
14
+ const log = createLogger('dcw.product-repo')
15
+
16
+ // 配置根 .AgentWorkShop/data(ensureDataDir 自动迁移旧 cwd/server/data 位置)
17
+ const DB_PATH = join(ensureDataDir(), 'dcw-products.json')
18
18
 
19
19
  function load(): ProductView[] {
20
20
  try {