agentworkshop 0.8.4 → 0.8.6

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