agentworkshop 0.8.6 → 0.8.7

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 (1799) hide show
  1. package/.AgentWorkShop/prompts/host-tools.en.json +196 -68
  2. package/.AgentWorkShop/prompts/host-tools.json +5 -5
  3. package/.output/.AgentWorkShop/aml-python/train-example.py +92 -92
  4. package/.output/.AgentWorkShop/prompts/host-tools.en.json +196 -68
  5. package/.output/.AgentWorkShop/prompts/host-tools.json +5 -5
  6. package/.output/nitro.json +1 -1
  7. package/.output/public/_nuxt/9Kt-rxrm.js +1 -0
  8. package/.output/public/_nuxt/ATAvN55g.js +1 -0
  9. package/.output/public/_nuxt/B3GEA4IW.js +1 -0
  10. package/.output/public/_nuxt/B9qIhT7k2.js +1 -0
  11. package/.output/public/_nuxt/BBTI9r9T2.js +1 -0
  12. package/.output/public/_nuxt/BE9oKpOt.js +1 -0
  13. package/.output/public/_nuxt/BHOjkDAJ.js +21 -0
  14. package/.output/public/_nuxt/BTaGYNZF2.js +1 -0
  15. package/.output/public/_nuxt/BXUDD9fv.js +1 -0
  16. package/.output/public/_nuxt/BXbZ_hei.js +1 -0
  17. package/.output/public/_nuxt/BaGy_jAI2.js +1 -0
  18. package/.output/public/_nuxt/BdfAuX81.js +1 -0
  19. package/.output/public/_nuxt/Buj_DMJ-.js +1 -0
  20. package/.output/public/_nuxt/Bv7dyPx4.js +1 -0
  21. package/.output/public/_nuxt/BvjY-Xks.js +1 -0
  22. package/.output/public/_nuxt/BxC9PAu-2.js +1 -0
  23. package/.output/public/_nuxt/Bzfzp9-f.js +1 -0
  24. package/.output/public/_nuxt/CT4bi_Y4.js +1 -0
  25. package/.output/public/_nuxt/CWcaJnFp.js +1 -0
  26. package/.output/public/_nuxt/CYLe9LKr.js +1 -0
  27. package/.output/public/_nuxt/CeCSjB9O2.js +1 -0
  28. package/.output/public/_nuxt/CnoJJb7B.js +1 -0
  29. package/.output/public/_nuxt/Crf8_Ad02.js +1 -0
  30. package/.output/public/_nuxt/CtMTOx_-2.js +1 -0
  31. package/.output/public/_nuxt/Cv9OcYm3.js +1 -0
  32. package/.output/public/_nuxt/CxIF09Zj2.js +1 -0
  33. package/.output/public/_nuxt/CxR0TyUA.js +1 -0
  34. package/.output/public/_nuxt/D9tNM-1a.js +9 -0
  35. package/.output/public/_nuxt/DL8QM0x5.js +1 -0
  36. package/.output/public/_nuxt/DO9Y3eoU.js +20 -0
  37. package/.output/public/_nuxt/DQLBGo6O.js +1 -0
  38. package/.output/public/_nuxt/DSqQKrMK2.js +1 -0
  39. package/.output/public/_nuxt/DXc4yISs.js +47 -0
  40. package/.output/public/_nuxt/DXmEuVFQ2.js +1 -0
  41. package/.output/public/_nuxt/DeXAMdSa2.js +1 -0
  42. package/.output/public/_nuxt/DjjOAXrj2.js +1 -0
  43. package/.output/public/_nuxt/DkRozlDP2.js +1 -0
  44. package/.output/public/_nuxt/DvI5fMX12.js +1 -0
  45. package/.output/public/_nuxt/DzWyfYJ12.js +2 -0
  46. package/.output/public/_nuxt/EXs4hr_w2.js +2 -0
  47. package/.output/public/_nuxt/LS9Wa05P.js +1 -0
  48. package/.output/public/_nuxt/MmlCf-EZ.js +1 -0
  49. package/.output/public/_nuxt/OmpTerminalPanel.DMWgGwDs.css +1 -0
  50. package/.output/public/_nuxt/PluginSlot.BqBzLD4T.css +1 -0
  51. package/.output/public/_nuxt/TownView.DQaU1HuK.css +1 -0
  52. package/.output/public/_nuxt/TugRY_4O.js +1 -0
  53. package/.output/public/_nuxt/UgCvr7b2.js +1 -0
  54. package/.output/public/_nuxt/WCG1-KXf2.js +16 -0
  55. package/.output/public/_nuxt/WybiLTow2.js +8 -0
  56. package/.output/public/_nuxt/YWsTLN5m.js +1 -0
  57. package/.output/public/_nuxt/Zn0BZpf0.js +3 -0
  58. package/.output/public/_nuxt/_id_.Be5JaH-P.css +1 -0
  59. package/.output/public/_nuxt/_wsId_.DSOfdfx2.css +1 -0
  60. package/.output/public/_nuxt/agents.CRomddYR.css +1 -0
  61. package/.output/public/_nuxt/aml.DgOMpDpv.css +1 -0
  62. package/.output/public/_nuxt/builds/latest.json +1 -1
  63. package/.output/public/_nuxt/builds/meta/02ba4bc7-f353-4183-a619-716921b5f0dc.json +1 -0
  64. package/.output/public/_nuxt/default.CpAx70gC.css +1 -0
  65. package/.output/public/_nuxt/eNEgl-ZF.js +1 -0
  66. package/.output/public/_nuxt/entry.Buc3k7Ha.css +1 -0
  67. package/.output/public/_nuxt/fJv3DH8b.js +1 -0
  68. package/.output/public/_nuxt/logs.6VGjPS34.css +1 -0
  69. package/.output/public/_nuxt/monitor.OoNTwfMJ.css +1 -0
  70. package/.output/public/_nuxt/ontology.D4P756Tc.css +1 -0
  71. package/.output/public/_nuxt/operations.C48ggFa5.css +1 -0
  72. package/.output/public/_nuxt/pages.Dpa28tJW.css +1 -0
  73. package/.output/public/_nuxt/permissions.CrV-4t-6.css +1 -0
  74. package/.output/public/_nuxt/px0VQ09m.js +2 -0
  75. package/.output/public/_nuxt/schedules.DYWOjGHm.css +1 -0
  76. package/.output/public/_nuxt/teams.DEJoJ4QV.css +1 -0
  77. package/.output/public/_nuxt/tokens.DKZWCP5v.css +1 -0
  78. package/.output/public/_nuxt/tools.DP-nsTli.css +1 -0
  79. package/.output/public/_nuxt/workshop.PT1xhP8C.css +1 -0
  80. package/.output/public/favicon.svg +14 -14
  81. package/.output/public/robots.txt +3 -3
  82. package/.output/server/chunks/_/AuthGate-G74Wr5IV.mjs +716 -0
  83. package/.output/server/chunks/_/AuthGate-G74Wr5IV.mjs.map +1 -0
  84. package/.output/server/chunks/_/FormItemContext-DmuQqaeJ.mjs +72 -0
  85. package/.output/server/chunks/_/FormItemContext-DmuQqaeJ.mjs.map +1 -0
  86. package/.output/server/chunks/_/LeftOutlined.mjs.map +1 -1
  87. package/.output/server/chunks/_/OmpTerminalPanel-CVn7GF98.mjs +942 -0
  88. package/.output/server/chunks/_/OmpTerminalPanel-CVn7GF98.mjs.map +1 -0
  89. package/.output/server/chunks/_/PluginSlot-CZlGlRoR.mjs +141 -0
  90. package/.output/server/chunks/_/PluginSlot-CZlGlRoR.mjs.map +1 -0
  91. package/.output/server/chunks/_/RightOutlined.mjs.map +1 -1
  92. package/.output/server/chunks/_/SearchOutlined.mjs +13 -13
  93. package/.output/server/chunks/_/SearchOutlined.mjs.map +1 -1
  94. package/.output/server/chunks/_/TownView-CaxNtCrZ.mjs +6496 -0
  95. package/.output/server/chunks/_/TownView-CaxNtCrZ.mjs.map +1 -0
  96. package/.output/server/chunks/_/_id_-CvCH8aqA.mjs +2045 -0
  97. package/.output/server/chunks/_/_id_-CvCH8aqA.mjs.map +1 -0
  98. package/.output/server/chunks/_/_id_-X_k47fyM.mjs +392 -0
  99. package/.output/server/chunks/_/_id_-X_k47fyM.mjs.map +1 -0
  100. package/.output/server/chunks/_/_wsId_-CIXvt220.mjs +14589 -0
  101. package/.output/server/chunks/_/_wsId_-CIXvt220.mjs.map +1 -0
  102. package/.output/server/chunks/_/access.mjs +1 -1
  103. package/.output/server/chunks/_/agents-Bipi0xxl.mjs +1078 -0
  104. package/.output/server/chunks/_/agents-Bipi0xxl.mjs.map +1 -0
  105. package/.output/server/chunks/_/alert-CNGhs--Y.mjs +263 -0
  106. package/.output/server/chunks/_/alert-CNGhs--Y.mjs.map +1 -0
  107. package/.output/server/chunks/_/aml-gCTIxLoE.mjs +814 -0
  108. package/.output/server/chunks/_/aml-gCTIxLoE.mjs.map +1 -0
  109. package/.output/server/chunks/_/analysis-BrSFajFi.mjs +533 -0
  110. package/.output/server/chunks/_/analysis-BrSFajFi.mjs.map +1 -0
  111. package/.output/server/chunks/_/api--f4L9O86.mjs +64 -0
  112. package/.output/server/chunks/_/api--f4L9O86.mjs.map +1 -0
  113. package/.output/server/chunks/_/api-CRGCw6io.mjs +53 -0
  114. package/.output/server/chunks/_/api-CRGCw6io.mjs.map +1 -0
  115. package/.output/server/chunks/_/api-DKutH26K.mjs +72 -0
  116. package/.output/server/chunks/_/api-DKutH26K.mjs.map +1 -0
  117. package/.output/server/chunks/_/api-error-BrL8jXVC.mjs +47 -0
  118. package/.output/server/chunks/_/api-error-BrL8jXVC.mjs.map +1 -0
  119. package/.output/server/chunks/_/apiClient-DrCvj3Zb.mjs +81 -0
  120. package/.output/server/chunks/_/apiClient-DrCvj3Zb.mjs.map +1 -0
  121. package/.output/server/chunks/_/binding-authz.mjs +4 -1
  122. package/.output/server/chunks/_/binding-authz.mjs.map +1 -1
  123. package/.output/server/chunks/_/board-DB55AvRS.mjs +189 -0
  124. package/.output/server/chunks/_/board-DB55AvRS.mjs.map +1 -0
  125. package/.output/server/chunks/_/builtin-catalog-edpDcgfL.mjs.map +1 -0
  126. package/.output/server/chunks/_/card-BECE6y_G.mjs +953 -0
  127. package/.output/server/chunks/_/card-BECE6y_G.mjs.map +1 -0
  128. package/.output/server/chunks/_/channel-templates-C0Njk-Ir.mjs +942 -0
  129. package/.output/server/chunks/_/channel-templates-C0Njk-Ir.mjs.map +1 -0
  130. package/.output/server/chunks/_/chart-pipeline-BpoWYMK_.mjs.map +1 -0
  131. package/.output/server/chunks/_/chart-trend-BWeZh5Lv.mjs.map +1 -0
  132. package/.output/server/chunks/_/checkbox-C6xY5uc6.mjs +439 -0
  133. package/.output/server/chunks/_/checkbox-C6xY5uc6.mjs.map +1 -0
  134. package/.output/server/chunks/_/client-only-DQ6Q0w4J.mjs +43 -0
  135. package/.output/server/chunks/_/client-only-DQ6Q0w4J.mjs.map +1 -0
  136. package/.output/server/chunks/_/constants-HPHJvjne.mjs +142 -0
  137. package/.output/server/chunks/_/constants-HPHJvjne.mjs.map +1 -0
  138. package/.output/server/chunks/_/core-CRlsQhzd.mjs +294 -0
  139. package/.output/server/chunks/_/core-CRlsQhzd.mjs.map +1 -0
  140. package/.output/server/chunks/_/daq-VLM0Ud2Y.mjs +1266 -0
  141. package/.output/server/chunks/_/daq-VLM0Ud2Y.mjs.map +1 -0
  142. package/.output/server/chunks/_/data-Bgx_w04W.mjs +481 -0
  143. package/.output/server/chunks/_/data-Bgx_w04W.mjs.map +1 -0
  144. package/.output/server/chunks/_/dcw-BstEJzQ4.mjs +505 -0
  145. package/.output/server/chunks/_/dcw-BstEJzQ4.mjs.map +1 -0
  146. package/.output/server/chunks/_/dcw-driver-badge-Df5wL_ZA.mjs.map +1 -0
  147. package/.output/server/chunks/_/default-Dmo-rt5V.mjs +2353 -0
  148. package/.output/server/chunks/_/default-Dmo-rt5V.mjs.map +1 -0
  149. package/.output/server/chunks/_/descriptions-B3uhDesi.mjs +406 -0
  150. package/.output/server/chunks/_/descriptions-B3uhDesi.mjs.map +1 -0
  151. package/.output/server/chunks/_/drawer-DwXxapMg.mjs +834 -0
  152. package/.output/server/chunks/_/drawer-DwXxapMg.mjs.map +1 -0
  153. package/.output/server/chunks/_/dropdown-DLrGy-Fs.mjs +14 -0
  154. package/.output/server/chunks/_/dropdown-DLrGy-Fs.mjs.map +1 -0
  155. package/.output/server/chunks/_/dropdown-nsGv8Gqx.mjs +540 -0
  156. package/.output/server/chunks/_/dropdown-nsGv8Gqx.mjs.map +1 -0
  157. package/.output/server/chunks/_/entity.mjs +1 -1
  158. package/.output/server/chunks/_/error-500.mjs.map +1 -1
  159. package/.output/server/chunks/_/es-DXSEkmAm.mjs +43 -0
  160. package/.output/server/chunks/_/es-DXSEkmAm.mjs.map +1 -0
  161. package/.output/server/chunks/_/firstNotUndefined-laiThpLD.mjs +2448 -0
  162. package/.output/server/chunks/_/firstNotUndefined-laiThpLD.mjs.map +1 -0
  163. package/.output/server/chunks/_/form-Cw2Ex9w5.mjs +4712 -0
  164. package/.output/server/chunks/_/form-Cw2Ex9w5.mjs.map +1 -0
  165. package/.output/server/chunks/_/hasIn-RYRGomyg.mjs +553 -0
  166. package/.output/server/chunks/_/hasIn-RYRGomyg.mjs.map +1 -0
  167. package/.output/server/chunks/_/hitl-CQowkJ6s.mjs +132 -0
  168. package/.output/server/chunks/_/hitl-CQowkJ6s.mjs.map +1 -0
  169. package/.output/server/chunks/_/host-bindings.mjs +1 -1
  170. package/.output/server/chunks/_/index.mjs +1 -1
  171. package/.output/server/chunks/_/input-CJgB-RL6.mjs +2181 -0
  172. package/.output/server/chunks/_/input-CJgB-RL6.mjs.map +1 -0
  173. package/.output/server/chunks/_/input-number-CQKL42p_.mjs +1120 -0
  174. package/.output/server/chunks/_/input-number-CQKL42p_.mjs.map +1 -0
  175. package/.output/server/chunks/_/interval-CfceaI3F.mjs +9 -0
  176. package/.output/server/chunks/_/interval-CfceaI3F.mjs.map +1 -0
  177. package/.output/server/chunks/_/isNumeric-DQiJ-b15.mjs +7 -0
  178. package/.output/server/chunks/_/isNumeric-DQiJ-b15.mjs.map +1 -0
  179. package/.output/server/chunks/_/line-scope.mjs +1 -1
  180. package/.output/server/chunks/_/logs-Dt4ejjjU.mjs +492 -0
  181. package/.output/server/chunks/_/logs-Dt4ejjjU.mjs.map +1 -0
  182. package/.output/server/chunks/_/menu-xO8ocVtL.mjs +1952 -0
  183. package/.output/server/chunks/_/menu-xO8ocVtL.mjs.map +1 -0
  184. package/.output/server/chunks/_/monitor-vqmGVVN5.mjs +2253 -0
  185. package/.output/server/chunks/_/monitor-vqmGVVN5.mjs.map +1 -0
  186. package/.output/server/chunks/_/narrow-fetch-CcG-BPxc.mjs.map +1 -0
  187. package/.output/server/chunks/_/nitro.mjs +3017 -2781
  188. package/.output/server/chunks/_/nitro.mjs.map +1 -1
  189. package/.output/server/chunks/_/ontology-ih0HgPpL.mjs +1406 -0
  190. package/.output/server/chunks/_/ontology-ih0HgPpL.mjs.map +1 -0
  191. package/.output/server/chunks/_/operations-BHmdVOUk.mjs +311 -0
  192. package/.output/server/chunks/_/operations-BHmdVOUk.mjs.map +1 -0
  193. package/.output/server/chunks/_/optimizer-DyvIYE4A.mjs +202 -0
  194. package/.output/server/chunks/_/optimizer-DyvIYE4A.mjs.map +1 -0
  195. package/.output/server/chunks/_/pages-C2KTn0U1.mjs +542 -0
  196. package/.output/server/chunks/_/pages-C2KTn0U1.mjs.map +1 -0
  197. package/.output/server/chunks/_/pagination-BTzq7dD5.mjs +1346 -0
  198. package/.output/server/chunks/_/pagination-BTzq7dD5.mjs.map +1 -0
  199. package/.output/server/chunks/_/permissions-BbTI02WI.mjs +637 -0
  200. package/.output/server/chunks/_/permissions-BbTI02WI.mjs.map +1 -0
  201. package/.output/server/chunks/_/pipeline-BgNjQ4J3.mjs +212 -0
  202. package/.output/server/chunks/_/pipeline-BgNjQ4J3.mjs.map +1 -0
  203. package/.output/server/chunks/_/plugins-CplEv3mY.mjs +272 -0
  204. package/.output/server/chunks/_/plugins-CplEv3mY.mjs.map +1 -0
  205. package/.output/server/chunks/_/popconfirm-DuGF7ty-.mjs +340 -0
  206. package/.output/server/chunks/_/popconfirm-DuGF7ty-.mjs.map +1 -0
  207. package/.output/server/chunks/_/responsiveObserve-CzRpNXkr.mjs +78 -0
  208. package/.output/server/chunks/_/responsiveObserve-CzRpNXkr.mjs.map +1 -0
  209. package/.output/server/chunks/_/rest-auth.mjs +1 -1
  210. package/.output/server/chunks/_/schedules-BN4t_4PG.mjs +7172 -0
  211. package/.output/server/chunks/_/schedules-BN4t_4PG.mjs.map +1 -0
  212. package/.output/server/chunks/_/segmented-29uEKZ3D.mjs +341 -0
  213. package/.output/server/chunks/_/segmented-29uEKZ3D.mjs.map +1 -0
  214. package/.output/server/chunks/_/select-CJb2XrQf.mjs +3923 -0
  215. package/.output/server/chunks/_/select-CJb2XrQf.mjs.map +1 -0
  216. package/.output/server/chunks/_/settings-BQaAoT4q.mjs +1014 -0
  217. package/.output/server/chunks/_/settings-BQaAoT4q.mjs.map +1 -0
  218. package/.output/server/chunks/_/space-BByD-mFE.mjs +110 -0
  219. package/.output/server/chunks/_/space-BByD-mFE.mjs.map +1 -0
  220. package/.output/server/chunks/_/spin-XhbgGeLP.mjs +357 -0
  221. package/.output/server/chunks/_/spin-XhbgGeLP.mjs.map +1 -0
  222. package/.output/server/chunks/_/studio-D5r5Rzaq.mjs +336 -0
  223. package/.output/server/chunks/_/studio-D5r5Rzaq.mjs.map +1 -0
  224. package/.output/server/chunks/_/switch-DWcwVFxW.mjs +377 -0
  225. package/.output/server/chunks/_/switch-DWcwVFxW.mjs.map +1 -0
  226. package/.output/server/chunks/_/table-Zhuo7Fq-.mjs +7546 -0
  227. package/.output/server/chunks/_/table-Zhuo7Fq-.mjs.map +1 -0
  228. package/.output/server/chunks/_/tabs-BCwBXjNt.mjs +1924 -0
  229. package/.output/server/chunks/_/tabs-BCwBXjNt.mjs.map +1 -0
  230. package/.output/server/chunks/_/tag-CRW-anwy.mjs +1156 -0
  231. package/.output/server/chunks/_/tag-CRW-anwy.mjs.map +1 -0
  232. package/.output/server/chunks/_/teams-BUtsNTet.mjs +1203 -0
  233. package/.output/server/chunks/_/teams-BUtsNTet.mjs.map +1 -0
  234. package/.output/server/chunks/_/tokens-o8lT3x-p.mjs +1062 -0
  235. package/.output/server/chunks/_/tokens-o8lT3x-p.mjs.map +1 -0
  236. package/.output/server/chunks/_/tools-DRb5HTtU.mjs +487 -0
  237. package/.output/server/chunks/_/tools-DRb5HTtU.mjs.map +1 -0
  238. package/.output/server/chunks/_/tooltip-GlMrUZzx.mjs +920 -0
  239. package/.output/server/chunks/_/tooltip-GlMrUZzx.mjs.map +1 -0
  240. package/.output/server/chunks/_/town-BPA3G6yX.mjs +133 -0
  241. package/.output/server/chunks/_/town-BPA3G6yX.mjs.map +1 -0
  242. package/.output/server/chunks/_/town-BV-hbwb5.mjs +75 -0
  243. package/.output/server/chunks/_/town-BV-hbwb5.mjs.map +1 -0
  244. package/.output/server/chunks/_/types-D6J7slEa.mjs +5565 -0
  245. package/.output/server/chunks/_/types-D6J7slEa.mjs.map +1 -0
  246. package/.output/server/chunks/_/types-DWqIeMRP.mjs +76 -0
  247. package/.output/server/chunks/_/types-DWqIeMRP.mjs.map +1 -0
  248. package/.output/server/chunks/_/useAgentHarnessOptions-dDHiEoK2.mjs +124 -0
  249. package/.output/server/chunks/_/useAgentHarnessOptions-dDHiEoK2.mjs.map +1 -0
  250. package/.output/server/chunks/_/useAgentTemplateActions-S3dtH5UW.mjs +77 -0
  251. package/.output/server/chunks/_/useAgentTemplateActions-S3dtH5UW.mjs.map +1 -0
  252. package/.output/server/chunks/_/useAgentTemplateDialogState-CZzpu5og.mjs +67 -0
  253. package/.output/server/chunks/_/useAgentTemplateDialogState-CZzpu5og.mjs.map +1 -0
  254. package/.output/server/chunks/_/useAgentTemplateForm-D8gneIvd.mjs +117 -0
  255. package/.output/server/chunks/_/useAgentTemplateForm-D8gneIvd.mjs.map +1 -0
  256. package/.output/server/chunks/_/useAgentTemplatesCatalog-DHUpubKM.mjs +133 -0
  257. package/.output/server/chunks/_/useAgentTemplatesCatalog-DHUpubKM.mjs.map +1 -0
  258. package/.output/server/chunks/_/useAmlDatasets-CDg3Qbpv.mjs +92 -0
  259. package/.output/server/chunks/_/useAmlDatasets-CDg3Qbpv.mjs.map +1 -0
  260. package/.output/server/chunks/_/useAmlEntities-Bcaput4Y.mjs +86 -0
  261. package/.output/server/chunks/_/useAmlEntities-Bcaput4Y.mjs.map +1 -0
  262. package/.output/server/chunks/_/useAmlEnv-Dga_Nq6z.mjs +194 -0
  263. package/.output/server/chunks/_/useAmlEnv-Dga_Nq6z.mjs.map +1 -0
  264. package/.output/server/chunks/_/useAmlExperiments-CFngqLM3.mjs +89 -0
  265. package/.output/server/chunks/_/useAmlExperiments-CFngqLM3.mjs.map +1 -0
  266. package/.output/server/chunks/_/useAmlFormat-C2sl3MGB.mjs +82 -0
  267. package/.output/server/chunks/_/useAmlFormat-C2sl3MGB.mjs.map +1 -0
  268. package/.output/server/chunks/_/useAmlJobs-C7onZkcR.mjs +267 -0
  269. package/.output/server/chunks/_/useAmlJobs-C7onZkcR.mjs.map +1 -0
  270. package/.output/server/chunks/_/useAmlModels-B2b3mx4d.mjs +93 -0
  271. package/.output/server/chunks/_/useAmlModels-B2b3mx4d.mjs.map +1 -0
  272. package/.output/server/chunks/_/useAmlNotes-6gZX7tbx.mjs +86 -0
  273. package/.output/server/chunks/_/useAmlNotes-6gZX7tbx.mjs.map +1 -0
  274. package/.output/server/chunks/_/useAmlPredict-DwOmM2ke.mjs +130 -0
  275. package/.output/server/chunks/_/useAmlPredict-DwOmM2ke.mjs.map +1 -0
  276. package/.output/server/chunks/_/useAnalysisFeed-CpPsKh_I.mjs +129 -0
  277. package/.output/server/chunks/_/useAnalysisFeed-CpPsKh_I.mjs.map +1 -0
  278. package/.output/server/chunks/_/useDaqAddNode-QtJja03_.mjs +142 -0
  279. package/.output/server/chunks/_/useDaqAddNode-QtJja03_.mjs.map +1 -0
  280. package/.output/server/chunks/_/useDaqDetailBinding-Dd5c4bep.mjs +70 -0
  281. package/.output/server/chunks/_/useDaqDetailBinding-Dd5c4bep.mjs.map +1 -0
  282. package/.output/server/chunks/_/useDaqDetailFrames-C2gvrOr6.mjs +79 -0
  283. package/.output/server/chunks/_/useDaqDetailFrames-C2gvrOr6.mjs.map +1 -0
  284. package/.output/server/chunks/_/useDaqDetailHistory-Bhht_iFw.mjs +176 -0
  285. package/.output/server/chunks/_/useDaqDetailHistory-Bhht_iFw.mjs.map +1 -0
  286. package/.output/server/chunks/_/useDaqDetailNode-BayXtr5W.mjs +99 -0
  287. package/.output/server/chunks/_/useDaqDetailNode-BayXtr5W.mjs.map +1 -0
  288. package/.output/server/chunks/_/useDaqDetailParams-D8d1l3_R.mjs +159 -0
  289. package/.output/server/chunks/_/useDaqDetailParams-D8d1l3_R.mjs.map +1 -0
  290. package/.output/server/chunks/_/useDaqFilters-TYucwywj.mjs +222 -0
  291. package/.output/server/chunks/_/useDaqFilters-TYucwywj.mjs.map +1 -0
  292. package/.output/server/chunks/_/useDaqNodeWindow-1DWj2H5G.mjs +90 -0
  293. package/.output/server/chunks/_/useDaqNodeWindow-1DWj2H5G.mjs.map +1 -0
  294. package/.output/server/chunks/_/useDaqOptimizations-o5hubsm8.mjs +136 -0
  295. package/.output/server/chunks/_/useDaqOptimizations-o5hubsm8.mjs.map +1 -0
  296. package/.output/server/chunks/_/useDaqStream-BCTOU87S.mjs +395 -0
  297. package/.output/server/chunks/_/useDaqStream-BCTOU87S.mjs.map +1 -0
  298. package/.output/server/chunks/_/useDaqTemplates-Fj64LHfn.mjs +187 -0
  299. package/.output/server/chunks/_/useDaqTemplates-Fj64LHfn.mjs.map +1 -0
  300. package/.output/server/chunks/_/useDashboardCharts-D45083s_.mjs +354 -0
  301. package/.output/server/chunks/_/useDashboardCharts-D45083s_.mjs.map +1 -0
  302. package/.output/server/chunks/_/useDashboardData-Cm_-daeI.mjs +153 -0
  303. package/.output/server/chunks/_/useDashboardData-Cm_-daeI.mjs.map +1 -0
  304. package/.output/server/chunks/_/useDcwAddNode-DaqIQSXN.mjs +219 -0
  305. package/.output/server/chunks/_/useDcwAddNode-DaqIQSXN.mjs.map +1 -0
  306. package/.output/server/chunks/_/useDcwCards-OhzgHbAI.mjs +67 -0
  307. package/.output/server/chunks/_/useDcwCards-OhzgHbAI.mjs.map +1 -0
  308. package/.output/server/chunks/_/useDcwDetailScope-CaWcaiBg.mjs +184 -0
  309. package/.output/server/chunks/_/useDcwDetailScope-CaWcaiBg.mjs.map +1 -0
  310. package/.output/server/chunks/_/useDcwDetailTemplates-CrOgqQMX.mjs +148 -0
  311. package/.output/server/chunks/_/useDcwDetailTemplates-CrOgqQMX.mjs.map +1 -0
  312. package/.output/server/chunks/_/useDcwFilter-RH511Ra2.mjs +71 -0
  313. package/.output/server/chunks/_/useDcwFilter-RH511Ra2.mjs.map +1 -0
  314. package/.output/server/chunks/_/useDcwLedger-Dg61GD1J.mjs +79 -0
  315. package/.output/server/chunks/_/useDcwLedger-Dg61GD1J.mjs.map +1 -0
  316. package/.output/server/chunks/_/useDcwLineMutations-CiurWUFF.mjs +137 -0
  317. package/.output/server/chunks/_/useDcwLineMutations-CiurWUFF.mjs.map +1 -0
  318. package/.output/server/chunks/_/useDcwLineRun-DTSemEZb.mjs +104 -0
  319. package/.output/server/chunks/_/useDcwLineRun-DTSemEZb.mjs.map +1 -0
  320. package/.output/server/chunks/_/useDcwParamApprovals-DpnD-yw0.mjs +121 -0
  321. package/.output/server/chunks/_/useDcwParamApprovals-DpnD-yw0.mjs.map +1 -0
  322. package/.output/server/chunks/_/useDcwProducts-CRAl59cn.mjs +93 -0
  323. package/.output/server/chunks/_/useDcwProducts-CRAl59cn.mjs.map +1 -0
  324. package/.output/server/chunks/_/useDcwQuery-Cyh_iGa9.mjs +98 -0
  325. package/.output/server/chunks/_/useDcwQuery-Cyh_iGa9.mjs.map +1 -0
  326. package/.output/server/chunks/_/useDcwQuickActions-BW5-5HFn.mjs +88 -0
  327. package/.output/server/chunks/_/useDcwQuickActions-BW5-5HFn.mjs.map +1 -0
  328. package/.output/server/chunks/_/useDcwRecipes-Ct9bWJwP.mjs +258 -0
  329. package/.output/server/chunks/_/useDcwRecipes-Ct9bWJwP.mjs.map +1 -0
  330. package/.output/server/chunks/_/useDcwStream-BerzMqxo.mjs +455 -0
  331. package/.output/server/chunks/_/useDcwStream-BerzMqxo.mjs.map +1 -0
  332. package/.output/server/chunks/_/useDcwTemplates-PMVeSLNP.mjs +91 -0
  333. package/.output/server/chunks/_/useDcwTemplates-PMVeSLNP.mjs.map +1 -0
  334. package/.output/server/chunks/_/useDcwWrites-CND_sZdb.mjs +140 -0
  335. package/.output/server/chunks/_/useDcwWrites-CND_sZdb.mjs.map +1 -0
  336. package/.output/server/chunks/_/useDeviceTwins-FB6rTm-6.mjs +128 -0
  337. package/.output/server/chunks/_/useDeviceTwins-FB6rTm-6.mjs.map +1 -0
  338. package/.output/server/chunks/_/useExpConfirmations-b0bE75Yq.mjs +107 -0
  339. package/.output/server/chunks/_/useExpConfirmations-b0bE75Yq.mjs.map +1 -0
  340. package/.output/server/chunks/_/useLocalTime-BJ_4vg1E.mjs +55 -0
  341. package/.output/server/chunks/_/useLocalTime-BJ_4vg1E.mjs.map +1 -0
  342. package/.output/server/chunks/_/useLogsFormat-B-o4MHy7.mjs +77 -0
  343. package/.output/server/chunks/_/useLogsFormat-B-o4MHy7.mjs.map +1 -0
  344. package/.output/server/chunks/_/useLogsManual-Cxka55hz.mjs +89 -0
  345. package/.output/server/chunks/_/useLogsManual-Cxka55hz.mjs.map +1 -0
  346. package/.output/server/chunks/_/useLogsQuery-DxMHc7M4.mjs +150 -0
  347. package/.output/server/chunks/_/useLogsQuery-DxMHc7M4.mjs.map +1 -0
  348. package/.output/server/chunks/_/useLogsScope-HuOiW-OR.mjs +83 -0
  349. package/.output/server/chunks/_/useLogsScope-HuOiW-OR.mjs.map +1 -0
  350. package/.output/server/chunks/_/useMonitorColumns-vVnt3r5Q.mjs +217 -0
  351. package/.output/server/chunks/_/useMonitorColumns-vVnt3r5Q.mjs.map +1 -0
  352. package/.output/server/chunks/_/useMonitorData-Bf3w2khj.mjs +135 -0
  353. package/.output/server/chunks/_/useMonitorData-Bf3w2khj.mjs.map +1 -0
  354. package/.output/server/chunks/_/useMonitorFormat-DsiVqWoa.mjs +91 -0
  355. package/.output/server/chunks/_/useMonitorFormat-DsiVqWoa.mjs.map +1 -0
  356. package/.output/server/chunks/_/useMonitorTerminal-Dj4QwRNW.mjs +71 -0
  357. package/.output/server/chunks/_/useMonitorTerminal-Dj4QwRNW.mjs.map +1 -0
  358. package/.output/server/chunks/_/useOperationsFeed-Bg35fcgt.mjs +195 -0
  359. package/.output/server/chunks/_/useOperationsFeed-Bg35fcgt.mjs.map +1 -0
  360. package/.output/server/chunks/_/useOpsLog-BEzBrMf4.mjs +149 -0
  361. package/.output/server/chunks/_/useOpsLog-BEzBrMf4.mjs.map +1 -0
  362. package/.output/server/chunks/_/useRecipeDispatchApprovals-CZfcMRYk.mjs +156 -0
  363. package/.output/server/chunks/_/useRecipeDispatchApprovals-CZfcMRYk.mjs.map +1 -0
  364. package/.output/server/chunks/_/useResponsive-BKDMGTHs.mjs.map +1 -0
  365. package/.output/server/chunks/_/useTeamActions-CmiuiQiG.mjs +79 -0
  366. package/.output/server/chunks/_/useTeamActions-CmiuiQiG.mjs.map +1 -0
  367. package/.output/server/chunks/_/useTeamAddMemberDialog-CMpzf0jO.mjs +84 -0
  368. package/.output/server/chunks/_/useTeamAddMemberDialog-CMpzf0jO.mjs.map +1 -0
  369. package/.output/server/chunks/_/useTeamCreateDialog-BnvjXWso.mjs +97 -0
  370. package/.output/server/chunks/_/useTeamCreateDialog-BnvjXWso.mjs.map +1 -0
  371. package/.output/server/chunks/_/useTeamDeployDialog-C0FOUYep.mjs +80 -0
  372. package/.output/server/chunks/_/useTeamDeployDialog-C0FOUYep.mjs.map +1 -0
  373. package/.output/server/chunks/_/useTeamDialogState-CFRUQxAf.mjs +82 -0
  374. package/.output/server/chunks/_/useTeamDialogState-CFRUQxAf.mjs.map +1 -0
  375. package/.output/server/chunks/_/useTeamPluginDialog-Do-07a47.mjs +103 -0
  376. package/.output/server/chunks/_/useTeamPluginDialog-Do-07a47.mjs.map +1 -0
  377. package/.output/server/chunks/_/useTeamsCatalog-ClG_gBI8.mjs +123 -0
  378. package/.output/server/chunks/_/useTeamsCatalog-ClG_gBI8.mjs.map +1 -0
  379. package/.output/server/chunks/_/useTokenClipboard-CwQpoFeP.mjs +72 -0
  380. package/.output/server/chunks/_/useTokenClipboard-CwQpoFeP.mjs.map +1 -0
  381. package/.output/server/chunks/_/useTokenCreate-C4g5eKd3.mjs +115 -0
  382. package/.output/server/chunks/_/useTokenCreate-C4g5eKd3.mjs.map +1 -0
  383. package/.output/server/chunks/_/useTokenRename-ClWrxpNk.mjs +87 -0
  384. package/.output/server/chunks/_/useTokenRename-ClWrxpNk.mjs.map +1 -0
  385. package/.output/server/chunks/_/useTokenReveal-C8n1Vt9t.mjs +118 -0
  386. package/.output/server/chunks/_/useTokenReveal-C8n1Vt9t.mjs.map +1 -0
  387. package/.output/server/chunks/_/useTokensList-CgiH2W1C.mjs +92 -0
  388. package/.output/server/chunks/_/useTokensList-CgiH2W1C.mjs.map +1 -0
  389. package/.output/server/chunks/_/useTownBus-D9SoIsAN.mjs.map +1 -0
  390. package/.output/server/chunks/_/useWorkbenchAuth-DSstfK5Z.mjs +141 -0
  391. package/.output/server/chunks/_/useWorkbenchAuth-DSstfK5Z.mjs.map +1 -0
  392. package/.output/server/chunks/_/useWorkbenchWorkspaces-l_0SUOzn.mjs +138 -0
  393. package/.output/server/chunks/_/useWorkbenchWorkspaces-l_0SUOzn.mjs.map +1 -0
  394. package/.output/server/chunks/_/useWorkshopApi-Bqe2FlsB.mjs +127 -0
  395. package/.output/server/chunks/_/useWorkshopApi-Bqe2FlsB.mjs.map +1 -0
  396. package/.output/server/chunks/_/useWorkshopWs-DP4MbZsb.mjs +1659 -0
  397. package/.output/server/chunks/_/useWorkshopWs-DP4MbZsb.mjs.map +1 -0
  398. package/.output/server/chunks/_/useWorkspaceAuth-CzDigJGl.mjs +60 -0
  399. package/.output/server/chunks/_/useWorkspaceAuth-CzDigJGl.mjs.map +1 -0
  400. package/.output/server/chunks/_/useWorkspaceChannels-BLtsS6-m.mjs +92 -0
  401. package/.output/server/chunks/_/useWorkspaceChannels-BLtsS6-m.mjs.map +1 -0
  402. package/.output/server/chunks/_/useWorkspacePanels-CTwREmq0.mjs +78 -0
  403. package/.output/server/chunks/_/useWorkspacePanels-CTwREmq0.mjs.map +1 -0
  404. package/.output/server/chunks/_/useWorkspaceShell-rQHWNNWJ.mjs +168 -0
  405. package/.output/server/chunks/_/useWorkspaceShell-rQHWNNWJ.mjs.map +1 -0
  406. package/.output/server/chunks/_/users-BM1ZzxPp.mjs +569 -0
  407. package/.output/server/chunks/_/users-BM1ZzxPp.mjs.map +1 -0
  408. package/.output/server/chunks/_/workshop-CUXCV3RH.mjs +546 -0
  409. package/.output/server/chunks/_/workshop-CUXCV3RH.mjs.map +1 -0
  410. package/.output/server/chunks/_/workspaces-CmW0cpOt.mjs.map +1 -0
  411. package/.output/server/chunks/routes/api/workshop/agent-tools/bindings/_id_.patch.mjs +1 -1
  412. package/.output/server/chunks/routes/api/workshop/agent-tools/bindings/grant.post.mjs +1 -1
  413. package/.output/server/chunks/routes/api/workshop/agent-tools/bindings/revoke.post.mjs +1 -1
  414. package/.output/server/chunks/routes/api/workshop/agent-tools/index.get.mjs +1 -1
  415. package/.output/server/chunks/routes/api/workshop/agent-tools/index.get.mjs.map +1 -1
  416. package/.output/server/chunks/routes/api/workshop/agent-tools/index.post.mjs +19 -0
  417. package/.output/server/chunks/routes/api/workshop/agent-tools/index.post.mjs.map +1 -1
  418. package/.output/server/chunks/routes/api/workshop/agent-tools/index2.get.mjs +1 -1
  419. package/.output/server/chunks/routes/api/workshop/agent-tools/invoke.post.mjs +1 -1
  420. package/.output/server/chunks/routes/api/workshop/agent-tools/list.get.mjs +1 -1
  421. package/.output/server/chunks/routes/api/workshop/aml/datasets/_id/preview.get.mjs +1 -1
  422. package/.output/server/chunks/routes/api/workshop/aml/datasets/_id_.delete.mjs +1 -1
  423. package/.output/server/chunks/routes/api/workshop/aml/datasets/_id_.get.mjs +1 -1
  424. package/.output/server/chunks/routes/api/workshop/aml/datasets/_id_.patch.mjs +1 -1
  425. package/.output/server/chunks/routes/api/workshop/aml/env/recheck.post.mjs +1 -1
  426. package/.output/server/chunks/routes/api/workshop/aml/env/uv.post.mjs +1 -1
  427. package/.output/server/chunks/routes/api/workshop/aml/env/venv.post.mjs +1 -1
  428. package/.output/server/chunks/routes/api/workshop/aml/index.get.mjs +1 -1
  429. package/.output/server/chunks/routes/api/workshop/aml/index.post.mjs +1 -1
  430. package/.output/server/chunks/routes/api/workshop/aml/index2.post.mjs +1 -1
  431. package/.output/server/chunks/routes/api/workshop/aml/index3.get.mjs +1 -1
  432. package/.output/server/chunks/routes/api/workshop/aml/index3.post.mjs +1 -1
  433. package/.output/server/chunks/routes/api/workshop/aml/index4.get.mjs +1 -1
  434. package/.output/server/chunks/routes/api/workshop/aml/index5.get.mjs +1 -1
  435. package/.output/server/chunks/routes/api/workshop/aml/index6.get.mjs +1 -1
  436. package/.output/server/chunks/routes/api/workshop/aml/index7.get.mjs +1 -1
  437. package/.output/server/chunks/routes/api/workshop/aml/jobs/_id/cancel.post.mjs +1 -1
  438. package/.output/server/chunks/routes/api/workshop/aml/jobs/_id/logs.get.mjs +1 -1
  439. package/.output/server/chunks/routes/api/workshop/aml/jobs/_id/retry.post.mjs +1 -1
  440. package/.output/server/chunks/routes/api/workshop/aml/jobs/_id_.delete.mjs +1 -1
  441. package/.output/server/chunks/routes/api/workshop/aml/jobs/_id_.get.mjs +1 -1
  442. package/.output/server/chunks/routes/api/workshop/aml/models/_id/predict.post.mjs +1 -1
  443. package/.output/server/chunks/routes/api/workshop/aml/models/_id/promote.post.mjs +1 -1
  444. package/.output/server/chunks/routes/api/workshop/aml/models/_id_.delete.mjs +1 -1
  445. package/.output/server/chunks/routes/api/workshop/aml/models/_id_.patch.mjs +1 -1
  446. package/.output/server/chunks/routes/api/workshop/aml/training-plans/_id/train.post.mjs +1 -1
  447. package/.output/server/chunks/routes/api/workshop/aml/training-plans/_id_.delete.mjs +1 -1
  448. package/.output/server/chunks/routes/api/workshop/aml/training-plans/_id_.patch.mjs +1 -1
  449. package/.output/server/chunks/routes/api/workshop/aml/twin/providers.get.mjs +1 -1
  450. package/.output/server/chunks/routes/api/workshop/analysis/_id_.delete.mjs +1 -1
  451. package/.output/server/chunks/routes/api/workshop/analysis/_id_.get.mjs +1 -1
  452. package/.output/server/chunks/routes/api/workshop/analysis/_id_.patch.mjs +1 -1
  453. package/.output/server/chunks/routes/api/workshop/channels/_id/execution-mode.patch.mjs +1 -1
  454. package/.output/server/chunks/routes/api/workshop/channels/_id/line.put.mjs +1 -1
  455. package/.output/server/chunks/routes/api/workshop/channels/_id/members/join.post.mjs +1 -1
  456. package/.output/server/chunks/routes/api/workshop/channels/_id/twin-profile.get.mjs +1 -1
  457. package/.output/server/chunks/routes/api/workshop/daq/_id/bind.post.mjs +1 -1
  458. package/.output/server/chunks/routes/api/workshop/daq/_id/bindings.put.mjs +1 -1
  459. package/.output/server/chunks/routes/api/workshop/daq/_id/frames/content.get.mjs +1 -1
  460. package/.output/server/chunks/routes/api/workshop/daq/_id/frames.get.mjs +1 -1
  461. package/.output/server/chunks/routes/api/workshop/daq/_id/ingest.post.mjs +1 -1
  462. package/.output/server/chunks/routes/api/workshop/daq/_id/samples.get.mjs +1 -1
  463. package/.output/server/chunks/routes/api/workshop/daq/_id/test.post.mjs +1 -1
  464. package/.output/server/chunks/routes/api/workshop/daq/_id_.delete.mjs +1 -1
  465. package/.output/server/chunks/routes/api/workshop/daq/_id_.patch.mjs +1 -1
  466. package/.output/server/chunks/routes/api/workshop/daq/alarms/_id/ack.post.mjs +1 -1
  467. package/.output/server/chunks/routes/api/workshop/daq/controller.post.mjs +1 -1
  468. package/.output/server/chunks/routes/api/workshop/daq/index2.post.mjs +1 -1
  469. package/.output/server/chunks/routes/api/workshop/daq/templates/_key_.delete.mjs +1 -1
  470. package/.output/server/chunks/routes/api/workshop/daq/templates/_key_.patch.mjs +1 -1
  471. package/.output/server/chunks/routes/api/workshop/daq/test-driver.post.mjs +1 -1
  472. package/.output/server/chunks/routes/api/workshop/dcw/_id/bind.post.mjs +1 -1
  473. package/.output/server/chunks/routes/api/workshop/dcw/_id/bindings.put.mjs +1 -1
  474. package/.output/server/chunks/routes/api/workshop/dcw/_id/read.post.mjs +1 -1
  475. package/.output/server/chunks/routes/api/workshop/dcw/_id/test.post.mjs +1 -1
  476. package/.output/server/chunks/routes/api/workshop/dcw/_id/write.post.mjs +1 -1
  477. package/.output/server/chunks/routes/api/workshop/dcw/_id_.delete.mjs +1 -1
  478. package/.output/server/chunks/routes/api/workshop/dcw/_id_.patch.mjs +1 -1
  479. package/.output/server/chunks/routes/api/workshop/dcw/controller.post.mjs +1 -1
  480. package/.output/server/chunks/routes/api/workshop/dcw/index.post.mjs +1 -1
  481. package/.output/server/chunks/routes/api/workshop/dcw/index2.get.mjs +1 -1
  482. package/.output/server/chunks/routes/api/workshop/dcw/index2.post.mjs +1 -1
  483. package/.output/server/chunks/routes/api/workshop/dcw/index3.post.mjs +1 -1
  484. package/.output/server/chunks/routes/api/workshop/dcw/index4.post.mjs +1 -1
  485. package/.output/server/chunks/routes/api/workshop/dcw/index5.get.mjs +1 -1
  486. package/.output/server/chunks/routes/api/workshop/dcw/index6.get.mjs +1 -1
  487. package/.output/server/chunks/routes/api/workshop/dcw/index7.get.mjs +1 -1
  488. package/.output/server/chunks/routes/api/workshop/dcw/journal/node/_nodeId/rollback.post.mjs +1 -1
  489. package/.output/server/chunks/routes/api/workshop/dcw/line/query.get.mjs +1 -1
  490. package/.output/server/chunks/routes/api/workshop/dcw/lines/_id/start.post.mjs +1 -1
  491. package/.output/server/chunks/routes/api/workshop/dcw/lines/_id/stop.post.mjs +1 -1
  492. package/.output/server/chunks/routes/api/workshop/dcw/lines/_id_.delete.mjs +1 -1
  493. package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id/judge.post.mjs +1 -1
  494. package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id/rollback.post.mjs +1 -1
  495. package/.output/server/chunks/routes/api/workshop/dcw/params/_id/read.post.mjs +1 -1
  496. package/.output/server/chunks/routes/api/workshop/dcw/params/_id/write.post.mjs +1 -1
  497. package/.output/server/chunks/routes/api/workshop/dcw/params/_id_.delete.mjs +1 -1
  498. package/.output/server/chunks/routes/api/workshop/dcw/params/_id_.patch.mjs +1 -1
  499. package/.output/server/chunks/routes/api/workshop/dcw/products/_id_.delete.mjs +1 -1
  500. package/.output/server/chunks/routes/api/workshop/dcw/products/_id_.patch.mjs +1 -1
  501. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/apply.post.mjs +1 -1
  502. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/mark-good.post.mjs +1 -1
  503. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/revert.post.mjs +1 -1
  504. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/rollback-good.post.mjs +1 -1
  505. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id_.delete.mjs +1 -1
  506. package/.output/server/chunks/routes/api/workshop/dcw/recipes/index.patch.mjs +1 -1
  507. package/.output/server/chunks/routes/api/workshop/dcw/runs/_id/close.post.mjs +1 -1
  508. package/.output/server/chunks/routes/api/workshop/dcw/runs/_id/data.get.mjs +1 -1
  509. package/.output/server/chunks/routes/api/workshop/dcw/runs/_id/rollback.post.mjs +1 -1
  510. package/.output/server/chunks/routes/api/workshop/dcw/test-driver.post.mjs +1 -1
  511. package/.output/server/chunks/routes/api/workshop/device-twins/_id_.delete.mjs +1 -1
  512. package/.output/server/chunks/routes/api/workshop/device-twins/_id_.patch.mjs +1 -1
  513. package/.output/server/chunks/routes/api/workshop/eda/index6.get.mjs +1 -1
  514. package/.output/server/chunks/routes/api/workshop/eda/index6.post.mjs +1 -1
  515. package/.output/server/chunks/routes/api/workshop/eda/vm/predict.post.mjs +1 -1
  516. package/.output/server/chunks/routes/api/workshop/exp/confirmations/_id/decide.post.mjs +1 -1
  517. package/.output/server/chunks/routes/api/workshop/exp/index.get.mjs +1 -1
  518. package/.output/server/chunks/routes/api/workshop/index2.get.mjs +1 -1
  519. package/.output/server/chunks/routes/api/workshop/index2.post.mjs +1 -1
  520. package/.output/server/chunks/routes/api/workshop/index3.get.mjs +1 -1
  521. package/.output/server/chunks/routes/api/workshop/index4.post.mjs +1 -1
  522. package/.output/server/chunks/routes/api/workshop/index5.post.mjs +1 -1
  523. package/.output/server/chunks/routes/api/workshop/index6.get.mjs +1 -1
  524. package/.output/server/chunks/routes/api/workshop/index6.post.mjs +1 -1
  525. package/.output/server/chunks/routes/api/workshop/index7.get.mjs +1 -1
  526. package/.output/server/chunks/routes/api/workshop/index7.post.mjs +18 -6
  527. package/.output/server/chunks/routes/api/workshop/index7.post.mjs.map +1 -1
  528. package/.output/server/chunks/routes/api/workshop/optimization/index2.mjs +1 -1
  529. package/.output/server/chunks/routes/api/workshop/optimization/profiles/_id/publish.post.mjs +1 -1
  530. package/.output/server/chunks/routes/api/workshop/process-model/datasets.post.mjs +1 -1
  531. package/.output/server/chunks/routes/api/workshop/process-model/eligibility.mjs +1 -1
  532. package/.output/server/chunks/routes/api/workshop/process-model/experiments.mjs +1 -1
  533. package/.output/server/chunks/routes/api/workshop/process-model/index.mjs +1 -1
  534. package/.output/server/chunks/routes/api/workshop/process-model/train.post.mjs +1 -1
  535. package/.output/server/chunks/routes/renderer.mjs +1 -1
  536. package/.output/server/chunks/routes/renderer.mjs.map +1 -1
  537. package/.output/server/chunks/virtual/entry.mjs +394 -376
  538. package/.output/server/chunks/virtual/entry.mjs.map +1 -1
  539. package/.output/server/chunks/virtual/precomputed.mjs +1 -1
  540. package/.output/server/chunks/virtual/precomputed.mjs.map +1 -1
  541. package/.output/server/index.mjs +1 -1
  542. package/.output/server/package.json +1 -1
  543. package/README-zh.md +4 -3
  544. package/README.md +13 -8
  545. package/app/components/AwLogo.vue +75 -75
  546. package/app/components/aml/AmlDatasetFormModal.vue +279 -279
  547. package/app/components/aml/AmlDatasetTable.vue +319 -319
  548. package/app/components/aml/AmlExperimentsTable.vue +142 -142
  549. package/app/components/aml/AmlInfraBanner.vue +23 -23
  550. package/app/components/aml/AmlJobsTable.vue +248 -248
  551. package/app/components/aml/AmlOverviewBar.vue +62 -62
  552. package/app/components/aml/AmlPageHeader.vue +47 -47
  553. package/app/components/aml/AmlPredictConsole.vue +201 -201
  554. package/app/components/app-header/HitlBell.vue +423 -423
  555. package/app/components/daq/DaqAddNodeModal.vue +209 -209
  556. package/app/components/daq/DaqAlarmBar.vue +46 -46
  557. package/app/components/daq/DaqControlCard.vue +159 -159
  558. package/app/components/daq/DaqInfraBanner.vue +31 -31
  559. package/app/components/daq/DaqLineBanner.vue +47 -47
  560. package/app/components/daq/DaqNodePanel.vue +396 -396
  561. package/app/components/daq/DaqOptPanel.vue +197 -197
  562. package/app/components/daq/DaqTemplateModal.vue +246 -246
  563. package/app/components/dashboard/DashboardGaugeBand.vue +78 -78
  564. package/app/components/dashboard/DashboardHero.vue +209 -209
  565. package/app/components/dashboard/DashboardLineStatePanel.vue +78 -78
  566. package/app/components/dashboard/DashboardNodeStatePanel.vue +46 -46
  567. package/app/components/dashboard/DashboardPipelinePanel.vue +46 -46
  568. package/app/components/dashboard/DashboardTrendPanel.vue +83 -83
  569. package/app/components/dashboard/DashboardWritePanel.vue +52 -52
  570. package/app/components/dcw/DcwCreateLineModal.vue +105 -105
  571. package/app/components/dcw/DcwDeleteLineModal.vue +73 -73
  572. package/app/components/dcw/DcwDetailTemplateModal.vue +238 -238
  573. package/app/components/dcw/DcwLedgerCard.vue +160 -160
  574. package/app/components/dcw/DcwMesArtifacts.vue +140 -140
  575. package/app/components/dcw/DcwProductCreateModal.vue +113 -113
  576. package/app/components/dcw/DcwRecipeDispatchHistoryModal.vue +244 -244
  577. package/app/components/dcw/DcwRecipeEditModal.vue +399 -399
  578. package/app/components/dcw/DcwRecipeHistoryModal.vue +165 -165
  579. package/app/components/dcw/DcwRunDataModal.vue +191 -191
  580. package/app/components/dcw/DcwTemplateModal.vue +227 -227
  581. package/app/components/dcw/DcwWriteHistoryCard.vue +96 -96
  582. package/app/components/dcw/ExpConfirmCard.vue +103 -103
  583. package/app/components/dcw/RecipeDispatchApprovalCard.vue +330 -330
  584. package/app/components/logs/LogsEventTable.vue +36 -3
  585. package/app/components/logs/LogsManualModal.vue +23 -1
  586. package/app/components/logs/LogsPageHead.vue +122 -71
  587. package/app/components/monitor/MonitorAgentTable.vue +143 -143
  588. package/app/components/monitor/MonitorChannelTable.vue +80 -80
  589. package/app/components/monitor/MonitorLoginGate.vue +24 -24
  590. package/app/components/monitor/MonitorPageHead.vue +92 -92
  591. package/app/components/monitor/MonitorProcessTable.vue +159 -159
  592. package/app/components/ontology/OntologyGraph.vue +356 -356
  593. package/app/components/operations/OperationsFilterCard.vue +164 -164
  594. package/app/components/operations/OperationsPageHead.vue +47 -47
  595. package/app/components/tokens/TokenCreateModal.vue +42 -42
  596. package/app/components/tokens/TokenOnceModal.vue +164 -164
  597. package/app/components/tokens/TokenRenameModal.vue +40 -40
  598. package/app/components/tokens/TokensPageHead.vue +76 -76
  599. package/app/components/workshop/A2aRpcDebugger.vue +237 -237
  600. package/app/components/workshop/AgentInspectorDrawer.vue +424 -424
  601. package/app/components/workshop/AgentLanesView.vue +278 -278
  602. package/app/components/workshop/ArtifactCard.vue +120 -120
  603. package/app/components/workshop/AssetLibrary.vue +452 -452
  604. package/app/components/workshop/ChatMemberPanel.vue +556 -556
  605. package/app/components/workshop/CommandPalette.vue +270 -270
  606. package/app/components/workshop/Composer.vue +540 -540
  607. package/app/components/workshop/DaqTemplateIcon.vue +33 -33
  608. package/app/components/workshop/DeviceTwinPanel.vue +167 -167
  609. package/app/components/workshop/FileSelectorModal.vue +188 -188
  610. package/app/components/workshop/InspectorPanel.vue +301 -301
  611. package/app/components/workshop/PluginSlot.vue +120 -120
  612. package/app/components/workshop/TranscriptTimeline.vue +223 -223
  613. package/app/components/workshop/agents/AgentTemplateEditModal.vue +139 -139
  614. package/app/components/workshop/blocks/ClusterArtifact.vue +61 -61
  615. package/app/components/workshop/blocks/ClusterError.vue +85 -85
  616. package/app/components/workshop/blocks/ClusterLife.vue +87 -87
  617. package/app/components/workshop/blocks/ClusterMember.vue +95 -95
  618. package/app/components/workshop/blocks/ClusterMemory.vue +84 -84
  619. package/app/components/workshop/blocks/ClusterOther.vue +67 -67
  620. package/app/components/workshop/blocks/ClusterStatus.vue +149 -149
  621. package/app/components/workshop/blocks/ClusterTool.vue +176 -176
  622. package/app/components/workshop/blocks/EventBlockAvatar.vue +114 -114
  623. package/app/components/workshop/blocks/EventBlockHead.vue +232 -232
  624. package/app/components/workshop/composer/ComposerToolbar.vue +278 -278
  625. package/app/components/workshop/composer/MentionMenu.vue +135 -135
  626. package/app/components/workshop/composer/ReplyChip.vue +65 -65
  627. package/app/components/workshop/composer/StatusChip.vue +171 -171
  628. package/app/components/workshop/console/Dock.vue +71 -71
  629. package/app/components/workshop/console/LeftPane.vue +84 -84
  630. package/app/components/workshop/device-twin/DeviceTwinCard.vue +265 -265
  631. package/app/components/workshop/device-twin/DeviceTwinDcwSection.vue +203 -203
  632. package/app/components/workshop/lanes/AddMemberModal.vue +270 -270
  633. package/app/components/workshop/lanes/EditMemberModal.vue +106 -106
  634. package/app/components/workshop/lanes/LanesToolbar.vue +97 -97
  635. package/app/components/workshop/session-list/MountChannelModal.vue +124 -124
  636. package/app/components/workshop/session-list/SaveTemplateModal.vue +93 -93
  637. package/app/components/workshop/task-board/Card.vue +172 -172
  638. package/app/components/workshop/task-board/Column.vue +151 -151
  639. package/app/components/workshop/task-board/List.vue +157 -157
  640. package/app/components/workshop/task-board/StatusMenu.vue +88 -88
  641. package/app/components/workshop/teams/TeamAddMemberModal.vue +53 -53
  642. package/app/components/workshop/teams/TeamCreateModal.vue +94 -94
  643. package/app/components/workshop/teams/TeamDeployModal.vue +40 -40
  644. package/app/components/workshop/teams/TeamPluginModal.vue +119 -119
  645. package/app/components/workshop/terminal/OmpTerminalPanel.vue +270 -270
  646. package/app/components/workshop/terminal/TerminalHitlCard.vue +170 -170
  647. package/app/components/workshop/town/TownScene.ts +466 -466
  648. package/app/components/workshop/town/TownView.vue +561 -561
  649. package/app/components/workshop/town/components/AutoModeConfirmModal.vue +94 -94
  650. package/app/components/workshop/town/components/TownAgentBindings.vue +417 -405
  651. package/app/components/workshop/town/components/TownAgentInspector.vue +554 -554
  652. package/app/components/workshop/town/components/TownAlarmList.vue +147 -147
  653. package/app/components/workshop/town/components/TownBoundaryPanel.vue +350 -350
  654. package/app/components/workshop/town/components/TownCalloutLayer.vue +147 -147
  655. package/app/components/workshop/town/components/TownChannelDock.vue +116 -116
  656. package/app/components/workshop/town/components/TownControlDock.vue +405 -405
  657. package/app/components/workshop/town/components/TownDaqNodeInspector.vue +345 -345
  658. package/app/components/workshop/town/components/TownDaqTree.vue +366 -366
  659. package/app/components/workshop/town/components/TownDcwBindSection.vue +473 -473
  660. package/app/components/workshop/town/components/TownDcwNodeInspector.vue +185 -185
  661. package/app/components/workshop/town/components/TownDcwTree.vue +280 -280
  662. package/app/components/workshop/town/components/TownDeviceBindings.vue +394 -394
  663. package/app/components/workshop/town/components/TownDeviceTransform.vue +248 -248
  664. package/app/components/workshop/town/components/TownEventList.vue +120 -120
  665. package/app/components/workshop/town/components/TownHealthBody.vue +100 -100
  666. package/app/components/workshop/town/components/TownKpiStrip.vue +207 -207
  667. package/app/components/workshop/town/components/TownLeftRail.vue +308 -308
  668. package/app/components/workshop/town/components/TownLoadingMask.vue +61 -61
  669. package/app/components/workshop/town/components/TownNavMap.vue +154 -154
  670. package/app/components/workshop/town/components/TownRightRail.vue +543 -543
  671. package/app/components/workshop/town/components/TownStage.vue +281 -281
  672. package/app/components/workshop/town/components/TownStageTop.vue +238 -238
  673. package/app/components/workshop/town/components/TownStatusBar.vue +108 -108
  674. package/app/components/workshop/town/components/TownTopNav.vue +367 -367
  675. package/app/components/workshop/town/components/TownTrendDock.vue +178 -178
  676. package/app/components/workshop/town/scene/town-scene-agents.ts +254 -254
  677. package/app/components/workshop/town/scene/town-scene-behavior.ts +194 -194
  678. package/app/components/workshop/town/scene/town-scene-bubbles.ts +96 -96
  679. package/app/components/workshop/town/scene/town-scene-core.ts +158 -158
  680. package/app/components/workshop/town/scene/town-scene-models.ts +109 -109
  681. package/app/components/workshop/town/scene/town-scene-visuals.ts +279 -279
  682. package/app/components/workshop/town/scene/town-scene3d-agents.ts +308 -308
  683. package/app/components/workshop/town/scene/town-scene3d-blocks.ts +297 -297
  684. package/app/components/workshop/town/scene/town-scene3d-bubbles.ts +281 -281
  685. package/app/components/workshop/town/scene/town-scene3d-camera.ts +282 -282
  686. package/app/components/workshop/town/scene/town-scene3d-devices.ts +433 -433
  687. package/app/components/workshop/town/scene/town-scene3d-editing.ts +490 -490
  688. package/app/components/workshop/town/scene/town-scene3d-events.ts +173 -173
  689. package/app/components/workshop/town/scene/town-scene3d-factory.ts +412 -412
  690. package/app/components/workshop/town/scene/town-scene3d-hud.ts +110 -110
  691. package/app/components/workshop/town/scene/town-scene3d-lifecycle.ts +144 -144
  692. package/app/components/workshop/town/scene/town-scene3d-links.ts +141 -141
  693. package/app/components/workshop/town/scene/town-scene3d-loop.ts +286 -286
  694. package/app/components/workshop/town/scene/town-scene3d-models.ts +154 -154
  695. package/app/components/workshop/town/scene/town-scene3d-nodes.ts +562 -562
  696. package/app/components/workshop/town/scene/town-scene3d-ranges.ts +273 -273
  697. package/app/components/workshop/town/scene/town-scene3d-renderer.ts +320 -320
  698. package/app/components/workshop/town/scene/town-scene3d-selection.ts +257 -257
  699. package/app/components/workshop/town/scene/town-scene3d-types.ts +264 -264
  700. package/app/components/workshop/transcript/TranscriptBlockList.vue +68 -68
  701. package/app/components/workshop/transcript/TranscriptEarlierPager.vue +81 -81
  702. package/app/components/workshop/transcript/TranscriptFilterBar.vue +126 -126
  703. package/app/components/workshop/workbench/CreateWorkspaceModal.vue +36 -36
  704. package/app/components/workshop/workbench/WorkspaceEmpty.vue +56 -56
  705. package/app/composables/useResponsive.ts +88 -88
  706. package/app/composables/workshop/device-twin-types.ts +29 -29
  707. package/app/composables/workshop/event-blocks/attention.ts +58 -58
  708. package/app/composables/workshop/event-blocks/classify.ts +44 -44
  709. package/app/composables/workshop/event-blocks/clusterer.ts +231 -231
  710. package/app/composables/workshop/event-blocks/fold-stream.ts +45 -45
  711. package/app/composables/workshop/event-blocks/markdown.ts +81 -81
  712. package/app/composables/workshop/event-blocks/mentions.ts +49 -49
  713. package/app/composables/workshop/event-blocks/text-utils.ts +100 -100
  714. package/app/composables/workshop/event-blocks/types.ts +40 -40
  715. package/app/composables/workshop/town/town-relay-props.ts +231 -231
  716. package/app/composables/workshop/town/town-view-types.ts +145 -145
  717. package/app/composables/workshop/town/useTownAgentBindings.ts +183 -182
  718. package/app/composables/workshop/town/useTownAgentChat.ts +203 -203
  719. package/app/composables/workshop/town/useTownAlarms.ts +36 -36
  720. package/app/composables/workshop/town/useTownCallouts.ts +174 -174
  721. package/app/composables/workshop/town/useTownChannels.ts +220 -220
  722. package/app/composables/workshop/town/useTownHealth.ts +66 -66
  723. package/app/composables/workshop/town/useTownHudTickers.ts +77 -77
  724. package/app/composables/workshop/town/useTownLayout.ts +277 -277
  725. package/app/composables/workshop/town/useTownNavMap.ts +301 -301
  726. package/app/composables/workshop/town/useTownNodeBindings.ts +345 -345
  727. package/app/composables/workshop/town/useTownPanelDrag.ts +91 -91
  728. package/app/composables/workshop/town/useTownRailData.ts +421 -421
  729. package/app/composables/workshop/town/useTownSceneControl.ts +92 -92
  730. package/app/composables/workshop/town/useTownSceneInput.ts +275 -275
  731. package/app/composables/workshop/town/useTownSceneRuntime.ts +390 -390
  732. package/app/composables/workshop/town/useTownSheets.ts +41 -41
  733. package/app/composables/workshop/town/useTownTrends.ts +93 -93
  734. package/app/composables/workshop/useChannelList.ts +88 -88
  735. package/app/composables/workshop/useChannelTerminals.ts +65 -65
  736. package/app/composables/workshop/useComposerMentions.ts +130 -130
  737. package/app/composables/workshop/useDcwStream.ts +377 -374
  738. package/app/composables/workshop/useDeviceTwinDcwWrite.ts +77 -77
  739. package/app/composables/workshop/useDeviceTwinPanel.ts +56 -56
  740. package/app/composables/workshop/useEscClose.ts +44 -44
  741. package/app/composables/workshop/useEventBlockView.ts +159 -159
  742. package/app/composables/workshop/useEventBlocks.ts +33 -33
  743. package/app/composables/workshop/useHitlAnswer.ts +184 -184
  744. package/app/composables/workshop/useLaneWidths.ts +27 -27
  745. package/app/composables/workshop/useOmpTerminalSession.ts +424 -424
  746. package/app/composables/workshop/useOpsLog.ts +1 -1
  747. package/app/composables/workshop/usePluginAdmin.ts +152 -152
  748. package/app/composables/workshop/usePluginPanels.ts +72 -72
  749. package/app/composables/workshop/useRuntimeConfigDraft.ts +118 -118
  750. package/app/composables/workshop/useSettingsGroups.ts +243 -243
  751. package/app/composables/workshop/useTaskBoardColumns.ts +47 -47
  752. package/app/composables/workshop/useTerminalRenderer.ts +308 -308
  753. package/app/composables/workshop/useTranscriptEnterStage.ts +48 -48
  754. package/app/composables/workshop/useTranscriptHistory.ts +52 -52
  755. package/app/composables/workshop/useTranscriptScroll.ts +113 -113
  756. package/app/composables/workshop/useVisibleInterval.ts +42 -42
  757. package/app/composables/workshop/useWorkshopWs.ts +265 -265
  758. package/app/config/index.ts +1 -1
  759. package/app/middleware/locale-cookie.global.ts +22 -22
  760. package/app/pages/aml/api.ts +6 -6
  761. package/app/pages/aml/composables/useAmlDatasets.ts +38 -38
  762. package/app/pages/aml/composables/useAmlEntities.ts +57 -57
  763. package/app/pages/aml/composables/useAmlEnv.ts +191 -191
  764. package/app/pages/aml/composables/useAmlExperiments.ts +45 -45
  765. package/app/pages/aml/composables/useAmlFormat.ts +44 -44
  766. package/app/pages/aml/composables/useAmlJobs.ts +131 -131
  767. package/app/pages/aml/composables/useAmlModels.ts +56 -56
  768. package/app/pages/aml/composables/useAmlNotes.ts +47 -47
  769. package/app/pages/aml/composables/useAmlPredict.ts +93 -93
  770. package/app/pages/aml/constants.ts +63 -63
  771. package/app/pages/aml/index.vue +236 -236
  772. package/app/pages/composables/useDashboardCharts.ts +192 -192
  773. package/app/pages/composables/useDashboardData.ts +144 -144
  774. package/app/pages/daq/composables/useDaqAddNode.ts +126 -126
  775. package/app/pages/daq/composables/useDaqDetailBinding.ts +29 -29
  776. package/app/pages/daq/composables/useDaqDetailFrames.ts +42 -42
  777. package/app/pages/daq/composables/useDaqDetailNode.ts +53 -53
  778. package/app/pages/daq/composables/useDaqDetailParams.ts +138 -138
  779. package/app/pages/daq/composables/useDaqFilters.ts +187 -187
  780. package/app/pages/daq/composables/useDaqNodeWindow.ts +86 -86
  781. package/app/pages/daq/composables/useDaqOptimizations.ts +99 -99
  782. package/app/pages/daq/composables/useDaqTemplates.ts +152 -152
  783. package/app/pages/daq/index.vue +260 -260
  784. package/app/pages/dcw/composables/useDcwCards.ts +27 -27
  785. package/app/pages/dcw/composables/useDcwDetailScope.ts +145 -145
  786. package/app/pages/dcw/composables/useDcwDetailTemplates.ts +94 -94
  787. package/app/pages/dcw/composables/useDcwFilter.ts +29 -29
  788. package/app/pages/dcw/composables/useDcwLedger.ts +34 -34
  789. package/app/pages/dcw/composables/useDcwLineMutations.ts +115 -115
  790. package/app/pages/dcw/composables/useDcwLineRun.ts +60 -60
  791. package/app/pages/dcw/composables/useDcwProducts.ts +54 -54
  792. package/app/pages/dcw/composables/useDcwQuery.ts +68 -68
  793. package/app/pages/dcw/composables/useDcwQuickActions.ts +47 -47
  794. package/app/pages/dcw/composables/useDcwRecipes.ts +256 -256
  795. package/app/pages/dcw/composables/useDcwTemplates.ts +50 -50
  796. package/app/pages/dcw/index.vue +195 -195
  797. package/app/pages/dcw/types.ts +9 -9
  798. package/app/pages/index.vue +126 -126
  799. package/app/pages/logs/composables/useLogsFormat.ts +43 -43
  800. package/app/pages/logs/composables/useLogsManual.ts +3 -0
  801. package/app/pages/logs/composables/useLogsScope.ts +39 -39
  802. package/app/pages/logs/index.vue +34 -1
  803. package/app/pages/monitor/types.ts +61 -61
  804. package/app/pages/operations.vue +61 -61
  805. package/app/pages/permissions/index.vue +369 -369
  806. package/app/pages/tokens/composables/useTokenClipboard.ts +33 -33
  807. package/app/pages/tokens/composables/useTokenCreate.ts +93 -93
  808. package/app/pages/tokens/composables/useTokenRename.ts +54 -54
  809. package/app/pages/tokens/composables/useTokenReveal.ts +84 -84
  810. package/app/pages/tokens/composables/useTokensList.ts +60 -60
  811. package/app/pages/tokens.vue +111 -111
  812. package/app/pages/tools/index.vue +98 -98
  813. package/app/pages/workshop/agents.vue +130 -130
  814. package/app/pages/workshop/composables/useAgentHarnessOptions.ts +59 -59
  815. package/app/pages/workshop/composables/useAgentTemplateActions.ts +42 -42
  816. package/app/pages/workshop/composables/useAgentTemplateDialogState.ts +24 -24
  817. package/app/pages/workshop/composables/useAgentTemplateForm.ts +88 -88
  818. package/app/pages/workshop/composables/useAgentTemplatesCatalog.ts +92 -92
  819. package/app/pages/workshop/composables/useTeamActions.ts +44 -44
  820. package/app/pages/workshop/composables/useTeamAddMemberDialog.ts +49 -49
  821. package/app/pages/workshop/composables/useTeamCreateDialog.ts +67 -67
  822. package/app/pages/workshop/composables/useTeamDeployDialog.ts +49 -49
  823. package/app/pages/workshop/composables/useTeamDialogState.ts +46 -46
  824. package/app/pages/workshop/composables/useTeamPluginDialog.ts +72 -72
  825. package/app/pages/workshop/composables/useTeamsCatalog.ts +100 -100
  826. package/app/pages/workshop/composables/useWorkbenchWorkspaces.ts +123 -123
  827. package/app/pages/workshop/composables/useWorkspaceAuth.ts +31 -31
  828. package/app/pages/workshop/composables/useWorkspaceChannels.ts +62 -62
  829. package/app/pages/workshop/composables/useWorkspaceShell.ts +136 -136
  830. package/app/pages/workshop/schedules.vue +553 -553
  831. package/app/pages/workshop/w/[wsId].vue +221 -221
  832. package/app/plugins/aw-plugins.client.ts +213 -213
  833. package/app/plugins/esc-close.client.ts +31 -31
  834. package/app/stores/workshop/hitl.ts +183 -183
  835. package/app/stores/workshop/narrow-fetch.ts +23 -23
  836. package/app/utils/api-error.ts +75 -75
  837. package/app/utils/builtin-catalog.ts +104 -104
  838. package/app/utils/chart-trend.ts +97 -97
  839. package/app/utils/dcw-driver-badge.ts +16 -16
  840. package/app/utils/dcw-recipe-form.ts +26 -26
  841. package/cli/commands/tui.mjs +28 -28
  842. package/cli/commands/update.mjs +124 -124
  843. package/cli/core/child-lifecycle.mjs +136 -136
  844. package/cli/core/meta.mjs +38 -38
  845. package/cli/core/post-build.mjs +96 -96
  846. package/config.yml +1 -1
  847. package/docs/cli.en.md +2 -2
  848. package/docs/cli.md +2 -2
  849. package/docs/mcp.en.md +27 -27
  850. package/docs/multi-harness-architecture.md +248 -248
  851. package/docs/plugins.en.md +1 -1
  852. package/docs/plugins.md +1 -1
  853. package/docs/sdk.en.md +1 -1
  854. package/docs/sdk.md +1 -1
  855. package/docs/tui.md +43 -43
  856. package/i18n/dicts/_en.json +1551 -1551
  857. package/i18n/dicts/_en2.json +300 -300
  858. package/i18n/dicts/_en4.json +114 -114
  859. package/i18n/dicts/agentLanesView.json +61 -61
  860. package/i18n/dicts/appHeader.json +17 -17
  861. package/i18n/dicts/channelSessionList.json +51 -51
  862. package/i18n/dicts/chat.json +79 -79
  863. package/i18n/dicts/clusterTool.json +4 -4
  864. package/i18n/dicts/composer.json +38 -38
  865. package/i18n/dicts/ctpl.json +37 -37
  866. package/i18n/dicts/dcwDetail.json +219 -219
  867. package/i18n/dicts/lineOps.json +14 -14
  868. package/i18n/dicts/multiChannelView.json +13 -13
  869. package/i18n/dicts/notifications.json +13 -13
  870. package/i18n/dicts/taskInspectorDrawer.json +25 -25
  871. package/i18n/dicts/teamPlugins.json +10 -10
  872. package/i18n/dicts/townView.json +211 -209
  873. package/i18n/locales/en.ts +9 -0
  874. package/i18n/locales/zh-CN.ts +9 -0
  875. package/mcp/discovery.mjs +227 -227
  876. package/package.json +3 -1
  877. package/public/favicon.svg +14 -14
  878. package/public/robots.txt +3 -3
  879. package/scripts/_audit/_live-mqtt-e2e-20261028.mjs +219 -219
  880. package/scripts/_audit/audit-harness-adapters.md +664 -664
  881. package/scripts/_audit/aw-mcp-live-e2e.mjs +293 -293
  882. package/scripts/_audit/bump-version.mjs +51 -51
  883. package/scripts/_audit/detached-instance.mjs +112 -112
  884. package/scripts/_audit/detached-start.mjs +103 -103
  885. package/scripts/_audit/eda-ui-fix-acceptance.mjs +212 -212
  886. package/scripts/_audit/guard-upstream-liveness.mjs +104 -104
  887. package/scripts/_audit/http-api-authz-audit.md +657 -657
  888. package/scripts/_audit/kb-team-mock-e2e.mjs +146 -146
  889. package/scripts/_audit/kb-team-omp-e2e.mjs +229 -229
  890. package/scripts/_audit/prompt-injection-probe.mts +76 -76
  891. package/scripts/_audit/run.mjs +21 -21
  892. package/scripts/_audit/runtime-audit.md +716 -716
  893. package/scripts/_audit/skills-guided-e2e.mjs +316 -316
  894. package/scripts/_audit/stability-soak.mjs +252 -252
  895. package/scripts/_audit/stubs/nuxt-imports.mjs +67 -67
  896. package/scripts/_audit/ts-register-hook.mjs +12 -12
  897. package/scripts/_audit/ts-resolve-hook.mjs +96 -96
  898. package/scripts/_aw0746-stage12.mjs +94 -94
  899. package/scripts/_aw0746-stage34.mjs +136 -136
  900. package/scripts/_aw0746-stage6b-train-sweep.mjs +145 -145
  901. package/scripts/_aw0746-stage6c-jobsmoke.mjs +69 -69
  902. package/scripts/_dbg-configroot-audit.mjs +86 -86
  903. package/scripts/_dbg-daq-intervals-func.mjs +115 -115
  904. package/scripts/_dbg-perms-e2e.mjs +142 -142
  905. package/scripts/_dbg-protocol-matrix.mjs +462 -462
  906. package/scripts/_dbg-render-regression.mjs +193 -193
  907. package/scripts/_dbg-schedule-e2e.mjs +262 -262
  908. package/scripts/_e2e-ui-functional.mjs +371 -371
  909. package/scripts/_lib-aml-python-run.mjs +17 -17
  910. package/scripts/_plc-sim-detached.cjs +22 -22
  911. package/scripts/_provision-injection-line.mjs +39 -39
  912. package/scripts/_run-matrix.ps1 +53 -53
  913. package/scripts/_sweep-button-contrast.mjs +87 -87
  914. package/scripts/acceptance-aml-hybrid-e2e.ts +396 -396
  915. package/scripts/acceptance-aml-hybrid-live.mjs +93 -93
  916. package/scripts/acceptance-aml-model-identity.ts +137 -137
  917. package/scripts/agent-daq-isolation-e2e.mjs +91 -91
  918. package/scripts/api-contract-smoke.mjs +126 -126
  919. package/scripts/ask-hitl-e2e.mjs +96 -96
  920. package/scripts/aw-expose.mjs +159 -159
  921. package/scripts/channel-interaction-smoke.mjs +80 -80
  922. package/scripts/data-studio-ui-e2e.mjs +163 -163
  923. package/scripts/demo-group-chat-all-real.ts +279 -279
  924. package/scripts/dev-modbus-simulator.mjs +55 -55
  925. package/scripts/docs-shots.mjs +36 -36
  926. package/scripts/e2e-agentteam-chat.mjs +473 -473
  927. package/scripts/e2e-agentteam-real-triage.mjs +421 -421
  928. package/scripts/e2e-aml-decoupled.mjs +162 -162
  929. package/scripts/e2e-analysis-ledger.mjs +202 -0
  930. package/scripts/e2e-aw-tui-global.mjs +277 -277
  931. package/scripts/e2e-binding-modes-real.mjs +442 -0
  932. package/scripts/e2e-business-loop-real.mjs +391 -0
  933. package/scripts/e2e-closedloop/cleanup.mjs +27 -27
  934. package/scripts/e2e-closedloop/lib.mjs +109 -109
  935. package/scripts/e2e-closedloop/main.mjs +59 -59
  936. package/scripts/e2e-closedloop/scenarios-accounts.mjs +210 -210
  937. package/scripts/e2e-closedloop/scenarios-authz.mjs +196 -196
  938. package/scripts/e2e-closedloop/scenarios-daq-dcw.mjs +222 -222
  939. package/scripts/e2e-closedloop/scenarios-plugins.mjs +169 -169
  940. package/scripts/e2e-closedloop/state.mjs +10 -10
  941. package/scripts/e2e-config-groups.mjs +238 -238
  942. package/scripts/e2e-core-bridges-matrix.mjs +303 -0
  943. package/scripts/e2e-crash-cycle.mjs +108 -108
  944. package/scripts/e2e-error-handling.mjs +190 -0
  945. package/scripts/e2e-full-closedloop.mjs +16 -16
  946. package/scripts/e2e-golive-matrix.mjs +515 -0
  947. package/scripts/e2e-hil-multi-user.mjs +307 -307
  948. package/scripts/e2e-hil-restart.mjs +339 -339
  949. package/scripts/e2e-line-governance.mjs +352 -352
  950. package/scripts/e2e-mes-mirror-real.mjs +418 -0
  951. package/scripts/e2e-multiexpert-remediation-real.mjs +453 -453
  952. package/scripts/e2e-node-binding-3mode-real.mjs +792 -697
  953. package/scripts/e2e-node-binding-authz.mjs +372 -332
  954. package/scripts/e2e-ontology.mjs +393 -393
  955. package/scripts/e2e-optimizer-live.mjs +4 -0
  956. package/scripts/e2e-physical-effect-real.mjs +570 -0
  957. package/scripts/e2e-plc-plugin-closedloop.mjs +549 -549
  958. package/scripts/full-stack-shots.mjs +145 -145
  959. package/scripts/full-tool-injection-harness-e2e.mjs +214 -214
  960. package/scripts/hitl-reject-e2e.mjs +131 -131
  961. package/scripts/line-log-smoke.mjs +260 -260
  962. package/scripts/live-aml-mockomp.mjs +304 -304
  963. package/scripts/live-aml-optloop-resume.mjs +322 -322
  964. package/scripts/live-aml-optloop.mjs +588 -588
  965. package/scripts/live-aml-stage9.mjs +169 -169
  966. package/scripts/live-aml-two-goals.mjs +315 -315
  967. package/scripts/live-demo-seed.mjs +157 -0
  968. package/scripts/live-optloop-two-modes.mjs +857 -857
  969. package/scripts/mes-agent-integration-e2e.mjs +361 -361
  970. package/scripts/ops-plugins-e2e.mjs +85 -85
  971. package/scripts/scenario-suite-setup.mjs +337 -337
  972. package/scripts/scenario-suite-stability.mjs +144 -144
  973. package/scripts/security-acceptance.mjs +218 -218
  974. package/scripts/team-coordination-e2e.mjs +96 -96
  975. package/scripts/test-agentteam-workflow.ts +472 -472
  976. package/scripts/test-aw-skills.mjs +102 -102
  977. package/scripts/test-daq-frame-race.mjs +358 -358
  978. package/scripts/test-data-root.mjs +208 -208
  979. package/scripts/test-events-index.mjs +176 -176
  980. package/scripts/test-group-chat-unit/lib.ts +186 -186
  981. package/scripts/test-group-chat-unit/main.ts +45 -45
  982. package/scripts/test-group-chat-unit.ts +35 -35
  983. package/scripts/test-hitl-decision.ts +526 -526
  984. package/scripts/test-hitl-registry.ts +112 -112
  985. package/scripts/test-log-flooding.mjs +160 -160
  986. package/scripts/test-lru.mjs +101 -101
  987. package/scripts/test-plugin-hardening.mjs +90 -90
  988. package/scripts/test-plugin-lifecycle.mjs +173 -173
  989. package/scripts/test-rollback-index.mjs +137 -137
  990. package/scripts/test-schedule-runtime.ts +309 -309
  991. package/scripts/test-sdk-surface.mjs +158 -158
  992. package/scripts/test-serial-bridge.mjs +418 -418
  993. package/scripts/test-tui-commands.mjs +148 -148
  994. package/scripts/test-tui-reducers.mjs +72 -72
  995. package/scripts/three-system-e2e/lib.mjs +79 -79
  996. package/scripts/three-system-e2e/main.mjs +40 -40
  997. package/scripts/three-system-e2e/phases/phase-0-user-token.mjs +42 -42
  998. package/scripts/three-system-e2e/phases/phase-0a2-line-autoselect.mjs +35 -35
  999. package/scripts/three-system-e2e/phases/phase-0b-fixture-grants.mjs +39 -39
  1000. package/scripts/three-system-e2e/phases/phase-0c-plugin-outbound-auth.mjs +95 -95
  1001. package/scripts/three-system-e2e/phases/stage-1-health.mjs +47 -47
  1002. package/scripts/three-system-e2e/phases/stage-2-5-team-plugins.mjs +84 -84
  1003. package/scripts/three-system-e2e/phases/stage-2-teams-tools-hitl.mjs +184 -184
  1004. package/scripts/three-system-e2e/phases/stage-3-diag.mjs +73 -73
  1005. package/scripts/three-system-e2e/phases/stage-4-plugin-toggle.mjs +53 -53
  1006. package/scripts/three-system-e2e/state.mjs +87 -87
  1007. package/scripts/three-system-e2e.mjs +40 -40
  1008. package/scripts/tool-face-batch-identity-e2e.mjs +222 -222
  1009. package/scripts/tsconfig.json +14 -14
  1010. package/scripts/tui-smoke.mjs +100 -100
  1011. package/scripts/typecheck.mjs +75 -75
  1012. package/scripts/ui/md-lint.mjs +80 -80
  1013. package/scripts/ui/readme-assets.mjs +30 -30
  1014. package/scripts/ui/readme-shots.mjs +42 -42
  1015. package/scripts/ui/record-demo.mjs +557 -557
  1016. package/scripts/ui/record.mjs +225 -225
  1017. package/scripts/ui/seed-admin.mjs +68 -68
  1018. package/scripts/ui/seed-demo.mjs +83 -83
  1019. package/scripts/ui/seed-industrial-demo.mjs +171 -171
  1020. package/scripts/ui/shot-hero.mjs +25 -25
  1021. package/scripts/ui/shots.mjs +75 -75
  1022. package/scripts/ui/verify-nav.mjs +51 -51
  1023. package/scripts/ui/verify-responsive.mjs +285 -285
  1024. package/sdk/client.d.mts +110 -110
  1025. package/sdk/examples/line-sentinel/index.mjs +105 -105
  1026. package/sdk/examples/ops-notifier/index.mjs +34 -34
  1027. package/sdk/examples/sample-insight/index.mjs +39 -39
  1028. package/server/api/plugins/client/[name].get.ts +18 -18
  1029. package/server/api/plugins/i18n.get.ts +12 -12
  1030. package/server/api/plugins/manifest.get.ts +10 -10
  1031. package/server/api/system/backup/list.get.ts +32 -32
  1032. package/server/api/system/backup/run.post.ts +21 -21
  1033. package/server/api/system/config-groups/[id].delete.ts +21 -21
  1034. package/server/api/system/config-groups/[id].patch.ts +26 -26
  1035. package/server/api/system/config-groups/index.get.ts +21 -21
  1036. package/server/api/system/config-groups/index.post.ts +33 -33
  1037. package/server/api/system/timezone.get.ts +20 -20
  1038. package/server/api/users/tokens/[id]/token.get.ts +11 -11
  1039. package/server/api/workshop/[...path].ts +13 -13
  1040. package/server/api/workshop/agent-tools/approvals/index.get.ts +45 -43
  1041. package/server/api/workshop/agent-tools/bindings/[id].delete.ts +26 -26
  1042. package/server/api/workshop/agent-tools/bindings/grant.post.ts +45 -45
  1043. package/server/api/workshop/agent-tools/bindings/index.get.ts +41 -41
  1044. package/server/api/workshop/agent-tools/bindings/index.post.ts +38 -16
  1045. package/server/api/workshop/agent-tools/bindings/revoke.post.ts +42 -42
  1046. package/server/api/workshop/aml/datasets/[id]/preview.get.ts +68 -68
  1047. package/server/api/workshop/aml/datasets/[id].delete.ts +39 -39
  1048. package/server/api/workshop/aml/datasets/[id].get.ts +53 -53
  1049. package/server/api/workshop/aml/datasets/[id].patch.ts +30 -30
  1050. package/server/api/workshop/aml/datasets/index.get.ts +20 -20
  1051. package/server/api/workshop/aml/datasets/index.post.ts +27 -27
  1052. package/server/api/workshop/aml/entities/index.get.ts +13 -13
  1053. package/server/api/workshop/aml/entities/prune.post.ts +28 -28
  1054. package/server/api/workshop/aml/env/index.get.ts +13 -13
  1055. package/server/api/workshop/aml/env/recheck.post.ts +14 -14
  1056. package/server/api/workshop/aml/env/uv.post.ts +21 -21
  1057. package/server/api/workshop/aml/env/venv.post.ts +24 -24
  1058. package/server/api/workshop/aml/experiments/index.get.ts +35 -35
  1059. package/server/api/workshop/aml/index.get.ts +37 -37
  1060. package/server/api/workshop/aml/jobs/[id]/cancel.post.ts +21 -21
  1061. package/server/api/workshop/aml/jobs/[id]/logs.get.ts +23 -23
  1062. package/server/api/workshop/aml/jobs/[id]/retry.post.ts +20 -20
  1063. package/server/api/workshop/aml/jobs/[id].delete.ts +44 -44
  1064. package/server/api/workshop/aml/jobs/[id].get.ts +23 -23
  1065. package/server/api/workshop/aml/jobs/index.get.ts +26 -26
  1066. package/server/api/workshop/aml/models/[id]/predict.post.ts +24 -24
  1067. package/server/api/workshop/aml/models/[id]/promote.post.ts +30 -30
  1068. package/server/api/workshop/aml/models/index.get.ts +48 -48
  1069. package/server/api/workshop/aml/training-plans/[id]/train.post.ts +18 -18
  1070. package/server/api/workshop/aml/training-plans/[id].delete.ts +18 -18
  1071. package/server/api/workshop/aml/training-plans/[id].patch.ts +30 -30
  1072. package/server/api/workshop/aml/training-plans/index.get.ts +9 -9
  1073. package/server/api/workshop/aml/training-plans/index.post.ts +43 -43
  1074. package/server/api/workshop/analysis/index.post.ts +54 -54
  1075. package/server/api/workshop/approvals/[id]/decide.post.ts +30 -30
  1076. package/server/api/workshop/approvals/index.get.ts +22 -22
  1077. package/server/api/workshop/audit.get.ts +43 -43
  1078. package/server/api/workshop/channels/[id]/chat/messages/[messageId]/read.post.ts +22 -22
  1079. package/server/api/workshop/channels/[id]/chat/messages/index.get.ts +29 -29
  1080. package/server/api/workshop/channels/[id]/chat/messages/index.post.ts +51 -51
  1081. package/server/api/workshop/channels/[id]/chat/permissions.get.ts +35 -35
  1082. package/server/api/workshop/channels/[id]/index.patch.ts +64 -64
  1083. package/server/api/workshop/channels/[id]/members/[userId]/approve.post.ts +20 -20
  1084. package/server/api/workshop/channels/[id]/members/[userId].delete.ts +21 -21
  1085. package/server/api/workshop/channels/[id]/members/index.get.ts +23 -23
  1086. package/server/api/workshop/channels/[id]/members/leave.post.ts +20 -20
  1087. package/server/api/workshop/channels/[id]/twin-profile.get.ts +45 -45
  1088. package/server/api/workshop/channels/[id]/twin-profile.patch.ts +72 -72
  1089. package/server/api/workshop/daq/[id]/test.post.ts +1 -1
  1090. package/server/api/workshop/dcw/[id]/write.post.ts +4 -4
  1091. package/server/api/workshop/dcw/[id].delete.ts +41 -41
  1092. package/server/api/workshop/dcw/mes-test-read.post.ts +24 -24
  1093. package/server/api/workshop/dcw/params/[id]/write.post.ts +21 -21
  1094. package/server/api/workshop/dcw/params/[id].delete.ts +19 -19
  1095. package/server/api/workshop/dcw/params/[id].patch.ts +23 -23
  1096. package/server/api/workshop/dcw/params/index.get.ts +27 -27
  1097. package/server/api/workshop/dcw/params/index.post.ts +25 -25
  1098. package/server/api/workshop/dcw/templates/[key].delete.ts +14 -14
  1099. package/server/api/workshop/dcw/templates/[key].patch.ts +16 -16
  1100. package/server/api/workshop/dcw/templates/index.post.ts +15 -15
  1101. package/server/api/workshop/device-twins/[id].delete.ts +25 -25
  1102. package/server/api/workshop/eda/runs/[id]/labels.patch.ts +25 -25
  1103. package/server/api/workshop/eda/templates/[id].delete.ts +14 -14
  1104. package/server/api/workshop/eda/templates/[id].get.ts +15 -15
  1105. package/server/api/workshop/eda/templates/[id].patch.ts +20 -20
  1106. package/server/api/workshop/eda/templates/index.get.ts +11 -11
  1107. package/server/api/workshop/eda/templates/index.post.ts +20 -20
  1108. package/server/api/workshop/exp/confirmations/[id]/decide.post.ts +41 -41
  1109. package/server/api/workshop/exp/confirmations/index.get.ts +25 -25
  1110. package/server/api/workshop/harnesses/[id]/providers.get.ts +16 -16
  1111. package/server/api/workshop/hitl/respond.post.ts +94 -94
  1112. package/server/api/workshop/notifications/index.get.ts +60 -60
  1113. package/server/api/workshop/notifications/read.post.ts +31 -31
  1114. package/server/api/workshop/ontology/drafts/[draftId]/subgraph.ts +24 -24
  1115. package/server/api/workshop/ops-logs/index.post.ts +20 -2
  1116. package/server/api/workshop/plugins/[name]/disable.post.ts +21 -21
  1117. package/server/api/workshop/plugins/[name]/enable.post.ts +21 -21
  1118. package/server/api/workshop/plugins/[name]/index.get.ts +14 -14
  1119. package/server/api/workshop/schedules/[id]/run.post.ts +15 -15
  1120. package/server/api/workshop/schedules/[id]/runs.get.ts +15 -15
  1121. package/server/api/workshop/schedules/[id].delete.ts +14 -14
  1122. package/server/api/workshop/schedules/[id].get.ts +13 -13
  1123. package/server/api/workshop/schedules/[id].patch.ts +29 -29
  1124. package/server/api/workshop/schedules/index.get.ts +12 -12
  1125. package/server/api/workshop/schedules/index.post.ts +32 -32
  1126. package/server/api/workshop/tasks/[id]/reassign.post.ts +32 -32
  1127. package/server/api/workshop/tasks/[id]/update.post.ts +35 -35
  1128. package/server/api/workshop/teams/[id]/plugins/index.get.ts +36 -36
  1129. package/server/api/workshop/teams/[id]/plugins/index.put.ts +42 -42
  1130. package/server/api/workshop/ws/audience.ts +56 -56
  1131. package/server/api/workshop/ws/db-buffer.ts +68 -68
  1132. package/server/api/workshop/ws/event-mapping.ts +47 -47
  1133. package/server/api/workshop/ws/handlers.ts +132 -132
  1134. package/server/api/workshop/ws/hub.ts +134 -134
  1135. package/server/api/workshop/ws/index.ts +23 -23
  1136. package/server/api/workshop/ws/notification-uplink.ts +77 -77
  1137. package/server/api/workshop/ws/shared.ts +94 -94
  1138. package/server/api/workshop/ws/streams.ts +146 -146
  1139. package/server/middleware/00-security-headers.ts +38 -38
  1140. package/server/middleware/01-rate-guard.ts +101 -101
  1141. package/server/plugins/01-instance-guard.ts +82 -82
  1142. package/server/plugins/aml-twin-worker.ts +32 -32
  1143. package/server/plugins/aw-plugins.ts +4 -1
  1144. package/server/plugins/dev-stability-guard.ts +46 -42
  1145. package/server/plugins/error-ledger.ts +21 -0
  1146. package/server/plugins-builtin/diag-bridge/host/constants.mjs +25 -25
  1147. package/server/plugins-builtin/diag-bridge/host/exports.mjs +104 -104
  1148. package/server/plugins-builtin/diag-bridge/host/index.mjs +15 -15
  1149. package/server/plugins-builtin/diag-bridge/host/intents.mjs +62 -62
  1150. package/server/plugins-builtin/diag-bridge/host/snapshot.mjs +93 -93
  1151. package/server/plugins-builtin/diag-bridge/index.mjs +9 -9
  1152. package/server/plugins-builtin/serial-bridge/client.mjs +211 -211
  1153. package/server/plugins-builtin/serial-bridge/drivers.mjs +409 -409
  1154. package/server/plugins-builtin/serial-bridge/i18n.json +62 -62
  1155. package/server/plugins-builtin/serial-bridge/index.mjs +247 -247
  1156. package/server/plugins-builtin/serial-bridge/lib.mjs +208 -208
  1157. package/server/plugins-builtin/serial-bridge/rtu.mjs +168 -168
  1158. package/server/services/system-config/contracts.ts +29 -29
  1159. package/server/services/system-config/dispose.ts +19 -19
  1160. package/server/services/system-config/facade.ts +26 -26
  1161. package/server/services/system-config/groups.ts +108 -108
  1162. package/server/services/system-config/index.ts +21 -21
  1163. package/server/services/system-config/init.ts +26 -26
  1164. package/server/services/system-config/mutate.ts +103 -103
  1165. package/server/services/system-config/plugins.ts +104 -104
  1166. package/server/services/system-config/snapshot.ts +59 -59
  1167. package/server/services/system-config/state.ts +79 -79
  1168. package/server/services/system-config/types.ts +58 -58
  1169. package/server/services/workshop/agents/adapters/omp-rpc-client/api.ts +111 -111
  1170. package/server/services/workshop/agents/adapters/omp-rpc-client/contracts.ts +22 -22
  1171. package/server/services/workshop/agents/adapters/omp-rpc-client/facade.ts +7 -7
  1172. package/server/services/workshop/agents/adapters/omp-rpc-client/helpers.ts +38 -38
  1173. package/server/services/workshop/agents/adapters/omp-rpc-client/index.ts +25 -25
  1174. package/server/services/workshop/agents/adapters/omp-rpc-client/start.ts +70 -70
  1175. package/server/services/workshop/agents/adapters/omp-rpc-client/state.ts +65 -65
  1176. package/server/services/workshop/agents/adapters/omp-rpc-client/stdout.ts +92 -92
  1177. package/server/services/workshop/agents/adapters/omp-rpc-client/usage.ts +47 -47
  1178. package/server/services/workshop/agents/agent-badge.ts +38 -38
  1179. package/server/services/workshop/agents/agent-dto.ts +54 -54
  1180. package/server/services/workshop/agents/binding-authz.ts +66 -60
  1181. package/server/services/workshop/agents/binding-mode.ts +51 -51
  1182. package/server/services/workshop/agents/codex-agent/client.ts +170 -170
  1183. package/server/services/workshop/agents/codex-agent/core.ts +119 -119
  1184. package/server/services/workshop/agents/codex-agent/facade.ts +8 -8
  1185. package/server/services/workshop/agents/codex-agent/helpers.ts +13 -13
  1186. package/server/services/workshop/agents/codex-agent/hitl.ts +138 -138
  1187. package/server/services/workshop/agents/codex-agent/index.ts +14 -14
  1188. package/server/services/workshop/agents/codex-agent/turn.ts +367 -367
  1189. package/server/services/workshop/agents/codex-agent/types.ts +42 -42
  1190. package/server/services/workshop/agents/harness-process.ts +3 -3
  1191. package/server/services/workshop/agents/harness-spawn-policy.ts +114 -114
  1192. package/server/services/workshop/agents/harness-terminal/api.ts +197 -197
  1193. package/server/services/workshop/agents/harness-terminal/index.ts +17 -17
  1194. package/server/services/workshop/agents/harness-terminal/io.ts +120 -120
  1195. package/server/services/workshop/agents/harness-terminal/park.ts +55 -55
  1196. package/server/services/workshop/agents/harness-terminal/sanitize.ts +98 -98
  1197. package/server/services/workshop/agents/harness-terminal/session.ts +124 -124
  1198. package/server/services/workshop/agents/harness-terminal/shared.ts +74 -74
  1199. package/server/services/workshop/agents/hitl-capabilities.ts +312 -312
  1200. package/server/services/workshop/agents/hitl-decision/answers.ts +32 -32
  1201. package/server/services/workshop/agents/hitl-decision/decide.ts +268 -268
  1202. package/server/services/workshop/agents/hitl-decision/payload.ts +45 -45
  1203. package/server/services/workshop/agents/hitl-decision/shared.ts +108 -108
  1204. package/server/services/workshop/agents/hitl-decision/visibility.ts +94 -94
  1205. package/server/services/workshop/agents/host-tool-bridge/per-agent.ts +17 -3
  1206. package/server/services/workshop/agents/host-tool-bridge/tools/progress.ts +84 -84
  1207. package/server/services/workshop/agents/host-tool-bridge/tools/team-delegation.ts +109 -108
  1208. package/server/services/workshop/agents/host-tool-bridge/tools/team.ts +70 -70
  1209. package/server/services/workshop/agents/industrial/aml-activity.ts +131 -131
  1210. package/server/services/workshop/agents/industrial/audit-query.ts +66 -66
  1211. package/server/services/workshop/agents/industrial/dcw-tools.ts +11 -1
  1212. package/server/services/workshop/agents/industrial/exp-tools.ts +104 -104
  1213. package/server/services/workshop/agents/industrial/ops-tools.ts +8 -2
  1214. package/server/services/workshop/agents/industrial/param-tools.ts +69 -69
  1215. package/server/services/workshop/agents/industrial/recipe-gate.ts +57 -29
  1216. package/server/services/workshop/agents/industrial/recipe-propose-tools.ts +2 -1
  1217. package/server/services/workshop/agents/industrial/tool-verify.ts +23 -3
  1218. package/server/services/workshop/agents/node-bindings.repo.ts +210 -208
  1219. package/server/services/workshop/agents/node-delegation.ts +204 -204
  1220. package/server/services/workshop/agents/omp-agent/core.ts +146 -146
  1221. package/server/services/workshop/agents/omp-agent/facade.ts +8 -8
  1222. package/server/services/workshop/agents/omp-agent/helpers.ts +37 -37
  1223. package/server/services/workshop/agents/omp-agent/index.ts +16 -16
  1224. package/server/services/workshop/agents/omp-agent/types.ts +45 -45
  1225. package/server/services/workshop/agents/opencode-agent/core.ts +77 -77
  1226. package/server/services/workshop/agents/opencode-agent/facade.ts +8 -8
  1227. package/server/services/workshop/agents/opencode-agent/helpers.ts +29 -29
  1228. package/server/services/workshop/agents/opencode-agent/hitl.ts +113 -113
  1229. package/server/services/workshop/agents/opencode-agent/index.ts +16 -16
  1230. package/server/services/workshop/agents/opencode-agent/lifecycle.ts +44 -44
  1231. package/server/services/workshop/agents/opencode-agent/server.ts +244 -244
  1232. package/server/services/workshop/agents/opencode-agent/turn.ts +278 -278
  1233. package/server/services/workshop/agents/opencode-agent/types.ts +54 -54
  1234. package/server/services/workshop/agents/tool-approvals.ts +6 -4
  1235. package/server/services/workshop/agents/tool-classes.ts +44 -44
  1236. package/server/services/workshop/aml/clean.ts +120 -120
  1237. package/server/services/workshop/aml/entity.ts +367 -367
  1238. package/server/services/workshop/aml/job-orchestrator/broadcast.ts +37 -37
  1239. package/server/services/workshop/aml/job-orchestrator/control.ts +94 -94
  1240. package/server/services/workshop/aml/job-orchestrator/failure.ts +96 -96
  1241. package/server/services/workshop/aml/job-orchestrator/index.ts +22 -22
  1242. package/server/services/workshop/aml/job-orchestrator/process.ts +101 -101
  1243. package/server/services/workshop/aml/job-orchestrator/shared.ts +53 -53
  1244. package/server/services/workshop/aml/job-orchestrator/status.ts +20 -20
  1245. package/server/services/workshop/aml/job-orchestrator/tick.ts +37 -37
  1246. package/server/services/workshop/aml/python/train-example.py +92 -92
  1247. package/server/services/workshop/aml/runtime.ts +137 -137
  1248. package/server/services/workshop/aml/stats.ts +140 -140
  1249. package/server/services/workshop/aml/twin/calibration-worker.ts +150 -150
  1250. package/server/services/workshop/aml/twin/model-backed-provider.ts +332 -332
  1251. package/server/services/workshop/aml/twin/physics-spec-draft.ts +185 -185
  1252. package/server/services/workshop/aml/twin/prompt-composer.ts +143 -143
  1253. package/server/services/workshop/aml/twin/training-plans.ts +260 -260
  1254. package/server/services/workshop/aml/twin/write-guard.ts +19 -19
  1255. package/server/services/workshop/assets/character-asset.repo.ts +1 -1
  1256. package/server/services/workshop/assets/device-twin.repo.ts +1 -1
  1257. package/server/services/workshop/daq/daq-controller/contracts.ts +39 -39
  1258. package/server/services/workshop/daq/daq-controller/facade.ts +28 -28
  1259. package/server/services/workshop/daq/daq-controller/frames.ts +137 -137
  1260. package/server/services/workshop/daq/daq-controller/helpers.ts +52 -52
  1261. package/server/services/workshop/daq/daq-controller/index.ts +22 -22
  1262. package/server/services/workshop/daq/drivers/mock.ts +130 -130
  1263. package/server/services/workshop/daq/drivers/modbus-rtu.ts +67 -67
  1264. package/server/services/workshop/daq/drivers/modbus-tcp.ts +310 -310
  1265. package/server/services/workshop/daq/drivers/opcua.ts +227 -227
  1266. package/server/services/workshop/daq/drivers/s7-stub.ts +29 -29
  1267. package/server/services/workshop/daq/host-bindings.ts +71 -71
  1268. package/server/services/workshop/daq/host-ports.ts +65 -65
  1269. package/server/services/workshop/db/aml-team-seeds.ts +118 -118
  1270. package/server/services/workshop/db/backup-registry.ts +33 -33
  1271. package/server/services/workshop/db/channel-member.repo.ts +122 -122
  1272. package/server/services/workshop/db/channel.repo.ts +203 -203
  1273. package/server/services/workshop/db/chat-message.repo.ts +233 -233
  1274. package/server/services/workshop/db/database/index.ts +18 -18
  1275. package/server/services/workshop/db/database/json.ts +14 -14
  1276. package/server/services/workshop/db/database/seed-data.ts +60 -60
  1277. package/server/services/workshop/db/hitl-request.repo.ts +221 -221
  1278. package/server/services/workshop/db/notification.repo.ts +199 -199
  1279. package/server/services/workshop/db/readonly.ts +30 -30
  1280. package/server/services/workshop/db/scheduled-task.repo.ts +235 -235
  1281. package/server/services/workshop/db/transaction.ts +72 -72
  1282. package/server/services/workshop/dcw/dcw-controller/contracts.ts +16 -16
  1283. package/server/services/workshop/dcw/dcw-controller/control.ts +78 -78
  1284. package/server/services/workshop/dcw/dcw-controller/facade.ts +19 -19
  1285. package/server/services/workshop/dcw/dcw-controller/index.ts +22 -22
  1286. package/server/services/workshop/dcw/dcw-controller/params.ts +97 -97
  1287. package/server/services/workshop/dcw/dcw-controller/products.ts +103 -103
  1288. package/server/services/workshop/dcw/dcw-controller/write.ts +12 -0
  1289. package/server/services/workshop/dcw/dcw-node.ts +13 -1
  1290. package/server/services/workshop/dcw/dcw-runtime.ts +2 -1
  1291. package/server/services/workshop/dcw/dcw-templates.ts +136 -136
  1292. package/server/services/workshop/dcw/param-conversion.ts +78 -78
  1293. package/server/services/workshop/dcw/param-map.repo.ts +349 -349
  1294. package/server/services/workshop/dcw/plugin-bridge.ts +45 -45
  1295. package/server/services/workshop/dcw/recipe-rollback-manager/contracts.ts +26 -26
  1296. package/server/services/workshop/dcw/recipe-rollback-manager/facade.ts +13 -13
  1297. package/server/services/workshop/dcw/recipe-rollback-manager/helpers.ts +30 -30
  1298. package/server/services/workshop/dcw/recipe-rollback-manager/index.ts +17 -17
  1299. package/server/services/workshop/dcw/recipe-rollback-manager/internal.ts +33 -33
  1300. package/server/services/workshop/dcw/recipe-rollback-manager/judge.ts +52 -52
  1301. package/server/services/workshop/dcw/recipe-rollback-manager/lock.ts +137 -137
  1302. package/server/services/workshop/dcw/recipe-rollback-manager/state.ts +21 -21
  1303. package/server/services/workshop/dcw/recipe-rollback-manager/types.ts +3 -3
  1304. package/server/services/workshop/dcw/recipe-rollback-manager/views.ts +214 -214
  1305. package/server/services/workshop/eda/template-repo.ts +101 -101
  1306. package/server/services/workshop/exp/exp-collector.ts +275 -275
  1307. package/server/services/workshop/exp/exp-state.repo.ts +339 -339
  1308. package/server/services/workshop/line-scope.ts +80 -80
  1309. package/server/services/workshop/mes/mes-controller.ts +1164 -1155
  1310. package/server/services/workshop/mes/mes-hook.ts +567 -567
  1311. package/server/services/workshop/ontology/subgraph.core.ts +300 -300
  1312. package/server/services/workshop/ontology/subgraph.service.ts +113 -113
  1313. package/server/services/workshop/ops/error-ledger.ts +209 -0
  1314. package/server/services/workshop/plugins/host/api.mjs +90 -90
  1315. package/server/services/workshop/plugins/host/config.mjs +135 -135
  1316. package/server/services/workshop/plugins/host/index.mjs +23 -23
  1317. package/server/services/workshop/plugins/host/init.mjs +109 -109
  1318. package/server/services/workshop/plugins/host/rollback.mjs +72 -72
  1319. package/server/services/workshop/plugins/host/state.mjs +54 -54
  1320. package/server/services/workshop/plugins/host/toggle.mjs +64 -64
  1321. package/server/services/workshop/plugins/host.mjs +9 -9
  1322. package/server/services/workshop/runtime/agent-runtime/facade.ts +7 -7
  1323. package/server/services/workshop/runtime/agent-runtime/helpers.ts +18 -18
  1324. package/server/services/workshop/runtime/agent-runtime/index.ts +19 -19
  1325. package/server/services/workshop/runtime/agent-runtime/lifecycle.ts +137 -137
  1326. package/server/services/workshop/runtime/chat-mention.ts +164 -164
  1327. package/server/services/workshop/runtime/chat-projection.ts +246 -246
  1328. package/server/services/workshop/runtime/manager/admin-agents.ts +268 -268
  1329. package/server/services/workshop/runtime/manager/bus.ts +182 -182
  1330. package/server/services/workshop/runtime/manager/channel-template-constants.ts +20 -20
  1331. package/server/services/workshop/runtime/manager/chat-reply.ts +181 -181
  1332. package/server/services/workshop/runtime/manager/chat.ts +386 -386
  1333. package/server/services/workshop/runtime/manager/facade.ts +24 -24
  1334. package/server/services/workshop/runtime/manager/helpers.ts +119 -119
  1335. package/server/services/workshop/runtime/manager/index.ts +42 -42
  1336. package/server/services/workshop/runtime/manager/internal.ts +73 -73
  1337. package/server/services/workshop/runtime/manager/notifications.ts +108 -108
  1338. package/server/services/workshop/runtime/manager/state.ts +2 -2
  1339. package/server/services/workshop/runtime/manager/teams.ts +148 -148
  1340. package/server/services/workshop/runtime/memory/contracts.ts +18 -18
  1341. package/server/services/workshop/runtime/memory/facade.ts +10 -10
  1342. package/server/services/workshop/runtime/memory/helpers.ts +196 -196
  1343. package/server/services/workshop/runtime/memory/index.ts +27 -27
  1344. package/server/services/workshop/runtime/memory/score.ts +33 -33
  1345. package/server/services/workshop/runtime/memory/state.ts +40 -40
  1346. package/server/services/workshop/runtime/monitor.ts +3 -3
  1347. package/server/services/workshop/runtime/platform-notice.ts +113 -113
  1348. package/server/services/workshop/runtime/schedule-runtime.ts +347 -347
  1349. package/server/services/workshop/runtime/scheduler-loop/contracts.ts +29 -29
  1350. package/server/services/workshop/runtime/scheduler-loop/facade.ts +7 -7
  1351. package/server/services/workshop/runtime/scheduler-loop/helpers.ts +14 -14
  1352. package/server/services/workshop/runtime/scheduler-loop/index.ts +16 -16
  1353. package/server/services/workshop/runtime/task-engine/facade.ts +7 -7
  1354. package/server/services/workshop/runtime/task-engine/index.ts +15 -15
  1355. package/server/services/workshop/runtime/task-engine/types.ts +3 -3
  1356. package/server/services/workshop/runtime/user-notification-hub.ts +192 -192
  1357. package/server/types/pg.d.ts +49 -49
  1358. package/server/utils/approval-gate.ts +67 -67
  1359. package/server/utils/mojibake-guard.ts +29 -29
  1360. package/server/utils/stability-severity.ts +77 -77
  1361. package/shared/config/groups.mjs +241 -241
  1362. package/shared/dcw-protocol/line.ts +4 -1
  1363. package/shared/lru.mjs +97 -97
  1364. package/tui/README.md +74 -74
  1365. package/tui/aw-tui.mjs +445 -445
  1366. package/tui/commands/index.mjs +287 -287
  1367. package/tui/components/chat-log.mjs +42 -42
  1368. package/tui/components/monitor-pane.mjs +39 -39
  1369. package/tui/components/root.mjs +53 -53
  1370. package/tui/components/status-bar.mjs +33 -33
  1371. package/tui/lib/api.mjs +82 -82
  1372. package/tui/lib/pickers.mjs +121 -121
  1373. package/tui/lib/reducers.mjs +218 -218
  1374. package/tui/lib/state.mjs +86 -86
  1375. package/tui/lib/virtual-terminal.mjs +48 -48
  1376. package/tui/lib/ws.mjs +125 -125
  1377. package/tui/theme.mjs +38 -38
  1378. package/.output/.AgentWorkShop/aml-python/__pycache__/aml_eval.cpython-312.pyc +0 -0
  1379. package/.output/.AgentWorkShop/aml-python/__pycache__/amlkit.cpython-312.pyc +0 -0
  1380. package/.output/.AgentWorkShop/aml-python/__pycache__/train-example.cpython-312.pyc +0 -0
  1381. package/.output/.AgentWorkShop/aml-python/__pycache__/train-hybrid-example.cpython-312.pyc +0 -0
  1382. package/.output/public/_nuxt/26OL4Ao82.js +0 -1
  1383. package/.output/public/_nuxt/7op-BMk82.js +0 -1
  1384. package/.output/public/_nuxt/B1SIgyrl.js +0 -1
  1385. package/.output/public/_nuxt/BA2lmfW4.js +0 -1
  1386. package/.output/public/_nuxt/BDXQqSkl2.js +0 -1
  1387. package/.output/public/_nuxt/BI9jj13f2.js +0 -2
  1388. package/.output/public/_nuxt/BPUQZ9Lq2.js +0 -8
  1389. package/.output/public/_nuxt/BVg2R2VB2.js +0 -1
  1390. package/.output/public/_nuxt/BaYDgyaR.js +0 -3
  1391. package/.output/public/_nuxt/BfvuWqSa.js +0 -1
  1392. package/.output/public/_nuxt/BiXqyYNw2.js +0 -1
  1393. package/.output/public/_nuxt/BkEokGX5.js +0 -1
  1394. package/.output/public/_nuxt/BlOm8JIs2.js +0 -1
  1395. package/.output/public/_nuxt/BtZKe9ZV2.js +0 -1
  1396. package/.output/public/_nuxt/BuLoPmcf.js +0 -1
  1397. package/.output/public/_nuxt/BwOK42JQ.js +0 -1
  1398. package/.output/public/_nuxt/BwOko01T.js +0 -47
  1399. package/.output/public/_nuxt/C1RMfPoB2.js +0 -1
  1400. package/.output/public/_nuxt/CBkXv24C2.js +0 -1
  1401. package/.output/public/_nuxt/COfo_Bg3.js +0 -1
  1402. package/.output/public/_nuxt/CY2NkFvI.js +0 -1
  1403. package/.output/public/_nuxt/C_4mzQ5X.js +0 -1
  1404. package/.output/public/_nuxt/CdvMP3lv.js +0 -1
  1405. package/.output/public/_nuxt/CjdxNYpU2.js +0 -1
  1406. package/.output/public/_nuxt/CmuGMxDP.js +0 -1
  1407. package/.output/public/_nuxt/CooauJ7D.js +0 -1
  1408. package/.output/public/_nuxt/D1eVi1zr.js +0 -21
  1409. package/.output/public/_nuxt/D6PUmBb0.js +0 -1
  1410. package/.output/public/_nuxt/D8AvmPUH.js +0 -1
  1411. package/.output/public/_nuxt/DC8sMA36.js +0 -1
  1412. package/.output/public/_nuxt/DDHh85c42.js +0 -2
  1413. package/.output/public/_nuxt/DDXOfmo2.js +0 -20
  1414. package/.output/public/_nuxt/DMFwLxfu.js +0 -1
  1415. package/.output/public/_nuxt/DZqVVvR0.js +0 -1
  1416. package/.output/public/_nuxt/Dr1FVeQG2.js +0 -1
  1417. package/.output/public/_nuxt/DtnsTW7e.js +0 -1
  1418. package/.output/public/_nuxt/DuUc4bbY2.js +0 -1
  1419. package/.output/public/_nuxt/DxDqd6T42.js +0 -16
  1420. package/.output/public/_nuxt/DzU3zEKX.js +0 -1
  1421. package/.output/public/_nuxt/EMbqTHfT.js +0 -1
  1422. package/.output/public/_nuxt/EgO70wrE.js +0 -1
  1423. package/.output/public/_nuxt/HJKu4eEV2.js +0 -1
  1424. package/.output/public/_nuxt/OmpTerminalPanel.ComMDrA8.css +0 -1
  1425. package/.output/public/_nuxt/PluginSlot.CGH0vb95.css +0 -1
  1426. package/.output/public/_nuxt/Rb4o4o-82.js +0 -1
  1427. package/.output/public/_nuxt/Tf6SJSDj.js +0 -1
  1428. package/.output/public/_nuxt/TownView.CC3t-Dte.css +0 -1
  1429. package/.output/public/_nuxt/_id_.BQRWK7J2.css +0 -1
  1430. package/.output/public/_nuxt/_wsId_.CQMH8t8j.css +0 -1
  1431. package/.output/public/_nuxt/agents.D-JPovTZ.css +0 -1
  1432. package/.output/public/_nuxt/aml.PalMp-5n.css +0 -1
  1433. package/.output/public/_nuxt/azOGy_tU2.js +0 -1
  1434. package/.output/public/_nuxt/be-4wyTo.js +0 -1
  1435. package/.output/public/_nuxt/builds/meta/593b65bd-cf1d-4b7f-a993-57e939c38f36.json +0 -1
  1436. package/.output/public/_nuxt/byZYInPk2.js +0 -1
  1437. package/.output/public/_nuxt/dHwWyr6b.js +0 -1
  1438. package/.output/public/_nuxt/dcjPjLPI.js +0 -1
  1439. package/.output/public/_nuxt/default.BEXGWZFQ.css +0 -1
  1440. package/.output/public/_nuxt/entry.D6nBdXet.css +0 -1
  1441. package/.output/public/_nuxt/h-Fn7pRD.js +0 -1
  1442. package/.output/public/_nuxt/logs.BkJPbR_K.css +0 -1
  1443. package/.output/public/_nuxt/monitor.D3yEqqrv.css +0 -1
  1444. package/.output/public/_nuxt/ontology.CkuUThtY.css +0 -1
  1445. package/.output/public/_nuxt/operations.-l6u44Ar.css +0 -1
  1446. package/.output/public/_nuxt/pages.Cdpm_B-G.css +0 -1
  1447. package/.output/public/_nuxt/permissions.DxuOOIqQ.css +0 -1
  1448. package/.output/public/_nuxt/rDvMijKA.js +0 -9
  1449. package/.output/public/_nuxt/schedules.BXNJ9q_I.css +0 -1
  1450. package/.output/public/_nuxt/teams.CLQaXno5.css +0 -1
  1451. package/.output/public/_nuxt/tokens.BDSUWF-L.css +0 -1
  1452. package/.output/public/_nuxt/tools.BwXFAb-X.css +0 -1
  1453. package/.output/public/_nuxt/workshop.BBiFhXuM.css +0 -1
  1454. package/.output/server/chunks/build/AuthGate-nF1evO4v.mjs +0 -716
  1455. package/.output/server/chunks/build/AuthGate-nF1evO4v.mjs.map +0 -1
  1456. package/.output/server/chunks/build/FormItemContext-BlyzocS0.mjs +0 -72
  1457. package/.output/server/chunks/build/FormItemContext-BlyzocS0.mjs.map +0 -1
  1458. package/.output/server/chunks/build/OmpTerminalPanel-BhvhQ1gG.mjs +0 -942
  1459. package/.output/server/chunks/build/OmpTerminalPanel-BhvhQ1gG.mjs.map +0 -1
  1460. package/.output/server/chunks/build/PluginSlot-BUKXwV2X.mjs +0 -141
  1461. package/.output/server/chunks/build/PluginSlot-BUKXwV2X.mjs.map +0 -1
  1462. package/.output/server/chunks/build/TownView-BWMDbosY.mjs +0 -6489
  1463. package/.output/server/chunks/build/TownView-BWMDbosY.mjs.map +0 -1
  1464. package/.output/server/chunks/build/_id_-BK-t8nRG.mjs +0 -392
  1465. package/.output/server/chunks/build/_id_-BK-t8nRG.mjs.map +0 -1
  1466. package/.output/server/chunks/build/_id_-CZPlPDm4.mjs +0 -2045
  1467. package/.output/server/chunks/build/_id_-CZPlPDm4.mjs.map +0 -1
  1468. package/.output/server/chunks/build/_wsId_-C871SDPN.mjs +0 -14589
  1469. package/.output/server/chunks/build/_wsId_-C871SDPN.mjs.map +0 -1
  1470. package/.output/server/chunks/build/agents-D7CdEUTv.mjs +0 -1078
  1471. package/.output/server/chunks/build/agents-D7CdEUTv.mjs.map +0 -1
  1472. package/.output/server/chunks/build/alert-D0ivtTGy.mjs +0 -263
  1473. package/.output/server/chunks/build/alert-D0ivtTGy.mjs.map +0 -1
  1474. package/.output/server/chunks/build/aml-DRAFRcGU.mjs +0 -814
  1475. package/.output/server/chunks/build/aml-DRAFRcGU.mjs.map +0 -1
  1476. package/.output/server/chunks/build/analysis-p-dBkjoK.mjs +0 -533
  1477. package/.output/server/chunks/build/analysis-p-dBkjoK.mjs.map +0 -1
  1478. package/.output/server/chunks/build/api-B4Om0mEc.mjs +0 -53
  1479. package/.output/server/chunks/build/api-B4Om0mEc.mjs.map +0 -1
  1480. package/.output/server/chunks/build/api-BEW_ebY_.mjs +0 -64
  1481. package/.output/server/chunks/build/api-BEW_ebY_.mjs.map +0 -1
  1482. package/.output/server/chunks/build/api-BsAgXWxi.mjs +0 -72
  1483. package/.output/server/chunks/build/api-BsAgXWxi.mjs.map +0 -1
  1484. package/.output/server/chunks/build/api-error-BwAQLw44.mjs +0 -47
  1485. package/.output/server/chunks/build/api-error-BwAQLw44.mjs.map +0 -1
  1486. package/.output/server/chunks/build/apiClient-BvXtNzC8.mjs +0 -81
  1487. package/.output/server/chunks/build/apiClient-BvXtNzC8.mjs.map +0 -1
  1488. package/.output/server/chunks/build/board-CJUc032b.mjs +0 -189
  1489. package/.output/server/chunks/build/board-CJUc032b.mjs.map +0 -1
  1490. package/.output/server/chunks/build/builtin-catalog-edpDcgfL.mjs.map +0 -1
  1491. package/.output/server/chunks/build/card-Cqk0Ur-L.mjs +0 -953
  1492. package/.output/server/chunks/build/card-Cqk0Ur-L.mjs.map +0 -1
  1493. package/.output/server/chunks/build/channel-templates-ggsBacZF.mjs +0 -942
  1494. package/.output/server/chunks/build/channel-templates-ggsBacZF.mjs.map +0 -1
  1495. package/.output/server/chunks/build/chart-pipeline-BpoWYMK_.mjs.map +0 -1
  1496. package/.output/server/chunks/build/chart-trend-BWeZh5Lv.mjs.map +0 -1
  1497. package/.output/server/chunks/build/checkbox-CrT4cnfu.mjs +0 -439
  1498. package/.output/server/chunks/build/checkbox-CrT4cnfu.mjs.map +0 -1
  1499. package/.output/server/chunks/build/client-only-qNA2OVV_.mjs +0 -43
  1500. package/.output/server/chunks/build/client-only-qNA2OVV_.mjs.map +0 -1
  1501. package/.output/server/chunks/build/constants-HPHJvjne.mjs +0 -142
  1502. package/.output/server/chunks/build/constants-HPHJvjne.mjs.map +0 -1
  1503. package/.output/server/chunks/build/core-CgTOPS4t.mjs +0 -294
  1504. package/.output/server/chunks/build/core-CgTOPS4t.mjs.map +0 -1
  1505. package/.output/server/chunks/build/daq-CdxcfY_G.mjs +0 -1266
  1506. package/.output/server/chunks/build/daq-CdxcfY_G.mjs.map +0 -1
  1507. package/.output/server/chunks/build/data-D8uX1dnm.mjs +0 -481
  1508. package/.output/server/chunks/build/data-D8uX1dnm.mjs.map +0 -1
  1509. package/.output/server/chunks/build/dcw-BlDQtS4q.mjs +0 -505
  1510. package/.output/server/chunks/build/dcw-BlDQtS4q.mjs.map +0 -1
  1511. package/.output/server/chunks/build/dcw-driver-badge-Df5wL_ZA.mjs.map +0 -1
  1512. package/.output/server/chunks/build/default-CNWS6NUw.mjs +0 -2353
  1513. package/.output/server/chunks/build/default-CNWS6NUw.mjs.map +0 -1
  1514. package/.output/server/chunks/build/descriptions-BNlfKG9y.mjs +0 -406
  1515. package/.output/server/chunks/build/descriptions-BNlfKG9y.mjs.map +0 -1
  1516. package/.output/server/chunks/build/drawer-Caji0PLs.mjs +0 -834
  1517. package/.output/server/chunks/build/drawer-Caji0PLs.mjs.map +0 -1
  1518. package/.output/server/chunks/build/dropdown-BNwTVGde.mjs +0 -14
  1519. package/.output/server/chunks/build/dropdown-BNwTVGde.mjs.map +0 -1
  1520. package/.output/server/chunks/build/dropdown-Cd-xPhR6.mjs +0 -540
  1521. package/.output/server/chunks/build/dropdown-Cd-xPhR6.mjs.map +0 -1
  1522. package/.output/server/chunks/build/es-Bxu10NJ2.mjs +0 -43
  1523. package/.output/server/chunks/build/es-Bxu10NJ2.mjs.map +0 -1
  1524. package/.output/server/chunks/build/firstNotUndefined-8H5_qHUu.mjs +0 -2448
  1525. package/.output/server/chunks/build/firstNotUndefined-8H5_qHUu.mjs.map +0 -1
  1526. package/.output/server/chunks/build/form-D_UpWPN4.mjs +0 -4712
  1527. package/.output/server/chunks/build/form-D_UpWPN4.mjs.map +0 -1
  1528. package/.output/server/chunks/build/hasIn-DBdElbjM.mjs +0 -553
  1529. package/.output/server/chunks/build/hasIn-DBdElbjM.mjs.map +0 -1
  1530. package/.output/server/chunks/build/hitl-Bd30yr1J.mjs +0 -132
  1531. package/.output/server/chunks/build/hitl-Bd30yr1J.mjs.map +0 -1
  1532. package/.output/server/chunks/build/input-GtPuSEgt.mjs +0 -2181
  1533. package/.output/server/chunks/build/input-GtPuSEgt.mjs.map +0 -1
  1534. package/.output/server/chunks/build/input-number-BNlNDK7H.mjs +0 -1120
  1535. package/.output/server/chunks/build/input-number-BNlNDK7H.mjs.map +0 -1
  1536. package/.output/server/chunks/build/interval-DvHBIIZh.mjs +0 -9
  1537. package/.output/server/chunks/build/interval-DvHBIIZh.mjs.map +0 -1
  1538. package/.output/server/chunks/build/isNumeric-CP7q_yhz.mjs +0 -7
  1539. package/.output/server/chunks/build/isNumeric-CP7q_yhz.mjs.map +0 -1
  1540. package/.output/server/chunks/build/logs-pRb-TMWa.mjs +0 -427
  1541. package/.output/server/chunks/build/logs-pRb-TMWa.mjs.map +0 -1
  1542. package/.output/server/chunks/build/menu-BXt-X0dt.mjs +0 -1952
  1543. package/.output/server/chunks/build/menu-BXt-X0dt.mjs.map +0 -1
  1544. package/.output/server/chunks/build/monitor-Cq6hRFeQ.mjs +0 -2253
  1545. package/.output/server/chunks/build/monitor-Cq6hRFeQ.mjs.map +0 -1
  1546. package/.output/server/chunks/build/narrow-fetch-CcG-BPxc.mjs.map +0 -1
  1547. package/.output/server/chunks/build/ontology-ohICfVVb.mjs +0 -1406
  1548. package/.output/server/chunks/build/ontology-ohICfVVb.mjs.map +0 -1
  1549. package/.output/server/chunks/build/operations-SMQrRAcr.mjs +0 -311
  1550. package/.output/server/chunks/build/operations-SMQrRAcr.mjs.map +0 -1
  1551. package/.output/server/chunks/build/optimizer-BlWTsM-W.mjs +0 -202
  1552. package/.output/server/chunks/build/optimizer-BlWTsM-W.mjs.map +0 -1
  1553. package/.output/server/chunks/build/pages-DsMKUw7i.mjs +0 -542
  1554. package/.output/server/chunks/build/pages-DsMKUw7i.mjs.map +0 -1
  1555. package/.output/server/chunks/build/pagination-DTAconUo.mjs +0 -1346
  1556. package/.output/server/chunks/build/pagination-DTAconUo.mjs.map +0 -1
  1557. package/.output/server/chunks/build/permissions-DgXQZSyx.mjs +0 -637
  1558. package/.output/server/chunks/build/permissions-DgXQZSyx.mjs.map +0 -1
  1559. package/.output/server/chunks/build/pipeline-CkavMBhk.mjs +0 -212
  1560. package/.output/server/chunks/build/pipeline-CkavMBhk.mjs.map +0 -1
  1561. package/.output/server/chunks/build/plugins-LRjaSEZy.mjs +0 -272
  1562. package/.output/server/chunks/build/plugins-LRjaSEZy.mjs.map +0 -1
  1563. package/.output/server/chunks/build/popconfirm-DxYPGRgS.mjs +0 -340
  1564. package/.output/server/chunks/build/popconfirm-DxYPGRgS.mjs.map +0 -1
  1565. package/.output/server/chunks/build/responsiveObserve-DM3hpzhU.mjs +0 -78
  1566. package/.output/server/chunks/build/responsiveObserve-DM3hpzhU.mjs.map +0 -1
  1567. package/.output/server/chunks/build/schedules-Hz2DJUE2.mjs +0 -7172
  1568. package/.output/server/chunks/build/schedules-Hz2DJUE2.mjs.map +0 -1
  1569. package/.output/server/chunks/build/segmented-D3HWtHPw.mjs +0 -341
  1570. package/.output/server/chunks/build/segmented-D3HWtHPw.mjs.map +0 -1
  1571. package/.output/server/chunks/build/select-B3Dsb9yq.mjs +0 -3923
  1572. package/.output/server/chunks/build/select-B3Dsb9yq.mjs.map +0 -1
  1573. package/.output/server/chunks/build/settings-DXLJPq7d.mjs +0 -1014
  1574. package/.output/server/chunks/build/settings-DXLJPq7d.mjs.map +0 -1
  1575. package/.output/server/chunks/build/space-Dwu2Skt8.mjs +0 -110
  1576. package/.output/server/chunks/build/space-Dwu2Skt8.mjs.map +0 -1
  1577. package/.output/server/chunks/build/spin-C2cuvGth.mjs +0 -357
  1578. package/.output/server/chunks/build/spin-C2cuvGth.mjs.map +0 -1
  1579. package/.output/server/chunks/build/studio-hSqH9TYS.mjs +0 -336
  1580. package/.output/server/chunks/build/studio-hSqH9TYS.mjs.map +0 -1
  1581. package/.output/server/chunks/build/switch-CyR-H6Fb.mjs +0 -377
  1582. package/.output/server/chunks/build/switch-CyR-H6Fb.mjs.map +0 -1
  1583. package/.output/server/chunks/build/table-CmVD-cA9.mjs +0 -7546
  1584. package/.output/server/chunks/build/table-CmVD-cA9.mjs.map +0 -1
  1585. package/.output/server/chunks/build/tabs-Vg0e7cZE.mjs +0 -1924
  1586. package/.output/server/chunks/build/tabs-Vg0e7cZE.mjs.map +0 -1
  1587. package/.output/server/chunks/build/tag-y0sn-xv9.mjs +0 -1156
  1588. package/.output/server/chunks/build/tag-y0sn-xv9.mjs.map +0 -1
  1589. package/.output/server/chunks/build/teams-BbwYJyzv.mjs +0 -1203
  1590. package/.output/server/chunks/build/teams-BbwYJyzv.mjs.map +0 -1
  1591. package/.output/server/chunks/build/tokens-GYaGJ35Z.mjs +0 -1062
  1592. package/.output/server/chunks/build/tokens-GYaGJ35Z.mjs.map +0 -1
  1593. package/.output/server/chunks/build/tools-CnYi9cou.mjs +0 -487
  1594. package/.output/server/chunks/build/tools-CnYi9cou.mjs.map +0 -1
  1595. package/.output/server/chunks/build/tooltip-C2n2nNiQ.mjs +0 -920
  1596. package/.output/server/chunks/build/tooltip-C2n2nNiQ.mjs.map +0 -1
  1597. package/.output/server/chunks/build/town-B5aoiG98.mjs +0 -133
  1598. package/.output/server/chunks/build/town-B5aoiG98.mjs.map +0 -1
  1599. package/.output/server/chunks/build/town-BV-hbwb5.mjs +0 -75
  1600. package/.output/server/chunks/build/town-BV-hbwb5.mjs.map +0 -1
  1601. package/.output/server/chunks/build/types-D6J7slEa.mjs +0 -5565
  1602. package/.output/server/chunks/build/types-D6J7slEa.mjs.map +0 -1
  1603. package/.output/server/chunks/build/types-DWqIeMRP.mjs +0 -76
  1604. package/.output/server/chunks/build/types-DWqIeMRP.mjs.map +0 -1
  1605. package/.output/server/chunks/build/useAgentHarnessOptions-Dq0l0Z6d.mjs +0 -124
  1606. package/.output/server/chunks/build/useAgentHarnessOptions-Dq0l0Z6d.mjs.map +0 -1
  1607. package/.output/server/chunks/build/useAgentTemplateActions-BFOHb5-L.mjs +0 -77
  1608. package/.output/server/chunks/build/useAgentTemplateActions-BFOHb5-L.mjs.map +0 -1
  1609. package/.output/server/chunks/build/useAgentTemplateDialogState-CZzpu5og.mjs +0 -67
  1610. package/.output/server/chunks/build/useAgentTemplateDialogState-CZzpu5og.mjs.map +0 -1
  1611. package/.output/server/chunks/build/useAgentTemplateForm-CuJPOPcK.mjs +0 -117
  1612. package/.output/server/chunks/build/useAgentTemplateForm-CuJPOPcK.mjs.map +0 -1
  1613. package/.output/server/chunks/build/useAgentTemplatesCatalog-B2bIhZLA.mjs +0 -133
  1614. package/.output/server/chunks/build/useAgentTemplatesCatalog-B2bIhZLA.mjs.map +0 -1
  1615. package/.output/server/chunks/build/useAmlDatasets-DeoE1idn.mjs +0 -92
  1616. package/.output/server/chunks/build/useAmlDatasets-DeoE1idn.mjs.map +0 -1
  1617. package/.output/server/chunks/build/useAmlEntities-BJhvdqHJ.mjs +0 -86
  1618. package/.output/server/chunks/build/useAmlEntities-BJhvdqHJ.mjs.map +0 -1
  1619. package/.output/server/chunks/build/useAmlEnv-CDIZ6xTe.mjs +0 -194
  1620. package/.output/server/chunks/build/useAmlEnv-CDIZ6xTe.mjs.map +0 -1
  1621. package/.output/server/chunks/build/useAmlExperiments-Dloi834i.mjs +0 -89
  1622. package/.output/server/chunks/build/useAmlExperiments-Dloi834i.mjs.map +0 -1
  1623. package/.output/server/chunks/build/useAmlFormat-C2sl3MGB.mjs +0 -82
  1624. package/.output/server/chunks/build/useAmlFormat-C2sl3MGB.mjs.map +0 -1
  1625. package/.output/server/chunks/build/useAmlJobs-BF9LpwXz.mjs +0 -267
  1626. package/.output/server/chunks/build/useAmlJobs-BF9LpwXz.mjs.map +0 -1
  1627. package/.output/server/chunks/build/useAmlModels-_bweOr3R.mjs +0 -93
  1628. package/.output/server/chunks/build/useAmlModels-_bweOr3R.mjs.map +0 -1
  1629. package/.output/server/chunks/build/useAmlNotes-DQj980iX.mjs +0 -86
  1630. package/.output/server/chunks/build/useAmlNotes-DQj980iX.mjs.map +0 -1
  1631. package/.output/server/chunks/build/useAmlPredict-DHNgDSJn.mjs +0 -130
  1632. package/.output/server/chunks/build/useAmlPredict-DHNgDSJn.mjs.map +0 -1
  1633. package/.output/server/chunks/build/useAnalysisFeed-BrEGV_9x.mjs +0 -129
  1634. package/.output/server/chunks/build/useAnalysisFeed-BrEGV_9x.mjs.map +0 -1
  1635. package/.output/server/chunks/build/useDaqAddNode-D_Rkju0f.mjs +0 -142
  1636. package/.output/server/chunks/build/useDaqAddNode-D_Rkju0f.mjs.map +0 -1
  1637. package/.output/server/chunks/build/useDaqDetailBinding-DCWaLKXT.mjs +0 -70
  1638. package/.output/server/chunks/build/useDaqDetailBinding-DCWaLKXT.mjs.map +0 -1
  1639. package/.output/server/chunks/build/useDaqDetailFrames-BOIcOJRB.mjs +0 -79
  1640. package/.output/server/chunks/build/useDaqDetailFrames-BOIcOJRB.mjs.map +0 -1
  1641. package/.output/server/chunks/build/useDaqDetailHistory-D6WulPVs.mjs +0 -176
  1642. package/.output/server/chunks/build/useDaqDetailHistory-D6WulPVs.mjs.map +0 -1
  1643. package/.output/server/chunks/build/useDaqDetailNode-DeOsDxK5.mjs +0 -99
  1644. package/.output/server/chunks/build/useDaqDetailNode-DeOsDxK5.mjs.map +0 -1
  1645. package/.output/server/chunks/build/useDaqDetailParams-Cm9a9r5G.mjs +0 -159
  1646. package/.output/server/chunks/build/useDaqDetailParams-Cm9a9r5G.mjs.map +0 -1
  1647. package/.output/server/chunks/build/useDaqFilters-CctmO03p.mjs +0 -222
  1648. package/.output/server/chunks/build/useDaqFilters-CctmO03p.mjs.map +0 -1
  1649. package/.output/server/chunks/build/useDaqNodeWindow-1DWj2H5G.mjs +0 -90
  1650. package/.output/server/chunks/build/useDaqNodeWindow-1DWj2H5G.mjs.map +0 -1
  1651. package/.output/server/chunks/build/useDaqOptimizations-CmX_dpBc.mjs +0 -136
  1652. package/.output/server/chunks/build/useDaqOptimizations-CmX_dpBc.mjs.map +0 -1
  1653. package/.output/server/chunks/build/useDaqStream-B9ZBVQrI.mjs +0 -395
  1654. package/.output/server/chunks/build/useDaqStream-B9ZBVQrI.mjs.map +0 -1
  1655. package/.output/server/chunks/build/useDaqTemplates-CK37sMfi.mjs +0 -187
  1656. package/.output/server/chunks/build/useDaqTemplates-CK37sMfi.mjs.map +0 -1
  1657. package/.output/server/chunks/build/useDashboardCharts-D45083s_.mjs +0 -354
  1658. package/.output/server/chunks/build/useDashboardCharts-D45083s_.mjs.map +0 -1
  1659. package/.output/server/chunks/build/useDashboardData-NJ7rKxhx.mjs +0 -153
  1660. package/.output/server/chunks/build/useDashboardData-NJ7rKxhx.mjs.map +0 -1
  1661. package/.output/server/chunks/build/useDcwAddNode-DACVcEHs.mjs +0 -219
  1662. package/.output/server/chunks/build/useDcwAddNode-DACVcEHs.mjs.map +0 -1
  1663. package/.output/server/chunks/build/useDcwCards-SaiImIYQ.mjs +0 -67
  1664. package/.output/server/chunks/build/useDcwCards-SaiImIYQ.mjs.map +0 -1
  1665. package/.output/server/chunks/build/useDcwDetailScope-DLOklSMO.mjs +0 -184
  1666. package/.output/server/chunks/build/useDcwDetailScope-DLOklSMO.mjs.map +0 -1
  1667. package/.output/server/chunks/build/useDcwDetailTemplates-ClmIdZ40.mjs +0 -148
  1668. package/.output/server/chunks/build/useDcwDetailTemplates-ClmIdZ40.mjs.map +0 -1
  1669. package/.output/server/chunks/build/useDcwFilter-CPMyCltx.mjs +0 -71
  1670. package/.output/server/chunks/build/useDcwFilter-CPMyCltx.mjs.map +0 -1
  1671. package/.output/server/chunks/build/useDcwLedger-0ie-0WTc.mjs +0 -79
  1672. package/.output/server/chunks/build/useDcwLedger-0ie-0WTc.mjs.map +0 -1
  1673. package/.output/server/chunks/build/useDcwLineMutations-DNxo66yM.mjs +0 -137
  1674. package/.output/server/chunks/build/useDcwLineMutations-DNxo66yM.mjs.map +0 -1
  1675. package/.output/server/chunks/build/useDcwLineRun-CHskwscT.mjs +0 -104
  1676. package/.output/server/chunks/build/useDcwLineRun-CHskwscT.mjs.map +0 -1
  1677. package/.output/server/chunks/build/useDcwParamApprovals-DtScUc-W.mjs +0 -121
  1678. package/.output/server/chunks/build/useDcwParamApprovals-DtScUc-W.mjs.map +0 -1
  1679. package/.output/server/chunks/build/useDcwProducts-BMaxzLu6.mjs +0 -93
  1680. package/.output/server/chunks/build/useDcwProducts-BMaxzLu6.mjs.map +0 -1
  1681. package/.output/server/chunks/build/useDcwQuery-TVU3Eo0M.mjs +0 -98
  1682. package/.output/server/chunks/build/useDcwQuery-TVU3Eo0M.mjs.map +0 -1
  1683. package/.output/server/chunks/build/useDcwQuickActions-BREFmR9T.mjs +0 -88
  1684. package/.output/server/chunks/build/useDcwQuickActions-BREFmR9T.mjs.map +0 -1
  1685. package/.output/server/chunks/build/useDcwRecipes-Bc9urA1N.mjs +0 -258
  1686. package/.output/server/chunks/build/useDcwRecipes-Bc9urA1N.mjs.map +0 -1
  1687. package/.output/server/chunks/build/useDcwStream-Dir5ufAU.mjs +0 -452
  1688. package/.output/server/chunks/build/useDcwStream-Dir5ufAU.mjs.map +0 -1
  1689. package/.output/server/chunks/build/useDcwTemplates-BzagZztS.mjs +0 -91
  1690. package/.output/server/chunks/build/useDcwTemplates-BzagZztS.mjs.map +0 -1
  1691. package/.output/server/chunks/build/useDcwWrites-BROwTLCn.mjs +0 -140
  1692. package/.output/server/chunks/build/useDcwWrites-BROwTLCn.mjs.map +0 -1
  1693. package/.output/server/chunks/build/useDeviceTwins-BqwVJaZg.mjs +0 -128
  1694. package/.output/server/chunks/build/useDeviceTwins-BqwVJaZg.mjs.map +0 -1
  1695. package/.output/server/chunks/build/useExpConfirmations-BM626N4p.mjs +0 -107
  1696. package/.output/server/chunks/build/useExpConfirmations-BM626N4p.mjs.map +0 -1
  1697. package/.output/server/chunks/build/useLocalTime-uVSM44Um.mjs +0 -55
  1698. package/.output/server/chunks/build/useLocalTime-uVSM44Um.mjs.map +0 -1
  1699. package/.output/server/chunks/build/useLogsFormat-B-o4MHy7.mjs +0 -77
  1700. package/.output/server/chunks/build/useLogsFormat-B-o4MHy7.mjs.map +0 -1
  1701. package/.output/server/chunks/build/useLogsManual-cVBZQ_Mt.mjs +0 -88
  1702. package/.output/server/chunks/build/useLogsManual-cVBZQ_Mt.mjs.map +0 -1
  1703. package/.output/server/chunks/build/useLogsQuery-D7hrJ3yn.mjs +0 -150
  1704. package/.output/server/chunks/build/useLogsQuery-D7hrJ3yn.mjs.map +0 -1
  1705. package/.output/server/chunks/build/useLogsScope-aaPQeTRm.mjs +0 -83
  1706. package/.output/server/chunks/build/useLogsScope-aaPQeTRm.mjs.map +0 -1
  1707. package/.output/server/chunks/build/useMonitorColumns-vVnt3r5Q.mjs +0 -217
  1708. package/.output/server/chunks/build/useMonitorColumns-vVnt3r5Q.mjs.map +0 -1
  1709. package/.output/server/chunks/build/useMonitorData-DIkiLr_h.mjs +0 -135
  1710. package/.output/server/chunks/build/useMonitorData-DIkiLr_h.mjs.map +0 -1
  1711. package/.output/server/chunks/build/useMonitorFormat-CyURtH8N.mjs +0 -91
  1712. package/.output/server/chunks/build/useMonitorFormat-CyURtH8N.mjs.map +0 -1
  1713. package/.output/server/chunks/build/useMonitorTerminal-Dj4QwRNW.mjs +0 -71
  1714. package/.output/server/chunks/build/useMonitorTerminal-Dj4QwRNW.mjs.map +0 -1
  1715. package/.output/server/chunks/build/useOperationsFeed-Ci4mZAn_.mjs +0 -195
  1716. package/.output/server/chunks/build/useOperationsFeed-Ci4mZAn_.mjs.map +0 -1
  1717. package/.output/server/chunks/build/useOpsLog-C-M6Eace.mjs +0 -149
  1718. package/.output/server/chunks/build/useOpsLog-C-M6Eace.mjs.map +0 -1
  1719. package/.output/server/chunks/build/useRecipeDispatchApprovals-BYtiqfeb.mjs +0 -156
  1720. package/.output/server/chunks/build/useRecipeDispatchApprovals-BYtiqfeb.mjs.map +0 -1
  1721. package/.output/server/chunks/build/useResponsive-BKDMGTHs.mjs.map +0 -1
  1722. package/.output/server/chunks/build/useTeamActions-BDjU06LP.mjs +0 -79
  1723. package/.output/server/chunks/build/useTeamActions-BDjU06LP.mjs.map +0 -1
  1724. package/.output/server/chunks/build/useTeamAddMemberDialog-J3oFn3FI.mjs +0 -84
  1725. package/.output/server/chunks/build/useTeamAddMemberDialog-J3oFn3FI.mjs.map +0 -1
  1726. package/.output/server/chunks/build/useTeamCreateDialog-fbn4ixYu.mjs +0 -97
  1727. package/.output/server/chunks/build/useTeamCreateDialog-fbn4ixYu.mjs.map +0 -1
  1728. package/.output/server/chunks/build/useTeamDeployDialog-BNezMD2k.mjs +0 -80
  1729. package/.output/server/chunks/build/useTeamDeployDialog-BNezMD2k.mjs.map +0 -1
  1730. package/.output/server/chunks/build/useTeamDialogState-CFRUQxAf.mjs +0 -82
  1731. package/.output/server/chunks/build/useTeamDialogState-CFRUQxAf.mjs.map +0 -1
  1732. package/.output/server/chunks/build/useTeamPluginDialog-BZznrOVe.mjs +0 -103
  1733. package/.output/server/chunks/build/useTeamPluginDialog-BZznrOVe.mjs.map +0 -1
  1734. package/.output/server/chunks/build/useTeamsCatalog-DuZFP3oG.mjs +0 -123
  1735. package/.output/server/chunks/build/useTeamsCatalog-DuZFP3oG.mjs.map +0 -1
  1736. package/.output/server/chunks/build/useTokenClipboard-CwQpoFeP.mjs +0 -72
  1737. package/.output/server/chunks/build/useTokenClipboard-CwQpoFeP.mjs.map +0 -1
  1738. package/.output/server/chunks/build/useTokenCreate-Ctl0YGhL.mjs +0 -115
  1739. package/.output/server/chunks/build/useTokenCreate-Ctl0YGhL.mjs.map +0 -1
  1740. package/.output/server/chunks/build/useTokenRename-Cm3ypSfN.mjs +0 -87
  1741. package/.output/server/chunks/build/useTokenRename-Cm3ypSfN.mjs.map +0 -1
  1742. package/.output/server/chunks/build/useTokenReveal-CeoWL5Mt.mjs +0 -118
  1743. package/.output/server/chunks/build/useTokenReveal-CeoWL5Mt.mjs.map +0 -1
  1744. package/.output/server/chunks/build/useTokensList-CNIzON3u.mjs +0 -92
  1745. package/.output/server/chunks/build/useTokensList-CNIzON3u.mjs.map +0 -1
  1746. package/.output/server/chunks/build/useTownBus-D9SoIsAN.mjs.map +0 -1
  1747. package/.output/server/chunks/build/useWorkbenchAuth-CY-bVFMu.mjs +0 -141
  1748. package/.output/server/chunks/build/useWorkbenchAuth-CY-bVFMu.mjs.map +0 -1
  1749. package/.output/server/chunks/build/useWorkbenchWorkspaces-DhZQFss9.mjs +0 -138
  1750. package/.output/server/chunks/build/useWorkbenchWorkspaces-DhZQFss9.mjs.map +0 -1
  1751. package/.output/server/chunks/build/useWorkshopApi-BxHn-4iR.mjs +0 -127
  1752. package/.output/server/chunks/build/useWorkshopApi-BxHn-4iR.mjs.map +0 -1
  1753. package/.output/server/chunks/build/useWorkshopWs-YQ5URrbt.mjs +0 -1659
  1754. package/.output/server/chunks/build/useWorkshopWs-YQ5URrbt.mjs.map +0 -1
  1755. package/.output/server/chunks/build/useWorkspaceAuth-Dlvj9csD.mjs +0 -60
  1756. package/.output/server/chunks/build/useWorkspaceAuth-Dlvj9csD.mjs.map +0 -1
  1757. package/.output/server/chunks/build/useWorkspaceChannels-CPFepxTN.mjs +0 -92
  1758. package/.output/server/chunks/build/useWorkspaceChannels-CPFepxTN.mjs.map +0 -1
  1759. package/.output/server/chunks/build/useWorkspacePanels-CTwREmq0.mjs +0 -78
  1760. package/.output/server/chunks/build/useWorkspacePanels-CTwREmq0.mjs.map +0 -1
  1761. package/.output/server/chunks/build/useWorkspaceShell-BCypjjjE.mjs +0 -168
  1762. package/.output/server/chunks/build/useWorkspaceShell-BCypjjjE.mjs.map +0 -1
  1763. package/.output/server/chunks/build/users-DjiVC_tS.mjs +0 -569
  1764. package/.output/server/chunks/build/users-DjiVC_tS.mjs.map +0 -1
  1765. package/.output/server/chunks/build/workshop-1gKeDASV.mjs +0 -546
  1766. package/.output/server/chunks/build/workshop-1gKeDASV.mjs.map +0 -1
  1767. package/.output/server/chunks/build/workspaces-CmW0cpOt.mjs.map +0 -1
  1768. package/app/.mimosa/hook-state/sess_05189059-e42d-4188-8911-4f7baabe009b.json +0 -1
  1769. package/app/.mimosa/hook-state/sess_05189059-e42d-4188-8911-4f7baabe009b.mtg0vz68-49792-75b0709555.baseline/1459e6269990a5d229b9228c8b2f62ffaa7d350068380ae8b875fee0db45cca6.source +0 -180
  1770. package/app/.mimosa/hook-state/sess_05189059-e42d-4188-8911-4f7baabe009b.mtg0vz68-49792-75b0709555.baseline/c2991e909c70c5c12b90a407c7adcf63384c51668a2b334e6e047fa675c268fe.source +0 -305
  1771. package/app/.mimosa/hook-state/sess_05189059-e42d-4188-8911-4f7baabe009b.mtg0vz68-49792-75b0709555.baseline/e09129039d1e27e3fac24becc9bdafd2d1a7c8049bff24173df007be865f0165.source +0 -264
  1772. package/app/.mimosa/hook-status/sess_05189059-e42d-4188-8911-4f7baabe009b-28ef7c75ea.json +0 -14
  1773. package/server/.mimosa/hook-state/sess_869e5bfd-07f4-4b6e-a991-6221fcf6b7d2.json +0 -1
  1774. package/server/.mimosa/hook-state/sess_869e5bfd-07f4-4b6e-a991-6221fcf6b7d2.mvhn1irp-99488-e3fdc1cbfc.baseline/942d2679b87b96c612b4f2a425c3ccc5b6f3234f0cf589a8441602f866fbe277.source +0 -41
  1775. package/server/.mimosa/hook-state/sess_869e5bfd-07f4-4b6e-a991-6221fcf6b7d2.mvhn1irp-99488-e3fdc1cbfc.baseline/dd617a82339d2c61e49e28e416aabeb2fc100fb3cb1beca18d02dfb833214af6.source +0 -51
  1776. package/server/.mimosa/hook-status/sess_869e5bfd-07f4-4b6e-a991-6221fcf6b7d2-e67b6b91bf.json +0 -14
  1777. package/server/services/workshop/.mimosa/hook-state/sess_fed429fb-c8b7-4a50-bbd6-45afc580893f.json +0 -1
  1778. package/server/services/workshop/.mimosa/hook-status/sess_fed429fb-c8b7-4a50-bbd6-45afc580893f-e6b75bbfe6.json +0 -14
  1779. package/server/services/workshop/aml/python/__pycache__/aml_eval.cpython-312.pyc +0 -0
  1780. package/server/services/workshop/aml/python/__pycache__/amlkit.cpython-312.pyc +0 -0
  1781. package/server/services/workshop/aml/python/__pycache__/train-example.cpython-312.pyc +0 -0
  1782. package/server/services/workshop/aml/python/__pycache__/train-hybrid-example.cpython-312.pyc +0 -0
  1783. package/server/services/workshop/optimization/python/.mimosa/hook-state/session_187ec97f45d4bd02369bbe94da527cf1.json +0 -1
  1784. package/server/services/workshop/optimization/python/.mimosa/hook-state/session_187ec97f45d4bd02369bbe94da527cf1.mvjqkcs6-68688-fb7131a89c.baseline/190a6772a4e43801737b4ba6072eb9d53d3099b5d8a9e6f57bc5e8592a26a6c4.source +0 -274
  1785. package/server/services/workshop/optimization/python/.mimosa/hook-status/session_187ec97f45d4bd02369bbe94da527cf1-01ed7f04fa.json +0 -14
  1786. package/server/services/workshop/optimization/python/__pycache__/problems.cpython-312.pyc +0 -0
  1787. /package/.output/public/_nuxt/{6P4ZAzxa2.js → 6P4ZAzxa.js} +0 -0
  1788. /package/.output/public/_nuxt/{9j2J4k4w.js → 9j2J4k4w2.js} +0 -0
  1789. /package/.output/public/_nuxt/{DgrK8UCQ.js → BvRk9kiK2.js} +0 -0
  1790. /package/.output/public/_nuxt/{dVw8IHY62.js → dVw8IHY6.js} +0 -0
  1791. /package/.output/public/_nuxt/{k9b520K-.js → k9b520K-2.js} +0 -0
  1792. /package/.output/server/chunks/{build → _}/builtin-catalog-edpDcgfL.mjs +0 -0
  1793. /package/.output/server/chunks/{build → _}/chart-pipeline-BpoWYMK_.mjs +0 -0
  1794. /package/.output/server/chunks/{build → _}/chart-trend-BWeZh5Lv.mjs +0 -0
  1795. /package/.output/server/chunks/{build → _}/dcw-driver-badge-Df5wL_ZA.mjs +0 -0
  1796. /package/.output/server/chunks/{build → _}/narrow-fetch-CcG-BPxc.mjs +0 -0
  1797. /package/.output/server/chunks/{build → _}/useResponsive-BKDMGTHs.mjs +0 -0
  1798. /package/.output/server/chunks/{build → _}/useTownBus-D9SoIsAN.mjs +0 -0
  1799. /package/.output/server/chunks/{build → _}/workspaces-CmW0cpOt.mjs +0 -0
@@ -1,697 +1,792 @@
1
- #!/usr/bin/env node
2
- /**
3
- * 节点级写授权(双轨)× 三模式 真实 harness 验收(2026-10-28)。
4
- *
5
- * 真实平台(.output 生产构建)+ 真实 omp 子进程 + 本机 LM Studio Qwen3.5-9B(32k 上下文),
6
- * 三个 Channel 分别 observe / manual / auto;Agent 只持 **dcw 节点绑定(点位写授权)**,
7
- * 不绑配方 —— 验证「授权跟设备走、管控跟活动配方走」在真实 Agent 回合里成立:
8
- * - observe:只读数采并给出分析结论,产线零写入;
9
- * - manual :频道层钳位 → recipe_trial 挂人工审批,批准后 60→58,ACK 证实,版本不变;
10
- * - auto :全链 auto → recipe_trial 免批直执行,60→62,ACK 证实。
11
- * 另检查 IDD 集成(插件在位/后端可达/不启动分析)与工具注入面(节点授权清单)。
12
- *
13
- * 运行:node scripts/e2e-node-binding-3mode-real.mjs
14
- * 环境:LM Studio 127.0.0.1:1234 模型 qwen3.5-9b-32k;隔离实例 PORT=3410。
15
- * 证据:docs/audit/evidence/2026-10-28-node-binding-3mode/report.json
16
- */
17
- import { spawn, spawnSync } from 'node:child_process'
18
- import { existsSync, mkdirSync, openSync, readFileSync, rmSync, writeFileSync } from 'node:fs'
19
- import { dirname, join, resolve } from 'node:path'
20
- import { fileURLToPath } from 'node:url'
21
- import { DatabaseSync } from 'node:sqlite'
22
-
23
- const REPO = resolve(dirname(fileURLToPath(import.meta.url)), '..')
24
- const HOME = process.env.AW_ACCEPT_HOME ?? 'D:/tmp/aw-node-scoped-20261028'
25
- const PORT = Number(process.env.AW_ACCEPT_PORT ?? 3410)
26
- const BASE = `http://127.0.0.1:${PORT}`
27
- const MODEL = { provider: 'lm-studio', model: 'qwen3.5-9b-32k', contextTokens: 32768 }
28
- const MODEL_LLM = { provider: MODEL.provider, model: MODEL.model }
29
- const EVIDENCE_DIR = join(REPO, 'docs', 'audit', 'evidence', '2026-10-28-node-binding-3mode')
30
- const results = []
31
- const sleep = ms => new Promise(r => setTimeout(r, ms))
32
- const ok = (id, name, cond, detail = '') => {
33
- results.push({ id, name, pass: Boolean(cond), detail: String(detail).slice(0, 1200) })
34
- console.log(`${cond ? '✔' : '✖'} [${id}] ${name}${cond ? '' : ` — ${String(detail).slice(0, 800)}`}`)
35
- return Boolean(cond)
36
- }
37
-
38
- function stopOwnedInstance() {
39
- const pidFile = join(HOME, 'server.pid')
40
- if (!existsSync(pidFile)) return
41
- const pid = Number(readFileSync(pidFile, 'utf8').trim())
42
- if (!Number.isInteger(pid) || pid <= 0) return
43
- try {
44
- spawnSync('taskkill', ['/PID', String(pid), '/T', '/F'], { windowsHide: true })
45
- }
46
- catch { /* 已退出 */ }
47
- }
48
-
49
- async function health() {
50
- try {
51
- const r = await fetch(`${BASE}/api/health`, { signal: AbortSignal.timeout(2500) })
52
- if (!r.ok) return null
53
- return (await r.json())?.data ?? null
54
- }
55
- catch {
56
- return null
57
- }
58
- }
59
-
60
- async function startInstance() {
61
- // 先清掉本目录上次留下的实例(pid 文件来自本验收目录,杀的是我们自己起的进程)
62
- stopOwnedInstance()
63
- await sleep(1500)
64
- const running = await health()
65
- if (running) throw new Error(`端口 ${PORT} 已被非本验收实例占用:${running.app} ${running.version}`)
66
- if (process.env.AW_ACCEPT_RESET !== '0') {
67
- if (!/aw-node-scoped/.test(HOME)) throw new Error(`拒绝清理非验收目录:${HOME}`)
68
- rmSync(HOME, { recursive: true, force: true })
69
- }
70
- mkdirSync(HOME, { recursive: true })
71
- const log = openSync(join(HOME, 'server.log'), 'a')
72
- const child = spawn(process.execPath, [join(REPO, '.output', 'server', 'index.mjs')], {
73
- cwd: REPO,
74
- env: {
75
- ...process.env,
76
- AW_MODE: 'home',
77
- AW_HOME: HOME,
78
- PORT: String(PORT),
79
- NUXT_SESSION_PASSWORD: 'node-scoped-20261028-session-key-abcdef',
80
- AW_TRIAL_INTERVAL_MS: '0',
81
- AW_RATE_LIMIT_OFF: '1',
82
- NO_PROXY: '127.0.0.1,localhost',
83
- },
84
- detached: true,
85
- stdio: ['ignore', log, log],
86
- windowsHide: true,
87
- })
88
- child.unref()
89
- writeFileSync(join(HOME, 'server.pid'), String(child.pid))
90
- for (let i = 0; i < 90; i++) {
91
- await sleep(1000)
92
- const h = await health()
93
- if (h?.workshop === 'ready') return h
94
- }
95
- throw new Error('隔离实例未在 90s 内就绪')
96
- }
97
-
98
- let admin = ''
99
- async function api(method, path, body, token = admin, extraHeaders = {}, timeoutMs = 120_000) {
100
- const res = await fetch(BASE + path, {
101
- method,
102
- headers: {
103
- ...(body !== undefined ? { 'content-type': 'application/json' } : {}),
104
- ...(token ? { authorization: `Bearer ${token}` } : {}),
105
- ...extraHeaders,
106
- },
107
- body: body === undefined ? undefined : JSON.stringify(body),
108
- signal: AbortSignal.timeout(timeoutMs),
109
- })
110
- let json = null
111
- try {
112
- json = await res.json()
113
- }
114
- catch { /* 非 JSON */ }
115
- return { status: res.status, ...json }
116
- }
117
-
118
- const dbPath = join(HOME, 'data', 'workshop.sqlite')
119
- function agentTokenOf(agentId) {
120
- const db = new DatabaseSync(dbPath, { readOnly: true })
121
- try {
122
- return String(db.prepare('SELECT token FROM channel_agents WHERE id = ?').get(agentId)?.token ?? '')
123
- }
124
- finally {
125
- db.close()
126
- }
127
- }
128
-
129
- async function channelAgents(channelId) {
130
- const d = await api('GET', `/api/workshop/channels/${channelId}`)
131
- return d?.data?.agents ?? []
132
- }
133
-
134
- async function pendingOf(agentId) {
135
- const r = await api('GET', `/api/workshop/agent-tools/approvals?agentId=${encodeURIComponent(agentId)}`)
136
- return (r?.data?.approvals ?? []).filter(a => a.status === 'pending')
137
- }
138
-
139
- async function approvalsHistory(agentId) {
140
- const r = await api('GET', `/api/workshop/agent-tools/approvals?agentId=${encodeURIComponent(agentId)}&scope=history`)
141
- return r?.data?.approvals ?? []
142
- }
143
-
144
- async function approve(cardId, comment) {
145
- return api('POST', `/api/workshop/agent-tools/approvals/${cardId}/decide`, { approved: true, comment })
146
- }
147
-
148
- function taskOf(r) {
149
- return r?.data?.task ?? r?.data ?? null
150
- }
151
-
152
- function deliverableOf(task) {
153
- const art = (task?.artifacts ?? []).find(a => a.name === 'deliverable')
154
- return String(art?.parts?.map(p => p.text ?? '').join('\n') ?? '')
155
- }
156
-
157
- function toolCallsOf(task) {
158
- return (task?.history ?? [])
159
- .map(h => String(h?.parts?.map(p => p.text ?? '').join(' ') ?? ''))
160
- .filter(t => t.includes('🔧'))
161
- .map(t => t.replace(/\s+/g, ' ').slice(0, 200))
162
- }
163
-
164
- async function waitTask(taskId, { timeoutMs = 12 * 60_000, autoApprove = false, onCard = null } = {}) {
165
- const started = Date.now()
166
- const cards = []
167
- let lastState = ''
168
- while (Date.now() - started < timeoutMs) {
169
- const r = await api('GET', `/api/workshop/tasks/${taskId}`)
170
- const task = taskOf(r)
171
- const state = String(task?.state ?? '')
172
- if (state !== lastState) {
173
- lastState = state
174
- console.log(` · task ${taskId.slice(0, 8)} state=${state}`)
175
- }
176
- if (autoApprove && task?.assigneeId) {
177
- const pending = await pendingOf(String(task.assigneeId))
178
- for (const card of pending) {
179
- if (cards.some(c => c.id === card.id)) continue
180
- cards.push(card)
181
- if (onCard) onCard(card)
182
- }
183
- }
184
- if (['COMPLETED', 'FAILED', 'CANCELLED'].includes(state)) return { task, cards, timedOut: false }
185
- await sleep(3000)
186
- }
187
- const r = await api('GET', `/api/workshop/tasks/${taskId}`)
188
- return { task: taskOf(r), cards, timedOut: true }
189
- }
190
-
191
- async function submitTask(channelId, title, description) {
192
- const r = await api('POST', `/api/workshop/channels/${channelId}/tasks`, { title, description })
193
- const task = taskOf(r)
194
- if (!task?.id) throw new Error(`任务创建失败: ${JSON.stringify(r).slice(0, 400)}`)
195
- return task
196
- }
197
-
198
- function scenarioLine(name, controlMode, description) {
199
- return api('POST', '/api/workshop/dcw/lines', { name, simulated: true, controlMode, description }).then(r => r.data.line)
200
- }
201
-
202
- async function makeDaq(attrs) {
203
- return (await api('POST', '/api/workshop/daq', {
204
- driver: 'mock',
205
- intervalMs: 1000,
206
- enabled: true,
207
- publishIntervalMs: 0,
208
- ...attrs,
209
- })).data.node
210
- }
211
-
212
- async function makeDcw(attrs) {
213
- return (await api('POST', '/api/workshop/dcw', {
214
- driver: 'mock',
215
- enabled: true,
216
- holdIntervalMs: 0,
217
- readIntervalMs: 0,
218
- writeLockSeconds: 0,
219
- stepLimit: 5,
220
- ...attrs,
221
- })).data.node
222
- }
223
-
224
- async function remapParam(lineId, nodeId, key, desc) {
225
- const params = (await api('GET', `/api/workshop/dcw/params?lineId=${lineId}`)).data.params ?? []
226
- const pm = params.find(p => p.nodeId === nodeId)
227
- if (!pm) throw new Error(`参数映射不存在: node=${nodeId}`)
228
- await api('PATCH', `/api/workshop/dcw/params/${pm.id}`, { key, desc, min: 0, max: 100 })
229
- }
230
-
231
- async function makeChannel(name, lineId, scenarioPrompt, mode, toolNames) {
232
- const ch = (await api('POST', '/api/workshop/channels', {
233
- name,
234
- lineId,
235
- scenarioPrompt,
236
- // 本机 9B 模型易被 omp 原生命令(bash/glob/edit/read 任意路径)带偏:
237
- // --no-tools 关闭全部内置工具,只保留 set_host_tools 注入的 host 工具(本次 4~5 个),
238
- // 让回合严格收敛在任务步骤上;这也是小模型在真实 harness 里的推荐配置。
239
- leadAgent: { name: `${name}-线长`, harness: 'omp', config: { rpcMode: 'rpc', args: ['--no-tools'] } },
240
- })).data
241
- const channelId = ch?.channelId
242
- if (!channelId) throw new Error(`频道创建失败: ${JSON.stringify(ch).slice(0, 300)}`)
243
- await api('PATCH', `/api/workshop/channels/${channelId}`, { llm: MODEL_LLM })
244
- await api('PATCH', `/api/workshop/channels/${channelId}/execution-mode`, mode === 'auto' ? { mode: 'auto', confirm: true } : { mode })
245
- const put = await api('PUT', `/api/workshop/channels/${channelId}/tools`, {
246
- mode: 'selected',
247
- tools: toolNames.map(n => ({ name: n, enabled: true })),
248
- })
249
- const agents = await channelAgents(channelId)
250
- const lead = agents.find(a => a.role === 'lead')
251
- return { channelId, lead, toolsSaved: put.status, agents }
252
- }
253
-
254
- async function bind(agentId, nodeId, kind) {
255
- return api('POST', '/api/workshop/agent-tools/bindings', { agentId, nodeId, kind, mode: 'auto' })
256
- }
257
-
258
- async function bindAuto(agentId, nodeId, kind) {
259
- const b = await bind(agentId, nodeId, kind)
260
- const id = b?.data?.binding?.id
261
- if (id && b?.data?.binding?.mode === 'manual') {
262
- await api('PATCH', `/api/workshop/agent-tools/bindings/${id}`, { mode: 'auto', confirm: true })
263
- }
264
- return b
265
- }
266
-
267
- const OBS_PROMPT = [
268
- '你是观察模式频道(只读)的工艺分析员。严格按三步执行,不要做别的:',
269
- '1) 调用 line_context 获取你负责的产线与活动批次;',
270
- '2) 调用 daq_query(line_id 用上一步返回值,last_minutes=5,bucket_ms=15000,limit=500);',
271
- '3) 用 complete_task 提交结论:每个测点的样本数/均值/最小值/最大值,以及是否超出温度窗口 50~70C。',
272
- '禁止调用任何写工具或配方工具。',
273
- ].join('\n')
274
-
275
- function opsPrompt(value, lineId) {
276
- return [
277
- '你是工艺闭环频道的操作员。严格按三步执行,不要做别的:',
278
- '1) 调用 my_industrial_nodes 查看你绑定的数控节点(记下节点 id;只允许操作它);',
279
- '2) 调用 recipe_trial:line_id="' + lineId + '",params 只包含你绑定的那个数控节点,value=' + value + ',hypothesis 写「验收:活动配方温控试验,目标 ' + value + 'C」;审批由人工处理,工具会返回结果,你不需要等待;',
280
- '3) 立即调用 complete_task 提交 recipe_trial 的完整回执原文与批次 id。',
281
- '本任务只做这三步:禁止复测、禁止等待/睡眠、禁止 recipe_update/rollback、禁止使用 bash/终端/后台任务(除 read(xd://…) 查看工具说明外不要用其他工具)。',
282
- ].join('\n')
283
- }
284
-
285
- // 最小工具面:只留任务必需的 5 个,避免 9B 本地模型在长工具目录里发散探索
286
- const OPS_TOOLS = [
287
- 'my_industrial_nodes',
288
- 'recipe_trial',
289
- 'recipe_rollback',
290
- 'complete_task',
291
- 'report_progress',
292
- ]
293
- // observe 模式下 my_industrial_nodes 被分发面判为写面工具(EXEC_MODE_OBSERVE),不得进 allow-list;
294
- // 其余也只留任务必需的 4 个,避免本地 9B 模型在工具目录里发散探索
295
- const OBS_TOOLS = ['line_context', 'daq_query', 'complete_task', 'report_progress']
296
-
297
- const evidence = {
298
- at: new Date().toISOString(),
299
- env: {
300
- base: BASE,
301
- home: HOME,
302
- version: '',
303
- model: MODEL,
304
- harness: 'omp',
305
- devices: 'mock(daq+dcw)',
306
- note: '真实平台 + 真实 omp 子进程 + 本地 Qwen3.5-9B(32k);设备为内置 mock,无物理响应耦合',
307
- },
308
- scenario: {},
309
- tasks: {},
310
- assertions: results,
311
- idd: {},
312
- }
313
-
314
- async function journalCount(lineId) {
315
- const r = await api('GET', `/api/workshop/dcw/journal?lineId=${lineId}&limit=500`)
316
- return r?.data?.anchors ?? []
317
- }
318
-
319
- /** 等待「控制链完成」而不是死等 LLM 自己收口:审批自动放行,账本出现点位写入后
320
- * 再给模型 15s 调 complete_task;仍未收口则由平台取消任务(控制链证据已成立)。 */
321
- async function waitTrialAndClose(taskId, agentId, lineId, nodeId, opts = {}) {
322
- const started = Date.now()
323
- const since = started - 5000
324
- const cards = []
325
- const timeoutMs = opts.timeoutMs ?? 8 * 60_000
326
- const expectNoHitl = opts.expectNoHitl === true
327
- while (Date.now() - started < timeoutMs) {
328
- const task = taskOf(await api('GET', `/api/workshop/tasks/${taskId}`))
329
- const state = String(task?.state ?? '')
330
- if (['COMPLETED', 'FAILED', 'CANCELLED'].includes(state)) return { task, cards, cancelled: false, timedOut: false }
331
- const pending = await pendingOf(agentId)
332
- for (const card of pending) {
333
- if (cards.some(c => c.id === card.id)) continue
334
- cards.push(card)
335
- console.log(` · HITL card ${card.id} 出现,自动批准`)
336
- await approve(card.id, expectNoHitl ? '验收:自动模式出现审批(记录并放行)' : opts.approvalComment ?? '验收:批准手动模式点位试验')
337
- }
338
- const hit = (await journalCount(lineId)).some(a =>
339
- a.nodeId === nodeId && a.prevValue === opts.prevValue && a.newValue !== opts.prevValue && Date.parse(a.at) >= since)
340
- if (hit) {
341
- await sleep(15_000)
342
- const t2 = taskOf(await api('GET', `/api/workshop/tasks/${taskId}`))
343
- if (['COMPLETED', 'FAILED', 'CANCELLED'].includes(String(t2?.state ?? ''))) return { task: t2, cards, cancelled: false, timedOut: false }
344
- await api('POST', `/api/workshop/tasks/${taskId}/cancel`, {
345
- reason: '验收:控制链已完成,LLM 未在时限内调用 complete_task,平台侧取消收敛',
346
- }, admin)
347
- const t3 = taskOf(await api('GET', `/api/workshop/tasks/${taskId}`))
348
- return { task: t3, cards, cancelled: true, timedOut: false }
349
- }
350
- await sleep(2000)
351
- }
352
- return { task: taskOf(await api('GET', `/api/workshop/tasks/${taskId}`)), cards, cancelled: false, timedOut: true }
353
- }
354
-
355
- try {
356
- const h = await startInstance()
357
- evidence.env.version = String(h?.version ?? '')
358
- ok('R0', '生产构建隔离实例就绪(workshop ready)', h?.workshop === 'ready', `port=${PORT} version=${h?.version}`)
359
-
360
- const reg = await api('POST', '/api/users/register', { name: '验收管理员', email: `accept-${Date.now()}@awshop.local`, password: 'Accept#2026' })
361
- admin = reg?.data?.token
362
- ok('R0b', 'admin 注册/登录', Boolean(admin), `status=${reg.status}`)
363
- writeFileSync(join(HOME, 'admin.json'), JSON.stringify({ token: admin }))
364
-
365
- // IDD 集成面:启用三个插件(只启用,不启动任何分析)
366
- for (const name of ['idd-closedloop-bridge', 'diag-bridge', 'rag-bridge']) {
367
- const en = await api('POST', `/api/workshop/plugins/${name}/enable`, undefined, admin)
368
- if (en.status !== 200) console.log(` · 插件 ${name} 启用返回 ${en.status}: ${String(en?.message ?? '').slice(0, 120)}`)
369
- }
370
-
371
- // ── 两条线:观察线(只读数采)、写入线(两条 DCW + 配方) ──
372
- const obsLine = await scenarioLine('验收-观察线', 'auto', '观察线:薄膜腔体温度/压力监测(模拟设备;真实平台/真实 Agent)')
373
- const writeLine = await scenarioLine('验收-写入线', 'auto', '写入线:薄膜腔体温度点位授权验收(模拟设备;真实平台/真实 Agent)')
374
-
375
- const obsDaqTemp = await makeDaq({
376
- name: '腔体温度(观察线)', templateRef: 'temp-tc', lineId: obsLine.id, unit: 'C', decimals: 2, min: 0, max: 100,
377
- semantics: '腔体温度测点;正常工艺窗口 50~70C',
378
- })
379
- const obsDaqPress = await makeDaq({
380
- name: '系统压力(观察线)', templateRef: 'pressure-tx', lineId: obsLine.id, unit: 'bar', decimals: 2, min: 0, max: 10,
381
- semantics: '系统压力测点;稳定在 4~6 bar',
382
- })
383
- const obsDcw = await makeDcw({
384
- name: '温度设定(观察线)', templateRef: 'temp-sp', lineId: obsLine.id, unit: 'C', decimals: 2, min: 0, max: 100,
385
- driverConfig: { key: 'accept-obs-temp-sp' }, semantics: '观察线温度设定(观察频道不可写)',
386
- })
387
- await remapParam(obsLine.id, obsDcw.id, 'obs_temp_sp', '观察线腔体温度设定值(C)')
388
- const obsProduct = (await api('POST', '/api/workshop/dcw/products', {
389
- name: '验收产品-观察线', lineId: obsLine.id, description: '观察线产品;温度窗口 50~70C',
390
- paramLimits: { obs_temp_sp: { min: 50, max: 70 } },
391
- })).data.product
392
- const obsRecipe = (await api('POST', '/api/workshop/dcw/recipes', {
393
- name: '验收配方-观察线', productId: obsProduct.id, description: '观察线配方(仅用于建立活动批次)',
394
- opIntervalMs: 0,
395
- params: [{ nodeId: obsDcw.id, value: 60, min: 50, max: 70, stepLimit: 4 }],
396
- daqWindows: [{ nodeId: obsDaqTemp.id, min: 50, max: 70 }],
397
- })).data.recipe
398
-
399
- const writeDaq = await makeDaq({
400
- name: '腔体温度(写入线)', templateRef: 'temp-tc', lineId: writeLine.id, unit: 'C', decimals: 2, min: 0, max: 100,
401
- semantics: '腔体温度测点;与温度设定存在 20~60s 响应滞后(本验收为 mock 设备,无物理耦合)',
402
- })
403
- const dcwA = await makeDcw({
404
- name: '温度设定A(写入线)', templateRef: 'temp-sp', lineId: writeLine.id, unit: 'C', decimals: 2, min: 0, max: 100,
405
- driverConfig: { key: 'accept-write-a' }, semantics: '手动频道 Agent 的点位授权节点;单步 <=4C,窗口 50~70C',
406
- })
407
- const dcwB = await makeDcw({
408
- name: '温度设定B(写入线)', templateRef: 'temp-sp', lineId: writeLine.id, unit: 'C', decimals: 2, min: 0, max: 100,
409
- driverConfig: { key: 'accept-write-b' }, semantics: '自动频道 Agent 的点位授权节点;单步 <=4C,窗口 50~70C',
410
- })
411
- await remapParam(writeLine.id, dcwA.id, 'temp_sp_a', '写入线温度设定A(C)')
412
- await remapParam(writeLine.id, dcwB.id, 'temp_sp_b', '写入线温度设定B(C)')
413
- const writeProduct = (await api('POST', '/api/workshop/dcw/products', {
414
- name: '验收产品-写入线', lineId: writeLine.id, description: '写入线产品;两路温度设定窗口 50~70C',
415
- paramLimits: { temp_sp_a: { min: 50, max: 70 }, temp_sp_b: { min: 50, max: 70 } },
416
- })).data.product
417
- const writeRecipe = (await api('POST', '/api/workshop/dcw/recipes', {
418
- name: '验收配方-写入线', productId: writeProduct.id, description: '写入线配方;两路 DCW 参数各由不同 Agent 点位授权',
419
- opIntervalMs: 0,
420
- params: [
421
- { nodeId: dcwA.id, value: 60, min: 50, max: 70, stepLimit: 4 },
422
- { nodeId: dcwB.id, value: 60, min: 50, max: 70, stepLimit: 4 },
423
- ],
424
- daqWindows: [{ nodeId: writeDaq.id, min: 50, max: 70 }],
425
- })).data.recipe
426
-
427
- const startObs = await api('POST', `/api/workshop/dcw/lines/${obsLine.id}/start`, { recipeId: obsRecipe.id })
428
- const startWrite = await api('POST', `/api/workshop/dcw/lines/${writeLine.id}/start`, { recipeId: writeRecipe.id })
429
- ok('R1', '两线开跑(活动批次建立,配方整批下发)', startObs.status === 200 && startWrite.status === 200,
430
- `obs=${startObs.status} write=${startWrite.status}`)
431
-
432
- await sleep(12_000)
433
-
434
- // ── 三个 Channel(真实 omp) ──
435
- const obsCh = await makeChannel('验收-三模式-观察', obsLine.id, '观察模式频道:只做数采与工艺分析,物理零写。', 'observe', OBS_TOOLS)
436
- const manualCh = await makeChannel('验收-三模式-手动', writeLine.id, '手动模式频道:每次配方试验都必须经人工批准;只操作你绑定的点位。验收场景只执行任务描述,不复测、不等待、不固化。', 'manual', OPS_TOOLS)
437
- const autoCh = await makeChannel('验收-三模式-自动', writeLine.id, '自动模式频道:限界内自动执行配方试验;只操作你绑定的点位。验收场景只执行任务描述,不复测、不等待、不固化。', 'auto', OPS_TOOLS)
438
- ok('R2', '三频道创建 + 执行模式 + 工具面(omp/selected)', Boolean(obsCh.channelId && manualCh.channelId && autoCh.channelId) && obsCh.toolsSaved === 200 && manualCh.toolsSaved === 200 && autoCh.toolsSaved === 200,
439
- JSON.stringify({ obs: obsCh.channelId, manual: manualCh.channelId, auto: autoCh.channelId, tools: [obsCh.toolsSaved, manualCh.toolsSaved, autoCh.toolsSaved] }))
440
-
441
- const obsLead = obsCh.lead
442
- const manualLead = manualCh.lead
443
- const autoLead = autoCh.lead
444
-
445
- // 节点绑定:观察=daq;手动/自动=各自的 dcw 点位(不绑配方)
446
- const obsBind = await bindAuto(obsLead.id, obsDaqTemp.id, 'daq')
447
- const manualBind = await bindAuto(manualLead.id, dcwA.id, 'dcw')
448
- const autoBind = await bindAuto(autoLead.id, dcwB.id, 'dcw')
449
- ok('R2b', '点位绑定落库(观察=daq,手动/自动=各自 dcw;无配方绑定)',
450
- obsBind.status === 200 && manualBind.status === 200 && autoBind.status === 200,
451
- `status=${obsBind.status}/${manualBind.status}/${autoBind.status} kinds=${obsBind?.data?.binding?.kind}/${manualBind?.data?.binding?.kind}/${autoBind?.data?.binding?.kind}`)
452
-
453
- const tok = { obs: agentTokenOf(obsLead.id), manual: agentTokenOf(manualLead.id), auto: agentTokenOf(autoLead.id) }
454
- const descOf = async (agentId, token) => {
455
- const r = await api('GET', `/api/workshop/agent-tools/list?agentId=${encodeURIComponent(agentId)}`, undefined, undefined, { 'x-aw-agent-token': token })
456
- return (r?.data?.tools ?? []).find(t => t.name === 'recipe_trial')?.description ?? ''
457
- }
458
- const descManual = String(await descOf(manualLead.id, tok.manual))
459
- const descAuto = String(await descOf(autoLead.id, tok.auto))
460
- ok('R2c', '工具注入面按 Agent 点位授权差异化(手动只见A,自动只见B)',
461
- descManual.includes(dcwA.id) && !descManual.includes(dcwB.id) && descAuto.includes(dcwB.id) && !descAuto.includes(dcwA.id),
462
- `manual=${descManual.slice(-180)} | auto=${descAuto.slice(-180)}`)
463
-
464
- evidence.scenario = {
465
- lines: { obs: obsLine.id, write: writeLine.id },
466
- recipes: { obs: obsRecipe.id, write: writeRecipe.id },
467
- dcw: { a: dcwA.id, b: dcwB.id },
468
- daq: { obsTemp: obsDaqTemp.id, obsPress: obsDaqPress.id, write: writeDaq.id },
469
- channels: { obs: obsCh.channelId, manual: manualCh.channelId, auto: autoCh.channelId },
470
- agents: { obs: obsLead.id, manual: manualLead.id, auto: autoLead.id },
471
- bindings: { obs: obsBind?.data?.binding?.id, manual: manualBind?.data?.binding?.id, auto: autoBind?.data?.binding?.id },
472
- }
473
-
474
- const obsJournalBefore = (await journalCount(obsLine.id)).length
475
-
476
- // ── 观察模式任务 ──
477
- const obsTask = await submitTask(obsCh.channelId, '验收-观察模式-数采分析', OBS_PROMPT)
478
- const t0 = Date.now()
479
- const obsRun = await waitTask(obsTask.id, { timeoutMs: 12 * 60_000 })
480
- const obsDeliverable = deliverableOf(obsRun.task)
481
- const obsJournalAfter = await journalCount(obsLine.id)
482
- const obsHistory = await approvalsHistory(obsLead.id)
483
- ok('R3', '观察模式任务 COMPLETED', obsRun.task?.state === 'COMPLETED', `state=${obsRun.task?.state} elapsed=${Math.round((Date.now() - t0) / 1000)}s`)
484
- ok('R3b', '观察结论含样本统计与温度窗口判定', /样本|均值|最小|最大/.test(obsDeliverable) && /50|70|窗口/.test(obsDeliverable), obsDeliverable.slice(0, 400))
485
- ok('R3c', '观察模式产线零写入(账本条数不增)', obsJournalAfter.length === obsJournalBefore, `before=${obsJournalBefore} after=${obsJournalAfter.length}`)
486
- ok('R3d', '观察模式无写审批(只读频道)', obsHistory.length === 0, `approvals=${obsHistory.length}`)
487
- evidence.tasks.obs = { id: obsTask.id, state: obsRun.task?.state, elapsedSec: Math.round((Date.now() - t0) / 1000), deliverable: obsDeliverable, toolCalls: toolCallsOf(obsRun.task) }
488
-
489
- // ── 手动模式任务(频道钳位 → HITL) ──
490
- const manualTask = await submitTask(manualCh.channelId, '验收-手动模式-点位试验', opsPrompt(58, writeLine.id))
491
- const m0 = Date.now()
492
- const manualRun = await waitTrialAndClose(manualTask.id, manualLead.id, writeLine.id, dcwA.id, {
493
- prevValue: 60,
494
- approvalComment: '验收:批准手动模式点位试验',
495
- })
496
- const writeJournal = await journalCount(writeLine.id)
497
- const manualEntries = writeJournal.filter(a => a.nodeId === dcwA.id && a.prevValue === 60 && a.newValue !== 60 && Date.parse(a.at) >= m0 - 5000)
498
- const manualTrial = manualEntries[0]
499
- const manualHistory = await approvalsHistory(manualLead.id)
500
- const manualCard = manualRun.cards[0]
501
- const manualCardRow = manualCard ? manualHistory.find(a => a.id === manualCard.id) : null
502
- const manualNode = await api('GET', '/api/workshop/dcw')
503
- const manualNodeRow = (manualNode?.data?.nodes ?? []).find(n => n.id === dcwA.id)
504
- ok('R4', '手动模式控制链完成(HITL → 点位写授权下发)', Boolean(manualTrial), `journal=${JSON.stringify(manualTrial ?? null)} task=${manualRun.task?.state}`)
505
- ok('R4a', '手动模式触发人工审批(频道 manual 钳位)', manualRun.cards.length >= 1, `cards=${manualRun.cards.map(c => c.id).join(',')}`)
506
- ok('R4b', '人工审批落定 approved(附言回流)', manualCardRow?.status === 'approved', `card=${manualCard?.id} status=${manualCardRow?.status} comment=${manualCardRow?.comment}`)
507
- ok('R4c', `手动模式点位写入落账 60→${manualTrial?.newValue ?? '?'}(点位写授权,无配方绑定)`,
508
- Boolean(manualTrial) && Number(manualTrial.newValue) >= 50 && Number(manualTrial.newValue) <= 70,
509
- JSON.stringify(manualTrial ?? null).slice(0, 400))
510
- ok('R4d', '手动模式设备侧现值=账本新值(独立回读)', Number(manualNodeRow?.value) === Number(manualTrial?.newValue),
511
- `value=${manualNodeRow?.value} journal=${manualTrial?.newValue}`)
512
- const versions = await api('GET', `/api/workshop/dcw/recipes/${writeRecipe.id}/versions`)
513
- const versionRows = versions?.data?.versions ?? versions?.data ?? []
514
- ok('R4e', '试验不写配方版本(仍为 v1)', (versionRows[0]?.version ?? 1) === 1, `versions=${versionRows.map(v => v.version).join(',')}`)
515
- ok('R4f', '任务收口(模型 complete_task 或平台取消收敛)', manualRun.task?.state === 'COMPLETED' || manualRun.cancelled,
516
- `state=${manualRun.task?.state} cancelledByOperator=${manualRun.cancelled}`)
517
- evidence.tasks.manual = {
518
- id: manualTask.id, state: manualRun.task?.state, cancelledByOperator: manualRun.cancelled,
519
- elapsedSec: Math.round((Date.now() - m0) / 1000), deliverable: deliverableOf(manualRun.task),
520
- toolCalls: toolCallsOf(manualRun.task),
521
- hitl: manualRun.cards.map(c => ({ id: c.id, status: c.status, detail: c.detail, payload: c.payload })),
522
- hitlHistory: manualHistory.map(a => ({ id: a.id, status: a.status, comment: a.comment, decidedBy: a.decidedBy })),
523
- journal: manualEntries.slice(-3), approvals: manualCard ? manualCard.id : null,
524
- }
525
-
526
- // ── 自动模式任务(全链 auto,免批) ──
527
- const autoTask = await submitTask(autoCh.channelId, '验收-自动模式-点位试验', opsPrompt(62, writeLine.id))
528
- const a0 = Date.now()
529
- const autoRun = await waitTrialAndClose(autoTask.id, autoLead.id, writeLine.id, dcwB.id, {
530
- prevValue: 60,
531
- expectNoHitl: true,
532
- })
533
- const autoHistory = await approvalsHistory(autoLead.id)
534
- const autoCardsInWindow = autoHistory.filter(a => Date.parse(a.createdAt ?? 0) >= a0 - 5000)
535
- const autoEntries = (await journalCount(writeLine.id)).filter(a => a.nodeId === dcwB.id && a.prevValue === 60 && a.newValue !== 60 && Date.parse(a.at) >= a0 - 5000)
536
- const autoTrial = autoEntries[0]
537
- const autoNode = await api('GET', '/api/workshop/dcw')
538
- const autoNodeRow = (autoNode?.data?.nodes ?? []).find(n => n.id === dcwB.id)
539
- ok('R5', '自动模式控制链完成(免批 → 点位写授权下发)', Boolean(autoTrial), `journal=${JSON.stringify(autoTrial ?? null)} task=${autoRun.task?.state}`)
540
- ok('R5a', '自动模式全程无人工审批(全链 auto)', autoRun.cards.length === 0 && autoCardsInWindow.length === 0,
541
- `cards=${autoRun.cards.length} historyInWindow=${autoCardsInWindow.length}`)
542
- ok('R5b', `自动模式点位写入落账 60→${autoTrial?.newValue ?? '?'}(点位写授权,无配方绑定)`,
543
- Boolean(autoTrial) && Number(autoTrial.newValue) >= 50 && Number(autoTrial.newValue) <= 70,
544
- JSON.stringify(autoTrial ?? null).slice(0, 400))
545
- ok('R5c', '自动模式设备侧现值=账本新值(独立回读)', Number(autoNodeRow?.value) === Number(autoTrial?.newValue),
546
- `value=${autoNodeRow?.value} journal=${autoTrial?.newValue}`)
547
- ok('R5d', '任务收口(模型 complete_task 或平台取消收敛)', autoRun.task?.state === 'COMPLETED' || autoRun.cancelled,
548
- `state=${autoRun.task?.state} cancelledByOperator=${autoRun.cancelled}`)
549
- evidence.tasks.auto = {
550
- id: autoTask.id, state: autoRun.task?.state, cancelledByOperator: autoRun.cancelled,
551
- elapsedSec: Math.round((Date.now() - a0) / 1000), deliverable: deliverableOf(autoRun.task),
552
- toolCalls: toolCallsOf(autoRun.task), hitl: autoRun.cards.map(c => ({ id: c.id, status: c.status })), journal: autoEntries.slice(-3),
553
- }
554
-
555
- // ── 双轨授权复核:同一活动配方、两个 Agent 各写自己的点位,互不越权 ──
556
- const writeJournalAll = await journalCount(writeLine.id)
557
- const trialA = writeJournalAll.filter(a => a.nodeId === dcwA.id && a.prevValue === 60 && a.newValue !== 60)
558
- const trialB = writeJournalAll.filter(a => a.nodeId === dcwB.id && a.prevValue === 60 && a.newValue !== 60)
559
- ok('R6', `同一活动配方下两条轨迹各自落账(A 60→${trialA[0]?.newValue ?? '?'}, B 60→${trialB[0]?.newValue ?? '?'})`,
560
- trialA.length >= 1 && trialB.length >= 1 && trialA[0].recipeRunId !== trialB[0].recipeRunId,
561
- `A=${JSON.stringify(trialA.slice(0, 1))} B=${JSON.stringify(trialB.slice(0, 1))}`)
562
-
563
- // ── 配方历史 + 统一回退(recipe 绑定 = 配方级操作权;节点下发历史由批次/账本记录) ──
564
- // 回退是配方级操作:复用自动频道 lead(已有 dcwB 点位绑定),再补一条配方绑定;
565
- // 前面的三模式试验已在无配方绑定时完成,故不污染「纯点位授权」证据。
566
- const rbBind = await bindAuto(autoLead.id, writeRecipe.id, 'recipe')
567
- const patchV2 = await api('PATCH', `/api/workshop/dcw/recipes/${writeRecipe.id}`, {
568
- params: [
569
- { nodeId: dcwA.id, value: 56, min: 50, max: 70, stepLimit: 4 },
570
- { nodeId: dcwB.id, value: 64, min: 50, max: 70, stepLimit: 4 },
571
- ],
572
- }, admin)
573
- const versionsV2 = (await api('GET', `/api/workshop/dcw/recipes/${writeRecipe.id}/versions`))?.data?.versions ?? []
574
- const v2 = versionsV2.find(v => v.version >= 2 && Array.isArray(v.params) && v.params.some(p => p.nodeId === dcwA.id && p.value === 56))
575
- ok('R8a', '配方定义版本化(v2 = 56/64,归因用户)', Boolean(rbBind?.data?.binding?.id) && Boolean(v2) && patchV2.status === 200,
576
- `bind=${rbBind?.data?.binding?.kind} versions=${versionsV2.map(v => v.version).join(',')} patch=${patchV2.status}`)
577
- const preRb = await journalCount(writeLine.id)
578
- const preRbA = preRb.find(a => a.nodeId === dcwA.id)
579
- const preRbB = preRb.find(a => a.nodeId === dcwB.id)
580
- const rb = await api('POST', '/api/workshop/agent-tools/invoke', {
581
- agentId: autoLead.id,
582
- tool: 'recipe_rollback',
583
- args: { recipe_id: writeRecipe.id, version: 1, dispatch: true, reason: '验收:统一回退到 v1(历史+回退验证)' },
584
- }, undefined, { 'x-aw-agent-token': tok.auto })
585
- const rbText = String(rb?.data?.result?.text ?? rb?.data?.text ?? '')
586
- ok('R8b', '配方级统一回退(recipe_rollback v1 + dispatch)执行成功', !(rb?.data?.result?.isError ?? rb?.data?.isError) && /统一回退完成/.test(rbText),
587
- rbText.slice(0, 400))
588
- const afterRbJournal = await journalCount(writeLine.id)
589
- const preRbIds = new Set(preRb.map(a => a.id))
590
- const rbNew = afterRbJournal.filter(a => !preRbIds.has(a.id))
591
- const rbA = rbNew.filter(a => a.nodeId === dcwA.id && a.newValue === 60 && a.prevValue === preRbA?.newValue)
592
- const rbB = rbNew.filter(a => a.nodeId === dcwB.id && a.newValue === 60 && a.prevValue === preRbB?.newValue)
593
- const nodesAfterRb = await api('GET', '/api/workshop/dcw')
594
- const rbNodeA = (nodesAfterRb?.data?.nodes ?? []).find(n => n.id === dcwA.id)
595
- const rbNodeB = (nodesAfterRb?.data?.nodes ?? []).find(n => n.id === dcwB.id)
596
- ok('R8c', `回退逐节点落账(${preRbA?.newValue}→60 / ${preRbB?.newValue}→60,回退批次新账本)`, rbA.length >= 1 && rbB.length >= 1,
597
- `A=${JSON.stringify(rbA.slice(0, 1))} B=${JSON.stringify(rbB.slice(0, 1))}`)
598
- ok('R8d', '回退后设备侧恢复 60/60', Number(rbNodeA?.value) === 60 && Number(rbNodeB?.value) === 60,
599
- `A=${rbNodeA?.value} B=${rbNodeB?.value}`)
600
- const versionsAfterRb = (await api('GET', `/api/workshop/dcw/recipes/${writeRecipe.id}/versions`))?.data?.versions ?? []
601
- const v3 = versionsAfterRb.find(v => v.version >= 3 && Array.isArray(v.params)
602
- && v.params.some(p => p.nodeId === dcwA.id && p.value === 60) && v.params.some(p => p.nodeId === dcwB.id && p.value === 60))
603
- ok('R8e', '回退生成新版本 v3(定义 60/60,历史 v1/v2 保留)', Boolean(v3),
604
- `versions=${versionsAfterRb.map(v => `${v.version}:${(v.params ?? []).map(p => p.value).join('/')}`).join(',')}`)
605
- evidence.rollback = {
606
- worker: autoLead.id, binding: rbBind?.data?.binding?.id, response: rbText,
607
- journal: [...rbA.slice(0, 1), ...rbB.slice(0, 1)],
608
- versions: versionsAfterRb.map(v => ({ version: v.version, values: (v.params ?? []).map(p => p.value), by: v.by })),
609
- }
610
-
611
- // ── 换配方:活动配方 B 接管 DCW 管控;同一节点绑定 Agent 无需新绑定 ──
612
- await api('POST', `/api/workshop/dcw/lines/${writeLine.id}/stop`, undefined, admin)
613
- const recipeB = (await api('POST', '/api/workshop/dcw/recipes', {
614
- productId: writeProduct.id,
615
- name: '验收配方-写入线B',
616
- description: '换配方验收:B 接管两路 DCW 的窗口/目标值与下发',
617
- opIntervalMs: 0,
618
- params: [
619
- { nodeId: dcwA.id, value: 52, min: 50, max: 70, stepLimit: 4 },
620
- { nodeId: dcwB.id, value: 64, min: 50, max: 70, stepLimit: 4 },
621
- ],
622
- daqWindows: [{ nodeId: writeDaq.id, min: 50, max: 70 }],
623
- })).data?.recipe
624
- const startB = await api('POST', `/api/workshop/dcw/lines/${writeLine.id}/start`, { recipeId: recipeB.id }, admin)
625
- await sleep(1500)
626
- const nodesB = await api('GET', '/api/workshop/dcw')
627
- const bNodeA = (nodesB?.data?.nodes ?? []).find(n => n.id === dcwA.id)
628
- const bNodeB = (nodesB?.data?.nodes ?? []).find(n => n.id === dcwB.id)
629
- ok('R9a', '换配方后 B 的配方参数接管两路 DCW(A=52,B=64)',
630
- startB.status === 200 && Number(bNodeA?.value) === 52 && Number(bNodeB?.value) === 64,
631
- `start=${startB.status} A=${bNodeA?.value} B=${bNodeB?.value} run=${startB?.data?.run?.id}`)
632
- const switchTrial = await api('POST', '/api/workshop/agent-tools/invoke', {
633
- agentId: autoLead.id,
634
- tool: 'recipe_trial',
635
- args: { line_id: writeLine.id, params: [{ node_id: dcwB.id, value: 66 }], hypothesis: '验收:换配方后活动配方B继续管理DCW下发' },
636
- }, undefined, { 'x-aw-agent-token': tok.auto })
637
- const switchText = String(switchTrial?.data?.result?.text ?? switchTrial?.data?.text ?? '')
638
- ok('R9b', '同一节点绑定 Agent 在换配方后 trial 成功(无需新绑定/无审批)', !(switchTrial?.data?.result?.isError ?? switchTrial?.data?.isError) && /试验已整批下发/.test(switchText),
639
- switchText.slice(0, 360))
640
- const switchJournal = (await journalCount(writeLine.id)).filter(a => a.nodeId === dcwB.id && a.newValue === 66 && a.prevValue === 64)
641
- const nodesAfterSwitch = await api('GET', '/api/workshop/dcw')
642
- const sNodeA = (nodesAfterSwitch?.data?.nodes ?? []).find(n => n.id === dcwA.id)
643
- const sNodeB = (nodesAfterSwitch?.data?.nodes ?? []).find(n => n.id === dcwB.id)
644
- ok('R9c', 'B 的活动批次记录本次下发(A 保持 52,B=66;活动批次属配方 B)',
645
- switchJournal.length >= 1 && startB?.data?.run?.recipeId === recipeB?.id && Number(sNodeA?.value) === 52 && Number(sNodeB?.value) === 66,
646
- `journal=${JSON.stringify(switchJournal.slice(0, 1))} runRecipe=${startB?.data?.run?.recipeId} A=${sNodeA?.value} B=${sNodeB?.value}`)
647
- evidence.switch = {
648
- recipeB: recipeB?.id, runB: startB?.data?.run?.id, trialResponse: switchText, journal: switchJournal.slice(0, 2),
649
- }
650
-
651
- // ── IDD 集成(仅检查,不启动分析) ──
652
- const pluginsR = await api('GET', '/api/workshop/plugins')
653
- const pluginRows = pluginsR?.data?.plugins ?? pluginsR?.plugins ?? pluginsR?.data ?? []
654
- const wanted = ['idd-closedloop-bridge', 'diag-bridge', 'rag-bridge']
655
- const pluginState = wanted.map((name) => {
656
- const row = Array.isArray(pluginRows) ? pluginRows.find(p => p.name === name) : pluginRows?.[name]
657
- return { name, enabled: Boolean(row?.enabled), error: row?.error ?? row?.lastError ?? null }
658
- })
659
- const toolsR = await api('GET', '/api/workshop/tools')
660
- const toolRows = toolsR?.data?.tools ?? toolsR?.tools ?? toolsR?.data ?? []
661
- const requiredTools = ['diag_run', 'diag_status', 'kb_agent']
662
- const toolState = requiredTools.map((name) => {
663
- const row = Array.isArray(toolRows) ? toolRows.find(t => t.name === name) : null
664
- return { name, registered: Boolean(row), available: row ? row.available !== false : false }
665
- })
666
- let iddHealth = null
667
- try {
668
- const r = await fetch('http://127.0.0.1:3210/health', { signal: AbortSignal.timeout(3000) })
669
- iddHealth = { status: r.status, ok: r.ok }
670
- }
671
- catch (err) {
672
- iddHealth = { status: 0, ok: false, error: err instanceof Error ? err.message : String(err) }
673
- }
674
- ok('R7', 'IDD 集成:三插件在位且启用、诊断/知识工具已注册', pluginState.every(p => p.enabled) && toolState.filter(t => t.available).length >= 2,
675
- JSON.stringify({ pluginState, toolState }))
676
- ok('R7b', 'IDD 后端可达(不启动任何分析)', Boolean(iddHealth?.ok), JSON.stringify(iddHealth))
677
- evidence.idd = { plugins: pluginState, tools: toolState, backendHealth: iddHealth, analysisStarted: false, note: '仅检查集成面,未调用 diag_run/未启动分析(token 缺失时诊断调用会 401,属配置缺口)' }
678
-
679
- evidence.assertions = results
680
- }
681
- catch (err) {
682
- ok('FATAL', '验收未捕获异常', false, err instanceof Error ? `${err.message}\n${err.stack ?? ''}` : String(err))
683
- evidence.assertions = results
684
- }
685
- finally {
686
- mkdirSync(EVIDENCE_DIR, { recursive: true })
687
- const passed = results.filter(r => r.pass).length
688
- const total = results.length
689
- evidence.summary = { total, passed, failed: total - passed, verdict: passed === total ? 'PASS' : 'FAIL' }
690
- writeFileSync(join(EVIDENCE_DIR, 'report.json'), JSON.stringify(evidence, null, 2))
691
- for (const [mode, task] of Object.entries(evidence.tasks)) {
692
- writeFileSync(join(EVIDENCE_DIR, `${mode}-task.json`), JSON.stringify(task, null, 2))
693
- }
694
- console.log(`\n结论:${passed === total ? 'PASS' : 'FAIL'}(${passed}/${total})`)
695
- console.log(`证据:${join(EVIDENCE_DIR, 'report.json')}`)
696
- process.exit(passed === total ? 0 : 1)
697
- }
1
+ #!/usr/bin/env node
2
+ /**
3
+ * 节点级写授权(双轨)× 三模式 真实 harness 验收(2026-10-28)。
4
+ *
5
+ * 真实平台(.output 生产构建)+ 真实 omp 子进程 + 本机 LM Studio Qwen3.5-9B(32k 上下文),
6
+ * 三个 Channel 分别 observe / manual / auto;Agent 只持 **dcw 节点绑定(点位写授权)**,
7
+ * 不绑配方 —— 验证「授权跟设备走、管控跟活动配方走」在真实 Agent 回合里成立:
8
+ * - observe:只读数采并给出分析结论,产线零写入;
9
+ * - manual :频道层钳位 → recipe_trial 挂人工审批,批准后 60→58,ACK 证实,版本不变;
10
+ * - auto :全链 auto → recipe_trial 免批直执行,60→62,ACK 证实。
11
+ * 另检查 IDD 集成(插件在位/后端可达/不启动分析)与工具注入面(节点授权清单)。
12
+ *
13
+ * 运行:node scripts/e2e-node-binding-3mode-real.mjs
14
+ * 环境:LM Studio 127.0.0.1:1234 模型 qwen3.5-9b-32k;隔离实例 PORT=3410。
15
+ * 证据:docs/audit/evidence/2026-10-28-node-binding-3mode/report.json
16
+ */
17
+ import { spawn, spawnSync } from 'node:child_process'
18
+ import { existsSync, mkdirSync, openSync, readFileSync, rmSync, writeFileSync } from 'node:fs'
19
+ import { dirname, join, resolve } from 'node:path'
20
+ import { fileURLToPath } from 'node:url'
21
+ import { DatabaseSync } from 'node:sqlite'
22
+
23
+ const REPO = resolve(dirname(fileURLToPath(import.meta.url)), '..')
24
+ const HOME = process.env.AW_ACCEPT_HOME ?? 'D:/tmp/aw-node-scoped-20261028'
25
+ const PORT = Number(process.env.AW_ACCEPT_PORT ?? 3410)
26
+ const BASE = `http://127.0.0.1:${PORT}`
27
+ const MODEL = { provider: 'lm-studio', model: 'qwen3.5-9b-32k', contextTokens: 32768 }
28
+ const MODEL_LLM = { provider: MODEL.provider, model: MODEL.model }
29
+ const EVIDENCE_DIR = join(REPO, 'docs', 'audit', 'evidence', '2026-10-28-node-binding-3mode')
30
+ const results = []
31
+ const sleep = ms => new Promise(r => setTimeout(r, ms))
32
+ const ok = (id, name, cond, detail = '') => {
33
+ results.push({ id, name, pass: Boolean(cond), detail: String(detail).slice(0, 1200) })
34
+ console.log(`${cond ? '✔' : '✖'} [${id}] ${name}${cond ? '' : ` — ${String(detail).slice(0, 800)}`}`)
35
+ return Boolean(cond)
36
+ }
37
+
38
+ function stopOwnedInstance() {
39
+ const pidFile = join(HOME, 'server.pid')
40
+ if (!existsSync(pidFile)) return
41
+ const pid = Number(readFileSync(pidFile, 'utf8').trim())
42
+ if (!Number.isInteger(pid) || pid <= 0) return
43
+ try {
44
+ spawnSync('taskkill', ['/PID', String(pid), '/T', '/F'], { windowsHide: true })
45
+ }
46
+ catch { /* 已退出 */ }
47
+ }
48
+
49
+ async function health() {
50
+ try {
51
+ const r = await fetch(`${BASE}/api/health`, { signal: AbortSignal.timeout(2500) })
52
+ if (!r.ok) return null
53
+ return (await r.json())?.data ?? null
54
+ }
55
+ catch {
56
+ return null
57
+ }
58
+ }
59
+
60
+ async function startInstance() {
61
+ // 先清掉本目录上次留下的实例(pid 文件来自本验收目录,杀的是我们自己起的进程)
62
+ stopOwnedInstance()
63
+ await sleep(1500)
64
+ const running = await health()
65
+ if (running) throw new Error(`端口 ${PORT} 已被非本验收实例占用:${running.app} ${running.version}`)
66
+ if (process.env.AW_ACCEPT_RESET !== '0') {
67
+ if (!/aw-node-scoped/.test(HOME)) throw new Error(`拒绝清理非验收目录:${HOME}`)
68
+ rmSync(HOME, { recursive: true, force: true })
69
+ }
70
+ mkdirSync(HOME, { recursive: true })
71
+ const log = openSync(join(HOME, 'server.log'), 'a')
72
+ const child = spawn(process.execPath, [join(REPO, '.output', 'server', 'index.mjs')], {
73
+ cwd: REPO,
74
+ env: {
75
+ ...process.env,
76
+ AW_MODE: 'home',
77
+ AW_HOME: HOME,
78
+ PORT: String(PORT),
79
+ NUXT_SESSION_PASSWORD: 'node-scoped-20261028-session-key-abcdef',
80
+ AW_TRIAL_INTERVAL_MS: '0',
81
+ AW_RATE_LIMIT_OFF: '1',
82
+ NO_PROXY: '127.0.0.1,localhost',
83
+ },
84
+ detached: true,
85
+ stdio: ['ignore', log, log],
86
+ windowsHide: true,
87
+ })
88
+ child.unref()
89
+ writeFileSync(join(HOME, 'server.pid'), String(child.pid))
90
+ for (let i = 0; i < 90; i++) {
91
+ await sleep(1000)
92
+ const h = await health()
93
+ if (h?.workshop === 'ready') return h
94
+ }
95
+ throw new Error('隔离实例未在 90s 内就绪')
96
+ }
97
+
98
+ let admin = ''
99
+ async function api(method, path, body, token = admin, extraHeaders = {}, timeoutMs = 120_000) {
100
+ const res = await fetch(BASE + path, {
101
+ method,
102
+ headers: {
103
+ ...(body !== undefined ? { 'content-type': 'application/json' } : {}),
104
+ ...(token ? { authorization: `Bearer ${token}` } : {}),
105
+ ...extraHeaders,
106
+ },
107
+ body: body === undefined ? undefined : JSON.stringify(body),
108
+ signal: AbortSignal.timeout(timeoutMs),
109
+ })
110
+ let json = null
111
+ try {
112
+ json = await res.json()
113
+ }
114
+ catch { /* 非 JSON */ }
115
+ return { status: res.status, ...json }
116
+ }
117
+
118
+ const dbPath = join(HOME, 'data', 'workshop.sqlite')
119
+ function agentTokenOf(agentId) {
120
+ const db = new DatabaseSync(dbPath, { readOnly: true })
121
+ try {
122
+ return String(db.prepare('SELECT token FROM channel_agents WHERE id = ?').get(agentId)?.token ?? '')
123
+ }
124
+ finally {
125
+ db.close()
126
+ }
127
+ }
128
+
129
+ async function channelAgents(channelId) {
130
+ const d = await api('GET', `/api/workshop/channels/${channelId}`)
131
+ return d?.data?.agents ?? []
132
+ }
133
+
134
+ async function pendingOf(agentId) {
135
+ const r = await api('GET', `/api/workshop/agent-tools/approvals?agentId=${encodeURIComponent(agentId)}`)
136
+ return (r?.data?.approvals ?? []).filter(a => a.status === 'pending')
137
+ }
138
+
139
+ async function approvalsHistory(agentId) {
140
+ const r = await api('GET', `/api/workshop/agent-tools/approvals?agentId=${encodeURIComponent(agentId)}&scope=history`)
141
+ return r?.data?.approvals ?? []
142
+ }
143
+
144
+ async function approve(cardId, comment) {
145
+ return api('POST', `/api/workshop/agent-tools/approvals/${cardId}/decide`, { approved: true, comment })
146
+ }
147
+
148
+ function taskOf(r) {
149
+ return r?.data?.task ?? r?.data ?? null
150
+ }
151
+
152
+ function deliverableOf(task) {
153
+ const art = (task?.artifacts ?? []).find(a => a.name === 'deliverable')
154
+ return String(art?.parts?.map(p => p.text ?? '').join('\n') ?? '')
155
+ }
156
+
157
+ function toolCallsOf(task) {
158
+ return (task?.history ?? [])
159
+ .map(h => String(h?.parts?.map(p => p.text ?? '').join(' ') ?? ''))
160
+ .filter(t => t.includes('🔧'))
161
+ .map(t => t.replace(/\s+/g, ' ').slice(0, 200))
162
+ }
163
+
164
+ async function waitTask(taskId, { timeoutMs = 12 * 60_000, autoApprove = false, onCard = null } = {}) {
165
+ const started = Date.now()
166
+ const cards = []
167
+ let lastState = ''
168
+ while (Date.now() - started < timeoutMs) {
169
+ const r = await api('GET', `/api/workshop/tasks/${taskId}`)
170
+ const task = taskOf(r)
171
+ const state = String(task?.state ?? '')
172
+ if (state !== lastState) {
173
+ lastState = state
174
+ console.log(` · task ${taskId.slice(0, 8)} state=${state}`)
175
+ }
176
+ if (autoApprove && task?.assigneeId) {
177
+ const pending = await pendingOf(String(task.assigneeId))
178
+ for (const card of pending) {
179
+ if (cards.some(c => c.id === card.id)) continue
180
+ cards.push(card)
181
+ if (onCard) onCard(card)
182
+ }
183
+ }
184
+ if (['COMPLETED', 'FAILED', 'CANCELLED'].includes(state)) return { task, cards, timedOut: false }
185
+ await sleep(3000)
186
+ }
187
+ const r = await api('GET', `/api/workshop/tasks/${taskId}`)
188
+ return { task: taskOf(r), cards, timedOut: true }
189
+ }
190
+
191
+ async function submitTask(channelId, title, description) {
192
+ const r = await api('POST', `/api/workshop/channels/${channelId}/tasks`, { title, description })
193
+ const task = taskOf(r)
194
+ if (!task?.id) throw new Error(`任务创建失败: ${JSON.stringify(r).slice(0, 400)}`)
195
+ return task
196
+ }
197
+
198
+ function scenarioLine(name, controlMode, description) {
199
+ return api('POST', '/api/workshop/dcw/lines', { name, simulated: true, controlMode, description }).then(r => r.data.line)
200
+ }
201
+
202
+ async function makeDaq(attrs) {
203
+ return (await api('POST', '/api/workshop/daq', {
204
+ driver: 'mock',
205
+ intervalMs: 1000,
206
+ enabled: true,
207
+ publishIntervalMs: 0,
208
+ ...attrs,
209
+ })).data.node
210
+ }
211
+
212
+ async function makeDcw(attrs) {
213
+ return (await api('POST', '/api/workshop/dcw', {
214
+ driver: 'mock',
215
+ enabled: true,
216
+ holdIntervalMs: 0,
217
+ readIntervalMs: 0,
218
+ writeLockSeconds: 0,
219
+ stepLimit: 5,
220
+ ...attrs,
221
+ })).data.node
222
+ }
223
+
224
+ async function remapParam(lineId, nodeId, key, desc) {
225
+ const params = (await api('GET', `/api/workshop/dcw/params?lineId=${lineId}`)).data.params ?? []
226
+ const pm = params.find(p => p.nodeId === nodeId)
227
+ if (!pm) throw new Error(`参数映射不存在: node=${nodeId}`)
228
+ await api('PATCH', `/api/workshop/dcw/params/${pm.id}`, { key, desc, min: 0, max: 100 })
229
+ }
230
+
231
+ async function makeChannel(name, lineId, scenarioPrompt, mode, toolNames) {
232
+ const ch = (await api('POST', '/api/workshop/channels', {
233
+ name,
234
+ lineId,
235
+ scenarioPrompt,
236
+ // 本机 9B 模型易被 omp 原生命令(bash/glob/edit/read 任意路径)带偏:
237
+ // --no-tools 关闭全部内置工具,只保留 set_host_tools 注入的 host 工具(本次 4~5 个),
238
+ // 让回合严格收敛在任务步骤上;这也是小模型在真实 harness 里的推荐配置。
239
+ leadAgent: { name: `${name}-线长`, harness: 'omp', config: { rpcMode: 'rpc', args: ['--no-tools'] } },
240
+ })).data
241
+ const channelId = ch?.channelId
242
+ if (!channelId) throw new Error(`频道创建失败: ${JSON.stringify(ch).slice(0, 300)}`)
243
+ await api('PATCH', `/api/workshop/channels/${channelId}`, { llm: MODEL_LLM })
244
+ await api('PATCH', `/api/workshop/channels/${channelId}/execution-mode`, mode === 'auto' ? { mode: 'auto', confirm: true } : { mode })
245
+ const put = await api('PUT', `/api/workshop/channels/${channelId}/tools`, {
246
+ mode: 'selected',
247
+ tools: toolNames.map(n => ({ name: n, enabled: true })),
248
+ })
249
+ const agents = await channelAgents(channelId)
250
+ const lead = agents.find(a => a.role === 'lead')
251
+ return { channelId, lead, toolsSaved: put.status, agents }
252
+ }
253
+
254
+ async function bind(agentId, nodeId, kind) {
255
+ return api('POST', '/api/workshop/agent-tools/bindings', { agentId, nodeId, kind, mode: 'auto' })
256
+ }
257
+
258
+ async function bindAuto(agentId, nodeId, kind) {
259
+ const b = await bind(agentId, nodeId, kind)
260
+ const id = b?.data?.binding?.id
261
+ if (id && b?.data?.binding?.mode === 'manual') {
262
+ await api('PATCH', `/api/workshop/agent-tools/bindings/${id}`, { mode: 'auto', confirm: true })
263
+ }
264
+ return b
265
+ }
266
+
267
+ const OBS_PROMPT = [
268
+ '你是观察模式频道(只读)的工艺分析员。严格按三步执行,不要做别的:',
269
+ '1) 调用 line_context 获取你负责的产线与活动批次;',
270
+ '2) 调用 daq_query(line_id 用上一步返回值,last_minutes=5,bucket_ms=15000,limit=500);',
271
+ '3) 用 complete_task 提交结论:每个测点的样本数/均值/最小值/最大值,以及是否超出温度窗口 50~70C。',
272
+ '禁止调用任何写工具或配方工具。',
273
+ ].join('\n')
274
+
275
+ function opsPrompt(value, lineId) {
276
+ return [
277
+ '你是工艺闭环频道的操作员。严格按三步执行,不要做别的:',
278
+ '1) 调用 my_industrial_nodes 查看你绑定的数控节点(记下节点 id;只允许操作它);',
279
+ '2) 调用 recipe_trial:line_id="' + lineId + '",params 只包含你绑定的那个数控节点,value=' + value + ',hypothesis 写「验收:活动配方温控试验,目标 ' + value + 'C」;审批由人工处理,工具会返回结果,你不需要等待;',
280
+ '3) 立即调用 complete_task 提交 recipe_trial 的完整回执原文与批次 id。',
281
+ '本任务只做这三步:禁止复测、禁止等待/睡眠、禁止 recipe_update/rollback、禁止使用 bash/终端/后台任务(除 read(xd://…) 查看工具说明外不要用其他工具)。',
282
+ ].join('\n')
283
+ }
284
+
285
+ // 最小工具面:只留任务必需的 5 个,避免 9B 本地模型在长工具目录里发散探索
286
+ const OPS_TOOLS = [
287
+ 'my_industrial_nodes',
288
+ 'recipe_trial',
289
+ 'recipe_rollback',
290
+ 'complete_task',
291
+ 'report_progress',
292
+ ]
293
+ // observe 模式下 my_industrial_nodes 被分发面判为写面工具(EXEC_MODE_OBSERVE),不得进 allow-list;
294
+ // 其余也只留任务必需的 4 个,避免本地 9B 模型在工具目录里发散探索
295
+ const OBS_TOOLS = ['line_context', 'daq_query', 'complete_task', 'report_progress']
296
+
297
+ const evidence = {
298
+ at: new Date().toISOString(),
299
+ env: {
300
+ base: BASE,
301
+ home: HOME,
302
+ version: '',
303
+ model: MODEL,
304
+ harness: 'omp',
305
+ devices: 'mock(daq+dcw)',
306
+ note: '真实平台 + 真实 omp 子进程 + 本地 Qwen3.5-9B(32k);设备为内置 mock,无物理响应耦合',
307
+ },
308
+ scenario: {},
309
+ tasks: {},
310
+ assertions: results,
311
+ idd: {},
312
+ }
313
+
314
+ async function journalCount(lineId) {
315
+ const r = await api('GET', `/api/workshop/dcw/journal?lineId=${lineId}&limit=500`)
316
+ return r?.data?.anchors ?? []
317
+ }
318
+
319
+ /** 等待「控制链完成」而不是死等 LLM 自己收口:审批自动放行,账本出现点位写入后
320
+ * 再给模型 15s 调 complete_task;仍未收口则由平台取消任务(控制链证据已成立)。 */
321
+ async function waitTrialAndClose(taskId, agentId, lineId, nodeId, opts = {}) {
322
+ const started = Date.now()
323
+ const since = started - 5000
324
+ const cards = []
325
+ const timeoutMs = opts.timeoutMs ?? 8 * 60_000
326
+ const expectNoHitl = opts.expectNoHitl === true
327
+ while (Date.now() - started < timeoutMs) {
328
+ const task = taskOf(await api('GET', `/api/workshop/tasks/${taskId}`))
329
+ const state = String(task?.state ?? '')
330
+ if (['COMPLETED', 'FAILED', 'CANCELLED'].includes(state)) return { task, cards, cancelled: false, timedOut: false }
331
+ const pending = await pendingOf(agentId)
332
+ for (const card of pending) {
333
+ if (cards.some(c => c.id === card.id)) continue
334
+ cards.push(card)
335
+ console.log(` · HITL card ${card.id} 出现,自动批准`)
336
+ await approve(card.id, expectNoHitl ? '验收:自动模式出现审批(记录并放行)' : opts.approvalComment ?? '验收:批准手动模式点位试验')
337
+ }
338
+ const hit = (await journalCount(lineId)).some(a =>
339
+ a.nodeId === nodeId && a.prevValue === opts.prevValue && a.newValue !== opts.prevValue && Date.parse(a.at) >= since)
340
+ if (hit) {
341
+ await sleep(15_000)
342
+ const t2 = taskOf(await api('GET', `/api/workshop/tasks/${taskId}`))
343
+ if (['COMPLETED', 'FAILED', 'CANCELLED'].includes(String(t2?.state ?? ''))) return { task: t2, cards, cancelled: false, timedOut: false }
344
+ await api('POST', `/api/workshop/tasks/${taskId}/cancel`, {
345
+ reason: '验收:控制链已完成,LLM 未在时限内调用 complete_task,平台侧取消收敛',
346
+ }, admin)
347
+ const t3 = taskOf(await api('GET', `/api/workshop/tasks/${taskId}`))
348
+ return { task: t3, cards, cancelled: true, timedOut: false }
349
+ }
350
+ await sleep(2000)
351
+ }
352
+ return { task: taskOf(await api('GET', `/api/workshop/tasks/${taskId}`)), cards, cancelled: false, timedOut: true }
353
+ }
354
+
355
+ try {
356
+ const h = await startInstance()
357
+ evidence.env.version = String(h?.version ?? '')
358
+ ok('R0', '生产构建隔离实例就绪(workshop ready)', h?.workshop === 'ready', `port=${PORT} version=${h?.version}`)
359
+
360
+ const reg = await api('POST', '/api/users/register', { name: '验收管理员', email: `accept-${Date.now()}@awshop.local`, password: 'Accept#2026' })
361
+ admin = reg?.data?.token
362
+ ok('R0b', 'admin 注册/登录', Boolean(admin), `status=${reg.status}`)
363
+ writeFileSync(join(HOME, 'admin.json'), JSON.stringify({ token: admin }))
364
+
365
+ // IDD 集成面:启用三个插件(只启用,不启动任何分析)
366
+ for (const name of ['idd-closedloop-bridge', 'diag-bridge', 'rag-bridge']) {
367
+ const en = await api('POST', `/api/workshop/plugins/${name}/enable`, undefined, admin)
368
+ if (en.status !== 200) console.log(` · 插件 ${name} 启用返回 ${en.status}: ${String(en?.message ?? '').slice(0, 120)}`)
369
+ }
370
+
371
+ // ── 两条线:观察线(只读数采)、写入线(两条 DCW + 配方) ──
372
+ const obsLine = await scenarioLine('验收-观察线', 'auto', '观察线:薄膜腔体温度/压力监测(模拟设备;真实平台/真实 Agent)')
373
+ const writeLine = await scenarioLine('验收-写入线', 'auto', '写入线:薄膜腔体温度点位授权验收(模拟设备;真实平台/真实 Agent)')
374
+
375
+ const obsDaqTemp = await makeDaq({
376
+ name: '腔体温度(观察线)', templateRef: 'temp-tc', lineId: obsLine.id, unit: 'C', decimals: 2, min: 0, max: 100,
377
+ semantics: '腔体温度测点;正常工艺窗口 50~70C',
378
+ })
379
+ const obsDaqPress = await makeDaq({
380
+ name: '系统压力(观察线)', templateRef: 'pressure-tx', lineId: obsLine.id, unit: 'bar', decimals: 2, min: 0, max: 10,
381
+ semantics: '系统压力测点;稳定在 4~6 bar',
382
+ })
383
+ const obsDcw = await makeDcw({
384
+ name: '温度设定(观察线)', templateRef: 'temp-sp', lineId: obsLine.id, unit: 'C', decimals: 2, min: 0, max: 100,
385
+ driverConfig: { key: 'accept-obs-temp-sp' }, semantics: '观察线温度设定(观察频道不可写)',
386
+ })
387
+ await remapParam(obsLine.id, obsDcw.id, 'obs_temp_sp', '观察线腔体温度设定值(C)')
388
+ const obsProduct = (await api('POST', '/api/workshop/dcw/products', {
389
+ name: '验收产品-观察线', lineId: obsLine.id, description: '观察线产品;温度窗口 50~70C',
390
+ paramLimits: { obs_temp_sp: { min: 50, max: 70 } },
391
+ })).data.product
392
+ const obsRecipe = (await api('POST', '/api/workshop/dcw/recipes', {
393
+ name: '验收配方-观察线', productId: obsProduct.id, description: '观察线配方(仅用于建立活动批次)',
394
+ opIntervalMs: 0,
395
+ params: [{ nodeId: obsDcw.id, value: 60, min: 50, max: 70, stepLimit: 4 }],
396
+ daqWindows: [{ nodeId: obsDaqTemp.id, min: 50, max: 70 }],
397
+ })).data.recipe
398
+
399
+ const writeDaq = await makeDaq({
400
+ name: '腔体温度(写入线)', templateRef: 'temp-tc', lineId: writeLine.id, unit: 'C', decimals: 2, min: 0, max: 100,
401
+ semantics: '腔体温度测点;与温度设定存在 20~60s 响应滞后(本验收为 mock 设备,无物理耦合)',
402
+ })
403
+ const dcwA = await makeDcw({
404
+ name: '温度设定A(写入线)', templateRef: 'temp-sp', lineId: writeLine.id, unit: 'C', decimals: 2, min: 0, max: 100,
405
+ driverConfig: { key: 'accept-write-a' }, semantics: '手动频道 Agent 的点位授权节点;单步 <=4C,窗口 50~70C',
406
+ })
407
+ const dcwB = await makeDcw({
408
+ name: '温度设定B(写入线)', templateRef: 'temp-sp', lineId: writeLine.id, unit: 'C', decimals: 2, min: 0, max: 100,
409
+ driverConfig: { key: 'accept-write-b' }, semantics: '自动频道 Agent 的点位授权节点;单步 <=4C,窗口 50~70C',
410
+ })
411
+ await remapParam(writeLine.id, dcwA.id, 'temp_sp_a', '写入线温度设定A(C)')
412
+ await remapParam(writeLine.id, dcwB.id, 'temp_sp_b', '写入线温度设定B(C)')
413
+ const writeProduct = (await api('POST', '/api/workshop/dcw/products', {
414
+ name: '验收产品-写入线', lineId: writeLine.id, description: '写入线产品;两路温度设定窗口 50~70C',
415
+ paramLimits: { temp_sp_a: { min: 50, max: 70 }, temp_sp_b: { min: 50, max: 70 } },
416
+ })).data.product
417
+ const writeRecipe = (await api('POST', '/api/workshop/dcw/recipes', {
418
+ name: '验收配方-写入线', productId: writeProduct.id, description: '写入线配方;两路 DCW 参数各由不同 Agent 点位授权',
419
+ opIntervalMs: 0,
420
+ params: [
421
+ { nodeId: dcwA.id, value: 60, min: 50, max: 70, stepLimit: 4 },
422
+ { nodeId: dcwB.id, value: 60, min: 50, max: 70, stepLimit: 4 },
423
+ ],
424
+ daqWindows: [{ nodeId: writeDaq.id, min: 50, max: 70 }],
425
+ })).data.recipe
426
+
427
+ const startObs = await api('POST', `/api/workshop/dcw/lines/${obsLine.id}/start`, { recipeId: obsRecipe.id })
428
+ const startWrite = await api('POST', `/api/workshop/dcw/lines/${writeLine.id}/start`, { recipeId: writeRecipe.id })
429
+ ok('R1', '两线开跑(活动批次建立,配方整批下发)', startObs.status === 200 && startWrite.status === 200,
430
+ `obs=${startObs.status} write=${startWrite.status}`)
431
+
432
+ await sleep(12_000)
433
+
434
+ // ── 三个 Channel(真实 omp) ──
435
+ const obsCh = await makeChannel('验收-三模式-观察', obsLine.id, '观察模式频道:只做数采与工艺分析,物理零写。', 'observe', OBS_TOOLS)
436
+ const manualCh = await makeChannel('验收-三模式-手动', writeLine.id, '手动模式频道:每次配方试验都必须经人工批准;只操作你绑定的点位。验收场景只执行任务描述,不复测、不等待、不固化;未收到任务时禁止自主发起任何下发。', 'manual', OPS_TOOLS)
437
+ const autoCh = await makeChannel('验收-三模式-自动', writeLine.id, '自动模式频道:限界内自动执行配方试验;只操作你绑定的点位。验收场景只执行任务描述,不复测、不等待、不固化;未收到任务时禁止自主发起任何下发。', 'auto', OPS_TOOLS)
438
+ ok('R2', '三频道创建 + 执行模式 + 工具面(omp/selected)', Boolean(obsCh.channelId && manualCh.channelId && autoCh.channelId) && obsCh.toolsSaved === 200 && manualCh.toolsSaved === 200 && autoCh.toolsSaved === 200,
439
+ JSON.stringify({ obs: obsCh.channelId, manual: manualCh.channelId, auto: autoCh.channelId, tools: [obsCh.toolsSaved, manualCh.toolsSaved, autoCh.toolsSaved] }))
440
+
441
+ const obsLead = obsCh.lead
442
+ const manualLead = manualCh.lead
443
+ const autoLead = autoCh.lead
444
+
445
+ // 节点绑定:观察=daq;手动/自动=各自的 dcw 点位(不绑配方)
446
+ const obsBind = await bindAuto(obsLead.id, obsDaqTemp.id, 'daq')
447
+ const manualBind = await bindAuto(manualLead.id, dcwA.id, 'dcw')
448
+ const autoBind = await bindAuto(autoLead.id, dcwB.id, 'dcw')
449
+ ok('R2b', '点位绑定落库(观察=daq,手动/自动=各自 dcw;无配方绑定)',
450
+ obsBind.status === 200 && manualBind.status === 200 && autoBind.status === 200,
451
+ `status=${obsBind.status}/${manualBind.status}/${autoBind.status} kinds=${obsBind?.data?.binding?.kind}/${manualBind?.data?.binding?.kind}/${autoBind?.data?.binding?.kind}`)
452
+
453
+ const tok = { obs: agentTokenOf(obsLead.id), manual: agentTokenOf(manualLead.id), auto: agentTokenOf(autoLead.id) }
454
+ const descOf = async (agentId, token) => {
455
+ const r = await api('GET', `/api/workshop/agent-tools/list?agentId=${encodeURIComponent(agentId)}`, undefined, undefined, { 'x-aw-agent-token': token })
456
+ return (r?.data?.tools ?? []).find(t => t.name === 'recipe_trial')?.description ?? ''
457
+ }
458
+ const descManual = String(await descOf(manualLead.id, tok.manual))
459
+ const descAuto = String(await descOf(autoLead.id, tok.auto))
460
+ ok('R2c', '工具注入面按 Agent 点位授权差异化(手动只见A,自动只见B)',
461
+ descManual.includes(dcwA.id) && !descManual.includes(dcwB.id) && descAuto.includes(dcwB.id) && !descAuto.includes(dcwA.id),
462
+ `manual=${descManual.slice(-180)} | auto=${descAuto.slice(-180)}`)
463
+
464
+ evidence.scenario = {
465
+ lines: { obs: obsLine.id, write: writeLine.id },
466
+ recipes: { obs: obsRecipe.id, write: writeRecipe.id },
467
+ dcw: { a: dcwA.id, b: dcwB.id },
468
+ daq: { obsTemp: obsDaqTemp.id, obsPress: obsDaqPress.id, write: writeDaq.id },
469
+ channels: { obs: obsCh.channelId, manual: manualCh.channelId, auto: autoCh.channelId },
470
+ agents: { obs: obsLead.id, manual: manualLead.id, auto: autoLead.id },
471
+ bindings: { obs: obsBind?.data?.binding?.id, manual: manualBind?.data?.binding?.id, auto: autoBind?.data?.binding?.id },
472
+ }
473
+
474
+ const obsJournalBefore = (await journalCount(obsLine.id)).length
475
+
476
+ // ── 观察模式任务 ──
477
+ const obsTask = await submitTask(obsCh.channelId, '验收-观察模式-数采分析', OBS_PROMPT)
478
+ const t0 = Date.now()
479
+ const obsRun = await waitTask(obsTask.id, { timeoutMs: 12 * 60_000 })
480
+ const obsDeliverable = deliverableOf(obsRun.task)
481
+ const obsJournalAfter = await journalCount(obsLine.id)
482
+ const obsHistory = await approvalsHistory(obsLead.id)
483
+ ok('R3', '观察模式任务 COMPLETED', obsRun.task?.state === 'COMPLETED', `state=${obsRun.task?.state} elapsed=${Math.round((Date.now() - t0) / 1000)}s`)
484
+ ok('R3b', '观察结论含样本统计与温度窗口判定', /样本|均值|最小|最大/.test(obsDeliverable) && /50|70|窗口/.test(obsDeliverable), obsDeliverable.slice(0, 400))
485
+ ok('R3c', '观察模式产线零写入(账本条数不增)', obsJournalAfter.length === obsJournalBefore, `before=${obsJournalBefore} after=${obsJournalAfter.length}`)
486
+ ok('R3d', '观察模式无写审批(只读频道)', obsHistory.length === 0, `approvals=${obsHistory.length}`)
487
+ evidence.tasks.obs = { id: obsTask.id, state: obsRun.task?.state, elapsedSec: Math.round((Date.now() - t0) / 1000), deliverable: obsDeliverable, toolCalls: toolCallsOf(obsRun.task) }
488
+
489
+ // ── 手动模式任务(频道钳位 → HITL)。基线取提交时设备现值(值无关断言)。 ──
490
+ const nodesPreManual = await api('GET', '/api/workshop/dcw')
491
+ const preManualA = Number((nodesPreManual?.data?.nodes ?? []).find(n => n.id === dcwA.id)?.value)
492
+ const manualTask = await submitTask(manualCh.channelId, '验收-手动模式-点位试验', opsPrompt(Number.isFinite(preManualA) ? Math.min(preManualA + 2, 70) : 58, writeLine.id))
493
+ const m0 = Date.now()
494
+ const manualRun = await waitTrialAndClose(manualTask.id, manualLead.id, writeLine.id, dcwA.id, {
495
+ prevValue: preManualA,
496
+ approvalComment: '验收:批准手动模式点位试验',
497
+ })
498
+ const writeJournal = await journalCount(writeLine.id)
499
+ const manualEntries = writeJournal.filter(a => a.nodeId === dcwA.id && a.prevValue === preManualA && a.newValue !== preManualA && Date.parse(a.at) >= m0 - 5000)
500
+ const manualTrial = manualEntries[0]
501
+ const manualHistory = await approvalsHistory(manualLead.id)
502
+ const manualCard = manualRun.cards[0]
503
+ const manualCardRow = manualCard ? manualHistory.find(a => a.id === manualCard.id) : null
504
+ const manualNode = await api('GET', '/api/workshop/dcw')
505
+ const manualNodeRow = (manualNode?.data?.nodes ?? []).find(n => n.id === dcwA.id)
506
+ ok('R4', '手动模式控制链完成(HITL → 点位写授权下发)', Boolean(manualTrial), `journal=${JSON.stringify(manualTrial ?? null)} task=${manualRun.task?.state}`)
507
+ ok('R4a', '手动模式触发人工审批(频道 manual 钳位)', manualRun.cards.length >= 1, `cards=${manualRun.cards.map(c => c.id).join(',')}`)
508
+ ok('R4b', '人工审批落定 approved(附言回流)', manualCardRow?.status === 'approved', `card=${manualCard?.id} status=${manualCardRow?.status} comment=${manualCardRow?.comment}`)
509
+ ok('R4c', `手动模式点位写入落账 ${preManualA}→${manualTrial?.newValue ?? '?'}(点位写授权,无配方绑定)`,
510
+ Boolean(manualTrial) && Number(manualTrial.newValue) >= 50 && Number(manualTrial.newValue) <= 70,
511
+ JSON.stringify(manualTrial ?? null).slice(0, 400))
512
+ ok('R4d', '手动模式设备侧现值=账本新值(独立回读)', Number(manualNodeRow?.value) === Number(manualTrial?.newValue),
513
+ `value=${manualNodeRow?.value} journal=${manualTrial?.newValue}`)
514
+ const versions = await api('GET', `/api/workshop/dcw/recipes/${writeRecipe.id}/versions`)
515
+ const versionRows = versions?.data?.versions ?? versions?.data ?? []
516
+ ok('R4e', '试验不写配方版本(仍为 v1)', (versionRows[0]?.version ?? 1) === 1, `versions=${versionRows.map(v => v.version).join(',')}`)
517
+ ok('R4f', '任务收口(模型 complete_task 或平台取消收敛)', manualRun.task?.state === 'COMPLETED' || manualRun.cancelled,
518
+ `state=${manualRun.task?.state} cancelledByOperator=${manualRun.cancelled}`)
519
+ evidence.tasks.manual = {
520
+ id: manualTask.id, state: manualRun.task?.state, cancelledByOperator: manualRun.cancelled,
521
+ elapsedSec: Math.round((Date.now() - m0) / 1000), deliverable: deliverableOf(manualRun.task),
522
+ toolCalls: toolCallsOf(manualRun.task),
523
+ hitl: manualRun.cards.map(c => ({ id: c.id, status: c.status, detail: c.detail, payload: c.payload })),
524
+ hitlHistory: manualHistory.map(a => ({ id: a.id, status: a.status, comment: a.comment, decidedBy: a.decidedBy })),
525
+ journal: manualEntries.slice(-3), approvals: manualCard ? manualCard.id : null,
526
+ }
527
+
528
+ // ── 自动模式任务(全链 auto,免批)。基线取提交时设备现值(值无关断言,
529
+ // 模型可自选 +2C 内的候选);opsPrompt 里的候选值仅为引导。 ──
530
+ const nodesPreAuto = await api('GET', '/api/workshop/dcw')
531
+ const preAutoB = Number((nodesPreAuto?.data?.nodes ?? []).find(n => n.id === dcwB.id)?.value)
532
+ const autoTask = await submitTask(autoCh.channelId, '验收-自动模式-点位试验', opsPrompt(Number.isFinite(preAutoB) ? Math.min(preAutoB + 2, 70) : 62, writeLine.id))
533
+ const a0 = Date.now()
534
+ const autoRun = await waitTrialAndClose(autoTask.id, autoLead.id, writeLine.id, dcwB.id, {
535
+ prevValue: preAutoB,
536
+ expectNoHitl: true,
537
+ })
538
+ const autoHistory = await approvalsHistory(autoLead.id)
539
+ const autoCardsInWindow = autoHistory.filter(a => Date.parse(a.createdAt ?? 0) >= a0 - 5000)
540
+ const autoEntries = (await journalCount(writeLine.id)).filter(a => a.nodeId === dcwB.id && a.prevValue === preAutoB && a.newValue !== preAutoB && Date.parse(a.at) >= a0 - 5000)
541
+ const autoTrial = autoEntries[0]
542
+ const autoNode = await api('GET', '/api/workshop/dcw')
543
+ const autoNodeRow = (autoNode?.data?.nodes ?? []).find(n => n.id === dcwB.id)
544
+ ok('R5', '自动模式控制链完成(免批 → 点位写授权下发)', Boolean(autoTrial), `journal=${JSON.stringify(autoTrial ?? null)} task=${autoRun.task?.state}`)
545
+ ok('R5a', '自动模式全程无人工审批(全链 auto)', autoRun.cards.length === 0 && autoCardsInWindow.length === 0,
546
+ `cards=${autoRun.cards.length} historyInWindow=${autoCardsInWindow.length}`)
547
+ ok('R5b', `自动模式点位写入落账 ${preAutoB}→${autoTrial?.newValue ?? '?'}(点位写授权,无配方绑定)`,
548
+ Boolean(autoTrial) && Number(autoTrial.newValue) >= 50 && Number(autoTrial.newValue) <= 70,
549
+ JSON.stringify(autoTrial ?? null).slice(0, 400))
550
+ ok('R5c', '自动模式设备侧现值=账本新值(独立回读)', Number(autoNodeRow?.value) === Number(autoTrial?.newValue),
551
+ `value=${autoNodeRow?.value} journal=${autoTrial?.newValue}`)
552
+ ok('R5d', '任务收口(模型 complete_task 或平台取消收敛)', autoRun.task?.state === 'COMPLETED' || autoRun.cancelled,
553
+ `state=${autoRun.task?.state} cancelledByOperator=${autoRun.cancelled}`)
554
+ evidence.tasks.auto = {
555
+ id: autoTask.id, state: autoRun.task?.state, cancelledByOperator: autoRun.cancelled,
556
+ elapsedSec: Math.round((Date.now() - a0) / 1000), deliverable: deliverableOf(autoRun.task),
557
+ toolCalls: toolCallsOf(autoRun.task), hitl: autoRun.cards.map(c => ({ id: c.id, status: c.status })), journal: autoEntries.slice(-3),
558
+ }
559
+
560
+ // ── 双轨授权复核:同一活动配方、两个 Agent 各写自己的点位,互不越权 ──
561
+ const writeJournalAll = await journalCount(writeLine.id)
562
+ const trialA = writeJournalAll.filter(a => a.nodeId === dcwA.id && a.prevValue === preManualA && a.newValue !== preManualA)
563
+ const trialB = writeJournalAll.filter(a => a.nodeId === dcwB.id && a.prevValue === preAutoB && a.newValue !== preAutoB)
564
+ ok('R6', `同一活动配方下两条轨迹各自落账(A ${preManualA}→${trialA[0]?.newValue ?? '?'}, B ${preAutoB}→${trialB[0]?.newValue ?? '?'})`,
565
+ trialA.length >= 1 && trialB.length >= 1 && trialA[0].recipeRunId !== trialB[0].recipeRunId,
566
+ `A=${JSON.stringify(trialA.slice(0, 1))} B=${JSON.stringify(trialB.slice(0, 1))}`)
567
+
568
+ // ── 配方历史 + 统一回退(recipe 绑定 = 配方级操作权;节点下发历史由批次/账本记录) ──
569
+ // 回退是配方级操作:复用自动频道 lead(已有 dcwB 点位绑定),再补一条配方绑定;
570
+ // 前面的三模式试验已在无配方绑定时完成,故不污染「纯点位授权」证据。
571
+ const rbBind = await bindAuto(autoLead.id, writeRecipe.id, 'recipe')
572
+ const patchV2 = await api('PATCH', `/api/workshop/dcw/recipes/${writeRecipe.id}`, {
573
+ params: [
574
+ { nodeId: dcwA.id, value: 56, min: 50, max: 70, stepLimit: 4 },
575
+ { nodeId: dcwB.id, value: 64, min: 50, max: 70, stepLimit: 4 },
576
+ ],
577
+ }, admin)
578
+ const versionsV2 = (await api('GET', `/api/workshop/dcw/recipes/${writeRecipe.id}/versions`))?.data?.versions ?? []
579
+ const v2 = versionsV2.find(v => v.version >= 2 && Array.isArray(v.params) && v.params.some(p => p.nodeId === dcwA.id && p.value === 56))
580
+ ok('R8a', '配方定义版本化(v2 = 56/64,归因用户)', Boolean(rbBind?.data?.binding?.id) && Boolean(v2) && patchV2.status === 200,
581
+ `bind=${rbBind?.data?.binding?.kind} versions=${versionsV2.map(v => v.version).join(',')} patch=${patchV2.status}`)
582
+ const preRb = await journalCount(writeLine.id)
583
+ const preRbA = preRb.find(a => a.nodeId === dcwA.id)
584
+ const preRbB = preRb.find(a => a.nodeId === dcwB.id)
585
+ const rb = await api('POST', '/api/workshop/agent-tools/invoke', {
586
+ agentId: autoLead.id,
587
+ tool: 'recipe_rollback',
588
+ args: { recipe_id: writeRecipe.id, version: 1, dispatch: true, reason: '验收:统一回退到 v1(历史+回退验证)' },
589
+ }, undefined, { 'x-aw-agent-token': tok.auto })
590
+ const rbText = String(rb?.data?.result?.text ?? rb?.data?.text ?? '')
591
+ ok('R8b', '配方级统一回退(recipe_rollback v1 + dispatch)执行成功', !(rb?.data?.result?.isError ?? rb?.data?.isError) && /统一回退完成/.test(rbText),
592
+ rbText.slice(0, 400))
593
+ const afterRbJournal = await journalCount(writeLine.id)
594
+ const preRbIds = new Set(preRb.map(a => a.id))
595
+ const rbNew = afterRbJournal.filter(a => !preRbIds.has(a.id))
596
+ const rbA = rbNew.filter(a => a.nodeId === dcwA.id && a.newValue === 60 && a.prevValue === preRbA?.newValue)
597
+ const rbB = rbNew.filter(a => a.nodeId === dcwB.id && a.newValue === 60 && a.prevValue === preRbB?.newValue)
598
+ const nodesAfterRb = await api('GET', '/api/workshop/dcw')
599
+ const rbNodeA = (nodesAfterRb?.data?.nodes ?? []).find(n => n.id === dcwA.id)
600
+ const rbNodeB = (nodesAfterRb?.data?.nodes ?? []).find(n => n.id === dcwB.id)
601
+ ok('R8c', `回退逐节点落账(${preRbA?.newValue}→60 / ${preRbB?.newValue}→60,回退批次新账本)`, rbA.length >= 1 && rbB.length >= 1,
602
+ `A=${JSON.stringify(rbA.slice(0, 1))} B=${JSON.stringify(rbB.slice(0, 1))}`)
603
+ ok('R8d', '回退后设备侧恢复 60/60', Number(rbNodeA?.value) === 60 && Number(rbNodeB?.value) === 60,
604
+ `A=${rbNodeA?.value} B=${rbNodeB?.value}`)
605
+ const versionsAfterRb = (await api('GET', `/api/workshop/dcw/recipes/${writeRecipe.id}/versions`))?.data?.versions ?? []
606
+ const v3 = versionsAfterRb.find(v => v.version >= 3 && Array.isArray(v.params)
607
+ && v.params.some(p => p.nodeId === dcwA.id && p.value === 60) && v.params.some(p => p.nodeId === dcwB.id && p.value === 60))
608
+ ok('R8e', '回退生成新版本 v3(定义 60/60,历史 v1/v2 保留)', Boolean(v3),
609
+ `versions=${versionsAfterRb.map(v => `${v.version}:${(v.params ?? []).map(p => p.value).join('/')}`).join(',')}`)
610
+ evidence.rollback = {
611
+ worker: autoLead.id, binding: rbBind?.data?.binding?.id, response: rbText,
612
+ journal: [...rbA.slice(0, 1), ...rbB.slice(0, 1)],
613
+ versions: versionsAfterRb.map(v => ({ version: v.version, values: (v.params ?? []).map(p => p.value), by: v.by })),
614
+ }
615
+
616
+ // ── 换配方:活动配方 B 接管 DCW 管控;同一节点绑定 Agent 无需新绑定 ──
617
+ await api('POST', `/api/workshop/dcw/lines/${writeLine.id}/stop`, undefined, admin)
618
+ const recipeB = (await api('POST', '/api/workshop/dcw/recipes', {
619
+ productId: writeProduct.id,
620
+ name: '验收配方-写入线B',
621
+ description: '换配方验收:B 接管两路 DCW 的窗口/目标值与下发',
622
+ opIntervalMs: 0,
623
+ params: [
624
+ { nodeId: dcwA.id, value: 52, min: 50, max: 70, stepLimit: 4 },
625
+ { nodeId: dcwB.id, value: 64, min: 50, max: 70, stepLimit: 4 },
626
+ ],
627
+ daqWindows: [{ nodeId: writeDaq.id, min: 50, max: 70 }],
628
+ })).data?.recipe
629
+ const startB = await api('POST', `/api/workshop/dcw/lines/${writeLine.id}/start`, { recipeId: recipeB.id }, admin)
630
+ await sleep(1500)
631
+ const nodesB = await api('GET', '/api/workshop/dcw')
632
+ const bNodeA = (nodesB?.data?.nodes ?? []).find(n => n.id === dcwA.id)
633
+ const bNodeB = (nodesB?.data?.nodes ?? []).find(n => n.id === dcwB.id)
634
+ ok('R9a', '换配方后 B 的配方参数接管两路 DCW(A=52,B=64)',
635
+ startB.status === 200 && Number(bNodeA?.value) === 52 && Number(bNodeB?.value) === 64,
636
+ `start=${startB.status} A=${bNodeA?.value} B=${bNodeB?.value} run=${startB?.data?.run?.id}`)
637
+ const switchTrial = await api('POST', '/api/workshop/agent-tools/invoke', {
638
+ agentId: autoLead.id,
639
+ tool: 'recipe_trial',
640
+ args: { line_id: writeLine.id, params: [{ node_id: dcwB.id, value: 66 }], hypothesis: '验收:换配方后活动配方B继续管理DCW下发' },
641
+ }, undefined, { 'x-aw-agent-token': tok.auto })
642
+ const switchText = String(switchTrial?.data?.result?.text ?? switchTrial?.data?.text ?? '')
643
+ ok('R9b', '同一节点绑定 Agent 在换配方后 trial 成功(无需新绑定/无审批)', !(switchTrial?.data?.result?.isError ?? switchTrial?.data?.isError) && /试验已整批下发/.test(switchText),
644
+ switchText.slice(0, 360))
645
+ const switchJournal = (await journalCount(writeLine.id)).filter(a => a.nodeId === dcwB.id && a.newValue === 66 && a.prevValue === 64)
646
+ const nodesAfterSwitch = await api('GET', '/api/workshop/dcw')
647
+ const sNodeA = (nodesAfterSwitch?.data?.nodes ?? []).find(n => n.id === dcwA.id)
648
+ const sNodeB = (nodesAfterSwitch?.data?.nodes ?? []).find(n => n.id === dcwB.id)
649
+ ok('R9c', 'B 的活动批次记录本次下发(A 保持 52,B=66;活动批次属配方 B)',
650
+ switchJournal.length >= 1 && startB?.data?.run?.recipeId === recipeB?.id && Number(sNodeA?.value) === 52 && Number(sNodeB?.value) === 66,
651
+ `journal=${JSON.stringify(switchJournal.slice(0, 1))} runRecipe=${startB?.data?.run?.recipeId} A=${sNodeA?.value} B=${sNodeB?.value}`)
652
+ evidence.switch = {
653
+ recipeB: recipeB?.id, runB: startB?.data?.run?.id, trialResponse: switchText, journal: switchJournal.slice(0, 2),
654
+ }
655
+
656
+ // ── 产线配方管理权(kind='line-recipe'):真实 Agent 建/改/回退全线配方 + 下发按 dcw 收窄 ──
657
+ const mgrCh = await makeChannel('验收-配方管理员', writeLine.id,
658
+ '你是产线配方管理员:可查看/新建/修改/回退本产线全部配方;参数下发只允许你绑定的数控点位。严格按任务步骤执行,不复测、不等待、不固化。', 'auto',
659
+ ['my_industrial_nodes', 'line_context', 'recipe_create', 'recipe_update', 'recipe_rollback', 'recipe_trial', 'complete_task', 'report_progress'])
660
+ const mgrLead = mgrCh.lead
661
+ ok('R10', '配方管理员频道创建(omp/selected/工具面含管理工具)', Boolean(mgrCh.channelId) && mgrCh.toolsSaved === 200, `channel=${mgrCh.channelId} tools=${mgrCh.toolsSaved}`)
662
+ const mgrLineGrant = await bindAuto(mgrLead.id, writeLine.id, 'line-recipe')
663
+ const mgrDcwBind = await bindAuto(mgrLead.id, dcwA.id, 'dcw')
664
+ ok('R10b', '管理权 + 单点位 dcw 绑定落库', mgrLineGrant.status === 200 && mgrDcwBind.status === 200,
665
+ `grant=${mgrLineGrant?.data?.binding?.kind}:${mgrLineGrant?.data?.binding?.mode} dcw=${mgrDcwBind?.data?.binding?.kind}:${mgrDcwBind?.data?.binding?.mode}`)
666
+ const tokMgr = agentTokenOf(mgrLead.id)
667
+
668
+ // 下发收窄(对当时活动配方 writeRecipe,A/B 都是参数):未绑定节点拒,绑定点位放行
669
+ const curNodes = await api('GET', '/api/workshop/dcw')
670
+ const curA = (curNodes?.data?.nodes ?? []).find(n => n.id === dcwA.id)
671
+ const trialUnbound = await api('POST', '/api/workshop/agent-tools/invoke', {
672
+ agentId: mgrLead.id, tool: 'recipe_trial',
673
+ args: { line_id: writeLine.id, params: [{ node_id: dcwB.id, value: 62 }], hypothesis: '验收:管理权 Agent 未绑定该点位,应被收窄拒绝' },
674
+ }, undefined, { 'x-aw-agent-token': tokMgr })
675
+ const unboundText = String(trialUnbound?.data?.result?.text ?? trialUnbound?.data?.text ?? '')
676
+ ok('R10c', '管理权 + dcw 绑定 → 未绑定节点下发被收窄拒', Boolean(trialUnbound?.data?.result?.isError ?? trialUnbound?.data?.isError) && /下发被收窄|只能覆盖这些点位/.test(unboundText), unboundText.slice(0, 300))
677
+ const trialBound = await api('POST', '/api/workshop/agent-tools/invoke', {
678
+ agentId: mgrLead.id, tool: 'recipe_trial',
679
+ args: { line_id: writeLine.id, params: [{ node_id: dcwA.id, value: Number(curA?.value ?? 52) + 2 }], hypothesis: '验收:绑定点位内下发放行' },
680
+ }, undefined, { 'x-aw-agent-token': tokMgr })
681
+ const boundText = String(trialBound?.data?.result?.text ?? trialBound?.data?.text ?? '')
682
+ ok('R10d', '管理权 + dcw 绑定 → 绑定点位内 trial 放行(真实 Agent 身份)', !(trialBound?.data?.result?.isError ?? trialBound?.data?.isError) && /试验已整批下发/.test(boundText), boundText.slice(0, 300))
683
+
684
+ // 真实 omp 任务:创建配方(用绑定的节点)。9B 模型可能自选 use_active_run 快照,
685
+ // 断言按「任务窗口内本线新增的配方」判定(能力级),不绑死命名。
686
+ const recipesBefore = (await api('GET', `/api/workshop/dcw/recipes`))?.data?.recipes ?? []
687
+ const knownIds = new Set(recipesBefore.map(r => r.id))
688
+ const mgrCreateTask = await submitTask(mgrCh.channelId, '验收-管理权-新建配方',
689
+ '严格按三步执行,不要做别的:\n'
690
+ + '1) 调用 my_industrial_nodes 查看你的授权(记下绑定的数控节点 id);\n'
691
+ + `2) 调用 recipe_create:line_id="${writeLine.id}",name="验收-管理权配方",显式传 params=[{node_id:"<你绑定的节点id>",value:58}](不要使用 use_active_run/source_recipe_id/from_run_id),reason 写「验收:产线配方管理权新建配方」;\n`
692
+ + '3) 立即调用 complete_task 提交 recipe_create 完整回执与新配方 id。\n'
693
+ + '禁止其他任何工具。')
694
+ const mgrCreateRun = await waitTask(mgrCreateTask.id, { timeoutMs: 10 * 60_000 })
695
+ const recipesOnLine = (await api('GET', `/api/workshop/dcw/recipes`))?.data?.recipes ?? []
696
+ const mgrRecipe = recipesOnLine.find(r => r.lineId === writeLine.id && !knownIds.has(r.id))
697
+ ok('R10e', '真实 Agent 凭产线管理权新建配方成功(无单配方绑定,窗口内新增)', mgrCreateRun.task?.state === 'COMPLETED' && Boolean(mgrRecipe),
698
+ `task=${mgrCreateRun.task?.state} recipe=${mgrRecipe?.id ?? '(未找到)'} deliverable=${deliverableOf(mgrCreateRun.task).slice(0, 200)}`)
699
+
700
+ if (mgrRecipe) {
701
+ // 管理权:切换产线到新配方(其参数接管 DCW),再由同一 Agent 修改+回退。
702
+ // 新配方参数值可能是模型自选的快照值:以 v1 定义里 dcwA 的实际值为基线断言。
703
+ const mgrV1 = ((await api('GET', `/api/workshop/dcw/recipes/${mgrRecipe.id}/versions`))?.data?.versions ?? [])[0]
704
+ const baseA = Number((mgrV1?.params ?? []).find(p => p.nodeId === dcwA.id)?.value)
705
+ const stopPrev = await api('POST', `/api/workshop/dcw/lines/${writeLine.id}/stop`, undefined, admin)
706
+ const startM = await api('POST', `/api/workshop/dcw/lines/${writeLine.id}/start`, { recipeId: mgrRecipe.id }, admin)
707
+ const afterStart = await api('GET', '/api/workshop/dcw')
708
+ const mNodeA = (afterStart?.data?.nodes ?? []).find(n => n.id === dcwA.id)
709
+ ok('R10f', '新配方开跑:管理权新建的配方接管 DCW(A=v1 定义值)', stopPrev.status === 200 && startM.status === 200 && Number.isFinite(baseA) && Number(mNodeA?.value) === baseA,
710
+ `stop=${stopPrev.status} start=${startM.status} A=${mNodeA?.value} v1A=${baseA}`)
711
+ const mgrEditTask = await submitTask(mgrCh.channelId, '验收-管理权-修改并回退',
712
+ '严格按三步执行,不要做别的:\n'
713
+ + `1) 调用 recipe_update:recipe_id="${mgrRecipe.id}",params=[{node_id:"${dcwA.id}",value:56}],reason 写「验收:管理权直接修改全线配方」;\n`
714
+ + `2) 调用 recipe_rollback:recipe_id="${mgrRecipe.id}",version=1,reason 写「验收:管理权回退到 v1(仅定义)」;\n`
715
+ + '3) 立即调用 complete_task 提交两步回执原文。\n'
716
+ + '禁止其他任何工具。')
717
+ const mgrEditRun = await waitTask(mgrEditTask.id, { timeoutMs: 10 * 60_000 })
718
+ const mgrVersions = (await api('GET', `/api/workshop/dcw/recipes/${mgrRecipe.id}/versions`))?.data?.versions ?? []
719
+ const v2Row = mgrVersions.find(v => v.version === 2)
720
+ const lastRow = mgrVersions[mgrVersions.length - 1]
721
+ ok('R10g', '同一 Agent 修改配方(update v2=56)成功', mgrVersions.some(v => v.version === 2),
722
+ `task=${mgrEditRun.task?.state} versions=${mgrVersions.map(v => `${v.version}:${(v.params ?? []).map(p => p.value).join('/')}`).join(',')}`)
723
+ ok('R10h', '同一 Agent 回退配方(生成新版本,参数回到 v1)', Number(lastRow?.version) >= 3
724
+ && Array.isArray(lastRow?.params) && Number.isFinite(baseA) && lastRow.params.some(p => p.nodeId === dcwA.id && p.value === baseA)
725
+ && Array.isArray(v2Row?.params) && v2Row.params.some(p => p.nodeId === dcwA.id && p.value !== baseA),
726
+ `versions=${mgrVersions.map(v => `${v.version}:${(v.params ?? []).map(p => p.value).join('/')}`).join(',')}`)
727
+ // 收回管理权 → 版本操作立即被拒(dcw 点位绑定不授予版本权)
728
+ const mgrGrantId = mgrLineGrant?.data?.binding?.id
729
+ await api('DELETE', `/api/workshop/agent-tools/bindings/${mgrGrantId}`, undefined, admin)
730
+ const updAfterRevoke = await api('POST', '/api/workshop/agent-tools/invoke', {
731
+ agentId: mgrLead.id, tool: 'recipe_update',
732
+ args: { recipe_id: mgrRecipe.id, params: [{ node_id: dcwA.id, value: 55 }], reason: '验收:收回管理权后应拒绝' },
733
+ }, undefined, { 'x-aw-agent-token': tokMgr })
734
+ const revokeText = String(updAfterRevoke?.data?.result?.text ?? updAfterRevoke?.data?.text ?? '')
735
+ ok('R10i', '收回产线管理权后 recipe_update → 拒绝(需配方级授权)',
736
+ Boolean(updAfterRevoke?.data?.result?.isError ?? updAfterRevoke?.data?.isError) && /配方级授权|版本操作|配方管理权/.test(revokeText), revokeText.slice(0, 300))
737
+ evidence.lineManager = {
738
+ channel: mgrCh.channelId, agent: mgrLead.id, lineGrant: mgrGrantId, dcw: dcwA.id,
739
+ recipe: mgrRecipe.id, versions: mgrVersions.map(v => ({ version: v.version, values: (v.params ?? []).map(p => p.value) })),
740
+ scopedTrial: { unbound: unboundText.slice(0, 200), bound: boundText.slice(0, 200) },
741
+ createDeliverable: deliverableOf(mgrCreateRun.task), editDeliverable: deliverableOf(mgrEditRun.task),
742
+ toolCallsCreate: toolCallsOf(mgrCreateRun.task), toolCallsEdit: toolCallsOf(mgrEditRun.task),
743
+ }
744
+ }
745
+
746
+ // ── IDD 集成(仅检查,不启动分析) ──
747
+ const pluginsR = await api('GET', '/api/workshop/plugins')
748
+ const pluginRows = pluginsR?.data?.plugins ?? pluginsR?.plugins ?? pluginsR?.data ?? []
749
+ const wanted = ['idd-closedloop-bridge', 'diag-bridge', 'rag-bridge']
750
+ const pluginState = wanted.map((name) => {
751
+ const row = Array.isArray(pluginRows) ? pluginRows.find(p => p.name === name) : pluginRows?.[name]
752
+ return { name, enabled: Boolean(row?.enabled), error: row?.error ?? row?.lastError ?? null }
753
+ })
754
+ const toolsR = await api('GET', '/api/workshop/tools')
755
+ const toolRows = toolsR?.data?.tools ?? toolsR?.tools ?? toolsR?.data ?? []
756
+ const requiredTools = ['diag_run', 'diag_status', 'kb_agent']
757
+ const toolState = requiredTools.map((name) => {
758
+ const row = Array.isArray(toolRows) ? toolRows.find(t => t.name === name) : null
759
+ return { name, registered: Boolean(row), available: row ? row.available !== false : false }
760
+ })
761
+ let iddHealth = null
762
+ try {
763
+ const r = await fetch('http://127.0.0.1:3210/health', { signal: AbortSignal.timeout(3000) })
764
+ iddHealth = { status: r.status, ok: r.ok }
765
+ }
766
+ catch (err) {
767
+ iddHealth = { status: 0, ok: false, error: err instanceof Error ? err.message : String(err) }
768
+ }
769
+ ok('R7', 'IDD 集成:三插件在位且启用、诊断/知识工具已注册', pluginState.every(p => p.enabled) && toolState.filter(t => t.available).length >= 2,
770
+ JSON.stringify({ pluginState, toolState }))
771
+ ok('R7b', 'IDD 后端可达(不启动任何分析)', Boolean(iddHealth?.ok), JSON.stringify(iddHealth))
772
+ evidence.idd = { plugins: pluginState, tools: toolState, backendHealth: iddHealth, analysisStarted: false, note: '仅检查集成面,未调用 diag_run/未启动分析(token 缺失时诊断调用会 401,属配置缺口)' }
773
+
774
+ evidence.assertions = results
775
+ }
776
+ catch (err) {
777
+ ok('FATAL', '验收未捕获异常', false, err instanceof Error ? `${err.message}\n${err.stack ?? ''}` : String(err))
778
+ evidence.assertions = results
779
+ }
780
+ finally {
781
+ mkdirSync(EVIDENCE_DIR, { recursive: true })
782
+ const passed = results.filter(r => r.pass).length
783
+ const total = results.length
784
+ evidence.summary = { total, passed, failed: total - passed, verdict: passed === total ? 'PASS' : 'FAIL' }
785
+ writeFileSync(join(EVIDENCE_DIR, 'report.json'), JSON.stringify(evidence, null, 2))
786
+ for (const [mode, task] of Object.entries(evidence.tasks)) {
787
+ writeFileSync(join(EVIDENCE_DIR, `${mode}-task.json`), JSON.stringify(task, null, 2))
788
+ }
789
+ console.log(`\n结论:${passed === total ? 'PASS' : 'FAIL'}(${passed}/${total})`)
790
+ console.log(`证据:${join(EVIDENCE_DIR, 'report.json')}`)
791
+ process.exit(passed === total ? 0 : 1)
792
+ }