agentworkshop 0.8.4 → 0.8.5

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 (2224) hide show
  1. package/.AgentWorkShop/prompts/host-tools.en.json +174 -0
  2. package/.AgentWorkShop/prompts/host-tools.json +6 -2
  3. package/.output/.AgentWorkShop/aml-python/__pycache__/aml_eval.cpython-312.pyc +0 -0
  4. package/.output/.AgentWorkShop/aml-python/__pycache__/amlkit.cpython-312.pyc +0 -0
  5. package/.output/.AgentWorkShop/aml-python/__pycache__/train-example.cpython-312.pyc +0 -0
  6. package/.output/.AgentWorkShop/aml-python/__pycache__/train-hybrid-example.cpython-312.pyc +0 -0
  7. package/.output/.AgentWorkShop/aml-python/train-example.py +92 -92
  8. package/.output/.AgentWorkShop/prompts/host-tools.en.json +174 -0
  9. package/.output/.AgentWorkShop/prompts/host-tools.json +6 -2
  10. package/.output/.AgentWorkShop/schema.json +2 -0
  11. package/.output/nitro.json +1 -1
  12. package/.output/public/_nuxt/-gwj-zlk2.js +1 -0
  13. package/.output/public/_nuxt/-gy9k_TE2.js +1 -0
  14. package/.output/public/_nuxt/26OL4Ao82.js +1 -0
  15. package/.output/public/_nuxt/6P4ZAzxa2.js +1 -0
  16. package/.output/public/_nuxt/7OZQiw002.js +1 -0
  17. package/.output/public/_nuxt/8b9CKi6F.js +1 -0
  18. package/.output/public/_nuxt/AQuNRC4D.js +36 -0
  19. package/.output/public/_nuxt/Aoz9xMB92.js +1 -0
  20. package/.output/public/_nuxt/B0UUODeh.js +1 -0
  21. package/.output/public/_nuxt/B4GOTVfN.js +1 -0
  22. package/.output/public/_nuxt/BBhroEeN.js +1 -0
  23. package/.output/public/_nuxt/BHxG41IQ2.js +1 -0
  24. package/.output/public/_nuxt/BPUQZ9Lq2.js +8 -0
  25. package/.output/public/_nuxt/BSxcHoiy.js +1 -0
  26. package/.output/public/_nuxt/BVg2R2VB2.js +1 -0
  27. package/.output/public/_nuxt/BY2u4LPg.js +1 -0
  28. package/.output/public/_nuxt/BZg_MIK42.js +1 -0
  29. package/.output/public/_nuxt/BaYDgyaR.js +3 -0
  30. package/.output/public/_nuxt/BfvuWqSa.js +1 -0
  31. package/.output/public/_nuxt/BkEokGX5.js +1 -0
  32. package/.output/public/_nuxt/BkO5WdX5.js +1 -0
  33. package/.output/public/_nuxt/BqBTlfiz.js +1 -0
  34. package/.output/public/_nuxt/Br_q4qi72.js +1 -0
  35. package/.output/public/_nuxt/BtZKe9ZV2.js +1 -0
  36. package/.output/public/_nuxt/BwOko01T.js +47 -0
  37. package/.output/public/_nuxt/BzBBEE-o2.js +1 -0
  38. package/.output/public/_nuxt/C0Db9tR_2.js +1 -0
  39. package/.output/public/_nuxt/C3vxePED.js +21 -0
  40. package/.output/public/_nuxt/C4tXwpSt.js +1 -0
  41. package/.output/public/_nuxt/CBkXv24C2.js +1 -0
  42. package/.output/public/_nuxt/CCI-fwcS2.js +1 -0
  43. package/.output/public/_nuxt/CGf9neEK2.js +1 -0
  44. package/.output/public/_nuxt/CGviZq4E.js +1 -0
  45. package/.output/public/_nuxt/CNRjkgAZ2.js +1 -0
  46. package/.output/public/_nuxt/CNrRZmSx2.js +1 -0
  47. package/.output/public/_nuxt/CQ31GiJU2.js +1 -0
  48. package/.output/public/_nuxt/CY_7u1ST2.js +2 -0
  49. package/.output/public/_nuxt/CZJ5cw6r2.js +1 -0
  50. package/.output/public/_nuxt/ChF6qLpY2.js +1 -0
  51. package/.output/public/_nuxt/CjdxNYpU2.js +1 -0
  52. package/.output/public/_nuxt/CmuGMxDP.js +1 -0
  53. package/.output/public/_nuxt/Co8Dcx132.js +1 -0
  54. package/.output/public/_nuxt/Cr2xJ_CY.js +1 -0
  55. package/.output/public/_nuxt/Cy_HDgSl.js +20 -0
  56. package/.output/public/_nuxt/D1thFC3z.js +1 -0
  57. package/.output/public/_nuxt/D8AvmPUH.js +1 -0
  58. package/.output/public/_nuxt/D9GoOkyP2.js +1 -0
  59. package/.output/public/_nuxt/D9ppMCbw.js +1 -0
  60. package/.output/public/_nuxt/DGmFHb7m.js +1 -0
  61. package/.output/public/_nuxt/DH_oqyfL.js +1 -0
  62. package/.output/public/_nuxt/DJaGVY4v2.js +1 -0
  63. package/.output/public/_nuxt/DOUuGOQR2.js +2 -0
  64. package/.output/public/_nuxt/DYQBIsiV2.js +1 -0
  65. package/.output/public/_nuxt/DZqVVvR0.js +1 -0
  66. package/.output/public/_nuxt/DZzbCFY2.js +1 -0
  67. package/.output/public/_nuxt/DmReUFK1.js +1 -0
  68. package/.output/public/_nuxt/DnuJ66Jy.js +1 -0
  69. package/.output/public/_nuxt/DuUc4bbY2.js +1 -0
  70. package/.output/public/_nuxt/EJkmXP432.js +1 -0
  71. package/.output/public/_nuxt/OmpTerminalPanel.ComMDrA8.css +1 -0
  72. package/.output/public/_nuxt/PbzVdCTA2.js +1 -0
  73. package/.output/public/_nuxt/PluginSlot.CGH0vb95.css +1 -0
  74. package/.output/public/_nuxt/SgsmmrsZ.js +1 -0
  75. package/.output/public/_nuxt/TownView.CC3t-Dte.css +1 -0
  76. package/.output/public/_nuxt/U_n8pryv2.js +1 -0
  77. package/.output/public/_nuxt/Ud9o8ItR2.js +1 -0
  78. package/.output/public/_nuxt/W0sNnJQh.js +1 -0
  79. package/.output/public/_nuxt/_id_.BQRWK7J2.css +1 -0
  80. package/.output/public/_nuxt/_wsId_.CQMH8t8j.css +1 -0
  81. package/.output/public/_nuxt/ae2-5ZPt.js +1 -0
  82. package/.output/public/_nuxt/agents.D-JPovTZ.css +1 -0
  83. package/.output/public/_nuxt/aml.PalMp-5n.css +1 -0
  84. package/.output/public/_nuxt/board.BxLE52BL.css +1 -0
  85. package/.output/public/_nuxt/builds/latest.json +1 -1
  86. package/.output/public/_nuxt/builds/meta/5cd11284-05bf-4fcd-9a69-56a01c9f56dd.json +1 -0
  87. package/.output/public/_nuxt/byZYInPk2.js +1 -0
  88. package/.output/public/_nuxt/dHwWyr6b.js +1 -0
  89. package/.output/public/_nuxt/default.BEXGWZFQ.css +1 -0
  90. package/.output/public/_nuxt/fIV9zbnA.js +1 -0
  91. package/.output/public/_nuxt/gUYi1hLJ2.js +16 -0
  92. package/.output/public/_nuxt/iqxZGXsY.js +1 -0
  93. package/.output/public/_nuxt/logs.BkJPbR_K.css +1 -0
  94. package/.output/public/_nuxt/m6G-kfdj.js +1 -0
  95. package/.output/public/_nuxt/monitor.D3yEqqrv.css +1 -0
  96. package/.output/public/_nuxt/ontology.CkuUThtY.css +1 -0
  97. package/.output/public/_nuxt/operations.-l6u44Ar.css +1 -0
  98. package/.output/public/_nuxt/pages.Cdpm_B-G.css +1 -0
  99. package/.output/public/_nuxt/permissions.DxuOOIqQ.css +1 -0
  100. package/.output/public/_nuxt/pipeline.D7et0DoJ.css +1 -0
  101. package/.output/public/_nuxt/rDvMijKA.js +9 -0
  102. package/.output/public/_nuxt/schedules.BXNJ9q_I.css +1 -0
  103. package/.output/public/_nuxt/studio.ClA5gX4K.css +1 -0
  104. package/.output/public/_nuxt/tDEwr422.js +1 -0
  105. package/.output/public/_nuxt/teams.CLQaXno5.css +1 -0
  106. package/.output/public/_nuxt/tokens.BDSUWF-L.css +1 -0
  107. package/.output/public/_nuxt/tools.BwXFAb-X.css +1 -0
  108. package/.output/public/_nuxt/workshop.BBiFhXuM.css +1 -0
  109. package/.output/public/_nuxt/yS3bF3G32.js +2 -0
  110. package/.output/public/_nuxt/zWZ26UWi.js +1 -0
  111. package/.output/public/favicon.svg +14 -14
  112. package/.output/public/robots.txt +3 -3
  113. package/.output/server/chunks/_/LeftOutlined.mjs.map +1 -1
  114. package/.output/server/chunks/_/RightOutlined.mjs.map +1 -1
  115. package/.output/server/chunks/_/SearchOutlined.mjs +1261 -1230
  116. package/.output/server/chunks/_/SearchOutlined.mjs.map +1 -1
  117. package/.output/server/chunks/_/access.mjs +15 -27
  118. package/.output/server/chunks/_/access.mjs.map +1 -1
  119. package/.output/server/chunks/_/catalog-view.mjs +1 -1
  120. package/.output/server/chunks/_/chart-repo.mjs +14 -1
  121. package/.output/server/chunks/_/chart-repo.mjs.map +1 -1
  122. package/.output/server/chunks/_/data-export.mjs +8 -9
  123. package/.output/server/chunks/_/data-export.mjs.map +1 -1
  124. package/.output/server/chunks/_/data-query.mjs +4 -4
  125. package/.output/server/chunks/_/data-query.mjs.map +1 -1
  126. package/.output/server/chunks/_/eda-run.repo.mjs +3 -3
  127. package/.output/server/chunks/_/error-500.mjs.map +1 -1
  128. package/.output/server/chunks/_/features.mjs +6 -6
  129. package/.output/server/chunks/_/golden.mjs +3 -3
  130. package/.output/server/chunks/_/host-bindings.mjs +2 -2
  131. package/.output/server/chunks/_/index.mjs +2 -2
  132. package/.output/server/chunks/_/mes-console.mjs +1 -1
  133. package/.output/server/chunks/_/mes-secrets.repo.mjs +107 -0
  134. package/.output/server/chunks/_/mes-secrets.repo.mjs.map +1 -0
  135. package/.output/server/chunks/_/nitro.mjs +5301 -3767
  136. package/.output/server/chunks/_/nitro.mjs.map +1 -1
  137. package/.output/server/chunks/_/ocap.mjs +1 -1
  138. package/.output/server/chunks/_/rest-auth.mjs +1 -1
  139. package/.output/server/chunks/_/spc.mjs +2 -2
  140. package/.output/server/chunks/build/AuthGate-nF1evO4v.mjs +716 -0
  141. package/.output/server/chunks/build/AuthGate-nF1evO4v.mjs.map +1 -0
  142. package/.output/server/chunks/build/FormItemContext-BlyzocS0.mjs +72 -0
  143. package/.output/server/chunks/build/FormItemContext-BlyzocS0.mjs.map +1 -0
  144. package/.output/server/chunks/build/OmpTerminalPanel-BhvhQ1gG.mjs +942 -0
  145. package/.output/server/chunks/build/OmpTerminalPanel-BhvhQ1gG.mjs.map +1 -0
  146. package/.output/server/chunks/build/PluginSlot-BUKXwV2X.mjs +141 -0
  147. package/.output/server/chunks/build/PluginSlot-BUKXwV2X.mjs.map +1 -0
  148. package/.output/server/chunks/build/TownView-BWMDbosY.mjs +6489 -0
  149. package/.output/server/chunks/build/TownView-BWMDbosY.mjs.map +1 -0
  150. package/.output/server/chunks/build/_id_-BK-t8nRG.mjs +392 -0
  151. package/.output/server/chunks/build/_id_-BK-t8nRG.mjs.map +1 -0
  152. package/.output/server/chunks/build/_id_-CZPlPDm4.mjs +2045 -0
  153. package/.output/server/chunks/build/_id_-CZPlPDm4.mjs.map +1 -0
  154. package/.output/server/chunks/build/_wsId_-C871SDPN.mjs +14589 -0
  155. package/.output/server/chunks/build/_wsId_-C871SDPN.mjs.map +1 -0
  156. package/.output/server/chunks/build/agents-D7CdEUTv.mjs +1078 -0
  157. package/.output/server/chunks/build/agents-D7CdEUTv.mjs.map +1 -0
  158. package/.output/server/chunks/build/alert-D0ivtTGy.mjs +263 -0
  159. package/.output/server/chunks/build/alert-D0ivtTGy.mjs.map +1 -0
  160. package/.output/server/chunks/build/aml-DRAFRcGU.mjs +814 -0
  161. package/.output/server/chunks/build/aml-DRAFRcGU.mjs.map +1 -0
  162. package/.output/server/chunks/build/analysis-p-dBkjoK.mjs +533 -0
  163. package/.output/server/chunks/build/analysis-p-dBkjoK.mjs.map +1 -0
  164. package/.output/server/chunks/build/api-B4Om0mEc.mjs +53 -0
  165. package/.output/server/chunks/build/api-B4Om0mEc.mjs.map +1 -0
  166. package/.output/server/chunks/build/api-BEW_ebY_.mjs +64 -0
  167. package/.output/server/chunks/build/api-BEW_ebY_.mjs.map +1 -0
  168. package/.output/server/chunks/build/api-BsAgXWxi.mjs +72 -0
  169. package/.output/server/chunks/build/api-BsAgXWxi.mjs.map +1 -0
  170. package/.output/server/chunks/build/api-error-BwAQLw44.mjs +47 -0
  171. package/.output/server/chunks/build/api-error-BwAQLw44.mjs.map +1 -0
  172. package/.output/server/chunks/build/apiClient-BvXtNzC8.mjs +81 -0
  173. package/.output/server/chunks/build/apiClient-BvXtNzC8.mjs.map +1 -0
  174. package/.output/server/chunks/build/board-CJUc032b.mjs +189 -0
  175. package/.output/server/chunks/build/board-CJUc032b.mjs.map +1 -0
  176. package/.output/server/chunks/build/builtin-catalog-edpDcgfL.mjs +94 -81
  177. package/.output/server/chunks/build/builtin-catalog-edpDcgfL.mjs.map +1 -1
  178. package/.output/server/chunks/build/card-Cqk0Ur-L.mjs +953 -0
  179. package/.output/server/chunks/build/card-Cqk0Ur-L.mjs.map +1 -0
  180. package/.output/server/chunks/build/channel-templates-ggsBacZF.mjs +942 -0
  181. package/.output/server/chunks/build/channel-templates-ggsBacZF.mjs.map +1 -0
  182. package/.output/server/chunks/build/chart-pipeline-BpoWYMK_.mjs +233 -0
  183. package/.output/server/chunks/build/chart-pipeline-BpoWYMK_.mjs.map +1 -0
  184. package/.output/server/chunks/build/chart-trend-BWeZh5Lv.mjs +112 -113
  185. package/.output/server/chunks/build/chart-trend-BWeZh5Lv.mjs.map +1 -1
  186. package/.output/server/chunks/build/checkbox-CrT4cnfu.mjs +439 -0
  187. package/.output/server/chunks/build/checkbox-CrT4cnfu.mjs.map +1 -0
  188. package/.output/server/chunks/build/client-only-qNA2OVV_.mjs +43 -0
  189. package/.output/server/chunks/build/client-only-qNA2OVV_.mjs.map +1 -0
  190. package/.output/server/chunks/build/constants-HPHJvjne.mjs +76 -66
  191. package/.output/server/chunks/build/constants-HPHJvjne.mjs.map +1 -1
  192. package/.output/server/chunks/build/core-CgTOPS4t.mjs +294 -0
  193. package/.output/server/chunks/build/core-CgTOPS4t.mjs.map +1 -0
  194. package/.output/server/chunks/build/daq-CdxcfY_G.mjs +1266 -0
  195. package/.output/server/chunks/build/daq-CdxcfY_G.mjs.map +1 -0
  196. package/.output/server/chunks/build/data-D8uX1dnm.mjs +481 -0
  197. package/.output/server/chunks/build/data-D8uX1dnm.mjs.map +1 -0
  198. package/.output/server/chunks/build/dcw-BlDQtS4q.mjs +505 -0
  199. package/.output/server/chunks/build/dcw-BlDQtS4q.mjs.map +1 -0
  200. package/.output/server/chunks/build/dcw-driver-badge-Df5wL_ZA.mjs +15 -3
  201. package/.output/server/chunks/build/dcw-driver-badge-Df5wL_ZA.mjs.map +1 -1
  202. package/.output/server/chunks/build/default-CNWS6NUw.mjs +2353 -0
  203. package/.output/server/chunks/build/default-CNWS6NUw.mjs.map +1 -0
  204. package/.output/server/chunks/build/descriptions-BNlfKG9y.mjs +406 -0
  205. package/.output/server/chunks/build/descriptions-BNlfKG9y.mjs.map +1 -0
  206. package/.output/server/chunks/build/drawer-Caji0PLs.mjs +834 -0
  207. package/.output/server/chunks/build/drawer-Caji0PLs.mjs.map +1 -0
  208. package/.output/server/chunks/build/dropdown-BNwTVGde.mjs +14 -0
  209. package/.output/server/chunks/build/dropdown-BNwTVGde.mjs.map +1 -0
  210. package/.output/server/chunks/build/dropdown-Cd-xPhR6.mjs +540 -0
  211. package/.output/server/chunks/build/dropdown-Cd-xPhR6.mjs.map +1 -0
  212. package/.output/server/chunks/build/es-Bxu10NJ2.mjs +43 -0
  213. package/.output/server/chunks/build/es-Bxu10NJ2.mjs.map +1 -0
  214. package/.output/server/chunks/build/firstNotUndefined-8H5_qHUu.mjs +2448 -0
  215. package/.output/server/chunks/build/firstNotUndefined-8H5_qHUu.mjs.map +1 -0
  216. package/.output/server/chunks/build/form-D_UpWPN4.mjs +4712 -0
  217. package/.output/server/chunks/build/form-D_UpWPN4.mjs.map +1 -0
  218. package/.output/server/chunks/build/hasIn-DBdElbjM.mjs +553 -0
  219. package/.output/server/chunks/build/hasIn-DBdElbjM.mjs.map +1 -0
  220. package/.output/server/chunks/build/hitl-Bd30yr1J.mjs +132 -0
  221. package/.output/server/chunks/build/hitl-Bd30yr1J.mjs.map +1 -0
  222. package/.output/server/chunks/build/input-GtPuSEgt.mjs +2181 -0
  223. package/.output/server/chunks/build/input-GtPuSEgt.mjs.map +1 -0
  224. package/.output/server/chunks/build/input-number-BNlNDK7H.mjs +1120 -0
  225. package/.output/server/chunks/build/input-number-BNlNDK7H.mjs.map +1 -0
  226. package/.output/server/chunks/build/interval-DvHBIIZh.mjs +9 -0
  227. package/.output/server/chunks/build/interval-DvHBIIZh.mjs.map +1 -0
  228. package/.output/server/chunks/build/isNumeric-CP7q_yhz.mjs +7 -0
  229. package/.output/server/chunks/build/isNumeric-CP7q_yhz.mjs.map +1 -0
  230. package/.output/server/chunks/build/logs-pRb-TMWa.mjs +427 -0
  231. package/.output/server/chunks/build/logs-pRb-TMWa.mjs.map +1 -0
  232. package/.output/server/chunks/build/menu-BXt-X0dt.mjs +1952 -0
  233. package/.output/server/chunks/build/menu-BXt-X0dt.mjs.map +1 -0
  234. package/.output/server/chunks/build/monitor-Cq6hRFeQ.mjs +2253 -0
  235. package/.output/server/chunks/build/monitor-Cq6hRFeQ.mjs.map +1 -0
  236. package/.output/server/chunks/build/narrow-fetch-CcG-BPxc.mjs +2 -0
  237. package/.output/server/chunks/build/narrow-fetch-CcG-BPxc.mjs.map +1 -1
  238. package/.output/server/chunks/build/ontology-ohICfVVb.mjs +1406 -0
  239. package/.output/server/chunks/build/ontology-ohICfVVb.mjs.map +1 -0
  240. package/.output/server/chunks/build/operations-SMQrRAcr.mjs +311 -0
  241. package/.output/server/chunks/build/operations-SMQrRAcr.mjs.map +1 -0
  242. package/.output/server/chunks/build/optimizer-BlWTsM-W.mjs +202 -0
  243. package/.output/server/chunks/build/optimizer-BlWTsM-W.mjs.map +1 -0
  244. package/.output/server/chunks/build/pages-DsMKUw7i.mjs +542 -0
  245. package/.output/server/chunks/build/pages-DsMKUw7i.mjs.map +1 -0
  246. package/.output/server/chunks/build/pagination-DTAconUo.mjs +1346 -0
  247. package/.output/server/chunks/build/pagination-DTAconUo.mjs.map +1 -0
  248. package/.output/server/chunks/build/permissions-DgXQZSyx.mjs +637 -0
  249. package/.output/server/chunks/build/permissions-DgXQZSyx.mjs.map +1 -0
  250. package/.output/server/chunks/build/pipeline-CkavMBhk.mjs +212 -0
  251. package/.output/server/chunks/build/pipeline-CkavMBhk.mjs.map +1 -0
  252. package/.output/server/chunks/build/plugins-LRjaSEZy.mjs +272 -0
  253. package/.output/server/chunks/build/plugins-LRjaSEZy.mjs.map +1 -0
  254. package/.output/server/chunks/build/popconfirm-DxYPGRgS.mjs +340 -0
  255. package/.output/server/chunks/build/popconfirm-DxYPGRgS.mjs.map +1 -0
  256. package/.output/server/chunks/build/responsiveObserve-DM3hpzhU.mjs +78 -0
  257. package/.output/server/chunks/build/responsiveObserve-DM3hpzhU.mjs.map +1 -0
  258. package/.output/server/chunks/build/schedules-Hz2DJUE2.mjs +7172 -0
  259. package/.output/server/chunks/build/schedules-Hz2DJUE2.mjs.map +1 -0
  260. package/.output/server/chunks/build/segmented-D3HWtHPw.mjs +341 -0
  261. package/.output/server/chunks/build/segmented-D3HWtHPw.mjs.map +1 -0
  262. package/.output/server/chunks/build/select-B3Dsb9yq.mjs +3923 -0
  263. package/.output/server/chunks/build/select-B3Dsb9yq.mjs.map +1 -0
  264. package/.output/server/chunks/build/settings-DXLJPq7d.mjs +1014 -0
  265. package/.output/server/chunks/build/settings-DXLJPq7d.mjs.map +1 -0
  266. package/.output/server/chunks/build/space-Dwu2Skt8.mjs +110 -0
  267. package/.output/server/chunks/build/space-Dwu2Skt8.mjs.map +1 -0
  268. package/.output/server/chunks/build/spin-C2cuvGth.mjs +357 -0
  269. package/.output/server/chunks/build/spin-C2cuvGth.mjs.map +1 -0
  270. package/.output/server/chunks/build/studio-hSqH9TYS.mjs +336 -0
  271. package/.output/server/chunks/build/studio-hSqH9TYS.mjs.map +1 -0
  272. package/.output/server/chunks/build/switch-CyR-H6Fb.mjs +377 -0
  273. package/.output/server/chunks/build/switch-CyR-H6Fb.mjs.map +1 -0
  274. package/.output/server/chunks/build/table-CmVD-cA9.mjs +7546 -0
  275. package/.output/server/chunks/build/table-CmVD-cA9.mjs.map +1 -0
  276. package/.output/server/chunks/build/tabs-Vg0e7cZE.mjs +1924 -0
  277. package/.output/server/chunks/build/tabs-Vg0e7cZE.mjs.map +1 -0
  278. package/.output/server/chunks/build/tag-y0sn-xv9.mjs +1156 -0
  279. package/.output/server/chunks/build/tag-y0sn-xv9.mjs.map +1 -0
  280. package/.output/server/chunks/build/teams-BbwYJyzv.mjs +1203 -0
  281. package/.output/server/chunks/build/teams-BbwYJyzv.mjs.map +1 -0
  282. package/.output/server/chunks/build/tokens-GYaGJ35Z.mjs +1062 -0
  283. package/.output/server/chunks/build/tokens-GYaGJ35Z.mjs.map +1 -0
  284. package/.output/server/chunks/build/tools-CnYi9cou.mjs +487 -0
  285. package/.output/server/chunks/build/tools-CnYi9cou.mjs.map +1 -0
  286. package/.output/server/chunks/build/tooltip-C2n2nNiQ.mjs +920 -0
  287. package/.output/server/chunks/build/tooltip-C2n2nNiQ.mjs.map +1 -0
  288. package/.output/server/chunks/build/town-B5aoiG98.mjs +133 -0
  289. package/.output/server/chunks/build/town-B5aoiG98.mjs.map +1 -0
  290. package/.output/server/chunks/build/town-BV-hbwb5.mjs +30 -17
  291. package/.output/server/chunks/build/town-BV-hbwb5.mjs.map +1 -1
  292. package/.output/server/chunks/build/types-D6J7slEa.mjs +1 -1
  293. package/.output/server/chunks/build/types-D6J7slEa.mjs.map +1 -1
  294. package/.output/server/chunks/build/types-DWqIeMRP.mjs +30 -29
  295. package/.output/server/chunks/build/types-DWqIeMRP.mjs.map +1 -1
  296. package/.output/server/chunks/build/useAgentHarnessOptions-Dq0l0Z6d.mjs +124 -0
  297. package/.output/server/chunks/build/useAgentHarnessOptions-Dq0l0Z6d.mjs.map +1 -0
  298. package/.output/server/chunks/build/useAgentTemplateActions-BFOHb5-L.mjs +77 -0
  299. package/.output/server/chunks/build/useAgentTemplateActions-BFOHb5-L.mjs.map +1 -0
  300. package/.output/server/chunks/build/useAgentTemplateDialogState-CZzpu5og.mjs +24 -17
  301. package/.output/server/chunks/build/useAgentTemplateDialogState-CZzpu5og.mjs.map +1 -1
  302. package/.output/server/chunks/build/useAgentTemplateForm-CuJPOPcK.mjs +117 -0
  303. package/.output/server/chunks/build/useAgentTemplateForm-CuJPOPcK.mjs.map +1 -0
  304. package/.output/server/chunks/build/useAgentTemplatesCatalog-B2bIhZLA.mjs +133 -0
  305. package/.output/server/chunks/build/useAgentTemplatesCatalog-B2bIhZLA.mjs.map +1 -0
  306. package/.output/server/chunks/build/useAmlDatasets-DeoE1idn.mjs +92 -0
  307. package/.output/server/chunks/build/useAmlDatasets-DeoE1idn.mjs.map +1 -0
  308. package/.output/server/chunks/build/useAmlEntities-BJhvdqHJ.mjs +86 -0
  309. package/.output/server/chunks/build/useAmlEntities-BJhvdqHJ.mjs.map +1 -0
  310. package/.output/server/chunks/build/useAmlEnv-CDIZ6xTe.mjs +194 -0
  311. package/.output/server/chunks/build/useAmlEnv-CDIZ6xTe.mjs.map +1 -0
  312. package/.output/server/chunks/build/useAmlExperiments-Dloi834i.mjs +89 -0
  313. package/.output/server/chunks/build/useAmlExperiments-Dloi834i.mjs.map +1 -0
  314. package/.output/server/chunks/build/useAmlFormat-C2sl3MGB.mjs +38 -33
  315. package/.output/server/chunks/build/useAmlFormat-C2sl3MGB.mjs.map +1 -1
  316. package/.output/server/chunks/build/useAmlJobs-BF9LpwXz.mjs +267 -0
  317. package/.output/server/chunks/build/useAmlJobs-BF9LpwXz.mjs.map +1 -0
  318. package/.output/server/chunks/build/useAmlModels-_bweOr3R.mjs +93 -0
  319. package/.output/server/chunks/build/useAmlModels-_bweOr3R.mjs.map +1 -0
  320. package/.output/server/chunks/build/useAmlNotes-DQj980iX.mjs +86 -0
  321. package/.output/server/chunks/build/useAmlNotes-DQj980iX.mjs.map +1 -0
  322. package/.output/server/chunks/build/useAmlPredict-DHNgDSJn.mjs +130 -0
  323. package/.output/server/chunks/build/useAmlPredict-DHNgDSJn.mjs.map +1 -0
  324. package/.output/server/chunks/build/useAnalysisFeed-BrEGV_9x.mjs +129 -0
  325. package/.output/server/chunks/build/useAnalysisFeed-BrEGV_9x.mjs.map +1 -0
  326. package/.output/server/chunks/build/useDaqAddNode-D_Rkju0f.mjs +142 -0
  327. package/.output/server/chunks/build/useDaqAddNode-D_Rkju0f.mjs.map +1 -0
  328. package/.output/server/chunks/build/useDaqDetailBinding-DCWaLKXT.mjs +70 -0
  329. package/.output/server/chunks/build/useDaqDetailBinding-DCWaLKXT.mjs.map +1 -0
  330. package/.output/server/chunks/build/useDaqDetailFrames-BOIcOJRB.mjs +79 -0
  331. package/.output/server/chunks/build/useDaqDetailFrames-BOIcOJRB.mjs.map +1 -0
  332. package/.output/server/chunks/build/useDaqDetailHistory-D6WulPVs.mjs +176 -0
  333. package/.output/server/chunks/build/useDaqDetailHistory-D6WulPVs.mjs.map +1 -0
  334. package/.output/server/chunks/build/useDaqDetailNode-DeOsDxK5.mjs +99 -0
  335. package/.output/server/chunks/build/useDaqDetailNode-DeOsDxK5.mjs.map +1 -0
  336. package/.output/server/chunks/build/useDaqDetailParams-Cm9a9r5G.mjs +159 -0
  337. package/.output/server/chunks/build/useDaqDetailParams-Cm9a9r5G.mjs.map +1 -0
  338. package/.output/server/chunks/build/useDaqFilters-CctmO03p.mjs +222 -0
  339. package/.output/server/chunks/build/useDaqFilters-CctmO03p.mjs.map +1 -0
  340. package/.output/server/chunks/build/useDaqNodeWindow-1DWj2H5G.mjs +45 -44
  341. package/.output/server/chunks/build/useDaqNodeWindow-1DWj2H5G.mjs.map +1 -1
  342. package/.output/server/chunks/build/useDaqOptimizations-CmX_dpBc.mjs +136 -0
  343. package/.output/server/chunks/build/useDaqOptimizations-CmX_dpBc.mjs.map +1 -0
  344. package/.output/server/chunks/build/useDaqStream-B9ZBVQrI.mjs +395 -0
  345. package/.output/server/chunks/build/useDaqStream-B9ZBVQrI.mjs.map +1 -0
  346. package/.output/server/chunks/build/useDaqTemplates-CK37sMfi.mjs +187 -0
  347. package/.output/server/chunks/build/useDaqTemplates-CK37sMfi.mjs.map +1 -0
  348. package/.output/server/chunks/build/useDashboardCharts-D45083s_.mjs +311 -313
  349. package/.output/server/chunks/build/useDashboardCharts-D45083s_.mjs.map +1 -1
  350. package/.output/server/chunks/build/useDashboardData-NJ7rKxhx.mjs +153 -0
  351. package/.output/server/chunks/build/useDashboardData-NJ7rKxhx.mjs.map +1 -0
  352. package/.output/server/chunks/build/useDcwAddNode-DACVcEHs.mjs +219 -0
  353. package/.output/server/chunks/build/useDcwAddNode-DACVcEHs.mjs.map +1 -0
  354. package/.output/server/chunks/build/useDcwCards-SaiImIYQ.mjs +67 -0
  355. package/.output/server/chunks/build/useDcwCards-SaiImIYQ.mjs.map +1 -0
  356. package/.output/server/chunks/build/useDcwDetailScope-DLOklSMO.mjs +184 -0
  357. package/.output/server/chunks/build/useDcwDetailScope-DLOklSMO.mjs.map +1 -0
  358. package/.output/server/chunks/build/useDcwDetailTemplates-ClmIdZ40.mjs +148 -0
  359. package/.output/server/chunks/build/useDcwDetailTemplates-ClmIdZ40.mjs.map +1 -0
  360. package/.output/server/chunks/build/useDcwFilter-CPMyCltx.mjs +71 -0
  361. package/.output/server/chunks/build/useDcwFilter-CPMyCltx.mjs.map +1 -0
  362. package/.output/server/chunks/build/useDcwLedger-0ie-0WTc.mjs +79 -0
  363. package/.output/server/chunks/build/useDcwLedger-0ie-0WTc.mjs.map +1 -0
  364. package/.output/server/chunks/build/useDcwLineMutations-DNxo66yM.mjs +137 -0
  365. package/.output/server/chunks/build/useDcwLineMutations-DNxo66yM.mjs.map +1 -0
  366. package/.output/server/chunks/build/useDcwLineRun-CHskwscT.mjs +104 -0
  367. package/.output/server/chunks/build/useDcwLineRun-CHskwscT.mjs.map +1 -0
  368. package/.output/server/chunks/build/useDcwParamApprovals-DtScUc-W.mjs +121 -0
  369. package/.output/server/chunks/build/useDcwParamApprovals-DtScUc-W.mjs.map +1 -0
  370. package/.output/server/chunks/build/useDcwProducts-BMaxzLu6.mjs +93 -0
  371. package/.output/server/chunks/build/useDcwProducts-BMaxzLu6.mjs.map +1 -0
  372. package/.output/server/chunks/build/useDcwQuery-TVU3Eo0M.mjs +98 -0
  373. package/.output/server/chunks/build/useDcwQuery-TVU3Eo0M.mjs.map +1 -0
  374. package/.output/server/chunks/build/useDcwQuickActions-BREFmR9T.mjs +88 -0
  375. package/.output/server/chunks/build/useDcwQuickActions-BREFmR9T.mjs.map +1 -0
  376. package/.output/server/chunks/build/useDcwRecipes-Bc9urA1N.mjs +258 -0
  377. package/.output/server/chunks/build/useDcwRecipes-Bc9urA1N.mjs.map +1 -0
  378. package/.output/server/chunks/build/useDcwStream-Dir5ufAU.mjs +452 -0
  379. package/.output/server/chunks/build/useDcwStream-Dir5ufAU.mjs.map +1 -0
  380. package/.output/server/chunks/build/useDcwTemplates-BzagZztS.mjs +91 -0
  381. package/.output/server/chunks/build/useDcwTemplates-BzagZztS.mjs.map +1 -0
  382. package/.output/server/chunks/build/useDcwWrites-BROwTLCn.mjs +140 -0
  383. package/.output/server/chunks/build/useDcwWrites-BROwTLCn.mjs.map +1 -0
  384. package/.output/server/chunks/build/useDeviceTwins-BqwVJaZg.mjs +128 -0
  385. package/.output/server/chunks/build/useDeviceTwins-BqwVJaZg.mjs.map +1 -0
  386. package/.output/server/chunks/build/useExpConfirmations-BM626N4p.mjs +107 -0
  387. package/.output/server/chunks/build/useExpConfirmations-BM626N4p.mjs.map +1 -0
  388. package/.output/server/chunks/build/useLocalTime-uVSM44Um.mjs +55 -0
  389. package/.output/server/chunks/build/useLocalTime-uVSM44Um.mjs.map +1 -0
  390. package/.output/server/chunks/build/useLogsFormat-B-o4MHy7.mjs +34 -31
  391. package/.output/server/chunks/build/useLogsFormat-B-o4MHy7.mjs.map +1 -1
  392. package/.output/server/chunks/build/useLogsManual-cVBZQ_Mt.mjs +88 -0
  393. package/.output/server/chunks/build/useLogsManual-cVBZQ_Mt.mjs.map +1 -0
  394. package/.output/server/chunks/build/useLogsQuery-D7hrJ3yn.mjs +150 -0
  395. package/.output/server/chunks/build/useLogsQuery-D7hrJ3yn.mjs.map +1 -0
  396. package/.output/server/chunks/build/useLogsScope-aaPQeTRm.mjs +83 -0
  397. package/.output/server/chunks/build/useLogsScope-aaPQeTRm.mjs.map +1 -0
  398. package/.output/server/chunks/build/useMonitorColumns-vVnt3r5Q.mjs +167 -156
  399. package/.output/server/chunks/build/useMonitorColumns-vVnt3r5Q.mjs.map +1 -1
  400. package/.output/server/chunks/build/useMonitorData-DIkiLr_h.mjs +135 -0
  401. package/.output/server/chunks/build/useMonitorData-DIkiLr_h.mjs.map +1 -0
  402. package/.output/server/chunks/build/useMonitorFormat-CyURtH8N.mjs +91 -0
  403. package/.output/server/chunks/build/useMonitorFormat-CyURtH8N.mjs.map +1 -0
  404. package/.output/server/chunks/build/useMonitorTerminal-Dj4QwRNW.mjs +28 -21
  405. package/.output/server/chunks/build/useMonitorTerminal-Dj4QwRNW.mjs.map +1 -1
  406. package/.output/server/chunks/build/useOperationsFeed-Ci4mZAn_.mjs +195 -0
  407. package/.output/server/chunks/build/useOperationsFeed-Ci4mZAn_.mjs.map +1 -0
  408. package/.output/server/chunks/build/useOpsLog-C-M6Eace.mjs +149 -0
  409. package/.output/server/chunks/build/useOpsLog-C-M6Eace.mjs.map +1 -0
  410. package/.output/server/chunks/build/useRecipeDispatchApprovals-BYtiqfeb.mjs +156 -0
  411. package/.output/server/chunks/build/useRecipeDispatchApprovals-BYtiqfeb.mjs.map +1 -0
  412. package/.output/server/chunks/build/useResponsive-BKDMGTHs.mjs +39 -23
  413. package/.output/server/chunks/build/useResponsive-BKDMGTHs.mjs.map +1 -1
  414. package/.output/server/chunks/build/useTeamActions-BDjU06LP.mjs +79 -0
  415. package/.output/server/chunks/build/useTeamActions-BDjU06LP.mjs.map +1 -0
  416. package/.output/server/chunks/build/useTeamAddMemberDialog-J3oFn3FI.mjs +84 -0
  417. package/.output/server/chunks/build/useTeamAddMemberDialog-J3oFn3FI.mjs.map +1 -0
  418. package/.output/server/chunks/build/useTeamCreateDialog-fbn4ixYu.mjs +97 -0
  419. package/.output/server/chunks/build/useTeamCreateDialog-fbn4ixYu.mjs.map +1 -0
  420. package/.output/server/chunks/build/useTeamDeployDialog-BNezMD2k.mjs +80 -0
  421. package/.output/server/chunks/build/useTeamDeployDialog-BNezMD2k.mjs.map +1 -0
  422. package/.output/server/chunks/build/useTeamDialogState-CFRUQxAf.mjs +39 -32
  423. package/.output/server/chunks/build/useTeamDialogState-CFRUQxAf.mjs.map +1 -1
  424. package/.output/server/chunks/build/useTeamPluginDialog-BZznrOVe.mjs +103 -0
  425. package/.output/server/chunks/build/useTeamPluginDialog-BZznrOVe.mjs.map +1 -0
  426. package/.output/server/chunks/build/useTeamsCatalog-DuZFP3oG.mjs +123 -0
  427. package/.output/server/chunks/build/useTeamsCatalog-DuZFP3oG.mjs.map +1 -0
  428. package/.output/server/chunks/build/useTokenClipboard-CwQpoFeP.mjs +29 -22
  429. package/.output/server/chunks/build/useTokenClipboard-CwQpoFeP.mjs.map +1 -1
  430. package/.output/server/chunks/build/useTokenCreate-Ctl0YGhL.mjs +115 -0
  431. package/.output/server/chunks/build/useTokenCreate-Ctl0YGhL.mjs.map +1 -0
  432. package/.output/server/chunks/build/useTokenRename-Cm3ypSfN.mjs +87 -0
  433. package/.output/server/chunks/build/useTokenRename-Cm3ypSfN.mjs.map +1 -0
  434. package/.output/server/chunks/build/useTokenReveal-CeoWL5Mt.mjs +118 -0
  435. package/.output/server/chunks/build/useTokenReveal-CeoWL5Mt.mjs.map +1 -0
  436. package/.output/server/chunks/build/useTokensList-CNIzON3u.mjs +92 -0
  437. package/.output/server/chunks/build/useTokensList-CNIzON3u.mjs.map +1 -0
  438. package/.output/server/chunks/build/useTownBus-D9SoIsAN.mjs +17 -16
  439. package/.output/server/chunks/build/useTownBus-D9SoIsAN.mjs.map +1 -1
  440. package/.output/server/chunks/build/useWorkbenchAuth-CY-bVFMu.mjs +141 -0
  441. package/.output/server/chunks/build/useWorkbenchAuth-CY-bVFMu.mjs.map +1 -0
  442. package/.output/server/chunks/build/useWorkbenchWorkspaces-DhZQFss9.mjs +138 -0
  443. package/.output/server/chunks/build/useWorkbenchWorkspaces-DhZQFss9.mjs.map +1 -0
  444. package/.output/server/chunks/build/useWorkshopApi-BxHn-4iR.mjs +127 -0
  445. package/.output/server/chunks/build/useWorkshopApi-BxHn-4iR.mjs.map +1 -0
  446. package/.output/server/chunks/build/useWorkshopWs-YQ5URrbt.mjs +1659 -0
  447. package/.output/server/chunks/build/useWorkshopWs-YQ5URrbt.mjs.map +1 -0
  448. package/.output/server/chunks/build/useWorkspaceAuth-Dlvj9csD.mjs +60 -0
  449. package/.output/server/chunks/build/useWorkspaceAuth-Dlvj9csD.mjs.map +1 -0
  450. package/.output/server/chunks/build/useWorkspaceChannels-CPFepxTN.mjs +92 -0
  451. package/.output/server/chunks/build/useWorkspaceChannels-CPFepxTN.mjs.map +1 -0
  452. package/.output/server/chunks/build/useWorkspacePanels-CTwREmq0.mjs +34 -31
  453. package/.output/server/chunks/build/useWorkspacePanels-CTwREmq0.mjs.map +1 -1
  454. package/.output/server/chunks/build/useWorkspaceShell-BCypjjjE.mjs +168 -0
  455. package/.output/server/chunks/build/useWorkspaceShell-BCypjjjE.mjs.map +1 -0
  456. package/.output/server/chunks/build/users-DjiVC_tS.mjs +569 -0
  457. package/.output/server/chunks/build/users-DjiVC_tS.mjs.map +1 -0
  458. package/.output/server/chunks/build/workshop-1gKeDASV.mjs +546 -0
  459. package/.output/server/chunks/build/workshop-1gKeDASV.mjs.map +1 -0
  460. package/.output/server/chunks/build/workspaces-CmW0cpOt.mjs +121 -111
  461. package/.output/server/chunks/build/workspaces-CmW0cpOt.mjs.map +1 -1
  462. package/.output/server/chunks/routes/api/health.get.mjs +1 -1
  463. package/.output/server/chunks/routes/api/index.get.mjs +1 -1
  464. package/.output/server/chunks/routes/api/index.post.mjs +1 -1
  465. package/.output/server/chunks/routes/api/mcp/workshop.mjs +2 -2
  466. package/.output/server/chunks/routes/api/metrics.mjs +1 -1
  467. package/.output/server/chunks/routes/api/plugins/_name/_...path_.mjs +1 -1
  468. package/.output/server/chunks/routes/api/plugins/client/_name_.get.mjs +1 -1
  469. package/.output/server/chunks/routes/api/plugins/i18n.get.mjs +1 -1
  470. package/.output/server/chunks/routes/api/plugins/manifest.get.mjs +1 -1
  471. package/.output/server/chunks/routes/api/system/backup/list.get.mjs +1 -1
  472. package/.output/server/chunks/routes/api/system/backup/run.post.mjs +3 -3
  473. package/.output/server/chunks/routes/api/system/config-groups/_id_.delete.mjs +1 -1
  474. package/.output/server/chunks/routes/api/system/config-groups/_id_.patch.mjs +1 -1
  475. package/.output/server/chunks/routes/api/system/config.get.mjs +1 -1
  476. package/.output/server/chunks/routes/api/system/index.get.mjs +1 -1
  477. package/.output/server/chunks/routes/api/system/index.patch.mjs +1 -1
  478. package/.output/server/chunks/routes/api/system/index.post.mjs +1 -1
  479. package/.output/server/chunks/routes/api/system/index2.get.mjs +1 -1
  480. package/.output/server/chunks/routes/api/system/monitor/terminal/ws.mjs +1 -1
  481. package/.output/server/chunks/routes/api/system/monitor/terminate.post.mjs +1 -1
  482. package/.output/server/chunks/routes/api/system/monitor.get.mjs +1 -1
  483. package/.output/server/chunks/routes/api/system/settings/events.get.mjs +1 -1
  484. package/.output/server/chunks/routes/api/system/settings/reset.post.mjs +1 -1
  485. package/.output/server/chunks/routes/api/system/timezone.get.mjs +1 -1
  486. package/.output/server/chunks/routes/api/users/_id_.delete.mjs +1 -1
  487. package/.output/server/chunks/routes/api/users/_id_.get.mjs +1 -1
  488. package/.output/server/chunks/routes/api/users/_id_.put.mjs +1 -1
  489. package/.output/server/chunks/routes/api/users/change-password.post.mjs +1 -1
  490. package/.output/server/chunks/routes/api/users/index.get.mjs +1 -1
  491. package/.output/server/chunks/routes/api/users/index.post.mjs +1 -1
  492. package/.output/server/chunks/routes/api/users/login.post.mjs +1 -1
  493. package/.output/server/chunks/routes/api/users/logout.post.mjs +1 -1
  494. package/.output/server/chunks/routes/api/users/me.get.mjs +1 -1
  495. package/.output/server/chunks/routes/api/users/register.post.mjs +1 -1
  496. package/.output/server/chunks/routes/api/users/setup-status.get.mjs +1 -1
  497. package/.output/server/chunks/routes/api/users/tokens/_id/token.get.mjs +1 -1
  498. package/.output/server/chunks/routes/api/users/tokens/_id_.delete.mjs +1 -1
  499. package/.output/server/chunks/routes/api/users/tokens/_id_.patch.mjs +1 -1
  500. package/.output/server/chunks/routes/api/workshop/_...path_.mjs +1 -1
  501. package/.output/server/chunks/routes/api/workshop/a2a/_agentId/index.get.mjs +1 -1
  502. package/.output/server/chunks/routes/api/workshop/a2a/_agentId/index.post.mjs +1 -1
  503. package/.output/server/chunks/routes/api/workshop/a2a/send.post.mjs +1 -1
  504. package/.output/server/chunks/routes/api/workshop/agent-tools/approvals/_id/decide.post.mjs +1 -1
  505. package/.output/server/chunks/routes/api/workshop/agent-tools/bindings/_id_.delete.mjs +1 -1
  506. package/.output/server/chunks/routes/api/workshop/agent-tools/bindings/_id_.patch.mjs +1 -1
  507. package/.output/server/chunks/routes/api/workshop/agent-tools/bindings/grant.post.mjs +1 -1
  508. package/.output/server/chunks/routes/api/workshop/agent-tools/bindings/revoke.post.mjs +1 -1
  509. package/.output/server/chunks/routes/api/workshop/agent-tools/index.get.mjs +1 -1
  510. package/.output/server/chunks/routes/api/workshop/agent-tools/index.post.mjs +1 -1
  511. package/.output/server/chunks/routes/api/workshop/agent-tools/index2.get.mjs +1 -1
  512. package/.output/server/chunks/routes/api/workshop/agent-tools/invoke.post.mjs +1 -1
  513. package/.output/server/chunks/routes/api/workshop/agent-tools/list.get.mjs +1 -1
  514. package/.output/server/chunks/routes/api/workshop/agents/_id_.delete.mjs +1 -1
  515. package/.output/server/chunks/routes/api/workshop/agents/_id_.get.mjs +1 -1
  516. package/.output/server/chunks/routes/api/workshop/agents/_id_.patch.mjs +1 -1
  517. package/.output/server/chunks/routes/api/workshop/agents/subscribe.post.mjs +1 -1
  518. package/.output/server/chunks/routes/api/workshop/aml/datasets/_id/preview.get.mjs +1 -1
  519. package/.output/server/chunks/routes/api/workshop/aml/datasets/_id_.delete.mjs +1 -1
  520. package/.output/server/chunks/routes/api/workshop/aml/datasets/_id_.get.mjs +1 -1
  521. package/.output/server/chunks/routes/api/workshop/aml/datasets/_id_.patch.mjs +1 -1
  522. package/.output/server/chunks/routes/api/workshop/aml/entities/prune.post.mjs +1 -1
  523. package/.output/server/chunks/routes/api/workshop/aml/env/recheck.post.mjs +1 -1
  524. package/.output/server/chunks/routes/api/workshop/aml/env/uv.post.mjs +1 -1
  525. package/.output/server/chunks/routes/api/workshop/aml/env/venv.post.mjs +1 -1
  526. package/.output/server/chunks/routes/api/workshop/aml/index.get.mjs +1 -1
  527. package/.output/server/chunks/routes/api/workshop/aml/index.post.mjs +1 -1
  528. package/.output/server/chunks/routes/api/workshop/aml/index2.get.mjs +1 -1
  529. package/.output/server/chunks/routes/api/workshop/aml/index2.post.mjs +1 -1
  530. package/.output/server/chunks/routes/api/workshop/aml/index3.get.mjs +1 -1
  531. package/.output/server/chunks/routes/api/workshop/aml/index3.post.mjs +1 -1
  532. package/.output/server/chunks/routes/api/workshop/aml/index4.get.mjs +1 -1
  533. package/.output/server/chunks/routes/api/workshop/aml/index5.get.mjs +1 -1
  534. package/.output/server/chunks/routes/api/workshop/aml/index6.get.mjs +1 -1
  535. package/.output/server/chunks/routes/api/workshop/aml/index7.get.mjs +1 -1
  536. package/.output/server/chunks/routes/api/workshop/aml/jobs/_id/cancel.post.mjs +1 -1
  537. package/.output/server/chunks/routes/api/workshop/aml/jobs/_id/logs.get.mjs +1 -1
  538. package/.output/server/chunks/routes/api/workshop/aml/jobs/_id/retry.post.mjs +1 -1
  539. package/.output/server/chunks/routes/api/workshop/aml/jobs/_id_.delete.mjs +1 -1
  540. package/.output/server/chunks/routes/api/workshop/aml/jobs/_id_.get.mjs +1 -1
  541. package/.output/server/chunks/routes/api/workshop/aml/models/_id/predict.post.mjs +1 -1
  542. package/.output/server/chunks/routes/api/workshop/aml/models/_id/promote.post.mjs +1 -1
  543. package/.output/server/chunks/routes/api/workshop/aml/models/_id_.delete.mjs +1 -1
  544. package/.output/server/chunks/routes/api/workshop/aml/models/_id_.patch.mjs +1 -1
  545. package/.output/server/chunks/routes/api/workshop/aml/training-plans/_id/train.post.mjs +1 -1
  546. package/.output/server/chunks/routes/api/workshop/aml/training-plans/_id_.delete.mjs +1 -1
  547. package/.output/server/chunks/routes/api/workshop/aml/training-plans/_id_.patch.mjs +1 -1
  548. package/.output/server/chunks/routes/api/workshop/aml/twin/providers.get.mjs +1 -1
  549. package/.output/server/chunks/routes/api/workshop/analysis/_id_.delete.mjs +1 -1
  550. package/.output/server/chunks/routes/api/workshop/analysis/_id_.get.mjs +1 -1
  551. package/.output/server/chunks/routes/api/workshop/analysis/_id_.patch.mjs +1 -1
  552. package/.output/server/chunks/routes/api/workshop/approvals/_id/decide.post.mjs +1 -1
  553. package/.output/server/chunks/routes/api/workshop/assets/character/_id_.delete.mjs +1 -1
  554. package/.output/server/chunks/routes/api/workshop/assets/devices/_id_.delete.mjs +1 -1
  555. package/.output/server/chunks/routes/api/workshop/assets/index.get.mjs +1 -1
  556. package/.output/server/chunks/routes/api/workshop/assets/index.post.mjs +1 -1
  557. package/.output/server/chunks/routes/api/workshop/assets/index2.get.mjs +1 -1
  558. package/.output/server/chunks/routes/api/workshop/assets/index2.post.mjs +1 -1
  559. package/.output/server/chunks/routes/api/workshop/audit.get.mjs +1 -1
  560. package/.output/server/chunks/routes/api/workshop/caller.mjs +1 -1
  561. package/.output/server/chunks/routes/api/workshop/channel-templates/_id/instantiate.post.mjs +2 -2
  562. package/.output/server/chunks/routes/api/workshop/channel-templates/_id_.delete.mjs +1 -1
  563. package/.output/server/chunks/routes/api/workshop/channel-templates/_id_.get.mjs +1 -1
  564. package/.output/server/chunks/routes/api/workshop/channel-templates/_id_.patch.mjs +1 -1
  565. package/.output/server/chunks/routes/api/workshop/channel-templates/from-channel.post.mjs +1 -1
  566. package/.output/server/chunks/routes/api/workshop/channels/_id/activate.post.mjs +1 -1
  567. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/index.get.mjs +1 -1
  568. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/index.post.mjs +1 -1
  569. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/memories/_memoryId_.delete.mjs +1 -1
  570. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/memories/search.post.mjs +1 -1
  571. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/model.patch.mjs +1 -1
  572. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/position.patch.mjs +1 -1
  573. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/range.patch.mjs +1 -1
  574. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/rotate-token.post.mjs +1 -1
  575. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/stop.post.mjs +1 -1
  576. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId_.delete.mjs +1 -1
  577. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId_.patch.mjs +1 -1
  578. package/.output/server/chunks/routes/api/workshop/channels/_id/chat/index.get.mjs +1 -1
  579. package/.output/server/chunks/routes/api/workshop/channels/_id/chat/index.post.mjs +1 -1
  580. package/.output/server/chunks/routes/api/workshop/channels/_id/chat/messages/_messageId/read.post.mjs +1 -1
  581. package/.output/server/chunks/routes/api/workshop/channels/_id/chat/permissions.get.mjs +1 -1
  582. package/.output/server/chunks/routes/api/workshop/channels/_id/events.get.mjs +1 -1
  583. package/.output/server/chunks/routes/api/workshop/channels/_id/execution-mode.patch.mjs +92 -0
  584. package/.output/server/chunks/routes/api/workshop/channels/_id/execution-mode.patch.mjs.map +1 -0
  585. package/.output/server/chunks/routes/api/workshop/channels/_id/index.get.mjs +1 -1
  586. package/.output/server/chunks/routes/api/workshop/channels/_id/index.post.mjs +1 -1
  587. package/.output/server/chunks/routes/api/workshop/channels/_id/index.put.mjs +2 -2
  588. package/.output/server/chunks/routes/api/workshop/channels/_id/index2.get.mjs +1 -1
  589. package/.output/server/chunks/routes/api/workshop/channels/_id/index2.post.mjs +1 -1
  590. package/.output/server/chunks/routes/api/workshop/channels/_id/index2.put.mjs +2 -2
  591. package/.output/server/chunks/routes/api/workshop/channels/_id/index3.get.mjs +1 -1
  592. package/.output/server/chunks/routes/api/workshop/channels/_id/index3.post.mjs +1 -1
  593. package/.output/server/chunks/routes/api/workshop/channels/_id/index4.get.mjs +1 -1
  594. package/.output/server/chunks/routes/api/workshop/channels/_id/index4.post.mjs +1 -1
  595. package/.output/server/chunks/routes/api/workshop/channels/_id/index5.get.mjs +2 -2
  596. package/.output/server/chunks/routes/api/workshop/channels/_id/index6.get.mjs +1 -1
  597. package/.output/server/chunks/routes/api/workshop/channels/_id/index7.get.mjs +1 -1
  598. package/.output/server/chunks/routes/api/workshop/channels/_id/line.put.mjs +1 -1
  599. package/.output/server/chunks/routes/api/workshop/channels/_id/members/_userId/approve.post.mjs +1 -1
  600. package/.output/server/chunks/routes/api/workshop/channels/_id/members/_userId_.delete.mjs +1 -1
  601. package/.output/server/chunks/routes/api/workshop/channels/_id/members/join.post.mjs +1 -1
  602. package/.output/server/chunks/routes/api/workshop/channels/_id/members/leave.post.mjs +1 -1
  603. package/.output/server/chunks/routes/api/workshop/channels/_id/memories/_memoryId_.delete.mjs +1 -1
  604. package/.output/server/chunks/routes/api/workshop/channels/_id/queue.get.mjs +1 -1
  605. package/.output/server/chunks/routes/api/workshop/channels/_id/terminals.get.mjs +2 -2
  606. package/.output/server/chunks/routes/api/workshop/channels/_id/tools/reset.post.mjs +2 -2
  607. package/.output/server/chunks/routes/api/workshop/channels/_id/twin-profile.get.mjs +2 -2
  608. package/.output/server/chunks/routes/api/workshop/channels/_id/twin-profile.patch.mjs +2 -2
  609. package/.output/server/chunks/routes/api/workshop/channels/_id_.delete.mjs +1 -1
  610. package/.output/server/chunks/routes/api/workshop/channels/index.get.mjs +1 -1
  611. package/.output/server/chunks/routes/api/workshop/channels/index.patch.mjs +1 -1
  612. package/.output/server/chunks/routes/api/workshop/channels.get.mjs +1 -1
  613. package/.output/server/chunks/routes/api/workshop/channels.post.mjs +7 -7
  614. package/.output/server/chunks/routes/api/workshop/daq/_id/bind.post.mjs +1 -1
  615. package/.output/server/chunks/routes/api/workshop/daq/_id/bindings.put.mjs +1 -1
  616. package/.output/server/chunks/routes/api/workshop/daq/_id/frames/content.get.mjs +3 -1
  617. package/.output/server/chunks/routes/api/workshop/daq/_id/frames/content.get.mjs.map +1 -1
  618. package/.output/server/chunks/routes/api/workshop/daq/_id/frames.get.mjs +1 -1
  619. package/.output/server/chunks/routes/api/workshop/daq/_id/ingest.post.mjs +6 -3
  620. package/.output/server/chunks/routes/api/workshop/daq/_id/ingest.post.mjs.map +1 -1
  621. package/.output/server/chunks/routes/api/workshop/daq/_id/samples.get.mjs +2 -2
  622. package/.output/server/chunks/routes/api/workshop/daq/_id/test.post.mjs +1 -1
  623. package/.output/server/chunks/routes/api/workshop/daq/_id_.delete.mjs +1 -1
  624. package/.output/server/chunks/routes/api/workshop/daq/_id_.patch.mjs +1 -1
  625. package/.output/server/chunks/routes/api/workshop/daq/alarms/_id/ack.post.mjs +1 -1
  626. package/.output/server/chunks/routes/api/workshop/daq/alarms.get.mjs +1 -1
  627. package/.output/server/chunks/routes/api/workshop/daq/controller.post.mjs +1 -1
  628. package/.output/server/chunks/routes/api/workshop/daq/export/_id_.get.mjs +1 -1
  629. package/.output/server/chunks/routes/api/workshop/daq/export-file.get.mjs +1 -1
  630. package/.output/server/chunks/routes/api/workshop/daq/index.get.mjs +1 -1
  631. package/.output/server/chunks/routes/api/workshop/daq/index.post.mjs +1 -1
  632. package/.output/server/chunks/routes/api/workshop/daq/index2.post.mjs +2 -2
  633. package/.output/server/chunks/routes/api/workshop/daq/infra/reconnect.post.mjs +2 -2
  634. package/.output/server/chunks/routes/api/workshop/daq/infra.get.mjs +2 -2
  635. package/.output/server/chunks/routes/api/workshop/daq/query.get.mjs +1 -1
  636. package/.output/server/chunks/routes/api/workshop/daq/templates/_key_.delete.mjs +2 -2
  637. package/.output/server/chunks/routes/api/workshop/daq/templates/_key_.patch.mjs +2 -2
  638. package/.output/server/chunks/routes/api/workshop/daq/test-driver.post.mjs +2 -2
  639. package/.output/server/chunks/routes/api/workshop/dcw/_id/bind.post.mjs +2 -2
  640. package/.output/server/chunks/routes/api/workshop/dcw/_id/bindings.put.mjs +2 -2
  641. package/.output/server/chunks/routes/api/workshop/dcw/_id/param-ledger.get.mjs +2 -2
  642. package/.output/server/chunks/routes/api/workshop/dcw/_id/read.post.mjs +2 -2
  643. package/.output/server/chunks/routes/api/workshop/dcw/_id/test.post.mjs +2 -2
  644. package/.output/server/chunks/routes/api/workshop/dcw/_id/write.post.mjs +2 -2
  645. package/.output/server/chunks/routes/api/workshop/dcw/_id_.delete.mjs +2 -2
  646. package/.output/server/chunks/routes/api/workshop/dcw/_id_.patch.mjs +2 -2
  647. package/.output/server/chunks/routes/api/workshop/dcw/controller.post.mjs +2 -2
  648. package/.output/server/chunks/routes/api/workshop/dcw/index.get.mjs +2 -2
  649. package/.output/server/chunks/routes/api/workshop/dcw/index.post.mjs +2 -2
  650. package/.output/server/chunks/routes/api/workshop/dcw/index2.get.mjs +2 -2
  651. package/.output/server/chunks/routes/api/workshop/dcw/index2.post.mjs +2 -2
  652. package/.output/server/chunks/routes/api/workshop/dcw/index3.get.mjs +2 -2
  653. package/.output/server/chunks/routes/api/workshop/dcw/index3.post.mjs +2 -2
  654. package/.output/server/chunks/routes/api/workshop/dcw/index4.get.mjs +2 -2
  655. package/.output/server/chunks/routes/api/workshop/dcw/index4.post.mjs +2 -2
  656. package/.output/server/chunks/routes/api/workshop/dcw/index5.get.mjs +2 -2
  657. package/.output/server/chunks/routes/api/workshop/dcw/index5.post.mjs +2 -2
  658. package/.output/server/chunks/routes/api/workshop/dcw/index6.get.mjs +1 -1
  659. package/.output/server/chunks/routes/api/workshop/dcw/index7.get.mjs +1 -1
  660. package/.output/server/chunks/routes/api/workshop/dcw/journal/node/_nodeId/rollback.post.mjs +2 -2
  661. package/.output/server/chunks/routes/api/workshop/dcw/line/query.get.mjs +2 -2
  662. package/.output/server/chunks/routes/api/workshop/dcw/lines/_id/start.post.mjs +2 -2
  663. package/.output/server/chunks/routes/api/workshop/dcw/lines/_id/stop.post.mjs +2 -2
  664. package/.output/server/chunks/routes/api/workshop/dcw/lines/_id_.delete.mjs +2 -2
  665. package/.output/server/chunks/routes/api/workshop/dcw/lines/_id_.patch.mjs +1 -1
  666. package/.output/server/chunks/routes/api/workshop/dcw/mes-artifacts/file.get.mjs +2 -2
  667. package/.output/server/chunks/routes/api/workshop/dcw/mes-hook-test.post.mjs +5 -5
  668. package/.output/server/chunks/routes/api/workshop/dcw/mes-hook-test.post.mjs.map +1 -1
  669. package/.output/server/chunks/routes/api/workshop/dcw/mes-test-read.post.mjs +2 -2
  670. package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id/judge.post.mjs +2 -2
  671. package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id/rollback.post.mjs +2 -2
  672. package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id/series.get.mjs +2 -2
  673. package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id_.get.mjs +2 -2
  674. package/.output/server/chunks/routes/api/workshop/dcw/params/_id/read.post.mjs +2 -2
  675. package/.output/server/chunks/routes/api/workshop/dcw/params/_id/write.post.mjs +2 -2
  676. package/.output/server/chunks/routes/api/workshop/dcw/params/_id_.delete.mjs +2 -2
  677. package/.output/server/chunks/routes/api/workshop/dcw/params/_id_.patch.mjs +2 -2
  678. package/.output/server/chunks/routes/api/workshop/dcw/products/_id_.delete.mjs +8 -5
  679. package/.output/server/chunks/routes/api/workshop/dcw/products/_id_.delete.mjs.map +1 -1
  680. package/.output/server/chunks/routes/api/workshop/dcw/products/_id_.patch.mjs +9 -5
  681. package/.output/server/chunks/routes/api/workshop/dcw/products/_id_.patch.mjs.map +1 -1
  682. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/apply.post.mjs +2 -2
  683. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/mark-good.post.mjs +1 -1
  684. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/revert.post.mjs +1 -1
  685. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/rollback-good.post.mjs +2 -2
  686. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/versions.get.mjs +1 -1
  687. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id_.delete.mjs +1 -1
  688. package/.output/server/chunks/routes/api/workshop/dcw/recipes/index.patch.mjs +7 -4
  689. package/.output/server/chunks/routes/api/workshop/dcw/recipes/index.patch.mjs.map +1 -1
  690. package/.output/server/chunks/routes/api/workshop/dcw/runs/_id/close.post.mjs +2 -2
  691. package/.output/server/chunks/routes/api/workshop/dcw/runs/_id/data.get.mjs +2 -2
  692. package/.output/server/chunks/routes/api/workshop/dcw/runs/_id/rollback.post.mjs +2 -2
  693. package/.output/server/chunks/routes/api/workshop/dcw/templates/_key_.delete.mjs +2 -2
  694. package/.output/server/chunks/routes/api/workshop/dcw/templates/_key_.patch.mjs +2 -2
  695. package/.output/server/chunks/routes/api/workshop/dcw/test-driver.post.mjs +2 -2
  696. package/.output/server/chunks/routes/api/workshop/device-twins/_id/control.post.mjs +2 -2
  697. package/.output/server/chunks/routes/api/workshop/device-twins/_id/telemetry.post.mjs +2 -2
  698. package/.output/server/chunks/routes/api/workshop/device-twins/_id_.delete.mjs +2 -2
  699. package/.output/server/chunks/routes/api/workshop/device-twins/_id_.patch.mjs +2 -2
  700. package/.output/server/chunks/routes/api/workshop/eda/charts/_id_.delete.mjs +1 -1
  701. package/.output/server/chunks/routes/api/workshop/eda/charts/_id_.get.mjs +1 -1
  702. package/.output/server/chunks/routes/api/workshop/eda/charts/_id_.patch.mjs +1 -1
  703. package/.output/server/chunks/routes/api/workshop/eda/commonality.get.mjs +2 -2
  704. package/.output/server/chunks/routes/api/workshop/eda/dashboards/_id_.delete.mjs +1 -1
  705. package/.output/server/chunks/routes/api/workshop/eda/dashboards/_id_.get.mjs +1 -1
  706. package/.output/server/chunks/routes/api/workshop/eda/dashboards/_id_.patch.mjs +1 -1
  707. package/.output/server/chunks/routes/api/workshop/eda/features/jobs.get.mjs +1 -1
  708. package/.output/server/chunks/routes/api/workshop/eda/features/run.post.mjs +1 -1
  709. package/.output/server/chunks/routes/api/workshop/eda/golden/_id_.delete.mjs +1 -1
  710. package/.output/server/chunks/routes/api/workshop/eda/golden/deviation.get.mjs +1 -1
  711. package/.output/server/chunks/routes/api/workshop/eda/golden/single.get.mjs +1 -1
  712. package/.output/server/chunks/routes/api/workshop/eda/index.get.mjs +1 -1
  713. package/.output/server/chunks/routes/api/workshop/eda/index.post.mjs +1 -1
  714. package/.output/server/chunks/routes/api/workshop/eda/index2.get.mjs +1 -1
  715. package/.output/server/chunks/routes/api/workshop/eda/index2.post.mjs +1 -1
  716. package/.output/server/chunks/routes/api/workshop/eda/index3.get.mjs +1 -1
  717. package/.output/server/chunks/routes/api/workshop/eda/index3.post.mjs +1 -1
  718. package/.output/server/chunks/routes/api/workshop/eda/index4.get.mjs +1 -1
  719. package/.output/server/chunks/routes/api/workshop/eda/index4.post.mjs +1 -1
  720. package/.output/server/chunks/routes/api/workshop/eda/index5.get.mjs +1 -1
  721. package/.output/server/chunks/routes/api/workshop/eda/index5.post.mjs +1 -1
  722. package/.output/server/chunks/routes/api/workshop/eda/index6.get.mjs +1 -1
  723. package/.output/server/chunks/routes/api/workshop/eda/index6.post.mjs +1 -1
  724. package/.output/server/chunks/routes/api/workshop/eda/index7.get.mjs +1 -1
  725. package/.output/server/chunks/routes/api/workshop/eda/index7.post.mjs +1 -1
  726. package/.output/server/chunks/routes/api/workshop/eda/index8.get.mjs +1 -1
  727. package/.output/server/chunks/routes/api/workshop/eda/index8.post.mjs +1 -1
  728. package/.output/server/chunks/routes/api/workshop/eda/ocap/_id_.get.mjs +1 -1
  729. package/.output/server/chunks/routes/api/workshop/eda/ocap/_id_.patch.mjs +1 -1
  730. package/.output/server/chunks/routes/api/workshop/eda/runs/_id/labels.patch.mjs +1 -1
  731. package/.output/server/chunks/routes/api/workshop/eda/runs.get.mjs +1 -1
  732. package/.output/server/chunks/routes/api/workshop/eda/spc/_id/recompute.post.mjs +1 -1
  733. package/.output/server/chunks/routes/api/workshop/eda/spc/_id_.delete.mjs +1 -1
  734. package/.output/server/chunks/routes/api/workshop/eda/spc/_id_.get.mjs +1 -1
  735. package/.output/server/chunks/routes/api/workshop/eda/templates/_id_.delete.mjs +1 -1
  736. package/.output/server/chunks/routes/api/workshop/eda/templates/_id_.get.mjs +1 -1
  737. package/.output/server/chunks/routes/api/workshop/eda/templates/_id_.patch.mjs +1 -1
  738. package/.output/server/chunks/routes/api/workshop/eda/vm/predict.post.mjs +2 -2
  739. package/.output/server/chunks/routes/api/workshop/exp/confirmations/_id/decide.post.mjs +2 -2
  740. package/.output/server/chunks/routes/api/workshop/exp/index.get.mjs +2 -2
  741. package/.output/server/chunks/routes/api/workshop/fs/dirs.get.mjs +2 -2
  742. package/.output/server/chunks/routes/api/workshop/harnesses/_id/providers.get.mjs +2 -2
  743. package/.output/server/chunks/routes/api/workshop/harnesses.get.mjs +2 -2
  744. package/.output/server/chunks/routes/api/workshop/hitl/pending.get.mjs +2 -2
  745. package/.output/server/chunks/routes/api/workshop/hitl/respond.post.mjs +2 -2
  746. package/.output/server/chunks/routes/api/workshop/index.get.mjs +1 -1
  747. package/.output/server/chunks/routes/api/workshop/index.mjs +2 -2
  748. package/.output/server/chunks/routes/api/workshop/index.post.mjs +1 -1
  749. package/.output/server/chunks/routes/api/workshop/index.put.mjs +2 -2
  750. package/.output/server/chunks/routes/api/workshop/index10.get.mjs +1 -1
  751. package/.output/server/chunks/routes/api/workshop/index10.post.mjs +1 -1
  752. package/.output/server/chunks/routes/api/workshop/index11.get.mjs +1 -1
  753. package/.output/server/chunks/routes/api/workshop/index12.get.mjs +2 -2
  754. package/.output/server/chunks/routes/api/workshop/index13.get.mjs +1 -1
  755. package/.output/server/chunks/routes/api/workshop/index14.get.mjs +1 -1
  756. package/.output/server/chunks/routes/api/workshop/index15.get.mjs +1 -1
  757. package/.output/server/chunks/routes/api/workshop/index16.get.mjs +1 -1
  758. package/.output/server/chunks/routes/api/workshop/index2.get.mjs +1 -1
  759. package/.output/server/chunks/routes/api/workshop/index2.post.mjs +1 -1
  760. package/.output/server/chunks/routes/api/workshop/index3.get.mjs +1 -1
  761. package/.output/server/chunks/routes/api/workshop/index3.post.mjs +1 -1
  762. package/.output/server/chunks/routes/api/workshop/index4.get.mjs +1 -1
  763. package/.output/server/chunks/routes/api/workshop/index4.post.mjs +1 -1
  764. package/.output/server/chunks/routes/api/workshop/index5.get.mjs +1 -1
  765. package/.output/server/chunks/routes/api/workshop/index5.post.mjs +2 -2
  766. package/.output/server/chunks/routes/api/workshop/index6.get.mjs +2 -2
  767. package/.output/server/chunks/routes/api/workshop/index6.post.mjs +2 -2
  768. package/.output/server/chunks/routes/api/workshop/index7.get.mjs +2 -2
  769. package/.output/server/chunks/routes/api/workshop/index7.post.mjs +2 -2
  770. package/.output/server/chunks/routes/api/workshop/index8.get.mjs +2 -2
  771. package/.output/server/chunks/routes/api/workshop/index8.post.mjs +1 -1
  772. package/.output/server/chunks/routes/api/workshop/index9.get.mjs +1 -1
  773. package/.output/server/chunks/routes/api/workshop/index9.post.mjs +1 -1
  774. package/.output/server/chunks/routes/api/workshop/mailbox/all.get.mjs +1 -1
  775. package/.output/server/chunks/routes/api/workshop/mailbox.get.mjs +1 -1
  776. package/.output/server/chunks/routes/api/workshop/memories/maintenance.post.mjs +1 -1
  777. package/.output/server/chunks/routes/api/workshop/mes/datasets.get.mjs +2 -2
  778. package/.output/server/chunks/routes/api/workshop/mes/index.get.mjs +33 -0
  779. package/.output/server/chunks/routes/api/workshop/mes/index.get.mjs.map +1 -0
  780. package/.output/server/chunks/routes/api/workshop/mes/index.put.mjs +56 -0
  781. package/.output/server/chunks/routes/api/workshop/mes/index.put.mjs.map +1 -0
  782. package/.output/server/chunks/routes/api/workshop/mes/points.get.mjs +1 -1
  783. package/.output/server/chunks/routes/api/workshop/mes/preview.post.mjs +1 -1
  784. package/.output/server/chunks/routes/api/workshop/mes/secrets/_ref_.delete.mjs +49 -0
  785. package/.output/server/chunks/routes/api/workshop/mes/secrets/_ref_.delete.mjs.map +1 -0
  786. package/.output/server/chunks/routes/api/workshop/notifications/read.post.mjs +1 -1
  787. package/.output/server/chunks/routes/api/workshop/ontology/drafts/_draftId/autofix.mjs +2 -2
  788. package/.output/server/chunks/routes/api/workshop/ontology/drafts/_draftId/compile.mjs +2 -2
  789. package/.output/server/chunks/routes/api/workshop/ontology/drafts/_draftId/evidence.mjs +2 -2
  790. package/.output/server/chunks/routes/api/workshop/ontology/drafts/_draftId/publish.mjs +2 -2
  791. package/.output/server/chunks/routes/api/workshop/ontology/drafts/_draftId/rules/_ruleId/approval-decision.mjs +2 -2
  792. package/.output/server/chunks/routes/api/workshop/ontology/drafts/_draftId/rules/_ruleId/approval.mjs +2 -2
  793. package/.output/server/chunks/routes/api/workshop/ontology/drafts/_draftId/rules/_ruleId/transition.mjs +2 -2
  794. package/.output/server/chunks/routes/api/workshop/ontology/drafts/_draftId/subgraph.mjs +2 -2
  795. package/.output/server/chunks/routes/api/workshop/ontology/drafts/_draftId/validate.mjs +2 -2
  796. package/.output/server/chunks/routes/api/workshop/ontology/drafts/_draftId_.mjs +2 -2
  797. package/.output/server/chunks/routes/api/workshop/ontology/export/_ontologyId_.mjs +2 -2
  798. package/.output/server/chunks/routes/api/workshop/ontology/index.mjs +2 -2
  799. package/.output/server/chunks/routes/api/workshop/ontology/scene.mjs +2 -2
  800. package/.output/server/chunks/routes/api/workshop/ontology/traces/_ontologyId_.mjs +2 -2
  801. package/.output/server/chunks/routes/api/workshop/ontology/versions/_ontologyId/compare.mjs +2 -2
  802. package/.output/server/chunks/routes/api/workshop/ontology/versions/_ontologyId_.mjs +2 -2
  803. package/.output/server/chunks/routes/api/workshop/optimization/bindings/_id_.delete.mjs +1 -1
  804. package/.output/server/chunks/routes/api/workshop/optimization/capabilities.get.mjs +2 -2
  805. package/.output/server/chunks/routes/api/workshop/optimization/index.get.mjs +2 -2
  806. package/.output/server/chunks/routes/api/workshop/optimization/index.mjs +2 -2
  807. package/.output/server/chunks/routes/api/workshop/optimization/index2.mjs +2 -2
  808. package/.output/server/chunks/routes/api/workshop/optimization/profiles/_id/publish.post.mjs +2 -2
  809. package/.output/server/chunks/routes/api/workshop/optimization/recommendations/_id/crosscheck.post.mjs +2 -2
  810. package/.output/server/chunks/routes/api/workshop/optimization/recommendations/_id/dispatch.post.mjs +2 -2
  811. package/.output/server/chunks/routes/api/workshop/optimization/solve.post.mjs +2 -2
  812. package/.output/server/chunks/routes/api/workshop/plugins/_name/disable.post.mjs +2 -2
  813. package/.output/server/chunks/routes/api/workshop/plugins/_name/enable.post.mjs +2 -2
  814. package/.output/server/chunks/routes/api/workshop/plugins/index.get.mjs +1 -1
  815. package/.output/server/chunks/routes/api/workshop/process-model/datasets.post.mjs +2 -2
  816. package/.output/server/chunks/routes/api/workshop/process-model/eligibility.mjs +2 -2
  817. package/.output/server/chunks/routes/api/workshop/process-model/experiments.mjs +1 -1
  818. package/.output/server/chunks/routes/api/workshop/process-model/index.mjs +2 -2
  819. package/.output/server/chunks/routes/api/workshop/process-model/specs/_id/publish.post.mjs +2 -2
  820. package/.output/server/chunks/routes/api/workshop/process-model/train.post.mjs +2 -2
  821. package/.output/server/chunks/routes/api/workshop/runtime.get.mjs +1 -1
  822. package/.output/server/chunks/routes/api/workshop/scene/layouts/_channelId_.delete.mjs +2 -2
  823. package/.output/server/chunks/routes/api/workshop/scene/layouts/_channelId_.put.mjs +2 -2
  824. package/.output/server/chunks/routes/api/workshop/scene/layouts.get.mjs +1 -1
  825. package/.output/server/chunks/routes/api/workshop/schedules/_id/run.post.mjs +1 -1
  826. package/.output/server/chunks/routes/api/workshop/schedules/_id/runs.get.mjs +1 -1
  827. package/.output/server/chunks/routes/api/workshop/schedules/_id_.delete.mjs +1 -1
  828. package/.output/server/chunks/routes/api/workshop/schedules/_id_.get.mjs +1 -1
  829. package/.output/server/chunks/routes/api/workshop/schedules/_id_.patch.mjs +1 -1
  830. package/.output/server/chunks/routes/api/workshop/tasks/_id/complete.post.mjs +1 -1
  831. package/.output/server/chunks/routes/api/workshop/tasks/_id/dispatch.post.mjs +1 -1
  832. package/.output/server/chunks/routes/api/workshop/tasks/_id/index.post.mjs +1 -1
  833. package/.output/server/chunks/routes/api/workshop/tasks/_id/reassign.post.mjs +1 -1
  834. package/.output/server/chunks/routes/api/workshop/tasks/_id/reopen.post.mjs +1 -1
  835. package/.output/server/chunks/routes/api/workshop/tasks/_id/report.post.mjs +1 -1
  836. package/.output/server/chunks/routes/api/workshop/tasks/_id/retry.post.mjs +1 -1
  837. package/.output/server/chunks/routes/api/workshop/tasks/_id/update.post.mjs +1 -1
  838. package/.output/server/chunks/routes/api/workshop/tasks/_id_.get.mjs +1 -1
  839. package/.output/server/chunks/routes/api/workshop/tasks.get.mjs +1 -1
  840. package/.output/server/chunks/routes/api/workshop/teams/_id/deploy.post.mjs +1 -1
  841. package/.output/server/chunks/routes/api/workshop/teams/_id/index.get.mjs +1 -1
  842. package/.output/server/chunks/routes/api/workshop/teams/_id/index.post.mjs +1 -1
  843. package/.output/server/chunks/routes/api/workshop/teams/_id/index.put.mjs +2 -2
  844. package/.output/server/chunks/routes/api/workshop/teams/_id/index2.get.mjs +2 -2
  845. package/.output/server/chunks/routes/api/workshop/teams/_id/members/_agentId_.delete.mjs +1 -1
  846. package/.output/server/chunks/routes/api/workshop/teams/_id_.delete.mjs +1 -1
  847. package/.output/server/chunks/routes/api/workshop/teams/_id_.get.mjs +1 -1
  848. package/.output/server/chunks/routes/api/workshop/teams/_id_.patch.mjs +1 -1
  849. package/.output/server/chunks/routes/api/workshop/tools/_name_.get.mjs +1 -1
  850. package/.output/server/chunks/routes/api/workshop/tools/sync.post.mjs +2 -2
  851. package/.output/server/chunks/routes/api/workshop/users/me.get.mjs +1 -1
  852. package/.output/server/chunks/routes/api/workshop/users/register.post.mjs +1 -1
  853. package/.output/server/chunks/routes/api/workshop/workspaces/_id/channel-templates/_tplId_.post.mjs +2 -2
  854. package/.output/server/chunks/routes/api/workshop/workspaces/_id/channels/_channelId_.delete.mjs +1 -1
  855. package/.output/server/chunks/routes/api/workshop/workspaces/_id/channels/_channelId_.post.mjs +1 -1
  856. package/.output/server/chunks/routes/api/workshop/workspaces/index.delete.mjs +1 -1
  857. package/.output/server/chunks/routes/renderer.mjs +2 -2
  858. package/.output/server/chunks/routes/renderer.mjs.map +1 -1
  859. package/.output/server/chunks/virtual/entry.mjs +10774 -9374
  860. package/.output/server/chunks/virtual/entry.mjs.map +1 -1
  861. package/.output/server/chunks/virtual/precomputed.mjs +1 -1
  862. package/.output/server/chunks/virtual/precomputed.mjs.map +1 -1
  863. package/.output/server/index.mjs +1 -1
  864. package/.output/server/package.json +1 -1
  865. package/README-zh.md +16 -6
  866. package/README.md +16 -6
  867. package/app/.mimosa/hook-state/sess_05189059-e42d-4188-8911-4f7baabe009b.json +1 -0
  868. package/app/.mimosa/hook-state/sess_05189059-e42d-4188-8911-4f7baabe009b.mtg0vz68-49792-75b0709555.baseline/1459e6269990a5d229b9228c8b2f62ffaa7d350068380ae8b875fee0db45cca6.source +180 -0
  869. package/app/.mimosa/hook-state/sess_05189059-e42d-4188-8911-4f7baabe009b.mtg0vz68-49792-75b0709555.baseline/c2991e909c70c5c12b90a407c7adcf63384c51668a2b334e6e047fa675c268fe.source +305 -0
  870. package/app/.mimosa/hook-state/sess_05189059-e42d-4188-8911-4f7baabe009b.mtg0vz68-49792-75b0709555.baseline/e09129039d1e27e3fac24becc9bdafd2d1a7c8049bff24173df007be865f0165.source +264 -0
  871. package/app/.mimosa/hook-status/sess_05189059-e42d-4188-8911-4f7baabe009b-28ef7c75ea.json +14 -0
  872. package/app/components/AwChart.vue +32 -3
  873. package/app/components/AwLogo.vue +75 -75
  874. package/app/components/aml/AmlDatasetFormModal.vue +279 -279
  875. package/app/components/aml/AmlDatasetTable.vue +319 -319
  876. package/app/components/aml/AmlExperimentsTable.vue +142 -142
  877. package/app/components/aml/AmlInfraBanner.vue +23 -23
  878. package/app/components/aml/AmlJobsTable.vue +248 -248
  879. package/app/components/aml/AmlOverviewBar.vue +62 -62
  880. package/app/components/aml/AmlPageHeader.vue +47 -47
  881. package/app/components/aml/AmlPredictConsole.vue +201 -201
  882. package/app/components/app-header/HitlBell.vue +423 -423
  883. package/app/components/daq/DaqAddNodeModal.vue +209 -209
  884. package/app/components/daq/DaqAlarmBar.vue +46 -46
  885. package/app/components/daq/DaqControlCard.vue +159 -159
  886. package/app/components/daq/DaqInfraBanner.vue +31 -31
  887. package/app/components/daq/DaqLineBanner.vue +47 -47
  888. package/app/components/daq/DaqNodePanel.vue +396 -396
  889. package/app/components/daq/DaqOptPanel.vue +197 -197
  890. package/app/components/daq/DaqTemplateModal.vue +246 -246
  891. package/app/components/dashboard/DashboardGaugeBand.vue +78 -78
  892. package/app/components/dashboard/DashboardHero.vue +209 -209
  893. package/app/components/dashboard/DashboardLineStatePanel.vue +78 -78
  894. package/app/components/dashboard/DashboardNodeStatePanel.vue +46 -46
  895. package/app/components/dashboard/DashboardPipelinePanel.vue +46 -46
  896. package/app/components/dashboard/DashboardTrendPanel.vue +83 -83
  897. package/app/components/dashboard/DashboardWritePanel.vue +52 -52
  898. package/app/components/dcw/DcwCreateLineModal.vue +105 -105
  899. package/app/components/dcw/DcwDeleteLineModal.vue +73 -73
  900. package/app/components/dcw/DcwDetailTemplateModal.vue +238 -238
  901. package/app/components/dcw/DcwLedgerCard.vue +160 -160
  902. package/app/components/dcw/DcwMesArtifacts.vue +140 -140
  903. package/app/components/dcw/DcwProductCreateModal.vue +113 -113
  904. package/app/components/dcw/DcwRecipeDispatchHistoryModal.vue +244 -244
  905. package/app/components/dcw/DcwRecipeEditModal.vue +399 -399
  906. package/app/components/dcw/DcwRecipeHistoryModal.vue +165 -165
  907. package/app/components/dcw/DcwRunDataModal.vue +191 -191
  908. package/app/components/dcw/DcwTemplateModal.vue +227 -227
  909. package/app/components/dcw/DcwWriteHistoryCard.vue +96 -96
  910. package/app/components/dcw/ExpConfirmCard.vue +103 -103
  911. package/app/components/dcw/RecipeDispatchApprovalCard.vue +330 -330
  912. package/app/components/logs/LogsPageHead.vue +71 -71
  913. package/app/components/monitor/MonitorAgentTable.vue +143 -143
  914. package/app/components/monitor/MonitorChannelTable.vue +80 -80
  915. package/app/components/monitor/MonitorLoginGate.vue +24 -24
  916. package/app/components/monitor/MonitorPageHead.vue +92 -92
  917. package/app/components/monitor/MonitorProcessTable.vue +159 -159
  918. package/app/components/ontology/OntologyGraph.vue +356 -356
  919. package/app/components/operations/OperationsFilterCard.vue +164 -164
  920. package/app/components/operations/OperationsPageHead.vue +47 -47
  921. package/app/components/tokens/TokenCreateModal.vue +42 -42
  922. package/app/components/tokens/TokenOnceModal.vue +164 -164
  923. package/app/components/tokens/TokenRenameModal.vue +40 -40
  924. package/app/components/tokens/TokensPageHead.vue +76 -76
  925. package/app/components/workshop/A2aRpcDebugger.vue +237 -237
  926. package/app/components/workshop/AgentInspectorDrawer.vue +424 -424
  927. package/app/components/workshop/AgentLanesView.vue +278 -278
  928. package/app/components/workshop/ArtifactCard.vue +120 -120
  929. package/app/components/workshop/AssetLibrary.vue +452 -452
  930. package/app/components/workshop/ChatMemberPanel.vue +556 -556
  931. package/app/components/workshop/CommandPalette.vue +270 -270
  932. package/app/components/workshop/Composer.vue +540 -540
  933. package/app/components/workshop/DaqTemplateIcon.vue +33 -33
  934. package/app/components/workshop/DeviceTwinPanel.vue +167 -167
  935. package/app/components/workshop/FileSelectorModal.vue +188 -188
  936. package/app/components/workshop/InspectorPanel.vue +301 -301
  937. package/app/components/workshop/PluginSlot.vue +120 -120
  938. package/app/components/workshop/TranscriptTimeline.vue +223 -223
  939. package/app/components/workshop/agents/AgentTemplateEditModal.vue +139 -139
  940. package/app/components/workshop/blocks/ClusterArtifact.vue +61 -61
  941. package/app/components/workshop/blocks/ClusterError.vue +85 -85
  942. package/app/components/workshop/blocks/ClusterLife.vue +87 -87
  943. package/app/components/workshop/blocks/ClusterMember.vue +95 -95
  944. package/app/components/workshop/blocks/ClusterMemory.vue +84 -84
  945. package/app/components/workshop/blocks/ClusterOther.vue +67 -67
  946. package/app/components/workshop/blocks/ClusterStatus.vue +149 -149
  947. package/app/components/workshop/blocks/ClusterTool.vue +176 -176
  948. package/app/components/workshop/blocks/EventBlockAvatar.vue +114 -114
  949. package/app/components/workshop/blocks/EventBlockHead.vue +232 -232
  950. package/app/components/workshop/composer/ComposerToolbar.vue +278 -278
  951. package/app/components/workshop/composer/MentionMenu.vue +135 -135
  952. package/app/components/workshop/composer/ReplyChip.vue +65 -65
  953. package/app/components/workshop/composer/StatusChip.vue +171 -171
  954. package/app/components/workshop/console/Dock.vue +71 -71
  955. package/app/components/workshop/console/LeftPane.vue +84 -84
  956. package/app/components/workshop/device-twin/DeviceTwinCard.vue +265 -265
  957. package/app/components/workshop/device-twin/DeviceTwinDcwSection.vue +203 -203
  958. package/app/components/workshop/lanes/AddMemberModal.vue +270 -270
  959. package/app/components/workshop/lanes/EditMemberModal.vue +106 -106
  960. package/app/components/workshop/lanes/LanesToolbar.vue +97 -97
  961. package/app/components/workshop/session-list/ChannelSettingsModal.vue +112 -1
  962. package/app/components/workshop/session-list/MountChannelModal.vue +124 -124
  963. package/app/components/workshop/session-list/SaveTemplateModal.vue +93 -93
  964. package/app/components/workshop/task-board/Card.vue +172 -172
  965. package/app/components/workshop/task-board/Column.vue +151 -151
  966. package/app/components/workshop/task-board/List.vue +157 -157
  967. package/app/components/workshop/task-board/StatusMenu.vue +88 -88
  968. package/app/components/workshop/teams/TeamAddMemberModal.vue +53 -53
  969. package/app/components/workshop/teams/TeamCreateModal.vue +94 -94
  970. package/app/components/workshop/teams/TeamDeployModal.vue +40 -40
  971. package/app/components/workshop/teams/TeamPluginModal.vue +119 -119
  972. package/app/components/workshop/terminal/OmpTerminalPanel.vue +270 -270
  973. package/app/components/workshop/terminal/TerminalHitlCard.vue +170 -170
  974. package/app/components/workshop/town/TownScene.ts +466 -466
  975. package/app/components/workshop/town/TownView.vue +561 -561
  976. package/app/components/workshop/town/components/AutoModeConfirmModal.vue +94 -94
  977. package/app/components/workshop/town/components/TownAgentBindings.vue +405 -405
  978. package/app/components/workshop/town/components/TownAgentInspector.vue +554 -554
  979. package/app/components/workshop/town/components/TownAlarmList.vue +147 -147
  980. package/app/components/workshop/town/components/TownBoundaryPanel.vue +350 -350
  981. package/app/components/workshop/town/components/TownCalloutLayer.vue +147 -147
  982. package/app/components/workshop/town/components/TownChannelDock.vue +116 -116
  983. package/app/components/workshop/town/components/TownControlDock.vue +405 -405
  984. package/app/components/workshop/town/components/TownDaqNodeInspector.vue +345 -345
  985. package/app/components/workshop/town/components/TownDaqTree.vue +366 -366
  986. package/app/components/workshop/town/components/TownDcwBindSection.vue +473 -473
  987. package/app/components/workshop/town/components/TownDcwNodeInspector.vue +185 -185
  988. package/app/components/workshop/town/components/TownDcwTree.vue +280 -280
  989. package/app/components/workshop/town/components/TownDeviceBindings.vue +394 -394
  990. package/app/components/workshop/town/components/TownDeviceTransform.vue +248 -248
  991. package/app/components/workshop/town/components/TownEventList.vue +120 -120
  992. package/app/components/workshop/town/components/TownHealthBody.vue +100 -100
  993. package/app/components/workshop/town/components/TownKpiStrip.vue +207 -207
  994. package/app/components/workshop/town/components/TownLeftRail.vue +308 -308
  995. package/app/components/workshop/town/components/TownLoadingMask.vue +61 -61
  996. package/app/components/workshop/town/components/TownNavMap.vue +154 -154
  997. package/app/components/workshop/town/components/TownRightRail.vue +543 -543
  998. package/app/components/workshop/town/components/TownStage.vue +281 -281
  999. package/app/components/workshop/town/components/TownStageTop.vue +238 -238
  1000. package/app/components/workshop/town/components/TownStatusBar.vue +108 -108
  1001. package/app/components/workshop/town/components/TownTopNav.vue +367 -367
  1002. package/app/components/workshop/town/components/TownTrendDock.vue +178 -178
  1003. package/app/components/workshop/town/scene/town-scene-agents.ts +254 -254
  1004. package/app/components/workshop/town/scene/town-scene-behavior.ts +194 -194
  1005. package/app/components/workshop/town/scene/town-scene-bubbles.ts +96 -96
  1006. package/app/components/workshop/town/scene/town-scene-core.ts +158 -158
  1007. package/app/components/workshop/town/scene/town-scene-models.ts +109 -109
  1008. package/app/components/workshop/town/scene/town-scene-visuals.ts +279 -279
  1009. package/app/components/workshop/town/scene/town-scene3d-agents.ts +308 -308
  1010. package/app/components/workshop/town/scene/town-scene3d-blocks.ts +297 -297
  1011. package/app/components/workshop/town/scene/town-scene3d-bubbles.ts +281 -281
  1012. package/app/components/workshop/town/scene/town-scene3d-camera.ts +282 -282
  1013. package/app/components/workshop/town/scene/town-scene3d-devices.ts +433 -433
  1014. package/app/components/workshop/town/scene/town-scene3d-editing.ts +490 -490
  1015. package/app/components/workshop/town/scene/town-scene3d-events.ts +173 -173
  1016. package/app/components/workshop/town/scene/town-scene3d-factory.ts +412 -412
  1017. package/app/components/workshop/town/scene/town-scene3d-hud.ts +110 -110
  1018. package/app/components/workshop/town/scene/town-scene3d-lifecycle.ts +144 -144
  1019. package/app/components/workshop/town/scene/town-scene3d-links.ts +141 -141
  1020. package/app/components/workshop/town/scene/town-scene3d-loop.ts +286 -286
  1021. package/app/components/workshop/town/scene/town-scene3d-models.ts +154 -154
  1022. package/app/components/workshop/town/scene/town-scene3d-nodes.ts +562 -562
  1023. package/app/components/workshop/town/scene/town-scene3d-ranges.ts +273 -273
  1024. package/app/components/workshop/town/scene/town-scene3d-renderer.ts +320 -320
  1025. package/app/components/workshop/town/scene/town-scene3d-selection.ts +257 -257
  1026. package/app/components/workshop/town/scene/town-scene3d-types.ts +264 -264
  1027. package/app/components/workshop/transcript/TranscriptBlockList.vue +68 -68
  1028. package/app/components/workshop/transcript/TranscriptEarlierPager.vue +81 -81
  1029. package/app/components/workshop/transcript/TranscriptFilterBar.vue +126 -126
  1030. package/app/components/workshop/workbench/CreateWorkspaceModal.vue +36 -36
  1031. package/app/components/workshop/workbench/WorkspaceEmpty.vue +56 -56
  1032. package/app/composables/useResponsive.ts +88 -88
  1033. package/app/composables/workshop/device-twin-types.ts +29 -29
  1034. package/app/composables/workshop/event-blocks/attention.ts +58 -58
  1035. package/app/composables/workshop/event-blocks/classify.ts +44 -44
  1036. package/app/composables/workshop/event-blocks/clusterer.ts +231 -231
  1037. package/app/composables/workshop/event-blocks/fold-stream.ts +45 -45
  1038. package/app/composables/workshop/event-blocks/markdown.ts +81 -81
  1039. package/app/composables/workshop/event-blocks/mentions.ts +49 -49
  1040. package/app/composables/workshop/event-blocks/text-utils.ts +100 -100
  1041. package/app/composables/workshop/event-blocks/types.ts +40 -40
  1042. package/app/composables/workshop/town/town-relay-props.ts +231 -231
  1043. package/app/composables/workshop/town/town-view-types.ts +145 -145
  1044. package/app/composables/workshop/town/useTownAgentBindings.ts +182 -182
  1045. package/app/composables/workshop/town/useTownAgentChat.ts +203 -203
  1046. package/app/composables/workshop/town/useTownAlarms.ts +36 -36
  1047. package/app/composables/workshop/town/useTownCallouts.ts +174 -174
  1048. package/app/composables/workshop/town/useTownChannels.ts +220 -220
  1049. package/app/composables/workshop/town/useTownHealth.ts +66 -66
  1050. package/app/composables/workshop/town/useTownHudTickers.ts +77 -77
  1051. package/app/composables/workshop/town/useTownLayout.ts +277 -277
  1052. package/app/composables/workshop/town/useTownNavMap.ts +301 -301
  1053. package/app/composables/workshop/town/useTownNodeBindings.ts +345 -345
  1054. package/app/composables/workshop/town/useTownPanelDrag.ts +91 -91
  1055. package/app/composables/workshop/town/useTownRailData.ts +421 -421
  1056. package/app/composables/workshop/town/useTownSceneControl.ts +92 -92
  1057. package/app/composables/workshop/town/useTownSceneInput.ts +275 -275
  1058. package/app/composables/workshop/town/useTownSceneRuntime.ts +390 -390
  1059. package/app/composables/workshop/town/useTownSheets.ts +41 -41
  1060. package/app/composables/workshop/town/useTownTrends.ts +93 -93
  1061. package/app/composables/workshop/useChannelList.ts +88 -88
  1062. package/app/composables/workshop/useChannelTerminals.ts +65 -65
  1063. package/app/composables/workshop/useComposerMentions.ts +130 -130
  1064. package/app/composables/workshop/useDcwStream.ts +374 -374
  1065. package/app/composables/workshop/useDeviceTwinDcwWrite.ts +77 -77
  1066. package/app/composables/workshop/useDeviceTwinPanel.ts +56 -56
  1067. package/app/composables/workshop/useEscClose.ts +44 -44
  1068. package/app/composables/workshop/useEventBlockView.ts +159 -159
  1069. package/app/composables/workshop/useEventBlocks.ts +33 -33
  1070. package/app/composables/workshop/useHitlAnswer.ts +184 -184
  1071. package/app/composables/workshop/useLaneWidths.ts +27 -27
  1072. package/app/composables/workshop/useOmpTerminalSession.ts +424 -424
  1073. package/app/composables/workshop/usePluginAdmin.ts +152 -152
  1074. package/app/composables/workshop/usePluginPanels.ts +72 -72
  1075. package/app/composables/workshop/useRuntimeConfigDraft.ts +118 -118
  1076. package/app/composables/workshop/useSettingsGroups.ts +243 -243
  1077. package/app/composables/workshop/useTaskBoardColumns.ts +47 -47
  1078. package/app/composables/workshop/useTerminalRenderer.ts +308 -308
  1079. package/app/composables/workshop/useTranscriptEnterStage.ts +48 -48
  1080. package/app/composables/workshop/useTranscriptHistory.ts +52 -52
  1081. package/app/composables/workshop/useTranscriptScroll.ts +113 -113
  1082. package/app/composables/workshop/useVisibleInterval.ts +42 -42
  1083. package/app/composables/workshop/useWorkshopApi.ts +6 -0
  1084. package/app/composables/workshop/useWorkshopWs.ts +265 -265
  1085. package/app/config/index.ts +1 -1
  1086. package/app/config/schema.ts +5 -0
  1087. package/app/middleware/locale-cookie.global.ts +22 -22
  1088. package/app/pages/aml/api.ts +6 -6
  1089. package/app/pages/aml/composables/useAmlDatasets.ts +38 -38
  1090. package/app/pages/aml/composables/useAmlEntities.ts +57 -57
  1091. package/app/pages/aml/composables/useAmlEnv.ts +191 -191
  1092. package/app/pages/aml/composables/useAmlExperiments.ts +45 -45
  1093. package/app/pages/aml/composables/useAmlFormat.ts +44 -44
  1094. package/app/pages/aml/composables/useAmlJobs.ts +131 -131
  1095. package/app/pages/aml/composables/useAmlModels.ts +56 -56
  1096. package/app/pages/aml/composables/useAmlNotes.ts +47 -47
  1097. package/app/pages/aml/composables/useAmlPredict.ts +93 -93
  1098. package/app/pages/aml/constants.ts +63 -63
  1099. package/app/pages/aml/index.vue +236 -236
  1100. package/app/pages/composables/useDashboardCharts.ts +192 -192
  1101. package/app/pages/composables/useDashboardData.ts +144 -144
  1102. package/app/pages/daq/composables/useDaqAddNode.ts +126 -126
  1103. package/app/pages/daq/composables/useDaqDetailBinding.ts +29 -29
  1104. package/app/pages/daq/composables/useDaqDetailFrames.ts +42 -42
  1105. package/app/pages/daq/composables/useDaqDetailNode.ts +53 -53
  1106. package/app/pages/daq/composables/useDaqDetailParams.ts +138 -138
  1107. package/app/pages/daq/composables/useDaqFilters.ts +187 -187
  1108. package/app/pages/daq/composables/useDaqNodeWindow.ts +86 -86
  1109. package/app/pages/daq/composables/useDaqOptimizations.ts +99 -99
  1110. package/app/pages/daq/composables/useDaqTemplates.ts +152 -152
  1111. package/app/pages/daq/index.vue +260 -260
  1112. package/app/pages/dcw/composables/useDcwCards.ts +27 -27
  1113. package/app/pages/dcw/composables/useDcwDetailScope.ts +145 -145
  1114. package/app/pages/dcw/composables/useDcwDetailTemplates.ts +94 -94
  1115. package/app/pages/dcw/composables/useDcwFilter.ts +29 -29
  1116. package/app/pages/dcw/composables/useDcwLedger.ts +34 -34
  1117. package/app/pages/dcw/composables/useDcwLineMutations.ts +115 -115
  1118. package/app/pages/dcw/composables/useDcwLineRun.ts +60 -60
  1119. package/app/pages/dcw/composables/useDcwProducts.ts +54 -54
  1120. package/app/pages/dcw/composables/useDcwQuery.ts +68 -68
  1121. package/app/pages/dcw/composables/useDcwQuickActions.ts +47 -47
  1122. package/app/pages/dcw/composables/useDcwRecipes.ts +256 -256
  1123. package/app/pages/dcw/composables/useDcwTemplates.ts +50 -50
  1124. package/app/pages/dcw/index.vue +195 -195
  1125. package/app/pages/dcw/types.ts +9 -9
  1126. package/app/pages/index.vue +126 -126
  1127. package/app/pages/logs/composables/useLogsFormat.ts +43 -43
  1128. package/app/pages/logs/composables/useLogsScope.ts +39 -39
  1129. package/app/pages/monitor/types.ts +61 -61
  1130. package/app/pages/operations.vue +61 -61
  1131. package/app/pages/permissions/index.vue +369 -369
  1132. package/app/pages/studio/board.vue +30 -9
  1133. package/app/pages/studio/index.vue +40 -8
  1134. package/app/pages/studio/pipeline.vue +16 -24
  1135. package/app/pages/tokens/composables/useTokenClipboard.ts +33 -33
  1136. package/app/pages/tokens/composables/useTokenCreate.ts +93 -93
  1137. package/app/pages/tokens/composables/useTokenRename.ts +54 -54
  1138. package/app/pages/tokens/composables/useTokenReveal.ts +84 -84
  1139. package/app/pages/tokens/composables/useTokensList.ts +60 -60
  1140. package/app/pages/tokens.vue +111 -111
  1141. package/app/pages/tools/index.vue +98 -98
  1142. package/app/pages/workshop/agents.vue +130 -130
  1143. package/app/pages/workshop/composables/useAgentHarnessOptions.ts +59 -59
  1144. package/app/pages/workshop/composables/useAgentTemplateActions.ts +42 -42
  1145. package/app/pages/workshop/composables/useAgentTemplateDialogState.ts +24 -24
  1146. package/app/pages/workshop/composables/useAgentTemplateForm.ts +88 -88
  1147. package/app/pages/workshop/composables/useAgentTemplatesCatalog.ts +92 -92
  1148. package/app/pages/workshop/composables/useTeamActions.ts +44 -44
  1149. package/app/pages/workshop/composables/useTeamAddMemberDialog.ts +49 -49
  1150. package/app/pages/workshop/composables/useTeamCreateDialog.ts +67 -67
  1151. package/app/pages/workshop/composables/useTeamDeployDialog.ts +49 -49
  1152. package/app/pages/workshop/composables/useTeamDialogState.ts +46 -46
  1153. package/app/pages/workshop/composables/useTeamPluginDialog.ts +72 -72
  1154. package/app/pages/workshop/composables/useTeamsCatalog.ts +100 -100
  1155. package/app/pages/workshop/composables/useWorkbenchWorkspaces.ts +123 -123
  1156. package/app/pages/workshop/composables/useWorkspaceAuth.ts +31 -31
  1157. package/app/pages/workshop/composables/useWorkspaceChannels.ts +62 -62
  1158. package/app/pages/workshop/composables/useWorkspaceShell.ts +136 -136
  1159. package/app/pages/workshop/schedules.vue +553 -553
  1160. package/app/pages/workshop/w/[wsId].vue +221 -221
  1161. package/app/plugins/aw-plugins.client.ts +213 -213
  1162. package/app/plugins/esc-close.client.ts +31 -31
  1163. package/app/stores/workshop/hitl.ts +183 -183
  1164. package/app/stores/workshop/narrow-fetch.ts +23 -23
  1165. package/app/utils/api-error.ts +75 -75
  1166. package/app/utils/builtin-catalog.ts +104 -104
  1167. package/app/utils/chart-pipeline.ts +50 -1
  1168. package/app/utils/chart-trend.ts +97 -97
  1169. package/app/utils/dcw-driver-badge.ts +16 -16
  1170. package/app/utils/dcw-recipe-form.ts +26 -26
  1171. package/cli/commands/tui.mjs +28 -28
  1172. package/cli/commands/update.mjs +124 -124
  1173. package/cli/core/child-lifecycle.mjs +136 -136
  1174. package/cli/core/meta.mjs +38 -38
  1175. package/cli/core/post-build.mjs +96 -96
  1176. package/docs/cli.en.md +2 -2
  1177. package/docs/cli.md +2 -2
  1178. package/docs/mcp.en.md +27 -27
  1179. package/docs/multi-harness-architecture.md +248 -248
  1180. package/docs/tui.md +43 -43
  1181. package/i18n/dicts/_en.json +1551 -1551
  1182. package/i18n/dicts/_en2.json +300 -300
  1183. package/i18n/dicts/_en4.json +114 -114
  1184. package/i18n/dicts/agentLanesView.json +61 -61
  1185. package/i18n/dicts/appHeader.json +17 -17
  1186. package/i18n/dicts/channelSessionList.json +51 -51
  1187. package/i18n/dicts/chat.json +79 -79
  1188. package/i18n/dicts/clusterTool.json +4 -4
  1189. package/i18n/dicts/composer.json +38 -38
  1190. package/i18n/dicts/ctpl.json +37 -37
  1191. package/i18n/dicts/dcwDetail.json +219 -219
  1192. package/i18n/dicts/lineOps.json +14 -14
  1193. package/i18n/dicts/multiChannelView.json +13 -13
  1194. package/i18n/dicts/notifications.json +13 -13
  1195. package/i18n/dicts/taskInspectorDrawer.json +25 -25
  1196. package/i18n/dicts/teamPlugins.json +10 -10
  1197. package/i18n/dicts/townView.json +209 -209
  1198. package/i18n/locales/en.ts +18 -0
  1199. package/i18n/locales/zh-CN.ts +18 -0
  1200. package/mcp/discovery.mjs +227 -227
  1201. package/package.json +1 -1
  1202. package/public/favicon.svg +14 -14
  1203. package/public/robots.txt +3 -3
  1204. package/scripts/_audit/_detached-mes-20261028.mjs +48 -0
  1205. package/scripts/_audit/_detached-nodesim-20261028.mjs +50 -0
  1206. package/scripts/_audit/_detached-sim-20261028.mjs +44 -0
  1207. package/scripts/_audit/_live-execmodes-20261028.mjs +246 -0
  1208. package/scripts/_audit/_live-execmodes-invoke-20261028.mjs +203 -0
  1209. package/scripts/_audit/_mission-coupling-probe-20261028.mjs +27 -0
  1210. package/scripts/_audit/_mission-f1-evidence-20261028.mjs +56 -0
  1211. package/scripts/_audit/_mission-idd-remint-20261028.mjs +32 -0
  1212. package/scripts/_audit/_mission-ui-shots-20261028.mjs +56 -0
  1213. package/scripts/_audit/_mission-us10-timeline-20261028.mjs +65 -0
  1214. package/scripts/_audit/_mission-us12-tools-20261028.mjs +85 -0
  1215. package/scripts/_audit/_mission-us4-daq-dcw-20261028.mjs +115 -0
  1216. package/scripts/_audit/_mission-us5-mes-20261028.mjs +142 -0
  1217. package/scripts/_audit/_mission-us6-dialog-20261028.mjs +43 -0
  1218. package/scripts/_audit/_mission-us7-diag-20261028.mjs +42 -0
  1219. package/scripts/_audit/_mission-us7-final-20261028.mjs +79 -0
  1220. package/scripts/_audit/_mission-us7-idd-rag-20261028.mjs +147 -0
  1221. package/scripts/_audit/audit-harness-adapters.md +664 -664
  1222. package/scripts/_audit/aw-mcp-live-e2e.mjs +293 -293
  1223. package/scripts/_audit/bump-version.mjs +51 -51
  1224. package/scripts/_audit/detached-instance.mjs +112 -112
  1225. package/scripts/_audit/detached-start.mjs +103 -103
  1226. package/scripts/_audit/eda-ui-fix-acceptance.mjs +212 -212
  1227. package/scripts/_audit/guard-upstream-liveness.mjs +104 -104
  1228. package/scripts/_audit/http-api-authz-audit.md +657 -657
  1229. package/scripts/_audit/kb-team-mock-e2e.mjs +146 -146
  1230. package/scripts/_audit/kb-team-omp-e2e.mjs +229 -229
  1231. package/scripts/_audit/run.mjs +21 -21
  1232. package/scripts/_audit/runtime-audit.md +716 -716
  1233. package/scripts/_audit/skills-guided-e2e.mjs +316 -316
  1234. package/scripts/_audit/stability-soak.mjs +252 -252
  1235. package/scripts/_audit/stubs/nuxt-imports.mjs +67 -67
  1236. package/scripts/_audit/ts-register-hook.mjs +12 -12
  1237. package/scripts/_audit/ts-resolve-hook.mjs +96 -96
  1238. package/scripts/_aw0746-stage12.mjs +94 -94
  1239. package/scripts/_aw0746-stage34.mjs +136 -136
  1240. package/scripts/_aw0746-stage6b-train-sweep.mjs +145 -145
  1241. package/scripts/_aw0746-stage6c-jobsmoke.mjs +69 -69
  1242. package/scripts/_dbg-configroot-audit.mjs +86 -86
  1243. package/scripts/_dbg-daq-intervals-func.mjs +115 -115
  1244. package/scripts/_dbg-perms-e2e.mjs +142 -142
  1245. package/scripts/_dbg-protocol-matrix.mjs +462 -462
  1246. package/scripts/_dbg-render-regression.mjs +193 -193
  1247. package/scripts/_dbg-schedule-e2e.mjs +262 -262
  1248. package/scripts/_e2e-ui-functional.mjs +371 -371
  1249. package/scripts/_lib-aml-python-run.mjs +17 -17
  1250. package/scripts/_plc-sim-detached.cjs +22 -22
  1251. package/scripts/_provision-injection-line.mjs +39 -39
  1252. package/scripts/_run-matrix.ps1 +53 -53
  1253. package/scripts/_sweep-button-contrast.mjs +87 -87
  1254. package/scripts/acceptance-aml-hybrid-e2e.ts +396 -396
  1255. package/scripts/acceptance-aml-hybrid-live.mjs +93 -93
  1256. package/scripts/acceptance-aml-model-identity.ts +137 -137
  1257. package/scripts/agent-daq-isolation-e2e.mjs +91 -91
  1258. package/scripts/api-contract-smoke.mjs +126 -126
  1259. package/scripts/ask-hitl-e2e.mjs +96 -96
  1260. package/scripts/aw-expose.mjs +159 -159
  1261. package/scripts/channel-interaction-smoke.mjs +80 -80
  1262. package/scripts/data-studio-ui-e2e.mjs +163 -163
  1263. package/scripts/demo-group-chat-all-real.ts +279 -279
  1264. package/scripts/dev-modbus-simulator.mjs +55 -55
  1265. package/scripts/docs-shots.mjs +36 -36
  1266. package/scripts/e2e-agentteam-chat.mjs +473 -473
  1267. package/scripts/e2e-agentteam-real-triage.mjs +421 -421
  1268. package/scripts/e2e-aml-decoupled.mjs +162 -162
  1269. package/scripts/e2e-aw-tui-global.mjs +277 -277
  1270. package/scripts/e2e-closedloop/cleanup.mjs +27 -27
  1271. package/scripts/e2e-closedloop/lib.mjs +109 -109
  1272. package/scripts/e2e-closedloop/main.mjs +59 -59
  1273. package/scripts/e2e-closedloop/scenarios-accounts.mjs +210 -210
  1274. package/scripts/e2e-closedloop/scenarios-authz.mjs +196 -196
  1275. package/scripts/e2e-closedloop/scenarios-daq-dcw.mjs +222 -222
  1276. package/scripts/e2e-closedloop/scenarios-plugins.mjs +169 -169
  1277. package/scripts/e2e-closedloop/state.mjs +10 -10
  1278. package/scripts/e2e-config-groups.mjs +238 -238
  1279. package/scripts/e2e-crash-cycle.mjs +108 -108
  1280. package/scripts/e2e-direct-rest-simulator-paper.mjs +624 -0
  1281. package/scripts/e2e-eda-pipeline.mjs +23 -2
  1282. package/scripts/e2e-execution-modes.mjs +290 -0
  1283. package/scripts/e2e-full-closedloop.mjs +16 -16
  1284. package/scripts/e2e-hil-multi-user.mjs +307 -307
  1285. package/scripts/e2e-hil-restart.mjs +339 -339
  1286. package/scripts/e2e-injection-recipe-closedloop.mjs +1 -1
  1287. package/scripts/e2e-line-governance.mjs +352 -352
  1288. package/scripts/e2e-mqtt-protocol.mjs +945 -0
  1289. package/scripts/e2e-ontology.mjs +393 -393
  1290. package/scripts/e2e-pi-simulator-paper.mjs +2317 -0
  1291. package/scripts/e2e-plc-plugin-closedloop.mjs +549 -549
  1292. package/scripts/e2e-registered-harness-simulator-paper.mjs +1926 -0
  1293. package/scripts/e2e-simulator-optimizer-paper.mjs +264 -0
  1294. package/scripts/fixtures/omp-paper-harness.mjs +163 -0
  1295. package/scripts/full-stack-shots.mjs +145 -145
  1296. package/scripts/full-tool-injection-harness-e2e.mjs +214 -214
  1297. package/scripts/hitl-reject-e2e.mjs +131 -131
  1298. package/scripts/line-log-smoke.mjs +260 -260
  1299. package/scripts/live-aml-mockomp.mjs +304 -304
  1300. package/scripts/live-aml-optloop-resume.mjs +322 -322
  1301. package/scripts/live-aml-optloop.mjs +588 -588
  1302. package/scripts/live-aml-stage9.mjs +169 -169
  1303. package/scripts/live-aml-two-goals.mjs +315 -315
  1304. package/scripts/live-optloop-two-modes.mjs +857 -857
  1305. package/scripts/mes-agent-integration-e2e.mjs +361 -361
  1306. package/scripts/ops-plugins-e2e.mjs +85 -85
  1307. package/scripts/scenario-suite-setup.mjs +337 -337
  1308. package/scripts/scenario-suite-stability.mjs +144 -144
  1309. package/scripts/team-coordination-e2e.mjs +96 -96
  1310. package/scripts/test-agentteam-workflow.ts +472 -472
  1311. package/scripts/test-aw-skills.mjs +102 -102
  1312. package/scripts/test-daq-frame-race.mjs +358 -358
  1313. package/scripts/test-data-root.mjs +208 -208
  1314. package/scripts/test-events-index.mjs +176 -176
  1315. package/scripts/test-group-chat-unit/lib.ts +186 -186
  1316. package/scripts/test-group-chat-unit/main.ts +45 -45
  1317. package/scripts/test-group-chat-unit.ts +35 -35
  1318. package/scripts/test-hitl-decision.ts +526 -526
  1319. package/scripts/test-hitl-registry.ts +112 -112
  1320. package/scripts/test-log-flooding.mjs +160 -160
  1321. package/scripts/test-lru.mjs +101 -101
  1322. package/scripts/test-plugin-hardening.mjs +90 -90
  1323. package/scripts/test-plugin-lifecycle.mjs +173 -173
  1324. package/scripts/test-rollback-index.mjs +137 -137
  1325. package/scripts/test-schedule-runtime.ts +309 -309
  1326. package/scripts/test-sdk-surface.mjs +158 -158
  1327. package/scripts/test-serial-bridge.mjs +418 -418
  1328. package/scripts/test-tui-commands.mjs +148 -148
  1329. package/scripts/test-tui-reducers.mjs +72 -72
  1330. package/scripts/three-system-e2e/lib.mjs +79 -79
  1331. package/scripts/three-system-e2e/main.mjs +40 -40
  1332. package/scripts/three-system-e2e/phases/phase-0-user-token.mjs +42 -42
  1333. package/scripts/three-system-e2e/phases/phase-0a2-line-autoselect.mjs +35 -35
  1334. package/scripts/three-system-e2e/phases/phase-0b-fixture-grants.mjs +39 -39
  1335. package/scripts/three-system-e2e/phases/phase-0c-plugin-outbound-auth.mjs +95 -95
  1336. package/scripts/three-system-e2e/phases/stage-1-health.mjs +47 -47
  1337. package/scripts/three-system-e2e/phases/stage-2-5-team-plugins.mjs +84 -84
  1338. package/scripts/three-system-e2e/phases/stage-2-teams-tools-hitl.mjs +184 -184
  1339. package/scripts/three-system-e2e/phases/stage-3-diag.mjs +73 -73
  1340. package/scripts/three-system-e2e/phases/stage-4-plugin-toggle.mjs +53 -53
  1341. package/scripts/three-system-e2e/state.mjs +87 -87
  1342. package/scripts/three-system-e2e.mjs +40 -40
  1343. package/scripts/tool-face-batch-identity-e2e.mjs +222 -222
  1344. package/scripts/tsconfig.json +14 -14
  1345. package/scripts/tui-smoke.mjs +100 -100
  1346. package/scripts/typecheck.mjs +75 -75
  1347. package/scripts/ui/md-lint.mjs +80 -80
  1348. package/scripts/ui/readme-assets.mjs +30 -30
  1349. package/scripts/ui/readme-shots.mjs +42 -42
  1350. package/scripts/ui/record-demo.mjs +557 -557
  1351. package/scripts/ui/record.mjs +225 -225
  1352. package/scripts/ui/seed-admin.mjs +68 -68
  1353. package/scripts/ui/seed-demo.mjs +83 -83
  1354. package/scripts/ui/seed-industrial-demo.mjs +171 -171
  1355. package/scripts/ui/shot-hero.mjs +25 -25
  1356. package/scripts/ui/shots.mjs +75 -75
  1357. package/scripts/ui/verify-nav.mjs +51 -51
  1358. package/scripts/ui/verify-responsive.mjs +285 -285
  1359. package/sdk/client.d.mts +110 -110
  1360. package/sdk/examples/line-sentinel/index.mjs +105 -105
  1361. package/sdk/examples/ops-notifier/index.mjs +34 -34
  1362. package/sdk/examples/sample-insight/index.mjs +39 -39
  1363. package/server/.mimosa/hook-state/sess_869e5bfd-07f4-4b6e-a991-6221fcf6b7d2.json +1 -0
  1364. package/server/.mimosa/hook-state/sess_869e5bfd-07f4-4b6e-a991-6221fcf6b7d2.mvhn1irp-99488-e3fdc1cbfc.baseline/942d2679b87b96c612b4f2a425c3ccc5b6f3234f0cf589a8441602f866fbe277.source +41 -0
  1365. package/server/.mimosa/hook-state/sess_869e5bfd-07f4-4b6e-a991-6221fcf6b7d2.mvhn1irp-99488-e3fdc1cbfc.baseline/dd617a82339d2c61e49e28e416aabeb2fc100fb3cb1beca18d02dfb833214af6.source +51 -0
  1366. package/server/.mimosa/hook-status/sess_869e5bfd-07f4-4b6e-a991-6221fcf6b7d2-e67b6b91bf.json +14 -0
  1367. package/server/api/plugins/client/[name].get.ts +18 -18
  1368. package/server/api/plugins/i18n.get.ts +12 -12
  1369. package/server/api/plugins/manifest.get.ts +10 -10
  1370. package/server/api/system/backup/list.get.ts +32 -32
  1371. package/server/api/system/backup/run.post.ts +21 -21
  1372. package/server/api/system/config-groups/[id].delete.ts +21 -21
  1373. package/server/api/system/config-groups/[id].patch.ts +26 -26
  1374. package/server/api/system/config-groups/index.get.ts +21 -21
  1375. package/server/api/system/config-groups/index.post.ts +33 -33
  1376. package/server/api/system/timezone.get.ts +20 -20
  1377. package/server/api/users/tokens/[id]/token.get.ts +11 -11
  1378. package/server/api/workshop/[...path].ts +13 -13
  1379. package/server/api/workshop/agent-tools/approvals/index.get.ts +43 -43
  1380. package/server/api/workshop/agent-tools/bindings/[id].delete.ts +26 -26
  1381. package/server/api/workshop/agent-tools/bindings/grant.post.ts +45 -45
  1382. package/server/api/workshop/agent-tools/bindings/index.get.ts +41 -41
  1383. package/server/api/workshop/agent-tools/bindings/revoke.post.ts +42 -42
  1384. package/server/api/workshop/aml/datasets/[id]/preview.get.ts +68 -68
  1385. package/server/api/workshop/aml/datasets/[id].delete.ts +39 -39
  1386. package/server/api/workshop/aml/datasets/[id].get.ts +53 -53
  1387. package/server/api/workshop/aml/datasets/[id].patch.ts +30 -30
  1388. package/server/api/workshop/aml/datasets/index.get.ts +20 -20
  1389. package/server/api/workshop/aml/datasets/index.post.ts +27 -27
  1390. package/server/api/workshop/aml/entities/index.get.ts +13 -13
  1391. package/server/api/workshop/aml/entities/prune.post.ts +28 -28
  1392. package/server/api/workshop/aml/env/index.get.ts +13 -13
  1393. package/server/api/workshop/aml/env/recheck.post.ts +14 -14
  1394. package/server/api/workshop/aml/env/uv.post.ts +21 -21
  1395. package/server/api/workshop/aml/env/venv.post.ts +24 -24
  1396. package/server/api/workshop/aml/experiments/index.get.ts +35 -35
  1397. package/server/api/workshop/aml/index.get.ts +37 -37
  1398. package/server/api/workshop/aml/jobs/[id]/cancel.post.ts +21 -21
  1399. package/server/api/workshop/aml/jobs/[id]/logs.get.ts +23 -23
  1400. package/server/api/workshop/aml/jobs/[id]/retry.post.ts +20 -20
  1401. package/server/api/workshop/aml/jobs/[id].delete.ts +44 -44
  1402. package/server/api/workshop/aml/jobs/[id].get.ts +23 -23
  1403. package/server/api/workshop/aml/jobs/index.get.ts +26 -26
  1404. package/server/api/workshop/aml/models/[id]/predict.post.ts +24 -24
  1405. package/server/api/workshop/aml/models/[id]/promote.post.ts +30 -30
  1406. package/server/api/workshop/aml/models/index.get.ts +48 -48
  1407. package/server/api/workshop/aml/training-plans/[id]/train.post.ts +18 -18
  1408. package/server/api/workshop/aml/training-plans/[id].delete.ts +18 -18
  1409. package/server/api/workshop/aml/training-plans/[id].patch.ts +30 -30
  1410. package/server/api/workshop/aml/training-plans/index.get.ts +9 -9
  1411. package/server/api/workshop/aml/training-plans/index.post.ts +43 -43
  1412. package/server/api/workshop/analysis/index.post.ts +54 -54
  1413. package/server/api/workshop/approvals/[id]/decide.post.ts +30 -30
  1414. package/server/api/workshop/approvals/index.get.ts +22 -22
  1415. package/server/api/workshop/audit.get.ts +43 -43
  1416. package/server/api/workshop/channels/[id]/chat/messages/[messageId]/read.post.ts +22 -22
  1417. package/server/api/workshop/channels/[id]/chat/messages/index.get.ts +29 -29
  1418. package/server/api/workshop/channels/[id]/chat/messages/index.post.ts +51 -51
  1419. package/server/api/workshop/channels/[id]/chat/permissions.get.ts +35 -35
  1420. package/server/api/workshop/channels/[id]/execution-mode.patch.ts +94 -0
  1421. package/server/api/workshop/channels/[id]/index.patch.ts +64 -64
  1422. package/server/api/workshop/channels/[id]/members/[userId]/approve.post.ts +20 -20
  1423. package/server/api/workshop/channels/[id]/members/[userId].delete.ts +21 -21
  1424. package/server/api/workshop/channels/[id]/members/index.get.ts +23 -23
  1425. package/server/api/workshop/channels/[id]/members/leave.post.ts +20 -20
  1426. package/server/api/workshop/channels/[id]/twin-profile.get.ts +45 -45
  1427. package/server/api/workshop/channels/[id]/twin-profile.patch.ts +72 -72
  1428. package/server/api/workshop/daq/[id]/frames/content.get.ts +3 -0
  1429. package/server/api/workshop/daq/[id]/ingest.post.ts +5 -0
  1430. package/server/api/workshop/daq/[id]/test.post.ts +1 -1
  1431. package/server/api/workshop/daq/alarms.get.ts +16 -16
  1432. package/server/api/workshop/dcw/[id]/write.post.ts +4 -4
  1433. package/server/api/workshop/dcw/[id].delete.ts +41 -41
  1434. package/server/api/workshop/dcw/[id].patch.ts +40 -40
  1435. package/server/api/workshop/dcw/mes-hook-test.post.ts +5 -3
  1436. package/server/api/workshop/dcw/mes-test-read.post.ts +24 -24
  1437. package/server/api/workshop/dcw/params/[id]/read.post.ts +17 -17
  1438. package/server/api/workshop/dcw/params/[id]/write.post.ts +21 -21
  1439. package/server/api/workshop/dcw/params/[id].delete.ts +19 -19
  1440. package/server/api/workshop/dcw/params/[id].patch.ts +23 -23
  1441. package/server/api/workshop/dcw/params/index.get.ts +27 -27
  1442. package/server/api/workshop/dcw/params/index.post.ts +25 -25
  1443. package/server/api/workshop/dcw/products/[id].delete.ts +6 -2
  1444. package/server/api/workshop/dcw/products/[id].patch.ts +8 -2
  1445. package/server/api/workshop/dcw/recipes/[id]/index.patch.ts +6 -1
  1446. package/server/api/workshop/dcw/recipes/[id]/versions.get.ts +14 -14
  1447. package/server/api/workshop/dcw/recipes/[id].delete.ts +25 -25
  1448. package/server/api/workshop/dcw/recipes/index.get.ts +12 -12
  1449. package/server/api/workshop/dcw/runs/[id]/close.post.ts +15 -15
  1450. package/server/api/workshop/dcw/templates/[key].delete.ts +14 -14
  1451. package/server/api/workshop/dcw/templates/[key].patch.ts +16 -16
  1452. package/server/api/workshop/dcw/templates/index.post.ts +15 -15
  1453. package/server/api/workshop/dcw/test-driver.post.ts +16 -16
  1454. package/server/api/workshop/device-twins/[id].delete.ts +25 -25
  1455. package/server/api/workshop/eda/runs/[id]/labels.patch.ts +25 -25
  1456. package/server/api/workshop/eda/templates/[id].delete.ts +14 -14
  1457. package/server/api/workshop/eda/templates/[id].get.ts +15 -15
  1458. package/server/api/workshop/eda/templates/[id].patch.ts +20 -20
  1459. package/server/api/workshop/eda/templates/index.get.ts +11 -11
  1460. package/server/api/workshop/eda/templates/index.post.ts +20 -20
  1461. package/server/api/workshop/exp/confirmations/[id]/decide.post.ts +41 -41
  1462. package/server/api/workshop/exp/confirmations/index.get.ts +25 -25
  1463. package/server/api/workshop/harnesses/[id]/providers.get.ts +16 -16
  1464. package/server/api/workshop/hitl/respond.post.ts +94 -94
  1465. package/server/api/workshop/mes/secrets/[ref].delete.ts +31 -0
  1466. package/server/api/workshop/mes/secrets/index.get.ts +13 -0
  1467. package/server/api/workshop/mes/secrets/index.put.ts +39 -0
  1468. package/server/api/workshop/notifications/index.get.ts +60 -60
  1469. package/server/api/workshop/notifications/read.post.ts +31 -31
  1470. package/server/api/workshop/ontology/drafts/[draftId]/subgraph.ts +24 -24
  1471. package/server/api/workshop/plugins/[name]/disable.post.ts +21 -21
  1472. package/server/api/workshop/plugins/[name]/enable.post.ts +21 -21
  1473. package/server/api/workshop/plugins/[name]/index.get.ts +14 -14
  1474. package/server/api/workshop/schedules/[id]/run.post.ts +15 -15
  1475. package/server/api/workshop/schedules/[id]/runs.get.ts +15 -15
  1476. package/server/api/workshop/schedules/[id].delete.ts +14 -14
  1477. package/server/api/workshop/schedules/[id].get.ts +13 -13
  1478. package/server/api/workshop/schedules/[id].patch.ts +29 -29
  1479. package/server/api/workshop/schedules/index.get.ts +12 -12
  1480. package/server/api/workshop/schedules/index.post.ts +32 -32
  1481. package/server/api/workshop/tasks/[id]/reassign.post.ts +32 -32
  1482. package/server/api/workshop/tasks/[id]/update.post.ts +35 -35
  1483. package/server/api/workshop/teams/[id]/plugins/index.get.ts +36 -36
  1484. package/server/api/workshop/teams/[id]/plugins/index.put.ts +42 -42
  1485. package/server/api/workshop/ws/audience.ts +56 -56
  1486. package/server/api/workshop/ws/db-buffer.ts +68 -68
  1487. package/server/api/workshop/ws/event-mapping.ts +47 -47
  1488. package/server/api/workshop/ws/handlers.ts +132 -132
  1489. package/server/api/workshop/ws/hub.ts +133 -133
  1490. package/server/api/workshop/ws/index.ts +23 -23
  1491. package/server/api/workshop/ws/notification-uplink.ts +77 -77
  1492. package/server/api/workshop/ws/shared.ts +94 -94
  1493. package/server/api/workshop/ws/streams.ts +146 -146
  1494. package/server/middleware/00-security-headers.ts +38 -38
  1495. package/server/middleware/01-rate-guard.ts +101 -101
  1496. package/server/plugins/aml-twin-worker.ts +32 -32
  1497. package/server/plugins/dev-stability-guard.ts +42 -42
  1498. package/server/plugins-builtin/diag-bridge/host/constants.mjs +25 -25
  1499. package/server/plugins-builtin/diag-bridge/host/exports.mjs +104 -104
  1500. package/server/plugins-builtin/diag-bridge/host/index.mjs +15 -15
  1501. package/server/plugins-builtin/diag-bridge/host/intents.mjs +62 -62
  1502. package/server/plugins-builtin/diag-bridge/host/snapshot.mjs +93 -93
  1503. package/server/plugins-builtin/diag-bridge/index.mjs +9 -9
  1504. package/server/plugins-builtin/serial-bridge/client.mjs +211 -211
  1505. package/server/plugins-builtin/serial-bridge/drivers.mjs +409 -409
  1506. package/server/plugins-builtin/serial-bridge/i18n.json +62 -62
  1507. package/server/plugins-builtin/serial-bridge/index.mjs +247 -247
  1508. package/server/plugins-builtin/serial-bridge/lib.mjs +208 -208
  1509. package/server/plugins-builtin/serial-bridge/rtu.mjs +168 -168
  1510. package/server/services/system-config/contracts.ts +29 -29
  1511. package/server/services/system-config/dispose.ts +19 -19
  1512. package/server/services/system-config/facade.ts +26 -26
  1513. package/server/services/system-config/groups.ts +108 -108
  1514. package/server/services/system-config/index.ts +21 -21
  1515. package/server/services/system-config/init.ts +26 -26
  1516. package/server/services/system-config/mutate.ts +103 -103
  1517. package/server/services/system-config/plugins.ts +104 -104
  1518. package/server/services/system-config/snapshot.ts +59 -59
  1519. package/server/services/system-config/state.ts +79 -79
  1520. package/server/services/system-config/types.ts +58 -58
  1521. package/server/services/workshop/.mimosa/hook-state/sess_fed429fb-c8b7-4a50-bbd6-45afc580893f.json +1 -0
  1522. package/server/services/workshop/.mimosa/hook-status/sess_fed429fb-c8b7-4a50-bbd6-45afc580893f-e6b75bbfe6.json +14 -0
  1523. package/server/services/workshop/agents/adapters/omp-rpc-client/api.ts +111 -111
  1524. package/server/services/workshop/agents/adapters/omp-rpc-client/contracts.ts +22 -22
  1525. package/server/services/workshop/agents/adapters/omp-rpc-client/facade.ts +7 -7
  1526. package/server/services/workshop/agents/adapters/omp-rpc-client/frames.ts +18 -0
  1527. package/server/services/workshop/agents/adapters/omp-rpc-client/helpers.ts +38 -38
  1528. package/server/services/workshop/agents/adapters/omp-rpc-client/index.ts +25 -25
  1529. package/server/services/workshop/agents/adapters/omp-rpc-client/start.ts +70 -70
  1530. package/server/services/workshop/agents/adapters/omp-rpc-client/state.ts +65 -65
  1531. package/server/services/workshop/agents/adapters/omp-rpc-client/stdout.ts +92 -92
  1532. package/server/services/workshop/agents/adapters/omp-rpc-client/usage.ts +47 -47
  1533. package/server/services/workshop/agents/agent-badge.ts +38 -38
  1534. package/server/services/workshop/agents/binding-authz.ts +60 -60
  1535. package/server/services/workshop/agents/binding-mode.ts +51 -51
  1536. package/server/services/workshop/agents/codex-agent/client.ts +170 -170
  1537. package/server/services/workshop/agents/codex-agent/core.ts +119 -119
  1538. package/server/services/workshop/agents/codex-agent/facade.ts +8 -8
  1539. package/server/services/workshop/agents/codex-agent/helpers.ts +13 -13
  1540. package/server/services/workshop/agents/codex-agent/hitl.ts +138 -138
  1541. package/server/services/workshop/agents/codex-agent/index.ts +14 -14
  1542. package/server/services/workshop/agents/codex-agent/turn.ts +367 -367
  1543. package/server/services/workshop/agents/codex-agent/types.ts +42 -42
  1544. package/server/services/workshop/agents/execution-mode.ts +90 -0
  1545. package/server/services/workshop/agents/harness-process.ts +3 -3
  1546. package/server/services/workshop/agents/harness-terminal/api.ts +197 -197
  1547. package/server/services/workshop/agents/harness-terminal/index.ts +17 -17
  1548. package/server/services/workshop/agents/harness-terminal/io.ts +120 -120
  1549. package/server/services/workshop/agents/harness-terminal/park.ts +55 -55
  1550. package/server/services/workshop/agents/harness-terminal/sanitize.ts +98 -98
  1551. package/server/services/workshop/agents/harness-terminal/session.ts +124 -124
  1552. package/server/services/workshop/agents/harness-terminal/shared.ts +74 -74
  1553. package/server/services/workshop/agents/hitl-capabilities.ts +312 -312
  1554. package/server/services/workshop/agents/hitl-decision/answers.ts +32 -32
  1555. package/server/services/workshop/agents/hitl-decision/decide.ts +268 -268
  1556. package/server/services/workshop/agents/hitl-decision/payload.ts +45 -45
  1557. package/server/services/workshop/agents/hitl-decision/shared.ts +108 -108
  1558. package/server/services/workshop/agents/hitl-decision/visibility.ts +94 -94
  1559. package/server/services/workshop/agents/host-tool-bridge/catalog.ts +42 -13
  1560. package/server/services/workshop/agents/host-tool-bridge/dispatch.ts +16 -0
  1561. package/server/services/workshop/agents/host-tool-bridge/per-agent.ts +10 -8
  1562. package/server/services/workshop/agents/host-tool-bridge/tools/progress.ts +84 -84
  1563. package/server/services/workshop/agents/host-tool-bridge/tools/team-delegation.ts +104 -104
  1564. package/server/services/workshop/agents/host-tool-bridge/tools/team.ts +70 -70
  1565. package/server/services/workshop/agents/industrial/aml-activity.ts +131 -131
  1566. package/server/services/workshop/agents/industrial/audit-query.ts +66 -66
  1567. package/server/services/workshop/agents/industrial/daq-export.ts +9 -8
  1568. package/server/services/workshop/agents/industrial/daq-tools.ts +43 -6
  1569. package/server/services/workshop/agents/industrial/dcw-tools.ts +22 -4
  1570. package/server/services/workshop/agents/industrial/exp-tools.ts +104 -104
  1571. package/server/services/workshop/agents/industrial/grant-guard.ts +52 -9
  1572. package/server/services/workshop/agents/industrial/ops-tools.ts +54 -16
  1573. package/server/services/workshop/agents/industrial/param-tools.ts +69 -69
  1574. package/server/services/workshop/agents/industrial/recipe-gate.ts +25 -7
  1575. package/server/services/workshop/agents/industrial/recipe-propose-tools.ts +1 -1
  1576. package/server/services/workshop/agents/industrial-context.ts +160 -83
  1577. package/server/services/workshop/agents/node-bindings.repo.ts +207 -207
  1578. package/server/services/workshop/agents/node-delegation.ts +159 -159
  1579. package/server/services/workshop/agents/omp-agent/core.ts +146 -146
  1580. package/server/services/workshop/agents/omp-agent/facade.ts +8 -8
  1581. package/server/services/workshop/agents/omp-agent/helpers.ts +37 -37
  1582. package/server/services/workshop/agents/omp-agent/index.ts +16 -16
  1583. package/server/services/workshop/agents/omp-agent/supervision-history.ts +38 -0
  1584. package/server/services/workshop/agents/omp-agent/tools-steer.ts +18 -1
  1585. package/server/services/workshop/agents/omp-agent/types.ts +45 -45
  1586. package/server/services/workshop/agents/opencode-agent/core.ts +77 -77
  1587. package/server/services/workshop/agents/opencode-agent/facade.ts +8 -8
  1588. package/server/services/workshop/agents/opencode-agent/helpers.ts +29 -29
  1589. package/server/services/workshop/agents/opencode-agent/hitl.ts +113 -113
  1590. package/server/services/workshop/agents/opencode-agent/index.ts +16 -16
  1591. package/server/services/workshop/agents/opencode-agent/lifecycle.ts +44 -44
  1592. package/server/services/workshop/agents/opencode-agent/server.ts +244 -244
  1593. package/server/services/workshop/agents/opencode-agent/turn.ts +278 -278
  1594. package/server/services/workshop/agents/opencode-agent/types.ts +54 -54
  1595. package/server/services/workshop/agents/prompt-i18n.ts +67 -0
  1596. package/server/services/workshop/agents/tool-classes.ts +44 -44
  1597. package/server/services/workshop/aml/clean.ts +120 -120
  1598. package/server/services/workshop/aml/entity.ts +367 -367
  1599. package/server/services/workshop/aml/job-orchestrator/broadcast.ts +37 -37
  1600. package/server/services/workshop/aml/job-orchestrator/control.ts +94 -94
  1601. package/server/services/workshop/aml/job-orchestrator/failure.ts +96 -96
  1602. package/server/services/workshop/aml/job-orchestrator/index.ts +22 -22
  1603. package/server/services/workshop/aml/job-orchestrator/process.ts +101 -101
  1604. package/server/services/workshop/aml/job-orchestrator/shared.ts +53 -53
  1605. package/server/services/workshop/aml/job-orchestrator/status.ts +20 -20
  1606. package/server/services/workshop/aml/job-orchestrator/tick.ts +37 -37
  1607. package/server/services/workshop/aml/python/__pycache__/aml_eval.cpython-312.pyc +0 -0
  1608. package/server/services/workshop/aml/python/__pycache__/amlkit.cpython-312.pyc +0 -0
  1609. package/server/services/workshop/aml/python/__pycache__/train-example.cpython-312.pyc +0 -0
  1610. package/server/services/workshop/aml/python/__pycache__/train-hybrid-example.cpython-312.pyc +0 -0
  1611. package/server/services/workshop/aml/python/train-example.py +92 -92
  1612. package/server/services/workshop/aml/runtime.ts +137 -137
  1613. package/server/services/workshop/aml/stats.ts +140 -140
  1614. package/server/services/workshop/aml/twin/calibration-worker.ts +150 -150
  1615. package/server/services/workshop/aml/twin/channel-profile.ts +12 -8
  1616. package/server/services/workshop/aml/twin/model-backed-provider.ts +332 -332
  1617. package/server/services/workshop/aml/twin/physics-spec-draft.ts +185 -185
  1618. package/server/services/workshop/aml/twin/prompt-composer.ts +143 -143
  1619. package/server/services/workshop/aml/twin/training-plans.ts +260 -260
  1620. package/server/services/workshop/aml/twin/write-guard.ts +19 -19
  1621. package/server/services/workshop/assets/character-asset.repo.ts +1 -1
  1622. package/server/services/workshop/assets/device-twin.repo.ts +1 -1
  1623. package/server/services/workshop/daq/bus/index.ts +12 -5
  1624. package/server/services/workshop/daq/daq-controller/contracts.ts +39 -39
  1625. package/server/services/workshop/daq/daq-controller/driver-probe.ts +7 -4
  1626. package/server/services/workshop/daq/daq-controller/facade.ts +28 -28
  1627. package/server/services/workshop/daq/daq-controller/frames.ts +137 -137
  1628. package/server/services/workshop/daq/daq-controller/helpers.ts +52 -52
  1629. package/server/services/workshop/daq/daq-controller/index.ts +22 -22
  1630. package/server/services/workshop/daq/daq-controller/ingest.ts +9 -10
  1631. package/server/services/workshop/daq/daq-controller/push.ts +336 -0
  1632. package/server/services/workshop/daq/daq-controller/runtime-control.ts +2 -0
  1633. package/server/services/workshop/daq/daq-controller/state.ts +11 -3
  1634. package/server/services/workshop/daq/daq-controller/sweep-alarms.ts +10 -2
  1635. package/server/services/workshop/daq/daq-controller/tsdb-row.ts +48 -0
  1636. package/server/services/workshop/daq/daq-controller/tsdb-twin.ts +4 -1
  1637. package/server/services/workshop/daq/daq-controller/views.ts +5 -2
  1638. package/server/services/workshop/daq/decoders.ts +77 -0
  1639. package/server/services/workshop/daq/drivers/http.ts +33 -6
  1640. package/server/services/workshop/daq/drivers/index.ts +3 -3
  1641. package/server/services/workshop/daq/drivers/mock.ts +130 -130
  1642. package/server/services/workshop/daq/drivers/modbus-rtu.ts +67 -67
  1643. package/server/services/workshop/daq/drivers/modbus-tcp.ts +307 -307
  1644. package/server/services/workshop/daq/drivers/mqtt-decode.ts +292 -0
  1645. package/server/services/workshop/daq/drivers/mqtt.ts +417 -94
  1646. package/server/services/workshop/daq/drivers/opcua.ts +227 -227
  1647. package/server/services/workshop/daq/drivers/s7-stub.ts +29 -29
  1648. package/server/services/workshop/daq/drivers/shared.ts +30 -1
  1649. package/server/services/workshop/daq/export-limits.ts +38 -0
  1650. package/server/services/workshop/daq/frames.ts +8 -2
  1651. package/server/services/workshop/daq/host-bindings.ts +71 -71
  1652. package/server/services/workshop/daq/host-ports.ts +65 -65
  1653. package/server/services/workshop/daq/plugin-bridge.ts +24 -2
  1654. package/server/services/workshop/daq/storage/latest-window.ts +132 -0
  1655. package/server/services/workshop/db/aml-team-seeds.ts +118 -118
  1656. package/server/services/workshop/db/backup-registry.ts +33 -33
  1657. package/server/services/workshop/db/channel-member.repo.ts +122 -122
  1658. package/server/services/workshop/db/channel.repo.ts +203 -203
  1659. package/server/services/workshop/db/chat-message.repo.ts +233 -233
  1660. package/server/services/workshop/db/database/index.ts +18 -18
  1661. package/server/services/workshop/db/database/json.ts +14 -14
  1662. package/server/services/workshop/db/database/migrations.ts +8 -0
  1663. package/server/services/workshop/db/database/open.ts +3 -1
  1664. package/server/services/workshop/db/database/schema.ts +1 -0
  1665. package/server/services/workshop/db/database/seed-data.ts +60 -60
  1666. package/server/services/workshop/db/hitl-request.repo.ts +221 -221
  1667. package/server/services/workshop/db/notification.repo.ts +199 -199
  1668. package/server/services/workshop/db/readonly.ts +30 -30
  1669. package/server/services/workshop/db/scheduled-task.repo.ts +235 -235
  1670. package/server/services/workshop/db/transaction.ts +72 -72
  1671. package/server/services/workshop/dcw/dcw-controller/actuation.ts +6 -0
  1672. package/server/services/workshop/dcw/dcw-controller/contracts.ts +16 -16
  1673. package/server/services/workshop/dcw/dcw-controller/control.ts +78 -78
  1674. package/server/services/workshop/dcw/dcw-controller/facade.ts +19 -19
  1675. package/server/services/workshop/dcw/dcw-controller/index.ts +22 -22
  1676. package/server/services/workshop/dcw/dcw-controller/params.ts +97 -97
  1677. package/server/services/workshop/dcw/dcw-controller/products.ts +103 -103
  1678. package/server/services/workshop/dcw/dcw-controller/write-audit.ts +1 -1
  1679. package/server/services/workshop/dcw/dcw-templates.ts +136 -136
  1680. package/server/services/workshop/dcw/drivers/http.ts +41 -15
  1681. package/server/services/workshop/dcw/drivers/mes-rest.ts +14 -51
  1682. package/server/services/workshop/dcw/drivers/mqtt.ts +58 -7
  1683. package/server/services/workshop/dcw/drivers/shared.ts +3 -0
  1684. package/server/services/workshop/dcw/param-conversion.ts +78 -78
  1685. package/server/services/workshop/dcw/param-map.repo.ts +349 -349
  1686. package/server/services/workshop/dcw/plugin-bridge.ts +45 -45
  1687. package/server/services/workshop/dcw/recipe-rollback-manager/contracts.ts +26 -26
  1688. package/server/services/workshop/dcw/recipe-rollback-manager/facade.ts +13 -13
  1689. package/server/services/workshop/dcw/recipe-rollback-manager/helpers.ts +30 -30
  1690. package/server/services/workshop/dcw/recipe-rollback-manager/index.ts +17 -17
  1691. package/server/services/workshop/dcw/recipe-rollback-manager/internal.ts +33 -33
  1692. package/server/services/workshop/dcw/recipe-rollback-manager/judge.ts +52 -52
  1693. package/server/services/workshop/dcw/recipe-rollback-manager/lock.ts +137 -137
  1694. package/server/services/workshop/dcw/recipe-rollback-manager/rollback.ts +190 -190
  1695. package/server/services/workshop/dcw/recipe-rollback-manager/state.ts +21 -21
  1696. package/server/services/workshop/dcw/recipe-rollback-manager/sweep.ts +77 -77
  1697. package/server/services/workshop/dcw/recipe-rollback-manager/types.ts +3 -3
  1698. package/server/services/workshop/dcw/recipe-rollback-manager/views.ts +214 -214
  1699. package/server/services/workshop/eda/chart-repo.ts +18 -1
  1700. package/server/services/workshop/eda/data-export.ts +3 -3
  1701. package/server/services/workshop/eda/data-query.ts +4 -1
  1702. package/server/services/workshop/eda/template-repo.ts +101 -101
  1703. package/server/services/workshop/exp/exp-collector.ts +275 -275
  1704. package/server/services/workshop/exp/exp-state.repo.ts +339 -339
  1705. package/server/services/workshop/mes/mes-controller.ts +1155 -1155
  1706. package/server/services/workshop/mes/mes-hook.ts +567 -567
  1707. package/server/services/workshop/mes/mes-secrets.repo.ts +119 -0
  1708. package/server/services/workshop/net/secret-auth.ts +84 -0
  1709. package/server/services/workshop/net/ssrf.ts +74 -0
  1710. package/server/services/workshop/ontology/subgraph.core.ts +300 -300
  1711. package/server/services/workshop/ontology/subgraph.service.ts +113 -113
  1712. package/server/services/workshop/optimization/access.ts +24 -30
  1713. package/server/services/workshop/optimization/python/.mimosa/hook-state/session_187ec97f45d4bd02369bbe94da527cf1.json +1 -0
  1714. package/server/services/workshop/optimization/python/.mimosa/hook-state/session_187ec97f45d4bd02369bbe94da527cf1.mvjqkcs6-68688-fb7131a89c.baseline/190a6772a4e43801737b4ba6072eb9d53d3099b5d8a9e6f57bc5e8592a26a6c4.source +274 -0
  1715. package/server/services/workshop/optimization/python/.mimosa/hook-status/session_187ec97f45d4bd02369bbe94da527cf1-01ed7f04fa.json +14 -0
  1716. package/server/services/workshop/optimization/python/__pycache__/problems.cpython-312.pyc +0 -0
  1717. package/server/services/workshop/plugins/host/api.mjs +90 -90
  1718. package/server/services/workshop/plugins/host/config.mjs +135 -135
  1719. package/server/services/workshop/plugins/host/index.mjs +23 -23
  1720. package/server/services/workshop/plugins/host/init.mjs +109 -109
  1721. package/server/services/workshop/plugins/host/load.mjs +14 -1
  1722. package/server/services/workshop/plugins/host/reload.mjs +6 -0
  1723. package/server/services/workshop/plugins/host/rollback.mjs +72 -72
  1724. package/server/services/workshop/plugins/host/state.mjs +54 -54
  1725. package/server/services/workshop/plugins/host/toggle.mjs +64 -64
  1726. package/server/services/workshop/plugins/host.mjs +9 -9
  1727. package/server/services/workshop/prompts/loader.ts +45 -8
  1728. package/server/services/workshop/runtime/agent-runtime/facade.ts +7 -7
  1729. package/server/services/workshop/runtime/agent-runtime/helpers.ts +18 -18
  1730. package/server/services/workshop/runtime/agent-runtime/index.ts +19 -19
  1731. package/server/services/workshop/runtime/agent-runtime/lifecycle.ts +137 -137
  1732. package/server/services/workshop/runtime/chat-mention.ts +164 -164
  1733. package/server/services/workshop/runtime/chat-projection.ts +246 -246
  1734. package/server/services/workshop/runtime/manager/admin-agents.ts +268 -268
  1735. package/server/services/workshop/runtime/manager/admin-channel.ts +5 -0
  1736. package/server/services/workshop/runtime/manager/bus.ts +182 -182
  1737. package/server/services/workshop/runtime/manager/channel-template-constants.ts +20 -20
  1738. package/server/services/workshop/runtime/manager/chat-reply.ts +181 -181
  1739. package/server/services/workshop/runtime/manager/chat.ts +384 -384
  1740. package/server/services/workshop/runtime/manager/facade.ts +24 -24
  1741. package/server/services/workshop/runtime/manager/helpers.ts +119 -119
  1742. package/server/services/workshop/runtime/manager/index.ts +42 -42
  1743. package/server/services/workshop/runtime/manager/internal.ts +73 -73
  1744. package/server/services/workshop/runtime/manager/notifications.ts +108 -108
  1745. package/server/services/workshop/runtime/manager/teams.ts +148 -148
  1746. package/server/services/workshop/runtime/memory/contracts.ts +18 -18
  1747. package/server/services/workshop/runtime/memory/facade.ts +10 -10
  1748. package/server/services/workshop/runtime/memory/helpers.ts +196 -196
  1749. package/server/services/workshop/runtime/memory/index.ts +27 -27
  1750. package/server/services/workshop/runtime/memory/score.ts +33 -33
  1751. package/server/services/workshop/runtime/memory/state.ts +40 -40
  1752. package/server/services/workshop/runtime/monitor.ts +3 -3
  1753. package/server/services/workshop/runtime/platform-notice.ts +113 -113
  1754. package/server/services/workshop/runtime/schedule-runtime.ts +347 -347
  1755. package/server/services/workshop/runtime/scheduler-loop/contracts.ts +29 -29
  1756. package/server/services/workshop/runtime/scheduler-loop/facade.ts +7 -7
  1757. package/server/services/workshop/runtime/scheduler-loop/helpers.ts +14 -14
  1758. package/server/services/workshop/runtime/scheduler-loop/index.ts +16 -16
  1759. package/server/services/workshop/runtime/task-engine/facade.ts +7 -7
  1760. package/server/services/workshop/runtime/task-engine/index.ts +15 -15
  1761. package/server/services/workshop/runtime/task-engine/types.ts +3 -3
  1762. package/server/services/workshop/runtime/user-notification-hub.ts +192 -192
  1763. package/server/services/workshop/tools/types.ts +1 -0
  1764. package/server/types/pg.d.ts +49 -49
  1765. package/server/utils/approval-gate.ts +67 -67
  1766. package/server/utils/mojibake-guard.ts +29 -29
  1767. package/server/utils/stability-severity.ts +77 -77
  1768. package/shared/config/groups.mjs +241 -241
  1769. package/shared/config/schema.json +2 -0
  1770. package/shared/daq-protocol.ts +30 -2
  1771. package/shared/dcw-protocol/catalog.ts +15 -3
  1772. package/shared/dcw-protocol/closed-loop.ts +2 -0
  1773. package/shared/lru.mjs +97 -97
  1774. package/tui/README.md +74 -74
  1775. package/tui/aw-tui.mjs +445 -445
  1776. package/tui/commands/index.mjs +287 -287
  1777. package/tui/components/chat-log.mjs +42 -42
  1778. package/tui/components/monitor-pane.mjs +39 -39
  1779. package/tui/components/root.mjs +53 -53
  1780. package/tui/components/status-bar.mjs +33 -33
  1781. package/tui/lib/api.mjs +82 -82
  1782. package/tui/lib/pickers.mjs +121 -121
  1783. package/tui/lib/reducers.mjs +218 -218
  1784. package/tui/lib/state.mjs +86 -86
  1785. package/tui/lib/virtual-terminal.mjs +48 -48
  1786. package/tui/lib/ws.mjs +125 -125
  1787. package/tui/theme.mjs +38 -38
  1788. package/.output/public/_nuxt/0qvcO_KM2.js +0 -1
  1789. package/.output/public/_nuxt/2Kwo_j9G2.js +0 -1
  1790. package/.output/public/_nuxt/39W1CH-l2.js +0 -1
  1791. package/.output/public/_nuxt/7xbYPfY6.js +0 -1
  1792. package/.output/public/_nuxt/8SZLbrI42.js +0 -1
  1793. package/.output/public/_nuxt/ATAvN55g.js +0 -1
  1794. package/.output/public/_nuxt/B3eCVqcT2.js +0 -1
  1795. package/.output/public/_nuxt/B4JlRHBB2.js +0 -1
  1796. package/.output/public/_nuxt/B4iJT5PX2.js +0 -2
  1797. package/.output/public/_nuxt/B9qIhT7k2.js +0 -1
  1798. package/.output/public/_nuxt/BE9oKpOt.js +0 -1
  1799. package/.output/public/_nuxt/BNUaS1jv.js +0 -20
  1800. package/.output/public/_nuxt/BVGzwAxr2.js +0 -16
  1801. package/.output/public/_nuxt/BY3Lbz3h.js +0 -1
  1802. package/.output/public/_nuxt/BbACaREb.js +0 -1
  1803. package/.output/public/_nuxt/BcosvNXb2.js +0 -1
  1804. package/.output/public/_nuxt/BhJA-E372.js +0 -1
  1805. package/.output/public/_nuxt/BiZWwdcD2.js +0 -1
  1806. package/.output/public/_nuxt/Bq-tmkst.js +0 -1
  1807. package/.output/public/_nuxt/Bq8YzXzs2.js +0 -1
  1808. package/.output/public/_nuxt/BxxpJxZf2.js +0 -1
  1809. package/.output/public/_nuxt/C1-SuwUN.js +0 -1
  1810. package/.output/public/_nuxt/C2Yp-B8m.js +0 -1
  1811. package/.output/public/_nuxt/C5OStZJ62.js +0 -1
  1812. package/.output/public/_nuxt/CDL30A2z2.js +0 -1
  1813. package/.output/public/_nuxt/CEvJu-xI.js +0 -1
  1814. package/.output/public/_nuxt/CT4bi_Y4.js +0 -1
  1815. package/.output/public/_nuxt/CZYNy60j2.js +0 -1
  1816. package/.output/public/_nuxt/CeCSjB9O2.js +0 -1
  1817. package/.output/public/_nuxt/Cf7ER7e2.js +0 -1
  1818. package/.output/public/_nuxt/CjF4QY9h.js +0 -1
  1819. package/.output/public/_nuxt/Cot5VNae.js +0 -1
  1820. package/.output/public/_nuxt/Crf8_Ad02.js +0 -1
  1821. package/.output/public/_nuxt/D1C6qtS12.js +0 -1
  1822. package/.output/public/_nuxt/D37gODe0.js +0 -1
  1823. package/.output/public/_nuxt/D8HQPtm62.js +0 -1
  1824. package/.output/public/_nuxt/D9O4L4jK.js +0 -1
  1825. package/.output/public/_nuxt/D9tNM-1a.js +0 -9
  1826. package/.output/public/_nuxt/DAug2CPf.js +0 -21
  1827. package/.output/public/_nuxt/DPnjnDtg.js +0 -36
  1828. package/.output/public/_nuxt/DWe6BMlp2.js +0 -1
  1829. package/.output/public/_nuxt/DbhTN7-T.js +0 -47
  1830. package/.output/public/_nuxt/DdyE0ylS.js +0 -1
  1831. package/.output/public/_nuxt/DgGzwjAr2.js +0 -2
  1832. package/.output/public/_nuxt/DgTqKyYF2.js +0 -1
  1833. package/.output/public/_nuxt/DhjgWrB62.js +0 -1
  1834. package/.output/public/_nuxt/DiWcX4gj.js +0 -1
  1835. package/.output/public/_nuxt/DkRozlDP2.js +0 -1
  1836. package/.output/public/_nuxt/DlS-SkQ42.js +0 -1
  1837. package/.output/public/_nuxt/DmHp9yQ3.js +0 -1
  1838. package/.output/public/_nuxt/DqxBCeDe.js +0 -1
  1839. package/.output/public/_nuxt/DxH5focQ.js +0 -1
  1840. package/.output/public/_nuxt/Dyr3LPGL.js +0 -1
  1841. package/.output/public/_nuxt/FsRVXpyF2.js +0 -1
  1842. package/.output/public/_nuxt/Iub61dX9.js +0 -1
  1843. package/.output/public/_nuxt/MC_i34H42.js +0 -1
  1844. package/.output/public/_nuxt/MmlCf-EZ.js +0 -1
  1845. package/.output/public/_nuxt/OmpTerminalPanel.DMWgGwDs.css +0 -1
  1846. package/.output/public/_nuxt/PluginSlot.BqBzLD4T.css +0 -1
  1847. package/.output/public/_nuxt/Q-JpBT03.js +0 -1
  1848. package/.output/public/_nuxt/TownView.Cn8SPG7S.css +0 -1
  1849. package/.output/public/_nuxt/TugRY_4O.js +0 -1
  1850. package/.output/public/_nuxt/WybiLTow2.js +0 -8
  1851. package/.output/public/_nuxt/Zn0BZpf0.js +0 -3
  1852. package/.output/public/_nuxt/_id_.Be5JaH-P.css +0 -1
  1853. package/.output/public/_nuxt/_wsId_.p_vAYtTp.css +0 -1
  1854. package/.output/public/_nuxt/agents.CRomddYR.css +0 -1
  1855. package/.output/public/_nuxt/aml.DgOMpDpv.css +0 -1
  1856. package/.output/public/_nuxt/b7UcqLKi.js +0 -1
  1857. package/.output/public/_nuxt/board.Bo35UR0e.css +0 -1
  1858. package/.output/public/_nuxt/builds/meta/8a151630-3285-41b8-a1e5-063fee2002ac.json +0 -1
  1859. package/.output/public/_nuxt/default.CpAx70gC.css +0 -1
  1860. package/.output/public/_nuxt/geMze5qw.js +0 -1
  1861. package/.output/public/_nuxt/hCN555XP2.js +0 -1
  1862. package/.output/public/_nuxt/hlfahYxK.js +0 -1
  1863. package/.output/public/_nuxt/logs.DcSvz6vi.css +0 -1
  1864. package/.output/public/_nuxt/monitor.OoNTwfMJ.css +0 -1
  1865. package/.output/public/_nuxt/ontology.D4P756Tc.css +0 -1
  1866. package/.output/public/_nuxt/operations.C48ggFa5.css +0 -1
  1867. package/.output/public/_nuxt/pages.Dpa28tJW.css +0 -1
  1868. package/.output/public/_nuxt/permissions.CrV-4t-6.css +0 -1
  1869. package/.output/public/_nuxt/pipeline.NFs5z5V-.css +0 -1
  1870. package/.output/public/_nuxt/rcdmiszh2.js +0 -1
  1871. package/.output/public/_nuxt/schedules.DYWOjGHm.css +0 -1
  1872. package/.output/public/_nuxt/studio.CjmUr8P7.css +0 -1
  1873. package/.output/public/_nuxt/teams.DEJoJ4QV.css +0 -1
  1874. package/.output/public/_nuxt/toG_qAMH.js +0 -1
  1875. package/.output/public/_nuxt/tokens.DKZWCP5v.css +0 -1
  1876. package/.output/public/_nuxt/tools.DP-nsTli.css +0 -1
  1877. package/.output/public/_nuxt/uomnHjhM.js +0 -1
  1878. package/.output/public/_nuxt/v77qozuJ2.js +0 -1
  1879. package/.output/public/_nuxt/v7cV7hJa.js +0 -1
  1880. package/.output/public/_nuxt/wK6Pp4Zc2.js +0 -2
  1881. package/.output/public/_nuxt/we7-sMSo2.js +0 -1
  1882. package/.output/public/_nuxt/workshop.PT1xhP8C.css +0 -1
  1883. package/.output/public/_nuxt/wxISMS1i.js +0 -1
  1884. package/.output/public/_nuxt/zy7efYKR.js +0 -1
  1885. package/.output/server/chunks/build/AuthGate-G74Wr5IV.mjs +0 -704
  1886. package/.output/server/chunks/build/AuthGate-G74Wr5IV.mjs.map +0 -1
  1887. package/.output/server/chunks/build/FormItemContext-DmuQqaeJ.mjs +0 -77
  1888. package/.output/server/chunks/build/FormItemContext-DmuQqaeJ.mjs.map +0 -1
  1889. package/.output/server/chunks/build/OmpTerminalPanel-5cB-78zp.mjs +0 -889
  1890. package/.output/server/chunks/build/OmpTerminalPanel-5cB-78zp.mjs.map +0 -1
  1891. package/.output/server/chunks/build/PluginSlot-CZlGlRoR.mjs +0 -131
  1892. package/.output/server/chunks/build/PluginSlot-CZlGlRoR.mjs.map +0 -1
  1893. package/.output/server/chunks/build/TownView-CcUPLqF1.mjs +0 -5960
  1894. package/.output/server/chunks/build/TownView-CcUPLqF1.mjs.map +0 -1
  1895. package/.output/server/chunks/build/_id_-AgACEyL6.mjs +0 -1922
  1896. package/.output/server/chunks/build/_id_-AgACEyL6.mjs.map +0 -1
  1897. package/.output/server/chunks/build/_id_-B3yCK2lD.mjs +0 -373
  1898. package/.output/server/chunks/build/_id_-B3yCK2lD.mjs.map +0 -1
  1899. package/.output/server/chunks/build/_wsId_-kcDriA4i.mjs +0 -13707
  1900. package/.output/server/chunks/build/_wsId_-kcDriA4i.mjs.map +0 -1
  1901. package/.output/server/chunks/build/agents-DRod4lTC.mjs +0 -1047
  1902. package/.output/server/chunks/build/agents-DRod4lTC.mjs.map +0 -1
  1903. package/.output/server/chunks/build/alert-CNGhs--Y.mjs +0 -260
  1904. package/.output/server/chunks/build/alert-CNGhs--Y.mjs.map +0 -1
  1905. package/.output/server/chunks/build/aml-B3Umz4DR.mjs +0 -729
  1906. package/.output/server/chunks/build/aml-B3Umz4DR.mjs.map +0 -1
  1907. package/.output/server/chunks/build/analysis-CMsMTMCg.mjs +0 -502
  1908. package/.output/server/chunks/build/analysis-CMsMTMCg.mjs.map +0 -1
  1909. package/.output/server/chunks/build/api-D-zkgkj-.mjs +0 -51
  1910. package/.output/server/chunks/build/api-D-zkgkj-.mjs.map +0 -1
  1911. package/.output/server/chunks/build/api-D3gy2e2q.mjs +0 -70
  1912. package/.output/server/chunks/build/api-D3gy2e2q.mjs.map +0 -1
  1913. package/.output/server/chunks/build/api-bn4OKkl_.mjs +0 -62
  1914. package/.output/server/chunks/build/api-bn4OKkl_.mjs.map +0 -1
  1915. package/.output/server/chunks/build/api-error-CnW_xiNI.mjs +0 -46
  1916. package/.output/server/chunks/build/api-error-CnW_xiNI.mjs.map +0 -1
  1917. package/.output/server/chunks/build/apiClient-DIXx9sfD.mjs +0 -70
  1918. package/.output/server/chunks/build/apiClient-DIXx9sfD.mjs.map +0 -1
  1919. package/.output/server/chunks/build/board-B2oYXGBy.mjs +0 -172
  1920. package/.output/server/chunks/build/board-B2oYXGBy.mjs.map +0 -1
  1921. package/.output/server/chunks/build/card-BECE6y_G.mjs +0 -922
  1922. package/.output/server/chunks/build/card-BECE6y_G.mjs.map +0 -1
  1923. package/.output/server/chunks/build/channel-templates-R2TInv8B.mjs +0 -950
  1924. package/.output/server/chunks/build/channel-templates-R2TInv8B.mjs.map +0 -1
  1925. package/.output/server/chunks/build/checkbox-C6xY5uc6.mjs +0 -429
  1926. package/.output/server/chunks/build/checkbox-C6xY5uc6.mjs.map +0 -1
  1927. package/.output/server/chunks/build/client-only-S7k53PIm.mjs +0 -42
  1928. package/.output/server/chunks/build/client-only-S7k53PIm.mjs.map +0 -1
  1929. package/.output/server/chunks/build/core-CRlsQhzd.mjs +0 -292
  1930. package/.output/server/chunks/build/core-CRlsQhzd.mjs.map +0 -1
  1931. package/.output/server/chunks/build/daq-DFQQOtcZ.mjs +0 -1210
  1932. package/.output/server/chunks/build/daq-DFQQOtcZ.mjs.map +0 -1
  1933. package/.output/server/chunks/build/data-Cl4wRZO6.mjs +0 -459
  1934. package/.output/server/chunks/build/data-Cl4wRZO6.mjs.map +0 -1
  1935. package/.output/server/chunks/build/dcw-8415S3Km.mjs +0 -467
  1936. package/.output/server/chunks/build/dcw-8415S3Km.mjs.map +0 -1
  1937. package/.output/server/chunks/build/default-DDRKP2Mb.mjs +0 -2246
  1938. package/.output/server/chunks/build/default-DDRKP2Mb.mjs.map +0 -1
  1939. package/.output/server/chunks/build/descriptions-B3uhDesi.mjs +0 -401
  1940. package/.output/server/chunks/build/descriptions-B3uhDesi.mjs.map +0 -1
  1941. package/.output/server/chunks/build/drawer-DwXxapMg.mjs +0 -822
  1942. package/.output/server/chunks/build/drawer-DwXxapMg.mjs.map +0 -1
  1943. package/.output/server/chunks/build/dropdown-DLrGy-Fs.mjs +0 -12
  1944. package/.output/server/chunks/build/dropdown-DLrGy-Fs.mjs.map +0 -1
  1945. package/.output/server/chunks/build/dropdown-nsGv8Gqx.mjs +0 -530
  1946. package/.output/server/chunks/build/dropdown-nsGv8Gqx.mjs.map +0 -1
  1947. package/.output/server/chunks/build/es-DXSEkmAm.mjs +0 -42
  1948. package/.output/server/chunks/build/es-DXSEkmAm.mjs.map +0 -1
  1949. package/.output/server/chunks/build/firstNotUndefined-laiThpLD.mjs +0 -2082
  1950. package/.output/server/chunks/build/firstNotUndefined-laiThpLD.mjs.map +0 -1
  1951. package/.output/server/chunks/build/form-Cw2Ex9w5.mjs +0 -3543
  1952. package/.output/server/chunks/build/form-Cw2Ex9w5.mjs.map +0 -1
  1953. package/.output/server/chunks/build/hasIn-RYRGomyg.mjs +0 -192
  1954. package/.output/server/chunks/build/hasIn-RYRGomyg.mjs.map +0 -1
  1955. package/.output/server/chunks/build/hitl-B4cHRlkC.mjs +0 -120
  1956. package/.output/server/chunks/build/hitl-B4cHRlkC.mjs.map +0 -1
  1957. package/.output/server/chunks/build/input-CJgB-RL6.mjs +0 -1705
  1958. package/.output/server/chunks/build/input-CJgB-RL6.mjs.map +0 -1
  1959. package/.output/server/chunks/build/input-number-CQKL42p_.mjs +0 -1027
  1960. package/.output/server/chunks/build/input-number-CQKL42p_.mjs.map +0 -1
  1961. package/.output/server/chunks/build/interval-DiAUqODq.mjs +0 -8
  1962. package/.output/server/chunks/build/interval-DiAUqODq.mjs.map +0 -1
  1963. package/.output/server/chunks/build/isNumeric-DQiJ-b15.mjs +0 -6
  1964. package/.output/server/chunks/build/isNumeric-DQiJ-b15.mjs.map +0 -1
  1965. package/.output/server/chunks/build/logs-C-dWpJ80.mjs +0 -381
  1966. package/.output/server/chunks/build/logs-C-dWpJ80.mjs.map +0 -1
  1967. package/.output/server/chunks/build/menu-xO8ocVtL.mjs +0 -1833
  1968. package/.output/server/chunks/build/menu-xO8ocVtL.mjs.map +0 -1
  1969. package/.output/server/chunks/build/monitor-BNrG6v3b.mjs +0 -2216
  1970. package/.output/server/chunks/build/monitor-BNrG6v3b.mjs.map +0 -1
  1971. package/.output/server/chunks/build/ontology-DoXAsa2y.mjs +0 -1416
  1972. package/.output/server/chunks/build/ontology-DoXAsa2y.mjs.map +0 -1
  1973. package/.output/server/chunks/build/operations-Ch6tZIKo.mjs +0 -278
  1974. package/.output/server/chunks/build/operations-Ch6tZIKo.mjs.map +0 -1
  1975. package/.output/server/chunks/build/optimizer-DaTyaY3c.mjs +0 -202
  1976. package/.output/server/chunks/build/optimizer-DaTyaY3c.mjs.map +0 -1
  1977. package/.output/server/chunks/build/pages-CQOfwKB4.mjs +0 -439
  1978. package/.output/server/chunks/build/pages-CQOfwKB4.mjs.map +0 -1
  1979. package/.output/server/chunks/build/pagination-BTzq7dD5.mjs +0 -1330
  1980. package/.output/server/chunks/build/pagination-BTzq7dD5.mjs.map +0 -1
  1981. package/.output/server/chunks/build/permissions-qmimwB0M.mjs +0 -649
  1982. package/.output/server/chunks/build/permissions-qmimwB0M.mjs.map +0 -1
  1983. package/.output/server/chunks/build/pipeline-eo2RWN3f.mjs +0 -226
  1984. package/.output/server/chunks/build/pipeline-eo2RWN3f.mjs.map +0 -1
  1985. package/.output/server/chunks/build/plugins-Dh_goy-k.mjs +0 -269
  1986. package/.output/server/chunks/build/plugins-Dh_goy-k.mjs.map +0 -1
  1987. package/.output/server/chunks/build/popconfirm-DuGF7ty-.mjs +0 -333
  1988. package/.output/server/chunks/build/popconfirm-DuGF7ty-.mjs.map +0 -1
  1989. package/.output/server/chunks/build/responsiveObserve-CzRpNXkr.mjs +0 -77
  1990. package/.output/server/chunks/build/responsiveObserve-CzRpNXkr.mjs.map +0 -1
  1991. package/.output/server/chunks/build/schedules-C2_x38gj.mjs +0 -7039
  1992. package/.output/server/chunks/build/schedules-C2_x38gj.mjs.map +0 -1
  1993. package/.output/server/chunks/build/segmented-29uEKZ3D.mjs +0 -332
  1994. package/.output/server/chunks/build/segmented-29uEKZ3D.mjs.map +0 -1
  1995. package/.output/server/chunks/build/select-CJb2XrQf.mjs +0 -3734
  1996. package/.output/server/chunks/build/select-CJb2XrQf.mjs.map +0 -1
  1997. package/.output/server/chunks/build/settings-Cz2Plds0.mjs +0 -944
  1998. package/.output/server/chunks/build/settings-Cz2Plds0.mjs.map +0 -1
  1999. package/.output/server/chunks/build/space-BByD-mFE.mjs +0 -107
  2000. package/.output/server/chunks/build/space-BByD-mFE.mjs.map +0 -1
  2001. package/.output/server/chunks/build/spin-XhbgGeLP.mjs +0 -313
  2002. package/.output/server/chunks/build/spin-XhbgGeLP.mjs.map +0 -1
  2003. package/.output/server/chunks/build/studio-CwYXl00G.mjs +0 -329
  2004. package/.output/server/chunks/build/studio-CwYXl00G.mjs.map +0 -1
  2005. package/.output/server/chunks/build/switch-DWcwVFxW.mjs +0 -374
  2006. package/.output/server/chunks/build/switch-DWcwVFxW.mjs.map +0 -1
  2007. package/.output/server/chunks/build/table-Zhuo7Fq-.mjs +0 -7249
  2008. package/.output/server/chunks/build/table-Zhuo7Fq-.mjs.map +0 -1
  2009. package/.output/server/chunks/build/tabs-BCwBXjNt.mjs +0 -1838
  2010. package/.output/server/chunks/build/tabs-BCwBXjNt.mjs.map +0 -1
  2011. package/.output/server/chunks/build/tag-CRW-anwy.mjs +0 -1010
  2012. package/.output/server/chunks/build/tag-CRW-anwy.mjs.map +0 -1
  2013. package/.output/server/chunks/build/teams-CwhFdcYn.mjs +0 -1160
  2014. package/.output/server/chunks/build/teams-CwhFdcYn.mjs.map +0 -1
  2015. package/.output/server/chunks/build/tokens-C5ODO1HA.mjs +0 -992
  2016. package/.output/server/chunks/build/tokens-C5ODO1HA.mjs.map +0 -1
  2017. package/.output/server/chunks/build/tools-C0YKragH.mjs +0 -487
  2018. package/.output/server/chunks/build/tools-C0YKragH.mjs.map +0 -1
  2019. package/.output/server/chunks/build/tooltip-GlMrUZzx.mjs +0 -888
  2020. package/.output/server/chunks/build/tooltip-GlMrUZzx.mjs.map +0 -1
  2021. package/.output/server/chunks/build/town-DLFB4SZl.mjs +0 -117
  2022. package/.output/server/chunks/build/town-DLFB4SZl.mjs.map +0 -1
  2023. package/.output/server/chunks/build/useAgentHarnessOptions-CYKuLtZ2.mjs +0 -120
  2024. package/.output/server/chunks/build/useAgentHarnessOptions-CYKuLtZ2.mjs.map +0 -1
  2025. package/.output/server/chunks/build/useAgentTemplateActions-Da_V1LSD.mjs +0 -71
  2026. package/.output/server/chunks/build/useAgentTemplateActions-Da_V1LSD.mjs.map +0 -1
  2027. package/.output/server/chunks/build/useAgentTemplateForm-BWvax5_E.mjs +0 -112
  2028. package/.output/server/chunks/build/useAgentTemplateForm-BWvax5_E.mjs.map +0 -1
  2029. package/.output/server/chunks/build/useAgentTemplatesCatalog-BnYjZy59.mjs +0 -140
  2030. package/.output/server/chunks/build/useAgentTemplatesCatalog-BnYjZy59.mjs.map +0 -1
  2031. package/.output/server/chunks/build/useAmlDatasets-nGi10DAl.mjs +0 -88
  2032. package/.output/server/chunks/build/useAmlDatasets-nGi10DAl.mjs.map +0 -1
  2033. package/.output/server/chunks/build/useAmlEntities-CTgNAgcZ.mjs +0 -79
  2034. package/.output/server/chunks/build/useAmlEntities-CTgNAgcZ.mjs.map +0 -1
  2035. package/.output/server/chunks/build/useAmlEnv-Da2TVfyK.mjs +0 -188
  2036. package/.output/server/chunks/build/useAmlEnv-Da2TVfyK.mjs.map +0 -1
  2037. package/.output/server/chunks/build/useAmlExperiments-U9AQ52RI.mjs +0 -86
  2038. package/.output/server/chunks/build/useAmlExperiments-U9AQ52RI.mjs.map +0 -1
  2039. package/.output/server/chunks/build/useAmlJobs-BM1mu5iH.mjs +0 -251
  2040. package/.output/server/chunks/build/useAmlJobs-BM1mu5iH.mjs.map +0 -1
  2041. package/.output/server/chunks/build/useAmlModels-C1DwIOMi.mjs +0 -90
  2042. package/.output/server/chunks/build/useAmlModels-C1DwIOMi.mjs.map +0 -1
  2043. package/.output/server/chunks/build/useAmlNotes-CNm47QdS.mjs +0 -80
  2044. package/.output/server/chunks/build/useAmlNotes-CNm47QdS.mjs.map +0 -1
  2045. package/.output/server/chunks/build/useAmlPredict-m8I1AdRn.mjs +0 -126
  2046. package/.output/server/chunks/build/useAmlPredict-m8I1AdRn.mjs.map +0 -1
  2047. package/.output/server/chunks/build/useAnalysisFeed-CpbOaiBD.mjs +0 -120
  2048. package/.output/server/chunks/build/useAnalysisFeed-CpbOaiBD.mjs.map +0 -1
  2049. package/.output/server/chunks/build/useDaqAddNode-D_1EBuR3.mjs +0 -141
  2050. package/.output/server/chunks/build/useDaqAddNode-D_1EBuR3.mjs.map +0 -1
  2051. package/.output/server/chunks/build/useDaqDetailBinding-j05iSApd.mjs +0 -72
  2052. package/.output/server/chunks/build/useDaqDetailBinding-j05iSApd.mjs.map +0 -1
  2053. package/.output/server/chunks/build/useDaqDetailFrames-BKciVJ78.mjs +0 -78
  2054. package/.output/server/chunks/build/useDaqDetailFrames-BKciVJ78.mjs.map +0 -1
  2055. package/.output/server/chunks/build/useDaqDetailHistory-DgemICkr.mjs +0 -166
  2056. package/.output/server/chunks/build/useDaqDetailHistory-DgemICkr.mjs.map +0 -1
  2057. package/.output/server/chunks/build/useDaqDetailNode-Cn7_og6t.mjs +0 -103
  2058. package/.output/server/chunks/build/useDaqDetailNode-Cn7_og6t.mjs.map +0 -1
  2059. package/.output/server/chunks/build/useDaqDetailParams-DX_vjFyK.mjs +0 -157
  2060. package/.output/server/chunks/build/useDaqDetailParams-DX_vjFyK.mjs.map +0 -1
  2061. package/.output/server/chunks/build/useDaqFilters-DMS4GN20.mjs +0 -224
  2062. package/.output/server/chunks/build/useDaqFilters-DMS4GN20.mjs.map +0 -1
  2063. package/.output/server/chunks/build/useDaqOptimizations-OPbdy5YB.mjs +0 -132
  2064. package/.output/server/chunks/build/useDaqOptimizations-OPbdy5YB.mjs.map +0 -1
  2065. package/.output/server/chunks/build/useDaqStream-CS1G6iro.mjs +0 -385
  2066. package/.output/server/chunks/build/useDaqStream-CS1G6iro.mjs.map +0 -1
  2067. package/.output/server/chunks/build/useDaqTemplates-DqhRYo88.mjs +0 -181
  2068. package/.output/server/chunks/build/useDaqTemplates-DqhRYo88.mjs.map +0 -1
  2069. package/.output/server/chunks/build/useDashboardData-CeaMjEA9.mjs +0 -139
  2070. package/.output/server/chunks/build/useDashboardData-CeaMjEA9.mjs.map +0 -1
  2071. package/.output/server/chunks/build/useDcwAddNode-Cytz_odQ.mjs +0 -217
  2072. package/.output/server/chunks/build/useDcwAddNode-Cytz_odQ.mjs.map +0 -1
  2073. package/.output/server/chunks/build/useDcwCards-BKCFqkRd.mjs +0 -64
  2074. package/.output/server/chunks/build/useDcwCards-BKCFqkRd.mjs.map +0 -1
  2075. package/.output/server/chunks/build/useDcwDetailScope-CvdvcKAv.mjs +0 -184
  2076. package/.output/server/chunks/build/useDcwDetailScope-CvdvcKAv.mjs.map +0 -1
  2077. package/.output/server/chunks/build/useDcwDetailTemplates-CC2FcEge.mjs +0 -143
  2078. package/.output/server/chunks/build/useDcwDetailTemplates-CC2FcEge.mjs.map +0 -1
  2079. package/.output/server/chunks/build/useDcwFilter-CVoiXbZh.mjs +0 -65
  2080. package/.output/server/chunks/build/useDcwFilter-CVoiXbZh.mjs.map +0 -1
  2081. package/.output/server/chunks/build/useDcwLedger-Cd-ckHoJ.mjs +0 -73
  2082. package/.output/server/chunks/build/useDcwLedger-Cd-ckHoJ.mjs.map +0 -1
  2083. package/.output/server/chunks/build/useDcwLineMutations-BOQs-fw3.mjs +0 -133
  2084. package/.output/server/chunks/build/useDcwLineMutations-BOQs-fw3.mjs.map +0 -1
  2085. package/.output/server/chunks/build/useDcwLineRun-D9qvcyTM.mjs +0 -100
  2086. package/.output/server/chunks/build/useDcwLineRun-D9qvcyTM.mjs.map +0 -1
  2087. package/.output/server/chunks/build/useDcwParamApprovals-D36q4can.mjs +0 -119
  2088. package/.output/server/chunks/build/useDcwParamApprovals-D36q4can.mjs.map +0 -1
  2089. package/.output/server/chunks/build/useDcwProducts-BozctrwT.mjs +0 -88
  2090. package/.output/server/chunks/build/useDcwProducts-BozctrwT.mjs.map +0 -1
  2091. package/.output/server/chunks/build/useDcwQuery-C8FikKgu.mjs +0 -93
  2092. package/.output/server/chunks/build/useDcwQuery-C8FikKgu.mjs.map +0 -1
  2093. package/.output/server/chunks/build/useDcwQuickActions-IyQ8Rkpe.mjs +0 -84
  2094. package/.output/server/chunks/build/useDcwQuickActions-IyQ8Rkpe.mjs.map +0 -1
  2095. package/.output/server/chunks/build/useDcwRecipes-k9HGhMwF.mjs +0 -263
  2096. package/.output/server/chunks/build/useDcwRecipes-k9HGhMwF.mjs.map +0 -1
  2097. package/.output/server/chunks/build/useDcwStream-BnBOiawo.mjs +0 -455
  2098. package/.output/server/chunks/build/useDcwStream-BnBOiawo.mjs.map +0 -1
  2099. package/.output/server/chunks/build/useDcwTemplates-CnyYOOy0.mjs +0 -87
  2100. package/.output/server/chunks/build/useDcwTemplates-CnyYOOy0.mjs.map +0 -1
  2101. package/.output/server/chunks/build/useDcwWrites-Cco590iv.mjs +0 -136
  2102. package/.output/server/chunks/build/useDcwWrites-Cco590iv.mjs.map +0 -1
  2103. package/.output/server/chunks/build/useDeviceTwins-DL-VLFeX.mjs +0 -118
  2104. package/.output/server/chunks/build/useDeviceTwins-DL-VLFeX.mjs.map +0 -1
  2105. package/.output/server/chunks/build/useExpConfirmations-DgwqTb9O.mjs +0 -104
  2106. package/.output/server/chunks/build/useExpConfirmations-DgwqTb9O.mjs.map +0 -1
  2107. package/.output/server/chunks/build/useLocalTime-C__kwn8h.mjs +0 -52
  2108. package/.output/server/chunks/build/useLocalTime-C__kwn8h.mjs.map +0 -1
  2109. package/.output/server/chunks/build/useLogsManual-BcfanT0s.mjs +0 -80
  2110. package/.output/server/chunks/build/useLogsManual-BcfanT0s.mjs.map +0 -1
  2111. package/.output/server/chunks/build/useLogsQuery-BGlKVKpV.mjs +0 -136
  2112. package/.output/server/chunks/build/useLogsQuery-BGlKVKpV.mjs.map +0 -1
  2113. package/.output/server/chunks/build/useLogsScope-C-yrta-v.mjs +0 -75
  2114. package/.output/server/chunks/build/useLogsScope-C-yrta-v.mjs.map +0 -1
  2115. package/.output/server/chunks/build/useMonitorData-BUey2Xly.mjs +0 -128
  2116. package/.output/server/chunks/build/useMonitorData-BUey2Xly.mjs.map +0 -1
  2117. package/.output/server/chunks/build/useMonitorFormat-rhs7FlNo.mjs +0 -77
  2118. package/.output/server/chunks/build/useMonitorFormat-rhs7FlNo.mjs.map +0 -1
  2119. package/.output/server/chunks/build/useOperationsFeed-DWfCjP4l.mjs +0 -182
  2120. package/.output/server/chunks/build/useOperationsFeed-DWfCjP4l.mjs.map +0 -1
  2121. package/.output/server/chunks/build/useOpsLog--yf8erUi.mjs +0 -139
  2122. package/.output/server/chunks/build/useOpsLog--yf8erUi.mjs.map +0 -1
  2123. package/.output/server/chunks/build/useRecipeDispatchApprovals-CKF2sB9P.mjs +0 -146
  2124. package/.output/server/chunks/build/useRecipeDispatchApprovals-CKF2sB9P.mjs.map +0 -1
  2125. package/.output/server/chunks/build/useTeamActions-C08sAVqY.mjs +0 -71
  2126. package/.output/server/chunks/build/useTeamActions-C08sAVqY.mjs.map +0 -1
  2127. package/.output/server/chunks/build/useTeamAddMemberDialog-fzTmflr8.mjs +0 -78
  2128. package/.output/server/chunks/build/useTeamAddMemberDialog-fzTmflr8.mjs.map +0 -1
  2129. package/.output/server/chunks/build/useTeamCreateDialog-De63ep-X.mjs +0 -91
  2130. package/.output/server/chunks/build/useTeamCreateDialog-De63ep-X.mjs.map +0 -1
  2131. package/.output/server/chunks/build/useTeamDeployDialog-CpAtG5Jy.mjs +0 -76
  2132. package/.output/server/chunks/build/useTeamDeployDialog-CpAtG5Jy.mjs.map +0 -1
  2133. package/.output/server/chunks/build/useTeamPluginDialog-C1OOe1sL.mjs +0 -99
  2134. package/.output/server/chunks/build/useTeamPluginDialog-C1OOe1sL.mjs.map +0 -1
  2135. package/.output/server/chunks/build/useTeamsCatalog-DA41SMDu.mjs +0 -124
  2136. package/.output/server/chunks/build/useTeamsCatalog-DA41SMDu.mjs.map +0 -1
  2137. package/.output/server/chunks/build/useTokenCreate-XHTQExra.mjs +0 -106
  2138. package/.output/server/chunks/build/useTokenCreate-XHTQExra.mjs.map +0 -1
  2139. package/.output/server/chunks/build/useTokenRename-Cf1B0cRy.mjs +0 -81
  2140. package/.output/server/chunks/build/useTokenRename-Cf1B0cRy.mjs.map +0 -1
  2141. package/.output/server/chunks/build/useTokenReveal-C8n1Vt9t.mjs +0 -108
  2142. package/.output/server/chunks/build/useTokenReveal-C8n1Vt9t.mjs.map +0 -1
  2143. package/.output/server/chunks/build/useTokensList-MMIq24E-.mjs +0 -86
  2144. package/.output/server/chunks/build/useTokensList-MMIq24E-.mjs.map +0 -1
  2145. package/.output/server/chunks/build/useWorkbenchAuth-Dyc_czui.mjs +0 -131
  2146. package/.output/server/chunks/build/useWorkbenchAuth-Dyc_czui.mjs.map +0 -1
  2147. package/.output/server/chunks/build/useWorkbenchWorkspaces-DT33HbBD.mjs +0 -128
  2148. package/.output/server/chunks/build/useWorkbenchWorkspaces-DT33HbBD.mjs.map +0 -1
  2149. package/.output/server/chunks/build/useWorkshopApi-BkEgGBIM.mjs +0 -118
  2150. package/.output/server/chunks/build/useWorkshopApi-BkEgGBIM.mjs.map +0 -1
  2151. package/.output/server/chunks/build/useWorkshopWs-BWrVj4jL.mjs +0 -1577
  2152. package/.output/server/chunks/build/useWorkshopWs-BWrVj4jL.mjs.map +0 -1
  2153. package/.output/server/chunks/build/useWorkspaceAuth-TahC9EC7.mjs +0 -48
  2154. package/.output/server/chunks/build/useWorkspaceAuth-TahC9EC7.mjs.map +0 -1
  2155. package/.output/server/chunks/build/useWorkspaceChannels-BVAHmhN3.mjs +0 -94
  2156. package/.output/server/chunks/build/useWorkspaceChannels-BVAHmhN3.mjs.map +0 -1
  2157. package/.output/server/chunks/build/useWorkspaceShell-rQHWNNWJ.mjs +0 -150
  2158. package/.output/server/chunks/build/useWorkspaceShell-rQHWNNWJ.mjs.map +0 -1
  2159. package/.output/server/chunks/build/users-pVCK50z-.mjs +0 -566
  2160. package/.output/server/chunks/build/users-pVCK50z-.mjs.map +0 -1
  2161. package/.output/server/chunks/build/workshop-DAgsBgG4.mjs +0 -499
  2162. package/.output/server/chunks/build/workshop-DAgsBgG4.mjs.map +0 -1
  2163. package/scripts/_aw-packaged-start.cjs +0 -22
  2164. package/scripts/_i18n-en-cjk-scan.mjs +0 -28
  2165. package/scripts/_i18n-en-verify.mjs +0 -107
  2166. package/scripts/_i18n-extra-checks.mjs +0 -53
  2167. package/scripts/_i18n-scan-hardcoded.mjs +0 -180
  2168. package/scripts/_lib-dcw-line.mjs +0 -24
  2169. package/scripts/_lib-plc-sim-child.mjs +0 -28
  2170. package/scripts/_lint-reflow.mjs +0 -105
  2171. package/scripts/_loop-biax-campaign.mjs +0 -130
  2172. package/scripts/_probe-daq-omp-task.mjs +0 -100
  2173. package/scripts/_probe-daq-scope-default.mjs +0 -123
  2174. package/scripts/_probe-lease.cjs +0 -13
  2175. package/scripts/_probe-model-channel-link.cjs +0 -25
  2176. package/scripts/_probe-recipe-switch.mjs +0 -92
  2177. package/scripts/_probe-task-queue.cjs +0 -9
  2178. package/scripts/build-anime-models.mjs +0 -339
  2179. package/scripts/demo-group-chat-omp-cases.ts +0 -210
  2180. package/scripts/demo-group-chat-omp.ts +0 -184
  2181. package/scripts/demo-group-chat-order.ts +0 -197
  2182. package/scripts/e2e-channel-isolation.ts +0 -329
  2183. package/scripts/e2e-lead-team-mgmt.ts +0 -217
  2184. package/scripts/proof-omp-real.ts +0 -189
  2185. package/scripts/smoke-optimization-verify.ts +0 -72
  2186. package/scripts/test-a2a-types.ts +0 -296
  2187. package/scripts/test-agent-multi-channel.ts +0 -160
  2188. package/scripts/test-agentteam-task-chat-flow.ts +0 -420
  2189. package/scripts/test-channel-routing.ts +0 -301
  2190. package/scripts/test-cli-exit.mjs +0 -343
  2191. package/scripts/test-event-persistence.mjs +0 -177
  2192. package/scripts/test-group-chat-hardening.ts +0 -265
  2193. package/scripts/test-group-chat-unit/section-a-migration.ts +0 -75
  2194. package/scripts/test-group-chat-unit/section-b-permission-matrix.ts +0 -88
  2195. package/scripts/test-group-chat-unit/section-c-member-lifecycle.ts +0 -64
  2196. package/scripts/test-group-chat-unit/section-d-mention-resolution.ts +0 -36
  2197. package/scripts/test-group-chat-unit/section-e-chat-facts.ts +0 -97
  2198. package/scripts/test-group-chat-unit/section-f-user-notifications.ts +0 -52
  2199. package/scripts/test-group-chat-unit/section-g-member-projection.ts +0 -44
  2200. package/scripts/test-group-chat-unit/section-h-outbox-consistency.ts +0 -30
  2201. package/scripts/test-group-chat-unit/section-i-read-idempotency.ts +0 -24
  2202. package/scripts/test-group-chat-unit/section-j-permission-scope.ts +0 -150
  2203. package/scripts/test-hitl-legacy-channel-auth.ts +0 -143
  2204. package/scripts/test-lane-history-live.mjs +0 -126
  2205. package/scripts/test-mcp-tools.ts +0 -285
  2206. package/scripts/test-memory-dynamic.ts +0 -101
  2207. package/scripts/test-memory-month-query.mjs +0 -70
  2208. package/scripts/test-memory.ts +0 -431
  2209. package/scripts/test-route-reason.mjs +0 -118
  2210. package/scripts/test-scheduler-loop/scenarios-modes.ts +0 -95
  2211. package/scripts/test-scheduler-loop/scenarios-runtime.ts +0 -58
  2212. package/scripts/test-scheduler-loop/scenarios-supervise.ts +0 -183
  2213. package/scripts/test-scheduler-loop/scenarios-triage.ts +0 -102
  2214. package/scripts/ui/admin-shots.mjs +0 -46
  2215. package/scripts/ui/bump-microfont.mjs +0 -39
  2216. package/scripts/ui/linkcheck2.mjs +0 -37
  2217. package/scripts/ui/live-render-check.mjs +0 -72
  2218. package/scripts/ui/perf-audit.mjs +0 -132
  2219. package/scripts/ui/sim-ui-shot.mjs +0 -16
  2220. package/scripts/ui/smoke-refactor.mjs +0 -258
  2221. /package/.output/public/_nuxt/{9j2J4k4w2.js → 9j2J4k4w.js} +0 -0
  2222. /package/.output/public/_nuxt/{BvRk9kiK2.js → DgrK8UCQ.js} +0 -0
  2223. /package/.output/public/_nuxt/{dVw8IHY6.js → dVw8IHY62.js} +0 -0
  2224. /package/.output/public/_nuxt/{k9b520K-2.js → k9b520K-.js} +0 -0
@@ -1,657 +1,657 @@
1
- # HTTP API authz / read-path / perf audit — agents + runtime + industrial nodes
2
-
3
- Read-only audit. Every claim cites `file:line` with verbatim code. No source file was modified.
4
-
5
- Scope read in full: `server/api/workshop/agent-tools/**`, `agents/**`, `channels/**`, `dcw/**`, `daq/**`,
6
- `runtime.get.ts`, `tasks.get.ts`, `mailbox.get.ts`, `caller.ts`, `server/services/workshop/scene-events.ts`,
7
- `server/services/workshop/agents/agent-badge.ts`, plus the guards they delegate to
8
- (`permissions.ts`, `runtime/manager.ts`, `agents/tool-approvals.ts`, `agents/node-bindings.repo.ts`,
9
- `agents/host-tool-bridge.ts`, `agents/industrial-tools.ts`, `dcw/dcw-controller.ts`, `daq/daq-controller.ts`,
10
- `aml/job-orchestrator.ts`, `aml/python-runtime.ts`).
11
-
12
- ---
13
-
14
- ## 1. AUTHZ AUDIT
15
-
16
- ### 0. Global facts
17
-
18
- * No global auth middleware exists. The only middleware is `server/middleware/request-log.ts:7` — logging only.
19
- * Unmatched `/api/workshop/**` paths hit `server/api/workshop/[...path].ts:12` → static 404.
20
- * Auth primitives (`server/api/workshop/caller.ts`):
21
- * `resolveUser` (`:71-79`) — Bearer **user** token, else 401.
22
- * `resolveCaller` (`:16-24`) — Bearer **agent instance** token, else 401.
23
- * `resolveAgentOrUser` (`:45-54`) — either domain.
24
- * `requireAdmin` (`:82-88`), `requireRole` (`:91-97`).
25
- * Line-grant model (`server/services/workshop/permissions.ts`): `isPrivilegedRole` (`:26-28`),
26
- `lineMode` (`:31-36`), `visibleLineIds` (`:39-42`), `filterByLine` (`:45-52`),
27
- `requireLineMode` (`:55-62`). admin/editor bypass everything.
28
-
29
- ### 1.1 [P0] `agent-tools/invoke.post.ts` — user token + client-supplied `agentId` = full agent impersonation
30
-
31
- The whole handler (27 lines):
32
-
33
- ```ts
34
- // server/api/workshop/agent-tools/invoke.post.ts:16-27
35
- export default defineApiHandler(async (event) => {
36
- const agentToken = getHeader(event, 'x-aw-agent-token')
37
- if (!agentToken) resolveUser(event) // 桥路径免用户鉴权,由 token 校验兜底
38
- const body = await readBody<{ agentId?: string, tool?: string, args?: Record<string, unknown> }>(event) ?? {}
39
- const agentId = String(body.agentId ?? '')
40
- const tool = String(body.tool ?? '')
41
- const args = body.args ?? {}
42
- if (!agentId) throw createError({ statusCode: 400, statusMessage: 'agentId required' })
43
- if (!tool) throw createError({ statusCode: 400, statusMessage: 'tool required' })
44
- const result = await getWorkshopManager().invokeHostTool({ agentId, tool, args, token: agentToken || undefined })
45
- return { result }
46
- })
47
- ```
48
-
49
- Note `invoke.post.ts:18`: `resolveUser(event)`'s **return value is discarded** — the authenticated user is never
50
- passed downstream. `agentId` comes only from the request body (`:20`).
51
-
52
- The guard it delegates to:
53
-
54
- ```ts
55
- // server/services/workshop/runtime/manager.ts:2746-2752
56
- async invokeHostTool(input: { agentId: string, token?: string, tool: string, args?: Record<string, unknown> }): Promise<{ text: string, isError?: boolean }> {
57
- const row = this.deps.repos.channelAgents.findById(input.agentId)
58
- if (!row || row.enabled !== 1) throw new AppError(404, 'NOT_FOUND', `agent 不存在或已停用: ${input.agentId}`)
59
- // token 鉴权(MCP 桥路径必带;缺省视为服务端内部调用,走 REST 已有用户鉴权)
60
- if (input.token !== undefined && input.token !== row.token) {
61
- throw new AppError(401, 'UNAUTHORIZED', 'agent token 校验失败')
62
- }
63
- ```
64
-
65
- `invoke.post.ts:25` passes `token: agentToken || undefined`. **Consequences, exactly:**
66
-
67
- | Request | `agentToken` | `input.token` | `manager.ts:2750` | Result |
68
- |---|---|---|---|---|
69
- | valid **user** Bearer, **no** `x-aw-agent-token`, `agentId` = any other agent | undefined | `undefined` | `input.token !== undefined` is **false** → check **skipped** | **Executes any tool as that agent** |
70
- | **no** `Authorization` at all, no `x-aw-agent-token` | undefined | — never reached | — | `resolveUser` at `invoke.post.ts:18` throws `AppError(401,'USER_UNAUTHORIZED')` (`caller.ts:76`) → **blocked** |
71
- | own agent token in `x-aw-agent-token`, `agentId` = another agent | own token | own token | `!== row.token` → true | 401 — **blocked** |
72
- | valid agent token, matching `agentId` | token | `=== row.token` | passes | legitimate |
73
-
74
- So the hole is exactly: **valid user token + arbitrary body `agentId` + absent `x-aw-agent-token`.** No ownership,
75
- membership or role check exists anywhere on this path. The authenticated `ResolvedUser` never reaches `manager`.
76
-
77
- After the guard, the impersonated identity drives every downstream authorization:
78
-
79
- ```ts
80
- // server/services/workshop/runtime/manager.ts:2769-2775
81
- const identity = {
82
- agentId: row.id,
83
- channelId: row.channelId,
84
- role: (row.role === 'lead' ? 'lead' : 'worker') as 'lead' | 'worker',
85
- name: row.name,
86
- }
87
- return await pluginTool.handler(input.args ?? {}, identity)
88
- ```
89
-
90
- ```ts
91
- // server/services/workshop/runtime/manager.ts:2777-2783
92
- const runtime = this.ensureAgentRuntime(row.channelId, input.agentId)
93
- if (runtime) {
94
- const viaImpl = await runtime.dispatchHostTool(input.tool, input.args ?? {})
95
- if (viaImpl) return viaImpl
96
- }
97
- // 回退:impl 未实现工具面(如 mock)→ 协作工具族直调
98
- return await this.invokeAgentWorkspaceTool(input.agentId, input.tool, input.args ?? {})
99
- ```
100
-
101
- `invokeHostTool` also applies **no role/tool filtering** — unlike `hostToolsForRole`
102
- (`host-tool-bridge.ts:70-87`) it never consults `LEAD_ONLY_TOOL_NAMES` (`host-tool-bridge.ts:33-43`).
103
- Every tool is dispatchable for any named agent that exists and is enabled.
104
-
105
- **Which tool classes are reachable, by whom**
106
-
107
- Reachable by *any* authenticated user token of *any* role (including a plain `user` with zero line grants):
108
- pick any lead/worker agent id.
109
-
110
- * **Read-only** (dispatch table `host-tool-bridge.ts:162-211` + `:219+`):
111
- `my_industrial_nodes`, `aml_node_catalog`, `aml_dataset_stats`, `aml_job_status`, `aml_job_logs`,
112
- `aml_leaderboard`, `aml_model_reference`, `dcw_read`, `daq_query`, `daq_frames`, `dcw_journal`, `ops_log`,
113
- `recipe_log`, `recipe_versions`, `line_context`, `list_other_teams`, `search_other_teams_memory`,
114
- mailbox/list-mail/memory tools.
115
- * **Mutating / control-plane**:
116
- * `dcw_control` — real PLC write. Its only authz is the *impersonated agent's* binding:
117
- ```ts
118
- // server/services/workshop/agents/industrial-tools.ts:99-108
119
- const repo = getAgentNodeBindingRepo()
120
- const binding: AgentNodeBinding | undefined = nodeId ? repo.find(agentId, nodeId, 'dcw') : undefined
121
- if (!binding) {
122
- ```
123
- HITL applies only when `binding.mode === 'manual'` (`industrial-tools.ts:128`); with `mode:'auto'`
124
- the write executes immediately (`industrial-tools.ts:157`).
125
- * `recipe_update` (`host-tool-bridge.ts:207-208`), `recipe_rollback` (`:209-210`), `dcw_judge` (`:193-194`),
126
- `dcw_rollback` (`:195-196`), `aml_dataset_build` (`:167-168`), `aml_job_cancel` (`:177-178`),
127
- `send_cross_channel_message` (`manager.ts:2725-2734`), `dispatch_task`, `create_team_agent`,
128
- `update_team_agent`, `remove_team_agent`, `complete_task`, `report_progress`.
129
- * `aml_model_promote` — nominally lead-only; its check is against the **DB role of the supplied agentId**:
130
- ```ts
131
- // server/services/workshop/agents/industrial-tools.ts:1290-1294
132
- // 治理硬守卫:晋升仅限 lead 实例(注入层过滤 + 分发层双重校验,HTTP 直调不可绕过)
133
- const roleRow = getAmlRuntime().db.prepare('SELECT role FROM channel_agents WHERE id = ? AND enabled = 1').get(agentId) as { role?: string } | undefined
134
- if (roleRow?.role !== 'lead') {
135
- return amlErr(`aml_model_promote 为 lead 专属工具:实例 ${agentId}(role=${roleRow?.role ?? '未知'})无权晋升模型。请由团队 lead 发起,晋升需人工 HITL 批准。`)
136
- }
137
- ```
138
- Naming a lead's `agentId` satisfies it (then HITL approval at `industrial-tools.ts:1316`).
139
- * `aml_job_submit` — **arbitrary Python execution on the server host.** The tool takes up to 500 KB of code:
140
- ```ts
141
- // server/services/workshop/agents/industrial-tools.ts:1152-1156
142
- if (!code.trim()) return amlErr('code 必填:train.py 全文(单文件;契约见工具说明)。')
143
- if (code.length > 512_000) return amlErr(`code 过大(${Math.round(code.length / 1024)}KB),上限 500KB;精简训练代码(模型定义/训练循环拆薄)后重试。`)
144
- if (!/\bimport\s+amlkit\b/.test(code)) {
145
- ```
146
- It is written to disk and executed:
147
- ```ts
148
- // server/services/workshop/aml/job-orchestrator.ts:285-287
149
- if (typeof inline === 'string' && inline.length > 0 && inline.length <= 512_000) {
150
- writeFileSync(join(workspace, 'train.py'), inline)
151
- trainFile = 'train.py'
152
- ```
153
- ```ts
154
- // server/services/workshop/aml/job-orchestrator.ts:328
155
- const exit1 = await runPython(run, vpy, [join(workspace, trainFile)], workspace)
156
- ```
157
- No container/OS sandbox; the only mitigation is a scrubbed env
158
- (`aml/python-runtime.ts:186-214`, `jobEnv` whitelist, "服务器 secrets … 一律不可见").
159
- The `import amlkit` requirement is a regex (`industrial-tools.ts:1154`), trivially satisfied.
160
- * Plugin tools: identity is the impersonated agent (`manager.ts:2769-2775`), no independent check —
161
- e.g. `diag_run` (`server/plugins-builtin/diag-bridge/index.mjs:449-450`) exports line DAQ snapshots,
162
- `kb_store`/`kb_index` (`server/plugins-builtin/rag-bridge/index.mjs:199,259`) mutate the knowledge base.
163
-
164
- **Contrast with the sibling endpoint, which does it right:**
165
-
166
- ```ts
167
- // server/api/workshop/agent-tools/list.get.ts:17-22
168
- if (agentToken) {
169
- const resolved = getWorkshopManager().resolveAgentByToken(String(agentToken))
170
- if (!resolved || resolved.agentId !== agentId) {
171
- throw createError({ statusCode: 401, statusMessage: 'agent token 校验失败' })
172
- }
173
- }
174
- ```
175
-
176
- **Enumeration is trivial**, so no guessing is needed: `agent-tools/bindings/index.get.ts:13` returns
177
- `{ bindings: agentId ? getAgentNodeBindingRepo().byAgent(agentId) : getAgentNodeBindingRepo().all() }` — with no
178
- `agentId` query param, **every** binding of every agent (agentId + nodeId + kind + mode) is returned to any
179
- authenticated user.
180
-
181
- ⚠UNVERIFIED: I did not execute a live exploit; the conclusion is from the code paths above (all read directly).
182
- Corroboration: the same finding is already written up at `docs/audit/audit-agents.md:186-249` ("the manager's
183
- token check is **skipped entirely** when no token is supplied … Minimal hardening: in `invokeHostTool` change the
184
- token check to `if (input.token !== row.token)`") — and the code is **unchanged**, i.e. unfixed.
185
-
186
- ### 1.2 `bindings/index.post.ts` — permission check quoted; **target agent ownership NOT verified**
187
-
188
- ```ts
189
- // server/api/workshop/agent-tools/bindings/index.post.ts:16-39
190
- export default defineApiHandler(async (event) => {
191
- const user = resolveUser(event)
192
- const body = await readBody<{ agentId?: string, nodeId?: string, kind?: 'dcw' | 'daq', mode?: 'auto' | 'manual' }>(event) ?? {}
193
- const kind = body.kind ?? 'dcw'
194
- const nodeId = String(body.nodeId ?? '')
195
- // 绑定前置:节点必须存在,且用户对其所属产线有足额权限
196
- const lineId = kind === 'daq'
197
- ? getDaqController().byId(nodeId)?.lineId
198
- : getDcwController().byId(nodeId)?.lineId
199
- if (!lineId) {
200
- throw new AppError(404, ErrorCodes.NOT_FOUND, `${kind === 'daq' ? '数采' : '写控'}节点不存在: ${nodeId}`)
201
- }
202
- const mode = lineMode(user, lineId)
203
- const needOperate = kind === 'dcw'
204
- if (mode === 'none' || (needOperate && mode !== 'operate')) {
205
- throw new AppError(403, 'LINE_FORBIDDEN', `无该产线权限:绑定${kind === 'daq' ? '数采' : '写控'}节点需对产线「${lineId}」拥有${needOperate ? '可操控' : '仅查看'}及以上权限`)
206
- }
207
- const binding = getAgentNodeBindingRepo().bind(
208
- String(body.agentId ?? ''),
209
- nodeId,
210
- kind,
211
- body.mode ?? 'auto',
212
- )
213
- return { binding }
214
- })
215
- ```
216
-
217
- The check at `:28-32` covers **the node's line only**. `body.agentId` is never resolved, never checked for
218
- existence, never checked for ownership/membership:
219
-
220
- ```ts
221
- // server/services/workshop/agents/node-bindings.repo.ts:73-78
222
- bind(agentId: string, nodeId: string, kind: AgentNodeBindingKind, mode: AgentNodeBindingMode): AgentNodeBinding {
223
- if (!agentId) throw new AppError(400, ErrorCodes.VALIDATION_ERROR, 'agentId 必填')
224
- if (!nodeId) throw new AppError(400, ErrorCodes.VALIDATION_ERROR, 'nodeId 必填')
225
- if (kind !== 'dcw' && kind !== 'daq') throw new AppError(400, ErrorCodes.VALIDATION_ERROR, `未知节点类型: ${kind}`)
226
- if (mode !== 'auto' && mode !== 'manual') throw new AppError(400, ErrorCodes.VALIDATION_ERROR, `未知控制模式: ${mode}`)
227
- ```
228
-
229
- Effect: **any** authenticated user with `operate` on one line can grant that control right to **any** agent id —
230
- their own, another user's agent, or a lead in an unrelated channel — or re-bind an existing agent with
231
- `"mode":"auto"` to strip HITL, because `bind()` updates the mode of an existing row
232
- (`node-bindings.repo.ts:79-83`: `if (prev) { prev.mode = mode; this.flush(); return prev }`).
233
- The granting user need not own, belong to, or even know anything about that agent.
234
-
235
- ### 1.3 Handlers that authenticate but never authorize the resource (IDOR)
236
-
237
- All of these call `resolveUser` and **discard the result** or use it only for logging — no ownership/role/line check:
238
-
239
- | Handler | Auth | Missing check | Impact |
240
- |---|---|---|---|
241
- | `agent-tools/bindings/[id].patch.ts:10-13` | `resolveUser(event)` (`:10`) | owner / role / line | Any user flips **any** binding's mode: `getAgentNodeBindingRepo().setMode(id, body.mode ?? 'auto')` → `"auto"` **disables HITL** for another team's writes (`node-bindings.repo.ts:97-104`) |
242
- | `agent-tools/bindings/[id].delete.ts:11-17` | `resolveUser(event)` (`:11`) | owner / role / line | Any user unbinds any agent↔node pair (`:17 !repo.unbind(id)`), also cancels that agent's pending approvals (`:19 getToolApprovals().cancelPendingFor(...)`) |
243
- | `agent-tools/bindings/index.get.ts:10-13` | `resolveUser(event)` (`:10`) | any scope filter | Full cross-tenant binding dump (see 1.1) |
244
- | `agent-tools/approvals/index.get.ts:11-16` | `resolveUser(event)` (`:11`) | ownership of `agentId` | Any user lists pending approvals of any agent: `getToolApprovals().listPending(agentId)`; history via `scope=history` |
245
- | `agent-tools/list.get.ts:13-23` | user token path (`:13`) | `agentId` ownership | Tool-schema disclosure for any agent |
246
- | `dcw/[id]/read.post.ts:13-16` | `resolveUser(event)` (`:13`) | **`requireLineMode` absent** | Any user triggers a real driver read on **any** dcw node id: `await getDcwController().readNow(id)` (`:16`) — cross-line data read |
247
- | `dcw/[id].patch.ts:12-16` | `resolveUser(event)` (`:12`) | role / line | Any user patches **any** dcw node: name/driver/range/enabled/position — `getDcwController().patch(id, body)` (`:16`). Widening `min/max` weakens the write interlock that `dcw_control` depends on |
248
- | `dcw/index.post.ts:13-16` | `resolveUser(event)` (`:13`) | role / line | Any user creates a write-control node (the comment at `:17` calls it "获得直写物理设备能力的入口") |
249
- | `dcw/lines/[id].delete.ts:15-21` | `resolveUser(event)` (`:15`) | role / line | Any user deletes **any** line; `?purge=1` cascades nodes/products/recipes (`:19-21`). The sibling create is admin/editor-gated (`dcw/lines/index.post.ts:14`) |
250
- | `dcw/lines/[id].patch.ts:11-14` | `resolveUser(event)` (`:11`) | role / line | Any user renames/recolors any line |
251
- | `dcw/recipes/[id].delete.ts:10-12` | `resolveUser(event)` (`:10`) | role | Any user deletes any recipe |
252
- | `dcw/recipes/index.post.ts:11-13` | `resolveUser(event)` (`:11`) | role | Any user creates recipes |
253
- | `dcw/recipes/[id]/index.patch.ts:12` , `[id]/revert.post.ts:12` | `resolveUser` | role | Any user edits/rewrites any recipe version history |
254
- | `dcw/products/[id].delete.ts:11-14`, `[id].patch.ts:12-16` | `resolveUser` | role | Any user deletes/edits any product (create requires admin/editor, `products/index.post.ts:12`) |
255
- | `dcw/runs/[id]/close.post.ts:11-14` | `resolveUser(event)` (`:11`) | role | Any user closes any production run window |
256
- | `dcw/templates/index.post.ts:11-13`, `[key].patch.ts:11-14`, `[key].delete.ts:10-12` | `resolveUser` | role | Any user mutates control templates (driver configs) |
257
- | `dcw/test-driver.post.ts:12-15` | `resolveUser(event)` (`:12`) | role | Any user makes the server open outbound connections with a caller-supplied `driverConfig`: `getDcwController().testDriver(body.driver ?? 'mock', body.driverConfig ?? {})` |
258
- | `daq/test-driver.post.ts:17-21` | `resolveUser(event)` (`:17`) | role | Same SSRF-ish connect primitive for DAQ protocols |
259
- | `daq/[id]/test.post.ts:12-15` | `resolveUser(event)` (`:12`) | **`requireLineMode` absent** | Any user triggers a real connection test on any DAQ node (`:15 testNode(id)`); the dcw twin requires `operate` (`dcw/[id]/test.post.ts:16`) |
260
- | `daq/[id].delete.ts:13-17` | `resolveUser(event)` (`:13`) | **`requireLineMode` absent** | Any user deletes any DAQ node; the patch twin requires `operate` (`daq/[id].patch.ts:19`) |
261
- | `daq/infra/reconnect.post.ts:9-15` | `resolveUser(event)` (`:9`) | role | Any user triggers infra bring-up: `await apply(daqInfraConfig())` → `__daqApplyInfra` runs `docker compose -f … up -d …` (`server/services/workshop/daq/infra.ts:85`) |
262
- | `daq/alarms.get.ts:11-15` | `resolveUser(event)` (`:11`) | line filter | Any user reads **all** alarms of **all** lines (`:15 listAlarms(scope, limit)`); `daq/index.get.ts:27` filters by line, this one does not |
263
- | `daq/templates/*` (`index.post.ts:12`, `[key].patch.ts:12`, `[key].delete.ts:12`) | `resolveUser` | role | Any user mutates signal templates |
264
- | `dcw/journal/index.get.ts:11-19` | `resolveUser(event)` (`:11`) | line scope | Any user reads the full parameter ledger for any `lineId`/`nodeId` supplied in the query |
265
- | `dcw/[id]/param-ledger.get.ts:11-13` | `resolveUser(event)` (`:11`) | **`requireLineMode` absent** | Any user reads any node's setpoints/targets/last-good values |
266
- | `dcw/optimizations/index.get.ts:11-21`, `[id].get.ts:11-16`, `[id]/series.get.ts:12-17` | `resolveUser` | line scope | Any user reads any line's optimization records + raw DAQ series |
267
- | `dcw/recipes/index.get.ts:9-11` | `resolveUser(event)` (`:9`) | line scope | Returns `repo.list()`/`listRuns()` with **no** `visibleLineIds` filter (contrast `dcw/index.get.ts:29-30`, `dcw/runs/index.get.ts:12`) |
268
- | `dcw/recipes/[id]/versions.get.ts:11-13` | `resolveUser` | line scope | Any user reads any recipe's full parameter version history |
269
- | `server/api/workshop/runtime.get.ts:9-10` | `resolveUser(event)` (`:9`) | role | Any user enumerates wired harness agent ids + active channels |
270
- | `server/api/workshop/daq/infra.get.ts:9` | `resolveUser` | role | Infra status disclosure (low) |
271
-
272
- ### 1.4 Handlers that ARE correctly guarded (control set)
273
-
274
- * `agents/[id].get.ts:16-17` → `manager.requireTemplateReadable`; `agents/[id].patch.ts:28`, `[id].delete.ts:17` → `requireWritable` (`manager.ts:1083-1090`).
275
- * `channels/[id].delete.ts:14-15`, `index.patch.ts:35-36`, `agents/index.post.ts:32-33`, `agents/[agentId].delete.ts:17-18`, `[agentId].patch.ts:18-19`, `model.patch.ts:20-21`, `position.patch.ts:19-20`, `range.patch.ts:19-20`, `stop.post.ts:18-19` → `getChannelForUser` + `requireWritable` + membership check (`manager.ts:1103-1110`, `:1067-1074`).
276
- * `channels/[id]/messages/index.post.ts:38-39`, `tasks/index.post.ts:67-68`, `tasks/index.get.ts:22`, `queue.get.ts:17`, `events.get.ts:28`, `terminals.get.ts:19`, `messages/index.get.ts:21`, `channels/[id]/index.get.ts:13` → `getChannelForUser` (owner-or-legacy-public read).
277
- * Memory planes: `channels/[id]/memories/**` and `channels/[id]/agents/[agentId]/memories/**` → `resolveAgentOrUser` + same-channel or `getChannelForUser`+`requireOwned`, and the manager re-checks role: `manager.ts:1508` (`仅本人或 lead 可策展 Agent 记忆`), `:1463` (`仅 lead 可写团队记忆`), `:1487`, `:1548`.
278
- ⚠ Note (by design, not a bug): `manager.searchAgentMemories` (`manager.ts:1441-1446`) only calls `requireMember(channelId, callerAgentId)` — **any teammate agent in the channel can search another agent's private memory** by passing that agent's id in the URL with `scope:'private'`.
279
- * `agents/subscribe.post.ts:17-19` → `resolveCaller` + `manager.subscribe` → `requireMember` + same-channel target check (`manager.ts:2884-2893`).
280
- * `tasks.get.ts:11-12` / `mailbox.get.ts:10-13` → `resolveCaller`, scope forced to `caller.channelId`/`caller.id`.
281
- * Role-gated: `dcw/controller.post.ts:15`, `dcw/[id].delete.ts:14`, `dcw/lines/index.post.ts:14`, `dcw/journal/node/[nodeId]/rollback.post.ts:15`, `dcw/optimizations/[id]/judge.post.ts:15`, `[id]/rollback.post.ts:17`, `dcw/products/index.post.ts:12`, `dcw/recipes/[id]/apply.post.ts:15`, `[id]/mark-good.post.ts:13`, `[id]/rollback-good.post.ts:13`, `dcw/runs/[id]/rollback.post.ts:14`, `daq/controller.post.ts:29,49`, `daq/index.post.ts:16` (all `requireRole`/`gateDangerous`).
282
- * `agent-tools/approvals/[id]/decide.post.ts:12-19` — `resolveUser` **used** (decider recorded + `audit`).
283
-
284
- ### 1.5 `requireLineMode` / `lineMode` audit for daq/dcw handlers
285
-
286
- **Called (correct):**
287
-
288
- | Handler | Line | Quote |
289
- |---|---|---|
290
- | `dcw/[id]/write.post.ts` | `:19` | `requireLineMode(user, getDcwController().byId(id)?.lineId, 'operate')` |
291
- | `dcw/[id]/test.post.ts` | `:16` | `requireLineMode(user, getDcwController().byId(id)?.lineId, 'operate')` |
292
- | `dcw/[id]/bind.post.ts` | `:16` | `requireLineMode(user, getDcwController().byId(id)?.lineId, 'operate')` |
293
- | `dcw/[id]/bindings.put.ts` | `:17` | `requireLineMode(user, getDcwController().byId(id)?.lineId, 'operate')` |
294
- | `dcw/lines/[id]/start.post.ts` | `:20` | `requireLineMode(user, id, 'operate')` |
295
- | `dcw/lines/[id]/stop.post.ts` | `:20` | `requireLineMode(user, id, 'operate')` |
296
- | `dcw/runs/[id]/data.get.ts` | `:18` | `requireLineMode(user, run?.lineId, 'readonly')` |
297
- | `daq/[id].patch.ts` | `:19` | `requireLineMode(user, getDaqController().byId(id)?.lineId, 'operate')` |
298
- | `daq/[id]/bind.post.ts` | `:18`, `daq/[id]/bindings.put.ts:18` | `requireLineMode(user, getDaqController().byId(id)?.lineId, 'operate')` |
299
- | `daq/[id]/samples.get.ts` | `:16`, `daq/[id]/frames.get.ts:16`, `daq/[id]/frames/content.get.ts:17` | `requireLineMode(user, getDaqController().byId(id)?.lineId, 'readonly')` |
300
- | `daq/alarms/[id]/ack.post.ts` | `:17` | `requireLineMode(user, alarmNodeId ? getDaqController().byId(alarmNodeId)?.lineId : undefined, 'operate')` |
301
- | `dcw/index.get.ts` | `:18-36` | `visibleLineIds` + `filterByLine` (+ per-line `.filter`) |
302
- | `dcw/lines/index.get.ts` | `:15-18`, `dcw/line/query.get.ts:18-21`, `dcw/runs/index.get.ts:12`, `daq/index.get.ts:27` | `visibleLineIds`/`filterByLine`; `dcw/line/query.get.ts:19-21` throws `403 LINE_FORBIDDEN` when `lineId` is outside the visible set |
303
- | `agent-tools/bindings/index.post.ts` | `:28-32` | `lineMode(user, lineId)` (node line only — see 1.2) |
304
-
305
- **NOT called, where a line-scoped resource is addressed** (all cited in §1.3 with their guards):
306
- `dcw/[id]/read.post.ts` (no line check on a real driver read — worst of these),
307
- `dcw/[id].patch.ts`, `dcw/[id]/param-ledger.get.ts`, `dcw/journal/index.get.ts`,
308
- `dcw/optimizations/index.get.ts`, `dcw/optimizations/[id].get.ts`, `dcw/optimizations/[id]/series.get.ts`,
309
- `dcw/recipes/index.get.ts`, `dcw/recipes/[id]/versions.get.ts`, `dcw/recipes/[id].delete.ts`,
310
- `dcw/recipes/[id]/index.patch.ts`, `dcw/recipes/[id]/revert.post.ts`, `dcw/products/[id].patch.ts`,
311
- `dcw/products/[id].delete.ts`, `dcw/runs/[id]/close.post.ts`, `dcw/lines/[id].patch.ts`,
312
- `dcw/lines/[id].delete.ts`, `dcw/index.post.ts`, `dcw/templates/*`,
313
- `daq/[id].delete.ts`, `daq/[id]/test.post.ts`, `daq/alarms.get.ts`, `daq/templates/*`,
314
- `daq/test-driver.post.ts`, `dcw/test-driver.post.ts`.
315
-
316
- ---
317
-
318
- ## 2. READ-PATH WRITES (`*.get.ts` that mutate)
319
-
320
- | GET handler | Write / side effect | Quote |
321
- |---|---|---|
322
- | `server/api/workshop/daq/index.get.ts:22` | **DB insert + runtime creation + 250 ms timer**: `provisionLegacyTwins()` → `this.repo.insert(node)` | `ctrl.provisionLegacyTwins()` (`index.get.ts:22`); `daq-controller.ts:1142-1159`: `provisionLegacyTwins(): void {` … `this.repo.insert(node)` (`:1157`) … `this.syncRuntimes()` (`:1159`); `ensureLoop()` at `:1143` starts `this.timer = setInterval(() => this.sweep(), 250)` (`:191`) |
323
- | `server/api/workshop/daq/index.get.ts:20` | Pipeline power-on: queue consumer + TSDB init | `await Promise.all([tsdbReady, getDaqQueue()])` (`:20`); comment `:18` `// ws.ts 出口装配 + 管线上电(幂等;路由模块加载即绑定)` |
324
- | `server/api/workshop/daq/[id]/samples.get.ts:23` (via `:16` guard) | **Starts acquisition**: `samples()` → `ensureLoop()` | route `:23 const points = await getDaqController().samples(id, {...})`; `daq-controller.ts:793-795`: `async samples(id, opts) {` / `this.ensureLoop()` / `await tsdbReady` |
325
- | `server/api/workshop/daq/[id]/frames.get.ts:20` | same | route `:20 const frames = await getDaqController().frames(id, {...})`; `daq-controller.ts:835 this.ensureLoop()` |
326
- | `server/api/workshop/daq/[id]/frames/content.get.ts:23` | same | route `:23 const { data, mime } = await getDaqController().frameContent(...)`; `daq-controller.ts:854 this.ensureLoop()` |
327
- | `server/api/workshop/channels/[id]/index.get.ts:16` | **Assembles lead runtime + starts SchedulerLoop (timer + loop resubmit callback)** | `ensureLeadSchedulerLoop(manager, channelId)` (`:16`), comment `:15` `// 兜底:详情请求时确保 lead 的调度循环已装配(如启动恢复遗漏)`; → `plugins/workshop.ts:73 manager.ensureChannelActive(channelId, options)` → `manager.ts:697-719` `const cr = this.ensureChannelRuntime(channelId)` … `cr.scheduler = loop` / `loop.start()` ⚠(whether `wireMember` immediately spawns a harness subprocess was not traced) |
328
- | `server/api/workshop/dcw/index.get.ts:13`, `dcw/lines/index.get.ts:12`, `dcw/line/query.get.ts:15`, `dcw/runs/[id]/data.get.ts:14` | Global binding mutation: repoints the controller's broadcast sink each request | `bindDcwBroadcast(broadcastSceneEvent)` → `dcw-controller.ts` `setBroadcast(fn)`; `daq/index.get.ts:19`, `dcw/[id]/read.post.ts:14` etc. use `bindDaqHost(broadcastSceneEvent)` |
329
- | `server/api/workshop/dcw/index.get.ts:32` | Over-fetch then JS trim (not a write, but a read amplification) | `ctrl.listHistory(400).filter(h => inLine(nodeLine(h.nodeId))).slice(0, 60)` |
330
-
331
- **Purely read-only GETs (verified line by line):** `agent-tools/list.get.ts`, `agent-tools/approvals/index.get.ts`,
332
- `agent-tools/bindings/index.get.ts`, `agents/index.get.ts`, `agents/[id].get.ts`,
333
- `channels/[id]/events.get.ts`, `channels/[id]/queue.get.ts`, `channels/[id]/tasks/index.get.ts`,
334
- `channels/[id]/terminals.get.ts` (`harness-terminal.ts:451-466` pure map over a Map),
335
- `channels/[id]/messages/index.get.ts`, `channels/[id]/agents/index.get.ts`,
336
- `channels/[id]/memories/index.get.ts`, `channels/[id]/agents/[agentId]/memories/index.get.ts`,
337
- `channels/[id]/plugins/index.get.ts`, `dcw/index.get.ts` (only the binding call above),
338
- `dcw/lines/index.get.ts`, `dcw/line/query.get.ts`, `dcw/recipes/index.get.ts`, `dcw/recipes/[id]/versions.get.ts`,
339
- `dcw/runs/index.get.ts`, `dcw/runs/[id]/data.get.ts` (`dcw-controller.ts:964-999` queries only),
340
- `dcw/journal/index.get.ts` (`recipe-rollback-manager.ts:652-654`), `dcw/[id]/param-ledger.get.ts` (`:627-649`),
341
- `dcw/optimizations/index.get.ts` (`:656-658`), `dcw/optimizations/[id].get.ts`,
342
- `dcw/optimizations/[id]/series.get.ts` (`:602-623` read-only), `daq/alarms.get.ts` (`daq-controller.ts:600-604`),
343
- `daq/infra.get.ts`, `runtime.get.ts` (`manager.ts:803-808`), `tasks.get.ts`, `mailbox.get.ts`
344
- (`manager.ts:2834-2840`; the query has no LIMIT — see §3).
345
-
346
- Note the memory list GET `channels/[id]/agents/[agentId]/memories/index.get.ts:28` calls `manager.listMemories`
347
- which is a pure read (`manager.ts:1421-1426`).
348
-
349
- ---
350
-
351
- ## 3. UNBOUNDED STATE + PERF
352
-
353
- ### 3.1 Module-level maps/sets/arrays in scope
354
-
355
- 1. **`server/api/workshop/caller.ts:122` — unbounded, no eviction.**
356
- ```ts
357
- const nameCache = new Map<string, { name: string | null, at: number }>()
358
- ```
359
- Writes (all writes in the file):
360
- ```ts
361
- // caller.ts:124-134
362
- const hit = nameCache.get(userId)
363
- if (hit && Date.now() - hit.at < 60_000) return hit.name
364
- ...
365
- nameCache.set(userId, { name, at: Date.now() })
366
- ```
367
- The 60 s TTL is consulted only when the **same** key is read again; there is **no eviction found** (no sweep,
368
- no size cap, no `delete`). Every distinct `ownerUserId` ever rendered by `withOwnerNames` stays for the process
369
- lifetime. `withOwnerNames` (`caller.ts:105-119`) creates a per-call `Map` (`:106`) which is request-scoped (fine).
370
- 2. **`server/services/workshop/scene-events.ts:20-27` — unbounded, no cap.**
371
- ```ts
372
- const g = globalThis as typeof globalThis & {
373
- __sceneEventPeers?: Set<WsPeer>
374
- }
375
-
376
- /** 在线 peer 注册表(ws 路由 sub 成功时登记,断开/退订移除) */
377
- function peers(): Set<WsPeer> {
378
- return g.__sceneEventPeers ??= new Set()
379
- }
380
- ```
381
- Write: `scene-events.ts:50-52 export function registerScenePeer(peer: WsPeer): void { peers().add(peer) }`.
382
- Full analysis in §5.
383
- 3. **`server/services/workshop/runtime/manager.ts:329` — in the invoke path, unbounded, no eviction.**
384
- ```ts
385
- private readonly lastToolInvokeAt = new Map<string, number>()
386
- ```
387
- Writes: `manager.ts:2757 this.lastToolInvokeAt.set(input.agentId, Date.now())` (every `invokeHostTool` call);
388
- reads: `manager.ts:704 toolActivityOf: (agentId: string) => this.lastToolInvokeAt.get(agentId) ?? null`.
389
- No `delete`/cap → one entry per distinct agentId ever invoked, forever (small, but unbounded and attacker-reachable
390
- via §1.1, e.g. spraying `agentId` values that exist).
391
- 4. **`server/services/workshop/agents/tool-approvals.ts:37-43` — bounded.**
392
- ```ts
393
- private pending = new Map<string, { approval: ToolApproval, resolve: ..., timer: NodeJS.Timeout }>()
394
- ...
395
- private history: ToolApproval[] = []
396
- ```
397
- Eviction exists: timeout deletes (`:75 this.pending.delete(approval.id)`), decide deletes (`:92`),
398
- cancel deletes (`:117`), history capped (`:162 if (this.history.length > HISTORY_CAP) this.history.splice(HISTORY_CAP)`).
399
- 5. `scene-events.ts` per-peer visible-lines is stashed on the peer object (`:35`), no separate collection.
400
- 6. Request-scoped only (not leaks): `harnesses.get.ts:18`, `channels/[id]/plugins/index.put.ts:30`,
401
- `channels.post.ts:51`, `daq/alarms/[id]/ack.post.ts` (no map), `ws.ts:188 peerBudget = new WeakMap(...)` (GC-safe).
402
- `harness-terminal.ts` `sessions` Map has a sweep — `harness-terminal.ts:469-479 sweepTerminalSessions(...)`
403
- (`sessions.delete(pid)`), invoked from `manager.ts:816`.
404
-
405
- ### 3.2 Full-table fetch + JS filtering
406
-
407
- * `server/api/workshop/dcw/index.get.ts:29-36` — five full arrays filtered in JS:
408
- `recipes: visible ? ctrl.listRecipes().filter(r => inLine(r.lineId)) : ctrl.listRecipes()`, likewise `runs`,
409
- `products`, `lines`, `lineStates`.
410
- * `server/api/workshop/dcw/index.get.ts:31-33` — **N+1 in JS**: `ctrl.listHistory(400).filter(h => inLine(nodeLine(h.nodeId))).slice(0, 60)`
411
- where `nodeLine = (nodeId: string): string | undefined => ctrl.byId(nodeId)?.lineId` (`:22`) and
412
- `byId` is a linear scan: `dcw-node.repo.ts:40-42 byId(id: string): DcwNode | undefined { return this.list.find(n => n.id === id) }`
413
- → up to 400 × nodeCount comparisons per request.
414
- * `server/api/workshop/agent-tools/bindings/index.get.ts:13` — `getAgentNodeBindingRepo().all()` returns the whole JSON list (`node-bindings.repo.ts:48-50`).
415
- * `server/api/workshop/dcw/recipes/index.get.ts:11` — `{ recipes: repo.list(), runs: repo.listRuns() }`, no filter/limit.
416
- * `server/api/workshop/channels/[id]/tasks/index.get.ts:23` — `taskEngineOf(manager).list(channelId)` →
417
- `task.repo.ts:67 SELECT ${COLS} FROM tasks WHERE channel_id = ? ORDER BY createdAt ASC, rowid ASC` — **no LIMIT**; every task row of the channel is returned.
418
- * `server/api/workshop/mailbox.get.ts:12-13` — client `limit` (uncapped) then fetch-all-and-slice:
419
- `manager.ts:2834-2839 pollMailbox(...) { this.requireMember(...); return this.deps.repos.messages.listPendingByChannelAgent(channelId, callerAgentId).slice(0, limit).map(rowToMessage) }` — the repo query at that call site passes no limit (`message.repo.ts:91-95` has a `LIMIT ?` variant, unused here).
420
- * `manager.ts:1552 listByAgent(targetAgentId, 10_000)` (delete memory path) and
421
- `manager.ts:1489 listByAgentChannel(channelId, TEAM_AGENT_ID, 1_000_000)` (delete team memory) — huge limits.
422
- * Member lookups fetch the whole roster then search: `channels/[id]/agents/[agentId].patch.ts:20-21`,
423
- `[agentId].delete.ts:19-20`, `[agentId]/stop.post.ts:20-21`, `model.patch.ts:22-23`, `position.patch.ts:21-22`,
424
- `range.patch.ts:21-22` all do `const members = await manager.listChannelAgents(channelId)` + `.some(...)`/`.find(...)`.
425
- * `dcw/line/query.get.ts:26` → `dcw-controller.ts:888 getDaqNodeRepo().all().filter(...)`, then one TSDB round trip.
426
- * `dcw/runs/[id]/data.get.ts:19` → `dcw-controller.ts:979-986`: `getDaqNodeRepo().all().filter(...)` then
427
- `await Promise.all(lineNodes.map(async (node) => ... getTsdb().query(node.id, ...)))` — one TSDB query **per node**
428
- (documented as intentional at `:977`).
429
- * `channels/[id]/agents/[agentId]/model.patch.ts:34` — `for (const a of repo.listAll())` full asset list per request.
430
- * `agents/index.get.ts:12` → `withOwnerNames(templates)` does one user lookup per template, 60 s-cached, never evicted (`caller.ts:105-135`).
431
-
432
- ### 3.3 Limits
433
-
434
- Huge / unbounded as passed from the route:
435
-
436
- * `mailbox.get.ts:12-13` — no upper bound: `const limit = Number.parseInt(url.searchParams.get('limit') ?? '50', 10)` … `limit > 0 ? limit : 50`.
437
- * `channels/[id]/tasks/index.get.ts:23` — no limit parameter at all.
438
- * `dcw/index.get.ts:32` — `listHistory(400)` (then slices to 60).
439
- * `dcw/line/query.get.ts:35`, `dcw/[id]/param-ledger.get.ts` (`limit: 30`/`20` internal), `dcw/[id]/samples`:
440
- `limit: num(q.limit)` passed raw, clamped only downstream at the adapter:
441
- `timescale.adapter.ts:109 const limit = Math.min(opts.limit ?? 500, 5000)` / `:157 Math.min(q.limit ?? 2000, 10_000)`;
442
- `sqlite.adapter.ts:128`, `:182` identical.
443
- * Properly capped: `audit.get.ts:15 Math.min(500, Math.max(1, Number(q.limit) || 100))`,
444
- `dcw/journal/index.get.ts:18 Math.min(limit, 500)`, `dcw/optimizations/index.get.ts:20`, `events.get.ts:18 limit: z.coerce.number().int().min(1).max(1000)`,
445
- `messages/index.get.ts:13 max(500)`, `daq/alarms.get.ts:14 Math.min(500, ...)`, `daq/[id]/frames` clamp at
446
- `daq-controller.ts:849 Math.min(Math.max(opts.limit ?? 100, 1), 1000)`, `manager.listChannelMail` `Math.min(500, ...)` (`manager.ts:2874`).
447
-
448
- ---
449
-
450
- ## 4. ERROR PROPAGATION
451
-
452
- ### 4.1 Swallowed errors that hide failures
453
-
454
- * `server/api/workshop/caller.ts:127-132` — user-name resolution failure is invisible:
455
- ```ts
456
- try {
457
- name = userRepository.findById(userId)?.name ?? null
458
- }
459
- catch {
460
- name = null
461
- }
462
- ```
463
- `withOwnerNames` then renders `ownerName: null` (`caller.ts:113-118`) with no log — a broken `users.sqlite`
464
- looks like "no owner" in every list that uses it (`agents/index.get.ts:12`).
465
- * `server/api/workshop/caller.ts:28-33` — `resolveCallerOrNull` swallows every error including 401:
466
- ```ts
467
- try {
468
- return resolveCaller(event)
469
- }
470
- catch {
471
- return null
472
- }
473
- ```
474
- Consumed at `channels/[id]/agents/index.get.ts:20-23`, where a genuine failure of the user path is silently
475
- downgraded to the agent-token path.
476
- * `server/api/workshop/audit.get.ts:24-29` — corrupt audit detail is silently replaced by `{}`:
477
- ```ts
478
- try {
479
- detail = JSON.parse(String(r.detailJson ?? '{}'))
480
- }
481
- catch {
482
- detail = {}
483
- }
484
- ```
485
- * `server/api/workshop/dcw/[id].delete.ts:18` — `const body = await readBody<{ approvalId?: string }>(event).catch(() => ({})) ?? {}` (deliberate, DELETE-with-empty-body).
486
- * Sanctioned-but-opaque fire-and-forget in the memory write paths: `manager.ts:1478`,
487
- `manager.ts:1515-1521`, `manager.ts:1540` — `void vectorizeMemory(...).catch(() => {})` and
488
- `.then(...).catch(() => {})` (vectorization failures never surface).
489
- * `server/services/workshop/permissions.ts:70` and `:76` — `}).catch(() => {})` on both broadcast paths
490
- (`broadcastSceneEvent('permissions.changed')`, `emitPluginEvent('permissions:changed')`): a failed permission-change
491
- broadcast means clients keep stale grants with no log.
492
- * `server/services/workshop/scene-events.ts:74-79` — send failures delete the peer silently (see §5).
493
- * `server/services/workshop/daq/daq-controller.ts:1189` — `.catch(() => {})` on queue start;
494
- `dcw-controller.ts:836` — `.catch(() => {})` on `markLineOffline`.
495
-
496
- ### 4.2 Internal error messages returned to the client (info leak)
497
-
498
- * `server/services/workshop/runtime/manager.ts:2785-2788` — raw internal `Error.message` is returned to the HTTP
499
- caller as tool output (this is the endpoint of §1.1):
500
- ```ts
501
- catch (err) {
502
- const reason = err instanceof Error ? err.message : String(err)
503
- return { text: `工具「${input.tool}」调用失败: ${reason}`, isError: true }
504
- }
505
- ```
506
- e.g. SQLite constraint text, filesystem paths from `saveJsonFileAtomic`, driver/Modbus errors.
507
- * `server/api/workshop/ws.ts:739` — `message: error instanceof Error ? error.message : 'workshop 未初始化'` is sent
508
- to the client in an `error` control frame.
509
- * Generic 500 path is clean: `server/utils/response.ts:44-46` logs the error and returns
510
- `{ code: 'INTERNAL_ERROR', message: '服务器内部错误' }` — no stack, no message.
511
-
512
- ### 4.3 Status-code mis-mapping (failures reported as 500)
513
-
514
- `server/api/workshop/daq/[id]/samples.get.ts` / `frames.get.ts` / `frames/content.get.ts` call controller methods
515
- that throw a **plain** `Error` carrying a non-standard `status` property:
516
-
517
- ```ts
518
- // server/services/workshop/daq/daq-controller.ts:797
519
- if (!node) throw Object.assign(new Error(`数采节点不存在: ${id}`), { status: 404 })
520
- ```
521
- ```ts
522
- // server/services/workshop/daq/daq-controller.ts:857, :862
523
- if (!node) throw Object.assign(new Error(`数采节点不存在: ${id}`), { status: 404 })
524
- ...
525
- if (!row || row.kind !== 'image') throw Object.assign(new Error(`帧不存在: ${id}@${tsMs}`), { status: 404 })
526
- ```
527
-
528
- `defineApiHandler` only honors `AppError` (`response.ts:30-33`) and `H3Error` (`:34-43`); a plain `Error` falls to
529
- `console.error('[api] unhandled error:', error)` + HTTP 500 (`response.ts:44-46`). So "node not found" surfaces to
530
- the UI as a 500, and the internal process is logged as an unhandled error.
531
-
532
- ---
533
-
534
- ## 5. SCENE EVENTS (`server/services/workshop/scene-events.ts`)
535
-
536
- **Subscriber tracking** — a `globalThis`-backed `Set` of duck-typed peers:
537
-
538
- ```ts
539
- // scene-events.ts:14-18
540
- interface WsPeer {
541
- send(data: string | Uint8Array): void
542
- close(code?: number, reason?: string): void
543
- }
544
- ```
545
- ```ts
546
- // scene-events.ts:20-27
547
- const g = globalThis as typeof globalThis & {
548
- __sceneEventPeers?: Set<WsPeer>
549
- }
550
-
551
- /** 在线 peer 注册表(ws 路由 sub 成功时登记,断开/退订移除) */
552
- function peers(): Set<WsPeer> {
553
- return g.__sceneEventPeers ??= new Set()
554
- }
555
- ```
556
-
557
- **Subscribe path** (only after user auth; a per-peer line-visibility set is stamped on the peer object):
558
-
559
- ```ts
560
- // server/api/workshop/ws.ts:174-177
561
- function attachScenePeer(peer: WsPeer, user: { id: string, role: string }): void {
562
- setPeerVisibleLines(peer, visibleLineIds(user))
563
- registerScenePeer(peer)
564
- }
565
- ```
566
- ```ts
567
- // scene-events.ts:34-36
568
- export function setPeerVisibleLines(peer: WsPeer, visible: Set<string> | null): void {
569
- (peer as WsPeer & { __awVisibleLines?: Set<string> | null }).__awVisibleLines = visible
570
- }
571
- ```
572
- ```ts
573
- // scene-events.ts:50-52
574
- export function registerScenePeer(peer: WsPeer): void {
575
- peers().add(peer)
576
- }
577
- ```
578
- Call sites: `ws.ts:176` only (grep: `registerScenePeer` appears in `scene-events.ts:50` and `ws.ts:176`).
579
-
580
- **Unsubscribe path — exists, on socket close and error:**
581
-
582
- ```ts
583
- // server/api/workshop/ws.ts:753-762
584
- close(peer) {
585
- unsubscribePeer(peer)
586
- unregisterScenePeer(peer)
587
- },
588
-
589
- error(peer, error) {
590
- console.error('[workshop-ws] connection error:', error)
591
- unsubscribePeer(peer)
592
- unregisterScenePeer(peer)
593
- },
594
- ```
595
- ```ts
596
- // scene-events.ts:54-56
597
- export function unregisterScenePeer(peer: WsPeer): void {
598
- peers().delete(peer)
599
- }
600
- ```
601
-
602
- **Max subscriber count: NONE.** There is no cap anywhere — grep for `__sceneEventPeers` yields only `scene-events.ts:21,26`;
603
- `registerScenePeer` (`:50-52`) performs an unconditional `add` with no size check, and `sceneEventPeerCount()`
604
- (`:58-60`) is exported but never called by any handler (grep: only its own declaration).
605
-
606
- **Dead-subscriber removal (two mechanisms, both partial):**
607
-
608
- 1. Close/error hooks above.
609
- 2. Lazy removal when a send throws:
610
- ```ts
611
- // scene-events.ts:72-80
612
- for (const peer of peers()) {
613
- if (lineId !== undefined && !peerSeesLine(peer, lineId)) continue
614
- try {
615
- peer.send(frame)
616
- }
617
- catch {
618
- peers().delete(peer)
619
- }
620
- }
621
- ```
622
- same pattern in `broadcastPeerEvent` (`:92-99`).
623
-
624
- **Can a subscriber leak? Yes — with the caveat that the primary paths are covered.**
625
- * The removal depends entirely on the ws route's `close`/`error` hooks firing (`ws.ts:753-762`). There is **no
626
- heartbeat/liveness timeout and no size cap** in the scene-peer set itself: a peer whose `send()` never throws
627
- (e.g. half-open TCP where the write lands in the kernel buffer) and whose close hook never fires stays registered
628
- for the process lifetime. The slow-consumer guard at `ws.ts:199-206` (`peer.close(1013, 'slow consumer')` +
629
- `stream.peers.delete(peer)`) exists but only bounds *stream* fan-out, and relies on that same close hook to reach
630
- `unregisterScenePeer`.
631
- * The registry lives on `globalThis` (`scene-events.ts:20-22`) while peers are created per module instance, so any
632
- module re-evaluation (dev HMR / nitro re-import) keeps the old peer objects in the same Set until their close hook
633
- fires; nothing prunes stale entries.
634
- * Broadcast cost is unbounded per frame: `broadcastSceneEvent` (`:66-81`) serializes once (`:71`) then loops all
635
- peers and `send`s synchronously — with N pages open, every scene event costs N sends (by design per the comment at
636
- `:62-65`), so a subscriber-count leak degrades CPU linearly with no ceiling.
637
-
638
- ---
639
-
640
- ## Priority summary
641
-
642
- 1. **P0** `agent-tools/invoke.post.ts:18+25` + `manager.ts:2750` — any user token + arbitrary `agentId` ⇒ act as any
643
- agent (PLC writes, recipe writes, model promotion, arbitrary training Python). Unfixed; previously documented at
644
- `docs/audit/audit-agents.md:186-249`.
645
- 2. **P0** `bindings/[id].patch.ts` — any user can flip any binding to `mode:'auto'`, silently removing HITL from
646
- another team's control path.
647
- 3. **P1** `dcw/[id]/read.post.ts`, `dcw/[id].patch.ts`, `dcw/index.post.ts`, `dcw/lines/[id].delete.ts`,
648
- `daq/[id].delete.ts`, `daq/[id]/test.post.ts`, `daq/alarms.get.ts`, `dcw/journal/*`, `dcw/optimizations/*`,
649
- `dcw/recipes/index.get.ts`, `dcw/recipes/[id]/versions.get.ts`, `dcw/[id]/param-ledger.get.ts` — authenticated
650
- but unscoped access to industrial data/control.
651
- 4. **P1** `bindings/index.post.ts:33-38` — binds any `agentId` without resolving or authorizing it.
652
- 5. **P2** GET handlers that start acquisition/pipelines and insert rows (`daq/index.get.ts:20-22`,
653
- `daq/[id]/samples.get.ts`→`daq-controller.ts:794`, `channels/[id]/index.get.ts:16`).
654
- 6. **P2** `daq/test-driver.post.ts` / `dcw/test-driver.post.ts` — caller-controlled outbound connect primitive.
655
- 7. **P3** `caller.ts:122` uncapped `nameCache`; `manager.ts:329` uncapped `lastToolInvokeAt`; no scene-peer cap.
656
- 8. **P3** `daq` 404s surface as 500 (`daq-controller.ts:797,838,857,862` vs `response.ts:29-47`).
657
- 9. **P3** swaggered error text: `manager.ts:2787` returns raw `err.message` to callers.
1
+ # HTTP API authz / read-path / perf audit — agents + runtime + industrial nodes
2
+
3
+ Read-only audit. Every claim cites `file:line` with verbatim code. No source file was modified.
4
+
5
+ Scope read in full: `server/api/workshop/agent-tools/**`, `agents/**`, `channels/**`, `dcw/**`, `daq/**`,
6
+ `runtime.get.ts`, `tasks.get.ts`, `mailbox.get.ts`, `caller.ts`, `server/services/workshop/scene-events.ts`,
7
+ `server/services/workshop/agents/agent-badge.ts`, plus the guards they delegate to
8
+ (`permissions.ts`, `runtime/manager.ts`, `agents/tool-approvals.ts`, `agents/node-bindings.repo.ts`,
9
+ `agents/host-tool-bridge.ts`, `agents/industrial-tools.ts`, `dcw/dcw-controller.ts`, `daq/daq-controller.ts`,
10
+ `aml/job-orchestrator.ts`, `aml/python-runtime.ts`).
11
+
12
+ ---
13
+
14
+ ## 1. AUTHZ AUDIT
15
+
16
+ ### 0. Global facts
17
+
18
+ * No global auth middleware exists. The only middleware is `server/middleware/request-log.ts:7` — logging only.
19
+ * Unmatched `/api/workshop/**` paths hit `server/api/workshop/[...path].ts:12` → static 404.
20
+ * Auth primitives (`server/api/workshop/caller.ts`):
21
+ * `resolveUser` (`:71-79`) — Bearer **user** token, else 401.
22
+ * `resolveCaller` (`:16-24`) — Bearer **agent instance** token, else 401.
23
+ * `resolveAgentOrUser` (`:45-54`) — either domain.
24
+ * `requireAdmin` (`:82-88`), `requireRole` (`:91-97`).
25
+ * Line-grant model (`server/services/workshop/permissions.ts`): `isPrivilegedRole` (`:26-28`),
26
+ `lineMode` (`:31-36`), `visibleLineIds` (`:39-42`), `filterByLine` (`:45-52`),
27
+ `requireLineMode` (`:55-62`). admin/editor bypass everything.
28
+
29
+ ### 1.1 [P0] `agent-tools/invoke.post.ts` — user token + client-supplied `agentId` = full agent impersonation
30
+
31
+ The whole handler (27 lines):
32
+
33
+ ```ts
34
+ // server/api/workshop/agent-tools/invoke.post.ts:16-27
35
+ export default defineApiHandler(async (event) => {
36
+ const agentToken = getHeader(event, 'x-aw-agent-token')
37
+ if (!agentToken) resolveUser(event) // 桥路径免用户鉴权,由 token 校验兜底
38
+ const body = await readBody<{ agentId?: string, tool?: string, args?: Record<string, unknown> }>(event) ?? {}
39
+ const agentId = String(body.agentId ?? '')
40
+ const tool = String(body.tool ?? '')
41
+ const args = body.args ?? {}
42
+ if (!agentId) throw createError({ statusCode: 400, statusMessage: 'agentId required' })
43
+ if (!tool) throw createError({ statusCode: 400, statusMessage: 'tool required' })
44
+ const result = await getWorkshopManager().invokeHostTool({ agentId, tool, args, token: agentToken || undefined })
45
+ return { result }
46
+ })
47
+ ```
48
+
49
+ Note `invoke.post.ts:18`: `resolveUser(event)`'s **return value is discarded** — the authenticated user is never
50
+ passed downstream. `agentId` comes only from the request body (`:20`).
51
+
52
+ The guard it delegates to:
53
+
54
+ ```ts
55
+ // server/services/workshop/runtime/manager.ts:2746-2752
56
+ async invokeHostTool(input: { agentId: string, token?: string, tool: string, args?: Record<string, unknown> }): Promise<{ text: string, isError?: boolean }> {
57
+ const row = this.deps.repos.channelAgents.findById(input.agentId)
58
+ if (!row || row.enabled !== 1) throw new AppError(404, 'NOT_FOUND', `agent 不存在或已停用: ${input.agentId}`)
59
+ // token 鉴权(MCP 桥路径必带;缺省视为服务端内部调用,走 REST 已有用户鉴权)
60
+ if (input.token !== undefined && input.token !== row.token) {
61
+ throw new AppError(401, 'UNAUTHORIZED', 'agent token 校验失败')
62
+ }
63
+ ```
64
+
65
+ `invoke.post.ts:25` passes `token: agentToken || undefined`. **Consequences, exactly:**
66
+
67
+ | Request | `agentToken` | `input.token` | `manager.ts:2750` | Result |
68
+ |---|---|---|---|---|
69
+ | valid **user** Bearer, **no** `x-aw-agent-token`, `agentId` = any other agent | undefined | `undefined` | `input.token !== undefined` is **false** → check **skipped** | **Executes any tool as that agent** |
70
+ | **no** `Authorization` at all, no `x-aw-agent-token` | undefined | — never reached | — | `resolveUser` at `invoke.post.ts:18` throws `AppError(401,'USER_UNAUTHORIZED')` (`caller.ts:76`) → **blocked** |
71
+ | own agent token in `x-aw-agent-token`, `agentId` = another agent | own token | own token | `!== row.token` → true | 401 — **blocked** |
72
+ | valid agent token, matching `agentId` | token | `=== row.token` | passes | legitimate |
73
+
74
+ So the hole is exactly: **valid user token + arbitrary body `agentId` + absent `x-aw-agent-token`.** No ownership,
75
+ membership or role check exists anywhere on this path. The authenticated `ResolvedUser` never reaches `manager`.
76
+
77
+ After the guard, the impersonated identity drives every downstream authorization:
78
+
79
+ ```ts
80
+ // server/services/workshop/runtime/manager.ts:2769-2775
81
+ const identity = {
82
+ agentId: row.id,
83
+ channelId: row.channelId,
84
+ role: (row.role === 'lead' ? 'lead' : 'worker') as 'lead' | 'worker',
85
+ name: row.name,
86
+ }
87
+ return await pluginTool.handler(input.args ?? {}, identity)
88
+ ```
89
+
90
+ ```ts
91
+ // server/services/workshop/runtime/manager.ts:2777-2783
92
+ const runtime = this.ensureAgentRuntime(row.channelId, input.agentId)
93
+ if (runtime) {
94
+ const viaImpl = await runtime.dispatchHostTool(input.tool, input.args ?? {})
95
+ if (viaImpl) return viaImpl
96
+ }
97
+ // 回退:impl 未实现工具面(如 mock)→ 协作工具族直调
98
+ return await this.invokeAgentWorkspaceTool(input.agentId, input.tool, input.args ?? {})
99
+ ```
100
+
101
+ `invokeHostTool` also applies **no role/tool filtering** — unlike `hostToolsForRole`
102
+ (`host-tool-bridge.ts:70-87`) it never consults `LEAD_ONLY_TOOL_NAMES` (`host-tool-bridge.ts:33-43`).
103
+ Every tool is dispatchable for any named agent that exists and is enabled.
104
+
105
+ **Which tool classes are reachable, by whom**
106
+
107
+ Reachable by *any* authenticated user token of *any* role (including a plain `user` with zero line grants):
108
+ pick any lead/worker agent id.
109
+
110
+ * **Read-only** (dispatch table `host-tool-bridge.ts:162-211` + `:219+`):
111
+ `my_industrial_nodes`, `aml_node_catalog`, `aml_dataset_stats`, `aml_job_status`, `aml_job_logs`,
112
+ `aml_leaderboard`, `aml_model_reference`, `dcw_read`, `daq_query`, `daq_frames`, `dcw_journal`, `ops_log`,
113
+ `recipe_log`, `recipe_versions`, `line_context`, `list_other_teams`, `search_other_teams_memory`,
114
+ mailbox/list-mail/memory tools.
115
+ * **Mutating / control-plane**:
116
+ * `dcw_control` — real PLC write. Its only authz is the *impersonated agent's* binding:
117
+ ```ts
118
+ // server/services/workshop/agents/industrial-tools.ts:99-108
119
+ const repo = getAgentNodeBindingRepo()
120
+ const binding: AgentNodeBinding | undefined = nodeId ? repo.find(agentId, nodeId, 'dcw') : undefined
121
+ if (!binding) {
122
+ ```
123
+ HITL applies only when `binding.mode === 'manual'` (`industrial-tools.ts:128`); with `mode:'auto'`
124
+ the write executes immediately (`industrial-tools.ts:157`).
125
+ * `recipe_update` (`host-tool-bridge.ts:207-208`), `recipe_rollback` (`:209-210`), `dcw_judge` (`:193-194`),
126
+ `dcw_rollback` (`:195-196`), `aml_dataset_build` (`:167-168`), `aml_job_cancel` (`:177-178`),
127
+ `send_cross_channel_message` (`manager.ts:2725-2734`), `dispatch_task`, `create_team_agent`,
128
+ `update_team_agent`, `remove_team_agent`, `complete_task`, `report_progress`.
129
+ * `aml_model_promote` — nominally lead-only; its check is against the **DB role of the supplied agentId**:
130
+ ```ts
131
+ // server/services/workshop/agents/industrial-tools.ts:1290-1294
132
+ // 治理硬守卫:晋升仅限 lead 实例(注入层过滤 + 分发层双重校验,HTTP 直调不可绕过)
133
+ const roleRow = getAmlRuntime().db.prepare('SELECT role FROM channel_agents WHERE id = ? AND enabled = 1').get(agentId) as { role?: string } | undefined
134
+ if (roleRow?.role !== 'lead') {
135
+ return amlErr(`aml_model_promote 为 lead 专属工具:实例 ${agentId}(role=${roleRow?.role ?? '未知'})无权晋升模型。请由团队 lead 发起,晋升需人工 HITL 批准。`)
136
+ }
137
+ ```
138
+ Naming a lead's `agentId` satisfies it (then HITL approval at `industrial-tools.ts:1316`).
139
+ * `aml_job_submit` — **arbitrary Python execution on the server host.** The tool takes up to 500 KB of code:
140
+ ```ts
141
+ // server/services/workshop/agents/industrial-tools.ts:1152-1156
142
+ if (!code.trim()) return amlErr('code 必填:train.py 全文(单文件;契约见工具说明)。')
143
+ if (code.length > 512_000) return amlErr(`code 过大(${Math.round(code.length / 1024)}KB),上限 500KB;精简训练代码(模型定义/训练循环拆薄)后重试。`)
144
+ if (!/\bimport\s+amlkit\b/.test(code)) {
145
+ ```
146
+ It is written to disk and executed:
147
+ ```ts
148
+ // server/services/workshop/aml/job-orchestrator.ts:285-287
149
+ if (typeof inline === 'string' && inline.length > 0 && inline.length <= 512_000) {
150
+ writeFileSync(join(workspace, 'train.py'), inline)
151
+ trainFile = 'train.py'
152
+ ```
153
+ ```ts
154
+ // server/services/workshop/aml/job-orchestrator.ts:328
155
+ const exit1 = await runPython(run, vpy, [join(workspace, trainFile)], workspace)
156
+ ```
157
+ No container/OS sandbox; the only mitigation is a scrubbed env
158
+ (`aml/python-runtime.ts:186-214`, `jobEnv` whitelist, "服务器 secrets … 一律不可见").
159
+ The `import amlkit` requirement is a regex (`industrial-tools.ts:1154`), trivially satisfied.
160
+ * Plugin tools: identity is the impersonated agent (`manager.ts:2769-2775`), no independent check —
161
+ e.g. `diag_run` (`server/plugins-builtin/diag-bridge/index.mjs:449-450`) exports line DAQ snapshots,
162
+ `kb_store`/`kb_index` (`server/plugins-builtin/rag-bridge/index.mjs:199,259`) mutate the knowledge base.
163
+
164
+ **Contrast with the sibling endpoint, which does it right:**
165
+
166
+ ```ts
167
+ // server/api/workshop/agent-tools/list.get.ts:17-22
168
+ if (agentToken) {
169
+ const resolved = getWorkshopManager().resolveAgentByToken(String(agentToken))
170
+ if (!resolved || resolved.agentId !== agentId) {
171
+ throw createError({ statusCode: 401, statusMessage: 'agent token 校验失败' })
172
+ }
173
+ }
174
+ ```
175
+
176
+ **Enumeration is trivial**, so no guessing is needed: `agent-tools/bindings/index.get.ts:13` returns
177
+ `{ bindings: agentId ? getAgentNodeBindingRepo().byAgent(agentId) : getAgentNodeBindingRepo().all() }` — with no
178
+ `agentId` query param, **every** binding of every agent (agentId + nodeId + kind + mode) is returned to any
179
+ authenticated user.
180
+
181
+ ⚠UNVERIFIED: I did not execute a live exploit; the conclusion is from the code paths above (all read directly).
182
+ Corroboration: the same finding is already written up at `docs/audit/audit-agents.md:186-249` ("the manager's
183
+ token check is **skipped entirely** when no token is supplied … Minimal hardening: in `invokeHostTool` change the
184
+ token check to `if (input.token !== row.token)`") — and the code is **unchanged**, i.e. unfixed.
185
+
186
+ ### 1.2 `bindings/index.post.ts` — permission check quoted; **target agent ownership NOT verified**
187
+
188
+ ```ts
189
+ // server/api/workshop/agent-tools/bindings/index.post.ts:16-39
190
+ export default defineApiHandler(async (event) => {
191
+ const user = resolveUser(event)
192
+ const body = await readBody<{ agentId?: string, nodeId?: string, kind?: 'dcw' | 'daq', mode?: 'auto' | 'manual' }>(event) ?? {}
193
+ const kind = body.kind ?? 'dcw'
194
+ const nodeId = String(body.nodeId ?? '')
195
+ // 绑定前置:节点必须存在,且用户对其所属产线有足额权限
196
+ const lineId = kind === 'daq'
197
+ ? getDaqController().byId(nodeId)?.lineId
198
+ : getDcwController().byId(nodeId)?.lineId
199
+ if (!lineId) {
200
+ throw new AppError(404, ErrorCodes.NOT_FOUND, `${kind === 'daq' ? '数采' : '写控'}节点不存在: ${nodeId}`)
201
+ }
202
+ const mode = lineMode(user, lineId)
203
+ const needOperate = kind === 'dcw'
204
+ if (mode === 'none' || (needOperate && mode !== 'operate')) {
205
+ throw new AppError(403, 'LINE_FORBIDDEN', `无该产线权限:绑定${kind === 'daq' ? '数采' : '写控'}节点需对产线「${lineId}」拥有${needOperate ? '可操控' : '仅查看'}及以上权限`)
206
+ }
207
+ const binding = getAgentNodeBindingRepo().bind(
208
+ String(body.agentId ?? ''),
209
+ nodeId,
210
+ kind,
211
+ body.mode ?? 'auto',
212
+ )
213
+ return { binding }
214
+ })
215
+ ```
216
+
217
+ The check at `:28-32` covers **the node's line only**. `body.agentId` is never resolved, never checked for
218
+ existence, never checked for ownership/membership:
219
+
220
+ ```ts
221
+ // server/services/workshop/agents/node-bindings.repo.ts:73-78
222
+ bind(agentId: string, nodeId: string, kind: AgentNodeBindingKind, mode: AgentNodeBindingMode): AgentNodeBinding {
223
+ if (!agentId) throw new AppError(400, ErrorCodes.VALIDATION_ERROR, 'agentId 必填')
224
+ if (!nodeId) throw new AppError(400, ErrorCodes.VALIDATION_ERROR, 'nodeId 必填')
225
+ if (kind !== 'dcw' && kind !== 'daq') throw new AppError(400, ErrorCodes.VALIDATION_ERROR, `未知节点类型: ${kind}`)
226
+ if (mode !== 'auto' && mode !== 'manual') throw new AppError(400, ErrorCodes.VALIDATION_ERROR, `未知控制模式: ${mode}`)
227
+ ```
228
+
229
+ Effect: **any** authenticated user with `operate` on one line can grant that control right to **any** agent id —
230
+ their own, another user's agent, or a lead in an unrelated channel — or re-bind an existing agent with
231
+ `"mode":"auto"` to strip HITL, because `bind()` updates the mode of an existing row
232
+ (`node-bindings.repo.ts:79-83`: `if (prev) { prev.mode = mode; this.flush(); return prev }`).
233
+ The granting user need not own, belong to, or even know anything about that agent.
234
+
235
+ ### 1.3 Handlers that authenticate but never authorize the resource (IDOR)
236
+
237
+ All of these call `resolveUser` and **discard the result** or use it only for logging — no ownership/role/line check:
238
+
239
+ | Handler | Auth | Missing check | Impact |
240
+ |---|---|---|---|
241
+ | `agent-tools/bindings/[id].patch.ts:10-13` | `resolveUser(event)` (`:10`) | owner / role / line | Any user flips **any** binding's mode: `getAgentNodeBindingRepo().setMode(id, body.mode ?? 'auto')` → `"auto"` **disables HITL** for another team's writes (`node-bindings.repo.ts:97-104`) |
242
+ | `agent-tools/bindings/[id].delete.ts:11-17` | `resolveUser(event)` (`:11`) | owner / role / line | Any user unbinds any agent↔node pair (`:17 !repo.unbind(id)`), also cancels that agent's pending approvals (`:19 getToolApprovals().cancelPendingFor(...)`) |
243
+ | `agent-tools/bindings/index.get.ts:10-13` | `resolveUser(event)` (`:10`) | any scope filter | Full cross-tenant binding dump (see 1.1) |
244
+ | `agent-tools/approvals/index.get.ts:11-16` | `resolveUser(event)` (`:11`) | ownership of `agentId` | Any user lists pending approvals of any agent: `getToolApprovals().listPending(agentId)`; history via `scope=history` |
245
+ | `agent-tools/list.get.ts:13-23` | user token path (`:13`) | `agentId` ownership | Tool-schema disclosure for any agent |
246
+ | `dcw/[id]/read.post.ts:13-16` | `resolveUser(event)` (`:13`) | **`requireLineMode` absent** | Any user triggers a real driver read on **any** dcw node id: `await getDcwController().readNow(id)` (`:16`) — cross-line data read |
247
+ | `dcw/[id].patch.ts:12-16` | `resolveUser(event)` (`:12`) | role / line | Any user patches **any** dcw node: name/driver/range/enabled/position — `getDcwController().patch(id, body)` (`:16`). Widening `min/max` weakens the write interlock that `dcw_control` depends on |
248
+ | `dcw/index.post.ts:13-16` | `resolveUser(event)` (`:13`) | role / line | Any user creates a write-control node (the comment at `:17` calls it "获得直写物理设备能力的入口") |
249
+ | `dcw/lines/[id].delete.ts:15-21` | `resolveUser(event)` (`:15`) | role / line | Any user deletes **any** line; `?purge=1` cascades nodes/products/recipes (`:19-21`). The sibling create is admin/editor-gated (`dcw/lines/index.post.ts:14`) |
250
+ | `dcw/lines/[id].patch.ts:11-14` | `resolveUser(event)` (`:11`) | role / line | Any user renames/recolors any line |
251
+ | `dcw/recipes/[id].delete.ts:10-12` | `resolveUser(event)` (`:10`) | role | Any user deletes any recipe |
252
+ | `dcw/recipes/index.post.ts:11-13` | `resolveUser(event)` (`:11`) | role | Any user creates recipes |
253
+ | `dcw/recipes/[id]/index.patch.ts:12` , `[id]/revert.post.ts:12` | `resolveUser` | role | Any user edits/rewrites any recipe version history |
254
+ | `dcw/products/[id].delete.ts:11-14`, `[id].patch.ts:12-16` | `resolveUser` | role | Any user deletes/edits any product (create requires admin/editor, `products/index.post.ts:12`) |
255
+ | `dcw/runs/[id]/close.post.ts:11-14` | `resolveUser(event)` (`:11`) | role | Any user closes any production run window |
256
+ | `dcw/templates/index.post.ts:11-13`, `[key].patch.ts:11-14`, `[key].delete.ts:10-12` | `resolveUser` | role | Any user mutates control templates (driver configs) |
257
+ | `dcw/test-driver.post.ts:12-15` | `resolveUser(event)` (`:12`) | role | Any user makes the server open outbound connections with a caller-supplied `driverConfig`: `getDcwController().testDriver(body.driver ?? 'mock', body.driverConfig ?? {})` |
258
+ | `daq/test-driver.post.ts:17-21` | `resolveUser(event)` (`:17`) | role | Same SSRF-ish connect primitive for DAQ protocols |
259
+ | `daq/[id]/test.post.ts:12-15` | `resolveUser(event)` (`:12`) | **`requireLineMode` absent** | Any user triggers a real connection test on any DAQ node (`:15 testNode(id)`); the dcw twin requires `operate` (`dcw/[id]/test.post.ts:16`) |
260
+ | `daq/[id].delete.ts:13-17` | `resolveUser(event)` (`:13`) | **`requireLineMode` absent** | Any user deletes any DAQ node; the patch twin requires `operate` (`daq/[id].patch.ts:19`) |
261
+ | `daq/infra/reconnect.post.ts:9-15` | `resolveUser(event)` (`:9`) | role | Any user triggers infra bring-up: `await apply(daqInfraConfig())` → `__daqApplyInfra` runs `docker compose -f … up -d …` (`server/services/workshop/daq/infra.ts:85`) |
262
+ | `daq/alarms.get.ts:11-15` | `resolveUser(event)` (`:11`) | line filter | Any user reads **all** alarms of **all** lines (`:15 listAlarms(scope, limit)`); `daq/index.get.ts:27` filters by line, this one does not |
263
+ | `daq/templates/*` (`index.post.ts:12`, `[key].patch.ts:12`, `[key].delete.ts:12`) | `resolveUser` | role | Any user mutates signal templates |
264
+ | `dcw/journal/index.get.ts:11-19` | `resolveUser(event)` (`:11`) | line scope | Any user reads the full parameter ledger for any `lineId`/`nodeId` supplied in the query |
265
+ | `dcw/[id]/param-ledger.get.ts:11-13` | `resolveUser(event)` (`:11`) | **`requireLineMode` absent** | Any user reads any node's setpoints/targets/last-good values |
266
+ | `dcw/optimizations/index.get.ts:11-21`, `[id].get.ts:11-16`, `[id]/series.get.ts:12-17` | `resolveUser` | line scope | Any user reads any line's optimization records + raw DAQ series |
267
+ | `dcw/recipes/index.get.ts:9-11` | `resolveUser(event)` (`:9`) | line scope | Returns `repo.list()`/`listRuns()` with **no** `visibleLineIds` filter (contrast `dcw/index.get.ts:29-30`, `dcw/runs/index.get.ts:12`) |
268
+ | `dcw/recipes/[id]/versions.get.ts:11-13` | `resolveUser` | line scope | Any user reads any recipe's full parameter version history |
269
+ | `server/api/workshop/runtime.get.ts:9-10` | `resolveUser(event)` (`:9`) | role | Any user enumerates wired harness agent ids + active channels |
270
+ | `server/api/workshop/daq/infra.get.ts:9` | `resolveUser` | role | Infra status disclosure (low) |
271
+
272
+ ### 1.4 Handlers that ARE correctly guarded (control set)
273
+
274
+ * `agents/[id].get.ts:16-17` → `manager.requireTemplateReadable`; `agents/[id].patch.ts:28`, `[id].delete.ts:17` → `requireWritable` (`manager.ts:1083-1090`).
275
+ * `channels/[id].delete.ts:14-15`, `index.patch.ts:35-36`, `agents/index.post.ts:32-33`, `agents/[agentId].delete.ts:17-18`, `[agentId].patch.ts:18-19`, `model.patch.ts:20-21`, `position.patch.ts:19-20`, `range.patch.ts:19-20`, `stop.post.ts:18-19` → `getChannelForUser` + `requireWritable` + membership check (`manager.ts:1103-1110`, `:1067-1074`).
276
+ * `channels/[id]/messages/index.post.ts:38-39`, `tasks/index.post.ts:67-68`, `tasks/index.get.ts:22`, `queue.get.ts:17`, `events.get.ts:28`, `terminals.get.ts:19`, `messages/index.get.ts:21`, `channels/[id]/index.get.ts:13` → `getChannelForUser` (owner-or-legacy-public read).
277
+ * Memory planes: `channels/[id]/memories/**` and `channels/[id]/agents/[agentId]/memories/**` → `resolveAgentOrUser` + same-channel or `getChannelForUser`+`requireOwned`, and the manager re-checks role: `manager.ts:1508` (`仅本人或 lead 可策展 Agent 记忆`), `:1463` (`仅 lead 可写团队记忆`), `:1487`, `:1548`.
278
+ ⚠ Note (by design, not a bug): `manager.searchAgentMemories` (`manager.ts:1441-1446`) only calls `requireMember(channelId, callerAgentId)` — **any teammate agent in the channel can search another agent's private memory** by passing that agent's id in the URL with `scope:'private'`.
279
+ * `agents/subscribe.post.ts:17-19` → `resolveCaller` + `manager.subscribe` → `requireMember` + same-channel target check (`manager.ts:2884-2893`).
280
+ * `tasks.get.ts:11-12` / `mailbox.get.ts:10-13` → `resolveCaller`, scope forced to `caller.channelId`/`caller.id`.
281
+ * Role-gated: `dcw/controller.post.ts:15`, `dcw/[id].delete.ts:14`, `dcw/lines/index.post.ts:14`, `dcw/journal/node/[nodeId]/rollback.post.ts:15`, `dcw/optimizations/[id]/judge.post.ts:15`, `[id]/rollback.post.ts:17`, `dcw/products/index.post.ts:12`, `dcw/recipes/[id]/apply.post.ts:15`, `[id]/mark-good.post.ts:13`, `[id]/rollback-good.post.ts:13`, `dcw/runs/[id]/rollback.post.ts:14`, `daq/controller.post.ts:29,49`, `daq/index.post.ts:16` (all `requireRole`/`gateDangerous`).
282
+ * `agent-tools/approvals/[id]/decide.post.ts:12-19` — `resolveUser` **used** (decider recorded + `audit`).
283
+
284
+ ### 1.5 `requireLineMode` / `lineMode` audit for daq/dcw handlers
285
+
286
+ **Called (correct):**
287
+
288
+ | Handler | Line | Quote |
289
+ |---|---|---|
290
+ | `dcw/[id]/write.post.ts` | `:19` | `requireLineMode(user, getDcwController().byId(id)?.lineId, 'operate')` |
291
+ | `dcw/[id]/test.post.ts` | `:16` | `requireLineMode(user, getDcwController().byId(id)?.lineId, 'operate')` |
292
+ | `dcw/[id]/bind.post.ts` | `:16` | `requireLineMode(user, getDcwController().byId(id)?.lineId, 'operate')` |
293
+ | `dcw/[id]/bindings.put.ts` | `:17` | `requireLineMode(user, getDcwController().byId(id)?.lineId, 'operate')` |
294
+ | `dcw/lines/[id]/start.post.ts` | `:20` | `requireLineMode(user, id, 'operate')` |
295
+ | `dcw/lines/[id]/stop.post.ts` | `:20` | `requireLineMode(user, id, 'operate')` |
296
+ | `dcw/runs/[id]/data.get.ts` | `:18` | `requireLineMode(user, run?.lineId, 'readonly')` |
297
+ | `daq/[id].patch.ts` | `:19` | `requireLineMode(user, getDaqController().byId(id)?.lineId, 'operate')` |
298
+ | `daq/[id]/bind.post.ts` | `:18`, `daq/[id]/bindings.put.ts:18` | `requireLineMode(user, getDaqController().byId(id)?.lineId, 'operate')` |
299
+ | `daq/[id]/samples.get.ts` | `:16`, `daq/[id]/frames.get.ts:16`, `daq/[id]/frames/content.get.ts:17` | `requireLineMode(user, getDaqController().byId(id)?.lineId, 'readonly')` |
300
+ | `daq/alarms/[id]/ack.post.ts` | `:17` | `requireLineMode(user, alarmNodeId ? getDaqController().byId(alarmNodeId)?.lineId : undefined, 'operate')` |
301
+ | `dcw/index.get.ts` | `:18-36` | `visibleLineIds` + `filterByLine` (+ per-line `.filter`) |
302
+ | `dcw/lines/index.get.ts` | `:15-18`, `dcw/line/query.get.ts:18-21`, `dcw/runs/index.get.ts:12`, `daq/index.get.ts:27` | `visibleLineIds`/`filterByLine`; `dcw/line/query.get.ts:19-21` throws `403 LINE_FORBIDDEN` when `lineId` is outside the visible set |
303
+ | `agent-tools/bindings/index.post.ts` | `:28-32` | `lineMode(user, lineId)` (node line only — see 1.2) |
304
+
305
+ **NOT called, where a line-scoped resource is addressed** (all cited in §1.3 with their guards):
306
+ `dcw/[id]/read.post.ts` (no line check on a real driver read — worst of these),
307
+ `dcw/[id].patch.ts`, `dcw/[id]/param-ledger.get.ts`, `dcw/journal/index.get.ts`,
308
+ `dcw/optimizations/index.get.ts`, `dcw/optimizations/[id].get.ts`, `dcw/optimizations/[id]/series.get.ts`,
309
+ `dcw/recipes/index.get.ts`, `dcw/recipes/[id]/versions.get.ts`, `dcw/recipes/[id].delete.ts`,
310
+ `dcw/recipes/[id]/index.patch.ts`, `dcw/recipes/[id]/revert.post.ts`, `dcw/products/[id].patch.ts`,
311
+ `dcw/products/[id].delete.ts`, `dcw/runs/[id]/close.post.ts`, `dcw/lines/[id].patch.ts`,
312
+ `dcw/lines/[id].delete.ts`, `dcw/index.post.ts`, `dcw/templates/*`,
313
+ `daq/[id].delete.ts`, `daq/[id]/test.post.ts`, `daq/alarms.get.ts`, `daq/templates/*`,
314
+ `daq/test-driver.post.ts`, `dcw/test-driver.post.ts`.
315
+
316
+ ---
317
+
318
+ ## 2. READ-PATH WRITES (`*.get.ts` that mutate)
319
+
320
+ | GET handler | Write / side effect | Quote |
321
+ |---|---|---|
322
+ | `server/api/workshop/daq/index.get.ts:22` | **DB insert + runtime creation + 250 ms timer**: `provisionLegacyTwins()` → `this.repo.insert(node)` | `ctrl.provisionLegacyTwins()` (`index.get.ts:22`); `daq-controller.ts:1142-1159`: `provisionLegacyTwins(): void {` … `this.repo.insert(node)` (`:1157`) … `this.syncRuntimes()` (`:1159`); `ensureLoop()` at `:1143` starts `this.timer = setInterval(() => this.sweep(), 250)` (`:191`) |
323
+ | `server/api/workshop/daq/index.get.ts:20` | Pipeline power-on: queue consumer + TSDB init | `await Promise.all([tsdbReady, getDaqQueue()])` (`:20`); comment `:18` `// ws.ts 出口装配 + 管线上电(幂等;路由模块加载即绑定)` |
324
+ | `server/api/workshop/daq/[id]/samples.get.ts:23` (via `:16` guard) | **Starts acquisition**: `samples()` → `ensureLoop()` | route `:23 const points = await getDaqController().samples(id, {...})`; `daq-controller.ts:793-795`: `async samples(id, opts) {` / `this.ensureLoop()` / `await tsdbReady` |
325
+ | `server/api/workshop/daq/[id]/frames.get.ts:20` | same | route `:20 const frames = await getDaqController().frames(id, {...})`; `daq-controller.ts:835 this.ensureLoop()` |
326
+ | `server/api/workshop/daq/[id]/frames/content.get.ts:23` | same | route `:23 const { data, mime } = await getDaqController().frameContent(...)`; `daq-controller.ts:854 this.ensureLoop()` |
327
+ | `server/api/workshop/channels/[id]/index.get.ts:16` | **Assembles lead runtime + starts SchedulerLoop (timer + loop resubmit callback)** | `ensureLeadSchedulerLoop(manager, channelId)` (`:16`), comment `:15` `// 兜底:详情请求时确保 lead 的调度循环已装配(如启动恢复遗漏)`; → `plugins/workshop.ts:73 manager.ensureChannelActive(channelId, options)` → `manager.ts:697-719` `const cr = this.ensureChannelRuntime(channelId)` … `cr.scheduler = loop` / `loop.start()` ⚠(whether `wireMember` immediately spawns a harness subprocess was not traced) |
328
+ | `server/api/workshop/dcw/index.get.ts:13`, `dcw/lines/index.get.ts:12`, `dcw/line/query.get.ts:15`, `dcw/runs/[id]/data.get.ts:14` | Global binding mutation: repoints the controller's broadcast sink each request | `bindDcwBroadcast(broadcastSceneEvent)` → `dcw-controller.ts` `setBroadcast(fn)`; `daq/index.get.ts:19`, `dcw/[id]/read.post.ts:14` etc. use `bindDaqHost(broadcastSceneEvent)` |
329
+ | `server/api/workshop/dcw/index.get.ts:32` | Over-fetch then JS trim (not a write, but a read amplification) | `ctrl.listHistory(400).filter(h => inLine(nodeLine(h.nodeId))).slice(0, 60)` |
330
+
331
+ **Purely read-only GETs (verified line by line):** `agent-tools/list.get.ts`, `agent-tools/approvals/index.get.ts`,
332
+ `agent-tools/bindings/index.get.ts`, `agents/index.get.ts`, `agents/[id].get.ts`,
333
+ `channels/[id]/events.get.ts`, `channels/[id]/queue.get.ts`, `channels/[id]/tasks/index.get.ts`,
334
+ `channels/[id]/terminals.get.ts` (`harness-terminal.ts:451-466` pure map over a Map),
335
+ `channels/[id]/messages/index.get.ts`, `channels/[id]/agents/index.get.ts`,
336
+ `channels/[id]/memories/index.get.ts`, `channels/[id]/agents/[agentId]/memories/index.get.ts`,
337
+ `channels/[id]/plugins/index.get.ts`, `dcw/index.get.ts` (only the binding call above),
338
+ `dcw/lines/index.get.ts`, `dcw/line/query.get.ts`, `dcw/recipes/index.get.ts`, `dcw/recipes/[id]/versions.get.ts`,
339
+ `dcw/runs/index.get.ts`, `dcw/runs/[id]/data.get.ts` (`dcw-controller.ts:964-999` queries only),
340
+ `dcw/journal/index.get.ts` (`recipe-rollback-manager.ts:652-654`), `dcw/[id]/param-ledger.get.ts` (`:627-649`),
341
+ `dcw/optimizations/index.get.ts` (`:656-658`), `dcw/optimizations/[id].get.ts`,
342
+ `dcw/optimizations/[id]/series.get.ts` (`:602-623` read-only), `daq/alarms.get.ts` (`daq-controller.ts:600-604`),
343
+ `daq/infra.get.ts`, `runtime.get.ts` (`manager.ts:803-808`), `tasks.get.ts`, `mailbox.get.ts`
344
+ (`manager.ts:2834-2840`; the query has no LIMIT — see §3).
345
+
346
+ Note the memory list GET `channels/[id]/agents/[agentId]/memories/index.get.ts:28` calls `manager.listMemories`
347
+ which is a pure read (`manager.ts:1421-1426`).
348
+
349
+ ---
350
+
351
+ ## 3. UNBOUNDED STATE + PERF
352
+
353
+ ### 3.1 Module-level maps/sets/arrays in scope
354
+
355
+ 1. **`server/api/workshop/caller.ts:122` — unbounded, no eviction.**
356
+ ```ts
357
+ const nameCache = new Map<string, { name: string | null, at: number }>()
358
+ ```
359
+ Writes (all writes in the file):
360
+ ```ts
361
+ // caller.ts:124-134
362
+ const hit = nameCache.get(userId)
363
+ if (hit && Date.now() - hit.at < 60_000) return hit.name
364
+ ...
365
+ nameCache.set(userId, { name, at: Date.now() })
366
+ ```
367
+ The 60 s TTL is consulted only when the **same** key is read again; there is **no eviction found** (no sweep,
368
+ no size cap, no `delete`). Every distinct `ownerUserId` ever rendered by `withOwnerNames` stays for the process
369
+ lifetime. `withOwnerNames` (`caller.ts:105-119`) creates a per-call `Map` (`:106`) which is request-scoped (fine).
370
+ 2. **`server/services/workshop/scene-events.ts:20-27` — unbounded, no cap.**
371
+ ```ts
372
+ const g = globalThis as typeof globalThis & {
373
+ __sceneEventPeers?: Set<WsPeer>
374
+ }
375
+
376
+ /** 在线 peer 注册表(ws 路由 sub 成功时登记,断开/退订移除) */
377
+ function peers(): Set<WsPeer> {
378
+ return g.__sceneEventPeers ??= new Set()
379
+ }
380
+ ```
381
+ Write: `scene-events.ts:50-52 export function registerScenePeer(peer: WsPeer): void { peers().add(peer) }`.
382
+ Full analysis in §5.
383
+ 3. **`server/services/workshop/runtime/manager.ts:329` — in the invoke path, unbounded, no eviction.**
384
+ ```ts
385
+ private readonly lastToolInvokeAt = new Map<string, number>()
386
+ ```
387
+ Writes: `manager.ts:2757 this.lastToolInvokeAt.set(input.agentId, Date.now())` (every `invokeHostTool` call);
388
+ reads: `manager.ts:704 toolActivityOf: (agentId: string) => this.lastToolInvokeAt.get(agentId) ?? null`.
389
+ No `delete`/cap → one entry per distinct agentId ever invoked, forever (small, but unbounded and attacker-reachable
390
+ via §1.1, e.g. spraying `agentId` values that exist).
391
+ 4. **`server/services/workshop/agents/tool-approvals.ts:37-43` — bounded.**
392
+ ```ts
393
+ private pending = new Map<string, { approval: ToolApproval, resolve: ..., timer: NodeJS.Timeout }>()
394
+ ...
395
+ private history: ToolApproval[] = []
396
+ ```
397
+ Eviction exists: timeout deletes (`:75 this.pending.delete(approval.id)`), decide deletes (`:92`),
398
+ cancel deletes (`:117`), history capped (`:162 if (this.history.length > HISTORY_CAP) this.history.splice(HISTORY_CAP)`).
399
+ 5. `scene-events.ts` per-peer visible-lines is stashed on the peer object (`:35`), no separate collection.
400
+ 6. Request-scoped only (not leaks): `harnesses.get.ts:18`, `channels/[id]/plugins/index.put.ts:30`,
401
+ `channels.post.ts:51`, `daq/alarms/[id]/ack.post.ts` (no map), `ws.ts:188 peerBudget = new WeakMap(...)` (GC-safe).
402
+ `harness-terminal.ts` `sessions` Map has a sweep — `harness-terminal.ts:469-479 sweepTerminalSessions(...)`
403
+ (`sessions.delete(pid)`), invoked from `manager.ts:816`.
404
+
405
+ ### 3.2 Full-table fetch + JS filtering
406
+
407
+ * `server/api/workshop/dcw/index.get.ts:29-36` — five full arrays filtered in JS:
408
+ `recipes: visible ? ctrl.listRecipes().filter(r => inLine(r.lineId)) : ctrl.listRecipes()`, likewise `runs`,
409
+ `products`, `lines`, `lineStates`.
410
+ * `server/api/workshop/dcw/index.get.ts:31-33` — **N+1 in JS**: `ctrl.listHistory(400).filter(h => inLine(nodeLine(h.nodeId))).slice(0, 60)`
411
+ where `nodeLine = (nodeId: string): string | undefined => ctrl.byId(nodeId)?.lineId` (`:22`) and
412
+ `byId` is a linear scan: `dcw-node.repo.ts:40-42 byId(id: string): DcwNode | undefined { return this.list.find(n => n.id === id) }`
413
+ → up to 400 × nodeCount comparisons per request.
414
+ * `server/api/workshop/agent-tools/bindings/index.get.ts:13` — `getAgentNodeBindingRepo().all()` returns the whole JSON list (`node-bindings.repo.ts:48-50`).
415
+ * `server/api/workshop/dcw/recipes/index.get.ts:11` — `{ recipes: repo.list(), runs: repo.listRuns() }`, no filter/limit.
416
+ * `server/api/workshop/channels/[id]/tasks/index.get.ts:23` — `taskEngineOf(manager).list(channelId)` →
417
+ `task.repo.ts:67 SELECT ${COLS} FROM tasks WHERE channel_id = ? ORDER BY createdAt ASC, rowid ASC` — **no LIMIT**; every task row of the channel is returned.
418
+ * `server/api/workshop/mailbox.get.ts:12-13` — client `limit` (uncapped) then fetch-all-and-slice:
419
+ `manager.ts:2834-2839 pollMailbox(...) { this.requireMember(...); return this.deps.repos.messages.listPendingByChannelAgent(channelId, callerAgentId).slice(0, limit).map(rowToMessage) }` — the repo query at that call site passes no limit (`message.repo.ts:91-95` has a `LIMIT ?` variant, unused here).
420
+ * `manager.ts:1552 listByAgent(targetAgentId, 10_000)` (delete memory path) and
421
+ `manager.ts:1489 listByAgentChannel(channelId, TEAM_AGENT_ID, 1_000_000)` (delete team memory) — huge limits.
422
+ * Member lookups fetch the whole roster then search: `channels/[id]/agents/[agentId].patch.ts:20-21`,
423
+ `[agentId].delete.ts:19-20`, `[agentId]/stop.post.ts:20-21`, `model.patch.ts:22-23`, `position.patch.ts:21-22`,
424
+ `range.patch.ts:21-22` all do `const members = await manager.listChannelAgents(channelId)` + `.some(...)`/`.find(...)`.
425
+ * `dcw/line/query.get.ts:26` → `dcw-controller.ts:888 getDaqNodeRepo().all().filter(...)`, then one TSDB round trip.
426
+ * `dcw/runs/[id]/data.get.ts:19` → `dcw-controller.ts:979-986`: `getDaqNodeRepo().all().filter(...)` then
427
+ `await Promise.all(lineNodes.map(async (node) => ... getTsdb().query(node.id, ...)))` — one TSDB query **per node**
428
+ (documented as intentional at `:977`).
429
+ * `channels/[id]/agents/[agentId]/model.patch.ts:34` — `for (const a of repo.listAll())` full asset list per request.
430
+ * `agents/index.get.ts:12` → `withOwnerNames(templates)` does one user lookup per template, 60 s-cached, never evicted (`caller.ts:105-135`).
431
+
432
+ ### 3.3 Limits
433
+
434
+ Huge / unbounded as passed from the route:
435
+
436
+ * `mailbox.get.ts:12-13` — no upper bound: `const limit = Number.parseInt(url.searchParams.get('limit') ?? '50', 10)` … `limit > 0 ? limit : 50`.
437
+ * `channels/[id]/tasks/index.get.ts:23` — no limit parameter at all.
438
+ * `dcw/index.get.ts:32` — `listHistory(400)` (then slices to 60).
439
+ * `dcw/line/query.get.ts:35`, `dcw/[id]/param-ledger.get.ts` (`limit: 30`/`20` internal), `dcw/[id]/samples`:
440
+ `limit: num(q.limit)` passed raw, clamped only downstream at the adapter:
441
+ `timescale.adapter.ts:109 const limit = Math.min(opts.limit ?? 500, 5000)` / `:157 Math.min(q.limit ?? 2000, 10_000)`;
442
+ `sqlite.adapter.ts:128`, `:182` identical.
443
+ * Properly capped: `audit.get.ts:15 Math.min(500, Math.max(1, Number(q.limit) || 100))`,
444
+ `dcw/journal/index.get.ts:18 Math.min(limit, 500)`, `dcw/optimizations/index.get.ts:20`, `events.get.ts:18 limit: z.coerce.number().int().min(1).max(1000)`,
445
+ `messages/index.get.ts:13 max(500)`, `daq/alarms.get.ts:14 Math.min(500, ...)`, `daq/[id]/frames` clamp at
446
+ `daq-controller.ts:849 Math.min(Math.max(opts.limit ?? 100, 1), 1000)`, `manager.listChannelMail` `Math.min(500, ...)` (`manager.ts:2874`).
447
+
448
+ ---
449
+
450
+ ## 4. ERROR PROPAGATION
451
+
452
+ ### 4.1 Swallowed errors that hide failures
453
+
454
+ * `server/api/workshop/caller.ts:127-132` — user-name resolution failure is invisible:
455
+ ```ts
456
+ try {
457
+ name = userRepository.findById(userId)?.name ?? null
458
+ }
459
+ catch {
460
+ name = null
461
+ }
462
+ ```
463
+ `withOwnerNames` then renders `ownerName: null` (`caller.ts:113-118`) with no log — a broken `users.sqlite`
464
+ looks like "no owner" in every list that uses it (`agents/index.get.ts:12`).
465
+ * `server/api/workshop/caller.ts:28-33` — `resolveCallerOrNull` swallows every error including 401:
466
+ ```ts
467
+ try {
468
+ return resolveCaller(event)
469
+ }
470
+ catch {
471
+ return null
472
+ }
473
+ ```
474
+ Consumed at `channels/[id]/agents/index.get.ts:20-23`, where a genuine failure of the user path is silently
475
+ downgraded to the agent-token path.
476
+ * `server/api/workshop/audit.get.ts:24-29` — corrupt audit detail is silently replaced by `{}`:
477
+ ```ts
478
+ try {
479
+ detail = JSON.parse(String(r.detailJson ?? '{}'))
480
+ }
481
+ catch {
482
+ detail = {}
483
+ }
484
+ ```
485
+ * `server/api/workshop/dcw/[id].delete.ts:18` — `const body = await readBody<{ approvalId?: string }>(event).catch(() => ({})) ?? {}` (deliberate, DELETE-with-empty-body).
486
+ * Sanctioned-but-opaque fire-and-forget in the memory write paths: `manager.ts:1478`,
487
+ `manager.ts:1515-1521`, `manager.ts:1540` — `void vectorizeMemory(...).catch(() => {})` and
488
+ `.then(...).catch(() => {})` (vectorization failures never surface).
489
+ * `server/services/workshop/permissions.ts:70` and `:76` — `}).catch(() => {})` on both broadcast paths
490
+ (`broadcastSceneEvent('permissions.changed')`, `emitPluginEvent('permissions:changed')`): a failed permission-change
491
+ broadcast means clients keep stale grants with no log.
492
+ * `server/services/workshop/scene-events.ts:74-79` — send failures delete the peer silently (see §5).
493
+ * `server/services/workshop/daq/daq-controller.ts:1189` — `.catch(() => {})` on queue start;
494
+ `dcw-controller.ts:836` — `.catch(() => {})` on `markLineOffline`.
495
+
496
+ ### 4.2 Internal error messages returned to the client (info leak)
497
+
498
+ * `server/services/workshop/runtime/manager.ts:2785-2788` — raw internal `Error.message` is returned to the HTTP
499
+ caller as tool output (this is the endpoint of §1.1):
500
+ ```ts
501
+ catch (err) {
502
+ const reason = err instanceof Error ? err.message : String(err)
503
+ return { text: `工具「${input.tool}」调用失败: ${reason}`, isError: true }
504
+ }
505
+ ```
506
+ e.g. SQLite constraint text, filesystem paths from `saveJsonFileAtomic`, driver/Modbus errors.
507
+ * `server/api/workshop/ws.ts:739` — `message: error instanceof Error ? error.message : 'workshop 未初始化'` is sent
508
+ to the client in an `error` control frame.
509
+ * Generic 500 path is clean: `server/utils/response.ts:44-46` logs the error and returns
510
+ `{ code: 'INTERNAL_ERROR', message: '服务器内部错误' }` — no stack, no message.
511
+
512
+ ### 4.3 Status-code mis-mapping (failures reported as 500)
513
+
514
+ `server/api/workshop/daq/[id]/samples.get.ts` / `frames.get.ts` / `frames/content.get.ts` call controller methods
515
+ that throw a **plain** `Error` carrying a non-standard `status` property:
516
+
517
+ ```ts
518
+ // server/services/workshop/daq/daq-controller.ts:797
519
+ if (!node) throw Object.assign(new Error(`数采节点不存在: ${id}`), { status: 404 })
520
+ ```
521
+ ```ts
522
+ // server/services/workshop/daq/daq-controller.ts:857, :862
523
+ if (!node) throw Object.assign(new Error(`数采节点不存在: ${id}`), { status: 404 })
524
+ ...
525
+ if (!row || row.kind !== 'image') throw Object.assign(new Error(`帧不存在: ${id}@${tsMs}`), { status: 404 })
526
+ ```
527
+
528
+ `defineApiHandler` only honors `AppError` (`response.ts:30-33`) and `H3Error` (`:34-43`); a plain `Error` falls to
529
+ `console.error('[api] unhandled error:', error)` + HTTP 500 (`response.ts:44-46`). So "node not found" surfaces to
530
+ the UI as a 500, and the internal process is logged as an unhandled error.
531
+
532
+ ---
533
+
534
+ ## 5. SCENE EVENTS (`server/services/workshop/scene-events.ts`)
535
+
536
+ **Subscriber tracking** — a `globalThis`-backed `Set` of duck-typed peers:
537
+
538
+ ```ts
539
+ // scene-events.ts:14-18
540
+ interface WsPeer {
541
+ send(data: string | Uint8Array): void
542
+ close(code?: number, reason?: string): void
543
+ }
544
+ ```
545
+ ```ts
546
+ // scene-events.ts:20-27
547
+ const g = globalThis as typeof globalThis & {
548
+ __sceneEventPeers?: Set<WsPeer>
549
+ }
550
+
551
+ /** 在线 peer 注册表(ws 路由 sub 成功时登记,断开/退订移除) */
552
+ function peers(): Set<WsPeer> {
553
+ return g.__sceneEventPeers ??= new Set()
554
+ }
555
+ ```
556
+
557
+ **Subscribe path** (only after user auth; a per-peer line-visibility set is stamped on the peer object):
558
+
559
+ ```ts
560
+ // server/api/workshop/ws.ts:174-177
561
+ function attachScenePeer(peer: WsPeer, user: { id: string, role: string }): void {
562
+ setPeerVisibleLines(peer, visibleLineIds(user))
563
+ registerScenePeer(peer)
564
+ }
565
+ ```
566
+ ```ts
567
+ // scene-events.ts:34-36
568
+ export function setPeerVisibleLines(peer: WsPeer, visible: Set<string> | null): void {
569
+ (peer as WsPeer & { __awVisibleLines?: Set<string> | null }).__awVisibleLines = visible
570
+ }
571
+ ```
572
+ ```ts
573
+ // scene-events.ts:50-52
574
+ export function registerScenePeer(peer: WsPeer): void {
575
+ peers().add(peer)
576
+ }
577
+ ```
578
+ Call sites: `ws.ts:176` only (grep: `registerScenePeer` appears in `scene-events.ts:50` and `ws.ts:176`).
579
+
580
+ **Unsubscribe path — exists, on socket close and error:**
581
+
582
+ ```ts
583
+ // server/api/workshop/ws.ts:753-762
584
+ close(peer) {
585
+ unsubscribePeer(peer)
586
+ unregisterScenePeer(peer)
587
+ },
588
+
589
+ error(peer, error) {
590
+ console.error('[workshop-ws] connection error:', error)
591
+ unsubscribePeer(peer)
592
+ unregisterScenePeer(peer)
593
+ },
594
+ ```
595
+ ```ts
596
+ // scene-events.ts:54-56
597
+ export function unregisterScenePeer(peer: WsPeer): void {
598
+ peers().delete(peer)
599
+ }
600
+ ```
601
+
602
+ **Max subscriber count: NONE.** There is no cap anywhere — grep for `__sceneEventPeers` yields only `scene-events.ts:21,26`;
603
+ `registerScenePeer` (`:50-52`) performs an unconditional `add` with no size check, and `sceneEventPeerCount()`
604
+ (`:58-60`) is exported but never called by any handler (grep: only its own declaration).
605
+
606
+ **Dead-subscriber removal (two mechanisms, both partial):**
607
+
608
+ 1. Close/error hooks above.
609
+ 2. Lazy removal when a send throws:
610
+ ```ts
611
+ // scene-events.ts:72-80
612
+ for (const peer of peers()) {
613
+ if (lineId !== undefined && !peerSeesLine(peer, lineId)) continue
614
+ try {
615
+ peer.send(frame)
616
+ }
617
+ catch {
618
+ peers().delete(peer)
619
+ }
620
+ }
621
+ ```
622
+ same pattern in `broadcastPeerEvent` (`:92-99`).
623
+
624
+ **Can a subscriber leak? Yes — with the caveat that the primary paths are covered.**
625
+ * The removal depends entirely on the ws route's `close`/`error` hooks firing (`ws.ts:753-762`). There is **no
626
+ heartbeat/liveness timeout and no size cap** in the scene-peer set itself: a peer whose `send()` never throws
627
+ (e.g. half-open TCP where the write lands in the kernel buffer) and whose close hook never fires stays registered
628
+ for the process lifetime. The slow-consumer guard at `ws.ts:199-206` (`peer.close(1013, 'slow consumer')` +
629
+ `stream.peers.delete(peer)`) exists but only bounds *stream* fan-out, and relies on that same close hook to reach
630
+ `unregisterScenePeer`.
631
+ * The registry lives on `globalThis` (`scene-events.ts:20-22`) while peers are created per module instance, so any
632
+ module re-evaluation (dev HMR / nitro re-import) keeps the old peer objects in the same Set until their close hook
633
+ fires; nothing prunes stale entries.
634
+ * Broadcast cost is unbounded per frame: `broadcastSceneEvent` (`:66-81`) serializes once (`:71`) then loops all
635
+ peers and `send`s synchronously — with N pages open, every scene event costs N sends (by design per the comment at
636
+ `:62-65`), so a subscriber-count leak degrades CPU linearly with no ceiling.
637
+
638
+ ---
639
+
640
+ ## Priority summary
641
+
642
+ 1. **P0** `agent-tools/invoke.post.ts:18+25` + `manager.ts:2750` — any user token + arbitrary `agentId` ⇒ act as any
643
+ agent (PLC writes, recipe writes, model promotion, arbitrary training Python). Unfixed; previously documented at
644
+ `docs/audit/audit-agents.md:186-249`.
645
+ 2. **P0** `bindings/[id].patch.ts` — any user can flip any binding to `mode:'auto'`, silently removing HITL from
646
+ another team's control path.
647
+ 3. **P1** `dcw/[id]/read.post.ts`, `dcw/[id].patch.ts`, `dcw/index.post.ts`, `dcw/lines/[id].delete.ts`,
648
+ `daq/[id].delete.ts`, `daq/[id]/test.post.ts`, `daq/alarms.get.ts`, `dcw/journal/*`, `dcw/optimizations/*`,
649
+ `dcw/recipes/index.get.ts`, `dcw/recipes/[id]/versions.get.ts`, `dcw/[id]/param-ledger.get.ts` — authenticated
650
+ but unscoped access to industrial data/control.
651
+ 4. **P1** `bindings/index.post.ts:33-38` — binds any `agentId` without resolving or authorizing it.
652
+ 5. **P2** GET handlers that start acquisition/pipelines and insert rows (`daq/index.get.ts:20-22`,
653
+ `daq/[id]/samples.get.ts`→`daq-controller.ts:794`, `channels/[id]/index.get.ts:16`).
654
+ 6. **P2** `daq/test-driver.post.ts` / `dcw/test-driver.post.ts` — caller-controlled outbound connect primitive.
655
+ 7. **P3** `caller.ts:122` uncapped `nameCache`; `manager.ts:329` uncapped `lastToolInvokeAt`; no scene-peer cap.
656
+ 8. **P3** `daq` 404s surface as 500 (`daq-controller.ts:797,838,857,862` vs `response.ts:29-47`).
657
+ 9. **P3** swaggered error text: `manager.ts:2787` returns raw `err.message` to callers.