agentworkshop 0.8.3 → 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 (2251) 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/entry.D6nBdXet.css +1 -0
  91. package/.output/public/_nuxt/fIV9zbnA.js +1 -0
  92. package/.output/public/_nuxt/gUYi1hLJ2.js +16 -0
  93. package/.output/public/_nuxt/iqxZGXsY.js +1 -0
  94. package/.output/public/_nuxt/logs.BkJPbR_K.css +1 -0
  95. package/.output/public/_nuxt/m6G-kfdj.js +1 -0
  96. package/.output/public/_nuxt/monitor.D3yEqqrv.css +1 -0
  97. package/.output/public/_nuxt/ontology.CkuUThtY.css +1 -0
  98. package/.output/public/_nuxt/operations.-l6u44Ar.css +1 -0
  99. package/.output/public/_nuxt/pages.Cdpm_B-G.css +1 -0
  100. package/.output/public/_nuxt/permissions.DxuOOIqQ.css +1 -0
  101. package/.output/public/_nuxt/pipeline.D7et0DoJ.css +1 -0
  102. package/.output/public/_nuxt/rDvMijKA.js +9 -0
  103. package/.output/public/_nuxt/schedules.BXNJ9q_I.css +1 -0
  104. package/.output/public/_nuxt/studio.ClA5gX4K.css +1 -0
  105. package/.output/public/_nuxt/tDEwr422.js +1 -0
  106. package/.output/public/_nuxt/teams.CLQaXno5.css +1 -0
  107. package/.output/public/_nuxt/tokens.BDSUWF-L.css +1 -0
  108. package/.output/public/_nuxt/tools.BwXFAb-X.css +1 -0
  109. package/.output/public/_nuxt/workshop.BBiFhXuM.css +1 -0
  110. package/.output/public/_nuxt/yS3bF3G32.js +2 -0
  111. package/.output/public/_nuxt/zWZ26UWi.js +1 -0
  112. package/.output/public/favicon.svg +14 -14
  113. package/.output/public/robots.txt +3 -3
  114. package/.output/server/chunks/_/LeftOutlined.mjs.map +1 -1
  115. package/.output/server/chunks/_/RightOutlined.mjs.map +1 -1
  116. package/.output/server/chunks/_/SearchOutlined.mjs +1261 -1230
  117. package/.output/server/chunks/_/SearchOutlined.mjs.map +1 -1
  118. package/.output/server/chunks/_/access.mjs +15 -27
  119. package/.output/server/chunks/_/access.mjs.map +1 -1
  120. package/.output/server/chunks/_/catalog-view.mjs +1 -1
  121. package/.output/server/chunks/_/character-asset.repo.mjs +1 -1
  122. package/.output/server/chunks/_/chart-repo.mjs +15 -2
  123. package/.output/server/chunks/_/chart-repo.mjs.map +1 -1
  124. package/.output/server/chunks/_/data-export.mjs +8 -9
  125. package/.output/server/chunks/_/data-export.mjs.map +1 -1
  126. package/.output/server/chunks/_/data-query.mjs +4 -4
  127. package/.output/server/chunks/_/data-query.mjs.map +1 -1
  128. package/.output/server/chunks/_/eda-db.mjs +12 -0
  129. package/.output/server/chunks/_/eda-db.mjs.map +1 -1
  130. package/.output/server/chunks/_/eda-run.repo.mjs +3 -3
  131. package/.output/server/chunks/_/error-500.mjs.map +1 -1
  132. package/.output/server/chunks/_/features.mjs +6 -6
  133. package/.output/server/chunks/_/golden.mjs +3 -3
  134. package/.output/server/chunks/_/host-bindings.mjs +2 -2
  135. package/.output/server/chunks/_/index.mjs +2 -2
  136. package/.output/server/chunks/_/mes-console.mjs +1 -1
  137. package/.output/server/chunks/_/mes-secrets.repo.mjs +107 -0
  138. package/.output/server/chunks/_/mes-secrets.repo.mjs.map +1 -0
  139. package/.output/server/chunks/_/nitro.mjs +5404 -3844
  140. package/.output/server/chunks/_/nitro.mjs.map +1 -1
  141. package/.output/server/chunks/_/ocap.mjs +1 -1
  142. package/.output/server/chunks/_/rest-auth.mjs +1 -1
  143. package/.output/server/chunks/_/scene-layout.repo.mjs +1 -1
  144. package/.output/server/chunks/_/spc.mjs +2 -2
  145. package/.output/server/chunks/_/template-repo.mjs +97 -0
  146. package/.output/server/chunks/_/template-repo.mjs.map +1 -0
  147. package/.output/server/chunks/build/AuthGate-nF1evO4v.mjs +716 -0
  148. package/.output/server/chunks/build/AuthGate-nF1evO4v.mjs.map +1 -0
  149. package/.output/server/chunks/build/FormItemContext-BlyzocS0.mjs +72 -0
  150. package/.output/server/chunks/build/FormItemContext-BlyzocS0.mjs.map +1 -0
  151. package/.output/server/chunks/build/OmpTerminalPanel-BhvhQ1gG.mjs +942 -0
  152. package/.output/server/chunks/build/OmpTerminalPanel-BhvhQ1gG.mjs.map +1 -0
  153. package/.output/server/chunks/build/PluginSlot-BUKXwV2X.mjs +141 -0
  154. package/.output/server/chunks/build/PluginSlot-BUKXwV2X.mjs.map +1 -0
  155. package/.output/server/chunks/build/TownView-BWMDbosY.mjs +6489 -0
  156. package/.output/server/chunks/build/TownView-BWMDbosY.mjs.map +1 -0
  157. package/.output/server/chunks/build/_id_-BK-t8nRG.mjs +392 -0
  158. package/.output/server/chunks/build/_id_-BK-t8nRG.mjs.map +1 -0
  159. package/.output/server/chunks/build/_id_-CZPlPDm4.mjs +2045 -0
  160. package/.output/server/chunks/build/_id_-CZPlPDm4.mjs.map +1 -0
  161. package/.output/server/chunks/build/_wsId_-C871SDPN.mjs +14589 -0
  162. package/.output/server/chunks/build/_wsId_-C871SDPN.mjs.map +1 -0
  163. package/.output/server/chunks/build/agents-D7CdEUTv.mjs +1078 -0
  164. package/.output/server/chunks/build/agents-D7CdEUTv.mjs.map +1 -0
  165. package/.output/server/chunks/build/alert-D0ivtTGy.mjs +263 -0
  166. package/.output/server/chunks/build/alert-D0ivtTGy.mjs.map +1 -0
  167. package/.output/server/chunks/build/aml-DRAFRcGU.mjs +814 -0
  168. package/.output/server/chunks/build/aml-DRAFRcGU.mjs.map +1 -0
  169. package/.output/server/chunks/build/analysis-p-dBkjoK.mjs +533 -0
  170. package/.output/server/chunks/build/analysis-p-dBkjoK.mjs.map +1 -0
  171. package/.output/server/chunks/build/api-B4Om0mEc.mjs +53 -0
  172. package/.output/server/chunks/build/api-B4Om0mEc.mjs.map +1 -0
  173. package/.output/server/chunks/build/api-BEW_ebY_.mjs +64 -0
  174. package/.output/server/chunks/build/api-BEW_ebY_.mjs.map +1 -0
  175. package/.output/server/chunks/build/api-BsAgXWxi.mjs +72 -0
  176. package/.output/server/chunks/build/api-BsAgXWxi.mjs.map +1 -0
  177. package/.output/server/chunks/build/api-error-BwAQLw44.mjs +47 -0
  178. package/.output/server/chunks/build/api-error-BwAQLw44.mjs.map +1 -0
  179. package/.output/server/chunks/build/apiClient-BvXtNzC8.mjs +81 -0
  180. package/.output/server/chunks/build/apiClient-BvXtNzC8.mjs.map +1 -0
  181. package/.output/server/chunks/build/board-CJUc032b.mjs +189 -0
  182. package/.output/server/chunks/build/board-CJUc032b.mjs.map +1 -0
  183. package/.output/server/chunks/build/builtin-catalog-edpDcgfL.mjs +94 -81
  184. package/.output/server/chunks/build/builtin-catalog-edpDcgfL.mjs.map +1 -1
  185. package/.output/server/chunks/build/card-Cqk0Ur-L.mjs +953 -0
  186. package/.output/server/chunks/build/card-Cqk0Ur-L.mjs.map +1 -0
  187. package/.output/server/chunks/build/channel-templates-ggsBacZF.mjs +942 -0
  188. package/.output/server/chunks/build/channel-templates-ggsBacZF.mjs.map +1 -0
  189. package/.output/server/chunks/build/chart-pipeline-BpoWYMK_.mjs +233 -0
  190. package/.output/server/chunks/build/chart-pipeline-BpoWYMK_.mjs.map +1 -0
  191. package/.output/server/chunks/build/chart-trend-BWeZh5Lv.mjs +112 -113
  192. package/.output/server/chunks/build/chart-trend-BWeZh5Lv.mjs.map +1 -1
  193. package/.output/server/chunks/build/checkbox-CrT4cnfu.mjs +439 -0
  194. package/.output/server/chunks/build/checkbox-CrT4cnfu.mjs.map +1 -0
  195. package/.output/server/chunks/build/client-only-qNA2OVV_.mjs +43 -0
  196. package/.output/server/chunks/build/client-only-qNA2OVV_.mjs.map +1 -0
  197. package/.output/server/chunks/build/constants-HPHJvjne.mjs +76 -66
  198. package/.output/server/chunks/build/constants-HPHJvjne.mjs.map +1 -1
  199. package/.output/server/chunks/build/core-CgTOPS4t.mjs +294 -0
  200. package/.output/server/chunks/build/core-CgTOPS4t.mjs.map +1 -0
  201. package/.output/server/chunks/build/daq-CdxcfY_G.mjs +1266 -0
  202. package/.output/server/chunks/build/daq-CdxcfY_G.mjs.map +1 -0
  203. package/.output/server/chunks/build/data-D8uX1dnm.mjs +481 -0
  204. package/.output/server/chunks/build/data-D8uX1dnm.mjs.map +1 -0
  205. package/.output/server/chunks/build/dcw-BlDQtS4q.mjs +505 -0
  206. package/.output/server/chunks/build/dcw-BlDQtS4q.mjs.map +1 -0
  207. package/.output/server/chunks/build/dcw-driver-badge-Df5wL_ZA.mjs +15 -3
  208. package/.output/server/chunks/build/dcw-driver-badge-Df5wL_ZA.mjs.map +1 -1
  209. package/.output/server/chunks/build/default-CNWS6NUw.mjs +2353 -0
  210. package/.output/server/chunks/build/default-CNWS6NUw.mjs.map +1 -0
  211. package/.output/server/chunks/build/descriptions-BNlfKG9y.mjs +406 -0
  212. package/.output/server/chunks/build/descriptions-BNlfKG9y.mjs.map +1 -0
  213. package/.output/server/chunks/build/drawer-Caji0PLs.mjs +834 -0
  214. package/.output/server/chunks/build/drawer-Caji0PLs.mjs.map +1 -0
  215. package/.output/server/chunks/build/dropdown-BNwTVGde.mjs +14 -0
  216. package/.output/server/chunks/build/dropdown-BNwTVGde.mjs.map +1 -0
  217. package/.output/server/chunks/build/dropdown-Cd-xPhR6.mjs +540 -0
  218. package/.output/server/chunks/build/dropdown-Cd-xPhR6.mjs.map +1 -0
  219. package/.output/server/chunks/build/es-Bxu10NJ2.mjs +43 -0
  220. package/.output/server/chunks/build/es-Bxu10NJ2.mjs.map +1 -0
  221. package/.output/server/chunks/build/firstNotUndefined-8H5_qHUu.mjs +2448 -0
  222. package/.output/server/chunks/build/firstNotUndefined-8H5_qHUu.mjs.map +1 -0
  223. package/.output/server/chunks/build/form-D_UpWPN4.mjs +4712 -0
  224. package/.output/server/chunks/build/form-D_UpWPN4.mjs.map +1 -0
  225. package/.output/server/chunks/build/hasIn-DBdElbjM.mjs +553 -0
  226. package/.output/server/chunks/build/hasIn-DBdElbjM.mjs.map +1 -0
  227. package/.output/server/chunks/build/hitl-Bd30yr1J.mjs +132 -0
  228. package/.output/server/chunks/build/hitl-Bd30yr1J.mjs.map +1 -0
  229. package/.output/server/chunks/build/input-GtPuSEgt.mjs +2181 -0
  230. package/.output/server/chunks/build/input-GtPuSEgt.mjs.map +1 -0
  231. package/.output/server/chunks/build/input-number-BNlNDK7H.mjs +1120 -0
  232. package/.output/server/chunks/build/input-number-BNlNDK7H.mjs.map +1 -0
  233. package/.output/server/chunks/build/interval-DvHBIIZh.mjs +9 -0
  234. package/.output/server/chunks/build/interval-DvHBIIZh.mjs.map +1 -0
  235. package/.output/server/chunks/build/isNumeric-CP7q_yhz.mjs +7 -0
  236. package/.output/server/chunks/build/isNumeric-CP7q_yhz.mjs.map +1 -0
  237. package/.output/server/chunks/build/logs-pRb-TMWa.mjs +427 -0
  238. package/.output/server/chunks/build/logs-pRb-TMWa.mjs.map +1 -0
  239. package/.output/server/chunks/build/menu-BXt-X0dt.mjs +1952 -0
  240. package/.output/server/chunks/build/menu-BXt-X0dt.mjs.map +1 -0
  241. package/.output/server/chunks/build/monitor-Cq6hRFeQ.mjs +2253 -0
  242. package/.output/server/chunks/build/monitor-Cq6hRFeQ.mjs.map +1 -0
  243. package/.output/server/chunks/build/narrow-fetch-CcG-BPxc.mjs +2 -0
  244. package/.output/server/chunks/build/narrow-fetch-CcG-BPxc.mjs.map +1 -1
  245. package/.output/server/chunks/build/ontology-ohICfVVb.mjs +1406 -0
  246. package/.output/server/chunks/build/ontology-ohICfVVb.mjs.map +1 -0
  247. package/.output/server/chunks/build/operations-SMQrRAcr.mjs +311 -0
  248. package/.output/server/chunks/build/operations-SMQrRAcr.mjs.map +1 -0
  249. package/.output/server/chunks/build/optimizer-BlWTsM-W.mjs +202 -0
  250. package/.output/server/chunks/build/optimizer-BlWTsM-W.mjs.map +1 -0
  251. package/.output/server/chunks/build/pages-DsMKUw7i.mjs +542 -0
  252. package/.output/server/chunks/build/pages-DsMKUw7i.mjs.map +1 -0
  253. package/.output/server/chunks/build/pagination-DTAconUo.mjs +1346 -0
  254. package/.output/server/chunks/build/pagination-DTAconUo.mjs.map +1 -0
  255. package/.output/server/chunks/build/permissions-DgXQZSyx.mjs +637 -0
  256. package/.output/server/chunks/build/permissions-DgXQZSyx.mjs.map +1 -0
  257. package/.output/server/chunks/build/pipeline-CkavMBhk.mjs +212 -0
  258. package/.output/server/chunks/build/pipeline-CkavMBhk.mjs.map +1 -0
  259. package/.output/server/chunks/build/plugins-LRjaSEZy.mjs +272 -0
  260. package/.output/server/chunks/build/plugins-LRjaSEZy.mjs.map +1 -0
  261. package/.output/server/chunks/build/popconfirm-DxYPGRgS.mjs +340 -0
  262. package/.output/server/chunks/build/popconfirm-DxYPGRgS.mjs.map +1 -0
  263. package/.output/server/chunks/build/responsiveObserve-DM3hpzhU.mjs +78 -0
  264. package/.output/server/chunks/build/responsiveObserve-DM3hpzhU.mjs.map +1 -0
  265. package/.output/server/chunks/build/schedules-Hz2DJUE2.mjs +7172 -0
  266. package/.output/server/chunks/build/schedules-Hz2DJUE2.mjs.map +1 -0
  267. package/.output/server/chunks/build/segmented-D3HWtHPw.mjs +341 -0
  268. package/.output/server/chunks/build/segmented-D3HWtHPw.mjs.map +1 -0
  269. package/.output/server/chunks/build/select-B3Dsb9yq.mjs +3923 -0
  270. package/.output/server/chunks/build/select-B3Dsb9yq.mjs.map +1 -0
  271. package/.output/server/chunks/build/settings-DXLJPq7d.mjs +1014 -0
  272. package/.output/server/chunks/build/settings-DXLJPq7d.mjs.map +1 -0
  273. package/.output/server/chunks/build/space-Dwu2Skt8.mjs +110 -0
  274. package/.output/server/chunks/build/space-Dwu2Skt8.mjs.map +1 -0
  275. package/.output/server/chunks/build/spin-C2cuvGth.mjs +357 -0
  276. package/.output/server/chunks/build/spin-C2cuvGth.mjs.map +1 -0
  277. package/.output/server/chunks/build/studio-hSqH9TYS.mjs +336 -0
  278. package/.output/server/chunks/build/studio-hSqH9TYS.mjs.map +1 -0
  279. package/.output/server/chunks/build/switch-CyR-H6Fb.mjs +377 -0
  280. package/.output/server/chunks/build/switch-CyR-H6Fb.mjs.map +1 -0
  281. package/.output/server/chunks/build/table-CmVD-cA9.mjs +7546 -0
  282. package/.output/server/chunks/build/table-CmVD-cA9.mjs.map +1 -0
  283. package/.output/server/chunks/build/tabs-Vg0e7cZE.mjs +1924 -0
  284. package/.output/server/chunks/build/tabs-Vg0e7cZE.mjs.map +1 -0
  285. package/.output/server/chunks/build/tag-y0sn-xv9.mjs +1156 -0
  286. package/.output/server/chunks/build/tag-y0sn-xv9.mjs.map +1 -0
  287. package/.output/server/chunks/build/teams-BbwYJyzv.mjs +1203 -0
  288. package/.output/server/chunks/build/teams-BbwYJyzv.mjs.map +1 -0
  289. package/.output/server/chunks/build/tokens-GYaGJ35Z.mjs +1062 -0
  290. package/.output/server/chunks/build/tokens-GYaGJ35Z.mjs.map +1 -0
  291. package/.output/server/chunks/build/tools-CnYi9cou.mjs +487 -0
  292. package/.output/server/chunks/build/tools-CnYi9cou.mjs.map +1 -0
  293. package/.output/server/chunks/build/tooltip-C2n2nNiQ.mjs +920 -0
  294. package/.output/server/chunks/build/tooltip-C2n2nNiQ.mjs.map +1 -0
  295. package/.output/server/chunks/build/town-B5aoiG98.mjs +133 -0
  296. package/.output/server/chunks/build/town-B5aoiG98.mjs.map +1 -0
  297. package/.output/server/chunks/build/town-BV-hbwb5.mjs +30 -17
  298. package/.output/server/chunks/build/town-BV-hbwb5.mjs.map +1 -1
  299. package/.output/server/chunks/build/types-D6J7slEa.mjs +1 -1
  300. package/.output/server/chunks/build/types-D6J7slEa.mjs.map +1 -1
  301. package/.output/server/chunks/build/types-DWqIeMRP.mjs +30 -29
  302. package/.output/server/chunks/build/types-DWqIeMRP.mjs.map +1 -1
  303. package/.output/server/chunks/build/useAgentHarnessOptions-Dq0l0Z6d.mjs +124 -0
  304. package/.output/server/chunks/build/useAgentHarnessOptions-Dq0l0Z6d.mjs.map +1 -0
  305. package/.output/server/chunks/build/useAgentTemplateActions-BFOHb5-L.mjs +77 -0
  306. package/.output/server/chunks/build/useAgentTemplateActions-BFOHb5-L.mjs.map +1 -0
  307. package/.output/server/chunks/build/useAgentTemplateDialogState-CZzpu5og.mjs +24 -17
  308. package/.output/server/chunks/build/useAgentTemplateDialogState-CZzpu5og.mjs.map +1 -1
  309. package/.output/server/chunks/build/useAgentTemplateForm-CuJPOPcK.mjs +117 -0
  310. package/.output/server/chunks/build/useAgentTemplateForm-CuJPOPcK.mjs.map +1 -0
  311. package/.output/server/chunks/build/useAgentTemplatesCatalog-B2bIhZLA.mjs +133 -0
  312. package/.output/server/chunks/build/useAgentTemplatesCatalog-B2bIhZLA.mjs.map +1 -0
  313. package/.output/server/chunks/build/useAmlDatasets-DeoE1idn.mjs +92 -0
  314. package/.output/server/chunks/build/useAmlDatasets-DeoE1idn.mjs.map +1 -0
  315. package/.output/server/chunks/build/useAmlEntities-BJhvdqHJ.mjs +86 -0
  316. package/.output/server/chunks/build/useAmlEntities-BJhvdqHJ.mjs.map +1 -0
  317. package/.output/server/chunks/build/useAmlEnv-CDIZ6xTe.mjs +194 -0
  318. package/.output/server/chunks/build/useAmlEnv-CDIZ6xTe.mjs.map +1 -0
  319. package/.output/server/chunks/build/useAmlExperiments-Dloi834i.mjs +89 -0
  320. package/.output/server/chunks/build/useAmlExperiments-Dloi834i.mjs.map +1 -0
  321. package/.output/server/chunks/build/useAmlFormat-C2sl3MGB.mjs +38 -33
  322. package/.output/server/chunks/build/useAmlFormat-C2sl3MGB.mjs.map +1 -1
  323. package/.output/server/chunks/build/useAmlJobs-BF9LpwXz.mjs +267 -0
  324. package/.output/server/chunks/build/useAmlJobs-BF9LpwXz.mjs.map +1 -0
  325. package/.output/server/chunks/build/useAmlModels-_bweOr3R.mjs +93 -0
  326. package/.output/server/chunks/build/useAmlModels-_bweOr3R.mjs.map +1 -0
  327. package/.output/server/chunks/build/useAmlNotes-DQj980iX.mjs +86 -0
  328. package/.output/server/chunks/build/useAmlNotes-DQj980iX.mjs.map +1 -0
  329. package/.output/server/chunks/build/useAmlPredict-DHNgDSJn.mjs +130 -0
  330. package/.output/server/chunks/build/useAmlPredict-DHNgDSJn.mjs.map +1 -0
  331. package/.output/server/chunks/build/useAnalysisFeed-BrEGV_9x.mjs +129 -0
  332. package/.output/server/chunks/build/useAnalysisFeed-BrEGV_9x.mjs.map +1 -0
  333. package/.output/server/chunks/build/useDaqAddNode-D_Rkju0f.mjs +142 -0
  334. package/.output/server/chunks/build/useDaqAddNode-D_Rkju0f.mjs.map +1 -0
  335. package/.output/server/chunks/build/useDaqDetailBinding-DCWaLKXT.mjs +70 -0
  336. package/.output/server/chunks/build/useDaqDetailBinding-DCWaLKXT.mjs.map +1 -0
  337. package/.output/server/chunks/build/useDaqDetailFrames-BOIcOJRB.mjs +79 -0
  338. package/.output/server/chunks/build/useDaqDetailFrames-BOIcOJRB.mjs.map +1 -0
  339. package/.output/server/chunks/build/useDaqDetailHistory-D6WulPVs.mjs +176 -0
  340. package/.output/server/chunks/build/useDaqDetailHistory-D6WulPVs.mjs.map +1 -0
  341. package/.output/server/chunks/build/useDaqDetailNode-DeOsDxK5.mjs +99 -0
  342. package/.output/server/chunks/build/useDaqDetailNode-DeOsDxK5.mjs.map +1 -0
  343. package/.output/server/chunks/build/useDaqDetailParams-Cm9a9r5G.mjs +159 -0
  344. package/.output/server/chunks/build/useDaqDetailParams-Cm9a9r5G.mjs.map +1 -0
  345. package/.output/server/chunks/build/useDaqFilters-CctmO03p.mjs +222 -0
  346. package/.output/server/chunks/build/useDaqFilters-CctmO03p.mjs.map +1 -0
  347. package/.output/server/chunks/build/useDaqNodeWindow-1DWj2H5G.mjs +45 -44
  348. package/.output/server/chunks/build/useDaqNodeWindow-1DWj2H5G.mjs.map +1 -1
  349. package/.output/server/chunks/build/useDaqOptimizations-CmX_dpBc.mjs +136 -0
  350. package/.output/server/chunks/build/useDaqOptimizations-CmX_dpBc.mjs.map +1 -0
  351. package/.output/server/chunks/build/useDaqStream-B9ZBVQrI.mjs +395 -0
  352. package/.output/server/chunks/build/useDaqStream-B9ZBVQrI.mjs.map +1 -0
  353. package/.output/server/chunks/build/useDaqTemplates-CK37sMfi.mjs +187 -0
  354. package/.output/server/chunks/build/useDaqTemplates-CK37sMfi.mjs.map +1 -0
  355. package/.output/server/chunks/build/useDashboardCharts-D45083s_.mjs +311 -313
  356. package/.output/server/chunks/build/useDashboardCharts-D45083s_.mjs.map +1 -1
  357. package/.output/server/chunks/build/useDashboardData-NJ7rKxhx.mjs +153 -0
  358. package/.output/server/chunks/build/useDashboardData-NJ7rKxhx.mjs.map +1 -0
  359. package/.output/server/chunks/build/useDcwAddNode-DACVcEHs.mjs +219 -0
  360. package/.output/server/chunks/build/useDcwAddNode-DACVcEHs.mjs.map +1 -0
  361. package/.output/server/chunks/build/useDcwCards-SaiImIYQ.mjs +67 -0
  362. package/.output/server/chunks/build/useDcwCards-SaiImIYQ.mjs.map +1 -0
  363. package/.output/server/chunks/build/useDcwDetailScope-DLOklSMO.mjs +184 -0
  364. package/.output/server/chunks/build/useDcwDetailScope-DLOklSMO.mjs.map +1 -0
  365. package/.output/server/chunks/build/useDcwDetailTemplates-ClmIdZ40.mjs +148 -0
  366. package/.output/server/chunks/build/useDcwDetailTemplates-ClmIdZ40.mjs.map +1 -0
  367. package/.output/server/chunks/build/useDcwFilter-CPMyCltx.mjs +71 -0
  368. package/.output/server/chunks/build/useDcwFilter-CPMyCltx.mjs.map +1 -0
  369. package/.output/server/chunks/build/useDcwLedger-0ie-0WTc.mjs +79 -0
  370. package/.output/server/chunks/build/useDcwLedger-0ie-0WTc.mjs.map +1 -0
  371. package/.output/server/chunks/build/useDcwLineMutations-DNxo66yM.mjs +137 -0
  372. package/.output/server/chunks/build/useDcwLineMutations-DNxo66yM.mjs.map +1 -0
  373. package/.output/server/chunks/build/useDcwLineRun-CHskwscT.mjs +104 -0
  374. package/.output/server/chunks/build/useDcwLineRun-CHskwscT.mjs.map +1 -0
  375. package/.output/server/chunks/build/useDcwParamApprovals-DtScUc-W.mjs +121 -0
  376. package/.output/server/chunks/build/useDcwParamApprovals-DtScUc-W.mjs.map +1 -0
  377. package/.output/server/chunks/build/useDcwProducts-BMaxzLu6.mjs +93 -0
  378. package/.output/server/chunks/build/useDcwProducts-BMaxzLu6.mjs.map +1 -0
  379. package/.output/server/chunks/build/useDcwQuery-TVU3Eo0M.mjs +98 -0
  380. package/.output/server/chunks/build/useDcwQuery-TVU3Eo0M.mjs.map +1 -0
  381. package/.output/server/chunks/build/useDcwQuickActions-BREFmR9T.mjs +88 -0
  382. package/.output/server/chunks/build/useDcwQuickActions-BREFmR9T.mjs.map +1 -0
  383. package/.output/server/chunks/build/useDcwRecipes-Bc9urA1N.mjs +258 -0
  384. package/.output/server/chunks/build/useDcwRecipes-Bc9urA1N.mjs.map +1 -0
  385. package/.output/server/chunks/build/useDcwStream-Dir5ufAU.mjs +452 -0
  386. package/.output/server/chunks/build/useDcwStream-Dir5ufAU.mjs.map +1 -0
  387. package/.output/server/chunks/build/useDcwTemplates-BzagZztS.mjs +91 -0
  388. package/.output/server/chunks/build/useDcwTemplates-BzagZztS.mjs.map +1 -0
  389. package/.output/server/chunks/build/useDcwWrites-BROwTLCn.mjs +140 -0
  390. package/.output/server/chunks/build/useDcwWrites-BROwTLCn.mjs.map +1 -0
  391. package/.output/server/chunks/build/useDeviceTwins-BqwVJaZg.mjs +128 -0
  392. package/.output/server/chunks/build/useDeviceTwins-BqwVJaZg.mjs.map +1 -0
  393. package/.output/server/chunks/build/useExpConfirmations-BM626N4p.mjs +107 -0
  394. package/.output/server/chunks/build/useExpConfirmations-BM626N4p.mjs.map +1 -0
  395. package/.output/server/chunks/build/useLocalTime-uVSM44Um.mjs +55 -0
  396. package/.output/server/chunks/build/useLocalTime-uVSM44Um.mjs.map +1 -0
  397. package/.output/server/chunks/build/useLogsFormat-B-o4MHy7.mjs +34 -31
  398. package/.output/server/chunks/build/useLogsFormat-B-o4MHy7.mjs.map +1 -1
  399. package/.output/server/chunks/build/useLogsManual-cVBZQ_Mt.mjs +88 -0
  400. package/.output/server/chunks/build/useLogsManual-cVBZQ_Mt.mjs.map +1 -0
  401. package/.output/server/chunks/build/useLogsQuery-D7hrJ3yn.mjs +150 -0
  402. package/.output/server/chunks/build/useLogsQuery-D7hrJ3yn.mjs.map +1 -0
  403. package/.output/server/chunks/build/useLogsScope-aaPQeTRm.mjs +83 -0
  404. package/.output/server/chunks/build/useLogsScope-aaPQeTRm.mjs.map +1 -0
  405. package/.output/server/chunks/build/useMonitorColumns-vVnt3r5Q.mjs +167 -156
  406. package/.output/server/chunks/build/useMonitorColumns-vVnt3r5Q.mjs.map +1 -1
  407. package/.output/server/chunks/build/useMonitorData-DIkiLr_h.mjs +135 -0
  408. package/.output/server/chunks/build/useMonitorData-DIkiLr_h.mjs.map +1 -0
  409. package/.output/server/chunks/build/useMonitorFormat-CyURtH8N.mjs +91 -0
  410. package/.output/server/chunks/build/useMonitorFormat-CyURtH8N.mjs.map +1 -0
  411. package/.output/server/chunks/build/useMonitorTerminal-Dj4QwRNW.mjs +28 -21
  412. package/.output/server/chunks/build/useMonitorTerminal-Dj4QwRNW.mjs.map +1 -1
  413. package/.output/server/chunks/build/useOperationsFeed-Ci4mZAn_.mjs +195 -0
  414. package/.output/server/chunks/build/useOperationsFeed-Ci4mZAn_.mjs.map +1 -0
  415. package/.output/server/chunks/build/useOpsLog-C-M6Eace.mjs +149 -0
  416. package/.output/server/chunks/build/useOpsLog-C-M6Eace.mjs.map +1 -0
  417. package/.output/server/chunks/build/useRecipeDispatchApprovals-BYtiqfeb.mjs +156 -0
  418. package/.output/server/chunks/build/useRecipeDispatchApprovals-BYtiqfeb.mjs.map +1 -0
  419. package/.output/server/chunks/build/useResponsive-BKDMGTHs.mjs +39 -23
  420. package/.output/server/chunks/build/useResponsive-BKDMGTHs.mjs.map +1 -1
  421. package/.output/server/chunks/build/useTeamActions-BDjU06LP.mjs +79 -0
  422. package/.output/server/chunks/build/useTeamActions-BDjU06LP.mjs.map +1 -0
  423. package/.output/server/chunks/build/useTeamAddMemberDialog-J3oFn3FI.mjs +84 -0
  424. package/.output/server/chunks/build/useTeamAddMemberDialog-J3oFn3FI.mjs.map +1 -0
  425. package/.output/server/chunks/build/useTeamCreateDialog-fbn4ixYu.mjs +97 -0
  426. package/.output/server/chunks/build/useTeamCreateDialog-fbn4ixYu.mjs.map +1 -0
  427. package/.output/server/chunks/build/useTeamDeployDialog-BNezMD2k.mjs +80 -0
  428. package/.output/server/chunks/build/useTeamDeployDialog-BNezMD2k.mjs.map +1 -0
  429. package/.output/server/chunks/build/useTeamDialogState-CFRUQxAf.mjs +39 -32
  430. package/.output/server/chunks/build/useTeamDialogState-CFRUQxAf.mjs.map +1 -1
  431. package/.output/server/chunks/build/useTeamPluginDialog-BZznrOVe.mjs +103 -0
  432. package/.output/server/chunks/build/useTeamPluginDialog-BZznrOVe.mjs.map +1 -0
  433. package/.output/server/chunks/build/useTeamsCatalog-DuZFP3oG.mjs +123 -0
  434. package/.output/server/chunks/build/useTeamsCatalog-DuZFP3oG.mjs.map +1 -0
  435. package/.output/server/chunks/build/useTokenClipboard-CwQpoFeP.mjs +29 -22
  436. package/.output/server/chunks/build/useTokenClipboard-CwQpoFeP.mjs.map +1 -1
  437. package/.output/server/chunks/build/useTokenCreate-Ctl0YGhL.mjs +115 -0
  438. package/.output/server/chunks/build/useTokenCreate-Ctl0YGhL.mjs.map +1 -0
  439. package/.output/server/chunks/build/useTokenRename-Cm3ypSfN.mjs +87 -0
  440. package/.output/server/chunks/build/useTokenRename-Cm3ypSfN.mjs.map +1 -0
  441. package/.output/server/chunks/build/useTokenReveal-CeoWL5Mt.mjs +118 -0
  442. package/.output/server/chunks/build/useTokenReveal-CeoWL5Mt.mjs.map +1 -0
  443. package/.output/server/chunks/build/useTokensList-CNIzON3u.mjs +92 -0
  444. package/.output/server/chunks/build/useTokensList-CNIzON3u.mjs.map +1 -0
  445. package/.output/server/chunks/build/useTownBus-D9SoIsAN.mjs +17 -16
  446. package/.output/server/chunks/build/useTownBus-D9SoIsAN.mjs.map +1 -1
  447. package/.output/server/chunks/build/useWorkbenchAuth-CY-bVFMu.mjs +141 -0
  448. package/.output/server/chunks/build/useWorkbenchAuth-CY-bVFMu.mjs.map +1 -0
  449. package/.output/server/chunks/build/useWorkbenchWorkspaces-DhZQFss9.mjs +138 -0
  450. package/.output/server/chunks/build/useWorkbenchWorkspaces-DhZQFss9.mjs.map +1 -0
  451. package/.output/server/chunks/build/useWorkshopApi-BxHn-4iR.mjs +127 -0
  452. package/.output/server/chunks/build/useWorkshopApi-BxHn-4iR.mjs.map +1 -0
  453. package/.output/server/chunks/build/useWorkshopWs-YQ5URrbt.mjs +1659 -0
  454. package/.output/server/chunks/build/useWorkshopWs-YQ5URrbt.mjs.map +1 -0
  455. package/.output/server/chunks/build/useWorkspaceAuth-Dlvj9csD.mjs +60 -0
  456. package/.output/server/chunks/build/useWorkspaceAuth-Dlvj9csD.mjs.map +1 -0
  457. package/.output/server/chunks/build/useWorkspaceChannels-CPFepxTN.mjs +92 -0
  458. package/.output/server/chunks/build/useWorkspaceChannels-CPFepxTN.mjs.map +1 -0
  459. package/.output/server/chunks/build/useWorkspacePanels-CTwREmq0.mjs +34 -31
  460. package/.output/server/chunks/build/useWorkspacePanels-CTwREmq0.mjs.map +1 -1
  461. package/.output/server/chunks/build/useWorkspaceShell-BCypjjjE.mjs +168 -0
  462. package/.output/server/chunks/build/useWorkspaceShell-BCypjjjE.mjs.map +1 -0
  463. package/.output/server/chunks/build/users-DjiVC_tS.mjs +569 -0
  464. package/.output/server/chunks/build/users-DjiVC_tS.mjs.map +1 -0
  465. package/.output/server/chunks/build/workshop-1gKeDASV.mjs +546 -0
  466. package/.output/server/chunks/build/workshop-1gKeDASV.mjs.map +1 -0
  467. package/.output/server/chunks/build/workspaces-CmW0cpOt.mjs +121 -111
  468. package/.output/server/chunks/build/workspaces-CmW0cpOt.mjs.map +1 -1
  469. package/.output/server/chunks/routes/api/health.get.mjs +1 -1
  470. package/.output/server/chunks/routes/api/index.get.mjs +1 -1
  471. package/.output/server/chunks/routes/api/index.post.mjs +1 -1
  472. package/.output/server/chunks/routes/api/mcp/workshop.mjs +2 -2
  473. package/.output/server/chunks/routes/api/metrics.mjs +1 -1
  474. package/.output/server/chunks/routes/api/plugins/_name/_...path_.mjs +1 -1
  475. package/.output/server/chunks/routes/api/plugins/client/_name_.get.mjs +1 -1
  476. package/.output/server/chunks/routes/api/plugins/i18n.get.mjs +1 -1
  477. package/.output/server/chunks/routes/api/plugins/manifest.get.mjs +1 -1
  478. package/.output/server/chunks/routes/api/system/backup/list.get.mjs +1 -1
  479. package/.output/server/chunks/routes/api/system/backup/run.post.mjs +3 -3
  480. package/.output/server/chunks/routes/api/system/config-groups/_id_.delete.mjs +1 -1
  481. package/.output/server/chunks/routes/api/system/config-groups/_id_.patch.mjs +1 -1
  482. package/.output/server/chunks/routes/api/system/config.get.mjs +1 -1
  483. package/.output/server/chunks/routes/api/system/index.get.mjs +1 -1
  484. package/.output/server/chunks/routes/api/system/index.patch.mjs +1 -1
  485. package/.output/server/chunks/routes/api/system/index.post.mjs +1 -1
  486. package/.output/server/chunks/routes/api/system/index2.get.mjs +1 -1
  487. package/.output/server/chunks/routes/api/system/monitor/terminal/ws.mjs +1 -1
  488. package/.output/server/chunks/routes/api/system/monitor/terminate.post.mjs +1 -1
  489. package/.output/server/chunks/routes/api/system/monitor.get.mjs +1 -1
  490. package/.output/server/chunks/routes/api/system/settings/events.get.mjs +1 -1
  491. package/.output/server/chunks/routes/api/system/settings/reset.post.mjs +1 -1
  492. package/.output/server/chunks/routes/api/system/timezone.get.mjs +1 -1
  493. package/.output/server/chunks/routes/api/users/_id_.delete.mjs +1 -1
  494. package/.output/server/chunks/routes/api/users/_id_.get.mjs +1 -1
  495. package/.output/server/chunks/routes/api/users/_id_.put.mjs +1 -1
  496. package/.output/server/chunks/routes/api/users/change-password.post.mjs +1 -1
  497. package/.output/server/chunks/routes/api/users/index.get.mjs +1 -1
  498. package/.output/server/chunks/routes/api/users/index.post.mjs +1 -1
  499. package/.output/server/chunks/routes/api/users/login.post.mjs +1 -1
  500. package/.output/server/chunks/routes/api/users/logout.post.mjs +1 -1
  501. package/.output/server/chunks/routes/api/users/me.get.mjs +1 -1
  502. package/.output/server/chunks/routes/api/users/register.post.mjs +1 -1
  503. package/.output/server/chunks/routes/api/users/setup-status.get.mjs +1 -1
  504. package/.output/server/chunks/routes/api/users/tokens/_id/token.get.mjs +1 -1
  505. package/.output/server/chunks/routes/api/users/tokens/_id_.delete.mjs +1 -1
  506. package/.output/server/chunks/routes/api/users/tokens/_id_.patch.mjs +1 -1
  507. package/.output/server/chunks/routes/api/workshop/_...path_.mjs +1 -1
  508. package/.output/server/chunks/routes/api/workshop/a2a/_agentId/index.get.mjs +1 -1
  509. package/.output/server/chunks/routes/api/workshop/a2a/_agentId/index.post.mjs +1 -1
  510. package/.output/server/chunks/routes/api/workshop/a2a/send.post.mjs +1 -1
  511. package/.output/server/chunks/routes/api/workshop/agent-tools/approvals/_id/decide.post.mjs +1 -1
  512. package/.output/server/chunks/routes/api/workshop/agent-tools/bindings/_id_.delete.mjs +1 -1
  513. package/.output/server/chunks/routes/api/workshop/agent-tools/bindings/_id_.patch.mjs +1 -1
  514. package/.output/server/chunks/routes/api/workshop/agent-tools/bindings/grant.post.mjs +1 -1
  515. package/.output/server/chunks/routes/api/workshop/agent-tools/bindings/revoke.post.mjs +1 -1
  516. package/.output/server/chunks/routes/api/workshop/agent-tools/index.get.mjs +1 -1
  517. package/.output/server/chunks/routes/api/workshop/agent-tools/index.post.mjs +1 -1
  518. package/.output/server/chunks/routes/api/workshop/agent-tools/index2.get.mjs +1 -1
  519. package/.output/server/chunks/routes/api/workshop/agent-tools/invoke.post.mjs +1 -1
  520. package/.output/server/chunks/routes/api/workshop/agent-tools/list.get.mjs +1 -1
  521. package/.output/server/chunks/routes/api/workshop/agents/_id_.delete.mjs +1 -1
  522. package/.output/server/chunks/routes/api/workshop/agents/_id_.get.mjs +1 -1
  523. package/.output/server/chunks/routes/api/workshop/agents/_id_.patch.mjs +1 -1
  524. package/.output/server/chunks/routes/api/workshop/agents/subscribe.post.mjs +1 -1
  525. package/.output/server/chunks/routes/api/workshop/aml/datasets/_id/preview.get.mjs +1 -1
  526. package/.output/server/chunks/routes/api/workshop/aml/datasets/_id_.delete.mjs +1 -1
  527. package/.output/server/chunks/routes/api/workshop/aml/datasets/_id_.get.mjs +1 -1
  528. package/.output/server/chunks/routes/api/workshop/aml/datasets/_id_.patch.mjs +1 -1
  529. package/.output/server/chunks/routes/api/workshop/aml/entities/prune.post.mjs +1 -1
  530. package/.output/server/chunks/routes/api/workshop/aml/env/recheck.post.mjs +1 -1
  531. package/.output/server/chunks/routes/api/workshop/aml/env/uv.post.mjs +1 -1
  532. package/.output/server/chunks/routes/api/workshop/aml/env/venv.post.mjs +1 -1
  533. package/.output/server/chunks/routes/api/workshop/aml/index.get.mjs +1 -1
  534. package/.output/server/chunks/routes/api/workshop/aml/index.post.mjs +1 -1
  535. package/.output/server/chunks/routes/api/workshop/aml/index2.get.mjs +1 -1
  536. package/.output/server/chunks/routes/api/workshop/aml/index2.post.mjs +1 -1
  537. package/.output/server/chunks/routes/api/workshop/aml/index3.get.mjs +1 -1
  538. package/.output/server/chunks/routes/api/workshop/aml/index3.post.mjs +1 -1
  539. package/.output/server/chunks/routes/api/workshop/aml/index4.get.mjs +1 -1
  540. package/.output/server/chunks/routes/api/workshop/aml/index5.get.mjs +1 -1
  541. package/.output/server/chunks/routes/api/workshop/aml/index6.get.mjs +1 -1
  542. package/.output/server/chunks/routes/api/workshop/aml/index7.get.mjs +1 -1
  543. package/.output/server/chunks/routes/api/workshop/aml/jobs/_id/cancel.post.mjs +1 -1
  544. package/.output/server/chunks/routes/api/workshop/aml/jobs/_id/logs.get.mjs +1 -1
  545. package/.output/server/chunks/routes/api/workshop/aml/jobs/_id/retry.post.mjs +1 -1
  546. package/.output/server/chunks/routes/api/workshop/aml/jobs/_id_.delete.mjs +1 -1
  547. package/.output/server/chunks/routes/api/workshop/aml/jobs/_id_.get.mjs +1 -1
  548. package/.output/server/chunks/routes/api/workshop/aml/models/_id/predict.post.mjs +1 -1
  549. package/.output/server/chunks/routes/api/workshop/aml/models/_id/promote.post.mjs +1 -1
  550. package/.output/server/chunks/routes/api/workshop/aml/models/_id_.delete.mjs +1 -1
  551. package/.output/server/chunks/routes/api/workshop/aml/models/_id_.patch.mjs +1 -1
  552. package/.output/server/chunks/routes/api/workshop/aml/training-plans/_id/train.post.mjs +1 -1
  553. package/.output/server/chunks/routes/api/workshop/aml/training-plans/_id_.delete.mjs +1 -1
  554. package/.output/server/chunks/routes/api/workshop/aml/training-plans/_id_.patch.mjs +1 -1
  555. package/.output/server/chunks/routes/api/workshop/aml/twin/providers.get.mjs +1 -1
  556. package/.output/server/chunks/routes/api/workshop/analysis/_id_.delete.mjs +1 -1
  557. package/.output/server/chunks/routes/api/workshop/analysis/_id_.get.mjs +1 -1
  558. package/.output/server/chunks/routes/api/workshop/analysis/_id_.patch.mjs +1 -1
  559. package/.output/server/chunks/routes/api/workshop/approvals/_id/decide.post.mjs +1 -1
  560. package/.output/server/chunks/routes/api/workshop/assets/character/_id_.delete.mjs +1 -1
  561. package/.output/server/chunks/routes/api/workshop/assets/devices/_id_.delete.mjs +1 -1
  562. package/.output/server/chunks/routes/api/workshop/assets/index.get.mjs +1 -1
  563. package/.output/server/chunks/routes/api/workshop/assets/index.post.mjs +2 -2
  564. package/.output/server/chunks/routes/api/workshop/assets/index2.get.mjs +1 -1
  565. package/.output/server/chunks/routes/api/workshop/assets/index2.post.mjs +2 -2
  566. package/.output/server/chunks/routes/api/workshop/audit.get.mjs +1 -1
  567. package/.output/server/chunks/routes/api/workshop/caller.mjs +1 -1
  568. package/.output/server/chunks/routes/api/workshop/channel-templates/_id/instantiate.post.mjs +3 -3
  569. package/.output/server/chunks/routes/api/workshop/channel-templates/_id_.delete.mjs +1 -1
  570. package/.output/server/chunks/routes/api/workshop/channel-templates/_id_.get.mjs +1 -1
  571. package/.output/server/chunks/routes/api/workshop/channel-templates/_id_.patch.mjs +1 -1
  572. package/.output/server/chunks/routes/api/workshop/channel-templates/from-channel.post.mjs +1 -1
  573. package/.output/server/chunks/routes/api/workshop/channels/_id/activate.post.mjs +2 -2
  574. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/index.get.mjs +1 -1
  575. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/index.post.mjs +1 -1
  576. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/memories/_memoryId_.delete.mjs +1 -1
  577. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/memories/search.post.mjs +1 -1
  578. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/model.patch.mjs +1 -1
  579. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/position.patch.mjs +1 -1
  580. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/range.patch.mjs +1 -1
  581. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/rotate-token.post.mjs +1 -1
  582. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/stop.post.mjs +1 -1
  583. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId_.delete.mjs +1 -1
  584. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId_.patch.mjs +1 -1
  585. package/.output/server/chunks/routes/api/workshop/channels/_id/chat/index.get.mjs +1 -1
  586. package/.output/server/chunks/routes/api/workshop/channels/_id/chat/index.post.mjs +2 -2
  587. package/.output/server/chunks/routes/api/workshop/channels/_id/chat/messages/_messageId/read.post.mjs +1 -1
  588. package/.output/server/chunks/routes/api/workshop/channels/_id/chat/permissions.get.mjs +1 -1
  589. package/.output/server/chunks/routes/api/workshop/channels/_id/events.get.mjs +1 -1
  590. package/.output/server/chunks/routes/api/workshop/channels/_id/execution-mode.patch.mjs +92 -0
  591. package/.output/server/chunks/routes/api/workshop/channels/_id/execution-mode.patch.mjs.map +1 -0
  592. package/.output/server/chunks/routes/api/workshop/channels/_id/index.get.mjs +1 -1
  593. package/.output/server/chunks/routes/api/workshop/channels/_id/index.post.mjs +2 -2
  594. package/.output/server/chunks/routes/api/workshop/channels/_id/index.put.mjs +2 -2
  595. package/.output/server/chunks/routes/api/workshop/channels/_id/index2.get.mjs +1 -1
  596. package/.output/server/chunks/routes/api/workshop/channels/_id/index2.post.mjs +1 -1
  597. package/.output/server/chunks/routes/api/workshop/channels/_id/index2.put.mjs +2 -2
  598. package/.output/server/chunks/routes/api/workshop/channels/_id/index3.get.mjs +1 -1
  599. package/.output/server/chunks/routes/api/workshop/channels/_id/index3.post.mjs +2 -2
  600. package/.output/server/chunks/routes/api/workshop/channels/_id/index4.get.mjs +1 -1
  601. package/.output/server/chunks/routes/api/workshop/channels/_id/index4.post.mjs +2 -2
  602. package/.output/server/chunks/routes/api/workshop/channels/_id/index5.get.mjs +2 -2
  603. package/.output/server/chunks/routes/api/workshop/channels/_id/index6.get.mjs +1 -1
  604. package/.output/server/chunks/routes/api/workshop/channels/_id/index7.get.mjs +1 -1
  605. package/.output/server/chunks/routes/api/workshop/channels/_id/line.put.mjs +2 -2
  606. package/.output/server/chunks/routes/api/workshop/channels/_id/members/_userId/approve.post.mjs +1 -1
  607. package/.output/server/chunks/routes/api/workshop/channels/_id/members/_userId_.delete.mjs +1 -1
  608. package/.output/server/chunks/routes/api/workshop/channels/_id/members/join.post.mjs +1 -1
  609. package/.output/server/chunks/routes/api/workshop/channels/_id/members/leave.post.mjs +1 -1
  610. package/.output/server/chunks/routes/api/workshop/channels/_id/memories/_memoryId_.delete.mjs +1 -1
  611. package/.output/server/chunks/routes/api/workshop/channels/_id/queue.get.mjs +1 -1
  612. package/.output/server/chunks/routes/api/workshop/channels/_id/terminals.get.mjs +2 -2
  613. package/.output/server/chunks/routes/api/workshop/channels/_id/tools/reset.post.mjs +2 -2
  614. package/.output/server/chunks/routes/api/workshop/channels/_id/twin-profile.get.mjs +2 -2
  615. package/.output/server/chunks/routes/api/workshop/channels/_id/twin-profile.patch.mjs +2 -2
  616. package/.output/server/chunks/routes/api/workshop/channels/_id_.delete.mjs +1 -1
  617. package/.output/server/chunks/routes/api/workshop/channels/index.get.mjs +2 -2
  618. package/.output/server/chunks/routes/api/workshop/channels/index.patch.mjs +1 -1
  619. package/.output/server/chunks/routes/api/workshop/channels.get.mjs +1 -1
  620. package/.output/server/chunks/routes/api/workshop/channels.post.mjs +8 -8
  621. package/.output/server/chunks/routes/api/workshop/daq/_id/bind.post.mjs +1 -1
  622. package/.output/server/chunks/routes/api/workshop/daq/_id/bindings.put.mjs +1 -1
  623. package/.output/server/chunks/routes/api/workshop/daq/_id/frames/content.get.mjs +3 -1
  624. package/.output/server/chunks/routes/api/workshop/daq/_id/frames/content.get.mjs.map +1 -1
  625. package/.output/server/chunks/routes/api/workshop/daq/_id/frames.get.mjs +1 -1
  626. package/.output/server/chunks/routes/api/workshop/daq/_id/ingest.post.mjs +6 -3
  627. package/.output/server/chunks/routes/api/workshop/daq/_id/ingest.post.mjs.map +1 -1
  628. package/.output/server/chunks/routes/api/workshop/daq/_id/samples.get.mjs +2 -2
  629. package/.output/server/chunks/routes/api/workshop/daq/_id/test.post.mjs +1 -1
  630. package/.output/server/chunks/routes/api/workshop/daq/_id_.delete.mjs +1 -1
  631. package/.output/server/chunks/routes/api/workshop/daq/_id_.patch.mjs +1 -1
  632. package/.output/server/chunks/routes/api/workshop/daq/alarms/_id/ack.post.mjs +1 -1
  633. package/.output/server/chunks/routes/api/workshop/daq/alarms.get.mjs +1 -1
  634. package/.output/server/chunks/routes/api/workshop/daq/controller.post.mjs +1 -1
  635. package/.output/server/chunks/routes/api/workshop/daq/export/_id_.get.mjs +1 -1
  636. package/.output/server/chunks/routes/api/workshop/daq/export-file.get.mjs +1 -1
  637. package/.output/server/chunks/routes/api/workshop/daq/index.get.mjs +1 -1
  638. package/.output/server/chunks/routes/api/workshop/daq/index.post.mjs +1 -1
  639. package/.output/server/chunks/routes/api/workshop/daq/index2.post.mjs +2 -2
  640. package/.output/server/chunks/routes/api/workshop/daq/infra/reconnect.post.mjs +2 -2
  641. package/.output/server/chunks/routes/api/workshop/daq/infra.get.mjs +2 -2
  642. package/.output/server/chunks/routes/api/workshop/daq/query.get.mjs +1 -1
  643. package/.output/server/chunks/routes/api/workshop/daq/templates/_key_.delete.mjs +2 -2
  644. package/.output/server/chunks/routes/api/workshop/daq/templates/_key_.patch.mjs +2 -2
  645. package/.output/server/chunks/routes/api/workshop/daq/test-driver.post.mjs +2 -2
  646. package/.output/server/chunks/routes/api/workshop/dcw/_id/bind.post.mjs +2 -2
  647. package/.output/server/chunks/routes/api/workshop/dcw/_id/bindings.put.mjs +2 -2
  648. package/.output/server/chunks/routes/api/workshop/dcw/_id/param-ledger.get.mjs +2 -2
  649. package/.output/server/chunks/routes/api/workshop/dcw/_id/read.post.mjs +2 -2
  650. package/.output/server/chunks/routes/api/workshop/dcw/_id/test.post.mjs +2 -2
  651. package/.output/server/chunks/routes/api/workshop/dcw/_id/write.post.mjs +2 -2
  652. package/.output/server/chunks/routes/api/workshop/dcw/_id_.delete.mjs +2 -2
  653. package/.output/server/chunks/routes/api/workshop/dcw/_id_.patch.mjs +2 -2
  654. package/.output/server/chunks/routes/api/workshop/dcw/controller.post.mjs +2 -2
  655. package/.output/server/chunks/routes/api/workshop/dcw/index.get.mjs +2 -2
  656. package/.output/server/chunks/routes/api/workshop/dcw/index.post.mjs +2 -2
  657. package/.output/server/chunks/routes/api/workshop/dcw/index2.get.mjs +2 -2
  658. package/.output/server/chunks/routes/api/workshop/dcw/index2.post.mjs +2 -2
  659. package/.output/server/chunks/routes/api/workshop/dcw/index3.get.mjs +2 -2
  660. package/.output/server/chunks/routes/api/workshop/dcw/index3.post.mjs +2 -2
  661. package/.output/server/chunks/routes/api/workshop/dcw/index4.get.mjs +2 -2
  662. package/.output/server/chunks/routes/api/workshop/dcw/index4.post.mjs +2 -2
  663. package/.output/server/chunks/routes/api/workshop/dcw/index5.get.mjs +2 -2
  664. package/.output/server/chunks/routes/api/workshop/dcw/index5.post.mjs +2 -2
  665. package/.output/server/chunks/routes/api/workshop/dcw/index6.get.mjs +1 -1
  666. package/.output/server/chunks/routes/api/workshop/dcw/index7.get.mjs +1 -1
  667. package/.output/server/chunks/routes/api/workshop/dcw/journal/node/_nodeId/rollback.post.mjs +2 -2
  668. package/.output/server/chunks/routes/api/workshop/dcw/line/query.get.mjs +2 -2
  669. package/.output/server/chunks/routes/api/workshop/dcw/lines/_id/start.post.mjs +2 -2
  670. package/.output/server/chunks/routes/api/workshop/dcw/lines/_id/stop.post.mjs +2 -2
  671. package/.output/server/chunks/routes/api/workshop/dcw/lines/_id_.delete.mjs +2 -2
  672. package/.output/server/chunks/routes/api/workshop/dcw/lines/_id_.patch.mjs +1 -1
  673. package/.output/server/chunks/routes/api/workshop/dcw/mes-artifacts/file.get.mjs +2 -2
  674. package/.output/server/chunks/routes/api/workshop/dcw/mes-hook-test.post.mjs +5 -5
  675. package/.output/server/chunks/routes/api/workshop/dcw/mes-hook-test.post.mjs.map +1 -1
  676. package/.output/server/chunks/routes/api/workshop/dcw/mes-test-read.post.mjs +2 -2
  677. package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id/judge.post.mjs +2 -2
  678. package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id/rollback.post.mjs +2 -2
  679. package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id/series.get.mjs +2 -2
  680. package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id_.get.mjs +2 -2
  681. package/.output/server/chunks/routes/api/workshop/dcw/params/_id/read.post.mjs +2 -2
  682. package/.output/server/chunks/routes/api/workshop/dcw/params/_id/write.post.mjs +2 -2
  683. package/.output/server/chunks/routes/api/workshop/dcw/params/_id_.delete.mjs +2 -2
  684. package/.output/server/chunks/routes/api/workshop/dcw/params/_id_.patch.mjs +2 -2
  685. package/.output/server/chunks/routes/api/workshop/dcw/products/_id_.delete.mjs +8 -5
  686. package/.output/server/chunks/routes/api/workshop/dcw/products/_id_.delete.mjs.map +1 -1
  687. package/.output/server/chunks/routes/api/workshop/dcw/products/_id_.patch.mjs +9 -5
  688. package/.output/server/chunks/routes/api/workshop/dcw/products/_id_.patch.mjs.map +1 -1
  689. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/apply.post.mjs +2 -2
  690. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/mark-good.post.mjs +1 -1
  691. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/revert.post.mjs +1 -1
  692. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/rollback-good.post.mjs +2 -2
  693. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/versions.get.mjs +1 -1
  694. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id_.delete.mjs +1 -1
  695. package/.output/server/chunks/routes/api/workshop/dcw/recipes/index.patch.mjs +7 -4
  696. package/.output/server/chunks/routes/api/workshop/dcw/recipes/index.patch.mjs.map +1 -1
  697. package/.output/server/chunks/routes/api/workshop/dcw/runs/_id/close.post.mjs +2 -2
  698. package/.output/server/chunks/routes/api/workshop/dcw/runs/_id/data.get.mjs +2 -2
  699. package/.output/server/chunks/routes/api/workshop/dcw/runs/_id/rollback.post.mjs +2 -2
  700. package/.output/server/chunks/routes/api/workshop/dcw/templates/_key_.delete.mjs +2 -2
  701. package/.output/server/chunks/routes/api/workshop/dcw/templates/_key_.patch.mjs +2 -2
  702. package/.output/server/chunks/routes/api/workshop/dcw/test-driver.post.mjs +2 -2
  703. package/.output/server/chunks/routes/api/workshop/device-twins/_id/control.post.mjs +2 -2
  704. package/.output/server/chunks/routes/api/workshop/device-twins/_id/telemetry.post.mjs +2 -2
  705. package/.output/server/chunks/routes/api/workshop/device-twins/_id_.delete.mjs +2 -2
  706. package/.output/server/chunks/routes/api/workshop/device-twins/_id_.patch.mjs +2 -2
  707. package/.output/server/chunks/routes/api/workshop/eda/charts/_id_.delete.mjs +1 -1
  708. package/.output/server/chunks/routes/api/workshop/eda/charts/_id_.get.mjs +1 -1
  709. package/.output/server/chunks/routes/api/workshop/eda/charts/_id_.patch.mjs +1 -1
  710. package/.output/server/chunks/routes/api/workshop/eda/commonality.get.mjs +2 -2
  711. package/.output/server/chunks/routes/api/workshop/eda/dashboards/_id_.delete.mjs +1 -1
  712. package/.output/server/chunks/routes/api/workshop/eda/dashboards/_id_.get.mjs +1 -1
  713. package/.output/server/chunks/routes/api/workshop/eda/dashboards/_id_.patch.mjs +1 -1
  714. package/.output/server/chunks/routes/api/workshop/eda/features/jobs.get.mjs +1 -1
  715. package/.output/server/chunks/routes/api/workshop/eda/features/run.post.mjs +1 -1
  716. package/.output/server/chunks/routes/api/workshop/eda/golden/_id_.delete.mjs +1 -1
  717. package/.output/server/chunks/routes/api/workshop/eda/golden/deviation.get.mjs +1 -1
  718. package/.output/server/chunks/routes/api/workshop/eda/golden/single.get.mjs +1 -1
  719. package/.output/server/chunks/routes/api/workshop/eda/index.get.mjs +1 -1
  720. package/.output/server/chunks/routes/api/workshop/eda/index.post.mjs +1 -1
  721. package/.output/server/chunks/routes/api/workshop/eda/index2.get.mjs +1 -1
  722. package/.output/server/chunks/routes/api/workshop/eda/index2.post.mjs +1 -1
  723. package/.output/server/chunks/routes/api/workshop/eda/index3.get.mjs +1 -1
  724. package/.output/server/chunks/routes/api/workshop/eda/index3.post.mjs +1 -1
  725. package/.output/server/chunks/routes/api/workshop/eda/index4.get.mjs +1 -1
  726. package/.output/server/chunks/routes/api/workshop/eda/index4.post.mjs +1 -1
  727. package/.output/server/chunks/routes/api/workshop/eda/index5.get.mjs +1 -1
  728. package/.output/server/chunks/routes/api/workshop/eda/index5.post.mjs +1 -1
  729. package/.output/server/chunks/routes/api/workshop/eda/index6.get.mjs +1 -1
  730. package/.output/server/chunks/routes/api/workshop/eda/index6.post.mjs +1 -1
  731. package/.output/server/chunks/routes/api/workshop/eda/index7.get.mjs +1 -1
  732. package/.output/server/chunks/routes/api/workshop/eda/index7.post.mjs +1 -1
  733. package/.output/server/chunks/routes/api/workshop/eda/index8.get.mjs +33 -0
  734. package/.output/server/chunks/routes/api/workshop/eda/index8.get.mjs.map +1 -0
  735. package/.output/server/chunks/routes/api/workshop/eda/index8.post.mjs +41 -0
  736. package/.output/server/chunks/routes/api/workshop/eda/index8.post.mjs.map +1 -0
  737. package/.output/server/chunks/routes/api/workshop/eda/ocap/_id_.get.mjs +1 -1
  738. package/.output/server/chunks/routes/api/workshop/eda/ocap/_id_.patch.mjs +1 -1
  739. package/.output/server/chunks/routes/api/workshop/eda/runs/_id/labels.patch.mjs +1 -1
  740. package/.output/server/chunks/routes/api/workshop/eda/runs.get.mjs +1 -1
  741. package/.output/server/chunks/routes/api/workshop/eda/spc/_id/recompute.post.mjs +1 -1
  742. package/.output/server/chunks/routes/api/workshop/eda/spc/_id_.delete.mjs +1 -1
  743. package/.output/server/chunks/routes/api/workshop/eda/spc/_id_.get.mjs +1 -1
  744. package/.output/server/chunks/routes/api/workshop/eda/templates/_id_.delete.mjs +36 -0
  745. package/.output/server/chunks/routes/api/workshop/eda/templates/_id_.delete.mjs.map +1 -0
  746. package/.output/server/chunks/routes/api/workshop/eda/templates/_id_.get.mjs +37 -0
  747. package/.output/server/chunks/routes/api/workshop/eda/templates/_id_.get.mjs.map +1 -0
  748. package/.output/server/chunks/routes/api/workshop/eda/templates/_id_.patch.mjs +42 -0
  749. package/.output/server/chunks/routes/api/workshop/eda/templates/_id_.patch.mjs.map +1 -0
  750. package/.output/server/chunks/routes/api/workshop/eda/vm/predict.post.mjs +2 -2
  751. package/.output/server/chunks/routes/api/workshop/exp/confirmations/_id/decide.post.mjs +2 -2
  752. package/.output/server/chunks/routes/api/workshop/exp/index.get.mjs +2 -2
  753. package/.output/server/chunks/routes/api/workshop/fs/dirs.get.mjs +2 -2
  754. package/.output/server/chunks/routes/api/workshop/harnesses/_id/providers.get.mjs +2 -2
  755. package/.output/server/chunks/routes/api/workshop/harnesses.get.mjs +2 -2
  756. package/.output/server/chunks/routes/api/workshop/hitl/pending.get.mjs +2 -2
  757. package/.output/server/chunks/routes/api/workshop/hitl/respond.post.mjs +2 -2
  758. package/.output/server/chunks/routes/api/workshop/index.get.mjs +1 -1
  759. package/.output/server/chunks/routes/api/workshop/index.mjs +2 -2
  760. package/.output/server/chunks/routes/api/workshop/index.post.mjs +1 -1
  761. package/.output/server/chunks/routes/api/workshop/index.put.mjs +2 -2
  762. package/.output/server/chunks/routes/api/workshop/index10.get.mjs +1 -1
  763. package/.output/server/chunks/routes/api/workshop/index10.post.mjs +33 -0
  764. package/.output/server/chunks/routes/api/workshop/index10.post.mjs.map +1 -0
  765. package/.output/server/chunks/routes/api/workshop/index11.get.mjs +1 -1
  766. package/.output/server/chunks/routes/api/workshop/index12.get.mjs +2 -2
  767. package/.output/server/chunks/routes/api/workshop/index13.get.mjs +1 -1
  768. package/.output/server/chunks/routes/api/workshop/index14.get.mjs +1 -1
  769. package/.output/server/chunks/routes/api/workshop/index15.get.mjs +1 -1
  770. package/.output/server/chunks/routes/api/workshop/index16.get.mjs +1 -1
  771. package/.output/server/chunks/routes/api/workshop/index2.get.mjs +1 -1
  772. package/.output/server/chunks/routes/api/workshop/index2.post.mjs +46 -47
  773. package/.output/server/chunks/routes/api/workshop/index2.post.mjs.map +1 -1
  774. package/.output/server/chunks/routes/api/workshop/index3.get.mjs +1 -1
  775. package/.output/server/chunks/routes/api/workshop/index3.post.mjs +47 -24
  776. package/.output/server/chunks/routes/api/workshop/index3.post.mjs.map +1 -1
  777. package/.output/server/chunks/routes/api/workshop/index4.get.mjs +1 -1
  778. package/.output/server/chunks/routes/api/workshop/index4.post.mjs +11 -10
  779. package/.output/server/chunks/routes/api/workshop/index4.post.mjs.map +1 -1
  780. package/.output/server/chunks/routes/api/workshop/index5.get.mjs +1 -1
  781. package/.output/server/chunks/routes/api/workshop/index5.post.mjs +23 -20
  782. package/.output/server/chunks/routes/api/workshop/index5.post.mjs.map +1 -1
  783. package/.output/server/chunks/routes/api/workshop/index6.get.mjs +2 -2
  784. package/.output/server/chunks/routes/api/workshop/index6.post.mjs +19 -43
  785. package/.output/server/chunks/routes/api/workshop/index6.post.mjs.map +1 -1
  786. package/.output/server/chunks/routes/api/workshop/index7.get.mjs +2 -2
  787. package/.output/server/chunks/routes/api/workshop/index7.post.mjs +44 -18
  788. package/.output/server/chunks/routes/api/workshop/index7.post.mjs.map +1 -1
  789. package/.output/server/chunks/routes/api/workshop/index8.get.mjs +2 -2
  790. package/.output/server/chunks/routes/api/workshop/index8.post.mjs +14 -16
  791. package/.output/server/chunks/routes/api/workshop/index8.post.mjs.map +1 -1
  792. package/.output/server/chunks/routes/api/workshop/index9.get.mjs +1 -1
  793. package/.output/server/chunks/routes/api/workshop/index9.post.mjs +19 -5
  794. package/.output/server/chunks/routes/api/workshop/index9.post.mjs.map +1 -1
  795. package/.output/server/chunks/routes/api/workshop/mailbox/all.get.mjs +1 -1
  796. package/.output/server/chunks/routes/api/workshop/mailbox.get.mjs +1 -1
  797. package/.output/server/chunks/routes/api/workshop/memories/maintenance.post.mjs +1 -1
  798. package/.output/server/chunks/routes/api/workshop/mes/datasets.get.mjs +2 -2
  799. package/.output/server/chunks/routes/api/workshop/mes/index.get.mjs +33 -0
  800. package/.output/server/chunks/routes/api/workshop/mes/index.get.mjs.map +1 -0
  801. package/.output/server/chunks/routes/api/workshop/mes/index.put.mjs +56 -0
  802. package/.output/server/chunks/routes/api/workshop/mes/index.put.mjs.map +1 -0
  803. package/.output/server/chunks/routes/api/workshop/mes/points.get.mjs +1 -1
  804. package/.output/server/chunks/routes/api/workshop/mes/preview.post.mjs +1 -1
  805. package/.output/server/chunks/routes/api/workshop/mes/secrets/_ref_.delete.mjs +49 -0
  806. package/.output/server/chunks/routes/api/workshop/mes/secrets/_ref_.delete.mjs.map +1 -0
  807. package/.output/server/chunks/routes/api/workshop/notifications/read.post.mjs +1 -1
  808. package/.output/server/chunks/routes/api/workshop/ontology/drafts/_draftId/autofix.mjs +2 -2
  809. package/.output/server/chunks/routes/api/workshop/ontology/drafts/_draftId/compile.mjs +2 -2
  810. package/.output/server/chunks/routes/api/workshop/ontology/drafts/_draftId/evidence.mjs +2 -2
  811. package/.output/server/chunks/routes/api/workshop/ontology/drafts/_draftId/publish.mjs +2 -2
  812. package/.output/server/chunks/routes/api/workshop/ontology/drafts/_draftId/rules/_ruleId/approval-decision.mjs +2 -2
  813. package/.output/server/chunks/routes/api/workshop/ontology/drafts/_draftId/rules/_ruleId/approval.mjs +2 -2
  814. package/.output/server/chunks/routes/api/workshop/ontology/drafts/_draftId/rules/_ruleId/transition.mjs +2 -2
  815. package/.output/server/chunks/routes/api/workshop/ontology/drafts/_draftId/subgraph.mjs +2 -2
  816. package/.output/server/chunks/routes/api/workshop/ontology/drafts/_draftId/validate.mjs +2 -2
  817. package/.output/server/chunks/routes/api/workshop/ontology/drafts/_draftId_.mjs +2 -2
  818. package/.output/server/chunks/routes/api/workshop/ontology/export/_ontologyId_.mjs +2 -2
  819. package/.output/server/chunks/routes/api/workshop/ontology/index.mjs +2 -2
  820. package/.output/server/chunks/routes/api/workshop/ontology/scene.mjs +2 -2
  821. package/.output/server/chunks/routes/api/workshop/ontology/traces/_ontologyId_.mjs +2 -2
  822. package/.output/server/chunks/routes/api/workshop/ontology/versions/_ontologyId/compare.mjs +2 -2
  823. package/.output/server/chunks/routes/api/workshop/ontology/versions/_ontologyId_.mjs +2 -2
  824. package/.output/server/chunks/routes/api/workshop/optimization/bindings/_id_.delete.mjs +1 -1
  825. package/.output/server/chunks/routes/api/workshop/optimization/capabilities.get.mjs +2 -2
  826. package/.output/server/chunks/routes/api/workshop/optimization/index.get.mjs +2 -2
  827. package/.output/server/chunks/routes/api/workshop/optimization/index.mjs +2 -2
  828. package/.output/server/chunks/routes/api/workshop/optimization/index2.mjs +2 -2
  829. package/.output/server/chunks/routes/api/workshop/optimization/profiles/_id/publish.post.mjs +2 -2
  830. package/.output/server/chunks/routes/api/workshop/optimization/recommendations/_id/crosscheck.post.mjs +2 -2
  831. package/.output/server/chunks/routes/api/workshop/optimization/recommendations/_id/dispatch.post.mjs +2 -2
  832. package/.output/server/chunks/routes/api/workshop/optimization/solve.post.mjs +2 -2
  833. package/.output/server/chunks/routes/api/workshop/plugins/_name/disable.post.mjs +2 -2
  834. package/.output/server/chunks/routes/api/workshop/plugins/_name/enable.post.mjs +2 -2
  835. package/.output/server/chunks/routes/api/workshop/plugins/index.get.mjs +1 -1
  836. package/.output/server/chunks/routes/api/workshop/process-model/datasets.post.mjs +2 -2
  837. package/.output/server/chunks/routes/api/workshop/process-model/eligibility.mjs +2 -2
  838. package/.output/server/chunks/routes/api/workshop/process-model/experiments.mjs +2 -2
  839. package/.output/server/chunks/routes/api/workshop/process-model/index.mjs +2 -2
  840. package/.output/server/chunks/routes/api/workshop/process-model/specs/_id/publish.post.mjs +2 -2
  841. package/.output/server/chunks/routes/api/workshop/process-model/train.post.mjs +2 -2
  842. package/.output/server/chunks/routes/api/workshop/runtime.get.mjs +1 -1
  843. package/.output/server/chunks/routes/api/workshop/scene/layouts/_channelId_.delete.mjs +2 -2
  844. package/.output/server/chunks/routes/api/workshop/scene/layouts/_channelId_.put.mjs +2 -2
  845. package/.output/server/chunks/routes/api/workshop/scene/layouts.get.mjs +1 -1
  846. package/.output/server/chunks/routes/api/workshop/schedules/_id/run.post.mjs +1 -1
  847. package/.output/server/chunks/routes/api/workshop/schedules/_id/runs.get.mjs +1 -1
  848. package/.output/server/chunks/routes/api/workshop/schedules/_id_.delete.mjs +1 -1
  849. package/.output/server/chunks/routes/api/workshop/schedules/_id_.get.mjs +1 -1
  850. package/.output/server/chunks/routes/api/workshop/schedules/_id_.patch.mjs +1 -1
  851. package/.output/server/chunks/routes/api/workshop/tasks/_id/complete.post.mjs +1 -1
  852. package/.output/server/chunks/routes/api/workshop/tasks/_id/dispatch.post.mjs +1 -1
  853. package/.output/server/chunks/routes/api/workshop/tasks/_id/index.post.mjs +1 -1
  854. package/.output/server/chunks/routes/api/workshop/tasks/_id/reassign.post.mjs +1 -1
  855. package/.output/server/chunks/routes/api/workshop/tasks/_id/reopen.post.mjs +1 -1
  856. package/.output/server/chunks/routes/api/workshop/tasks/_id/report.post.mjs +1 -1
  857. package/.output/server/chunks/routes/api/workshop/tasks/_id/retry.post.mjs +1 -1
  858. package/.output/server/chunks/routes/api/workshop/tasks/_id/update.post.mjs +1 -1
  859. package/.output/server/chunks/routes/api/workshop/tasks/_id_.get.mjs +1 -1
  860. package/.output/server/chunks/routes/api/workshop/tasks.get.mjs +1 -1
  861. package/.output/server/chunks/routes/api/workshop/teams/_id/deploy.post.mjs +2 -2
  862. package/.output/server/chunks/routes/api/workshop/teams/_id/index.get.mjs +1 -1
  863. package/.output/server/chunks/routes/api/workshop/teams/_id/index.post.mjs +1 -1
  864. package/.output/server/chunks/routes/api/workshop/teams/_id/index.put.mjs +2 -2
  865. package/.output/server/chunks/routes/api/workshop/teams/_id/index2.get.mjs +2 -2
  866. package/.output/server/chunks/routes/api/workshop/teams/_id/members/_agentId_.delete.mjs +1 -1
  867. package/.output/server/chunks/routes/api/workshop/teams/_id_.delete.mjs +1 -1
  868. package/.output/server/chunks/routes/api/workshop/teams/_id_.get.mjs +1 -1
  869. package/.output/server/chunks/routes/api/workshop/teams/_id_.patch.mjs +1 -1
  870. package/.output/server/chunks/routes/api/workshop/tools/_name_.get.mjs +1 -1
  871. package/.output/server/chunks/routes/api/workshop/tools/sync.post.mjs +2 -2
  872. package/.output/server/chunks/routes/api/workshop/users/me.get.mjs +1 -1
  873. package/.output/server/chunks/routes/api/workshop/users/register.post.mjs +1 -1
  874. package/.output/server/chunks/routes/api/workshop/workspaces/_id/channel-templates/_tplId_.post.mjs +3 -3
  875. package/.output/server/chunks/routes/api/workshop/workspaces/_id/channels/_channelId_.delete.mjs +1 -1
  876. package/.output/server/chunks/routes/api/workshop/workspaces/_id/channels/_channelId_.post.mjs +1 -1
  877. package/.output/server/chunks/routes/api/workshop/workspaces/index.delete.mjs +1 -1
  878. package/.output/server/chunks/routes/renderer.mjs +2 -2
  879. package/.output/server/chunks/routes/renderer.mjs.map +1 -1
  880. package/.output/server/chunks/virtual/entry.mjs +10869 -9372
  881. package/.output/server/chunks/virtual/entry.mjs.map +1 -1
  882. package/.output/server/chunks/virtual/precomputed.mjs +1 -1
  883. package/.output/server/chunks/virtual/precomputed.mjs.map +1 -1
  884. package/.output/server/index.mjs +1 -1
  885. package/.output/server/package.json +1 -1
  886. package/README-zh.md +21 -8
  887. package/README.md +21 -8
  888. package/app/.mimosa/hook-state/sess_05189059-e42d-4188-8911-4f7baabe009b.json +1 -0
  889. package/app/.mimosa/hook-state/sess_05189059-e42d-4188-8911-4f7baabe009b.mtg0vz68-49792-75b0709555.baseline/1459e6269990a5d229b9228c8b2f62ffaa7d350068380ae8b875fee0db45cca6.source +180 -0
  890. package/app/.mimosa/hook-state/sess_05189059-e42d-4188-8911-4f7baabe009b.mtg0vz68-49792-75b0709555.baseline/c2991e909c70c5c12b90a407c7adcf63384c51668a2b334e6e047fa675c268fe.source +305 -0
  891. package/app/.mimosa/hook-state/sess_05189059-e42d-4188-8911-4f7baabe009b.mtg0vz68-49792-75b0709555.baseline/e09129039d1e27e3fac24becc9bdafd2d1a7c8049bff24173df007be865f0165.source +264 -0
  892. package/app/.mimosa/hook-status/sess_05189059-e42d-4188-8911-4f7baabe009b-28ef7c75ea.json +14 -0
  893. package/app/components/AwChart.vue +46 -3
  894. package/app/components/AwLogo.vue +75 -75
  895. package/app/components/aml/AmlDatasetFormModal.vue +279 -279
  896. package/app/components/aml/AmlDatasetTable.vue +319 -319
  897. package/app/components/aml/AmlExperimentsTable.vue +142 -142
  898. package/app/components/aml/AmlInfraBanner.vue +23 -23
  899. package/app/components/aml/AmlJobsTable.vue +248 -248
  900. package/app/components/aml/AmlOverviewBar.vue +62 -62
  901. package/app/components/aml/AmlPageHeader.vue +47 -47
  902. package/app/components/aml/AmlPredictConsole.vue +201 -201
  903. package/app/components/app-header/HitlBell.vue +423 -423
  904. package/app/components/daq/DaqAddNodeModal.vue +209 -209
  905. package/app/components/daq/DaqAlarmBar.vue +46 -46
  906. package/app/components/daq/DaqControlCard.vue +159 -159
  907. package/app/components/daq/DaqInfraBanner.vue +31 -31
  908. package/app/components/daq/DaqLineBanner.vue +47 -47
  909. package/app/components/daq/DaqNodePanel.vue +396 -396
  910. package/app/components/daq/DaqOptPanel.vue +197 -197
  911. package/app/components/daq/DaqTemplateModal.vue +246 -246
  912. package/app/components/dashboard/DashboardGaugeBand.vue +78 -78
  913. package/app/components/dashboard/DashboardHero.vue +209 -209
  914. package/app/components/dashboard/DashboardLineStatePanel.vue +78 -78
  915. package/app/components/dashboard/DashboardNodeStatePanel.vue +46 -46
  916. package/app/components/dashboard/DashboardPipelinePanel.vue +46 -46
  917. package/app/components/dashboard/DashboardTrendPanel.vue +83 -83
  918. package/app/components/dashboard/DashboardWritePanel.vue +52 -52
  919. package/app/components/dcw/DcwCreateLineModal.vue +105 -105
  920. package/app/components/dcw/DcwDeleteLineModal.vue +73 -73
  921. package/app/components/dcw/DcwDetailTemplateModal.vue +238 -238
  922. package/app/components/dcw/DcwLedgerCard.vue +160 -160
  923. package/app/components/dcw/DcwMesArtifacts.vue +140 -140
  924. package/app/components/dcw/DcwProductCreateModal.vue +113 -113
  925. package/app/components/dcw/DcwRecipeDispatchHistoryModal.vue +244 -244
  926. package/app/components/dcw/DcwRecipeEditModal.vue +399 -399
  927. package/app/components/dcw/DcwRecipeHistoryModal.vue +165 -165
  928. package/app/components/dcw/DcwRunDataModal.vue +191 -191
  929. package/app/components/dcw/DcwTemplateModal.vue +227 -227
  930. package/app/components/dcw/DcwWriteHistoryCard.vue +96 -96
  931. package/app/components/dcw/ExpConfirmCard.vue +103 -103
  932. package/app/components/dcw/RecipeDispatchApprovalCard.vue +330 -330
  933. package/app/components/logs/LogsPageHead.vue +71 -71
  934. package/app/components/monitor/MonitorAgentTable.vue +143 -143
  935. package/app/components/monitor/MonitorChannelTable.vue +80 -80
  936. package/app/components/monitor/MonitorLoginGate.vue +24 -24
  937. package/app/components/monitor/MonitorPageHead.vue +92 -92
  938. package/app/components/monitor/MonitorProcessTable.vue +159 -159
  939. package/app/components/ontology/OntologyGraph.vue +356 -356
  940. package/app/components/operations/OperationsFilterCard.vue +164 -164
  941. package/app/components/operations/OperationsPageHead.vue +47 -47
  942. package/app/components/tokens/TokenCreateModal.vue +42 -42
  943. package/app/components/tokens/TokenOnceModal.vue +164 -164
  944. package/app/components/tokens/TokenRenameModal.vue +40 -40
  945. package/app/components/tokens/TokensPageHead.vue +76 -76
  946. package/app/components/workshop/A2aRpcDebugger.vue +237 -237
  947. package/app/components/workshop/AgentInspectorDrawer.vue +424 -424
  948. package/app/components/workshop/AgentLanesView.vue +278 -278
  949. package/app/components/workshop/ArtifactCard.vue +120 -120
  950. package/app/components/workshop/AssetLibrary.vue +452 -452
  951. package/app/components/workshop/ChatMemberPanel.vue +556 -556
  952. package/app/components/workshop/CommandPalette.vue +270 -270
  953. package/app/components/workshop/Composer.vue +540 -540
  954. package/app/components/workshop/DaqTemplateIcon.vue +33 -33
  955. package/app/components/workshop/DeviceTwinPanel.vue +167 -167
  956. package/app/components/workshop/FileSelectorModal.vue +188 -188
  957. package/app/components/workshop/InspectorPanel.vue +301 -301
  958. package/app/components/workshop/PluginSlot.vue +120 -120
  959. package/app/components/workshop/TranscriptTimeline.vue +223 -223
  960. package/app/components/workshop/agents/AgentTemplateEditModal.vue +139 -139
  961. package/app/components/workshop/blocks/ClusterArtifact.vue +61 -61
  962. package/app/components/workshop/blocks/ClusterError.vue +85 -85
  963. package/app/components/workshop/blocks/ClusterLife.vue +87 -87
  964. package/app/components/workshop/blocks/ClusterMember.vue +95 -95
  965. package/app/components/workshop/blocks/ClusterMemory.vue +84 -84
  966. package/app/components/workshop/blocks/ClusterOther.vue +67 -67
  967. package/app/components/workshop/blocks/ClusterStatus.vue +149 -149
  968. package/app/components/workshop/blocks/ClusterTool.vue +176 -176
  969. package/app/components/workshop/blocks/EventBlockAvatar.vue +114 -114
  970. package/app/components/workshop/blocks/EventBlockHead.vue +232 -232
  971. package/app/components/workshop/composer/ComposerToolbar.vue +278 -278
  972. package/app/components/workshop/composer/MentionMenu.vue +135 -135
  973. package/app/components/workshop/composer/ReplyChip.vue +65 -65
  974. package/app/components/workshop/composer/StatusChip.vue +171 -171
  975. package/app/components/workshop/console/Dock.vue +71 -71
  976. package/app/components/workshop/console/LeftPane.vue +84 -84
  977. package/app/components/workshop/device-twin/DeviceTwinCard.vue +265 -265
  978. package/app/components/workshop/device-twin/DeviceTwinDcwSection.vue +203 -203
  979. package/app/components/workshop/lanes/AddMemberModal.vue +270 -270
  980. package/app/components/workshop/lanes/EditMemberModal.vue +106 -106
  981. package/app/components/workshop/lanes/LanesToolbar.vue +97 -97
  982. package/app/components/workshop/session-list/ChannelSettingsModal.vue +112 -1
  983. package/app/components/workshop/session-list/MountChannelModal.vue +124 -124
  984. package/app/components/workshop/session-list/SaveTemplateModal.vue +93 -93
  985. package/app/components/workshop/task-board/Card.vue +172 -172
  986. package/app/components/workshop/task-board/Column.vue +151 -151
  987. package/app/components/workshop/task-board/List.vue +157 -157
  988. package/app/components/workshop/task-board/StatusMenu.vue +88 -88
  989. package/app/components/workshop/teams/TeamAddMemberModal.vue +53 -53
  990. package/app/components/workshop/teams/TeamCreateModal.vue +94 -94
  991. package/app/components/workshop/teams/TeamDeployModal.vue +40 -40
  992. package/app/components/workshop/teams/TeamPluginModal.vue +119 -119
  993. package/app/components/workshop/terminal/OmpTerminalPanel.vue +270 -270
  994. package/app/components/workshop/terminal/TerminalHitlCard.vue +170 -170
  995. package/app/components/workshop/town/TownScene.ts +466 -466
  996. package/app/components/workshop/town/TownView.vue +561 -561
  997. package/app/components/workshop/town/components/AutoModeConfirmModal.vue +94 -94
  998. package/app/components/workshop/town/components/TownAgentBindings.vue +405 -405
  999. package/app/components/workshop/town/components/TownAgentInspector.vue +554 -554
  1000. package/app/components/workshop/town/components/TownAlarmList.vue +147 -147
  1001. package/app/components/workshop/town/components/TownBoundaryPanel.vue +350 -350
  1002. package/app/components/workshop/town/components/TownCalloutLayer.vue +147 -147
  1003. package/app/components/workshop/town/components/TownChannelDock.vue +116 -116
  1004. package/app/components/workshop/town/components/TownControlDock.vue +405 -405
  1005. package/app/components/workshop/town/components/TownDaqNodeInspector.vue +345 -345
  1006. package/app/components/workshop/town/components/TownDaqTree.vue +366 -366
  1007. package/app/components/workshop/town/components/TownDcwBindSection.vue +473 -473
  1008. package/app/components/workshop/town/components/TownDcwNodeInspector.vue +185 -185
  1009. package/app/components/workshop/town/components/TownDcwTree.vue +280 -280
  1010. package/app/components/workshop/town/components/TownDeviceBindings.vue +394 -394
  1011. package/app/components/workshop/town/components/TownDeviceTransform.vue +248 -248
  1012. package/app/components/workshop/town/components/TownEventList.vue +120 -120
  1013. package/app/components/workshop/town/components/TownHealthBody.vue +100 -100
  1014. package/app/components/workshop/town/components/TownKpiStrip.vue +207 -207
  1015. package/app/components/workshop/town/components/TownLeftRail.vue +308 -308
  1016. package/app/components/workshop/town/components/TownLoadingMask.vue +61 -61
  1017. package/app/components/workshop/town/components/TownNavMap.vue +154 -154
  1018. package/app/components/workshop/town/components/TownRightRail.vue +543 -543
  1019. package/app/components/workshop/town/components/TownStage.vue +281 -281
  1020. package/app/components/workshop/town/components/TownStageTop.vue +238 -238
  1021. package/app/components/workshop/town/components/TownStatusBar.vue +108 -108
  1022. package/app/components/workshop/town/components/TownTopNav.vue +367 -367
  1023. package/app/components/workshop/town/components/TownTrendDock.vue +178 -178
  1024. package/app/components/workshop/town/scene/town-scene-agents.ts +254 -254
  1025. package/app/components/workshop/town/scene/town-scene-behavior.ts +194 -194
  1026. package/app/components/workshop/town/scene/town-scene-bubbles.ts +96 -96
  1027. package/app/components/workshop/town/scene/town-scene-core.ts +158 -158
  1028. package/app/components/workshop/town/scene/town-scene-models.ts +109 -109
  1029. package/app/components/workshop/town/scene/town-scene-visuals.ts +279 -279
  1030. package/app/components/workshop/town/scene/town-scene3d-agents.ts +308 -308
  1031. package/app/components/workshop/town/scene/town-scene3d-blocks.ts +297 -297
  1032. package/app/components/workshop/town/scene/town-scene3d-bubbles.ts +281 -281
  1033. package/app/components/workshop/town/scene/town-scene3d-camera.ts +282 -282
  1034. package/app/components/workshop/town/scene/town-scene3d-devices.ts +433 -433
  1035. package/app/components/workshop/town/scene/town-scene3d-editing.ts +490 -490
  1036. package/app/components/workshop/town/scene/town-scene3d-events.ts +173 -173
  1037. package/app/components/workshop/town/scene/town-scene3d-factory.ts +412 -412
  1038. package/app/components/workshop/town/scene/town-scene3d-hud.ts +110 -110
  1039. package/app/components/workshop/town/scene/town-scene3d-lifecycle.ts +144 -144
  1040. package/app/components/workshop/town/scene/town-scene3d-links.ts +141 -141
  1041. package/app/components/workshop/town/scene/town-scene3d-loop.ts +286 -286
  1042. package/app/components/workshop/town/scene/town-scene3d-models.ts +154 -154
  1043. package/app/components/workshop/town/scene/town-scene3d-nodes.ts +562 -562
  1044. package/app/components/workshop/town/scene/town-scene3d-ranges.ts +273 -273
  1045. package/app/components/workshop/town/scene/town-scene3d-renderer.ts +320 -320
  1046. package/app/components/workshop/town/scene/town-scene3d-selection.ts +257 -257
  1047. package/app/components/workshop/town/scene/town-scene3d-types.ts +264 -264
  1048. package/app/components/workshop/transcript/TranscriptBlockList.vue +68 -68
  1049. package/app/components/workshop/transcript/TranscriptEarlierPager.vue +81 -81
  1050. package/app/components/workshop/transcript/TranscriptFilterBar.vue +126 -126
  1051. package/app/components/workshop/workbench/CreateWorkspaceModal.vue +36 -36
  1052. package/app/components/workshop/workbench/WorkspaceEmpty.vue +56 -56
  1053. package/app/composables/useResponsive.ts +88 -88
  1054. package/app/composables/workshop/device-twin-types.ts +29 -29
  1055. package/app/composables/workshop/event-blocks/attention.ts +58 -58
  1056. package/app/composables/workshop/event-blocks/classify.ts +44 -44
  1057. package/app/composables/workshop/event-blocks/clusterer.ts +231 -231
  1058. package/app/composables/workshop/event-blocks/fold-stream.ts +45 -45
  1059. package/app/composables/workshop/event-blocks/markdown.ts +81 -81
  1060. package/app/composables/workshop/event-blocks/mentions.ts +49 -49
  1061. package/app/composables/workshop/event-blocks/text-utils.ts +100 -100
  1062. package/app/composables/workshop/event-blocks/types.ts +40 -40
  1063. package/app/composables/workshop/town/town-relay-props.ts +231 -231
  1064. package/app/composables/workshop/town/town-view-types.ts +145 -145
  1065. package/app/composables/workshop/town/useTownAgentBindings.ts +182 -182
  1066. package/app/composables/workshop/town/useTownAgentChat.ts +203 -203
  1067. package/app/composables/workshop/town/useTownAlarms.ts +36 -36
  1068. package/app/composables/workshop/town/useTownCallouts.ts +174 -174
  1069. package/app/composables/workshop/town/useTownChannels.ts +220 -220
  1070. package/app/composables/workshop/town/useTownHealth.ts +66 -66
  1071. package/app/composables/workshop/town/useTownHudTickers.ts +77 -77
  1072. package/app/composables/workshop/town/useTownLayout.ts +277 -277
  1073. package/app/composables/workshop/town/useTownNavMap.ts +301 -301
  1074. package/app/composables/workshop/town/useTownNodeBindings.ts +345 -345
  1075. package/app/composables/workshop/town/useTownPanelDrag.ts +91 -91
  1076. package/app/composables/workshop/town/useTownRailData.ts +421 -421
  1077. package/app/composables/workshop/town/useTownSceneControl.ts +92 -92
  1078. package/app/composables/workshop/town/useTownSceneInput.ts +275 -275
  1079. package/app/composables/workshop/town/useTownSceneRuntime.ts +390 -390
  1080. package/app/composables/workshop/town/useTownSheets.ts +41 -41
  1081. package/app/composables/workshop/town/useTownTrends.ts +93 -93
  1082. package/app/composables/workshop/useChannelList.ts +88 -88
  1083. package/app/composables/workshop/useChannelTerminals.ts +65 -65
  1084. package/app/composables/workshop/useComposerMentions.ts +130 -130
  1085. package/app/composables/workshop/useDcwStream.ts +374 -374
  1086. package/app/composables/workshop/useDeviceTwinDcwWrite.ts +77 -77
  1087. package/app/composables/workshop/useDeviceTwinPanel.ts +56 -56
  1088. package/app/composables/workshop/useEscClose.ts +44 -44
  1089. package/app/composables/workshop/useEventBlockView.ts +159 -159
  1090. package/app/composables/workshop/useEventBlocks.ts +33 -33
  1091. package/app/composables/workshop/useHitlAnswer.ts +184 -184
  1092. package/app/composables/workshop/useLaneWidths.ts +27 -27
  1093. package/app/composables/workshop/useOmpTerminalSession.ts +424 -424
  1094. package/app/composables/workshop/usePluginAdmin.ts +152 -152
  1095. package/app/composables/workshop/usePluginPanels.ts +72 -72
  1096. package/app/composables/workshop/useRuntimeConfigDraft.ts +118 -118
  1097. package/app/composables/workshop/useSettingsGroups.ts +243 -243
  1098. package/app/composables/workshop/useTaskBoardColumns.ts +47 -47
  1099. package/app/composables/workshop/useTerminalRenderer.ts +308 -308
  1100. package/app/composables/workshop/useTranscriptEnterStage.ts +48 -48
  1101. package/app/composables/workshop/useTranscriptHistory.ts +52 -52
  1102. package/app/composables/workshop/useTranscriptScroll.ts +113 -113
  1103. package/app/composables/workshop/useVisibleInterval.ts +42 -42
  1104. package/app/composables/workshop/useWorkshopApi.ts +6 -0
  1105. package/app/composables/workshop/useWorkshopWs.ts +265 -265
  1106. package/app/config/index.ts +1 -1
  1107. package/app/config/schema.ts +5 -0
  1108. package/app/middleware/locale-cookie.global.ts +22 -22
  1109. package/app/pages/aml/api.ts +6 -6
  1110. package/app/pages/aml/composables/useAmlDatasets.ts +38 -38
  1111. package/app/pages/aml/composables/useAmlEntities.ts +57 -57
  1112. package/app/pages/aml/composables/useAmlEnv.ts +191 -191
  1113. package/app/pages/aml/composables/useAmlExperiments.ts +45 -45
  1114. package/app/pages/aml/composables/useAmlFormat.ts +44 -44
  1115. package/app/pages/aml/composables/useAmlJobs.ts +131 -131
  1116. package/app/pages/aml/composables/useAmlModels.ts +56 -56
  1117. package/app/pages/aml/composables/useAmlNotes.ts +47 -47
  1118. package/app/pages/aml/composables/useAmlPredict.ts +93 -93
  1119. package/app/pages/aml/constants.ts +63 -63
  1120. package/app/pages/aml/index.vue +236 -236
  1121. package/app/pages/composables/useDashboardCharts.ts +192 -192
  1122. package/app/pages/composables/useDashboardData.ts +144 -144
  1123. package/app/pages/daq/composables/useDaqAddNode.ts +126 -126
  1124. package/app/pages/daq/composables/useDaqDetailBinding.ts +29 -29
  1125. package/app/pages/daq/composables/useDaqDetailFrames.ts +42 -42
  1126. package/app/pages/daq/composables/useDaqDetailNode.ts +53 -53
  1127. package/app/pages/daq/composables/useDaqDetailParams.ts +138 -138
  1128. package/app/pages/daq/composables/useDaqFilters.ts +187 -187
  1129. package/app/pages/daq/composables/useDaqNodeWindow.ts +86 -86
  1130. package/app/pages/daq/composables/useDaqOptimizations.ts +99 -99
  1131. package/app/pages/daq/composables/useDaqTemplates.ts +152 -152
  1132. package/app/pages/daq/index.vue +260 -260
  1133. package/app/pages/dcw/composables/useDcwCards.ts +27 -27
  1134. package/app/pages/dcw/composables/useDcwDetailScope.ts +145 -145
  1135. package/app/pages/dcw/composables/useDcwDetailTemplates.ts +94 -94
  1136. package/app/pages/dcw/composables/useDcwFilter.ts +29 -29
  1137. package/app/pages/dcw/composables/useDcwLedger.ts +34 -34
  1138. package/app/pages/dcw/composables/useDcwLineMutations.ts +115 -115
  1139. package/app/pages/dcw/composables/useDcwLineRun.ts +60 -60
  1140. package/app/pages/dcw/composables/useDcwProducts.ts +54 -54
  1141. package/app/pages/dcw/composables/useDcwQuery.ts +68 -68
  1142. package/app/pages/dcw/composables/useDcwQuickActions.ts +47 -47
  1143. package/app/pages/dcw/composables/useDcwRecipes.ts +256 -256
  1144. package/app/pages/dcw/composables/useDcwTemplates.ts +50 -50
  1145. package/app/pages/dcw/index.vue +195 -195
  1146. package/app/pages/dcw/types.ts +9 -9
  1147. package/app/pages/index.vue +126 -126
  1148. package/app/pages/logs/composables/useLogsFormat.ts +43 -43
  1149. package/app/pages/logs/composables/useLogsScope.ts +39 -39
  1150. package/app/pages/monitor/types.ts +61 -61
  1151. package/app/pages/ontology/index.vue +1 -1
  1152. package/app/pages/operations.vue +61 -61
  1153. package/app/pages/permissions/index.vue +369 -369
  1154. package/app/pages/studio/board.vue +30 -9
  1155. package/app/pages/studio/index.vue +40 -8
  1156. package/app/pages/studio/pipeline.vue +804 -0
  1157. package/app/pages/tokens/composables/useTokenClipboard.ts +33 -33
  1158. package/app/pages/tokens/composables/useTokenCreate.ts +93 -93
  1159. package/app/pages/tokens/composables/useTokenRename.ts +54 -54
  1160. package/app/pages/tokens/composables/useTokenReveal.ts +84 -84
  1161. package/app/pages/tokens/composables/useTokensList.ts +60 -60
  1162. package/app/pages/tokens.vue +111 -111
  1163. package/app/pages/tools/index.vue +98 -98
  1164. package/app/pages/workshop/agents.vue +130 -130
  1165. package/app/pages/workshop/composables/useAgentHarnessOptions.ts +59 -59
  1166. package/app/pages/workshop/composables/useAgentTemplateActions.ts +42 -42
  1167. package/app/pages/workshop/composables/useAgentTemplateDialogState.ts +24 -24
  1168. package/app/pages/workshop/composables/useAgentTemplateForm.ts +88 -88
  1169. package/app/pages/workshop/composables/useAgentTemplatesCatalog.ts +92 -92
  1170. package/app/pages/workshop/composables/useTeamActions.ts +44 -44
  1171. package/app/pages/workshop/composables/useTeamAddMemberDialog.ts +49 -49
  1172. package/app/pages/workshop/composables/useTeamCreateDialog.ts +67 -67
  1173. package/app/pages/workshop/composables/useTeamDeployDialog.ts +49 -49
  1174. package/app/pages/workshop/composables/useTeamDialogState.ts +46 -46
  1175. package/app/pages/workshop/composables/useTeamPluginDialog.ts +72 -72
  1176. package/app/pages/workshop/composables/useTeamsCatalog.ts +100 -100
  1177. package/app/pages/workshop/composables/useWorkbenchWorkspaces.ts +123 -123
  1178. package/app/pages/workshop/composables/useWorkspaceAuth.ts +31 -31
  1179. package/app/pages/workshop/composables/useWorkspaceChannels.ts +62 -62
  1180. package/app/pages/workshop/composables/useWorkspaceShell.ts +136 -136
  1181. package/app/pages/workshop/schedules.vue +553 -553
  1182. package/app/pages/workshop/w/[wsId].vue +221 -221
  1183. package/app/plugins/aw-plugins.client.ts +213 -213
  1184. package/app/plugins/esc-close.client.ts +31 -31
  1185. package/app/stores/workshop/hitl.ts +183 -183
  1186. package/app/stores/workshop/narrow-fetch.ts +23 -23
  1187. package/app/utils/api-error.ts +75 -75
  1188. package/app/utils/builtin-catalog.ts +104 -104
  1189. package/app/utils/chart-pipeline.ts +242 -0
  1190. package/app/utils/chart-trend.ts +97 -97
  1191. package/app/utils/dcw-driver-badge.ts +16 -16
  1192. package/app/utils/dcw-recipe-form.ts +26 -26
  1193. package/cli/commands/tui.mjs +28 -28
  1194. package/cli/commands/update.mjs +124 -124
  1195. package/cli/core/child-lifecycle.mjs +136 -136
  1196. package/cli/core/meta.mjs +38 -38
  1197. package/cli/core/post-build.mjs +96 -96
  1198. package/config.yml +1 -1
  1199. package/docs/cli.en.md +4 -4
  1200. package/docs/cli.md +4 -4
  1201. package/docs/mcp.en.md +27 -27
  1202. package/docs/multi-harness-architecture.md +248 -248
  1203. package/docs/plugins.en.md +1 -1
  1204. package/docs/plugins.md +1 -1
  1205. package/docs/sdk.en.md +1 -1
  1206. package/docs/sdk.md +1 -1
  1207. package/docs/tui.md +43 -43
  1208. package/i18n/dicts/_en.json +1551 -1551
  1209. package/i18n/dicts/_en2.json +300 -300
  1210. package/i18n/dicts/_en4.json +114 -114
  1211. package/i18n/dicts/agentLanesView.json +61 -61
  1212. package/i18n/dicts/appHeader.json +17 -17
  1213. package/i18n/dicts/channelSessionList.json +51 -51
  1214. package/i18n/dicts/chat.json +79 -79
  1215. package/i18n/dicts/clusterTool.json +4 -4
  1216. package/i18n/dicts/composer.json +38 -38
  1217. package/i18n/dicts/ctpl.json +37 -37
  1218. package/i18n/dicts/dcwDetail.json +219 -219
  1219. package/i18n/dicts/lineOps.json +14 -14
  1220. package/i18n/dicts/multiChannelView.json +13 -13
  1221. package/i18n/dicts/notifications.json +13 -13
  1222. package/i18n/dicts/taskInspectorDrawer.json +25 -25
  1223. package/i18n/dicts/teamPlugins.json +10 -10
  1224. package/i18n/dicts/townView.json +209 -209
  1225. package/i18n/locales/en.ts +64 -0
  1226. package/i18n/locales/zh-CN.ts +64 -0
  1227. package/mcp/discovery.mjs +227 -227
  1228. package/package.json +1 -1
  1229. package/public/favicon.svg +14 -14
  1230. package/public/robots.txt +3 -3
  1231. package/scripts/_audit/_detached-mes-20261028.mjs +48 -0
  1232. package/scripts/_audit/_detached-nodesim-20261028.mjs +50 -0
  1233. package/scripts/_audit/_detached-sim-20261028.mjs +44 -0
  1234. package/scripts/_audit/_live-execmodes-20261028.mjs +246 -0
  1235. package/scripts/_audit/_live-execmodes-invoke-20261028.mjs +203 -0
  1236. package/scripts/_audit/_mission-coupling-probe-20261028.mjs +27 -0
  1237. package/scripts/_audit/_mission-f1-evidence-20261028.mjs +56 -0
  1238. package/scripts/_audit/_mission-idd-remint-20261028.mjs +32 -0
  1239. package/scripts/_audit/_mission-ui-shots-20261028.mjs +56 -0
  1240. package/scripts/_audit/_mission-us10-timeline-20261028.mjs +65 -0
  1241. package/scripts/_audit/_mission-us12-tools-20261028.mjs +85 -0
  1242. package/scripts/_audit/_mission-us4-daq-dcw-20261028.mjs +115 -0
  1243. package/scripts/_audit/_mission-us5-mes-20261028.mjs +142 -0
  1244. package/scripts/_audit/_mission-us6-dialog-20261028.mjs +43 -0
  1245. package/scripts/_audit/_mission-us7-diag-20261028.mjs +42 -0
  1246. package/scripts/_audit/_mission-us7-final-20261028.mjs +79 -0
  1247. package/scripts/_audit/_mission-us7-idd-rag-20261028.mjs +147 -0
  1248. package/scripts/_audit/audit-harness-adapters.md +664 -664
  1249. package/scripts/_audit/aw-mcp-live-e2e.mjs +293 -293
  1250. package/scripts/_audit/bump-version.mjs +51 -51
  1251. package/scripts/_audit/detached-instance.mjs +112 -112
  1252. package/scripts/_audit/detached-start.mjs +103 -103
  1253. package/scripts/_audit/eda-ui-fix-acceptance.mjs +212 -212
  1254. package/scripts/_audit/guard-upstream-liveness.mjs +104 -104
  1255. package/scripts/_audit/http-api-authz-audit.md +657 -657
  1256. package/scripts/_audit/kb-team-mock-e2e.mjs +146 -146
  1257. package/scripts/_audit/kb-team-omp-e2e.mjs +229 -229
  1258. package/scripts/_audit/run.mjs +21 -21
  1259. package/scripts/_audit/runtime-audit.md +716 -716
  1260. package/scripts/_audit/skills-guided-e2e.mjs +316 -316
  1261. package/scripts/_audit/stability-soak.mjs +252 -252
  1262. package/scripts/_audit/stubs/nuxt-imports.mjs +67 -67
  1263. package/scripts/_audit/ts-register-hook.mjs +12 -12
  1264. package/scripts/_audit/ts-resolve-hook.mjs +96 -96
  1265. package/scripts/_aw0746-stage12.mjs +94 -94
  1266. package/scripts/_aw0746-stage34.mjs +136 -136
  1267. package/scripts/_aw0746-stage6b-train-sweep.mjs +145 -145
  1268. package/scripts/_aw0746-stage6c-jobsmoke.mjs +69 -69
  1269. package/scripts/_dbg-configroot-audit.mjs +86 -86
  1270. package/scripts/_dbg-daq-intervals-func.mjs +115 -115
  1271. package/scripts/_dbg-perms-e2e.mjs +142 -142
  1272. package/scripts/_dbg-protocol-matrix.mjs +462 -462
  1273. package/scripts/_dbg-render-regression.mjs +193 -193
  1274. package/scripts/_dbg-schedule-e2e.mjs +262 -262
  1275. package/scripts/_e2e-ui-functional.mjs +371 -371
  1276. package/scripts/_lib-aml-python-run.mjs +17 -17
  1277. package/scripts/_plc-sim-detached.cjs +22 -22
  1278. package/scripts/_provision-injection-line.mjs +39 -39
  1279. package/scripts/_run-matrix.ps1 +53 -53
  1280. package/scripts/_sweep-button-contrast.mjs +87 -87
  1281. package/scripts/acceptance-aml-hybrid-e2e.ts +396 -396
  1282. package/scripts/acceptance-aml-hybrid-live.mjs +93 -93
  1283. package/scripts/acceptance-aml-model-identity.ts +137 -137
  1284. package/scripts/agent-daq-isolation-e2e.mjs +91 -91
  1285. package/scripts/api-contract-smoke.mjs +126 -126
  1286. package/scripts/ask-hitl-e2e.mjs +96 -96
  1287. package/scripts/aw-expose.mjs +159 -159
  1288. package/scripts/channel-interaction-smoke.mjs +80 -80
  1289. package/scripts/check-docs-sync.mjs +1 -1
  1290. package/scripts/data-studio-ui-e2e.mjs +163 -163
  1291. package/scripts/demo-group-chat-all-real.ts +279 -279
  1292. package/scripts/dev-modbus-simulator.mjs +55 -55
  1293. package/scripts/docs-shots.mjs +36 -36
  1294. package/scripts/e2e-agentteam-chat.mjs +473 -473
  1295. package/scripts/e2e-agentteam-real-triage.mjs +421 -421
  1296. package/scripts/e2e-aml-decoupled.mjs +162 -162
  1297. package/scripts/e2e-aw-tui-global.mjs +277 -277
  1298. package/scripts/e2e-closedloop/cleanup.mjs +27 -27
  1299. package/scripts/e2e-closedloop/lib.mjs +109 -109
  1300. package/scripts/e2e-closedloop/main.mjs +59 -59
  1301. package/scripts/e2e-closedloop/scenarios-accounts.mjs +210 -210
  1302. package/scripts/e2e-closedloop/scenarios-authz.mjs +196 -196
  1303. package/scripts/e2e-closedloop/scenarios-daq-dcw.mjs +222 -222
  1304. package/scripts/e2e-closedloop/scenarios-plugins.mjs +169 -169
  1305. package/scripts/e2e-closedloop/state.mjs +10 -10
  1306. package/scripts/e2e-config-groups.mjs +238 -238
  1307. package/scripts/e2e-crash-cycle.mjs +108 -108
  1308. package/scripts/e2e-direct-rest-simulator-paper.mjs +624 -0
  1309. package/scripts/e2e-eda-pipeline.mjs +307 -0
  1310. package/scripts/e2e-execution-modes.mjs +290 -0
  1311. package/scripts/e2e-full-closedloop.mjs +16 -16
  1312. package/scripts/e2e-hil-multi-user.mjs +307 -307
  1313. package/scripts/e2e-hil-restart.mjs +339 -339
  1314. package/scripts/e2e-injection-recipe-closedloop.mjs +1 -1
  1315. package/scripts/e2e-line-governance.mjs +352 -352
  1316. package/scripts/e2e-mqtt-protocol.mjs +945 -0
  1317. package/scripts/e2e-ontology.mjs +393 -393
  1318. package/scripts/e2e-pi-simulator-paper.mjs +2317 -0
  1319. package/scripts/e2e-plc-plugin-closedloop.mjs +549 -549
  1320. package/scripts/e2e-registered-harness-simulator-paper.mjs +1926 -0
  1321. package/scripts/e2e-resume-crash.mjs +20 -6
  1322. package/scripts/e2e-simulator-optimizer-paper.mjs +264 -0
  1323. package/scripts/e2e-timezone-settings.mjs +4 -2
  1324. package/scripts/fixtures/omp-paper-harness.mjs +163 -0
  1325. package/scripts/full-stack-shots.mjs +145 -145
  1326. package/scripts/full-tool-injection-harness-e2e.mjs +214 -214
  1327. package/scripts/hitl-reject-e2e.mjs +131 -131
  1328. package/scripts/line-log-smoke.mjs +260 -260
  1329. package/scripts/live-aml-mockomp.mjs +304 -304
  1330. package/scripts/live-aml-optloop-resume.mjs +322 -322
  1331. package/scripts/live-aml-optloop.mjs +588 -588
  1332. package/scripts/live-aml-stage9.mjs +169 -169
  1333. package/scripts/live-aml-two-goals.mjs +315 -315
  1334. package/scripts/live-optloop-two-modes.mjs +857 -857
  1335. package/scripts/mes-agent-integration-e2e.mjs +361 -361
  1336. package/scripts/ops-plugins-e2e.mjs +85 -85
  1337. package/scripts/scenario-suite-setup.mjs +337 -337
  1338. package/scripts/scenario-suite-stability.mjs +144 -144
  1339. package/scripts/team-coordination-e2e.mjs +96 -96
  1340. package/scripts/test-agentteam-workflow.ts +472 -472
  1341. package/scripts/test-aw-skills.mjs +102 -102
  1342. package/scripts/test-daq-frame-race.mjs +358 -358
  1343. package/scripts/test-data-root.mjs +208 -208
  1344. package/scripts/test-events-index.mjs +176 -176
  1345. package/scripts/test-group-chat-unit/lib.ts +186 -186
  1346. package/scripts/test-group-chat-unit/main.ts +45 -45
  1347. package/scripts/test-group-chat-unit.ts +35 -35
  1348. package/scripts/test-hitl-decision.ts +526 -526
  1349. package/scripts/test-hitl-registry.ts +112 -112
  1350. package/scripts/test-log-flooding.mjs +160 -160
  1351. package/scripts/test-lru.mjs +101 -101
  1352. package/scripts/test-plugin-hardening.mjs +90 -90
  1353. package/scripts/test-plugin-lifecycle.mjs +173 -173
  1354. package/scripts/test-rollback-index.mjs +137 -137
  1355. package/scripts/test-schedule-runtime.ts +309 -309
  1356. package/scripts/test-sdk-surface.mjs +158 -158
  1357. package/scripts/test-serial-bridge.mjs +418 -418
  1358. package/scripts/test-tui-commands.mjs +148 -148
  1359. package/scripts/test-tui-reducers.mjs +72 -72
  1360. package/scripts/three-system-e2e/lib.mjs +79 -79
  1361. package/scripts/three-system-e2e/main.mjs +40 -40
  1362. package/scripts/three-system-e2e/phases/phase-0-user-token.mjs +42 -42
  1363. package/scripts/three-system-e2e/phases/phase-0a2-line-autoselect.mjs +35 -35
  1364. package/scripts/three-system-e2e/phases/phase-0b-fixture-grants.mjs +39 -39
  1365. package/scripts/three-system-e2e/phases/phase-0c-plugin-outbound-auth.mjs +95 -95
  1366. package/scripts/three-system-e2e/phases/stage-1-health.mjs +47 -47
  1367. package/scripts/three-system-e2e/phases/stage-2-5-team-plugins.mjs +84 -84
  1368. package/scripts/three-system-e2e/phases/stage-2-teams-tools-hitl.mjs +184 -184
  1369. package/scripts/three-system-e2e/phases/stage-3-diag.mjs +73 -73
  1370. package/scripts/three-system-e2e/phases/stage-4-plugin-toggle.mjs +53 -53
  1371. package/scripts/three-system-e2e/state.mjs +87 -87
  1372. package/scripts/three-system-e2e.mjs +40 -40
  1373. package/scripts/tool-face-batch-identity-e2e.mjs +222 -222
  1374. package/scripts/tsconfig.json +14 -14
  1375. package/scripts/tui-smoke.mjs +100 -100
  1376. package/scripts/typecheck.mjs +75 -75
  1377. package/scripts/ui/md-lint.mjs +80 -80
  1378. package/scripts/ui/readme-assets.mjs +30 -30
  1379. package/scripts/ui/readme-shots.mjs +42 -42
  1380. package/scripts/ui/record-demo.mjs +557 -557
  1381. package/scripts/ui/record.mjs +225 -225
  1382. package/scripts/ui/seed-admin.mjs +68 -68
  1383. package/scripts/ui/seed-demo.mjs +83 -83
  1384. package/scripts/ui/seed-industrial-demo.mjs +171 -171
  1385. package/scripts/ui/shot-hero.mjs +25 -25
  1386. package/scripts/ui/shots.mjs +75 -75
  1387. package/scripts/ui/verify-nav.mjs +51 -51
  1388. package/scripts/ui/verify-responsive.mjs +285 -285
  1389. package/sdk/client.d.mts +110 -110
  1390. package/sdk/examples/line-sentinel/index.mjs +105 -105
  1391. package/sdk/examples/ops-notifier/index.mjs +34 -34
  1392. package/sdk/examples/sample-insight/index.mjs +39 -39
  1393. package/server/.mimosa/hook-state/sess_869e5bfd-07f4-4b6e-a991-6221fcf6b7d2.json +1 -0
  1394. package/server/.mimosa/hook-state/sess_869e5bfd-07f4-4b6e-a991-6221fcf6b7d2.mvhn1irp-99488-e3fdc1cbfc.baseline/942d2679b87b96c612b4f2a425c3ccc5b6f3234f0cf589a8441602f866fbe277.source +41 -0
  1395. package/server/.mimosa/hook-state/sess_869e5bfd-07f4-4b6e-a991-6221fcf6b7d2.mvhn1irp-99488-e3fdc1cbfc.baseline/dd617a82339d2c61e49e28e416aabeb2fc100fb3cb1beca18d02dfb833214af6.source +51 -0
  1396. package/server/.mimosa/hook-status/sess_869e5bfd-07f4-4b6e-a991-6221fcf6b7d2-e67b6b91bf.json +14 -0
  1397. package/server/api/plugins/client/[name].get.ts +18 -18
  1398. package/server/api/plugins/i18n.get.ts +12 -12
  1399. package/server/api/plugins/manifest.get.ts +10 -10
  1400. package/server/api/system/backup/list.get.ts +32 -32
  1401. package/server/api/system/backup/run.post.ts +21 -21
  1402. package/server/api/system/config-groups/[id].delete.ts +21 -21
  1403. package/server/api/system/config-groups/[id].patch.ts +26 -26
  1404. package/server/api/system/config-groups/index.get.ts +21 -21
  1405. package/server/api/system/config-groups/index.post.ts +33 -33
  1406. package/server/api/system/timezone.get.ts +20 -20
  1407. package/server/api/users/tokens/[id]/token.get.ts +11 -11
  1408. package/server/api/workshop/[...path].ts +13 -13
  1409. package/server/api/workshop/agent-tools/approvals/index.get.ts +43 -43
  1410. package/server/api/workshop/agent-tools/bindings/[id].delete.ts +26 -26
  1411. package/server/api/workshop/agent-tools/bindings/grant.post.ts +45 -45
  1412. package/server/api/workshop/agent-tools/bindings/index.get.ts +41 -41
  1413. package/server/api/workshop/agent-tools/bindings/revoke.post.ts +42 -42
  1414. package/server/api/workshop/aml/datasets/[id]/preview.get.ts +68 -68
  1415. package/server/api/workshop/aml/datasets/[id].delete.ts +39 -39
  1416. package/server/api/workshop/aml/datasets/[id].get.ts +53 -53
  1417. package/server/api/workshop/aml/datasets/[id].patch.ts +30 -30
  1418. package/server/api/workshop/aml/datasets/index.get.ts +20 -20
  1419. package/server/api/workshop/aml/datasets/index.post.ts +27 -27
  1420. package/server/api/workshop/aml/entities/index.get.ts +13 -13
  1421. package/server/api/workshop/aml/entities/prune.post.ts +28 -28
  1422. package/server/api/workshop/aml/env/index.get.ts +13 -13
  1423. package/server/api/workshop/aml/env/recheck.post.ts +14 -14
  1424. package/server/api/workshop/aml/env/uv.post.ts +21 -21
  1425. package/server/api/workshop/aml/env/venv.post.ts +24 -24
  1426. package/server/api/workshop/aml/experiments/index.get.ts +35 -35
  1427. package/server/api/workshop/aml/index.get.ts +37 -37
  1428. package/server/api/workshop/aml/jobs/[id]/cancel.post.ts +21 -21
  1429. package/server/api/workshop/aml/jobs/[id]/logs.get.ts +23 -23
  1430. package/server/api/workshop/aml/jobs/[id]/retry.post.ts +20 -20
  1431. package/server/api/workshop/aml/jobs/[id].delete.ts +44 -44
  1432. package/server/api/workshop/aml/jobs/[id].get.ts +23 -23
  1433. package/server/api/workshop/aml/jobs/index.get.ts +26 -26
  1434. package/server/api/workshop/aml/models/[id]/predict.post.ts +24 -24
  1435. package/server/api/workshop/aml/models/[id]/promote.post.ts +30 -30
  1436. package/server/api/workshop/aml/models/index.get.ts +48 -48
  1437. package/server/api/workshop/aml/training-plans/[id]/train.post.ts +18 -18
  1438. package/server/api/workshop/aml/training-plans/[id].delete.ts +18 -18
  1439. package/server/api/workshop/aml/training-plans/[id].patch.ts +30 -30
  1440. package/server/api/workshop/aml/training-plans/index.get.ts +9 -9
  1441. package/server/api/workshop/aml/training-plans/index.post.ts +43 -43
  1442. package/server/api/workshop/analysis/index.post.ts +54 -0
  1443. package/server/api/workshop/approvals/[id]/decide.post.ts +30 -30
  1444. package/server/api/workshop/approvals/index.get.ts +22 -22
  1445. package/server/api/workshop/audit.get.ts +43 -43
  1446. package/server/api/workshop/channels/[id]/chat/messages/[messageId]/read.post.ts +22 -22
  1447. package/server/api/workshop/channels/[id]/chat/messages/index.get.ts +29 -29
  1448. package/server/api/workshop/channels/[id]/chat/messages/index.post.ts +51 -51
  1449. package/server/api/workshop/channels/[id]/chat/permissions.get.ts +35 -35
  1450. package/server/api/workshop/channels/[id]/execution-mode.patch.ts +94 -0
  1451. package/server/api/workshop/channels/[id]/index.patch.ts +64 -64
  1452. package/server/api/workshop/channels/[id]/members/[userId]/approve.post.ts +20 -20
  1453. package/server/api/workshop/channels/[id]/members/[userId].delete.ts +21 -21
  1454. package/server/api/workshop/channels/[id]/members/index.get.ts +23 -23
  1455. package/server/api/workshop/channels/[id]/members/leave.post.ts +20 -20
  1456. package/server/api/workshop/channels/[id]/twin-profile.get.ts +45 -45
  1457. package/server/api/workshop/channels/[id]/twin-profile.patch.ts +72 -72
  1458. package/server/api/workshop/daq/[id]/frames/content.get.ts +3 -0
  1459. package/server/api/workshop/daq/[id]/ingest.post.ts +5 -0
  1460. package/server/api/workshop/daq/[id]/test.post.ts +1 -1
  1461. package/server/api/workshop/daq/alarms.get.ts +16 -16
  1462. package/server/api/workshop/dcw/[id]/write.post.ts +4 -4
  1463. package/server/api/workshop/dcw/[id].delete.ts +41 -41
  1464. package/server/api/workshop/dcw/[id].patch.ts +40 -40
  1465. package/server/api/workshop/dcw/mes-hook-test.post.ts +5 -3
  1466. package/server/api/workshop/dcw/mes-test-read.post.ts +24 -24
  1467. package/server/api/workshop/dcw/params/[id]/read.post.ts +17 -17
  1468. package/server/api/workshop/dcw/params/[id]/write.post.ts +21 -21
  1469. package/server/api/workshop/dcw/params/[id].delete.ts +19 -19
  1470. package/server/api/workshop/dcw/params/[id].patch.ts +23 -23
  1471. package/server/api/workshop/dcw/params/index.get.ts +27 -27
  1472. package/server/api/workshop/dcw/params/index.post.ts +25 -25
  1473. package/server/api/workshop/dcw/products/[id].delete.ts +6 -2
  1474. package/server/api/workshop/dcw/products/[id].patch.ts +8 -2
  1475. package/server/api/workshop/dcw/recipes/[id]/index.patch.ts +6 -1
  1476. package/server/api/workshop/dcw/recipes/[id]/versions.get.ts +14 -14
  1477. package/server/api/workshop/dcw/recipes/[id].delete.ts +25 -25
  1478. package/server/api/workshop/dcw/recipes/index.get.ts +12 -12
  1479. package/server/api/workshop/dcw/runs/[id]/close.post.ts +15 -15
  1480. package/server/api/workshop/dcw/templates/[key].delete.ts +14 -14
  1481. package/server/api/workshop/dcw/templates/[key].patch.ts +16 -16
  1482. package/server/api/workshop/dcw/templates/index.post.ts +15 -15
  1483. package/server/api/workshop/dcw/test-driver.post.ts +16 -16
  1484. package/server/api/workshop/device-twins/[id].delete.ts +25 -25
  1485. package/server/api/workshop/eda/runs/[id]/labels.patch.ts +25 -25
  1486. package/server/api/workshop/eda/templates/[id].delete.ts +14 -0
  1487. package/server/api/workshop/eda/templates/[id].get.ts +15 -0
  1488. package/server/api/workshop/eda/templates/[id].patch.ts +20 -0
  1489. package/server/api/workshop/eda/templates/index.get.ts +11 -0
  1490. package/server/api/workshop/eda/templates/index.post.ts +20 -0
  1491. package/server/api/workshop/exp/confirmations/[id]/decide.post.ts +41 -41
  1492. package/server/api/workshop/exp/confirmations/index.get.ts +25 -25
  1493. package/server/api/workshop/harnesses/[id]/providers.get.ts +16 -16
  1494. package/server/api/workshop/hitl/respond.post.ts +94 -94
  1495. package/server/api/workshop/mes/secrets/[ref].delete.ts +31 -0
  1496. package/server/api/workshop/mes/secrets/index.get.ts +13 -0
  1497. package/server/api/workshop/mes/secrets/index.put.ts +39 -0
  1498. package/server/api/workshop/notifications/index.get.ts +60 -60
  1499. package/server/api/workshop/notifications/read.post.ts +31 -31
  1500. package/server/api/workshop/ontology/drafts/[draftId]/subgraph.ts +24 -24
  1501. package/server/api/workshop/plugins/[name]/disable.post.ts +21 -21
  1502. package/server/api/workshop/plugins/[name]/enable.post.ts +21 -21
  1503. package/server/api/workshop/plugins/[name]/index.get.ts +14 -14
  1504. package/server/api/workshop/schedules/[id]/run.post.ts +15 -15
  1505. package/server/api/workshop/schedules/[id]/runs.get.ts +15 -15
  1506. package/server/api/workshop/schedules/[id].delete.ts +14 -14
  1507. package/server/api/workshop/schedules/[id].get.ts +13 -13
  1508. package/server/api/workshop/schedules/[id].patch.ts +29 -29
  1509. package/server/api/workshop/schedules/index.get.ts +12 -12
  1510. package/server/api/workshop/schedules/index.post.ts +32 -32
  1511. package/server/api/workshop/tasks/[id]/reassign.post.ts +32 -32
  1512. package/server/api/workshop/tasks/[id]/update.post.ts +35 -35
  1513. package/server/api/workshop/teams/[id]/plugins/index.get.ts +36 -36
  1514. package/server/api/workshop/teams/[id]/plugins/index.put.ts +42 -42
  1515. package/server/api/workshop/ws/audience.ts +56 -56
  1516. package/server/api/workshop/ws/db-buffer.ts +68 -68
  1517. package/server/api/workshop/ws/event-mapping.ts +47 -47
  1518. package/server/api/workshop/ws/handlers.ts +132 -132
  1519. package/server/api/workshop/ws/hub.ts +133 -133
  1520. package/server/api/workshop/ws/index.ts +23 -23
  1521. package/server/api/workshop/ws/notification-uplink.ts +77 -77
  1522. package/server/api/workshop/ws/shared.ts +94 -94
  1523. package/server/api/workshop/ws/streams.ts +146 -146
  1524. package/server/middleware/00-security-headers.ts +38 -38
  1525. package/server/middleware/01-rate-guard.ts +101 -101
  1526. package/server/plugins/aml-twin-worker.ts +32 -32
  1527. package/server/plugins/dev-stability-guard.ts +42 -42
  1528. package/server/plugins-builtin/diag-bridge/host/constants.mjs +25 -25
  1529. package/server/plugins-builtin/diag-bridge/host/exports.mjs +104 -104
  1530. package/server/plugins-builtin/diag-bridge/host/index.mjs +15 -15
  1531. package/server/plugins-builtin/diag-bridge/host/intents.mjs +62 -62
  1532. package/server/plugins-builtin/diag-bridge/host/snapshot.mjs +93 -93
  1533. package/server/plugins-builtin/diag-bridge/index.mjs +9 -9
  1534. package/server/plugins-builtin/serial-bridge/client.mjs +211 -211
  1535. package/server/plugins-builtin/serial-bridge/drivers.mjs +409 -409
  1536. package/server/plugins-builtin/serial-bridge/i18n.json +62 -62
  1537. package/server/plugins-builtin/serial-bridge/index.mjs +247 -247
  1538. package/server/plugins-builtin/serial-bridge/lib.mjs +208 -208
  1539. package/server/plugins-builtin/serial-bridge/rtu.mjs +168 -168
  1540. package/server/services/system-config/contracts.ts +29 -29
  1541. package/server/services/system-config/dispose.ts +19 -19
  1542. package/server/services/system-config/facade.ts +26 -26
  1543. package/server/services/system-config/groups.ts +108 -108
  1544. package/server/services/system-config/index.ts +21 -21
  1545. package/server/services/system-config/init.ts +26 -26
  1546. package/server/services/system-config/mutate.ts +103 -103
  1547. package/server/services/system-config/plugins.ts +104 -104
  1548. package/server/services/system-config/snapshot.ts +59 -59
  1549. package/server/services/system-config/state.ts +79 -79
  1550. package/server/services/system-config/types.ts +58 -58
  1551. package/server/services/workshop/.mimosa/hook-state/sess_fed429fb-c8b7-4a50-bbd6-45afc580893f.json +1 -0
  1552. package/server/services/workshop/.mimosa/hook-status/sess_fed429fb-c8b7-4a50-bbd6-45afc580893f-e6b75bbfe6.json +14 -0
  1553. package/server/services/workshop/agents/adapters/omp-rpc-client/api.ts +111 -111
  1554. package/server/services/workshop/agents/adapters/omp-rpc-client/contracts.ts +22 -22
  1555. package/server/services/workshop/agents/adapters/omp-rpc-client/facade.ts +7 -7
  1556. package/server/services/workshop/agents/adapters/omp-rpc-client/frames.ts +18 -0
  1557. package/server/services/workshop/agents/adapters/omp-rpc-client/helpers.ts +38 -38
  1558. package/server/services/workshop/agents/adapters/omp-rpc-client/index.ts +25 -25
  1559. package/server/services/workshop/agents/adapters/omp-rpc-client/start.ts +70 -70
  1560. package/server/services/workshop/agents/adapters/omp-rpc-client/state.ts +65 -65
  1561. package/server/services/workshop/agents/adapters/omp-rpc-client/stdout.ts +92 -92
  1562. package/server/services/workshop/agents/adapters/omp-rpc-client/usage.ts +47 -47
  1563. package/server/services/workshop/agents/agent-badge.ts +38 -38
  1564. package/server/services/workshop/agents/binding-authz.ts +60 -60
  1565. package/server/services/workshop/agents/binding-mode.ts +51 -51
  1566. package/server/services/workshop/agents/codex-agent/client.ts +170 -170
  1567. package/server/services/workshop/agents/codex-agent/core.ts +119 -119
  1568. package/server/services/workshop/agents/codex-agent/facade.ts +8 -8
  1569. package/server/services/workshop/agents/codex-agent/helpers.ts +13 -13
  1570. package/server/services/workshop/agents/codex-agent/hitl.ts +138 -138
  1571. package/server/services/workshop/agents/codex-agent/index.ts +14 -14
  1572. package/server/services/workshop/agents/codex-agent/turn.ts +367 -367
  1573. package/server/services/workshop/agents/codex-agent/types.ts +42 -42
  1574. package/server/services/workshop/agents/execution-mode.ts +90 -0
  1575. package/server/services/workshop/agents/harness-process.ts +3 -3
  1576. package/server/services/workshop/agents/harness-terminal/api.ts +197 -197
  1577. package/server/services/workshop/agents/harness-terminal/index.ts +17 -17
  1578. package/server/services/workshop/agents/harness-terminal/io.ts +120 -120
  1579. package/server/services/workshop/agents/harness-terminal/park.ts +55 -55
  1580. package/server/services/workshop/agents/harness-terminal/sanitize.ts +98 -98
  1581. package/server/services/workshop/agents/harness-terminal/session.ts +124 -124
  1582. package/server/services/workshop/agents/harness-terminal/shared.ts +74 -74
  1583. package/server/services/workshop/agents/hitl-capabilities.ts +312 -312
  1584. package/server/services/workshop/agents/hitl-decision/answers.ts +32 -32
  1585. package/server/services/workshop/agents/hitl-decision/decide.ts +268 -268
  1586. package/server/services/workshop/agents/hitl-decision/payload.ts +45 -45
  1587. package/server/services/workshop/agents/hitl-decision/shared.ts +108 -108
  1588. package/server/services/workshop/agents/hitl-decision/visibility.ts +94 -94
  1589. package/server/services/workshop/agents/host-tool-bridge/catalog.ts +42 -13
  1590. package/server/services/workshop/agents/host-tool-bridge/dispatch.ts +16 -0
  1591. package/server/services/workshop/agents/host-tool-bridge/per-agent.ts +10 -8
  1592. package/server/services/workshop/agents/host-tool-bridge/tools/progress.ts +84 -84
  1593. package/server/services/workshop/agents/host-tool-bridge/tools/team-delegation.ts +104 -104
  1594. package/server/services/workshop/agents/host-tool-bridge/tools/team.ts +70 -70
  1595. package/server/services/workshop/agents/industrial/aml-activity.ts +131 -131
  1596. package/server/services/workshop/agents/industrial/audit-query.ts +66 -66
  1597. package/server/services/workshop/agents/industrial/daq-export.ts +9 -8
  1598. package/server/services/workshop/agents/industrial/daq-tools.ts +43 -6
  1599. package/server/services/workshop/agents/industrial/dcw-tools.ts +22 -4
  1600. package/server/services/workshop/agents/industrial/exp-tools.ts +104 -104
  1601. package/server/services/workshop/agents/industrial/grant-guard.ts +52 -9
  1602. package/server/services/workshop/agents/industrial/ops-tools.ts +54 -16
  1603. package/server/services/workshop/agents/industrial/param-tools.ts +69 -69
  1604. package/server/services/workshop/agents/industrial/recipe-gate.ts +25 -7
  1605. package/server/services/workshop/agents/industrial/recipe-propose-tools.ts +1 -1
  1606. package/server/services/workshop/agents/industrial-context.ts +160 -83
  1607. package/server/services/workshop/agents/node-bindings.repo.ts +207 -207
  1608. package/server/services/workshop/agents/node-delegation.ts +159 -159
  1609. package/server/services/workshop/agents/omp-agent/core.ts +146 -146
  1610. package/server/services/workshop/agents/omp-agent/facade.ts +8 -8
  1611. package/server/services/workshop/agents/omp-agent/helpers.ts +37 -37
  1612. package/server/services/workshop/agents/omp-agent/index.ts +16 -16
  1613. package/server/services/workshop/agents/omp-agent/supervision-history.ts +38 -0
  1614. package/server/services/workshop/agents/omp-agent/tools-steer.ts +18 -1
  1615. package/server/services/workshop/agents/omp-agent/types.ts +45 -45
  1616. package/server/services/workshop/agents/opencode-agent/core.ts +77 -77
  1617. package/server/services/workshop/agents/opencode-agent/facade.ts +8 -8
  1618. package/server/services/workshop/agents/opencode-agent/helpers.ts +29 -29
  1619. package/server/services/workshop/agents/opencode-agent/hitl.ts +113 -113
  1620. package/server/services/workshop/agents/opencode-agent/index.ts +16 -16
  1621. package/server/services/workshop/agents/opencode-agent/lifecycle.ts +44 -44
  1622. package/server/services/workshop/agents/opencode-agent/server.ts +244 -244
  1623. package/server/services/workshop/agents/opencode-agent/turn.ts +278 -278
  1624. package/server/services/workshop/agents/opencode-agent/types.ts +54 -54
  1625. package/server/services/workshop/agents/prompt-i18n.ts +67 -0
  1626. package/server/services/workshop/agents/tool-classes.ts +44 -44
  1627. package/server/services/workshop/aml/clean.ts +120 -120
  1628. package/server/services/workshop/aml/entity.ts +367 -367
  1629. package/server/services/workshop/aml/job-orchestrator/broadcast.ts +37 -37
  1630. package/server/services/workshop/aml/job-orchestrator/control.ts +94 -94
  1631. package/server/services/workshop/aml/job-orchestrator/failure.ts +96 -96
  1632. package/server/services/workshop/aml/job-orchestrator/index.ts +22 -22
  1633. package/server/services/workshop/aml/job-orchestrator/process.ts +101 -101
  1634. package/server/services/workshop/aml/job-orchestrator/shared.ts +53 -53
  1635. package/server/services/workshop/aml/job-orchestrator/status.ts +20 -20
  1636. package/server/services/workshop/aml/job-orchestrator/tick.ts +37 -37
  1637. package/server/services/workshop/aml/python/__pycache__/aml_eval.cpython-312.pyc +0 -0
  1638. package/server/services/workshop/aml/python/__pycache__/amlkit.cpython-312.pyc +0 -0
  1639. package/server/services/workshop/aml/python/__pycache__/train-example.cpython-312.pyc +0 -0
  1640. package/server/services/workshop/aml/python/__pycache__/train-hybrid-example.cpython-312.pyc +0 -0
  1641. package/server/services/workshop/aml/python/train-example.py +92 -92
  1642. package/server/services/workshop/aml/runtime.ts +137 -137
  1643. package/server/services/workshop/aml/stats.ts +140 -140
  1644. package/server/services/workshop/aml/twin/calibration-worker.ts +150 -150
  1645. package/server/services/workshop/aml/twin/channel-profile.ts +12 -8
  1646. package/server/services/workshop/aml/twin/model-backed-provider.ts +332 -332
  1647. package/server/services/workshop/aml/twin/physics-spec-draft.ts +185 -185
  1648. package/server/services/workshop/aml/twin/prompt-composer.ts +143 -143
  1649. package/server/services/workshop/aml/twin/training-plans.ts +260 -260
  1650. package/server/services/workshop/aml/twin/write-guard.ts +19 -19
  1651. package/server/services/workshop/assets/character-asset.repo.ts +1 -1
  1652. package/server/services/workshop/assets/device-twin.repo.ts +1 -1
  1653. package/server/services/workshop/daq/bus/index.ts +12 -5
  1654. package/server/services/workshop/daq/daq-controller/contracts.ts +39 -39
  1655. package/server/services/workshop/daq/daq-controller/driver-probe.ts +7 -4
  1656. package/server/services/workshop/daq/daq-controller/facade.ts +28 -28
  1657. package/server/services/workshop/daq/daq-controller/frames.ts +137 -137
  1658. package/server/services/workshop/daq/daq-controller/helpers.ts +52 -52
  1659. package/server/services/workshop/daq/daq-controller/index.ts +22 -22
  1660. package/server/services/workshop/daq/daq-controller/ingest.ts +9 -10
  1661. package/server/services/workshop/daq/daq-controller/push.ts +336 -0
  1662. package/server/services/workshop/daq/daq-controller/runtime-control.ts +2 -0
  1663. package/server/services/workshop/daq/daq-controller/state.ts +11 -3
  1664. package/server/services/workshop/daq/daq-controller/sweep-alarms.ts +10 -2
  1665. package/server/services/workshop/daq/daq-controller/tsdb-row.ts +48 -0
  1666. package/server/services/workshop/daq/daq-controller/tsdb-twin.ts +4 -1
  1667. package/server/services/workshop/daq/daq-controller/views.ts +5 -2
  1668. package/server/services/workshop/daq/decoders.ts +77 -0
  1669. package/server/services/workshop/daq/drivers/http.ts +33 -6
  1670. package/server/services/workshop/daq/drivers/index.ts +3 -3
  1671. package/server/services/workshop/daq/drivers/mock.ts +130 -130
  1672. package/server/services/workshop/daq/drivers/modbus-rtu.ts +67 -67
  1673. package/server/services/workshop/daq/drivers/modbus-tcp.ts +307 -307
  1674. package/server/services/workshop/daq/drivers/mqtt-decode.ts +292 -0
  1675. package/server/services/workshop/daq/drivers/mqtt.ts +417 -94
  1676. package/server/services/workshop/daq/drivers/opcua.ts +227 -227
  1677. package/server/services/workshop/daq/drivers/s7-stub.ts +29 -29
  1678. package/server/services/workshop/daq/drivers/shared.ts +30 -1
  1679. package/server/services/workshop/daq/export-limits.ts +38 -0
  1680. package/server/services/workshop/daq/frames.ts +8 -2
  1681. package/server/services/workshop/daq/host-bindings.ts +71 -71
  1682. package/server/services/workshop/daq/host-ports.ts +65 -65
  1683. package/server/services/workshop/daq/plugin-bridge.ts +24 -2
  1684. package/server/services/workshop/daq/storage/latest-window.ts +132 -0
  1685. package/server/services/workshop/db/aml-team-seeds.ts +118 -118
  1686. package/server/services/workshop/db/backup-registry.ts +33 -33
  1687. package/server/services/workshop/db/channel-member.repo.ts +122 -122
  1688. package/server/services/workshop/db/channel.repo.ts +203 -203
  1689. package/server/services/workshop/db/chat-message.repo.ts +233 -233
  1690. package/server/services/workshop/db/database/index.ts +18 -18
  1691. package/server/services/workshop/db/database/json.ts +14 -14
  1692. package/server/services/workshop/db/database/migrations.ts +8 -0
  1693. package/server/services/workshop/db/database/open.ts +3 -1
  1694. package/server/services/workshop/db/database/schema.ts +1 -0
  1695. package/server/services/workshop/db/database/seed-data.ts +60 -60
  1696. package/server/services/workshop/db/hitl-request.repo.ts +221 -221
  1697. package/server/services/workshop/db/notification.repo.ts +199 -199
  1698. package/server/services/workshop/db/readonly.ts +30 -30
  1699. package/server/services/workshop/db/scheduled-task.repo.ts +235 -235
  1700. package/server/services/workshop/db/transaction.ts +72 -72
  1701. package/server/services/workshop/dcw/dcw-controller/actuation.ts +6 -0
  1702. package/server/services/workshop/dcw/dcw-controller/contracts.ts +16 -16
  1703. package/server/services/workshop/dcw/dcw-controller/control.ts +78 -78
  1704. package/server/services/workshop/dcw/dcw-controller/facade.ts +19 -19
  1705. package/server/services/workshop/dcw/dcw-controller/index.ts +22 -22
  1706. package/server/services/workshop/dcw/dcw-controller/params.ts +97 -97
  1707. package/server/services/workshop/dcw/dcw-controller/products.ts +103 -103
  1708. package/server/services/workshop/dcw/dcw-controller/write-audit.ts +1 -1
  1709. package/server/services/workshop/dcw/dcw-templates.ts +136 -136
  1710. package/server/services/workshop/dcw/drivers/http.ts +41 -15
  1711. package/server/services/workshop/dcw/drivers/mes-rest.ts +14 -51
  1712. package/server/services/workshop/dcw/drivers/mqtt.ts +58 -7
  1713. package/server/services/workshop/dcw/drivers/shared.ts +3 -0
  1714. package/server/services/workshop/dcw/param-conversion.ts +78 -78
  1715. package/server/services/workshop/dcw/param-map.repo.ts +349 -349
  1716. package/server/services/workshop/dcw/plugin-bridge.ts +45 -45
  1717. package/server/services/workshop/dcw/recipe-rollback-manager/contracts.ts +26 -26
  1718. package/server/services/workshop/dcw/recipe-rollback-manager/facade.ts +13 -13
  1719. package/server/services/workshop/dcw/recipe-rollback-manager/helpers.ts +30 -30
  1720. package/server/services/workshop/dcw/recipe-rollback-manager/index.ts +17 -17
  1721. package/server/services/workshop/dcw/recipe-rollback-manager/internal.ts +33 -33
  1722. package/server/services/workshop/dcw/recipe-rollback-manager/judge.ts +52 -52
  1723. package/server/services/workshop/dcw/recipe-rollback-manager/lock.ts +137 -137
  1724. package/server/services/workshop/dcw/recipe-rollback-manager/rollback.ts +190 -190
  1725. package/server/services/workshop/dcw/recipe-rollback-manager/state.ts +21 -21
  1726. package/server/services/workshop/dcw/recipe-rollback-manager/sweep.ts +77 -77
  1727. package/server/services/workshop/dcw/recipe-rollback-manager/types.ts +3 -3
  1728. package/server/services/workshop/dcw/recipe-rollback-manager/views.ts +214 -214
  1729. package/server/services/workshop/eda/chart-repo.ts +19 -2
  1730. package/server/services/workshop/eda/data-export.ts +3 -3
  1731. package/server/services/workshop/eda/data-query.ts +4 -1
  1732. package/server/services/workshop/eda/eda-db.ts +13 -0
  1733. package/server/services/workshop/eda/template-repo.ts +101 -0
  1734. package/server/services/workshop/exp/exp-collector.ts +275 -275
  1735. package/server/services/workshop/exp/exp-state.repo.ts +339 -339
  1736. package/server/services/workshop/mes/mes-controller.ts +1155 -1155
  1737. package/server/services/workshop/mes/mes-hook.ts +567 -567
  1738. package/server/services/workshop/mes/mes-secrets.repo.ts +119 -0
  1739. package/server/services/workshop/net/secret-auth.ts +84 -0
  1740. package/server/services/workshop/net/ssrf.ts +74 -0
  1741. package/server/services/workshop/ontology/subgraph.core.ts +300 -300
  1742. package/server/services/workshop/ontology/subgraph.service.ts +113 -113
  1743. package/server/services/workshop/optimization/access.ts +24 -30
  1744. package/server/services/workshop/optimization/python/.mimosa/hook-state/session_187ec97f45d4bd02369bbe94da527cf1.json +1 -0
  1745. package/server/services/workshop/optimization/python/.mimosa/hook-state/session_187ec97f45d4bd02369bbe94da527cf1.mvjqkcs6-68688-fb7131a89c.baseline/190a6772a4e43801737b4ba6072eb9d53d3099b5d8a9e6f57bc5e8592a26a6c4.source +274 -0
  1746. package/server/services/workshop/optimization/python/.mimosa/hook-status/session_187ec97f45d4bd02369bbe94da527cf1-01ed7f04fa.json +14 -0
  1747. package/server/services/workshop/optimization/python/__pycache__/problems.cpython-312.pyc +0 -0
  1748. package/server/services/workshop/plugins/host/api.mjs +90 -90
  1749. package/server/services/workshop/plugins/host/config.mjs +135 -135
  1750. package/server/services/workshop/plugins/host/index.mjs +23 -23
  1751. package/server/services/workshop/plugins/host/init.mjs +109 -109
  1752. package/server/services/workshop/plugins/host/load.mjs +14 -1
  1753. package/server/services/workshop/plugins/host/reload.mjs +6 -0
  1754. package/server/services/workshop/plugins/host/rollback.mjs +72 -72
  1755. package/server/services/workshop/plugins/host/state.mjs +54 -54
  1756. package/server/services/workshop/plugins/host/toggle.mjs +64 -64
  1757. package/server/services/workshop/plugins/host.mjs +9 -9
  1758. package/server/services/workshop/prompts/loader.ts +45 -8
  1759. package/server/services/workshop/runtime/agent-runtime/facade.ts +7 -7
  1760. package/server/services/workshop/runtime/agent-runtime/helpers.ts +18 -18
  1761. package/server/services/workshop/runtime/agent-runtime/index.ts +19 -19
  1762. package/server/services/workshop/runtime/agent-runtime/lifecycle.ts +137 -137
  1763. package/server/services/workshop/runtime/chat-mention.ts +164 -164
  1764. package/server/services/workshop/runtime/chat-projection.ts +246 -246
  1765. package/server/services/workshop/runtime/manager/admin-agents.ts +268 -268
  1766. package/server/services/workshop/runtime/manager/admin-channel.ts +5 -0
  1767. package/server/services/workshop/runtime/manager/bus.ts +182 -182
  1768. package/server/services/workshop/runtime/manager/channel-template-constants.ts +20 -20
  1769. package/server/services/workshop/runtime/manager/chat-reply.ts +181 -181
  1770. package/server/services/workshop/runtime/manager/chat.ts +384 -384
  1771. package/server/services/workshop/runtime/manager/facade.ts +24 -24
  1772. package/server/services/workshop/runtime/manager/helpers.ts +119 -119
  1773. package/server/services/workshop/runtime/manager/index.ts +42 -42
  1774. package/server/services/workshop/runtime/manager/internal.ts +73 -73
  1775. package/server/services/workshop/runtime/manager/notifications.ts +108 -108
  1776. package/server/services/workshop/runtime/manager/teams.ts +148 -148
  1777. package/server/services/workshop/runtime/memory/contracts.ts +18 -18
  1778. package/server/services/workshop/runtime/memory/facade.ts +10 -10
  1779. package/server/services/workshop/runtime/memory/helpers.ts +196 -196
  1780. package/server/services/workshop/runtime/memory/index.ts +27 -27
  1781. package/server/services/workshop/runtime/memory/score.ts +33 -33
  1782. package/server/services/workshop/runtime/memory/state.ts +40 -40
  1783. package/server/services/workshop/runtime/monitor.ts +3 -3
  1784. package/server/services/workshop/runtime/platform-notice.ts +113 -113
  1785. package/server/services/workshop/runtime/schedule-runtime.ts +347 -347
  1786. package/server/services/workshop/runtime/scheduler-loop/contracts.ts +29 -29
  1787. package/server/services/workshop/runtime/scheduler-loop/facade.ts +7 -7
  1788. package/server/services/workshop/runtime/scheduler-loop/helpers.ts +14 -14
  1789. package/server/services/workshop/runtime/scheduler-loop/index.ts +16 -16
  1790. package/server/services/workshop/runtime/task-engine/facade.ts +7 -7
  1791. package/server/services/workshop/runtime/task-engine/index.ts +15 -15
  1792. package/server/services/workshop/runtime/task-engine/types.ts +3 -3
  1793. package/server/services/workshop/runtime/user-notification-hub.ts +192 -192
  1794. package/server/services/workshop/tools/types.ts +1 -0
  1795. package/server/types/pg.d.ts +49 -49
  1796. package/server/utils/approval-gate.ts +67 -67
  1797. package/server/utils/mojibake-guard.ts +29 -29
  1798. package/server/utils/stability-severity.ts +77 -77
  1799. package/shared/config/groups.mjs +241 -241
  1800. package/shared/config/schema.json +2 -0
  1801. package/shared/daq-protocol.ts +30 -2
  1802. package/shared/dcw-protocol/catalog.ts +15 -3
  1803. package/shared/dcw-protocol/closed-loop.ts +2 -0
  1804. package/shared/lru.mjs +97 -97
  1805. package/tui/README.md +74 -74
  1806. package/tui/aw-tui.mjs +445 -445
  1807. package/tui/commands/index.mjs +287 -287
  1808. package/tui/components/chat-log.mjs +42 -42
  1809. package/tui/components/monitor-pane.mjs +39 -39
  1810. package/tui/components/root.mjs +53 -53
  1811. package/tui/components/status-bar.mjs +33 -33
  1812. package/tui/lib/api.mjs +82 -82
  1813. package/tui/lib/pickers.mjs +121 -121
  1814. package/tui/lib/reducers.mjs +218 -218
  1815. package/tui/lib/state.mjs +86 -86
  1816. package/tui/lib/virtual-terminal.mjs +48 -48
  1817. package/tui/lib/ws.mjs +125 -125
  1818. package/tui/theme.mjs +38 -38
  1819. package/.output/public/_nuxt/0qvcO_KM2.js +0 -1
  1820. package/.output/public/_nuxt/2Kwo_j9G2.js +0 -1
  1821. package/.output/public/_nuxt/39W1CH-l2.js +0 -1
  1822. package/.output/public/_nuxt/7xbYPfY6.js +0 -1
  1823. package/.output/public/_nuxt/8SZLbrI42.js +0 -1
  1824. package/.output/public/_nuxt/ATAvN55g.js +0 -1
  1825. package/.output/public/_nuxt/B3eCVqcT2.js +0 -1
  1826. package/.output/public/_nuxt/B4JlRHBB2.js +0 -1
  1827. package/.output/public/_nuxt/B9qIhT7k2.js +0 -1
  1828. package/.output/public/_nuxt/BE9oKpOt.js +0 -1
  1829. package/.output/public/_nuxt/BVGzwAxr2.js +0 -16
  1830. package/.output/public/_nuxt/BY3Lbz3h.js +0 -1
  1831. package/.output/public/_nuxt/BbACaREb.js +0 -1
  1832. package/.output/public/_nuxt/Bbk1XCCM.js +0 -14
  1833. package/.output/public/_nuxt/BcosvNXb2.js +0 -1
  1834. package/.output/public/_nuxt/BiZWwdcD2.js +0 -1
  1835. package/.output/public/_nuxt/Bq-tmkst.js +0 -1
  1836. package/.output/public/_nuxt/BxxpJxZf2.js +0 -1
  1837. package/.output/public/_nuxt/C1-SuwUN.js +0 -1
  1838. package/.output/public/_nuxt/C2Yp-B8m.js +0 -1
  1839. package/.output/public/_nuxt/C5OStZJ62.js +0 -1
  1840. package/.output/public/_nuxt/CDL30A2z2.js +0 -1
  1841. package/.output/public/_nuxt/CEvJu-xI.js +0 -1
  1842. package/.output/public/_nuxt/CMzExk8F.js +0 -1
  1843. package/.output/public/_nuxt/CT4bi_Y4.js +0 -1
  1844. package/.output/public/_nuxt/CZYNy60j2.js +0 -1
  1845. package/.output/public/_nuxt/CeCSjB9O2.js +0 -1
  1846. package/.output/public/_nuxt/CjF4QY9h.js +0 -1
  1847. package/.output/public/_nuxt/Cot5VNae.js +0 -1
  1848. package/.output/public/_nuxt/Crf8_Ad02.js +0 -1
  1849. package/.output/public/_nuxt/D1C6qtS12.js +0 -1
  1850. package/.output/public/_nuxt/D37gODe0.js +0 -1
  1851. package/.output/public/_nuxt/D6FhDrYe2.js +0 -1
  1852. package/.output/public/_nuxt/D8HQPtm62.js +0 -1
  1853. package/.output/public/_nuxt/D9O4L4jK.js +0 -1
  1854. package/.output/public/_nuxt/D9tNM-1a.js +0 -9
  1855. package/.output/public/_nuxt/DAug2CPf.js +0 -21
  1856. package/.output/public/_nuxt/DF9ETYJ32.js +0 -1
  1857. package/.output/public/_nuxt/DWe6BMlp2.js +0 -1
  1858. package/.output/public/_nuxt/DbhTN7-T.js +0 -47
  1859. package/.output/public/_nuxt/DdyE0ylS.js +0 -1
  1860. package/.output/public/_nuxt/DgGzwjAr2.js +0 -2
  1861. package/.output/public/_nuxt/DhjgWrB62.js +0 -1
  1862. package/.output/public/_nuxt/DiWcX4gj.js +0 -1
  1863. package/.output/public/_nuxt/DkRozlDP2.js +0 -1
  1864. package/.output/public/_nuxt/DlS-SkQ42.js +0 -1
  1865. package/.output/public/_nuxt/DmHp9yQ3.js +0 -1
  1866. package/.output/public/_nuxt/DoChWkff.js +0 -1
  1867. package/.output/public/_nuxt/DqxBCeDe.js +0 -1
  1868. package/.output/public/_nuxt/DrlnrdvY2.js +0 -36
  1869. package/.output/public/_nuxt/DxH5focQ2.js +0 -1
  1870. package/.output/public/_nuxt/Dyr3LPGL.js +0 -1
  1871. package/.output/public/_nuxt/FsRVXpyF2.js +0 -1
  1872. package/.output/public/_nuxt/Iub61dX9.js +0 -1
  1873. package/.output/public/_nuxt/MC_i34H42.js +0 -1
  1874. package/.output/public/_nuxt/OmpTerminalPanel.DMWgGwDs.css +0 -1
  1875. package/.output/public/_nuxt/PluginSlot.BqBzLD4T.css +0 -1
  1876. package/.output/public/_nuxt/Q-JpBT03.js +0 -1
  1877. package/.output/public/_nuxt/TownView.Cn8SPG7S.css +0 -1
  1878. package/.output/public/_nuxt/TugRY_4O.js +0 -1
  1879. package/.output/public/_nuxt/WybiLTow2.js +0 -8
  1880. package/.output/public/_nuxt/YNhAoK-R2.js +0 -1
  1881. package/.output/public/_nuxt/Zn0BZpf0.js +0 -3
  1882. package/.output/public/_nuxt/_id_.Be5JaH-P.css +0 -1
  1883. package/.output/public/_nuxt/_wsId_.p_vAYtTp.css +0 -1
  1884. package/.output/public/_nuxt/agents.CRomddYR.css +0 -1
  1885. package/.output/public/_nuxt/aml.DgOMpDpv.css +0 -1
  1886. package/.output/public/_nuxt/b7UcqLKi.js +0 -1
  1887. package/.output/public/_nuxt/board.Bo35UR0e.css +0 -1
  1888. package/.output/public/_nuxt/builds/meta/fd0033e4-1eaa-42f8-9a04-3132717a703b.json +0 -1
  1889. package/.output/public/_nuxt/default.CpAx70gC.css +0 -1
  1890. package/.output/public/_nuxt/entry.C7koBPom.css +0 -1
  1891. package/.output/public/_nuxt/geMze5qw.js +0 -1
  1892. package/.output/public/_nuxt/hCN555XP2.js +0 -1
  1893. package/.output/public/_nuxt/hlfahYxK.js +0 -1
  1894. package/.output/public/_nuxt/logs.DcSvz6vi.css +0 -1
  1895. package/.output/public/_nuxt/monitor.OoNTwfMJ.css +0 -1
  1896. package/.output/public/_nuxt/ontology.JqJ6PjV1.css +0 -1
  1897. package/.output/public/_nuxt/operations.C48ggFa5.css +0 -1
  1898. package/.output/public/_nuxt/pages.Dpa28tJW.css +0 -1
  1899. package/.output/public/_nuxt/permissions.CrV-4t-6.css +0 -1
  1900. package/.output/public/_nuxt/rcdmiszh2.js +0 -1
  1901. package/.output/public/_nuxt/schedules.DYWOjGHm.css +0 -1
  1902. package/.output/public/_nuxt/studio.CjmUr8P7.css +0 -1
  1903. package/.output/public/_nuxt/teams.DEJoJ4QV.css +0 -1
  1904. package/.output/public/_nuxt/toG_qAMH.js +0 -1
  1905. package/.output/public/_nuxt/tokens.DKZWCP5v.css +0 -1
  1906. package/.output/public/_nuxt/tools.DP-nsTli.css +0 -1
  1907. package/.output/public/_nuxt/uomnHjhM.js +0 -1
  1908. package/.output/public/_nuxt/v77qozuJ2.js +0 -1
  1909. package/.output/public/_nuxt/v7cV7hJa.js +0 -1
  1910. package/.output/public/_nuxt/wK6Pp4Zc2.js +0 -2
  1911. package/.output/public/_nuxt/we7-sMSo2.js +0 -1
  1912. package/.output/public/_nuxt/workshop.PT1xhP8C.css +0 -1
  1913. package/.output/public/_nuxt/wxISMS1i.js +0 -1
  1914. package/.output/public/_nuxt/zy7efYKR.js +0 -1
  1915. package/.output/server/chunks/build/AuthGate-G74Wr5IV.mjs +0 -704
  1916. package/.output/server/chunks/build/AuthGate-G74Wr5IV.mjs.map +0 -1
  1917. package/.output/server/chunks/build/FormItemContext-DmuQqaeJ.mjs +0 -77
  1918. package/.output/server/chunks/build/FormItemContext-DmuQqaeJ.mjs.map +0 -1
  1919. package/.output/server/chunks/build/OmpTerminalPanel-5cB-78zp.mjs +0 -889
  1920. package/.output/server/chunks/build/OmpTerminalPanel-5cB-78zp.mjs.map +0 -1
  1921. package/.output/server/chunks/build/PluginSlot-CZlGlRoR.mjs +0 -131
  1922. package/.output/server/chunks/build/PluginSlot-CZlGlRoR.mjs.map +0 -1
  1923. package/.output/server/chunks/build/TownView-CUbzOT_M.mjs +0 -5960
  1924. package/.output/server/chunks/build/TownView-CUbzOT_M.mjs.map +0 -1
  1925. package/.output/server/chunks/build/_id_-BHWZiRQZ.mjs +0 -373
  1926. package/.output/server/chunks/build/_id_-BHWZiRQZ.mjs.map +0 -1
  1927. package/.output/server/chunks/build/_id_-JaGx0yBE.mjs +0 -1922
  1928. package/.output/server/chunks/build/_id_-JaGx0yBE.mjs.map +0 -1
  1929. package/.output/server/chunks/build/_wsId_-C4DKkEqv.mjs +0 -13707
  1930. package/.output/server/chunks/build/_wsId_-C4DKkEqv.mjs.map +0 -1
  1931. package/.output/server/chunks/build/agents-DRod4lTC.mjs +0 -1047
  1932. package/.output/server/chunks/build/agents-DRod4lTC.mjs.map +0 -1
  1933. package/.output/server/chunks/build/alert-CNGhs--Y.mjs +0 -260
  1934. package/.output/server/chunks/build/alert-CNGhs--Y.mjs.map +0 -1
  1935. package/.output/server/chunks/build/aml-B3Umz4DR.mjs +0 -729
  1936. package/.output/server/chunks/build/aml-B3Umz4DR.mjs.map +0 -1
  1937. package/.output/server/chunks/build/analysis-tNpFLtMt.mjs +0 -502
  1938. package/.output/server/chunks/build/analysis-tNpFLtMt.mjs.map +0 -1
  1939. package/.output/server/chunks/build/api-D-zkgkj-.mjs +0 -51
  1940. package/.output/server/chunks/build/api-D-zkgkj-.mjs.map +0 -1
  1941. package/.output/server/chunks/build/api-D3gy2e2q.mjs +0 -70
  1942. package/.output/server/chunks/build/api-D3gy2e2q.mjs.map +0 -1
  1943. package/.output/server/chunks/build/api-bn4OKkl_.mjs +0 -62
  1944. package/.output/server/chunks/build/api-bn4OKkl_.mjs.map +0 -1
  1945. package/.output/server/chunks/build/api-error-CnW_xiNI.mjs +0 -46
  1946. package/.output/server/chunks/build/api-error-CnW_xiNI.mjs.map +0 -1
  1947. package/.output/server/chunks/build/apiClient-DIXx9sfD.mjs +0 -70
  1948. package/.output/server/chunks/build/apiClient-DIXx9sfD.mjs.map +0 -1
  1949. package/.output/server/chunks/build/board-B2oYXGBy.mjs +0 -172
  1950. package/.output/server/chunks/build/board-B2oYXGBy.mjs.map +0 -1
  1951. package/.output/server/chunks/build/card-BECE6y_G.mjs +0 -922
  1952. package/.output/server/chunks/build/card-BECE6y_G.mjs.map +0 -1
  1953. package/.output/server/chunks/build/channel-templates-R2TInv8B.mjs +0 -950
  1954. package/.output/server/chunks/build/channel-templates-R2TInv8B.mjs.map +0 -1
  1955. package/.output/server/chunks/build/checkbox-C6xY5uc6.mjs +0 -429
  1956. package/.output/server/chunks/build/checkbox-C6xY5uc6.mjs.map +0 -1
  1957. package/.output/server/chunks/build/client-only-S7k53PIm.mjs +0 -42
  1958. package/.output/server/chunks/build/client-only-S7k53PIm.mjs.map +0 -1
  1959. package/.output/server/chunks/build/core-CRlsQhzd.mjs +0 -292
  1960. package/.output/server/chunks/build/core-CRlsQhzd.mjs.map +0 -1
  1961. package/.output/server/chunks/build/daq-DHsYtWC-.mjs +0 -1210
  1962. package/.output/server/chunks/build/daq-DHsYtWC-.mjs.map +0 -1
  1963. package/.output/server/chunks/build/data-Cl4wRZO6.mjs +0 -459
  1964. package/.output/server/chunks/build/data-Cl4wRZO6.mjs.map +0 -1
  1965. package/.output/server/chunks/build/dcw-DnjOM6p1.mjs +0 -467
  1966. package/.output/server/chunks/build/dcw-DnjOM6p1.mjs.map +0 -1
  1967. package/.output/server/chunks/build/default-DDRKP2Mb.mjs +0 -2246
  1968. package/.output/server/chunks/build/default-DDRKP2Mb.mjs.map +0 -1
  1969. package/.output/server/chunks/build/descriptions-B3uhDesi.mjs +0 -401
  1970. package/.output/server/chunks/build/descriptions-B3uhDesi.mjs.map +0 -1
  1971. package/.output/server/chunks/build/drawer-DwXxapMg.mjs +0 -822
  1972. package/.output/server/chunks/build/drawer-DwXxapMg.mjs.map +0 -1
  1973. package/.output/server/chunks/build/dropdown-DLrGy-Fs.mjs +0 -12
  1974. package/.output/server/chunks/build/dropdown-DLrGy-Fs.mjs.map +0 -1
  1975. package/.output/server/chunks/build/dropdown-nsGv8Gqx.mjs +0 -530
  1976. package/.output/server/chunks/build/dropdown-nsGv8Gqx.mjs.map +0 -1
  1977. package/.output/server/chunks/build/es-DXSEkmAm.mjs +0 -42
  1978. package/.output/server/chunks/build/es-DXSEkmAm.mjs.map +0 -1
  1979. package/.output/server/chunks/build/firstNotUndefined-laiThpLD.mjs +0 -2082
  1980. package/.output/server/chunks/build/firstNotUndefined-laiThpLD.mjs.map +0 -1
  1981. package/.output/server/chunks/build/form-Cw2Ex9w5.mjs +0 -3543
  1982. package/.output/server/chunks/build/form-Cw2Ex9w5.mjs.map +0 -1
  1983. package/.output/server/chunks/build/hasIn-RYRGomyg.mjs +0 -192
  1984. package/.output/server/chunks/build/hasIn-RYRGomyg.mjs.map +0 -1
  1985. package/.output/server/chunks/build/hitl-B4cHRlkC.mjs +0 -120
  1986. package/.output/server/chunks/build/hitl-B4cHRlkC.mjs.map +0 -1
  1987. package/.output/server/chunks/build/input-CJgB-RL6.mjs +0 -1705
  1988. package/.output/server/chunks/build/input-CJgB-RL6.mjs.map +0 -1
  1989. package/.output/server/chunks/build/input-number-CQKL42p_.mjs +0 -1027
  1990. package/.output/server/chunks/build/input-number-CQKL42p_.mjs.map +0 -1
  1991. package/.output/server/chunks/build/interval-DiAUqODq.mjs +0 -8
  1992. package/.output/server/chunks/build/interval-DiAUqODq.mjs.map +0 -1
  1993. package/.output/server/chunks/build/isNumeric-DQiJ-b15.mjs +0 -6
  1994. package/.output/server/chunks/build/isNumeric-DQiJ-b15.mjs.map +0 -1
  1995. package/.output/server/chunks/build/logs-C4vKFkHQ.mjs +0 -381
  1996. package/.output/server/chunks/build/logs-C4vKFkHQ.mjs.map +0 -1
  1997. package/.output/server/chunks/build/menu-xO8ocVtL.mjs +0 -1833
  1998. package/.output/server/chunks/build/menu-xO8ocVtL.mjs.map +0 -1
  1999. package/.output/server/chunks/build/monitor-BNrG6v3b.mjs +0 -2216
  2000. package/.output/server/chunks/build/monitor-BNrG6v3b.mjs.map +0 -1
  2001. package/.output/server/chunks/build/ontology-B_0Vm6j-.mjs +0 -1416
  2002. package/.output/server/chunks/build/ontology-B_0Vm6j-.mjs.map +0 -1
  2003. package/.output/server/chunks/build/operations-D8D6-Jm-.mjs +0 -278
  2004. package/.output/server/chunks/build/operations-D8D6-Jm-.mjs.map +0 -1
  2005. package/.output/server/chunks/build/optimizer-DaTyaY3c.mjs +0 -202
  2006. package/.output/server/chunks/build/optimizer-DaTyaY3c.mjs.map +0 -1
  2007. package/.output/server/chunks/build/pages-Dac4icQC.mjs +0 -439
  2008. package/.output/server/chunks/build/pages-Dac4icQC.mjs.map +0 -1
  2009. package/.output/server/chunks/build/pagination-BTzq7dD5.mjs +0 -1330
  2010. package/.output/server/chunks/build/pagination-BTzq7dD5.mjs.map +0 -1
  2011. package/.output/server/chunks/build/permissions-qmimwB0M.mjs +0 -649
  2012. package/.output/server/chunks/build/permissions-qmimwB0M.mjs.map +0 -1
  2013. package/.output/server/chunks/build/plugins-Dh_goy-k.mjs +0 -269
  2014. package/.output/server/chunks/build/plugins-Dh_goy-k.mjs.map +0 -1
  2015. package/.output/server/chunks/build/popconfirm-DuGF7ty-.mjs +0 -333
  2016. package/.output/server/chunks/build/popconfirm-DuGF7ty-.mjs.map +0 -1
  2017. package/.output/server/chunks/build/responsiveObserve-CzRpNXkr.mjs +0 -77
  2018. package/.output/server/chunks/build/responsiveObserve-CzRpNXkr.mjs.map +0 -1
  2019. package/.output/server/chunks/build/schedules-C2_x38gj.mjs +0 -7039
  2020. package/.output/server/chunks/build/schedules-C2_x38gj.mjs.map +0 -1
  2021. package/.output/server/chunks/build/segmented-29uEKZ3D.mjs +0 -332
  2022. package/.output/server/chunks/build/segmented-29uEKZ3D.mjs.map +0 -1
  2023. package/.output/server/chunks/build/select-CJb2XrQf.mjs +0 -3734
  2024. package/.output/server/chunks/build/select-CJb2XrQf.mjs.map +0 -1
  2025. package/.output/server/chunks/build/settings-Cz2Plds0.mjs +0 -944
  2026. package/.output/server/chunks/build/settings-Cz2Plds0.mjs.map +0 -1
  2027. package/.output/server/chunks/build/space-BByD-mFE.mjs +0 -107
  2028. package/.output/server/chunks/build/space-BByD-mFE.mjs.map +0 -1
  2029. package/.output/server/chunks/build/spin-XhbgGeLP.mjs +0 -313
  2030. package/.output/server/chunks/build/spin-XhbgGeLP.mjs.map +0 -1
  2031. package/.output/server/chunks/build/studio-CwYXl00G.mjs +0 -329
  2032. package/.output/server/chunks/build/studio-CwYXl00G.mjs.map +0 -1
  2033. package/.output/server/chunks/build/switch-DWcwVFxW.mjs +0 -374
  2034. package/.output/server/chunks/build/switch-DWcwVFxW.mjs.map +0 -1
  2035. package/.output/server/chunks/build/table-Zhuo7Fq-.mjs +0 -7249
  2036. package/.output/server/chunks/build/table-Zhuo7Fq-.mjs.map +0 -1
  2037. package/.output/server/chunks/build/tabs-BCwBXjNt.mjs +0 -1838
  2038. package/.output/server/chunks/build/tabs-BCwBXjNt.mjs.map +0 -1
  2039. package/.output/server/chunks/build/tag-CRW-anwy.mjs +0 -1010
  2040. package/.output/server/chunks/build/tag-CRW-anwy.mjs.map +0 -1
  2041. package/.output/server/chunks/build/teams-CwhFdcYn.mjs +0 -1160
  2042. package/.output/server/chunks/build/teams-CwhFdcYn.mjs.map +0 -1
  2043. package/.output/server/chunks/build/tokens-C5ODO1HA.mjs +0 -992
  2044. package/.output/server/chunks/build/tokens-C5ODO1HA.mjs.map +0 -1
  2045. package/.output/server/chunks/build/tools-C0YKragH.mjs +0 -487
  2046. package/.output/server/chunks/build/tools-C0YKragH.mjs.map +0 -1
  2047. package/.output/server/chunks/build/tooltip-GlMrUZzx.mjs +0 -888
  2048. package/.output/server/chunks/build/tooltip-GlMrUZzx.mjs.map +0 -1
  2049. package/.output/server/chunks/build/town-LkDwWnKA.mjs +0 -117
  2050. package/.output/server/chunks/build/town-LkDwWnKA.mjs.map +0 -1
  2051. package/.output/server/chunks/build/useAgentHarnessOptions-CYKuLtZ2.mjs +0 -120
  2052. package/.output/server/chunks/build/useAgentHarnessOptions-CYKuLtZ2.mjs.map +0 -1
  2053. package/.output/server/chunks/build/useAgentTemplateActions-Da_V1LSD.mjs +0 -71
  2054. package/.output/server/chunks/build/useAgentTemplateActions-Da_V1LSD.mjs.map +0 -1
  2055. package/.output/server/chunks/build/useAgentTemplateForm-BWvax5_E.mjs +0 -112
  2056. package/.output/server/chunks/build/useAgentTemplateForm-BWvax5_E.mjs.map +0 -1
  2057. package/.output/server/chunks/build/useAgentTemplatesCatalog-BnYjZy59.mjs +0 -140
  2058. package/.output/server/chunks/build/useAgentTemplatesCatalog-BnYjZy59.mjs.map +0 -1
  2059. package/.output/server/chunks/build/useAmlDatasets-nGi10DAl.mjs +0 -88
  2060. package/.output/server/chunks/build/useAmlDatasets-nGi10DAl.mjs.map +0 -1
  2061. package/.output/server/chunks/build/useAmlEntities-CTgNAgcZ.mjs +0 -79
  2062. package/.output/server/chunks/build/useAmlEntities-CTgNAgcZ.mjs.map +0 -1
  2063. package/.output/server/chunks/build/useAmlEnv-Da2TVfyK.mjs +0 -188
  2064. package/.output/server/chunks/build/useAmlEnv-Da2TVfyK.mjs.map +0 -1
  2065. package/.output/server/chunks/build/useAmlExperiments-U9AQ52RI.mjs +0 -86
  2066. package/.output/server/chunks/build/useAmlExperiments-U9AQ52RI.mjs.map +0 -1
  2067. package/.output/server/chunks/build/useAmlJobs-BM1mu5iH.mjs +0 -251
  2068. package/.output/server/chunks/build/useAmlJobs-BM1mu5iH.mjs.map +0 -1
  2069. package/.output/server/chunks/build/useAmlModels-C1DwIOMi.mjs +0 -90
  2070. package/.output/server/chunks/build/useAmlModels-C1DwIOMi.mjs.map +0 -1
  2071. package/.output/server/chunks/build/useAmlNotes-CNm47QdS.mjs +0 -80
  2072. package/.output/server/chunks/build/useAmlNotes-CNm47QdS.mjs.map +0 -1
  2073. package/.output/server/chunks/build/useAmlPredict-m8I1AdRn.mjs +0 -126
  2074. package/.output/server/chunks/build/useAmlPredict-m8I1AdRn.mjs.map +0 -1
  2075. package/.output/server/chunks/build/useAnalysisFeed-CpbOaiBD.mjs +0 -120
  2076. package/.output/server/chunks/build/useAnalysisFeed-CpbOaiBD.mjs.map +0 -1
  2077. package/.output/server/chunks/build/useDaqAddNode-CRorxgOY.mjs +0 -141
  2078. package/.output/server/chunks/build/useDaqAddNode-CRorxgOY.mjs.map +0 -1
  2079. package/.output/server/chunks/build/useDaqDetailBinding-Ck-YUW9J.mjs +0 -72
  2080. package/.output/server/chunks/build/useDaqDetailBinding-Ck-YUW9J.mjs.map +0 -1
  2081. package/.output/server/chunks/build/useDaqDetailFrames-CLMoreaz.mjs +0 -78
  2082. package/.output/server/chunks/build/useDaqDetailFrames-CLMoreaz.mjs.map +0 -1
  2083. package/.output/server/chunks/build/useDaqDetailHistory-BVNQXwC_.mjs +0 -166
  2084. package/.output/server/chunks/build/useDaqDetailHistory-BVNQXwC_.mjs.map +0 -1
  2085. package/.output/server/chunks/build/useDaqDetailNode-BC0e9OfX.mjs +0 -103
  2086. package/.output/server/chunks/build/useDaqDetailNode-BC0e9OfX.mjs.map +0 -1
  2087. package/.output/server/chunks/build/useDaqDetailParams-D173iwFg.mjs +0 -157
  2088. package/.output/server/chunks/build/useDaqDetailParams-D173iwFg.mjs.map +0 -1
  2089. package/.output/server/chunks/build/useDaqFilters-CC-o_21d.mjs +0 -224
  2090. package/.output/server/chunks/build/useDaqFilters-CC-o_21d.mjs.map +0 -1
  2091. package/.output/server/chunks/build/useDaqOptimizations-4vK2w1yn.mjs +0 -132
  2092. package/.output/server/chunks/build/useDaqOptimizations-4vK2w1yn.mjs.map +0 -1
  2093. package/.output/server/chunks/build/useDaqStream-BHKpSJFd.mjs +0 -385
  2094. package/.output/server/chunks/build/useDaqStream-BHKpSJFd.mjs.map +0 -1
  2095. package/.output/server/chunks/build/useDaqTemplates-CsXSc7yI.mjs +0 -181
  2096. package/.output/server/chunks/build/useDaqTemplates-CsXSc7yI.mjs.map +0 -1
  2097. package/.output/server/chunks/build/useDashboardData-DuKjuJTz.mjs +0 -139
  2098. package/.output/server/chunks/build/useDashboardData-DuKjuJTz.mjs.map +0 -1
  2099. package/.output/server/chunks/build/useDcwAddNode-C5DcxsHF.mjs +0 -217
  2100. package/.output/server/chunks/build/useDcwAddNode-C5DcxsHF.mjs.map +0 -1
  2101. package/.output/server/chunks/build/useDcwCards-0bAVo6uB.mjs +0 -64
  2102. package/.output/server/chunks/build/useDcwCards-0bAVo6uB.mjs.map +0 -1
  2103. package/.output/server/chunks/build/useDcwDetailScope-BNFOlt2v.mjs +0 -184
  2104. package/.output/server/chunks/build/useDcwDetailScope-BNFOlt2v.mjs.map +0 -1
  2105. package/.output/server/chunks/build/useDcwDetailTemplates-DSH-o0tE.mjs +0 -143
  2106. package/.output/server/chunks/build/useDcwDetailTemplates-DSH-o0tE.mjs.map +0 -1
  2107. package/.output/server/chunks/build/useDcwFilter-W61BFUcT.mjs +0 -65
  2108. package/.output/server/chunks/build/useDcwFilter-W61BFUcT.mjs.map +0 -1
  2109. package/.output/server/chunks/build/useDcwLedger-DsColLdc.mjs +0 -73
  2110. package/.output/server/chunks/build/useDcwLedger-DsColLdc.mjs.map +0 -1
  2111. package/.output/server/chunks/build/useDcwLineMutations-Cx4Ir7g3.mjs +0 -133
  2112. package/.output/server/chunks/build/useDcwLineMutations-Cx4Ir7g3.mjs.map +0 -1
  2113. package/.output/server/chunks/build/useDcwLineRun-DQ0vB08z.mjs +0 -100
  2114. package/.output/server/chunks/build/useDcwLineRun-DQ0vB08z.mjs.map +0 -1
  2115. package/.output/server/chunks/build/useDcwParamApprovals-CYspRuDk.mjs +0 -119
  2116. package/.output/server/chunks/build/useDcwParamApprovals-CYspRuDk.mjs.map +0 -1
  2117. package/.output/server/chunks/build/useDcwProducts-CTbm_5S_.mjs +0 -88
  2118. package/.output/server/chunks/build/useDcwProducts-CTbm_5S_.mjs.map +0 -1
  2119. package/.output/server/chunks/build/useDcwQuery-E0yjZs7G.mjs +0 -93
  2120. package/.output/server/chunks/build/useDcwQuery-E0yjZs7G.mjs.map +0 -1
  2121. package/.output/server/chunks/build/useDcwQuickActions-BvT5VFOY.mjs +0 -84
  2122. package/.output/server/chunks/build/useDcwQuickActions-BvT5VFOY.mjs.map +0 -1
  2123. package/.output/server/chunks/build/useDcwRecipes-zngShyk0.mjs +0 -263
  2124. package/.output/server/chunks/build/useDcwRecipes-zngShyk0.mjs.map +0 -1
  2125. package/.output/server/chunks/build/useDcwStream-82IdjJKk.mjs +0 -455
  2126. package/.output/server/chunks/build/useDcwStream-82IdjJKk.mjs.map +0 -1
  2127. package/.output/server/chunks/build/useDcwTemplates-CpHrcnvJ.mjs +0 -87
  2128. package/.output/server/chunks/build/useDcwTemplates-CpHrcnvJ.mjs.map +0 -1
  2129. package/.output/server/chunks/build/useDcwWrites-BlOhljp9.mjs +0 -136
  2130. package/.output/server/chunks/build/useDcwWrites-BlOhljp9.mjs.map +0 -1
  2131. package/.output/server/chunks/build/useDeviceTwins-DL-VLFeX.mjs +0 -118
  2132. package/.output/server/chunks/build/useDeviceTwins-DL-VLFeX.mjs.map +0 -1
  2133. package/.output/server/chunks/build/useExpConfirmations-DgwqTb9O.mjs +0 -104
  2134. package/.output/server/chunks/build/useExpConfirmations-DgwqTb9O.mjs.map +0 -1
  2135. package/.output/server/chunks/build/useLocalTime-C__kwn8h.mjs +0 -52
  2136. package/.output/server/chunks/build/useLocalTime-C__kwn8h.mjs.map +0 -1
  2137. package/.output/server/chunks/build/useLogsManual-BcfanT0s.mjs +0 -80
  2138. package/.output/server/chunks/build/useLogsManual-BcfanT0s.mjs.map +0 -1
  2139. package/.output/server/chunks/build/useLogsQuery-BGlKVKpV.mjs +0 -136
  2140. package/.output/server/chunks/build/useLogsQuery-BGlKVKpV.mjs.map +0 -1
  2141. package/.output/server/chunks/build/useLogsScope-BRyy550Y.mjs +0 -75
  2142. package/.output/server/chunks/build/useLogsScope-BRyy550Y.mjs.map +0 -1
  2143. package/.output/server/chunks/build/useMonitorData-BUey2Xly.mjs +0 -128
  2144. package/.output/server/chunks/build/useMonitorData-BUey2Xly.mjs.map +0 -1
  2145. package/.output/server/chunks/build/useMonitorFormat-rhs7FlNo.mjs +0 -77
  2146. package/.output/server/chunks/build/useMonitorFormat-rhs7FlNo.mjs.map +0 -1
  2147. package/.output/server/chunks/build/useOperationsFeed-DWfCjP4l.mjs +0 -182
  2148. package/.output/server/chunks/build/useOperationsFeed-DWfCjP4l.mjs.map +0 -1
  2149. package/.output/server/chunks/build/useOpsLog--yf8erUi.mjs +0 -139
  2150. package/.output/server/chunks/build/useOpsLog--yf8erUi.mjs.map +0 -1
  2151. package/.output/server/chunks/build/useRecipeDispatchApprovals-CKF2sB9P.mjs +0 -146
  2152. package/.output/server/chunks/build/useRecipeDispatchApprovals-CKF2sB9P.mjs.map +0 -1
  2153. package/.output/server/chunks/build/useTeamActions-C08sAVqY.mjs +0 -71
  2154. package/.output/server/chunks/build/useTeamActions-C08sAVqY.mjs.map +0 -1
  2155. package/.output/server/chunks/build/useTeamAddMemberDialog-fzTmflr8.mjs +0 -78
  2156. package/.output/server/chunks/build/useTeamAddMemberDialog-fzTmflr8.mjs.map +0 -1
  2157. package/.output/server/chunks/build/useTeamCreateDialog-De63ep-X.mjs +0 -91
  2158. package/.output/server/chunks/build/useTeamCreateDialog-De63ep-X.mjs.map +0 -1
  2159. package/.output/server/chunks/build/useTeamDeployDialog-CpAtG5Jy.mjs +0 -76
  2160. package/.output/server/chunks/build/useTeamDeployDialog-CpAtG5Jy.mjs.map +0 -1
  2161. package/.output/server/chunks/build/useTeamPluginDialog-C1OOe1sL.mjs +0 -99
  2162. package/.output/server/chunks/build/useTeamPluginDialog-C1OOe1sL.mjs.map +0 -1
  2163. package/.output/server/chunks/build/useTeamsCatalog-DA41SMDu.mjs +0 -124
  2164. package/.output/server/chunks/build/useTeamsCatalog-DA41SMDu.mjs.map +0 -1
  2165. package/.output/server/chunks/build/useTokenCreate-XHTQExra.mjs +0 -106
  2166. package/.output/server/chunks/build/useTokenCreate-XHTQExra.mjs.map +0 -1
  2167. package/.output/server/chunks/build/useTokenRename-Cf1B0cRy.mjs +0 -81
  2168. package/.output/server/chunks/build/useTokenRename-Cf1B0cRy.mjs.map +0 -1
  2169. package/.output/server/chunks/build/useTokenReveal-C8n1Vt9t.mjs +0 -108
  2170. package/.output/server/chunks/build/useTokenReveal-C8n1Vt9t.mjs.map +0 -1
  2171. package/.output/server/chunks/build/useTokensList-MMIq24E-.mjs +0 -86
  2172. package/.output/server/chunks/build/useTokensList-MMIq24E-.mjs.map +0 -1
  2173. package/.output/server/chunks/build/useWorkbenchAuth-Dyc_czui.mjs +0 -131
  2174. package/.output/server/chunks/build/useWorkbenchAuth-Dyc_czui.mjs.map +0 -1
  2175. package/.output/server/chunks/build/useWorkbenchWorkspaces-DT33HbBD.mjs +0 -128
  2176. package/.output/server/chunks/build/useWorkbenchWorkspaces-DT33HbBD.mjs.map +0 -1
  2177. package/.output/server/chunks/build/useWorkshopApi-BkEgGBIM.mjs +0 -118
  2178. package/.output/server/chunks/build/useWorkshopApi-BkEgGBIM.mjs.map +0 -1
  2179. package/.output/server/chunks/build/useWorkshopWs-BWrVj4jL.mjs +0 -1577
  2180. package/.output/server/chunks/build/useWorkshopWs-BWrVj4jL.mjs.map +0 -1
  2181. package/.output/server/chunks/build/useWorkspaceAuth-TahC9EC7.mjs +0 -48
  2182. package/.output/server/chunks/build/useWorkspaceAuth-TahC9EC7.mjs.map +0 -1
  2183. package/.output/server/chunks/build/useWorkspaceChannels-BVAHmhN3.mjs +0 -94
  2184. package/.output/server/chunks/build/useWorkspaceChannels-BVAHmhN3.mjs.map +0 -1
  2185. package/.output/server/chunks/build/useWorkspaceShell-rQHWNNWJ.mjs +0 -150
  2186. package/.output/server/chunks/build/useWorkspaceShell-rQHWNNWJ.mjs.map +0 -1
  2187. package/.output/server/chunks/build/users-pVCK50z-.mjs +0 -566
  2188. package/.output/server/chunks/build/users-pVCK50z-.mjs.map +0 -1
  2189. package/.output/server/chunks/build/workshop-DAgsBgG4.mjs +0 -499
  2190. package/.output/server/chunks/build/workshop-DAgsBgG4.mjs.map +0 -1
  2191. package/scripts/_aw-packaged-start.cjs +0 -22
  2192. package/scripts/_i18n-en-cjk-scan.mjs +0 -28
  2193. package/scripts/_i18n-en-verify.mjs +0 -107
  2194. package/scripts/_i18n-extra-checks.mjs +0 -53
  2195. package/scripts/_i18n-scan-hardcoded.mjs +0 -180
  2196. package/scripts/_lib-dcw-line.mjs +0 -24
  2197. package/scripts/_lib-plc-sim-child.mjs +0 -28
  2198. package/scripts/_lint-reflow.mjs +0 -105
  2199. package/scripts/_loop-biax-campaign.mjs +0 -130
  2200. package/scripts/_probe-daq-omp-task.mjs +0 -100
  2201. package/scripts/_probe-daq-scope-default.mjs +0 -123
  2202. package/scripts/_probe-lease.cjs +0 -13
  2203. package/scripts/_probe-model-channel-link.cjs +0 -25
  2204. package/scripts/_probe-recipe-switch.mjs +0 -92
  2205. package/scripts/_probe-task-queue.cjs +0 -9
  2206. package/scripts/build-anime-models.mjs +0 -339
  2207. package/scripts/demo-group-chat-omp-cases.ts +0 -210
  2208. package/scripts/demo-group-chat-omp.ts +0 -184
  2209. package/scripts/demo-group-chat-order.ts +0 -197
  2210. package/scripts/e2e-channel-isolation.ts +0 -329
  2211. package/scripts/e2e-lead-team-mgmt.ts +0 -217
  2212. package/scripts/proof-omp-real.ts +0 -189
  2213. package/scripts/smoke-optimization-verify.ts +0 -72
  2214. package/scripts/test-a2a-types.ts +0 -296
  2215. package/scripts/test-agent-multi-channel.ts +0 -160
  2216. package/scripts/test-agentteam-task-chat-flow.ts +0 -420
  2217. package/scripts/test-channel-routing.ts +0 -301
  2218. package/scripts/test-cli-exit.mjs +0 -343
  2219. package/scripts/test-event-persistence.mjs +0 -177
  2220. package/scripts/test-group-chat-hardening.ts +0 -265
  2221. package/scripts/test-group-chat-unit/section-a-migration.ts +0 -75
  2222. package/scripts/test-group-chat-unit/section-b-permission-matrix.ts +0 -88
  2223. package/scripts/test-group-chat-unit/section-c-member-lifecycle.ts +0 -64
  2224. package/scripts/test-group-chat-unit/section-d-mention-resolution.ts +0 -36
  2225. package/scripts/test-group-chat-unit/section-e-chat-facts.ts +0 -97
  2226. package/scripts/test-group-chat-unit/section-f-user-notifications.ts +0 -52
  2227. package/scripts/test-group-chat-unit/section-g-member-projection.ts +0 -44
  2228. package/scripts/test-group-chat-unit/section-h-outbox-consistency.ts +0 -30
  2229. package/scripts/test-group-chat-unit/section-i-read-idempotency.ts +0 -24
  2230. package/scripts/test-group-chat-unit/section-j-permission-scope.ts +0 -150
  2231. package/scripts/test-hitl-legacy-channel-auth.ts +0 -143
  2232. package/scripts/test-lane-history-live.mjs +0 -126
  2233. package/scripts/test-mcp-tools.ts +0 -285
  2234. package/scripts/test-memory-dynamic.ts +0 -101
  2235. package/scripts/test-memory-month-query.mjs +0 -70
  2236. package/scripts/test-memory.ts +0 -431
  2237. package/scripts/test-route-reason.mjs +0 -118
  2238. package/scripts/test-scheduler-loop/scenarios-modes.ts +0 -95
  2239. package/scripts/test-scheduler-loop/scenarios-runtime.ts +0 -58
  2240. package/scripts/test-scheduler-loop/scenarios-supervise.ts +0 -183
  2241. package/scripts/test-scheduler-loop/scenarios-triage.ts +0 -102
  2242. package/scripts/ui/admin-shots.mjs +0 -46
  2243. package/scripts/ui/bump-microfont.mjs +0 -39
  2244. package/scripts/ui/linkcheck2.mjs +0 -37
  2245. package/scripts/ui/live-render-check.mjs +0 -72
  2246. package/scripts/ui/perf-audit.mjs +0 -132
  2247. package/scripts/ui/sim-ui-shot.mjs +0 -16
  2248. package/scripts/ui/smoke-refactor.mjs +0 -258
  2249. /package/.output/public/_nuxt/{9j2J4k4w2.js → 9j2J4k4w.js} +0 -0
  2250. /package/.output/public/_nuxt/{dVw8IHY6.js → dVw8IHY62.js} +0 -0
  2251. /package/.output/public/_nuxt/{k9b520K-2.js → k9b520K-.js} +0 -0
@@ -0,0 +1,1926 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Bounded integration evidence for the registered `omp` harness.
4
+ *
5
+ * The default mode uses a deterministic local RPC fixture. The opt-in
6
+ * PAPER_E2E_HARNESS_MODE=real-omp mode uses the locally authenticated OMP CLI
7
+ * and a fixed provider/model for three bounded trials in each simulator scene.
8
+ * Both modes use a fresh AW_HOME and local simulator/application services.
9
+ */
10
+ import { spawn, spawnSync } from 'node:child_process'
11
+ import { createHash, randomBytes } from 'node:crypto'
12
+ import { chmodSync, closeSync, copyFileSync, cpSync, existsSync, mkdirSync, mkdtempSync, openSync, readFileSync, readdirSync, symlinkSync, writeFileSync } from 'node:fs'
13
+ import { createServer } from 'node:net'
14
+ import { dirname, isAbsolute, join, relative, resolve, sep } from 'node:path'
15
+ import { fileURLToPath } from 'node:url'
16
+ import { setTimeout as delay } from 'node:timers/promises'
17
+ import { resolveRunMode } from '../shared/config/home.mjs'
18
+
19
+ const REPO = resolve(dirname(fileURLToPath(import.meta.url)), '..')
20
+ const AW_PORT = 3997
21
+ const SIM_PORT = 4020
22
+ const MQTT_PORT = 18840
23
+ const OFFLINE_TSDB_PORT = 45321
24
+ const OFFLINE_OBJECTSTORE_PORT = 45322
25
+ const OFFLINE_APP_MQTT_QUEUE_PORT = 45323
26
+ const FORBIDDEN_PORT = 4010
27
+ const APP_BASE = `http://127.0.0.1:${AW_PORT}`
28
+ const SIM_BASE = `http://127.0.0.1:${SIM_PORT}`
29
+ const FIXTURE = resolve(REPO, 'scripts', 'fixtures', 'omp-paper-harness.mjs')
30
+ const SIM_SOURCE = resolve(REPO, 'plc-node-simulator')
31
+ const VERSION = JSON.parse(readFileSync(join(REPO, 'package.json'), 'utf8')).version
32
+ const TAG = `rhe${Date.now().toString(36)}`
33
+ mkdirSync(join(REPO, '.omc'), { recursive: true })
34
+ const ROOT = mkdtempSync(join(REPO, '.omc', 'registered-harness-paper-'))
35
+ const HOME = join(ROOT, 'aw-home')
36
+ const EVIDENCE_PATH = join(ROOT, 'evidence.json')
37
+ const SIM_ROOT = join(ROOT, 'simulator')
38
+ const SIM_LOG = join(ROOT, 'simulator.log')
39
+ const APP_LOG = join(ROOT, 'agentworkshop.log')
40
+ const EMPTY_DOTENV = join(HOME, 'empty.env')
41
+ const ISOLATED_PROMPTS_DIR = join(HOME, 'prompts')
42
+ const NUXT_CLI = join(REPO, 'node_modules', 'nuxt', 'bin', 'nuxt.mjs')
43
+ const RAG_BRIDGE_DISABLED_BASE_URL = 'http://paper-harness-outbound-disabled.invalid'
44
+ const SIM_LOG_FD = openSync(SIM_LOG, 'a')
45
+ const APP_LOG_FD = openSync(APP_LOG, 'a')
46
+ const HARNESS_MODE = process.env.PAPER_E2E_HARNESS_MODE ?? 'fixture'
47
+ const REAL_OMP_PROVIDER = 'zhipu-coding-plan'
48
+ const REAL_OMP_MODEL = 'glm-5.3-flash'
49
+ const REAL_OMP_TRIALS_PER_SCENE = 3
50
+ const REAL_OMP_APPROVAL_TIMEOUT_MS = 180_000
51
+ const REAL_OMP_TASK_COMPLETION_TIMEOUT_MS = 180_000
52
+ const REAL_OMP_PROMPT_TIMEOUT_MS = 360_000
53
+
54
+ const evidence = {
55
+ schemaVersion: 1,
56
+ experiment: {
57
+ id: TAG,
58
+ projectVersion: VERSION,
59
+ ...(HARNESS_MODE === 'real-omp'
60
+ ? {
61
+ campaign: 'R20',
62
+ harnessMode: 'real-omp',
63
+ provider: REAL_OMP_PROVIDER,
64
+ model: REAL_OMP_MODEL,
65
+ trialsPerScene: REAL_OMP_TRIALS_PER_SCENE,
66
+ runOutcomes: [],
67
+ }
68
+ : {
69
+ fixture: 'deterministic local OMP-RPC transport; no LLM or autonomous harness decision',
70
+ }),
71
+ startedAt: new Date().toISOString(),
72
+ postTrialSnapshotDelaySeconds: 20,
73
+ scenes: [],
74
+ },
75
+ isolation: {
76
+ result: 'pending',
77
+ awHome: 'fresh isolated AW_HOME',
78
+ appBase: APP_BASE,
79
+ simulatorBase: SIM_BASE,
80
+ simulatorMqttLoopbackPort: MQTT_PORT,
81
+ appMqttQueueOfflineProbePort: OFFLINE_APP_MQTT_QUEUE_PORT,
82
+ explicitLoopbackOnly: HARNESS_MODE !== 'real-omp',
83
+ externalLlmDisabled: HARNESS_MODE !== 'real-omp',
84
+ ...(HARNESS_MODE === 'real-omp' ? { externalLlmAllowedOnlyForRegisteredOmpProcess: true } : {}),
85
+ forbiddenServicePortExcluded: true,
86
+ checks: [],
87
+ },
88
+ checks: [],
89
+ status: 'running',
90
+ }
91
+
92
+ let appProcess
93
+ let simProcess
94
+ let wrapperPath
95
+ let currentStage = 'preflight'
96
+ let currentScene
97
+ let authToken
98
+ let syntheticAdminId
99
+ let isolatedPluginNames = []
100
+ let expectedPluginNames = []
101
+ const allowedEnabledPluginNames = ['rag-bridge']
102
+ let projectPluginTreeAtPrepare
103
+ let projectPromptTreeAtPrepare
104
+ let promptTreeAtPrepare
105
+ const generatedSessionPassword = randomBytes(32).toString('hex')
106
+ const children = new Set()
107
+ const allocatedDevicePorts = []
108
+ const CHILD_OS_ENV_KEYS = process.platform === 'win32'
109
+ ? ['PATH', 'PATHEXT', 'SystemRoot', 'WINDIR', 'TEMP', 'TMP', 'USERPROFILE', 'APPDATA', 'LOCALAPPDATA', 'HOMEDRIVE', 'HOMEPATH', 'ProgramData']
110
+ : ['PATH', 'HOME', 'TMPDIR', 'TMP', 'TEMP', 'LANG', 'LC_ALL']
111
+ const CHILD_EXTRA_ENV_KEYS = new Set(['SIM_PORT', 'MQTT_BROKER_PORT'])
112
+ const RELEASE_CHECK_SUFFIXES = ['-process-stopped', '-port-released']
113
+
114
+ function check(id, pass, detail = {}) {
115
+ evidence.checks.push({ id, status: pass ? 'pass' : 'fail', detail })
116
+ if (!pass) throw new Error(`check failed: ${id}`)
117
+ }
118
+
119
+ function noteIsolation(id, pass, detail = {}) {
120
+ evidence.isolation.checks.push({ id, status: pass ? 'pass' : 'fail', detail })
121
+ if (!pass) throw new Error(`isolation preflight failed: ${id}`)
122
+ }
123
+
124
+ function safeText(value, limit = 500) {
125
+ let text = String(value ?? '')
126
+ if (authToken) text = text.split(authToken).join('[REDACTED]')
127
+ text = text.replace(/\but-[a-f\d]{32}\b/gi, '[REDACTED_TOKEN]')
128
+ text = text.replace(/\bBearer\s+[^\s,;]+/gi, 'Bearer [REDACTED]')
129
+ text = text.replace(/\b(?:api[_-]?key|access[_-]?token|client[_-]?secret|password|secret)\s*[:=]\s*["']?[^\s,"'}]+/gi, '[REDACTED_CREDENTIAL]')
130
+ text = text.replace(/\bsk-[A-Za-z0-9_-]{16,}\b/g, '[REDACTED_CREDENTIAL]')
131
+ return text.slice(0, limit)
132
+ }
133
+
134
+ function compactError(error) {
135
+ const message = error instanceof Error ? error.message : String(error)
136
+ return { name: error instanceof Error ? error.name : 'Error', message: safeText(message) }
137
+ }
138
+
139
+ function assertLoopbackUrl(url, expectedPort) {
140
+ const parsed = new URL(url)
141
+ if (parsed.protocol !== 'http:' || parsed.hostname !== '127.0.0.1' || Number(parsed.port) !== expectedPort || Number(parsed.port) === FORBIDDEN_PORT) {
142
+ throw new Error('network boundary rejected a non-approved loopback URL')
143
+ }
144
+ }
145
+
146
+ function fixtureTracePath(sceneId) {
147
+ if (!['cast-film', 'annealing'].includes(sceneId)) throw new Error('fixture trace scene is not approved')
148
+ const root = resolve(ROOT)
149
+ const tracePath = resolve(root, `fixture-${sceneId}.json`)
150
+ const relativePath = relative(root, tracePath)
151
+ if (isAbsolute(relativePath) || relativePath === '..' || relativePath.startsWith(`..${sep}`)) {
152
+ throw new Error('fixture trace path escaped the experiment root')
153
+ }
154
+ return tracePath
155
+ }
156
+
157
+ async function assertFreeLoopback(port, label) {
158
+ if (!Number.isInteger(port) || port < 1024 || port > 65535 || port === FORBIDDEN_PORT) {
159
+ throw new Error(`port allocation rejected for ${label}`)
160
+ }
161
+ const server = createServer()
162
+ await new Promise((resolvePromise, reject) => {
163
+ server.once('error', reject)
164
+ server.listen(port, '127.0.0.1', resolvePromise)
165
+ })
166
+ await new Promise(resolvePromise => server.close(resolvePromise))
167
+ }
168
+
169
+ async function preflight() {
170
+ if (!['fixture', 'real-omp'].includes(HARNESS_MODE)) throw new Error('PAPER_E2E_HARNESS_MODE must be fixture or real-omp')
171
+ if (typeof VERSION !== 'string' || VERSION.length === 0) throw new Error('package manifest does not define a version')
172
+ if ((HARNESS_MODE === 'fixture' && !existsSync(FIXTURE)) || !existsSync(join(SIM_SOURCE, 'src', 'server', 'index.ts')) || !existsSync(join(SIM_SOURCE, 'node_modules')) || !existsSync(NUXT_CLI)) {
173
+ throw new Error('required local harness input or simulator runtime is missing')
174
+ }
175
+ if (existsSync(HOME)) throw new Error('fresh AW_HOME path unexpectedly exists')
176
+ const mode = resolveRunMode({ cwd: REPO, packageRoot: REPO, env: { AW_HOME: HOME, AW_MODE: 'home' } })
177
+ if (mode.mode !== 'home' || resolve(mode.home) !== resolve(HOME) || resolve(mode.dataDir) !== resolve(join(HOME, 'data'))) {
178
+ throw new Error('AW_HOME did not resolve to a new isolated home-mode data directory')
179
+ }
180
+ noteIsolation('fresh-home-mode-resolution', true, { mode: mode.mode, dataDir: mode.dataDir })
181
+ for (const [label, port] of [['app', AW_PORT], ['simulator-http', SIM_PORT], ['simulator-mqtt', MQTT_PORT], ['offline-app-mqtt-queue-probe', OFFLINE_APP_MQTT_QUEUE_PORT], ['offline-timescale-probe', OFFLINE_TSDB_PORT], ['offline-objectstore-probe', OFFLINE_OBJECTSTORE_PORT]]) {
182
+ await assertFreeLoopback(port, label)
183
+ noteIsolation(`${label}-free-loopback-port`, true, { port, host: '127.0.0.1' })
184
+ }
185
+ if (AW_PORT === FORBIDDEN_PORT || SIM_PORT === FORBIDDEN_PORT || MQTT_PORT === FORBIDDEN_PORT) {
186
+ throw new Error('forbidden service port appeared in explicit service configuration')
187
+ }
188
+ noteIsolation('project-version-and-local-inputs', true, {
189
+ version: VERSION,
190
+ simulatorSourcePresent: true,
191
+ fixturePresent: HARNESS_MODE === 'fixture' ? true : null,
192
+ nuxtCliPresent: true,
193
+ noUserOrBusinessArchiveInput: true,
194
+ })
195
+ noteIsolation('strict-child-environment-allowlist', true, HARNESS_MODE === 'fixture'
196
+ ? { osKeys: CHILD_OS_ENV_KEYS, fixtureOnlyHarness: true, noStorageServiceEnvironment: true }
197
+ : { osKeys: CHILD_OS_ENV_KEYS, harnessMode: HARNESS_MODE, credentialValuesExposedToRunnerOrEvidence: false, noStorageServiceEnvironment: true })
198
+ }
199
+
200
+ function cleanChildEnv(extra = {}) {
201
+ const env = {}
202
+ for (const key of CHILD_OS_ENV_KEYS) {
203
+ if (process.env[key] !== undefined) env[key] = process.env[key]
204
+ }
205
+ env.AW_HOME = HOME
206
+ env.AW_MODE = 'home'
207
+ env.AW_PROMPTS_DIR = ISOLATED_PROMPTS_DIR
208
+ env.NUXT_SESSION_PASSWORD = generatedSessionPassword
209
+ env.NO_PROXY = '127.0.0.1,localhost'
210
+ env.no_proxy = '127.0.0.1,localhost'
211
+ if (HARNESS_MODE === 'fixture') {
212
+ env.AW_PAPER_FIXTURE_NODE = process.execPath
213
+ env.AW_PAPER_FIXTURE_SCRIPT = FIXTURE
214
+ }
215
+ for (const [key, value] of Object.entries(extra)) {
216
+ if (!CHILD_EXTRA_ENV_KEYS.has(key)) throw new Error(`child environment rejected unsupported override ${key}`)
217
+ env[key] = String(value)
218
+ }
219
+ return env
220
+ }
221
+
222
+ function gitText(cwd, args) {
223
+ const result = spawnSync('git', args, {
224
+ cwd,
225
+ windowsHide: true,
226
+ encoding: 'utf8',
227
+ stdio: ['ignore', 'pipe', 'pipe'],
228
+ env: cleanChildEnv(),
229
+ })
230
+ if (result.error || result.status !== 0) {
231
+ throw new Error(`could not capture source identity: ${safeText(result.stderr || result.error?.message || result.status)}`)
232
+ }
233
+ return String(result.stdout ?? '').trim()
234
+ }
235
+
236
+ function hashGitFiles(cwd, roots) {
237
+ const names = gitText(cwd, ['ls-files', '-co', '--exclude-standard', '--', ...roots])
238
+ .split(/\r?\n/).filter(Boolean).sort()
239
+ if (names.length === 0) throw new Error(`source identity has no files under ${roots.join(', ')}`)
240
+ return hashFileList(cwd, names)
241
+ }
242
+
243
+ function hashFileList(cwd, names) {
244
+ const hash = createHash('sha256')
245
+ for (const name of names) {
246
+ hash.update(name.replaceAll('\\', '/') + '\0')
247
+ hash.update(readFileSync(join(cwd, name)))
248
+ hash.update('\0')
249
+ }
250
+ return { sha256: hash.digest('hex'), fileCount: names.length }
251
+ }
252
+
253
+ function hashDirectoryTree(root) {
254
+ if (!existsSync(root)) return hashFileList(root, [])
255
+ const names = []
256
+ const visit = (directory) => {
257
+ for (const entry of readdirSync(directory, { withFileTypes: true })) {
258
+ const absolute = join(directory, entry.name)
259
+ const name = relative(root, absolute).replaceAll('\\', '/')
260
+ if (entry.isSymbolicLink()) throw new Error(`source identity rejected symlink in plugin tree: ${name}`)
261
+ if (entry.isDirectory()) visit(absolute)
262
+ else if (entry.isFile()) names.push(name)
263
+ }
264
+ }
265
+ visit(root)
266
+ names.sort()
267
+ return hashFileList(root, names)
268
+ }
269
+
270
+ function pluginNamesUnder(root) {
271
+ if (!existsSync(root)) return []
272
+ return readdirSync(root, { withFileTypes: true })
273
+ .filter(entry => entry.isDirectory() && existsSync(join(root, entry.name, 'index.mjs')))
274
+ .map(entry => entry.name)
275
+ .sort()
276
+ }
277
+
278
+ function captureSourceIdentity() {
279
+ const appRoots = ['app', 'server', 'shared', 'mcp', 'cli', 'sdk', 'i18n', 'public', 'tsconfig.json', 'package.json', 'pnpm-lock.yaml', 'nuxt.config.ts', 'config.yml']
280
+ const simulatorRoots = ['src', 'package.json', 'package-lock.json']
281
+ const simulatorSourceFiles = gitText(SIM_SOURCE, ['ls-files', '-co', '--exclude-standard', '--', ...simulatorRoots])
282
+ .split(/\r?\n/).filter(Boolean).sort()
283
+ const executedSimulatorFiles = simulatorSourceFiles.filter(name => existsSync(join(SIM_ROOT, name)))
284
+ if (!executedSimulatorFiles.includes('src/server/index.ts') || !executedSimulatorFiles.includes('package.json')) {
285
+ throw new Error('executed simulator copy is missing required source files for provenance')
286
+ }
287
+ const projectPluginTree = hashDirectoryTree(join(REPO, '.AgentWorkShop', 'plugins'))
288
+ if (projectPluginTree.sha256 !== projectPluginTreeAtPrepare?.sha256) {
289
+ throw new Error('project plugin source changed after isolation was prepared')
290
+ }
291
+ const promptTree = hashDirectoryTree(ISOLATED_PROMPTS_DIR)
292
+ if (promptTree.sha256 !== promptTreeAtPrepare?.sha256) {
293
+ throw new Error('isolated prompt assets changed after isolation was prepared')
294
+ }
295
+ const ompVersion = HARNESS_MODE === 'real-omp'
296
+ ? spawnSync('omp', ['--version'], { cwd: HOME, windowsHide: true, encoding: 'utf8', timeout: 5_000, env: cleanChildEnv() })
297
+ : null
298
+ if (ompVersion && (ompVersion.error || ompVersion.status !== 0)) {
299
+ throw new Error('could not record the OMP CLI version for real-harness provenance')
300
+ }
301
+ return {
302
+ recordedAt: new Date().toISOString(),
303
+ nodeVersion: process.version,
304
+ platform: process.platform,
305
+ architecture: process.arch,
306
+ app: {
307
+ version: VERSION,
308
+ gitHead: gitText(REPO, ['rev-parse', 'HEAD']),
309
+ sourceTree: hashGitFiles(REPO, appRoots),
310
+ workingTreeStatus: gitText(REPO, ['status', '--porcelain', '--', ...appRoots]),
311
+ packageManifestSha256: createHash('sha256').update(readFileSync(join(REPO, 'package.json'))).digest('hex'),
312
+ lockfileSha256: createHash('sha256').update(readFileSync(join(REPO, 'pnpm-lock.yaml'))).digest('hex'),
313
+ projectPluginTree,
314
+ projectPluginNames: pluginNamesUnder(join(REPO, '.AgentWorkShop', 'plugins')),
315
+ },
316
+ pluginIsolation: {
317
+ disabledNames: isolatedPluginNames,
318
+ enabledAllowlist: allowedEnabledPluginNames,
319
+ setupExpectedForOtherPlugins: false,
320
+ disabledStatePath: 'AW_HOME/plugins-state.json',
321
+ projectPluginNames: pluginNamesUnder(join(REPO, '.AgentWorkShop', 'plugins')),
322
+ projectPluginTree,
323
+ },
324
+ promptIsolation: {
325
+ sourceDirectory: 'repository/.AgentWorkShop/prompts',
326
+ isolatedDirectory: 'AW_HOME/prompts',
327
+ sourceTree: projectPromptTreeAtPrepare,
328
+ runtimeTree: promptTree,
329
+ },
330
+ experimentScriptSha256: createHash('sha256').update(readFileSync(fileURLToPath(import.meta.url))).digest('hex'),
331
+ registeredHarness: {
332
+ mode: HARNESS_MODE,
333
+ provider: HARNESS_MODE === 'real-omp' ? REAL_OMP_PROVIDER : null,
334
+ model: HARNESS_MODE === 'real-omp' ? REAL_OMP_MODEL : null,
335
+ ompCliVersion: ompVersion ? safeText(ompVersion.stdout.trim(), 120) : null,
336
+ fixtureSha256: HARNESS_MODE === 'fixture' ? createHash('sha256').update(readFileSync(FIXTURE)).digest('hex') : null,
337
+ launcherSha256: wrapperPath ? createHash('sha256').update(readFileSync(wrapperPath)).digest('hex') : null,
338
+ },
339
+ simulator: {
340
+ gitlinkHead: gitText(REPO, ['rev-parse', 'HEAD:plc-node-simulator']),
341
+ gitHead: gitText(SIM_SOURCE, ['rev-parse', 'HEAD']),
342
+ sourceTree: hashGitFiles(SIM_SOURCE, simulatorRoots),
343
+ workingTreeStatus: gitText(SIM_SOURCE, ['status', '--porcelain', '--', ...simulatorRoots]),
344
+ executedTree: hashFileList(SIM_ROOT, executedSimulatorFiles),
345
+ lockfileSha256: createHash('sha256').update(readFileSync(join(SIM_SOURCE, 'package-lock.json'))).digest('hex'),
346
+ copyPatch: 'bind copied simulator HTTP and MQTT listeners to 127.0.0.1 and remap only their ports; source script hash records the transformation',
347
+ },
348
+ }
349
+ }
350
+
351
+ function prepareIsolatedHome() {
352
+ mkdirSync(join(HOME, 'data'), { recursive: true })
353
+ copyFileSync(join(REPO, 'config.yml'), join(HOME, 'config.yml'))
354
+ const overrides = {
355
+ 'daq.startInfrastructure': 'never',
356
+ 'daq.mqtt.host': '127.0.0.1',
357
+ 'daq.mqtt.port': OFFLINE_APP_MQTT_QUEUE_PORT,
358
+ 'daq.timescale.host': '127.0.0.1',
359
+ 'daq.timescale.port': OFFLINE_TSDB_PORT,
360
+ 'daq.objectstore.host': '127.0.0.1',
361
+ 'daq.objectstore.port': OFFLINE_OBJECTSTORE_PORT,
362
+ 'plugins.rag-bridge.base_url': RAG_BRIDGE_DISABLED_BASE_URL,
363
+ }
364
+ const runtimeSettingsPath = join(HOME, 'runtime-settings.json')
365
+ writeFileSync(runtimeSettingsPath, `${JSON.stringify({ version: 1, updatedAt: new Date().toISOString(), overrides }, null, 2)}\n`, 'utf8')
366
+ const savedOverrides = JSON.parse(readFileSync(runtimeSettingsPath, 'utf8')).overrides
367
+ if (savedOverrides?.['plugins.rag-bridge.base_url'] !== overrides['plugins.rag-bridge.base_url']) {
368
+ throw new Error('isolated runtime settings did not preserve the rag-bridge outbound-disable host guard setting')
369
+ }
370
+ const ragBridgeKvDir = join(HOME, 'data', 'plugins', 'rag-bridge')
371
+ mkdirSync(ragBridgeKvDir, { recursive: true })
372
+ const ragBridgeKvPath = join(ragBridgeKvDir, 'kv.json')
373
+ writeFileSync(ragBridgeKvPath, `${JSON.stringify({ 'kb.base_url': RAG_BRIDGE_DISABLED_BASE_URL }, null, 2)}\n`, 'utf8')
374
+ const savedRagBridgeKv = JSON.parse(readFileSync(ragBridgeKvPath, 'utf8'))
375
+ if (savedRagBridgeKv?.['kb.base_url'] !== RAG_BRIDGE_DISABLED_BASE_URL) {
376
+ throw new Error('isolated rag-bridge KV fallback did not preserve the outbound-disable host guard setting')
377
+ }
378
+ const projectPromptsRoot = join(REPO, '.AgentWorkShop', 'prompts')
379
+ if (!existsSync(projectPromptsRoot)) throw new Error('project prompt source directory is missing')
380
+ cpSync(projectPromptsRoot, ISOLATED_PROMPTS_DIR, { recursive: true })
381
+ projectPromptTreeAtPrepare = hashDirectoryTree(projectPromptsRoot)
382
+ promptTreeAtPrepare = hashDirectoryTree(ISOLATED_PROMPTS_DIR)
383
+ if (projectPromptTreeAtPrepare.sha256 !== promptTreeAtPrepare.sha256) {
384
+ throw new Error('isolated prompt copy differs from the repository prompt source')
385
+ }
386
+ writeFileSync(EMPTY_DOTENV, '', 'utf8')
387
+ const builtinPlugins = pluginNamesUnder(join(REPO, 'server', 'plugins-builtin'))
388
+ const projectPluginsRoot = join(REPO, '.AgentWorkShop', 'plugins')
389
+ const projectPlugins = pluginNamesUnder(projectPluginsRoot)
390
+ const userPlugins = pluginNamesUnder(join(HOME, 'plugins'))
391
+ expectedPluginNames = [...new Set([...builtinPlugins, ...projectPlugins, ...userPlugins])].sort()
392
+ isolatedPluginNames = expectedPluginNames.filter(name => !allowedEnabledPluginNames.includes(name))
393
+ projectPluginTreeAtPrepare = hashDirectoryTree(projectPluginsRoot)
394
+ const pluginStatePath = join(HOME, 'plugins-state.json')
395
+ writeFileSync(pluginStatePath, `${JSON.stringify({ version: 1, updatedAt: new Date().toISOString(), disabled: isolatedPluginNames }, null, 2)}\n`, 'utf8')
396
+ const savedPluginState = JSON.parse(readFileSync(pluginStatePath, 'utf8'))
397
+ if (JSON.stringify([...savedPluginState.disabled].sort()) !== JSON.stringify(isolatedPluginNames)) {
398
+ throw new Error('isolated plugin state did not disable every discovered plugin')
399
+ }
400
+ noteIsolation('isolated-runtime-config', true, {
401
+ configRoot: 'fresh isolated AW_HOME',
402
+ startInfrastructure: overrides['daq.startInfrastructure'],
403
+ simulatorMqttBroker: `127.0.0.1:${MQTT_PORT}`,
404
+ appMqttQueueProbe: `127.0.0.1:${OFFLINE_APP_MQTT_QUEUE_PORT}`,
405
+ offlineTimescaleProbe: `127.0.0.1:${OFFLINE_TSDB_PORT}`,
406
+ offlineObjectstoreProbe: `127.0.0.1:${OFFLINE_OBJECTSTORE_PORT}`,
407
+ ragBridgeOutboundGuardSetting: 'plugins.rag-bridge.base_url',
408
+ ragBridgeOutboundGuardConfigPresent: true,
409
+ ragBridgeOutboundGuardKvFallbackPresent: true,
410
+ emptyDotenv: true,
411
+ repoDotenvBypassed: true,
412
+ })
413
+ noteIsolation('pre-existing-plugin-scopes-disabled', true, {
414
+ builtinNames: builtinPlugins,
415
+ projectNames: projectPlugins,
416
+ userNames: userPlugins,
417
+ disabledStatePath: 'AW_HOME/plugins-state.json',
418
+ projectPluginTreeSha256: projectPluginTreeAtPrepare.sha256,
419
+ enabledPluginAllowlist: allowedEnabledPluginNames,
420
+ })
421
+ noteIsolation('project-prompt-assets-isolated', true, {
422
+ sourceDirectory: 'repository/.AgentWorkShop/prompts',
423
+ isolatedDirectory: 'AW_HOME/prompts',
424
+ sourceTreeSha256: projectPromptTreeAtPrepare.sha256,
425
+ runtimeTreeSha256: promptTreeAtPrepare.sha256,
426
+ awPromptsDir: 'AW_HOME/prompts',
427
+ })
428
+ }
429
+
430
+ async function assertPluginIsolation() {
431
+ const expectedNames = expectedPluginNames
432
+ let plugins = []
433
+ for (let attempt = 0; attempt < 40; attempt++) {
434
+ const result = requireSuccess(await app('GET', '/api/workshop/plugins'), 'isolated plugin manifest')
435
+ plugins = Array.isArray(result.plugins) ? result.plugins : []
436
+ const actualNames = plugins.map(plugin => plugin.name).sort()
437
+ if (JSON.stringify(actualNames) === JSON.stringify(expectedNames)) {
438
+ const enabledNames = plugins.filter(plugin => plugin.enabled === true).map(plugin => plugin.name).sort()
439
+ const enabledMatchesAllowlist = JSON.stringify(enabledNames) === JSON.stringify([...allowedEnabledPluginNames].sort())
440
+ const statesMatchPolicy = plugins.every(plugin => allowedEnabledPluginNames.includes(plugin.name)
441
+ ? plugin.enabled === true
442
+ : plugin.enabled === false)
443
+ check('only-outbound-disabled-rag-bridge-enabled', enabledMatchesAllowlist && statesMatchPolicy, {
444
+ names: actualNames,
445
+ enabledNames,
446
+ disabledNames: plugins.filter(plugin => plugin.enabled === false).map(plugin => plugin.name).sort(),
447
+ invalidStateNames: plugins.filter(plugin => typeof plugin.enabled !== 'boolean').map(plugin => plugin.name),
448
+ })
449
+ return
450
+ }
451
+ await delay(250)
452
+ }
453
+ throw new Error(`isolated plugin manifest differed from the expected built-in/user set: ${plugins.map(plugin => plugin.name).sort().join(', ')}`)
454
+ }
455
+
456
+ function spawnLogged(command, args, { cwd = REPO, env = cleanChildEnv(), logFd, label }) {
457
+ const child = spawn(command, args, {
458
+ cwd,
459
+ env,
460
+ stdio: ['ignore', logFd, logFd],
461
+ windowsHide: true,
462
+ detached: process.platform !== 'win32',
463
+ })
464
+ child.label = label
465
+ children.add(child)
466
+ child.once('exit', () => children.delete(child))
467
+ child.once('error', () => children.delete(child))
468
+ return child
469
+ }
470
+
471
+ async function waitForExit(child, timeoutMs = 8_000) {
472
+ if (!child || child.exitCode !== null || child.signalCode !== null) return
473
+ await Promise.race([
474
+ new Promise(resolvePromise => child.once('exit', resolvePromise)),
475
+ delay(timeoutMs),
476
+ ])
477
+ }
478
+
479
+ function processGroupExists(pid) {
480
+ try {
481
+ process.kill(-pid, 0)
482
+ return true
483
+ }
484
+ catch (error) {
485
+ if (error?.code === 'ESRCH') return false
486
+ if (error?.code === 'EPERM') return true
487
+ throw error
488
+ }
489
+ }
490
+
491
+ function windowsProcessExists(pid) {
492
+ const result = spawnSync('tasklist.exe', ['/FI', `PID eq ${pid}`, '/FO', 'CSV', '/NH'], {
493
+ windowsHide: true,
494
+ encoding: 'utf8',
495
+ stdio: ['ignore', 'pipe', 'ignore'],
496
+ env: cleanChildEnv(),
497
+ })
498
+ if (result.error || result.status !== 0) return null
499
+ return (result.stdout ?? '').split(/\r?\n/).some((line) => {
500
+ const columns = line.match(/^"(?:[^"]|"")*","(\d+)"(?:,|$)/)
501
+ return columns?.[1] === String(pid)
502
+ })
503
+ }
504
+
505
+ async function stopProcessTree(child, label) {
506
+ if (!child?.pid) return false
507
+ const wasAlreadyExited = child.exitCode !== null || child.signalCode !== null
508
+ let terminationStatus = null
509
+ try {
510
+ if (process.platform === 'win32' && child.pid) {
511
+ const result = spawnSync('taskkill.exe', ['/PID', String(child.pid), '/T', '/F'], { windowsHide: true, stdio: 'ignore', env: cleanChildEnv() })
512
+ terminationStatus = result.error ? 'spawn-error' : result.status
513
+ }
514
+ else if (process.platform !== 'win32' && child.pid) {
515
+ process.kill(-child.pid, 'SIGTERM')
516
+ }
517
+ }
518
+ catch { /* a process may have already exited */ }
519
+ await waitForExit(child)
520
+ if (process.platform !== 'win32' && processGroupExists(child.pid)) {
521
+ try {
522
+ process.kill(-child.pid, 'SIGKILL')
523
+ terminationStatus = 'SIGKILL'
524
+ }
525
+ catch { /* already gone */ }
526
+ }
527
+ else if (process.platform === 'win32' && windowsProcessExists(child.pid) === true) {
528
+ const result = spawnSync('taskkill.exe', ['/PID', String(child.pid), '/T', '/F'], { windowsHide: true, stdio: 'ignore', env: cleanChildEnv() })
529
+ terminationStatus = result.error ? 'spawn-error' : result.status
530
+ }
531
+ await waitForExit(child, 2_000)
532
+ let treePresent
533
+ if (process.platform === 'win32') treePresent = windowsProcessExists(child.pid)
534
+ else {
535
+ const deadline = Date.now() + 3_000
536
+ do {
537
+ treePresent = processGroupExists(child.pid)
538
+ if (!treePresent) break
539
+ await delay(100)
540
+ } while (Date.now() < deadline)
541
+ }
542
+ const pass = !wasAlreadyExited && treePresent === false && (process.platform !== 'win32' || terminationStatus === 0)
543
+ evidence.checks.push({
544
+ id: `${label}-process-stopped`,
545
+ status: pass ? 'pass' : 'fail',
546
+ detail: { pid: child.pid, terminationStatus, processTreePresentAfterCleanup: treePresent, rootWasAlreadyExited: wasAlreadyExited },
547
+ })
548
+ return pass
549
+ }
550
+
551
+ function buildHarnessShim() {
552
+ if (process.platform === 'win32') {
553
+ const compiler = [
554
+ join(process.env.WINDIR || 'C:\\Windows', 'Microsoft.NET', 'Framework64', 'v4.0.30319', 'csc.exe'),
555
+ join(process.env.WINDIR || 'C:\\Windows', 'Microsoft.NET', 'Framework', 'v4.0.30319', 'csc.exe'),
556
+ ].find(existsSync)
557
+ if (!compiler) throw new Error('Windows C# compiler unavailable; cannot safely launch a registered fixture executable')
558
+ const source = join(ROOT, 'omp-fixture-shim.cs')
559
+ wrapperPath = join(ROOT, 'omp-fixture-shim.exe')
560
+ writeFileSync(source, String.raw`using System;
561
+ using System.Diagnostics;
562
+ using System.IO;
563
+ using System.Linq;
564
+ using System.Text;
565
+ using System.Threading;
566
+ class OmpFixtureShim {
567
+ static string Quote(string value) {
568
+ var result = new StringBuilder("\"");
569
+ int backslashes = 0;
570
+ foreach (char c in value) {
571
+ if (c == '\\') { backslashes++; continue; }
572
+ if (c == '"') {
573
+ result.Append('\\', backslashes * 2 + 1);
574
+ result.Append('"');
575
+ }
576
+ else {
577
+ result.Append('\\', backslashes);
578
+ result.Append(c);
579
+ }
580
+ backslashes = 0;
581
+ }
582
+ result.Append('\\', backslashes * 2);
583
+ result.Append('"');
584
+ return result.ToString();
585
+ }
586
+ static void Copy(Stream source, Stream destination) {
587
+ byte[] buffer = new byte[4096];
588
+ int count;
589
+ while ((count = source.Read(buffer, 0, buffer.Length)) > 0) {
590
+ destination.Write(buffer, 0, count);
591
+ destination.Flush();
592
+ }
593
+ }
594
+ static int Main(string[] args) {
595
+ string node = Environment.GetEnvironmentVariable("AW_PAPER_FIXTURE_NODE");
596
+ string script = Environment.GetEnvironmentVariable("AW_PAPER_FIXTURE_SCRIPT");
597
+ if (String.IsNullOrWhiteSpace(node) || String.IsNullOrWhiteSpace(script)) return 125;
598
+ var psi = new ProcessStartInfo(node);
599
+ psi.UseShellExecute = false;
600
+ psi.CreateNoWindow = true;
601
+ psi.RedirectStandardInput = true;
602
+ psi.RedirectStandardOutput = true;
603
+ psi.RedirectStandardError = true;
604
+ psi.Arguments = Quote(script) + " " + String.Join(" ", args.Skip(2).Select(Quote));
605
+ using (var child = Process.Start(psi)) {
606
+ if (child == null) return 126;
607
+ var stdin = new Thread(() => {
608
+ try {
609
+ Copy(Console.OpenStandardInput(), child.StandardInput.BaseStream);
610
+ }
611
+ finally {
612
+ child.StandardInput.Close();
613
+ }
614
+ });
615
+ var stdout = new Thread(() => Copy(child.StandardOutput.BaseStream, Console.OpenStandardOutput()));
616
+ var stderr = new Thread(() => Copy(child.StandardError.BaseStream, Console.OpenStandardError()));
617
+ stdin.IsBackground = true;
618
+ stdout.IsBackground = true;
619
+ stderr.IsBackground = true;
620
+ stdin.Start();
621
+ stdout.Start();
622
+ stderr.Start();
623
+ child.WaitForExit();
624
+ stdout.Join();
625
+ stderr.Join();
626
+ return child.ExitCode;
627
+ }
628
+ }
629
+ }`.replace(/\n/g, '\n'), 'utf8')
630
+ const result = spawnSync(compiler, ['/nologo', '/target:exe', `/out:${wrapperPath}`, source], { cwd: ROOT, windowsHide: true, encoding: 'utf8', timeout: 30_000, env: cleanChildEnv() })
631
+ if (result.error || result.status !== 0 || !existsSync(wrapperPath)) {
632
+ throw new Error(`could not compile isolated OMP fixture shim: ${safeText(result.stderr || result.stdout || result.error?.message || result.status)}`)
633
+ }
634
+ return wrapperPath
635
+ }
636
+ if (process.platform === 'linux' || process.platform === 'darwin') {
637
+ wrapperPath = join(ROOT, 'omp-fixture-shim')
638
+ writeFileSync(wrapperPath, '#!/bin/sh\nshift 2\nexec "$AW_PAPER_FIXTURE_NODE" "$AW_PAPER_FIXTURE_SCRIPT" "$@"\n', 'utf8')
639
+ chmodSync(wrapperPath, 0o755)
640
+ return wrapperPath
641
+ }
642
+ throw new Error(`unsupported fixture shim platform ${process.platform}`)
643
+ }
644
+
645
+ function extractPayload(body) {
646
+ return body && typeof body === 'object' && Object.prototype.hasOwnProperty.call(body, 'data') ? body.data : body
647
+ }
648
+
649
+ async function request(base, expectedPort, method, path, body, { token, timeoutMs = 10_000 } = {}) {
650
+ assertLoopbackUrl(base, expectedPort)
651
+ if (!path.startsWith('/api/')) throw new Error('API path boundary rejected')
652
+ const response = await fetch(`${base}${path}`, {
653
+ method,
654
+ headers: {
655
+ ...(body === undefined ? {} : { 'content-type': 'application/json' }),
656
+ ...(token ? { authorization: `Bearer ${token}` } : {}),
657
+ },
658
+ ...(body === undefined ? {} : { body: JSON.stringify(body) }),
659
+ signal: AbortSignal.timeout(timeoutMs),
660
+ })
661
+ const parsed = await response.json().catch(() => null)
662
+ return { status: response.status, body: parsed, data: extractPayload(parsed) }
663
+ }
664
+
665
+ const app = (method, path, body, opts = {}) => request(APP_BASE, AW_PORT, method, path, body, { token: opts.token ?? authToken, timeoutMs: opts.timeoutMs })
666
+ const sim = (method, path, body) => request(SIM_BASE, SIM_PORT, method, path, body, { timeoutMs: 8_000 })
667
+
668
+ function requireSuccess(result, label, status = 200) {
669
+ if (result.status !== status) {
670
+ const payload = result.body && typeof result.body === 'object' ? result.body : {}
671
+ throw new Error(`${label} returned HTTP ${result.status}: ${safeText(payload.message || payload.statusMessage || payload.code || 'no response detail')}`)
672
+ }
673
+ return result.data
674
+ }
675
+
676
+ async function bootSimulator() {
677
+ mkdirSync(SIM_ROOT, { recursive: true })
678
+ cpSync(join(SIM_SOURCE, 'src'), join(SIM_ROOT, 'src'), { recursive: true })
679
+ cpSync(join(SIM_SOURCE, 'package.json'), join(SIM_ROOT, 'package.json'))
680
+ const simulatorEntry = join(SIM_ROOT, 'src', 'server', 'index.ts')
681
+ const originalSource = readFileSync(simulatorEntry, 'utf8')
682
+ const listenCall = 'server.listen(PORT, () => resolve())'
683
+ const brokerCall = 'await startBroker(Number(process.env.MQTT_BROKER_PORT ?? 18830))'
684
+ if (originalSource.split(listenCall).length !== 2) throw new Error('simulator copied source did not contain exactly one expected listener call')
685
+ if (originalSource.split(brokerCall).length !== 2) throw new Error('simulator copied source did not contain exactly one expected broker startup call')
686
+ const loopbackListenCall = `server.listen(PORT, '127.0.0.1', () => {
687
+ const boundAddress = server.address()
688
+ if (!boundAddress || typeof boundAddress === 'string' || boundAddress.address !== '127.0.0.1' || boundAddress.port !== PORT) {
689
+ console.error('[paper-isolation] simulator listener address verification failed')
690
+ server.close(() => process.exit(70))
691
+ return
692
+ }
693
+ console.log('[paper-isolation] listener=' + boundAddress.address + ':' + boundAddress.port)
694
+ resolve()
695
+ })`
696
+ const loopbackSource = originalSource
697
+ .replace(listenCall, loopbackListenCall)
698
+ .replace(brokerCall, `await startBroker(Number(process.env.MQTT_BROKER_PORT ?? 18830), '127.0.0.1')`)
699
+ writeFileSync(simulatorEntry, loopbackSource, 'utf8')
700
+ const modules = join(SIM_SOURCE, 'node_modules')
701
+ symlinkSync(modules, join(SIM_ROOT, 'node_modules'), process.platform === 'win32' ? 'junction' : 'dir')
702
+ simProcess = spawnLogged(process.execPath, [join(REPO, 'node_modules', 'tsx', 'dist', 'cli.mjs'), join(SIM_ROOT, 'src', 'server', 'index.ts')], {
703
+ cwd: SIM_ROOT,
704
+ logFd: SIM_LOG_FD,
705
+ label: 'simulator',
706
+ env: cleanChildEnv({ SIM_PORT: String(SIM_PORT), MQTT_BROKER_PORT: String(MQTT_PORT) }),
707
+ })
708
+ for (let i = 0; i < 50; i++) {
709
+ if (simProcess.exitCode !== null) throw new Error(`simulator exited during startup (code ${simProcess.exitCode})`)
710
+ try {
711
+ const result = await sim('GET', '/api/nodes')
712
+ if (result.status === 200) {
713
+ const data = result.data
714
+ const expectedListener = `[paper-isolation] listener=127.0.0.1:${SIM_PORT}`
715
+ const simulatorLog = readFileSync(SIM_LOG, 'utf8')
716
+ const expectedBroker = `[mqtt-broker] 内置 broker 就绪 mqtt://127.0.0.1:${MQTT_PORT}`
717
+ if (!simulatorLog.includes(expectedListener)) throw new Error('simulator did not report the verified 127.0.0.1 HTTP listener address')
718
+ if (!simulatorLog.includes(expectedBroker) || simulatorLog.includes('内置 broker 启动失败')) {
719
+ throw new Error('simulator did not confirm its embedded loopback MQTT broker before application startup')
720
+ }
721
+ noteIsolation('simulator-listener-address-verified', true, { address: '127.0.0.1', port: SIM_PORT, copiedSourceOnly: true })
722
+ noteIsolation('simulator-mqtt-broker-loopback-ready', true, { address: '127.0.0.1', port: MQTT_PORT, brokerStartupConfirmed: true })
723
+ noteIsolation('simulator-local-http-ready', true, { version: 'local repository source', port: SIM_PORT, host: '127.0.0.1' })
724
+ return data
725
+ }
726
+ }
727
+ catch { /* the local simulator is still starting */ }
728
+ await delay(400)
729
+ }
730
+ throw new Error('isolated simulator startup timed out')
731
+ }
732
+
733
+ function normalizeLocalNetworkConfig(value, portMap, key = '') {
734
+ if (Array.isArray(value)) return value.map(item => normalizeLocalNetworkConfig(item, portMap, key))
735
+ if (!value || typeof value !== 'object') {
736
+ if (typeof value !== 'string') return value
737
+ if (/^[a-z][a-z\d+.-]*:\/\//i.test(value)) {
738
+ const parsed = new URL(value)
739
+ if (!['127.0.0.1', 'localhost', '::1'].includes(parsed.hostname)) throw new Error('simulator preset contains a non-loopback endpoint')
740
+ if (parsed.port && portMap.has(Number(parsed.port))) parsed.port = String(portMap.get(Number(parsed.port)))
741
+ parsed.hostname = '127.0.0.1'
742
+ return parsed.toString()
743
+ }
744
+ if (/(?:host|hostname|ip|address)$/i.test(key)) return '127.0.0.1'
745
+ return value
746
+ }
747
+ const out = {}
748
+ for (const [childKey, childValue] of Object.entries(value)) {
749
+ if (/^port$/i.test(childKey) && typeof childValue === 'number' && portMap.has(childValue)) {
750
+ out[childKey] = portMap.get(childValue)
751
+ }
752
+ else if (/(?:host|hostname|ip|address)$/i.test(childKey) && typeof childValue === 'string') {
753
+ out[childKey] = '127.0.0.1'
754
+ }
755
+ else {
756
+ out[childKey] = normalizeLocalNetworkConfig(childValue, portMap, childKey)
757
+ }
758
+ }
759
+ return out
760
+ }
761
+
762
+ async function simulatorScene(scene) {
763
+ const presetResponse = await sim('GET', `/api/presets/${encodeURIComponent(scene.preset)}`)
764
+ const blueprint = requireSuccess(presetResponse, `${scene.id} simulator preset`)
765
+ if (!blueprint?.plantModel || !Array.isArray(blueprint.nodes)) throw new Error(`${scene.id} simulator preset shape is invalid`)
766
+
767
+ const portMapByDeviceId = new Map()
768
+ const toCreate = []
769
+ let nextPort = 44_000 + evidence.experiment.scenes.length * 100
770
+ for (const raw of blueprint.nodes) {
771
+ const node = structuredClone(raw)
772
+ if ((node.protocol && /serial|rtu/i.test(String(node.protocol))) || /serialPort|comPort|devicePath/i.test(JSON.stringify(node.config ?? {}))) continue
773
+ node.config ||= {}
774
+ const oldPort = Number(node.config.port)
775
+ const portMap = new Map()
776
+ if (Number.isInteger(oldPort) && oldPort > 0) {
777
+ while (allocatedDevicePorts.includes(nextPort) || nextPort === FORBIDDEN_PORT) nextPort += 1
778
+ await assertFreeLoopback(nextPort, `${scene.id}-simulator-device`)
779
+ portMap.set(oldPort, nextPort)
780
+ allocatedDevicePorts.push(nextPort)
781
+ noteIsolation(`${scene.id}-device-port-free-loopback`, true, { port: nextPort, host: '127.0.0.1', protocol: node.protocol ?? 'unspecified' })
782
+ node.config.port = nextPort
783
+ nextPort += 1
784
+ }
785
+ node.config = normalizeLocalNetworkConfig(node.config, portMap)
786
+ if (node.protocol === 'mqtt' || /mqtt/i.test(String(node.protocol))) node.config.brokerUrl = `mqtt://127.0.0.1:${MQTT_PORT}`
787
+ portMapByDeviceId.set(node.id, portMap)
788
+ toCreate.push(node)
789
+ }
790
+ if (toCreate.length === 0) throw new Error(`${scene.id} simulator preset has no loopback-safe device nodes`)
791
+
792
+ for (const node of toCreate) {
793
+ const created = await sim('POST', '/api/nodes', node)
794
+ requireSuccess(created, `${scene.id} simulator device ${safeText(node.id, 80)}`)
795
+ }
796
+ const plant = { ...blueprint.plantModel, id: `${TAG}-${scene.id}`, seed: 42, timeScale: 1, truthExport: false }
797
+ const loaded = await sim('PUT', '/api/plant/config', { plantModel: plant, warm: true, upsert: true })
798
+ requireSuccess(loaded, `${scene.id} simulator plant model`)
799
+
800
+ const exports = []
801
+ for (const node of toCreate) {
802
+ const result = await sim('GET', `/api/nodes/${encodeURIComponent(node.id)}/export`)
803
+ const data = requireSuccess(result, `${scene.id} simulator export ${safeText(node.id, 80)}`)
804
+ for (const item of data?.items ?? []) exports.push({ ...item, deviceId: node.id })
805
+ }
806
+ for (const item of exports) {
807
+ item.driverConfig = normalizeLocalNetworkConfig(item.driverConfig ?? {}, portMapByDeviceId.get(item.deviceId) ?? new Map())
808
+ for (const [key, value] of Object.entries(item.driverConfig)) {
809
+ if (/^(?:host|hostname|ip|address)$/i.test(key) && !['127.0.0.1', 'localhost', '::1'].includes(String(value))) {
810
+ throw new Error(`${scene.id} exported driver config escaped loopback boundary`)
811
+ }
812
+ }
813
+ }
814
+ const mv = exports.find(item => item.deviceId === scene.sourceDevice && item.signal === scene.mvSignal)
815
+ const cv = exports.find(item => item.signal === scene.cvSignal)
816
+ if (!mv || !cv) throw new Error(`${scene.id} simulator export lacks required MV/CV signals`)
817
+ if (!['opcua', 'modbus-tcp'].includes(String(mv.driver))) throw new Error(`${scene.id} MV driver is outside the approved simulator protocol set`)
818
+ const evidenceSignal = signal => Object.fromEntries(Object.entries(signal).filter(([key]) => key !== 'curl'))
819
+ return {
820
+ mv: evidenceSignal(mv),
821
+ cv: evidenceSignal(cv),
822
+ plant: { id: plant.id, kind: plant.kind ?? 'simulator', seed: 42, timeScale: 1 },
823
+ deviceCount: toCreate.length,
824
+ }
825
+ }
826
+
827
+ async function registerAdmin() {
828
+ const response = await app('POST', '/api/users/register', {
829
+ name: `Paper Test ${TAG}`,
830
+ email: `${TAG}@example.invalid`,
831
+ password: `Paper-${Date.now()}-safe9`,
832
+ }, { token: undefined })
833
+ const data = requireSuccess(response, 'isolated synthetic administrator registration')
834
+ if (!data?.token || data?.user?.role !== 'admin') throw new Error('fresh-home registration did not return its first administrator token')
835
+ authToken = String(data.token)
836
+ syntheticAdminId = String(data.user.id)
837
+ return { id: syntheticAdminId, role: 'admin' }
838
+ }
839
+
840
+ async function verifyRagBridgeOutboundDisabled() {
841
+ const ragBridgeHealth = requireSuccess(await app('GET', '/api/plugins/rag-bridge/health'), 'rag-bridge outbound guard health check')
842
+ const deadline = Date.now() + 3_000
843
+ let startupLogConfirmed = false
844
+ while (Date.now() < deadline) {
845
+ startupLogConfirmed = /\[rag-bridge\].*出站调用已禁用:/.test(readFileSync(APP_LOG, 'utf8'))
846
+ if (startupLogConfirmed) break
847
+ await delay(100)
848
+ }
849
+ noteIsolation('rag-bridge-outbound-disabled', ragBridgeHealth?.outbound === false && startupLogConfirmed, {
850
+ setting: 'plugins.rag-bridge.base_url',
851
+ pluginHealthOutbound: ragBridgeHealth?.outbound ?? null,
852
+ startupLogConfirmed,
853
+ })
854
+ }
855
+
856
+ function realOmpSystemPrompt(scene, recipe, control, decisionStimulus) {
857
+ const choices = decisionStimulus.allowedValues.join(', ')
858
+ return [
859
+ 'You are operating AgentWorkShop for one bounded task in a local process simulator.',
860
+ `Process scene: ${scene.processDescription}.`,
861
+ `Before task submission, the registered drivers measured the control at ${decisionStimulus.controlValue} ${control.unit} and the process variable at ${decisionStimulus.processValue} ${decisionStimulus.processUnit}.`,
862
+ `The task target band is ${decisionStimulus.targetMin} to ${decisionStimulus.targetMax} ${decisionStimulus.processUnit}.`,
863
+ `For this single trial, the only prevalidated candidate values are ${choices} ${control.unit}; the current control value is ${decisionStimulus.controlValue} ${control.unit}, and each candidate respects the configured engineering range and step bound.`,
864
+ 'Choose one candidate from that set using the measured target error and make one conservative, bounded recipe trial if a change is warranted. The candidate choice is yours; do not claim that it will improve or settle the process.',
865
+ `Use exactly one host-tool call named recipe_trial, with recipe_id "${recipe.id}", one params entry for node_id "${control.id}", and your selected candidate value. Put only a concise selection rationale in hypothesis.`,
866
+ 'Do not call any other tool. Do not retry. Do not create, update, apply, or roll back a recipe. If you cannot justify a permitted candidate, stop without a tool call.',
867
+ 'After the tool result, give a brief factual report and make no further tool calls.',
868
+ ].join('\n')
869
+ }
870
+
871
+ async function setupScene(scene, simDetails) {
872
+ currentScene = scene.id
873
+ currentStage = `${scene.id}:application-setup`
874
+ const sceneEvidence = {
875
+ id: scene.id,
876
+ simulatorPreset: scene.preset,
877
+ simulator: simDetails,
878
+ status: 'running',
879
+ approvals: [],
880
+ runs: [],
881
+ }
882
+ evidence.experiment.scenes.push(sceneEvidence)
883
+
884
+ const line = requireSuccess(await app('POST', '/api/workshop/dcw/lines', {
885
+ name: `${TAG}-${scene.id}`,
886
+ description: 'Synthetic isolated paper integration run',
887
+ simulated: true,
888
+ simSceneId: scene.preset,
889
+ controlMode: 'manual',
890
+ }), `${scene.id} line creation`).line
891
+ const product = requireSuccess(await app('POST', '/api/workshop/dcw/products', {
892
+ name: `${TAG}-${scene.id}-product`, lineId: line.id,
893
+ }), `${scene.id} product creation`).product
894
+ const template = requireSuccess(await app('POST', '/api/workshop/dcw/templates', {
895
+ name: `${TAG}-${scene.id}-control-template`,
896
+ unit: simDetails.mv.unit,
897
+ min: simDetails.mv.min,
898
+ max: simDetails.mv.max,
899
+ decimals: simDetails.mv.decimals ?? 0,
900
+ }), `${scene.id} control template creation`).template
901
+ const control = requireSuccess(await app('POST', '/api/workshop/dcw', {
902
+ templateRef: template.key,
903
+ name: `${TAG}-${scene.id}-control`,
904
+ driver: simDetails.mv.driver,
905
+ driverConfig: simDetails.mv.driverConfig,
906
+ lineId: line.id,
907
+ min: simDetails.mv.min,
908
+ max: simDetails.mv.max,
909
+ unit: simDetails.mv.unit,
910
+ decimals: simDetails.mv.decimals ?? 0,
911
+ stepLimit: 30,
912
+ writeLockSeconds: 0,
913
+ holdIntervalMs: 0,
914
+ readIntervalMs: 500,
915
+ semantics: `Bounded simulated ${scene.mvSignal} setpoint for integration evidence`,
916
+ }), `${scene.id} control node creation`).node
917
+ const daq = requireSuccess(await app('POST', '/api/workshop/daq', {
918
+ templateRef: 'daq-temp-tc',
919
+ name: `${TAG}-${scene.id}-daq-cv`,
920
+ driver: simDetails.cv.driver,
921
+ driverConfig: simDetails.cv.driverConfig,
922
+ lineId: line.id,
923
+ min: simDetails.cv.min,
924
+ max: simDetails.cv.max,
925
+ unit: simDetails.cv.unit,
926
+ intervalMs: 1000,
927
+ publishIntervalMs: 0,
928
+ semantics: `Bounded simulated ${scene.cvSignal} controlled variable for run-tagged sampling`,
929
+ }), `${scene.id} DAQ node creation`).node
930
+ const recipe = requireSuccess(await app('POST', '/api/workshop/dcw/recipes', {
931
+ name: `${TAG}-${scene.id}-recipe`,
932
+ productId: product.id,
933
+ params: [{ nodeId: control.id, templateRef: template.key, value: scene.baseline, min: simDetails.mv.min, max: simDetails.mv.max, stepLimit: 30 }],
934
+ daqWindows: [{ nodeId: daq.id, min: simDetails.cv.min, max: simDetails.cv.max }],
935
+ }), `${scene.id} recipe creation`).recipe
936
+
937
+ const start = requireSuccess(await app('POST', `/api/workshop/dcw/lines/${encodeURIComponent(line.id)}/start`, { recipeId: recipe.id }), `${scene.id} line start`)
938
+ const runId = String(start.run?.id ?? '')
939
+ if (!runId) throw new Error(`${scene.id} line start returned no run identifier`)
940
+ sceneEvidence.activeRun = { id: runId, status: start.run?.status ?? null, startedAt: start.run?.startedAt ?? null, recipeId: start.run?.recipeId ?? recipe.id }
941
+
942
+ let decisionStimulus
943
+ if (HARNESS_MODE === 'real-omp') {
944
+ let controlRead
945
+ let controlReadAttempts = 0
946
+ do {
947
+ controlRead = await app('POST', `/api/workshop/dcw/${encodeURIComponent(control.id)}/read`)
948
+ controlReadAttempts += 1
949
+ if (controlRead.status === 409 && controlReadAttempts < 3) await delay(500)
950
+ } while (controlRead.status === 409 && controlReadAttempts < 3)
951
+ const controlReadData = requireSuccess(controlRead, `${scene.id} pre-task control read`)
952
+ const controlData = controlReadData?.outcome ?? controlReadData?.read ?? controlReadData
953
+ const controlValue = Number(controlData?.value ?? controlData?.data?.value)
954
+ let processProbeResponse
955
+ let processProbeAttempts = 0
956
+ do {
957
+ processProbeResponse = await app('POST', `/api/workshop/daq/${encodeURIComponent(daq.id)}/test`)
958
+ processProbeAttempts += 1
959
+ if (processProbeResponse.status === 409 && processProbeAttempts < 3) await delay(500)
960
+ } while (processProbeResponse.status === 409 && processProbeAttempts < 3)
961
+ const processProbe = requireSuccess(processProbeResponse, `${scene.id} pre-task process probe`).test
962
+ const processValue = Number(processProbe?.sampleValue)
963
+ if (!Number.isFinite(controlValue) || processProbe?.ok !== true || !Number.isFinite(processValue)) {
964
+ throw new Error(`${scene.id} pre-task protocol reads did not provide finite control and process values`)
965
+ }
966
+ decisionStimulus = {
967
+ controlValue,
968
+ processValue,
969
+ processUnit: simDetails.cv.unit,
970
+ targetMin: scene.targetMin,
971
+ targetMax: scene.targetMax,
972
+ allowedValues: [...scene.candidates],
973
+ probeDriver: simDetails.cv.driver,
974
+ probeLatencyMs: Number.isFinite(Number(processProbe.latencyMs)) ? Number(processProbe.latencyMs) : null,
975
+ controlReadAttempts,
976
+ processProbeAttempts,
977
+ measuredAt: new Date().toISOString(),
978
+ }
979
+ sceneEvidence.decisionStimulus = decisionStimulus
980
+ sceneEvidence.simulator.candidateChoices = [...scene.candidates]
981
+ }
982
+
983
+ const channel = requireSuccess(await app('POST', '/api/workshop/channels', {
984
+ name: `${TAG}-${scene.id}-harness-channel`,
985
+ description: HARNESS_MODE === 'real-omp' ? 'Bounded real OMP simulator integration trial channel' : 'One-turn deterministic OMP transport fixture channel',
986
+ }), `${scene.id} channel creation`)
987
+ const agentConfig = HARNESS_MODE === 'real-omp'
988
+ ? {
989
+ command: 'omp',
990
+ cwd: HOME,
991
+ args: ['--no-extensions', '--no-skills', '--no-rules', '--no-lsp', '--no-pty', '--no-tools'],
992
+ provider: REAL_OMP_PROVIDER,
993
+ model: REAL_OMP_MODEL,
994
+ rpcMode: 'rpc',
995
+ promptTimeoutMs: REAL_OMP_PROMPT_TIMEOUT_MS,
996
+ systemPromptPrefix: realOmpSystemPrompt(scene, recipe, control, decisionStimulus),
997
+ }
998
+ : {
999
+ command: wrapperPath,
1000
+ args: [
1001
+ '--scene', scene.id,
1002
+ '--recipe-id', recipe.id,
1003
+ '--node-id', control.id,
1004
+ '--value', String(scene.candidate),
1005
+ '--trace-root', ROOT,
1006
+ '--trace-path', fixtureTracePath(scene.id),
1007
+ ],
1008
+ rpcMode: 'rpc',
1009
+ }
1010
+ const agent = requireSuccess(await app('POST', `/api/workshop/channels/${encodeURIComponent(channel.channelId)}/agents`, {
1011
+ name: `${TAG}-${scene.id}-${HARNESS_MODE === 'real-omp' ? 'omp-real' : 'omp-fixture'}`,
1012
+ harness: 'omp',
1013
+ role: 'lead',
1014
+ config: agentConfig,
1015
+ }), `${scene.id} registered OMP lead creation`)
1016
+
1017
+ const recipeBinding = requireSuccess(await app('POST', '/api/workshop/agent-tools/bindings', {
1018
+ agentId: agent.id, nodeId: recipe.id, kind: 'recipe',
1019
+ }), `${scene.id} recipe binding`).binding
1020
+ const daqBinding = requireSuccess(await app('POST', '/api/workshop/agent-tools/bindings', {
1021
+ agentId: agent.id, nodeId: daq.id, kind: 'daq', mode: 'auto',
1022
+ }), `${scene.id} DAQ binding`).binding
1023
+ check(`${scene.id}-registered-omp`, agent.harness === 'omp' && Boolean(agent.id), { harness: agent.harness, agentId: agent.id })
1024
+ check(`${scene.id}-manual-recipe-binding`, recipeBinding.kind === 'recipe' && recipeBinding.mode === 'manual', { kind: recipeBinding.kind, mode: recipeBinding.mode })
1025
+ check(`${scene.id}-daq-observation-binding`, daqBinding.kind === 'daq', { kind: daqBinding.kind })
1026
+
1027
+ sceneEvidence.entities = { lineId: line.id, productId: product.id, recipeId: recipe.id, controlNodeId: control.id, daqNodeId: daq.id, channelId: channel.channelId, agentId: agent.id }
1028
+ sceneEvidence.bindings = { recipe: { kind: recipeBinding.kind, mode: recipeBinding.mode }, daq: { kind: daqBinding.kind, mode: daqBinding.mode } }
1029
+ sceneEvidence.routePolicy = { tool: 'recipe_trial', emergency: false, cadenceBypass: false, recipeBindingMode: recipeBinding.mode }
1030
+ sceneEvidence.status = 'setup-complete'
1031
+ return { line, product, template, control, daq, recipe, channel, agent, runId, evidence: sceneEvidence }
1032
+ }
1033
+
1034
+ async function submitFixtureTask(context) {
1035
+ currentStage = `${context.evidence.id}:submit-lead-task`
1036
+ const sent = requireSuccess(await app('POST', `/api/workshop/channels/${encodeURIComponent(context.channel.channelId)}/tasks`, {
1037
+ title: `Isolated ${context.evidence.id} recipe_trial verification`,
1038
+ description: `Execute the preconfigured isolated ${context.evidence.id} recipe_trial candidate once and return the tool outcome.`,
1039
+ fromLabel: 'Synthetic isolated test driver',
1040
+ }), `${context.evidence.id} lead task submission`)
1041
+ context.evidence.taskId = sent.id ?? sent.task?.id ?? null
1042
+ }
1043
+
1044
+ async function submitRealOmpTask(context) {
1045
+ currentStage = `${context.evidence.id}:submit-real-omp-task`
1046
+ const sent = requireSuccess(await app('POST', `/api/workshop/channels/${encodeURIComponent(context.channel.channelId)}/tasks`, {
1047
+ title: `R20 ${context.evidence.id} recipe_trial with explicit task closure`,
1048
+ description: [
1049
+ 'Use the measured process context in your registered system prompt to choose one candidate from its prevalidated set.',
1050
+ `Call recipe_trial exactly once with recipe_id ${context.recipe.id} and one params entry for node_id ${context.control.id} using your selected value.`,
1051
+ 'After receiving the recipe_trial result, call complete_task exactly once on the active root task shown in the supervision context. Include the selected value and returned command-verification outcome in a concise summary and deliverable.',
1052
+ 'Do not make any other tool calls. Do not retry, save, update, apply, or roll back a recipe. If no candidate is justified, abstain and explicitly close the task with that limitation.',
1053
+ ].join(' '),
1054
+ fromLabel: 'Synthetic isolated R20 test driver',
1055
+ }), `${context.evidence.id} real OMP lead task submission`)
1056
+ context.evidence.taskId = sent.id ?? sent.task?.id ?? null
1057
+ if (!context.evidence.taskId) throw new Error(`${context.evidence.id} real OMP task submission returned no task identifier`)
1058
+ }
1059
+
1060
+ function taskToolEvents(task) {
1061
+ const events = []
1062
+ for (const message of task?.history ?? []) {
1063
+ for (const part of message?.parts ?? []) {
1064
+ const text = typeof part?.text === 'string' ? part.text : ''
1065
+ const match = text.match(/^🔧\s+([a-z][a-z\d_]*)/i)
1066
+ if (!match) continue
1067
+ events.push({
1068
+ toolName: match[1],
1069
+ phase: /(?:✅\s*完成|❌\s*失败)/.test(text) ? 'result' : 'call',
1070
+ isError: /❌\s*失败/.test(text),
1071
+ messageId: message.messageId ?? null,
1072
+ text,
1073
+ })
1074
+ }
1075
+ }
1076
+ return events
1077
+ }
1078
+
1079
+ async function readRealOmpTask(context) {
1080
+ const result = await app('GET', `/api/workshop/tasks/${encodeURIComponent(context.evidence.taskId)}?channelId=${encodeURIComponent(context.channel.channelId)}`)
1081
+ if (result.status !== 200) throw new Error(`${context.evidence.id} task detail returned HTTP ${result.status}`)
1082
+ return result.data
1083
+ }
1084
+
1085
+ async function waitForRealOmpTaskCompletion(context) {
1086
+ const deadline = Date.now() + REAL_OMP_TASK_COMPLETION_TIMEOUT_MS
1087
+ let latest
1088
+ while (Date.now() < deadline) {
1089
+ latest = await readRealOmpTask(context)
1090
+ if (latest.state === 'COMPLETED') return latest
1091
+ if (['FAILED', 'CANCELED'].includes(latest.state)) {
1092
+ throw new Error(`${context.evidence.id} task reached ${latest.state} before completing the approved operation`)
1093
+ }
1094
+ await delay(500)
1095
+ }
1096
+ throw new Error(`${context.evidence.id} task did not reach COMPLETED within the bounded post-approval window (state=${latest?.state ?? 'unknown'})`)
1097
+ }
1098
+
1099
+ function assertSingleRealOmpCall(context, task) {
1100
+ const events = taskToolEvents(task)
1101
+ const calls = events.filter(event => event.phase === 'call')
1102
+ const recipeCalls = calls.filter(event => event.toolName === 'recipe_trial')
1103
+ const recipeResults = events.filter(event => event.toolName === 'recipe_trial' && event.phase === 'result')
1104
+ const completionCalls = calls.filter(event => event.toolName === 'complete_task')
1105
+ // The active lead turn is journaled through both the task-event mapper and
1106
+ // the supervisor listener. A single host invocation can therefore appear
1107
+ // twice in history; identical start text identifies that mirror. Route
1108
+ // ledgers below remain authoritative for the number of executed trials.
1109
+ const uniqueRecipeCalls = [...new Set(recipeCalls.map(event => event.text))]
1110
+ if (events.some(event => !['recipe_trial', 'complete_task'].includes(event.toolName))
1111
+ || recipeCalls.length < 1 || recipeCalls.length > 2 || uniqueRecipeCalls.length !== 1
1112
+ || recipeResults.length < 1 || recipeResults.length > 2 || recipeResults.some(event => event.isError)
1113
+ || completionCalls.length !== 1) {
1114
+ throw new Error(`${context.evidence.id} OMP task history must show one recipe_trial invocation (allowing its mirrored journal entry), a successful result, and one explicit task-completion call`)
1115
+ }
1116
+ return { events, calls: [recipeCalls[0]], results: [recipeResults[0]], completionCalls }
1117
+ }
1118
+
1119
+ async function approveRealOmpTrial(context) {
1120
+ currentStage = `${context.evidence.id}:await-real-omp-hitl-approval`
1121
+ const deadline = Date.now() + REAL_OMP_APPROVAL_TIMEOUT_MS
1122
+ let pending
1123
+ let latestTask
1124
+ while (Date.now() < deadline) {
1125
+ latestTask = await readRealOmpTask(context)
1126
+ if (['FAILED', 'CANCELED', 'COMPLETED'].includes(latestTask.state)) {
1127
+ throw new Error(`${context.evidence.id} task reached ${latestTask.state} before synthetic approval`)
1128
+ }
1129
+ const result = await app('GET', `/api/workshop/agent-tools/approvals?agentId=${encodeURIComponent(context.agent.id)}&scope=pending`)
1130
+ if (result.status === 200) {
1131
+ const matches = (result.data?.approvals ?? []).filter(item => item.agentId === context.agent.id && item.nodeId === `recipe:${context.recipe.id}` && item.status === 'pending')
1132
+ if (matches.length > 1) throw new Error(`${context.evidence.id} has multiple pending real OMP trial approvals`)
1133
+ if (matches.length === 1) {
1134
+ const payload = matches[0].payload
1135
+ const params = Array.isArray(payload?.params) ? payload.params : []
1136
+ const proposedValue = Number(params[0]?.to)
1137
+ const decisionStimulus = context.evidence.decisionStimulus
1138
+ const allowedValues = decisionStimulus?.allowedValues ?? []
1139
+ const isExpectedTrial = payload?.kind === 'recipe-gate'
1140
+ && payload?.op === 'trial'
1141
+ && payload?.recipeId === context.recipe.id
1142
+ && payload?.emergency !== true
1143
+ && payload?.emergency !== 'true'
1144
+ && params.length === 1
1145
+ && params[0]?.nodeId === context.control.id
1146
+ && Number.isFinite(proposedValue)
1147
+ && allowedValues.includes(proposedValue)
1148
+ && proposedValue >= Number(context.evidence.simulator.mv.min)
1149
+ && proposedValue <= Number(context.evidence.simulator.mv.max)
1150
+ && Math.abs(proposedValue - Number(decisionStimulus.controlValue)) <= 30
1151
+ if (!isExpectedTrial) throw new Error(`${context.evidence.id} refused a pending approval outside the registered recipe_trial candidate set`)
1152
+ context.evidence.simulator.candidate = proposedValue
1153
+ context.evidence.modelDecision = {
1154
+ source: 'registered OMP host-tool proposal, checked against current protocol reads and prevalidated set',
1155
+ controlValue: decisionStimulus.controlValue,
1156
+ processValue: decisionStimulus.processValue,
1157
+ targetBand: [decisionStimulus.targetMin, decisionStimulus.targetMax],
1158
+ allowedValues,
1159
+ selectedValue: proposedValue,
1160
+ selectionRationale: safeText(payload?.hypothesis ?? payload?.rationale ?? '', 400),
1161
+ selectedValueWithinRangeAndStep: true,
1162
+ }
1163
+ pending = matches[0]
1164
+ break
1165
+ }
1166
+ }
1167
+ await delay(500)
1168
+ }
1169
+ if (!pending) throw new Error(`${context.evidence.id} real OMP recipe_trial approval did not appear within the bounded window`)
1170
+ context.evidence.approvals.push({ id: pending.id, statusBeforeDecision: pending.status, nodeId: pending.nodeId, title: pending.title ?? null, candidateValue: context.evidence.simulator.candidate, decision: 'approve' })
1171
+ requireSuccess(await app('POST', `/api/workshop/agent-tools/approvals/${encodeURIComponent(pending.id)}/decide`, {
1172
+ approved: true,
1173
+ comment: 'Approved for the bounded R20 local simulator integration check.',
1174
+ }), `${context.evidence.id} synthetic real OMP HITL approval`)
1175
+ const history = await app('GET', `/api/workshop/agent-tools/approvals?agentId=${encodeURIComponent(context.agent.id)}&scope=history`)
1176
+ const finalApproval = (history.data?.approvals ?? []).find(item => item.id === pending.id)
1177
+ if (history.status !== 200 || finalApproval?.status !== 'approved' || finalApproval?.decidedBy !== syntheticAdminId) {
1178
+ throw new Error(`${context.evidence.id} real OMP HITL history did not confirm the synthetic administrator decision`)
1179
+ }
1180
+ context.evidence.approvals[0] = {
1181
+ ...context.evidence.approvals[0],
1182
+ statusAfterDecision: finalApproval.status,
1183
+ decisionActor: 'synthetic isolated administrator via protected approval API',
1184
+ commentRecorded: finalApproval.comment === 'Approved for the bounded R20 local simulator integration check.',
1185
+ }
1186
+ }
1187
+
1188
+ async function captureRealOmpUsage(context) {
1189
+ const unavailable = {
1190
+ source: 'not exposed by the channel queue endpoint',
1191
+ context: null,
1192
+ requestInputTokens: null,
1193
+ requestOutputTokens: null,
1194
+ costUsd: null,
1195
+ costAvailable: false,
1196
+ }
1197
+ if (!context?.channel?.channelId || !context?.agent?.id) return unavailable
1198
+ try {
1199
+ const queueResult = await app('GET', `/api/workshop/channels/${encodeURIComponent(context.channel.channelId)}/queue`)
1200
+ if (queueResult.status !== 200) return unavailable
1201
+ const queue = extractPayload(queueResult.body)
1202
+ const agentStatus = (Array.isArray(queue) ? queue : []).find(item => item.agentId === context.agent.id)
1203
+ const raw = agentStatus?.context
1204
+ if (!raw) return unavailable
1205
+ return {
1206
+ source: 'channel queue OMP context snapshot (not request-level billing)',
1207
+ context: {
1208
+ usedTokens: Number.isFinite(Number(raw.usedTokens)) ? Number(raw.usedTokens) : null,
1209
+ contextWindow: Number.isFinite(Number(raw.contextWindow)) ? Number(raw.contextWindow) : null,
1210
+ percent: Number.isFinite(Number(raw.percent)) ? Number(raw.percent) : null,
1211
+ compacting: raw.compacting === true,
1212
+ },
1213
+ requestInputTokens: null,
1214
+ requestOutputTokens: null,
1215
+ costUsd: null,
1216
+ costAvailable: false,
1217
+ }
1218
+ }
1219
+ catch { return unavailable }
1220
+ }
1221
+
1222
+ async function approvePendingTrial(context) {
1223
+ currentStage = `${context.evidence.id}:manual-hitl-approval`
1224
+ const deadline = Date.now() + 20_000
1225
+ let pending
1226
+ while (Date.now() < deadline) {
1227
+ const result = await app('GET', `/api/workshop/agent-tools/approvals?agentId=${encodeURIComponent(context.agent.id)}&scope=pending`)
1228
+ if (result.status === 200) {
1229
+ const matches = (result.data?.approvals ?? []).filter(item => item.agentId === context.agent.id && item.nodeId === `recipe:${context.recipe.id}` && item.status === 'pending')
1230
+ if (matches.length > 1) throw new Error(`${context.evidence.id} has multiple pending trial approvals`)
1231
+ if (matches.length === 1) {
1232
+ pending = matches[0]
1233
+ break
1234
+ }
1235
+ }
1236
+ await delay(400)
1237
+ }
1238
+ if (!pending) throw new Error(`${context.evidence.id} manual recipe_trial HITL approval did not appear within the bounded window`)
1239
+ context.evidence.approvals.push({ id: pending.id, statusBeforeDecision: pending.status, nodeId: pending.nodeId, title: pending.title ?? null, decision: 'approve' })
1240
+ const decided = await app('POST', `/api/workshop/agent-tools/approvals/${encodeURIComponent(pending.id)}/decide`, {
1241
+ approved: true,
1242
+ comment: 'Approved for the isolated deterministic simulator integration check.',
1243
+ })
1244
+ requireSuccess(decided, `${context.evidence.id} explicit HITL approval`)
1245
+ const history = await app('GET', `/api/workshop/agent-tools/approvals?agentId=${encodeURIComponent(context.agent.id)}&scope=history`)
1246
+ const finalApproval = (history.data?.approvals ?? []).find(item => item.id === pending.id)
1247
+ if (history.status !== 200 || finalApproval?.status !== 'approved' || finalApproval?.decidedBy !== syntheticAdminId) {
1248
+ throw new Error(`${context.evidence.id} HITL approval history failed to confirm the explicit administrator decision`)
1249
+ }
1250
+ context.evidence.approvals[0] = {
1251
+ ...context.evidence.approvals[0],
1252
+ statusAfterDecision: finalApproval.status,
1253
+ decisionActor: 'synthetic isolated administrator via protected approval API',
1254
+ commentRecorded: finalApproval.comment === 'Approved for the isolated deterministic simulator integration check.',
1255
+ }
1256
+ }
1257
+
1258
+ async function collectSceneEvidence(context) {
1259
+ currentStage = `${context.evidence.id}:collect-result-and-observations`
1260
+ let trace
1261
+ let toolName
1262
+ let toolText
1263
+ let toolIsError
1264
+ let realTask
1265
+ let realToolEvents
1266
+ if (HARNESS_MODE === 'real-omp') {
1267
+ // The supervisor journals compact host-tool start/result events on the
1268
+ // active root task. Approval and operation ledgers remain authoritative
1269
+ // for the proposal and its execution.
1270
+ realTask = await waitForRealOmpTaskCompletion(context)
1271
+ if (realTask.assigneeId !== context.agent.id) throw new Error(`${context.evidence.id} real OMP task was not executed by its registered lead agent`)
1272
+ realToolEvents = assertSingleRealOmpCall(context, realTask)
1273
+ const channelMessages = requireSuccess(await app('GET', `/api/workshop/channels/${encodeURIComponent(context.channel.channelId)}/messages?limit=500`), `${context.evidence.id} channel task evidence`)
1274
+ const taskMessages = (Array.isArray(channelMessages) ? channelMessages : []).filter(message => message.taskId === context.evidence.taskId)
1275
+ const usage = await captureRealOmpUsage(context)
1276
+ context.evidence.modelExecution = {
1277
+ provider: REAL_OMP_PROVIDER,
1278
+ model: REAL_OMP_MODEL,
1279
+ taskId: context.evidence.taskId,
1280
+ taskState: realTask.state,
1281
+ taskArtifactCount: Array.isArray(realTask.artifacts) ? realTask.artifacts.length : 0,
1282
+ evidenceSource: 'registered OMP task history, approval payload, task state, and route-specific recipe/ACK records',
1283
+ hostToolCallEvents: realToolEvents.calls.length + realToolEvents.completionCalls.length,
1284
+ hostToolResultEvents: realToolEvents.results.length,
1285
+ taskCompletionToolCallEvents: realToolEvents.completionCalls.length,
1286
+ taskToolEvents: realToolEvents.events.map(event => ({ toolName: event.toolName, phase: event.phase, isError: event.isError })),
1287
+ hostToolEventHistoryAvailable: realToolEvents.events.length > 0,
1288
+ approvedProposalValue: context.evidence.modelDecision?.selectedValue ?? null,
1289
+ approvedProposalCount: context.evidence.approvals.length,
1290
+ channelEvidence: {
1291
+ source: 'GET /api/workshop/channels/:id/messages',
1292
+ taskMessageCount: taskMessages.length,
1293
+ agentMessageCount: taskMessages.filter(message => message.fromAgentId === context.agent.id).length,
1294
+ roles: [...new Set(taskMessages.map(message => safeText(message.role, 40)))],
1295
+ },
1296
+ usage,
1297
+ }
1298
+ }
1299
+ else {
1300
+ const tracePath = fixtureTracePath(context.evidence.id)
1301
+ const deadline = Date.now() + 20_000
1302
+ while (Date.now() < deadline) {
1303
+ if (existsSync(tracePath)) {
1304
+ try {
1305
+ trace = JSON.parse(readFileSync(tracePath, 'utf8'))
1306
+ }
1307
+ catch { /* fixture is rewriting a small JSON trace */ }
1308
+ }
1309
+ if (trace?.hostToolResults?.length) break
1310
+ await delay(300)
1311
+ }
1312
+ if (!trace) throw new Error(`${context.evidence.id} deterministic fixture did not create its trace`)
1313
+ if (trace.hostToolCalls?.length !== 1 || trace.hostToolCalls[0]?.toolName !== 'recipe_trial' || trace.hostToolResults?.length !== 1) {
1314
+ throw new Error(`${context.evidence.id} fixture trace did not show exactly one recipe_trial host_tool_call/result`)
1315
+ }
1316
+ const toolResult = trace.hostToolResults[0].result
1317
+ toolText = String(toolResult?.content?.[0]?.text ?? '')
1318
+ toolName = trace.hostToolCalls[0].toolName
1319
+ toolIsError = Boolean(toolResult?.isError)
1320
+ if (toolIsError || !/全部设备证实|下发并全部设备证实/.test(toolText)) {
1321
+ throw new Error(`${context.evidence.id} recipe_trial did not return a fully verified device ACK`)
1322
+ }
1323
+ }
1324
+
1325
+ const readback = await app('POST', `/api/workshop/dcw/${encodeURIComponent(context.control.id)}/read`)
1326
+ requireSuccess(readback, `${context.evidence.id} DCW readback`)
1327
+
1328
+ const runData = await app('GET', `/api/workshop/dcw/runs/${encodeURIComponent(context.runId)}/data`)
1329
+ requireSuccess(runData, `${context.evidence.id} active run data`)
1330
+ const logs = await app('GET', `/api/workshop/ops-logs?scope=line&lineId=${encodeURIComponent(context.line.id)}&recipeId=${encodeURIComponent(context.recipe.id)}&limit=100`)
1331
+ requireSuccess(logs, `${context.evidence.id} recipe operation log`)
1332
+ const recipeRows = (logs.data?.logs ?? [])
1333
+ .filter(row => String(row.action).startsWith('recipe.'))
1334
+ .map((row) => {
1335
+ let detail = row.detail
1336
+ if (!detail || typeof detail !== 'object' || Array.isArray(detail)) {
1337
+ try {
1338
+ const parsed = JSON.parse(String(row.detailJson ?? '{}'))
1339
+ detail = parsed && typeof parsed === 'object' && !Array.isArray(parsed) ? parsed : {}
1340
+ }
1341
+ catch { detail = {} }
1342
+ }
1343
+ return { ...row, detail }
1344
+ })
1345
+ const trialRows = recipeRows.filter(row => row.action === 'recipe.trial')
1346
+ const trialAckRows = recipeRows.filter(row => row.action === 'recipe.dispatch.ack' && row.detail?.trial === true)
1347
+ const trialRow = trialRows[0]
1348
+ const ackRow = trialAckRows[0]
1349
+ const trialRunId = String(ackRow?.detail?.runId ?? '')
1350
+ if (trialRows.length !== 1 || trialAckRows.length !== 1 || !trialRunId || String(trialRow?.detail?.runId ?? '') !== trialRunId) {
1351
+ throw new Error(`${context.evidence.id} recipe log did not contain exactly one matching recipe.trial and trial ACK pair`)
1352
+ }
1353
+ if (HARNESS_MODE === 'real-omp' && context.evidence.approvals.length !== 1) {
1354
+ throw new Error(`${context.evidence.id} expected exactly one approved real OMP proposal`)
1355
+ }
1356
+ const trialRunData = await app('GET', `/api/workshop/dcw/runs/${encodeURIComponent(trialRunId)}/data`)
1357
+ requireSuccess(trialRunData, `${context.evidence.id} trial run data`)
1358
+ const ack = ackRow.detail?.ackSummary ?? null
1359
+ if (!ack || ack.total !== 1 || ack.verified !== 1 || ack.failed !== 0 || ack.unverified !== 0) {
1360
+ throw new Error(`${context.evidence.id} logged trial ACK is not one-of-one verified`)
1361
+ }
1362
+ const returnedTrialRun = trialRunData.data?.run
1363
+ const trialResults = returnedTrialRun?.results
1364
+ if (returnedTrialRun?.id !== trialRunId || !Array.isArray(trialResults) || trialResults.length !== 1 || trialResults[0]?.verify?.verdict !== 'verified' || trialResults[0]?.ok !== true) {
1365
+ throw new Error(`${context.evidence.id} trial run data lacks an independently verified write result`)
1366
+ }
1367
+
1368
+ const snapshotDelayStartedAt = new Date().toISOString()
1369
+ await delay(20_000)
1370
+ const probeStartedAt = new Date().toISOString()
1371
+ const probeResponse = await app('POST', `/api/workshop/daq/${encodeURIComponent(context.daq.id)}/test`)
1372
+ const probe = requireSuccess(probeResponse, `${context.evidence.id} DAQ driver probe`).test
1373
+ const sampleValue = Number(probe?.sampleValue)
1374
+ if (probe?.ok !== true || !Number.isFinite(sampleValue)) {
1375
+ throw new Error(`${context.evidence.id} DAQ driver probe did not return a finite simulator value`)
1376
+ }
1377
+ const probeCompletedAt = new Date().toISOString()
1378
+ const ingestAt = probeCompletedAt
1379
+ const ingest = requireSuccess(await app('POST', `/api/workshop/daq/${encodeURIComponent(context.daq.id)}/ingest`, {
1380
+ at: ingestAt,
1381
+ value: sampleValue,
1382
+ state: 'ok',
1383
+ }), `${context.evidence.id} DAQ snapshot ingest`)
1384
+ if (ingest?.accepted !== true || ingest.nodeId !== context.daq.id || ingest.lineId !== context.line.id) {
1385
+ throw new Error(`${context.evidence.id} DAQ snapshot ingest was not accepted for the expected node and line`)
1386
+ }
1387
+
1388
+ const persistedAt = String(ingest.at ?? ingestAt)
1389
+ const persistedAtMs = Date.parse(persistedAt)
1390
+ if (!Number.isFinite(persistedAtMs)) throw new Error(`${context.evidence.id} DAQ snapshot ingest returned an invalid sample timestamp`)
1391
+ const fromMs = persistedAtMs
1392
+ const toMs = persistedAtMs + 1
1393
+ // Let the in-process queue and SQLite batch flush settle before a fixed-window query;
1394
+ // retries outlast the short query-cache TTL if the first lookup is still empty.
1395
+ await delay(800)
1396
+ const queryDeadline = Date.now() + 12_000
1397
+ let taggedQuery
1398
+ let taggedSeries
1399
+ let snapshotBucketAt
1400
+ while (Date.now() < queryDeadline) {
1401
+ const candidate = await app('GET', `/api/workshop/daq/query?line_id=${encodeURIComponent(context.line.id)}&node_ids=${encodeURIComponent(context.daq.id)}&run_id=${encodeURIComponent(context.runId)}&from=${fromMs}&to=${toMs}&bucket_ms=1000`)
1402
+ if (candidate.status === 200) {
1403
+ taggedQuery = candidate
1404
+ taggedSeries = candidate.data?.series?.find(series => series.nodeId === context.daq.id)
1405
+ const bucketMs = Number(candidate.data?.window?.bucketMs) || 1_000
1406
+ snapshotBucketAt = Math.floor(persistedAtMs / bucketMs) * bucketMs
1407
+ const matchingPoint = taggedSeries?.points?.find(point => Number(point.at) === snapshotBucketAt && Math.abs(Number(point.v) - sampleValue) <= 0.01)
1408
+ if (matchingPoint && candidate.data?.activeRun?.runId === context.runId) break
1409
+ }
1410
+ await delay(300)
1411
+ }
1412
+ if (!taggedQuery || !taggedSeries?.points?.length || taggedQuery.data?.activeRun?.runId !== context.runId) {
1413
+ throw new Error(`${context.evidence.id} platform DAQ query returned no snapshot tagged to the active run`)
1414
+ }
1415
+ const matchingProbePoint = taggedSeries.points.find(point => Number(point.at) === snapshotBucketAt && Math.abs(Number(point.v) - sampleValue) <= 0.01)
1416
+ if (!matchingProbePoint) {
1417
+ throw new Error(`${context.evidence.id} run-tagged DAQ data did not contain the driver-probe snapshot value`)
1418
+ }
1419
+
1420
+ if (HARNESS_MODE === 'real-omp') {
1421
+ const finalTask = await readRealOmpTask(context)
1422
+ context.evidence.hostToolExecution = {
1423
+ provenance: 'registered OMP model proposal → protected synthetic approval → one recipe.trial and one verified DCW receipt',
1424
+ hostToolEventHistoryAvailable: realToolEvents.events.length > 0,
1425
+ taskStateAfterObservation: finalTask.state,
1426
+ taskCompleted: finalTask.state === 'COMPLETED',
1427
+ approvedProposalCount: context.evidence.approvals.length,
1428
+ recipeTrialCount: trialRows.length,
1429
+ recipeTrialAckCount: trialAckRows.length,
1430
+ toolName: 'recipe_trial',
1431
+ resultReceived: ack?.verified === 1 && ack?.failed === 0,
1432
+ }
1433
+ context.evidence.modelExecution.taskStateAfterObservation = finalTask.state
1434
+ context.evidence.modelExecution.taskCompleted = finalTask.state === 'COMPLETED'
1435
+ }
1436
+ else {
1437
+ context.evidence.fixtureTrace = {
1438
+ fixture: trace.fixture,
1439
+ decisionSource: trace.decisionSource,
1440
+ hostToolCallCount: trace.hostToolCalls.length,
1441
+ toolName,
1442
+ resultReceived: trace.hostToolResults.length === 1,
1443
+ toolResultText: safeText(toolText, 1200),
1444
+ toolIsError,
1445
+ }
1446
+ }
1447
+ context.evidence.trial = {
1448
+ runId: trialRunId,
1449
+ toolName,
1450
+ approvalId: context.evidence.approvals[0].id,
1451
+ ackSummary: ack,
1452
+ resultCount: trialResults.length,
1453
+ resultRows: trialResults,
1454
+ }
1455
+ context.evidence.readback = {
1456
+ expectedCandidate: context.evidence.simulator.candidate,
1457
+ response: readback.data?.outcome ?? readback.data?.read ?? readback.data,
1458
+ resultMatchesCandidate: (() => {
1459
+ const details = readback.data?.outcome ?? readback.data?.read ?? readback.data ?? {}
1460
+ const observed = Number(details.value ?? details.data?.value ?? details.result?.value)
1461
+ return Number.isFinite(observed) && Math.abs(observed - context.evidence.simulator.candidate) <= 0.01
1462
+ })(),
1463
+ }
1464
+ context.evidence.daq = {
1465
+ nodeId: context.daq.id,
1466
+ method: 'single driver-probe/ingest snapshot',
1467
+ storageBackend: 'isolated AW_HOME SQLite time-series fallback',
1468
+ postTrialDelaySeconds: 20,
1469
+ snapshotDelayStartedAt,
1470
+ sampleCount: taggedSeries.points.length,
1471
+ runTags: [context.runId],
1472
+ expectedActiveRunId: context.runId,
1473
+ probe: {
1474
+ driver: context.daq.driver,
1475
+ startedAt: probeStartedAt,
1476
+ completedAt: probeCompletedAt,
1477
+ sampleValue,
1478
+ latencyMs: Number.isFinite(Number(probe.latencyMs)) ? Number(probe.latencyMs) : null,
1479
+ },
1480
+ ingest: {
1481
+ accepted: ingest.accepted,
1482
+ at: persistedAt,
1483
+ value: sampleValue,
1484
+ state: 'ok',
1485
+ },
1486
+ taggedQuery: {
1487
+ requestedRunId: context.runId,
1488
+ returnedRunId: taggedQuery.data?.activeRun?.runId ?? null,
1489
+ seriesPointCount: taggedSeries.points.length,
1490
+ probeValueMatched: true,
1491
+ snapshotBucketAt: new Date(snapshotBucketAt).toISOString(),
1492
+ matchingProbePoint,
1493
+ series: taggedSeries.points.slice(-5),
1494
+ },
1495
+ activeRunDataKeys: Object.keys(runData.data ?? {}),
1496
+ }
1497
+ context.evidence.recipeLog = {
1498
+ query: 'ops-logs filtered by lineId and recipeId (recipe_log-equivalent audit view)',
1499
+ rowCount: recipeRows.length,
1500
+ trialAction: trialRow.action,
1501
+ trialSummary: safeText(trialRow.summary, 600),
1502
+ ackAction: ackRow.action,
1503
+ ackSummary: safeText(ackRow.summary, 600),
1504
+ trialRunDataKeys: Object.keys(trialRunData.data ?? {}),
1505
+ }
1506
+ context.evidence.status = 'verified'
1507
+ }
1508
+
1509
+ async function runScene(scene) {
1510
+ const simDetails = await simulatorScene(scene)
1511
+ const context = await setupScene(scene, { ...simDetails, candidate: scene.candidate })
1512
+ context.evidence.simulator.candidate = scene.candidate
1513
+ context.evidence.simulator.baseline = scene.baseline
1514
+ await submitFixtureTask(context)
1515
+ await approvePendingTrial(context)
1516
+ await collectSceneEvidence(context)
1517
+ const stopped = await app('POST', `/api/workshop/dcw/lines/${encodeURIComponent(context.line.id)}/stop`)
1518
+ requireSuccess(stopped, `${scene.id} line stop`)
1519
+ context.evidence.activeRun.endedAt = stopped.data?.run?.endedAt ?? null
1520
+ check(`${scene.id}-host-dispatch-one-call`, context.evidence.fixtureTrace.hostToolCallCount === 1, { tool: context.evidence.fixtureTrace.toolName })
1521
+ check(`${scene.id}-ack-verified`, context.evidence.trial.ackSummary.verified === 1 && context.evidence.trial.ackSummary.failed === 0, context.evidence.trial.ackSummary)
1522
+ check(`${scene.id}-readback-matches`, context.evidence.readback.resultMatchesCandidate, context.evidence.readback)
1523
+ check(`${scene.id}-run-tagged-daq-probe-ingest-snapshot`, context.evidence.daq.taggedQuery.seriesPointCount >= 1 && context.evidence.daq.taggedQuery.probeValueMatched, {
1524
+ method: context.evidence.daq.method,
1525
+ value: context.evidence.daq.probe.sampleValue,
1526
+ runId: context.evidence.daq.expectedActiveRunId,
1527
+ matchingPoint: context.evidence.daq.taggedQuery.matchingProbePoint,
1528
+ })
1529
+ check(`${scene.id}-recipe-log`, context.evidence.recipeLog.rowCount >= 2, { trialAction: context.evidence.recipeLog.trialAction, ackAction: context.evidence.recipeLog.ackAction })
1530
+ }
1531
+
1532
+ async function recoverFailedRealOmpTrial(context, outcome) {
1533
+ const recovery = []
1534
+ if (context?.evidence?.taskId) {
1535
+ try {
1536
+ const task = await readRealOmpTask(context)
1537
+ if (!['COMPLETED', 'FAILED', 'CANCELED'].includes(task.state)) {
1538
+ const canceled = await app('POST', `/api/workshop/tasks/${encodeURIComponent(context.evidence.taskId)}/cancel`)
1539
+ recovery.push({ action: 'cancel-nonterminal-task', status: canceled.status === 200 ? 'completed' : `http-${canceled.status}` })
1540
+ }
1541
+ else recovery.push({ action: 'cancel-nonterminal-task', status: 'not-needed', taskState: task.state })
1542
+ }
1543
+ catch (error) { recovery.push({ action: 'cancel-nonterminal-task', status: 'failed', error: compactError(error) }) }
1544
+ }
1545
+ if (context?.channel?.channelId && context?.agent?.id) {
1546
+ try {
1547
+ const stopped = await app('POST', `/api/workshop/channels/${encodeURIComponent(context.channel.channelId)}/agents/${encodeURIComponent(context.agent.id)}/stop`)
1548
+ recovery.push({ action: 'stop-agent-runtime', status: stopped.status === 200 ? 'completed' : `http-${stopped.status}` })
1549
+ }
1550
+ catch (error) { recovery.push({ action: 'stop-agent-runtime', status: 'failed', error: compactError(error) }) }
1551
+ try {
1552
+ const pendingResult = await app('GET', `/api/workshop/agent-tools/approvals?agentId=${encodeURIComponent(context.agent.id)}&scope=pending`)
1553
+ const pending = pendingResult.status === 200
1554
+ ? (pendingResult.data?.approvals ?? []).filter(item => item.agentId === context.agent.id && item.status === 'pending')
1555
+ : []
1556
+ for (const approval of pending) {
1557
+ const denied = await app('POST', `/api/workshop/agent-tools/approvals/${encodeURIComponent(approval.id)}/decide`, {
1558
+ approved: false,
1559
+ comment: 'Denied during bounded R20 failure cleanup.',
1560
+ })
1561
+ recovery.push({ action: 'deny-pending-agent-approval', approvalId: approval.id, status: denied.status === 200 ? 'completed' : `http-${denied.status}` })
1562
+ }
1563
+ if (pendingResult.status !== 200) recovery.push({ action: 'deny-pending-agent-approval', status: `list-http-${pendingResult.status}` })
1564
+ else if (pending.length === 0) recovery.push({ action: 'deny-pending-agent-approval', status: 'not-needed' })
1565
+ }
1566
+ catch (error) { recovery.push({ action: 'deny-pending-agent-approval', status: 'failed', error: compactError(error) }) }
1567
+ }
1568
+ if (context?.line?.id) {
1569
+ try {
1570
+ const stopped = await app('POST', `/api/workshop/dcw/lines/${encodeURIComponent(context.line.id)}/stop`)
1571
+ recovery.push({ action: 'stop-line', status: stopped.status === 200 ? 'completed' : `http-${stopped.status}` })
1572
+ }
1573
+ catch (error) { recovery.push({ action: 'stop-line', status: 'failed', error: compactError(error) }) }
1574
+ }
1575
+ outcome.recovery = recovery
1576
+ }
1577
+
1578
+ async function runRealOmpScene(baseScene) {
1579
+ currentScene = baseScene.id
1580
+ let simDetails
1581
+ try {
1582
+ currentStage = `${baseScene.id}:simulator-setup-once`
1583
+ simDetails = await simulatorScene(baseScene)
1584
+ if (!Array.isArray(baseScene.candidates) || baseScene.candidates.length !== REAL_OMP_TRIALS_PER_SCENE
1585
+ || baseScene.candidates.some(candidate => !Number.isFinite(candidate)
1586
+ || candidate < Number(simDetails.mv.min)
1587
+ || candidate > Number(simDetails.mv.max)
1588
+ || Math.abs(candidate - baseScene.baseline) > 30)) {
1589
+ throw new Error(`${baseScene.id} real OMP candidates violate the configured count, process range, or 30-unit recipe step limit`)
1590
+ }
1591
+ }
1592
+ catch (error) {
1593
+ for (let repetition = 1; repetition <= REAL_OMP_TRIALS_PER_SCENE; repetition++) {
1594
+ const outcome = {
1595
+ id: `${baseScene.id}-r${repetition}`,
1596
+ scene: baseScene.id,
1597
+ repetition,
1598
+ provider: REAL_OMP_PROVIDER,
1599
+ model: REAL_OMP_MODEL,
1600
+ candidate: baseScene.candidates[repetition - 1],
1601
+ usage: { source: 'not available because simulator setup failed', context: null, requestInputTokens: null, requestOutputTokens: null, costUsd: null, costAvailable: false },
1602
+ costUsd: null,
1603
+ status: 'failed',
1604
+ failure: compactError(error),
1605
+ }
1606
+ evidence.experiment.runOutcomes.push(outcome)
1607
+ }
1608
+ return
1609
+ }
1610
+
1611
+ for (let repetition = 1; repetition <= REAL_OMP_TRIALS_PER_SCENE; repetition++) {
1612
+ const scene = { ...baseScene, id: `${baseScene.id}-r${repetition}` }
1613
+ const outcome = {
1614
+ id: scene.id,
1615
+ scene: baseScene.id,
1616
+ repetition,
1617
+ provider: REAL_OMP_PROVIDER,
1618
+ model: REAL_OMP_MODEL,
1619
+ candidate: null,
1620
+ candidateChoices: [...baseScene.candidates],
1621
+ usage: { source: 'not yet available', context: null, requestInputTokens: null, requestOutputTokens: null, costUsd: null, costAvailable: false },
1622
+ costUsd: null,
1623
+ status: 'running',
1624
+ startedAt: new Date().toISOString(),
1625
+ }
1626
+ evidence.experiment.runOutcomes.push(outcome)
1627
+ let context
1628
+ try {
1629
+ currentScene = scene.id
1630
+ const runSimDetails = { ...simDetails, candidateChoices: [...baseScene.candidates] }
1631
+ context = await setupScene(scene, runSimDetails)
1632
+ context.evidence.simulator.baseline = scene.baseline
1633
+ outcome.entities = context.evidence.entities
1634
+ outcome.runId = context.runId
1635
+ await submitRealOmpTask(context)
1636
+ outcome.taskId = context.evidence.taskId
1637
+ await approveRealOmpTrial(context)
1638
+ outcome.candidate = context.evidence.simulator.candidate
1639
+ outcome.modelDecision = context.evidence.modelDecision
1640
+ await collectSceneEvidence(context)
1641
+ const stopped = await app('POST', `/api/workshop/dcw/lines/${encodeURIComponent(context.line.id)}/stop`)
1642
+ requireSuccess(stopped, `${scene.id} line stop`)
1643
+ context.evidence.activeRun.endedAt = stopped.data?.run?.endedAt ?? null
1644
+ const finalTask = await readRealOmpTask(context)
1645
+ context.evidence.hostToolExecution.taskStateAfterObservation = finalTask.state
1646
+ context.evidence.hostToolExecution.taskCompleted = finalTask.state === 'COMPLETED'
1647
+ context.evidence.modelExecution.taskStateAfterObservation = finalTask.state
1648
+ context.evidence.modelExecution.taskCompleted = finalTask.state === 'COMPLETED'
1649
+ check(`${scene.id}-real-omp-approved-model-proposal`, context.evidence.modelExecution.approvedProposalCount === 1 && context.evidence.modelExecution.approvedProposalValue === context.evidence.simulator.candidate, {
1650
+ provider: REAL_OMP_PROVIDER,
1651
+ model: REAL_OMP_MODEL,
1652
+ selectedValue: context.evidence.modelExecution.approvedProposalValue,
1653
+ toolEventHistoryAvailable: context.evidence.modelExecution.hostToolEventHistoryAvailable,
1654
+ })
1655
+ check(`${scene.id}-real-omp-one-recipe-trial-ledger`, context.evidence.hostToolExecution.recipeTrialCount === 1 && context.evidence.hostToolExecution.recipeTrialAckCount === 1, {
1656
+ recipeTrialCount: context.evidence.hostToolExecution.recipeTrialCount,
1657
+ recipeTrialAckCount: context.evidence.hostToolExecution.recipeTrialAckCount,
1658
+ })
1659
+ check(`${scene.id}-ack-verified`, context.evidence.trial.ackSummary.verified === 1 && context.evidence.trial.ackSummary.failed === 0, context.evidence.trial.ackSummary)
1660
+ check(`${scene.id}-readback-matches`, context.evidence.readback.resultMatchesCandidate, context.evidence.readback)
1661
+ check(`${scene.id}-run-tagged-daq-probe-ingest-snapshot`, context.evidence.daq.taggedQuery.seriesPointCount >= 1 && context.evidence.daq.taggedQuery.probeValueMatched, {
1662
+ method: context.evidence.daq.method,
1663
+ value: context.evidence.daq.probe.sampleValue,
1664
+ runId: context.evidence.daq.expectedActiveRunId,
1665
+ matchingPoint: context.evidence.daq.taggedQuery.matchingProbePoint,
1666
+ })
1667
+ check(`${scene.id}-recipe-log`, context.evidence.recipeLog.rowCount >= 2, { trialAction: context.evidence.recipeLog.trialAction, ackAction: context.evidence.recipeLog.ackAction })
1668
+ check(`${scene.id}-real-omp-task-completed`, context.evidence.hostToolExecution.taskCompleted, {
1669
+ taskState: context.evidence.hostToolExecution.taskStateAfterObservation,
1670
+ })
1671
+ context.evidence.status = 'verified'
1672
+ outcome.status = context.evidence.hostToolExecution.taskCompleted ? 'verified' : 'verified-operation-task-incomplete'
1673
+ outcome.finishedAt = new Date().toISOString()
1674
+ outcome.trialRunId = context.evidence.trial.runId
1675
+ outcome.taskState = context.evidence.hostToolExecution.taskStateAfterObservation
1676
+ outcome.usage = context.evidence.modelExecution.usage
1677
+ outcome.costUsd = null
1678
+ outcome.evidenceSceneId = context.evidence.id
1679
+ }
1680
+ catch (error) {
1681
+ context && (context.evidence.status = 'failed')
1682
+ if (context) context.evidence.failure = compactError(error)
1683
+ outcome.status = 'failed'
1684
+ outcome.failure = compactError(error)
1685
+ outcome.finishedAt = new Date().toISOString()
1686
+ if (context) {
1687
+ outcome.usage = await captureRealOmpUsage(context)
1688
+ await recoverFailedRealOmpTrial(context, outcome)
1689
+ }
1690
+ }
1691
+ }
1692
+ }
1693
+
1694
+ async function startApplication() {
1695
+ currentStage = 'application-startup'
1696
+ await assertFreeLoopback(OFFLINE_APP_MQTT_QUEUE_PORT, 'offline-app-mqtt-queue-probe-before-startup')
1697
+ noteIsolation('offline-app-mqtt-queue-port-free-immediately-before-startup', true, {
1698
+ port: OFFLINE_APP_MQTT_QUEUE_PORT,
1699
+ host: '127.0.0.1',
1700
+ })
1701
+ appProcess = spawnLogged(process.execPath, [NUXT_CLI, 'dev', '--host', '127.0.0.1', '--port', String(AW_PORT), '--dotenv', EMPTY_DOTENV], {
1702
+ cwd: REPO,
1703
+ env: cleanChildEnv(),
1704
+ logFd: APP_LOG_FD,
1705
+ label: 'agentworkshop',
1706
+ })
1707
+ for (let i = 0; i < 90; i++) {
1708
+ if (appProcess.exitCode !== null) throw new Error(`AgentWorkShop startup exited (code ${appProcess.exitCode})`)
1709
+ try {
1710
+ const response = await app('GET', '/api/health', undefined, { token: undefined, timeoutMs: 2_000 })
1711
+ if (response.status === 200 && response.data?.status === 'ok' && response.data?.workshop === 'ready') {
1712
+ if (response.data?.version !== VERSION) throw new Error(`server reported an app version that differs from the package manifest`)
1713
+ noteIsolation('application-loopback-ready', true, { version: response.data.version, workshop: response.data.workshop, port: AW_PORT, host: '127.0.0.1' })
1714
+ return response.data
1715
+ }
1716
+ }
1717
+ catch (error) {
1718
+ if (error?.message?.startsWith('server reported unexpected version')) throw error
1719
+ }
1720
+ await delay(500)
1721
+ }
1722
+ throw new Error('isolated AgentWorkShop startup timed out or workshop manager did not become ready')
1723
+ }
1724
+
1725
+ async function main() {
1726
+ mkdirSync(join(REPO, '.omc'), { recursive: true })
1727
+ if (typeof VERSION !== 'string' || VERSION.length === 0) throw new Error('package manifest does not define a version')
1728
+ await preflight()
1729
+ prepareIsolatedHome()
1730
+ if (HARNESS_MODE === 'fixture') {
1731
+ currentStage = 'compile-local-omp-fixture-shim'
1732
+ wrapperPath = buildHarnessShim()
1733
+ noteIsolation('registered-omp-fixture-launcher-ready', true, { platform: process.platform, wrapper: 'local process shim; fixture is deterministic' })
1734
+ }
1735
+ else {
1736
+ noteIsolation('registered-omp-real-provider-model-declared', true, {
1737
+ command: 'omp from allowlisted PATH',
1738
+ provider: REAL_OMP_PROVIDER,
1739
+ model: REAL_OMP_MODEL,
1740
+ cwd: 'fresh isolated AW_HOME',
1741
+ authSource: 'local OMP auth store; value is not inspected or added to evidence',
1742
+ discoveryDisabled: ['extensions', 'skills', 'rules'],
1743
+ credentialValuesExposedToRunnerOrEvidence: false,
1744
+ })
1745
+ }
1746
+ currentStage = 'simulator-startup'
1747
+ await bootSimulator()
1748
+ const health = await startApplication()
1749
+ evidence.experiment.server = { version: health.version, mode: health.mode, workshop: health.workshop, uptimeMsAtReady: health.uptimeMs }
1750
+ evidence.experiment.sourceIdentity = captureSourceIdentity()
1751
+ const admin = await registerAdmin()
1752
+ evidence.experiment.syntheticAdmin = admin
1753
+ await assertPluginIsolation()
1754
+ await verifyRagBridgeOutboundDisabled()
1755
+ const daqStatus = requireSuccess(await app('GET', '/api/workshop/daq', undefined, { timeoutMs: 45_000 }), 'isolated DAQ backend status')
1756
+ const settings = requireSuccess(await app('GET', '/api/system/settings'), 'effective runtime settings snapshot')
1757
+ const effectiveMqttHost = settings.effective?.['daq.mqtt.host']
1758
+ const effectiveMqttPort = Number(settings.effective?.['daq.mqtt.port'])
1759
+ const effectiveMqttPortSource = settings.sources?.['daq.mqtt.port']
1760
+ const effectiveInfrastructurePolicy = settings.effective?.['daq.startInfrastructure']
1761
+ const effectiveInfrastructurePolicySource = settings.sources?.['daq.startInfrastructure']
1762
+ const runtimeTargetMatches = effectiveMqttHost === '127.0.0.1'
1763
+ && effectiveMqttPort === OFFLINE_APP_MQTT_QUEUE_PORT
1764
+ && effectiveMqttPortSource === 'runtime'
1765
+ && effectiveInfrastructurePolicy === 'never'
1766
+ && effectiveInfrastructurePolicySource === 'runtime'
1767
+ check('runtime-settings-target-offline-loopback-queue', runtimeTargetMatches, {
1768
+ mqttHost: effectiveMqttHost ?? null,
1769
+ mqttPort: effectiveMqttPort,
1770
+ mqttPortSource: effectiveMqttPortSource ?? null,
1771
+ infrastructurePolicy: effectiveInfrastructurePolicy ?? null,
1772
+ infrastructurePolicySource: effectiveInfrastructurePolicySource ?? null,
1773
+ })
1774
+ check('isolated-inproc-queue-and-sqlite-tsdb', runtimeTargetMatches && daqStatus.meta?.queue === 'inproc' && daqStatus.meta?.tsdb === 'sqlite-emulated', {
1775
+ queue: daqStatus.meta?.queue ?? null,
1776
+ tsdb: daqStatus.meta?.tsdb ?? null,
1777
+ effectiveMqttHost,
1778
+ effectiveMqttPort,
1779
+ effectiveMqttPortSource,
1780
+ })
1781
+ noteIsolation('application-message-path-is-inproc', runtimeTargetMatches && daqStatus.meta?.queue === 'inproc', {
1782
+ queue: daqStatus.meta?.queue ?? null,
1783
+ effectiveMqttHost,
1784
+ effectiveMqttPort,
1785
+ effectiveMqttPortSource: effectiveMqttPortSource ?? null,
1786
+ simulatorMqttBrokerRemainsLoopback: `127.0.0.1:${MQTT_PORT}`,
1787
+ })
1788
+ evidence.isolation.result = 'passed'
1789
+ noteIsolation('application-env-and-dotenv-isolation', true, {
1790
+ launch: 'direct Nuxt CLI; dev-guard .env preload bypassed',
1791
+ dotenvFile: EMPTY_DOTENV,
1792
+ childEnvironmentAllowlisted: true,
1793
+ storageEndpointsRestrictedToFreeLoopbackPorts: true,
1794
+ })
1795
+
1796
+ const scenes = [
1797
+ {
1798
+ id: 'cast-film', preset: 'cast-film-physics', sourceDevice: 'dev-extruder-opcua',
1799
+ mvSignal: 'ScrewSpeedSP', cvSignal: 'thick', baseline: 120, fixtureCandidate: 125,
1800
+ processDescription: 'cast-film extrusion; screw speed affects measured film thickness',
1801
+ targetMin: 48, targetMax: 52,
1802
+ candidates: [125, 130, 135],
1803
+ },
1804
+ {
1805
+ id: 'annealing', preset: 'anneal-line', sourceDevice: 'anneal-heating-mbtcp',
1806
+ mvSignal: '均热区3炉温SP', cvSignal: 'StripTemp', baseline: 730, fixtureCandidate: 735,
1807
+ processDescription: 'continuous annealing; zone-3 furnace setpoint affects measured strip temperature',
1808
+ targetMin: 700, targetMax: 760,
1809
+ candidates: [735, 740, 745],
1810
+ },
1811
+ ]
1812
+ if (HARNESS_MODE === 'real-omp') {
1813
+ check('real-omp-six-unique-trials-planned', scenes.length * REAL_OMP_TRIALS_PER_SCENE === 6 && new Set(scenes.flatMap(scene => Array.from({ length: REAL_OMP_TRIALS_PER_SCENE }, (_, index) => `${scene.id}-r${index + 1}`))).size === 6, {
1814
+ scenes: scenes.map(scene => scene.id),
1815
+ repetitionsPerScene: REAL_OMP_TRIALS_PER_SCENE,
1816
+ })
1817
+ for (const scene of scenes) await runRealOmpScene(scene)
1818
+ const failedRuns = evidence.experiment.runOutcomes.filter(outcome => outcome.status !== 'verified')
1819
+ evidence.status = failedRuns.length === 0 ? 'passed' : 'failed'
1820
+ if (failedRuns.length) {
1821
+ evidence.failure = {
1822
+ stage: 'real-omp-trial-set',
1823
+ name: 'RealOmpTrialSetError',
1824
+ message: `${failedRuns.length} of ${evidence.experiment.runOutcomes.length} bounded real OMP trials failed`,
1825
+ failedRunIds: failedRuns.map(outcome => outcome.id),
1826
+ }
1827
+ evidence.isolation.result = 'incomplete'
1828
+ }
1829
+ }
1830
+ else {
1831
+ for (const scene of scenes) await runScene({ ...scene, candidate: scene.fixtureCandidate })
1832
+ evidence.status = 'passed'
1833
+ }
1834
+ }
1835
+
1836
+ async function cleanup() {
1837
+ currentStage = 'cleanup'
1838
+ const processResults = []
1839
+ const processByChild = new Map()
1840
+ if (appProcess) processByChild.set(appProcess, 'agentworkshop')
1841
+ if (simProcess) processByChild.set(simProcess, 'simulator')
1842
+ for (const child of children) if (!processByChild.has(child)) processByChild.set(child, child.label ?? 'child')
1843
+ for (const [child, label] of [...processByChild.entries()].reverse()) {
1844
+ try {
1845
+ const stopped = await stopProcessTree(child, label)
1846
+ processResults.push(stopped)
1847
+ if (!evidence.checks.some(item => item.id === `${label}-process-stopped`)) {
1848
+ evidence.checks.push({ id: `${label}-process-stopped`, status: 'fail', detail: { pid: child.pid ?? null, reason: 'process pid unavailable for termination verification' } })
1849
+ }
1850
+ }
1851
+ catch (error) {
1852
+ evidence.checks.push({ id: `${label}-process-stopped`, status: 'fail', detail: { pid: child.pid ?? null, error: compactError(error) } })
1853
+ processResults.push(false)
1854
+ }
1855
+ }
1856
+ const portResults = []
1857
+ for (const [label, port] of [
1858
+ ['app', AW_PORT],
1859
+ ['simulator-http', SIM_PORT],
1860
+ ['simulator-mqtt', MQTT_PORT],
1861
+ ['offline-app-mqtt-queue-probe', OFFLINE_APP_MQTT_QUEUE_PORT],
1862
+ ['offline-timescale-probe', OFFLINE_TSDB_PORT],
1863
+ ['offline-objectstore-probe', OFFLINE_OBJECTSTORE_PORT],
1864
+ ...allocatedDevicePorts.map((port, index) => [`simulator-device-${index}`, port]),
1865
+ ]) {
1866
+ try {
1867
+ await assertFreeLoopback(port, label)
1868
+ evidence.checks.push({ id: `${label}-port-released`, status: 'pass', detail: { port, host: '127.0.0.1' } })
1869
+ portResults.push(true)
1870
+ }
1871
+ catch (error) {
1872
+ evidence.checks.push({ id: `${label}-port-released`, status: 'fail', detail: { port, host: '127.0.0.1', error: compactError(error) } })
1873
+ portResults.push(false)
1874
+ }
1875
+ }
1876
+ try {
1877
+ closeSync(SIM_LOG_FD)
1878
+ }
1879
+ catch { /* already closed */ }
1880
+ try {
1881
+ closeSync(APP_LOG_FD)
1882
+ }
1883
+ catch { /* already closed */ }
1884
+ const requiredProcessLabels = evidence.status === 'passed' ? ['agentworkshop', 'simulator'] : [...processByChild.values()]
1885
+ const verifiedProcessLabels = new Set(evidence.checks.filter(item => item.id.endsWith('-process-stopped') && item.status === 'pass').map(item => item.id.replace(/-process-stopped$/, '')))
1886
+ const allRequiredProcessesVerified = requiredProcessLabels.every(label => verifiedProcessLabels.has(label))
1887
+ return processResults.every(Boolean) && portResults.every(Boolean) && allRequiredProcessesVerified
1888
+ }
1889
+
1890
+ try {
1891
+ await main()
1892
+ }
1893
+ catch (error) {
1894
+ const preflightFailed = currentStage === 'preflight' || currentStage === 'compile-local-omp-fixture-shim' || currentStage === 'simulator-startup'
1895
+ evidence.status = preflightFailed ? 'blocked' : 'failed'
1896
+ evidence.failure = { stage: currentStage, scene: currentScene ?? null, ...compactError(error) }
1897
+ if (evidence.isolation.result === 'pending') evidence.isolation.result = preflightFailed ? 'failed' : 'incomplete'
1898
+ }
1899
+ finally {
1900
+ const cleanupPassed = await cleanup()
1901
+ if (!cleanupPassed) {
1902
+ evidence.status = 'failed'
1903
+ evidence.isolation.result = 'failed'
1904
+ evidence.failure ??= { stage: 'cleanup', name: 'CleanupVerificationError', message: 'process stop or loopback port release verification failed' }
1905
+ evidence.failure.cleanupVerificationFailed = true
1906
+ }
1907
+ if (evidence.status === 'passed') {
1908
+ const failedChecks = [...evidence.checks, ...evidence.isolation.checks].filter(item => item.status !== 'pass')
1909
+ const cleanupChecks = evidence.checks.filter(item => RELEASE_CHECK_SUFFIXES.some(suffix => item.id.endsWith(suffix)))
1910
+ if (failedChecks.length || !cleanupChecks.length || cleanupChecks.some(item => item.status !== 'pass')) {
1911
+ evidence.status = 'failed'
1912
+ evidence.isolation.result = 'failed'
1913
+ evidence.failure ??= { stage: 'final-verification', name: 'FinalVerificationError', message: 'not all experiment and cleanup checks passed' }
1914
+ }
1915
+ }
1916
+ evidence.cleanup = { status: cleanupPassed ? 'passed' : 'failed', requiredProcessAndPortChecks: true }
1917
+ evidence.experiment.finishedAt = new Date().toISOString()
1918
+ evidence.experiment.evidencePath = 'evidence.json'
1919
+ evidence.experiment.runtimeLogPaths = { app: 'agentworkshop.log', simulator: 'simulator.log' }
1920
+ writeFileSync(EVIDENCE_PATH, `${JSON.stringify(evidence, null, 2)}\n`, 'utf8')
1921
+ console.log(`REGISTERED_HARNESS_E2E=${evidence.status}`)
1922
+ console.log(`EVIDENCE=${EVIDENCE_PATH}`)
1923
+ console.log(`STAGE=${evidence.failure?.stage ?? 'complete'}`)
1924
+ }
1925
+
1926
+ if (evidence.status !== 'passed') process.exitCode = evidence.status === 'blocked' ? 2 : 1