agentworkshop 0.8.1 → 0.8.3

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 (1563) hide show
  1. package/.output/.AgentWorkShop/aml-python/train-example.py +92 -92
  2. package/.output/nitro.json +1 -1
  3. package/.output/public/_nuxt/{BCLUwdP52.js → 39W1CH-l2.js} +1 -1
  4. package/.output/public/_nuxt/7xbYPfY6.js +1 -0
  5. package/.output/public/_nuxt/{BfvuWqSa.js → ATAvN55g.js} +1 -1
  6. package/.output/public/_nuxt/{B2NbzUau2.js → B3eCVqcT2.js} +1 -1
  7. package/.output/public/_nuxt/{DuUc4bbY2.js → B9qIhT7k2.js} +1 -1
  8. package/.output/public/_nuxt/{BkEokGX5.js → BE9oKpOt.js} +1 -1
  9. package/.output/public/_nuxt/{D_59BNP1.js → Bbk1XCCM.js} +3 -3
  10. package/.output/public/_nuxt/{Dz9C2pTa.js → CMzExk8F.js} +1 -1
  11. package/.output/public/_nuxt/{dHwWyr6b.js → CT4bi_Y4.js} +1 -1
  12. package/.output/public/_nuxt/{26OL4Ao82.js → CeCSjB9O2.js} +1 -1
  13. package/.output/public/_nuxt/{Dyxf2xZw.js → Cot5VNae.js} +1 -1
  14. package/.output/public/_nuxt/{BVg2R2VB2.js → Crf8_Ad02.js} +1 -1
  15. package/.output/public/_nuxt/{rDvMijKA.js → D9tNM-1a.js} +2 -2
  16. package/.output/public/_nuxt/{YAA98rWJ.js → DAug2CPf.js} +7 -7
  17. package/.output/public/_nuxt/{CQSxS_Ek.js → DbhTN7-T.js} +1 -1
  18. package/.output/public/_nuxt/DgGzwjAr2.js +2 -0
  19. package/.output/public/_nuxt/DkRozlDP2.js +1 -0
  20. package/.output/public/_nuxt/{DGu_fna7.js → DoChWkff.js} +1 -1
  21. package/.output/public/_nuxt/{Byiiiwc72.js → DxH5focQ2.js} +1 -1
  22. package/.output/public/_nuxt/Dyr3LPGL.js +1 -0
  23. package/.output/public/_nuxt/{CC2Pv8VL2.js → MC_i34H42.js} +1 -1
  24. package/.output/public/_nuxt/OmpTerminalPanel.DMWgGwDs.css +1 -0
  25. package/.output/public/_nuxt/PluginSlot.BqBzLD4T.css +1 -0
  26. package/.output/public/_nuxt/TownView.Cn8SPG7S.css +1 -0
  27. package/.output/public/_nuxt/{CmuGMxDP.js → TugRY_4O.js} +1 -1
  28. package/.output/public/_nuxt/{BPUQZ9Lq2.js → WybiLTow2.js} +1 -1
  29. package/.output/public/_nuxt/{BaYDgyaR.js → Zn0BZpf0.js} +3 -3
  30. package/.output/public/_nuxt/{_id_.BQRWK7J2.css → _id_.Be5JaH-P.css} +1 -1
  31. package/.output/public/_nuxt/{_wsId_.DCnKQQdY.css → _wsId_.p_vAYtTp.css} +1 -1
  32. package/.output/public/_nuxt/{agents.D-JPovTZ.css → agents.CRomddYR.css} +1 -1
  33. package/.output/public/_nuxt/aml.DgOMpDpv.css +1 -0
  34. package/.output/public/_nuxt/builds/latest.json +1 -1
  35. package/.output/public/_nuxt/builds/meta/fd0033e4-1eaa-42f8-9a04-3132717a703b.json +1 -0
  36. package/.output/public/_nuxt/{default.BEXGWZFQ.css → default.CpAx70gC.css} +1 -1
  37. package/.output/public/_nuxt/{logs.BkJPbR_K.css → logs.DcSvz6vi.css} +1 -1
  38. package/.output/public/_nuxt/{monitor.D3yEqqrv.css → monitor.OoNTwfMJ.css} +1 -1
  39. package/.output/public/_nuxt/{ontology.B_3Wn907.css → ontology.JqJ6PjV1.css} +1 -1
  40. package/.output/public/_nuxt/{operations.-l6u44Ar.css → operations.C48ggFa5.css} +1 -1
  41. package/.output/public/_nuxt/{pages.Cdpm_B-G.css → pages.Dpa28tJW.css} +1 -1
  42. package/.output/public/_nuxt/permissions.CrV-4t-6.css +1 -0
  43. package/.output/public/_nuxt/{BfeXib9G.js → rcdmiszh2.js} +1 -1
  44. package/.output/public/_nuxt/schedules.DYWOjGHm.css +1 -0
  45. package/.output/public/_nuxt/{teams.CLQaXno5.css → teams.DEJoJ4QV.css} +1 -1
  46. package/.output/public/_nuxt/{tokens.BDSUWF-L.css → tokens.DKZWCP5v.css} +1 -1
  47. package/.output/public/_nuxt/tools.DP-nsTli.css +1 -0
  48. package/.output/public/_nuxt/wK6Pp4Zc2.js +2 -0
  49. package/.output/public/_nuxt/{workshop.BBiFhXuM.css → workshop.PT1xhP8C.css} +1 -1
  50. package/.output/public/favicon.svg +14 -14
  51. package/.output/public/robots.txt +3 -3
  52. package/.output/server/chunks/_/LeftOutlined.mjs.map +1 -1
  53. package/.output/server/chunks/_/RightOutlined.mjs.map +1 -1
  54. package/.output/server/chunks/_/SearchOutlined.mjs +1230 -1261
  55. package/.output/server/chunks/_/SearchOutlined.mjs.map +1 -1
  56. package/.output/server/chunks/_/error-500.mjs.map +1 -1
  57. package/.output/server/chunks/_/nitro.mjs +3308 -3389
  58. package/.output/server/chunks/_/nitro.mjs.map +1 -1
  59. package/.output/server/chunks/build/AuthGate-G74Wr5IV.mjs +704 -0
  60. package/.output/server/chunks/build/AuthGate-G74Wr5IV.mjs.map +1 -0
  61. package/.output/server/chunks/build/FormItemContext-DmuQqaeJ.mjs +77 -0
  62. package/.output/server/chunks/build/FormItemContext-DmuQqaeJ.mjs.map +1 -0
  63. package/.output/server/chunks/build/OmpTerminalPanel-5cB-78zp.mjs +889 -0
  64. package/.output/server/chunks/build/OmpTerminalPanel-5cB-78zp.mjs.map +1 -0
  65. package/.output/server/chunks/build/PluginSlot-CZlGlRoR.mjs +131 -0
  66. package/.output/server/chunks/build/PluginSlot-CZlGlRoR.mjs.map +1 -0
  67. package/.output/server/chunks/build/TownView-CUbzOT_M.mjs +5960 -0
  68. package/.output/server/chunks/build/TownView-CUbzOT_M.mjs.map +1 -0
  69. package/.output/server/chunks/build/_id_-BHWZiRQZ.mjs +373 -0
  70. package/.output/server/chunks/build/_id_-BHWZiRQZ.mjs.map +1 -0
  71. package/.output/server/chunks/build/_id_-JaGx0yBE.mjs +1922 -0
  72. package/.output/server/chunks/build/_id_-JaGx0yBE.mjs.map +1 -0
  73. package/.output/server/chunks/build/_wsId_-C4DKkEqv.mjs +13707 -0
  74. package/.output/server/chunks/build/_wsId_-C4DKkEqv.mjs.map +1 -0
  75. package/.output/server/chunks/build/agents-DRod4lTC.mjs +1047 -0
  76. package/.output/server/chunks/build/agents-DRod4lTC.mjs.map +1 -0
  77. package/.output/server/chunks/build/alert-CNGhs--Y.mjs +260 -0
  78. package/.output/server/chunks/build/alert-CNGhs--Y.mjs.map +1 -0
  79. package/.output/server/chunks/build/aml-B3Umz4DR.mjs +729 -0
  80. package/.output/server/chunks/build/aml-B3Umz4DR.mjs.map +1 -0
  81. package/.output/server/chunks/build/analysis-tNpFLtMt.mjs +502 -0
  82. package/.output/server/chunks/build/analysis-tNpFLtMt.mjs.map +1 -0
  83. package/.output/server/chunks/build/{api-B4Om0mEc.mjs → api-D-zkgkj-.mjs} +8 -10
  84. package/.output/server/chunks/build/api-D-zkgkj-.mjs.map +1 -0
  85. package/.output/server/chunks/build/{api-BsAgXWxi.mjs → api-D3gy2e2q.mjs} +22 -24
  86. package/.output/server/chunks/build/api-D3gy2e2q.mjs.map +1 -0
  87. package/.output/server/chunks/build/{api-BEW_ebY_.mjs → api-bn4OKkl_.mjs} +17 -19
  88. package/.output/server/chunks/build/api-bn4OKkl_.mjs.map +1 -0
  89. package/.output/server/chunks/build/api-error-CnW_xiNI.mjs +46 -0
  90. package/.output/server/chunks/build/api-error-CnW_xiNI.mjs.map +1 -0
  91. package/.output/server/chunks/build/apiClient-DIXx9sfD.mjs +70 -0
  92. package/.output/server/chunks/build/apiClient-DIXx9sfD.mjs.map +1 -0
  93. package/.output/server/chunks/build/board-B2oYXGBy.mjs +172 -0
  94. package/.output/server/chunks/build/board-B2oYXGBy.mjs.map +1 -0
  95. package/.output/server/chunks/build/builtin-catalog-edpDcgfL.mjs +81 -94
  96. package/.output/server/chunks/build/builtin-catalog-edpDcgfL.mjs.map +1 -1
  97. package/.output/server/chunks/build/card-BECE6y_G.mjs +922 -0
  98. package/.output/server/chunks/build/card-BECE6y_G.mjs.map +1 -0
  99. package/.output/server/chunks/build/channel-templates-R2TInv8B.mjs +950 -0
  100. package/.output/server/chunks/build/channel-templates-R2TInv8B.mjs.map +1 -0
  101. package/.output/server/chunks/build/chart-trend-BWeZh5Lv.mjs +113 -112
  102. package/.output/server/chunks/build/chart-trend-BWeZh5Lv.mjs.map +1 -1
  103. package/.output/server/chunks/build/checkbox-C6xY5uc6.mjs +429 -0
  104. package/.output/server/chunks/build/checkbox-C6xY5uc6.mjs.map +1 -0
  105. package/.output/server/chunks/build/client-only-S7k53PIm.mjs +42 -0
  106. package/.output/server/chunks/build/client-only-S7k53PIm.mjs.map +1 -0
  107. package/.output/server/chunks/build/constants-HPHJvjne.mjs +65 -75
  108. package/.output/server/chunks/build/constants-HPHJvjne.mjs.map +1 -1
  109. package/.output/server/chunks/build/core-CRlsQhzd.mjs +292 -0
  110. package/.output/server/chunks/build/core-CRlsQhzd.mjs.map +1 -0
  111. package/.output/server/chunks/build/daq-DHsYtWC-.mjs +1210 -0
  112. package/.output/server/chunks/build/daq-DHsYtWC-.mjs.map +1 -0
  113. package/.output/server/chunks/build/data-Cl4wRZO6.mjs +459 -0
  114. package/.output/server/chunks/build/data-Cl4wRZO6.mjs.map +1 -0
  115. package/.output/server/chunks/build/dcw-DnjOM6p1.mjs +467 -0
  116. package/.output/server/chunks/build/dcw-DnjOM6p1.mjs.map +1 -0
  117. package/.output/server/chunks/build/dcw-driver-badge-Df5wL_ZA.mjs +3 -15
  118. package/.output/server/chunks/build/dcw-driver-badge-Df5wL_ZA.mjs.map +1 -1
  119. package/.output/server/chunks/build/default-DDRKP2Mb.mjs +2246 -0
  120. package/.output/server/chunks/build/default-DDRKP2Mb.mjs.map +1 -0
  121. package/.output/server/chunks/build/descriptions-B3uhDesi.mjs +401 -0
  122. package/.output/server/chunks/build/descriptions-B3uhDesi.mjs.map +1 -0
  123. package/.output/server/chunks/build/drawer-DwXxapMg.mjs +822 -0
  124. package/.output/server/chunks/build/drawer-DwXxapMg.mjs.map +1 -0
  125. package/.output/server/chunks/build/dropdown-DLrGy-Fs.mjs +12 -0
  126. package/.output/server/chunks/build/dropdown-DLrGy-Fs.mjs.map +1 -0
  127. package/.output/server/chunks/build/dropdown-nsGv8Gqx.mjs +530 -0
  128. package/.output/server/chunks/build/dropdown-nsGv8Gqx.mjs.map +1 -0
  129. package/.output/server/chunks/build/{es-Bxu10NJ2.mjs → es-DXSEkmAm.mjs} +1 -2
  130. package/.output/server/chunks/build/es-DXSEkmAm.mjs.map +1 -0
  131. package/.output/server/chunks/build/firstNotUndefined-laiThpLD.mjs +2082 -0
  132. package/.output/server/chunks/build/firstNotUndefined-laiThpLD.mjs.map +1 -0
  133. package/.output/server/chunks/build/form-Cw2Ex9w5.mjs +3543 -0
  134. package/.output/server/chunks/build/form-Cw2Ex9w5.mjs.map +1 -0
  135. package/.output/server/chunks/build/hasIn-RYRGomyg.mjs +192 -0
  136. package/.output/server/chunks/build/hasIn-RYRGomyg.mjs.map +1 -0
  137. package/.output/server/chunks/build/hitl-B4cHRlkC.mjs +120 -0
  138. package/.output/server/chunks/build/hitl-B4cHRlkC.mjs.map +1 -0
  139. package/.output/server/chunks/build/input-CJgB-RL6.mjs +1705 -0
  140. package/.output/server/chunks/build/input-CJgB-RL6.mjs.map +1 -0
  141. package/.output/server/chunks/build/input-number-CQKL42p_.mjs +1027 -0
  142. package/.output/server/chunks/build/input-number-CQKL42p_.mjs.map +1 -0
  143. package/.output/server/chunks/build/interval-DiAUqODq.mjs +8 -0
  144. package/.output/server/chunks/build/interval-DiAUqODq.mjs.map +1 -0
  145. package/.output/server/chunks/build/isNumeric-DQiJ-b15.mjs +6 -0
  146. package/.output/server/chunks/build/isNumeric-DQiJ-b15.mjs.map +1 -0
  147. package/.output/server/chunks/build/logs-C4vKFkHQ.mjs +381 -0
  148. package/.output/server/chunks/build/logs-C4vKFkHQ.mjs.map +1 -0
  149. package/.output/server/chunks/build/menu-xO8ocVtL.mjs +1833 -0
  150. package/.output/server/chunks/build/menu-xO8ocVtL.mjs.map +1 -0
  151. package/.output/server/chunks/build/monitor-BNrG6v3b.mjs +2216 -0
  152. package/.output/server/chunks/build/monitor-BNrG6v3b.mjs.map +1 -0
  153. package/.output/server/chunks/build/narrow-fetch-CcG-BPxc.mjs +0 -2
  154. package/.output/server/chunks/build/narrow-fetch-CcG-BPxc.mjs.map +1 -1
  155. package/.output/server/chunks/build/ontology-B_0Vm6j-.mjs +1416 -0
  156. package/.output/server/chunks/build/ontology-B_0Vm6j-.mjs.map +1 -0
  157. package/.output/server/chunks/build/operations-D8D6-Jm-.mjs +278 -0
  158. package/.output/server/chunks/build/operations-D8D6-Jm-.mjs.map +1 -0
  159. package/.output/server/chunks/build/optimizer-DaTyaY3c.mjs +202 -0
  160. package/.output/server/chunks/build/optimizer-DaTyaY3c.mjs.map +1 -0
  161. package/.output/server/chunks/build/pages-Dac4icQC.mjs +439 -0
  162. package/.output/server/chunks/build/pages-Dac4icQC.mjs.map +1 -0
  163. package/.output/server/chunks/build/pagination-BTzq7dD5.mjs +1330 -0
  164. package/.output/server/chunks/build/pagination-BTzq7dD5.mjs.map +1 -0
  165. package/.output/server/chunks/build/permissions-qmimwB0M.mjs +649 -0
  166. package/.output/server/chunks/build/permissions-qmimwB0M.mjs.map +1 -0
  167. package/.output/server/chunks/build/plugins-Dh_goy-k.mjs +269 -0
  168. package/.output/server/chunks/build/plugins-Dh_goy-k.mjs.map +1 -0
  169. package/.output/server/chunks/build/popconfirm-DuGF7ty-.mjs +333 -0
  170. package/.output/server/chunks/build/popconfirm-DuGF7ty-.mjs.map +1 -0
  171. package/.output/server/chunks/build/responsiveObserve-CzRpNXkr.mjs +77 -0
  172. package/.output/server/chunks/build/responsiveObserve-CzRpNXkr.mjs.map +1 -0
  173. package/.output/server/chunks/build/schedules-C2_x38gj.mjs +7039 -0
  174. package/.output/server/chunks/build/schedules-C2_x38gj.mjs.map +1 -0
  175. package/.output/server/chunks/build/segmented-29uEKZ3D.mjs +332 -0
  176. package/.output/server/chunks/build/segmented-29uEKZ3D.mjs.map +1 -0
  177. package/.output/server/chunks/build/select-CJb2XrQf.mjs +3734 -0
  178. package/.output/server/chunks/build/select-CJb2XrQf.mjs.map +1 -0
  179. package/.output/server/chunks/build/settings-Cz2Plds0.mjs +944 -0
  180. package/.output/server/chunks/build/settings-Cz2Plds0.mjs.map +1 -0
  181. package/.output/server/chunks/build/space-BByD-mFE.mjs +107 -0
  182. package/.output/server/chunks/build/space-BByD-mFE.mjs.map +1 -0
  183. package/.output/server/chunks/build/spin-XhbgGeLP.mjs +313 -0
  184. package/.output/server/chunks/build/spin-XhbgGeLP.mjs.map +1 -0
  185. package/.output/server/chunks/build/studio-CwYXl00G.mjs +329 -0
  186. package/.output/server/chunks/build/studio-CwYXl00G.mjs.map +1 -0
  187. package/.output/server/chunks/build/switch-DWcwVFxW.mjs +374 -0
  188. package/.output/server/chunks/build/switch-DWcwVFxW.mjs.map +1 -0
  189. package/.output/server/chunks/build/table-Zhuo7Fq-.mjs +7249 -0
  190. package/.output/server/chunks/build/table-Zhuo7Fq-.mjs.map +1 -0
  191. package/.output/server/chunks/build/tabs-BCwBXjNt.mjs +1838 -0
  192. package/.output/server/chunks/build/tabs-BCwBXjNt.mjs.map +1 -0
  193. package/.output/server/chunks/build/tag-CRW-anwy.mjs +1010 -0
  194. package/.output/server/chunks/build/tag-CRW-anwy.mjs.map +1 -0
  195. package/.output/server/chunks/build/teams-CwhFdcYn.mjs +1160 -0
  196. package/.output/server/chunks/build/teams-CwhFdcYn.mjs.map +1 -0
  197. package/.output/server/chunks/build/tokens-C5ODO1HA.mjs +992 -0
  198. package/.output/server/chunks/build/tokens-C5ODO1HA.mjs.map +1 -0
  199. package/.output/server/chunks/build/tools-C0YKragH.mjs +487 -0
  200. package/.output/server/chunks/build/tools-C0YKragH.mjs.map +1 -0
  201. package/.output/server/chunks/build/tooltip-GlMrUZzx.mjs +888 -0
  202. package/.output/server/chunks/build/tooltip-GlMrUZzx.mjs.map +1 -0
  203. package/.output/server/chunks/build/town-BV-hbwb5.mjs +16 -29
  204. package/.output/server/chunks/build/town-BV-hbwb5.mjs.map +1 -1
  205. package/.output/server/chunks/build/town-LkDwWnKA.mjs +117 -0
  206. package/.output/server/chunks/build/town-LkDwWnKA.mjs.map +1 -0
  207. package/.output/server/chunks/build/types-D6J7slEa.mjs.map +1 -1
  208. package/.output/server/chunks/build/types-DWqIeMRP.mjs +28 -29
  209. package/.output/server/chunks/build/types-DWqIeMRP.mjs.map +1 -1
  210. package/.output/server/chunks/build/useAgentHarnessOptions-CYKuLtZ2.mjs +120 -0
  211. package/.output/server/chunks/build/useAgentHarnessOptions-CYKuLtZ2.mjs.map +1 -0
  212. package/.output/server/chunks/build/useAgentTemplateActions-Da_V1LSD.mjs +71 -0
  213. package/.output/server/chunks/build/useAgentTemplateActions-Da_V1LSD.mjs.map +1 -0
  214. package/.output/server/chunks/build/useAgentTemplateDialogState-CZzpu5og.mjs +16 -23
  215. package/.output/server/chunks/build/useAgentTemplateDialogState-CZzpu5og.mjs.map +1 -1
  216. package/.output/server/chunks/build/useAgentTemplateForm-BWvax5_E.mjs +112 -0
  217. package/.output/server/chunks/build/useAgentTemplateForm-BWvax5_E.mjs.map +1 -0
  218. package/.output/server/chunks/build/useAgentTemplatesCatalog-BnYjZy59.mjs +140 -0
  219. package/.output/server/chunks/build/useAgentTemplatesCatalog-BnYjZy59.mjs.map +1 -0
  220. package/.output/server/chunks/build/useAmlDatasets-nGi10DAl.mjs +88 -0
  221. package/.output/server/chunks/build/useAmlDatasets-nGi10DAl.mjs.map +1 -0
  222. package/.output/server/chunks/build/useAmlEntities-CTgNAgcZ.mjs +79 -0
  223. package/.output/server/chunks/build/useAmlEntities-CTgNAgcZ.mjs.map +1 -0
  224. package/.output/server/chunks/build/useAmlEnv-Da2TVfyK.mjs +188 -0
  225. package/.output/server/chunks/build/useAmlEnv-Da2TVfyK.mjs.map +1 -0
  226. package/.output/server/chunks/build/useAmlExperiments-U9AQ52RI.mjs +86 -0
  227. package/.output/server/chunks/build/useAmlExperiments-U9AQ52RI.mjs.map +1 -0
  228. package/.output/server/chunks/build/useAmlFormat-C2sl3MGB.mjs +32 -37
  229. package/.output/server/chunks/build/useAmlFormat-C2sl3MGB.mjs.map +1 -1
  230. package/.output/server/chunks/build/useAmlJobs-BM1mu5iH.mjs +251 -0
  231. package/.output/server/chunks/build/useAmlJobs-BM1mu5iH.mjs.map +1 -0
  232. package/.output/server/chunks/build/useAmlModels-C1DwIOMi.mjs +90 -0
  233. package/.output/server/chunks/build/useAmlModels-C1DwIOMi.mjs.map +1 -0
  234. package/.output/server/chunks/build/useAmlNotes-CNm47QdS.mjs +80 -0
  235. package/.output/server/chunks/build/useAmlNotes-CNm47QdS.mjs.map +1 -0
  236. package/.output/server/chunks/build/useAmlPredict-m8I1AdRn.mjs +126 -0
  237. package/.output/server/chunks/build/useAmlPredict-m8I1AdRn.mjs.map +1 -0
  238. package/.output/server/chunks/build/useAnalysisFeed-CpbOaiBD.mjs +120 -0
  239. package/.output/server/chunks/build/useAnalysisFeed-CpbOaiBD.mjs.map +1 -0
  240. package/.output/server/chunks/build/useDaqAddNode-CRorxgOY.mjs +141 -0
  241. package/.output/server/chunks/build/useDaqAddNode-CRorxgOY.mjs.map +1 -0
  242. package/.output/server/chunks/build/useDaqDetailBinding-Ck-YUW9J.mjs +72 -0
  243. package/.output/server/chunks/build/useDaqDetailBinding-Ck-YUW9J.mjs.map +1 -0
  244. package/.output/server/chunks/build/useDaqDetailFrames-CLMoreaz.mjs +78 -0
  245. package/.output/server/chunks/build/useDaqDetailFrames-CLMoreaz.mjs.map +1 -0
  246. package/.output/server/chunks/build/useDaqDetailHistory-BVNQXwC_.mjs +166 -0
  247. package/.output/server/chunks/build/useDaqDetailHistory-BVNQXwC_.mjs.map +1 -0
  248. package/.output/server/chunks/build/useDaqDetailNode-BC0e9OfX.mjs +103 -0
  249. package/.output/server/chunks/build/useDaqDetailNode-BC0e9OfX.mjs.map +1 -0
  250. package/.output/server/chunks/build/useDaqDetailParams-D173iwFg.mjs +157 -0
  251. package/.output/server/chunks/build/useDaqDetailParams-D173iwFg.mjs.map +1 -0
  252. package/.output/server/chunks/build/useDaqFilters-CC-o_21d.mjs +224 -0
  253. package/.output/server/chunks/build/useDaqFilters-CC-o_21d.mjs.map +1 -0
  254. package/.output/server/chunks/build/useDaqNodeWindow-1DWj2H5G.mjs +43 -44
  255. package/.output/server/chunks/build/useDaqNodeWindow-1DWj2H5G.mjs.map +1 -1
  256. package/.output/server/chunks/build/useDaqOptimizations-4vK2w1yn.mjs +132 -0
  257. package/.output/server/chunks/build/useDaqOptimizations-4vK2w1yn.mjs.map +1 -0
  258. package/.output/server/chunks/build/useDaqStream-BHKpSJFd.mjs +385 -0
  259. package/.output/server/chunks/build/useDaqStream-BHKpSJFd.mjs.map +1 -0
  260. package/.output/server/chunks/build/useDaqTemplates-CsXSc7yI.mjs +181 -0
  261. package/.output/server/chunks/build/useDaqTemplates-CsXSc7yI.mjs.map +1 -0
  262. package/.output/server/chunks/build/useDashboardCharts-D45083s_.mjs +312 -310
  263. package/.output/server/chunks/build/useDashboardCharts-D45083s_.mjs.map +1 -1
  264. package/.output/server/chunks/build/useDashboardData-DuKjuJTz.mjs +139 -0
  265. package/.output/server/chunks/build/useDashboardData-DuKjuJTz.mjs.map +1 -0
  266. package/.output/server/chunks/build/useDcwAddNode-C5DcxsHF.mjs +217 -0
  267. package/.output/server/chunks/build/useDcwAddNode-C5DcxsHF.mjs.map +1 -0
  268. package/.output/server/chunks/build/{useDcwCards-SaiImIYQ.mjs → useDcwCards-0bAVo6uB.mjs} +20 -23
  269. package/.output/server/chunks/build/useDcwCards-0bAVo6uB.mjs.map +1 -0
  270. package/.output/server/chunks/build/useDcwDetailScope-BNFOlt2v.mjs +184 -0
  271. package/.output/server/chunks/build/useDcwDetailScope-BNFOlt2v.mjs.map +1 -0
  272. package/.output/server/chunks/build/useDcwDetailTemplates-DSH-o0tE.mjs +143 -0
  273. package/.output/server/chunks/build/useDcwDetailTemplates-DSH-o0tE.mjs.map +1 -0
  274. package/.output/server/chunks/build/useDcwFilter-W61BFUcT.mjs +65 -0
  275. package/.output/server/chunks/build/useDcwFilter-W61BFUcT.mjs.map +1 -0
  276. package/.output/server/chunks/build/{useDcwLedger-0ie-0WTc.mjs → useDcwLedger-DsColLdc.mjs} +29 -35
  277. package/.output/server/chunks/build/useDcwLedger-DsColLdc.mjs.map +1 -0
  278. package/.output/server/chunks/build/useDcwLineMutations-Cx4Ir7g3.mjs +133 -0
  279. package/.output/server/chunks/build/useDcwLineMutations-Cx4Ir7g3.mjs.map +1 -0
  280. package/.output/server/chunks/build/useDcwLineRun-DQ0vB08z.mjs +100 -0
  281. package/.output/server/chunks/build/useDcwLineRun-DQ0vB08z.mjs.map +1 -0
  282. package/.output/server/chunks/build/useDcwParamApprovals-CYspRuDk.mjs +119 -0
  283. package/.output/server/chunks/build/useDcwParamApprovals-CYspRuDk.mjs.map +1 -0
  284. package/.output/server/chunks/build/useDcwProducts-CTbm_5S_.mjs +88 -0
  285. package/.output/server/chunks/build/useDcwProducts-CTbm_5S_.mjs.map +1 -0
  286. package/.output/server/chunks/build/useDcwQuery-E0yjZs7G.mjs +93 -0
  287. package/.output/server/chunks/build/useDcwQuery-E0yjZs7G.mjs.map +1 -0
  288. package/.output/server/chunks/build/useDcwQuickActions-BvT5VFOY.mjs +84 -0
  289. package/.output/server/chunks/build/useDcwQuickActions-BvT5VFOY.mjs.map +1 -0
  290. package/.output/server/chunks/build/useDcwRecipes-zngShyk0.mjs +263 -0
  291. package/.output/server/chunks/build/useDcwRecipes-zngShyk0.mjs.map +1 -0
  292. package/.output/server/chunks/build/useDcwStream-82IdjJKk.mjs +455 -0
  293. package/.output/server/chunks/build/useDcwStream-82IdjJKk.mjs.map +1 -0
  294. package/.output/server/chunks/build/useDcwTemplates-CpHrcnvJ.mjs +87 -0
  295. package/.output/server/chunks/build/useDcwTemplates-CpHrcnvJ.mjs.map +1 -0
  296. package/.output/server/chunks/build/useDcwWrites-BlOhljp9.mjs +136 -0
  297. package/.output/server/chunks/build/useDcwWrites-BlOhljp9.mjs.map +1 -0
  298. package/.output/server/chunks/build/useDeviceTwins-DL-VLFeX.mjs +118 -0
  299. package/.output/server/chunks/build/useDeviceTwins-DL-VLFeX.mjs.map +1 -0
  300. package/.output/server/chunks/build/useExpConfirmations-DgwqTb9O.mjs +104 -0
  301. package/.output/server/chunks/build/useExpConfirmations-DgwqTb9O.mjs.map +1 -0
  302. package/.output/server/chunks/build/useLocalTime-C__kwn8h.mjs +52 -0
  303. package/.output/server/chunks/build/useLocalTime-C__kwn8h.mjs.map +1 -0
  304. package/.output/server/chunks/build/useLogsFormat-B-o4MHy7.mjs +30 -33
  305. package/.output/server/chunks/build/useLogsFormat-B-o4MHy7.mjs.map +1 -1
  306. package/.output/server/chunks/build/useLogsManual-BcfanT0s.mjs +80 -0
  307. package/.output/server/chunks/build/useLogsManual-BcfanT0s.mjs.map +1 -0
  308. package/.output/server/chunks/build/useLogsQuery-BGlKVKpV.mjs +136 -0
  309. package/.output/server/chunks/build/useLogsQuery-BGlKVKpV.mjs.map +1 -0
  310. package/.output/server/chunks/build/useLogsScope-BRyy550Y.mjs +75 -0
  311. package/.output/server/chunks/build/useLogsScope-BRyy550Y.mjs.map +1 -0
  312. package/.output/server/chunks/build/useMonitorColumns-vVnt3r5Q.mjs +155 -166
  313. package/.output/server/chunks/build/useMonitorColumns-vVnt3r5Q.mjs.map +1 -1
  314. package/.output/server/chunks/build/useMonitorData-BUey2Xly.mjs +128 -0
  315. package/.output/server/chunks/build/useMonitorData-BUey2Xly.mjs.map +1 -0
  316. package/.output/server/chunks/build/useMonitorFormat-rhs7FlNo.mjs +77 -0
  317. package/.output/server/chunks/build/useMonitorFormat-rhs7FlNo.mjs.map +1 -0
  318. package/.output/server/chunks/build/useMonitorTerminal-Dj4QwRNW.mjs +20 -27
  319. package/.output/server/chunks/build/useMonitorTerminal-Dj4QwRNW.mjs.map +1 -1
  320. package/.output/server/chunks/build/useOperationsFeed-DWfCjP4l.mjs +182 -0
  321. package/.output/server/chunks/build/useOperationsFeed-DWfCjP4l.mjs.map +1 -0
  322. package/.output/server/chunks/build/useOpsLog--yf8erUi.mjs +139 -0
  323. package/.output/server/chunks/build/useOpsLog--yf8erUi.mjs.map +1 -0
  324. package/.output/server/chunks/build/useRecipeDispatchApprovals-CKF2sB9P.mjs +146 -0
  325. package/.output/server/chunks/build/useRecipeDispatchApprovals-CKF2sB9P.mjs.map +1 -0
  326. package/.output/server/chunks/build/useResponsive-BKDMGTHs.mjs +23 -39
  327. package/.output/server/chunks/build/useResponsive-BKDMGTHs.mjs.map +1 -1
  328. package/.output/server/chunks/build/useTeamActions-C08sAVqY.mjs +71 -0
  329. package/.output/server/chunks/build/useTeamActions-C08sAVqY.mjs.map +1 -0
  330. package/.output/server/chunks/build/useTeamAddMemberDialog-fzTmflr8.mjs +78 -0
  331. package/.output/server/chunks/build/useTeamAddMemberDialog-fzTmflr8.mjs.map +1 -0
  332. package/.output/server/chunks/build/useTeamCreateDialog-De63ep-X.mjs +91 -0
  333. package/.output/server/chunks/build/useTeamCreateDialog-De63ep-X.mjs.map +1 -0
  334. package/.output/server/chunks/build/useTeamDeployDialog-CpAtG5Jy.mjs +76 -0
  335. package/.output/server/chunks/build/useTeamDeployDialog-CpAtG5Jy.mjs.map +1 -0
  336. package/.output/server/chunks/build/useTeamDialogState-CFRUQxAf.mjs +31 -38
  337. package/.output/server/chunks/build/useTeamDialogState-CFRUQxAf.mjs.map +1 -1
  338. package/.output/server/chunks/build/useTeamPluginDialog-C1OOe1sL.mjs +99 -0
  339. package/.output/server/chunks/build/useTeamPluginDialog-C1OOe1sL.mjs.map +1 -0
  340. package/.output/server/chunks/build/useTeamsCatalog-DA41SMDu.mjs +124 -0
  341. package/.output/server/chunks/build/useTeamsCatalog-DA41SMDu.mjs.map +1 -0
  342. package/.output/server/chunks/build/useTokenClipboard-CwQpoFeP.mjs +21 -28
  343. package/.output/server/chunks/build/useTokenClipboard-CwQpoFeP.mjs.map +1 -1
  344. package/.output/server/chunks/build/useTokenCreate-XHTQExra.mjs +106 -0
  345. package/.output/server/chunks/build/useTokenCreate-XHTQExra.mjs.map +1 -0
  346. package/.output/server/chunks/build/useTokenRename-Cf1B0cRy.mjs +81 -0
  347. package/.output/server/chunks/build/useTokenRename-Cf1B0cRy.mjs.map +1 -0
  348. package/.output/server/chunks/build/useTokenReveal-C8n1Vt9t.mjs +108 -0
  349. package/.output/server/chunks/build/useTokenReveal-C8n1Vt9t.mjs.map +1 -0
  350. package/.output/server/chunks/build/useTokensList-MMIq24E-.mjs +86 -0
  351. package/.output/server/chunks/build/useTokensList-MMIq24E-.mjs.map +1 -0
  352. package/.output/server/chunks/build/useTownBus-D9SoIsAN.mjs +16 -17
  353. package/.output/server/chunks/build/useTownBus-D9SoIsAN.mjs.map +1 -1
  354. package/.output/server/chunks/build/useWorkbenchAuth-Dyc_czui.mjs +131 -0
  355. package/.output/server/chunks/build/useWorkbenchAuth-Dyc_czui.mjs.map +1 -0
  356. package/.output/server/chunks/build/useWorkbenchWorkspaces-DT33HbBD.mjs +128 -0
  357. package/.output/server/chunks/build/useWorkbenchWorkspaces-DT33HbBD.mjs.map +1 -0
  358. package/.output/server/chunks/build/useWorkshopApi-BkEgGBIM.mjs +118 -0
  359. package/.output/server/chunks/build/useWorkshopApi-BkEgGBIM.mjs.map +1 -0
  360. package/.output/server/chunks/build/useWorkshopWs-BWrVj4jL.mjs +1577 -0
  361. package/.output/server/chunks/build/useWorkshopWs-BWrVj4jL.mjs.map +1 -0
  362. package/.output/server/chunks/build/{useWorkspaceAuth-Dlvj9csD.mjs → useWorkspaceAuth-TahC9EC7.mjs} +4 -16
  363. package/.output/server/chunks/build/useWorkspaceAuth-TahC9EC7.mjs.map +1 -0
  364. package/.output/server/chunks/build/useWorkspaceChannels-BVAHmhN3.mjs +94 -0
  365. package/.output/server/chunks/build/useWorkspaceChannels-BVAHmhN3.mjs.map +1 -0
  366. package/.output/server/chunks/build/useWorkspacePanels-CTwREmq0.mjs +30 -33
  367. package/.output/server/chunks/build/useWorkspacePanels-CTwREmq0.mjs.map +1 -1
  368. package/.output/server/chunks/build/useWorkspaceShell-rQHWNNWJ.mjs +150 -0
  369. package/.output/server/chunks/build/useWorkspaceShell-rQHWNNWJ.mjs.map +1 -0
  370. package/.output/server/chunks/build/users-pVCK50z-.mjs +566 -0
  371. package/.output/server/chunks/build/users-pVCK50z-.mjs.map +1 -0
  372. package/.output/server/chunks/build/workshop-DAgsBgG4.mjs +499 -0
  373. package/.output/server/chunks/build/workshop-DAgsBgG4.mjs.map +1 -0
  374. package/.output/server/chunks/build/workspaces-CmW0cpOt.mjs +111 -121
  375. package/.output/server/chunks/build/workspaces-CmW0cpOt.mjs.map +1 -1
  376. package/.output/server/chunks/routes/api/plugins/_name/_...path_.mjs +4 -1
  377. package/.output/server/chunks/routes/api/plugins/_name/_...path_.mjs.map +1 -1
  378. package/.output/server/chunks/routes/renderer.mjs +1 -1
  379. package/.output/server/chunks/routes/renderer.mjs.map +1 -1
  380. package/.output/server/chunks/virtual/entry.mjs +9357 -10721
  381. package/.output/server/chunks/virtual/entry.mjs.map +1 -1
  382. package/.output/server/chunks/virtual/precomputed.mjs +1 -1
  383. package/.output/server/chunks/virtual/precomputed.mjs.map +1 -1
  384. package/.output/server/package.json +1 -1
  385. package/README-zh.md +2 -2
  386. package/README.md +3 -3
  387. package/app/components/AwLogo.vue +75 -75
  388. package/app/components/aml/AmlDatasetFormModal.vue +279 -279
  389. package/app/components/aml/AmlDatasetTable.vue +319 -319
  390. package/app/components/aml/AmlExperimentsTable.vue +142 -142
  391. package/app/components/aml/AmlInfraBanner.vue +23 -23
  392. package/app/components/aml/AmlJobsTable.vue +248 -248
  393. package/app/components/aml/AmlOverviewBar.vue +62 -62
  394. package/app/components/aml/AmlPageHeader.vue +47 -47
  395. package/app/components/aml/AmlPredictConsole.vue +201 -201
  396. package/app/components/app-header/HitlBell.vue +423 -423
  397. package/app/components/daq/DaqAddNodeModal.vue +209 -209
  398. package/app/components/daq/DaqAlarmBar.vue +46 -46
  399. package/app/components/daq/DaqControlCard.vue +159 -159
  400. package/app/components/daq/DaqInfraBanner.vue +31 -31
  401. package/app/components/daq/DaqLineBanner.vue +47 -47
  402. package/app/components/daq/DaqNodePanel.vue +396 -396
  403. package/app/components/daq/DaqOptPanel.vue +197 -197
  404. package/app/components/daq/DaqTemplateModal.vue +246 -246
  405. package/app/components/dashboard/DashboardGaugeBand.vue +78 -78
  406. package/app/components/dashboard/DashboardHero.vue +209 -209
  407. package/app/components/dashboard/DashboardLineStatePanel.vue +78 -78
  408. package/app/components/dashboard/DashboardNodeStatePanel.vue +46 -46
  409. package/app/components/dashboard/DashboardPipelinePanel.vue +46 -46
  410. package/app/components/dashboard/DashboardTrendPanel.vue +83 -83
  411. package/app/components/dashboard/DashboardWritePanel.vue +52 -52
  412. package/app/components/dcw/DcwCreateLineModal.vue +105 -105
  413. package/app/components/dcw/DcwDeleteLineModal.vue +73 -73
  414. package/app/components/dcw/DcwDetailTemplateModal.vue +238 -238
  415. package/app/components/dcw/DcwLedgerCard.vue +160 -160
  416. package/app/components/dcw/DcwMesArtifacts.vue +140 -140
  417. package/app/components/dcw/DcwProductCreateModal.vue +113 -113
  418. package/app/components/dcw/DcwRecipeDispatchHistoryModal.vue +244 -244
  419. package/app/components/dcw/DcwRecipeEditModal.vue +399 -399
  420. package/app/components/dcw/DcwRecipeHistoryModal.vue +165 -165
  421. package/app/components/dcw/DcwRunDataModal.vue +191 -191
  422. package/app/components/dcw/DcwTemplateModal.vue +227 -227
  423. package/app/components/dcw/DcwWriteHistoryCard.vue +96 -96
  424. package/app/components/dcw/ExpConfirmCard.vue +103 -103
  425. package/app/components/dcw/RecipeDispatchApprovalCard.vue +330 -330
  426. package/app/components/logs/LogsPageHead.vue +71 -71
  427. package/app/components/monitor/MonitorAgentTable.vue +143 -143
  428. package/app/components/monitor/MonitorChannelTable.vue +80 -80
  429. package/app/components/monitor/MonitorLoginGate.vue +24 -24
  430. package/app/components/monitor/MonitorPageHead.vue +92 -92
  431. package/app/components/monitor/MonitorProcessTable.vue +159 -159
  432. package/app/components/ontology/OntologyGraph.vue +356 -356
  433. package/app/components/operations/OperationsFilterCard.vue +164 -164
  434. package/app/components/operations/OperationsPageHead.vue +47 -47
  435. package/app/components/tokens/TokenCreateModal.vue +42 -42
  436. package/app/components/tokens/TokenOnceModal.vue +164 -164
  437. package/app/components/tokens/TokenRenameModal.vue +40 -40
  438. package/app/components/tokens/TokensPageHead.vue +76 -76
  439. package/app/components/workshop/A2aRpcDebugger.vue +237 -237
  440. package/app/components/workshop/AgentInspectorDrawer.vue +424 -424
  441. package/app/components/workshop/AgentLanesView.vue +278 -278
  442. package/app/components/workshop/ArtifactCard.vue +120 -120
  443. package/app/components/workshop/AssetLibrary.vue +452 -452
  444. package/app/components/workshop/ChatMemberPanel.vue +556 -556
  445. package/app/components/workshop/CommandPalette.vue +270 -270
  446. package/app/components/workshop/Composer.vue +540 -540
  447. package/app/components/workshop/DaqTemplateIcon.vue +33 -33
  448. package/app/components/workshop/DeviceTwinPanel.vue +167 -167
  449. package/app/components/workshop/FileSelectorModal.vue +188 -188
  450. package/app/components/workshop/InspectorPanel.vue +301 -301
  451. package/app/components/workshop/PluginSlot.vue +120 -120
  452. package/app/components/workshop/TranscriptTimeline.vue +223 -223
  453. package/app/components/workshop/agents/AgentTemplateEditModal.vue +139 -139
  454. package/app/components/workshop/blocks/ClusterArtifact.vue +61 -61
  455. package/app/components/workshop/blocks/ClusterError.vue +85 -85
  456. package/app/components/workshop/blocks/ClusterLife.vue +87 -87
  457. package/app/components/workshop/blocks/ClusterMember.vue +95 -95
  458. package/app/components/workshop/blocks/ClusterMemory.vue +84 -84
  459. package/app/components/workshop/blocks/ClusterOther.vue +67 -67
  460. package/app/components/workshop/blocks/ClusterStatus.vue +149 -149
  461. package/app/components/workshop/blocks/ClusterTool.vue +176 -176
  462. package/app/components/workshop/blocks/EventBlockAvatar.vue +114 -114
  463. package/app/components/workshop/blocks/EventBlockHead.vue +232 -232
  464. package/app/components/workshop/composer/ComposerToolbar.vue +278 -278
  465. package/app/components/workshop/composer/MentionMenu.vue +135 -135
  466. package/app/components/workshop/composer/ReplyChip.vue +65 -65
  467. package/app/components/workshop/composer/StatusChip.vue +171 -171
  468. package/app/components/workshop/console/Dock.vue +71 -71
  469. package/app/components/workshop/console/LeftPane.vue +84 -84
  470. package/app/components/workshop/device-twin/DeviceTwinCard.vue +265 -265
  471. package/app/components/workshop/device-twin/DeviceTwinDcwSection.vue +203 -203
  472. package/app/components/workshop/lanes/AddMemberModal.vue +270 -270
  473. package/app/components/workshop/lanes/EditMemberModal.vue +106 -106
  474. package/app/components/workshop/lanes/LanesToolbar.vue +97 -97
  475. package/app/components/workshop/session-list/ChannelSettingsModal.vue +3 -3
  476. package/app/components/workshop/session-list/MountChannelModal.vue +124 -124
  477. package/app/components/workshop/session-list/SaveTemplateModal.vue +93 -93
  478. package/app/components/workshop/task-board/Card.vue +172 -172
  479. package/app/components/workshop/task-board/Column.vue +151 -151
  480. package/app/components/workshop/task-board/List.vue +157 -157
  481. package/app/components/workshop/task-board/StatusMenu.vue +88 -88
  482. package/app/components/workshop/teams/TeamAddMemberModal.vue +53 -53
  483. package/app/components/workshop/teams/TeamCreateModal.vue +94 -94
  484. package/app/components/workshop/teams/TeamDeployModal.vue +40 -40
  485. package/app/components/workshop/teams/TeamPluginModal.vue +119 -119
  486. package/app/components/workshop/terminal/OmpTerminalPanel.vue +270 -270
  487. package/app/components/workshop/terminal/TerminalHitlCard.vue +170 -170
  488. package/app/components/workshop/town/TownScene.ts +466 -466
  489. package/app/components/workshop/town/TownView.vue +561 -561
  490. package/app/components/workshop/town/components/AutoModeConfirmModal.vue +94 -94
  491. package/app/components/workshop/town/components/TownAgentBindings.vue +405 -405
  492. package/app/components/workshop/town/components/TownAgentInspector.vue +554 -554
  493. package/app/components/workshop/town/components/TownAlarmList.vue +147 -147
  494. package/app/components/workshop/town/components/TownBoundaryPanel.vue +350 -350
  495. package/app/components/workshop/town/components/TownCalloutLayer.vue +147 -147
  496. package/app/components/workshop/town/components/TownChannelDock.vue +116 -116
  497. package/app/components/workshop/town/components/TownControlDock.vue +405 -405
  498. package/app/components/workshop/town/components/TownDaqNodeInspector.vue +345 -345
  499. package/app/components/workshop/town/components/TownDaqTree.vue +366 -366
  500. package/app/components/workshop/town/components/TownDcwBindSection.vue +473 -473
  501. package/app/components/workshop/town/components/TownDcwNodeInspector.vue +185 -185
  502. package/app/components/workshop/town/components/TownDcwTree.vue +280 -280
  503. package/app/components/workshop/town/components/TownDeviceBindings.vue +394 -394
  504. package/app/components/workshop/town/components/TownDeviceTransform.vue +248 -248
  505. package/app/components/workshop/town/components/TownEventList.vue +120 -120
  506. package/app/components/workshop/town/components/TownHealthBody.vue +100 -100
  507. package/app/components/workshop/town/components/TownKpiStrip.vue +207 -207
  508. package/app/components/workshop/town/components/TownLeftRail.vue +308 -308
  509. package/app/components/workshop/town/components/TownLoadingMask.vue +61 -61
  510. package/app/components/workshop/town/components/TownNavMap.vue +154 -154
  511. package/app/components/workshop/town/components/TownRightRail.vue +543 -543
  512. package/app/components/workshop/town/components/TownStage.vue +281 -281
  513. package/app/components/workshop/town/components/TownStageTop.vue +238 -238
  514. package/app/components/workshop/town/components/TownStatusBar.vue +108 -108
  515. package/app/components/workshop/town/components/TownTopNav.vue +367 -367
  516. package/app/components/workshop/town/components/TownTrendDock.vue +178 -178
  517. package/app/components/workshop/town/scene/town-scene-agents.ts +254 -254
  518. package/app/components/workshop/town/scene/town-scene-behavior.ts +194 -194
  519. package/app/components/workshop/town/scene/town-scene-bubbles.ts +96 -96
  520. package/app/components/workshop/town/scene/town-scene-core.ts +158 -158
  521. package/app/components/workshop/town/scene/town-scene-models.ts +109 -109
  522. package/app/components/workshop/town/scene/town-scene-visuals.ts +279 -279
  523. package/app/components/workshop/town/scene/town-scene3d-agents.ts +308 -308
  524. package/app/components/workshop/town/scene/town-scene3d-blocks.ts +297 -297
  525. package/app/components/workshop/town/scene/town-scene3d-bubbles.ts +281 -281
  526. package/app/components/workshop/town/scene/town-scene3d-camera.ts +282 -282
  527. package/app/components/workshop/town/scene/town-scene3d-devices.ts +433 -433
  528. package/app/components/workshop/town/scene/town-scene3d-editing.ts +490 -490
  529. package/app/components/workshop/town/scene/town-scene3d-events.ts +173 -173
  530. package/app/components/workshop/town/scene/town-scene3d-factory.ts +412 -412
  531. package/app/components/workshop/town/scene/town-scene3d-hud.ts +110 -110
  532. package/app/components/workshop/town/scene/town-scene3d-lifecycle.ts +144 -144
  533. package/app/components/workshop/town/scene/town-scene3d-links.ts +141 -141
  534. package/app/components/workshop/town/scene/town-scene3d-loop.ts +286 -286
  535. package/app/components/workshop/town/scene/town-scene3d-models.ts +154 -154
  536. package/app/components/workshop/town/scene/town-scene3d-nodes.ts +562 -562
  537. package/app/components/workshop/town/scene/town-scene3d-ranges.ts +273 -273
  538. package/app/components/workshop/town/scene/town-scene3d-renderer.ts +320 -320
  539. package/app/components/workshop/town/scene/town-scene3d-selection.ts +257 -257
  540. package/app/components/workshop/town/scene/town-scene3d-types.ts +264 -264
  541. package/app/components/workshop/transcript/TranscriptBlockList.vue +68 -68
  542. package/app/components/workshop/transcript/TranscriptEarlierPager.vue +81 -81
  543. package/app/components/workshop/transcript/TranscriptFilterBar.vue +126 -126
  544. package/app/components/workshop/workbench/CreateWorkspaceModal.vue +36 -36
  545. package/app/components/workshop/workbench/WorkspaceEmpty.vue +56 -56
  546. package/app/composables/useResponsive.ts +88 -88
  547. package/app/composables/workshop/device-twin-types.ts +29 -29
  548. package/app/composables/workshop/event-blocks/attention.ts +58 -58
  549. package/app/composables/workshop/event-blocks/classify.ts +44 -44
  550. package/app/composables/workshop/event-blocks/clusterer.ts +231 -231
  551. package/app/composables/workshop/event-blocks/fold-stream.ts +45 -45
  552. package/app/composables/workshop/event-blocks/markdown.ts +81 -81
  553. package/app/composables/workshop/event-blocks/mentions.ts +49 -49
  554. package/app/composables/workshop/event-blocks/text-utils.ts +100 -100
  555. package/app/composables/workshop/event-blocks/types.ts +40 -40
  556. package/app/composables/workshop/town/town-relay-props.ts +231 -231
  557. package/app/composables/workshop/town/town-view-types.ts +145 -145
  558. package/app/composables/workshop/town/useTownAgentBindings.ts +182 -182
  559. package/app/composables/workshop/town/useTownAgentChat.ts +203 -203
  560. package/app/composables/workshop/town/useTownAlarms.ts +36 -36
  561. package/app/composables/workshop/town/useTownCallouts.ts +174 -174
  562. package/app/composables/workshop/town/useTownChannels.ts +220 -220
  563. package/app/composables/workshop/town/useTownHealth.ts +66 -66
  564. package/app/composables/workshop/town/useTownHudTickers.ts +77 -77
  565. package/app/composables/workshop/town/useTownLayout.ts +277 -277
  566. package/app/composables/workshop/town/useTownNavMap.ts +301 -301
  567. package/app/composables/workshop/town/useTownNodeBindings.ts +345 -345
  568. package/app/composables/workshop/town/useTownPanelDrag.ts +91 -91
  569. package/app/composables/workshop/town/useTownRailData.ts +421 -421
  570. package/app/composables/workshop/town/useTownSceneControl.ts +92 -92
  571. package/app/composables/workshop/town/useTownSceneInput.ts +275 -275
  572. package/app/composables/workshop/town/useTownSceneRuntime.ts +390 -390
  573. package/app/composables/workshop/town/useTownSheets.ts +41 -41
  574. package/app/composables/workshop/town/useTownTrends.ts +93 -93
  575. package/app/composables/workshop/useChannelList.ts +88 -88
  576. package/app/composables/workshop/useChannelTerminals.ts +65 -65
  577. package/app/composables/workshop/useComposerMentions.ts +130 -130
  578. package/app/composables/workshop/useDcwStream.ts +374 -374
  579. package/app/composables/workshop/useDeviceTwinDcwWrite.ts +77 -77
  580. package/app/composables/workshop/useDeviceTwinPanel.ts +56 -56
  581. package/app/composables/workshop/useEscClose.ts +44 -44
  582. package/app/composables/workshop/useEventBlockView.ts +159 -159
  583. package/app/composables/workshop/useEventBlocks.ts +33 -33
  584. package/app/composables/workshop/useHitlAnswer.ts +184 -184
  585. package/app/composables/workshop/useLaneWidths.ts +27 -27
  586. package/app/composables/workshop/useOmpTerminalSession.ts +424 -424
  587. package/app/composables/workshop/usePluginAdmin.ts +152 -152
  588. package/app/composables/workshop/usePluginPanels.ts +72 -72
  589. package/app/composables/workshop/useRuntimeConfigDraft.ts +118 -118
  590. package/app/composables/workshop/useSettingsGroups.ts +243 -243
  591. package/app/composables/workshop/useTaskBoardColumns.ts +47 -47
  592. package/app/composables/workshop/useTerminalRenderer.ts +308 -308
  593. package/app/composables/workshop/useTranscriptEnterStage.ts +48 -48
  594. package/app/composables/workshop/useTranscriptHistory.ts +52 -52
  595. package/app/composables/workshop/useTranscriptScroll.ts +113 -113
  596. package/app/composables/workshop/useVisibleInterval.ts +42 -42
  597. package/app/composables/workshop/useWorkshopWs.ts +265 -265
  598. package/app/config/index.ts +1 -1
  599. package/app/middleware/locale-cookie.global.ts +22 -22
  600. package/app/pages/aml/api.ts +6 -6
  601. package/app/pages/aml/composables/useAmlDatasets.ts +38 -38
  602. package/app/pages/aml/composables/useAmlEntities.ts +57 -57
  603. package/app/pages/aml/composables/useAmlEnv.ts +191 -191
  604. package/app/pages/aml/composables/useAmlExperiments.ts +45 -45
  605. package/app/pages/aml/composables/useAmlFormat.ts +44 -44
  606. package/app/pages/aml/composables/useAmlJobs.ts +131 -131
  607. package/app/pages/aml/composables/useAmlModels.ts +56 -56
  608. package/app/pages/aml/composables/useAmlNotes.ts +47 -47
  609. package/app/pages/aml/composables/useAmlPredict.ts +93 -93
  610. package/app/pages/aml/constants.ts +63 -63
  611. package/app/pages/aml/index.vue +236 -236
  612. package/app/pages/composables/useDashboardCharts.ts +192 -192
  613. package/app/pages/composables/useDashboardData.ts +144 -144
  614. package/app/pages/daq/composables/useDaqAddNode.ts +126 -126
  615. package/app/pages/daq/composables/useDaqDetailBinding.ts +29 -29
  616. package/app/pages/daq/composables/useDaqDetailFrames.ts +42 -42
  617. package/app/pages/daq/composables/useDaqDetailNode.ts +53 -53
  618. package/app/pages/daq/composables/useDaqDetailParams.ts +138 -138
  619. package/app/pages/daq/composables/useDaqFilters.ts +187 -187
  620. package/app/pages/daq/composables/useDaqNodeWindow.ts +86 -86
  621. package/app/pages/daq/composables/useDaqOptimizations.ts +99 -99
  622. package/app/pages/daq/composables/useDaqTemplates.ts +152 -152
  623. package/app/pages/daq/index.vue +260 -260
  624. package/app/pages/dcw/composables/useDcwCards.ts +27 -27
  625. package/app/pages/dcw/composables/useDcwDetailScope.ts +145 -145
  626. package/app/pages/dcw/composables/useDcwDetailTemplates.ts +94 -94
  627. package/app/pages/dcw/composables/useDcwFilter.ts +29 -29
  628. package/app/pages/dcw/composables/useDcwLedger.ts +34 -34
  629. package/app/pages/dcw/composables/useDcwLineMutations.ts +115 -115
  630. package/app/pages/dcw/composables/useDcwLineRun.ts +60 -60
  631. package/app/pages/dcw/composables/useDcwProducts.ts +54 -54
  632. package/app/pages/dcw/composables/useDcwQuery.ts +68 -68
  633. package/app/pages/dcw/composables/useDcwQuickActions.ts +47 -47
  634. package/app/pages/dcw/composables/useDcwRecipes.ts +256 -256
  635. package/app/pages/dcw/composables/useDcwTemplates.ts +50 -50
  636. package/app/pages/dcw/index.vue +195 -195
  637. package/app/pages/dcw/types.ts +9 -9
  638. package/app/pages/index.vue +126 -126
  639. package/app/pages/logs/composables/useLogsFormat.ts +43 -43
  640. package/app/pages/logs/composables/useLogsScope.ts +39 -39
  641. package/app/pages/monitor/types.ts +61 -61
  642. package/app/pages/operations.vue +61 -61
  643. package/app/pages/permissions/index.vue +369 -369
  644. package/app/pages/tokens/composables/useTokenClipboard.ts +33 -33
  645. package/app/pages/tokens/composables/useTokenCreate.ts +93 -93
  646. package/app/pages/tokens/composables/useTokenRename.ts +54 -54
  647. package/app/pages/tokens/composables/useTokenReveal.ts +84 -84
  648. package/app/pages/tokens/composables/useTokensList.ts +60 -60
  649. package/app/pages/tokens.vue +111 -111
  650. package/app/pages/tools/index.vue +98 -98
  651. package/app/pages/workshop/agents.vue +130 -130
  652. package/app/pages/workshop/composables/useAgentHarnessOptions.ts +59 -59
  653. package/app/pages/workshop/composables/useAgentTemplateActions.ts +42 -42
  654. package/app/pages/workshop/composables/useAgentTemplateDialogState.ts +24 -24
  655. package/app/pages/workshop/composables/useAgentTemplateForm.ts +88 -88
  656. package/app/pages/workshop/composables/useAgentTemplatesCatalog.ts +92 -92
  657. package/app/pages/workshop/composables/useTeamActions.ts +44 -44
  658. package/app/pages/workshop/composables/useTeamAddMemberDialog.ts +49 -49
  659. package/app/pages/workshop/composables/useTeamCreateDialog.ts +67 -67
  660. package/app/pages/workshop/composables/useTeamDeployDialog.ts +49 -49
  661. package/app/pages/workshop/composables/useTeamDialogState.ts +46 -46
  662. package/app/pages/workshop/composables/useTeamPluginDialog.ts +72 -72
  663. package/app/pages/workshop/composables/useTeamsCatalog.ts +100 -100
  664. package/app/pages/workshop/composables/useWorkbenchWorkspaces.ts +123 -123
  665. package/app/pages/workshop/composables/useWorkspaceAuth.ts +31 -31
  666. package/app/pages/workshop/composables/useWorkspaceChannels.ts +62 -62
  667. package/app/pages/workshop/composables/useWorkspaceShell.ts +136 -136
  668. package/app/pages/workshop/schedules.vue +553 -553
  669. package/app/pages/workshop/w/[wsId].vue +221 -221
  670. package/app/plugins/aw-plugins.client.ts +213 -213
  671. package/app/plugins/esc-close.client.ts +31 -31
  672. package/app/stores/workshop/hitl.ts +183 -183
  673. package/app/stores/workshop/narrow-fetch.ts +23 -23
  674. package/app/utils/api-error.ts +75 -75
  675. package/app/utils/builtin-catalog.ts +104 -104
  676. package/app/utils/chart-trend.ts +97 -97
  677. package/app/utils/dcw-driver-badge.ts +16 -16
  678. package/app/utils/dcw-recipe-form.ts +26 -26
  679. package/cli/commands/tui.mjs +28 -28
  680. package/cli/commands/update.mjs +124 -124
  681. package/cli/core/child-lifecycle.mjs +136 -136
  682. package/cli/core/meta.mjs +38 -38
  683. package/cli/core/post-build.mjs +96 -96
  684. package/config.yml +1 -1
  685. package/docs/cli.en.md +2 -2
  686. package/docs/cli.md +2 -2
  687. package/docs/mcp.en.md +27 -27
  688. package/docs/multi-harness-architecture.md +248 -248
  689. package/docs/plugins.en.md +1 -1
  690. package/docs/plugins.md +1 -1
  691. package/docs/sdk.en.md +1 -1
  692. package/docs/sdk.md +1 -1
  693. package/docs/tui.md +43 -43
  694. package/i18n/dicts/_en.json +1551 -1551
  695. package/i18n/dicts/_en2.json +300 -300
  696. package/i18n/dicts/_en4.json +114 -114
  697. package/i18n/dicts/agentLanesView.json +61 -61
  698. package/i18n/dicts/appHeader.json +17 -17
  699. package/i18n/dicts/channelSessionList.json +51 -51
  700. package/i18n/dicts/chat.json +79 -79
  701. package/i18n/dicts/clusterTool.json +4 -4
  702. package/i18n/dicts/composer.json +38 -38
  703. package/i18n/dicts/ctpl.json +37 -37
  704. package/i18n/dicts/dcwDetail.json +219 -219
  705. package/i18n/dicts/lineOps.json +14 -14
  706. package/i18n/dicts/multiChannelView.json +13 -13
  707. package/i18n/dicts/notifications.json +13 -13
  708. package/i18n/dicts/taskInspectorDrawer.json +25 -25
  709. package/i18n/dicts/teamPlugins.json +10 -10
  710. package/i18n/dicts/townView.json +209 -209
  711. package/mcp/discovery.mjs +227 -227
  712. package/package.json +1 -1
  713. package/public/favicon.svg +14 -14
  714. package/public/robots.txt +3 -3
  715. package/scripts/_audit/audit-harness-adapters.md +664 -664
  716. package/scripts/_audit/aw-mcp-live-e2e.mjs +293 -293
  717. package/scripts/_audit/bump-version.mjs +51 -51
  718. package/scripts/_audit/detached-instance.mjs +112 -112
  719. package/scripts/_audit/detached-start.mjs +103 -103
  720. package/scripts/_audit/eda-ui-fix-acceptance.mjs +212 -212
  721. package/scripts/_audit/guard-upstream-liveness.mjs +104 -104
  722. package/scripts/_audit/http-api-authz-audit.md +657 -657
  723. package/scripts/_audit/kb-team-mock-e2e.mjs +146 -146
  724. package/scripts/_audit/kb-team-omp-e2e.mjs +229 -229
  725. package/scripts/_audit/run.mjs +21 -21
  726. package/scripts/_audit/runtime-audit.md +716 -716
  727. package/scripts/_audit/skills-guided-e2e.mjs +316 -316
  728. package/scripts/_audit/stability-soak.mjs +252 -252
  729. package/scripts/_audit/stubs/nuxt-imports.mjs +67 -67
  730. package/scripts/_audit/ts-register-hook.mjs +12 -12
  731. package/scripts/_audit/ts-resolve-hook.mjs +96 -96
  732. package/scripts/_aw-packaged-start.cjs +22 -22
  733. package/scripts/_aw0746-stage12.mjs +94 -94
  734. package/scripts/_aw0746-stage34.mjs +136 -136
  735. package/scripts/_aw0746-stage6b-train-sweep.mjs +145 -145
  736. package/scripts/_aw0746-stage6c-jobsmoke.mjs +69 -69
  737. package/scripts/_dbg-configroot-audit.mjs +86 -86
  738. package/scripts/_dbg-daq-intervals-func.mjs +115 -115
  739. package/scripts/_dbg-perms-e2e.mjs +142 -142
  740. package/scripts/_dbg-protocol-matrix.mjs +462 -462
  741. package/scripts/_dbg-render-regression.mjs +193 -193
  742. package/scripts/_dbg-schedule-e2e.mjs +262 -262
  743. package/scripts/_e2e-ui-functional.mjs +371 -371
  744. package/scripts/_i18n-en-cjk-scan.mjs +28 -28
  745. package/scripts/_i18n-en-verify.mjs +107 -107
  746. package/scripts/_i18n-extra-checks.mjs +53 -53
  747. package/scripts/_i18n-scan-hardcoded.mjs +180 -180
  748. package/scripts/_lib-aml-python-run.mjs +17 -17
  749. package/scripts/_lint-reflow.mjs +105 -105
  750. package/scripts/_loop-biax-campaign.mjs +130 -130
  751. package/scripts/_plc-sim-detached.cjs +22 -22
  752. package/scripts/_probe-daq-omp-task.mjs +100 -100
  753. package/scripts/_probe-daq-scope-default.mjs +123 -123
  754. package/scripts/_probe-model-channel-link.cjs +25 -25
  755. package/scripts/_probe-recipe-switch.mjs +92 -92
  756. package/scripts/_provision-injection-line.mjs +39 -39
  757. package/scripts/_run-matrix.ps1 +53 -53
  758. package/scripts/_sweep-button-contrast.mjs +87 -87
  759. package/scripts/acceptance-aml-hybrid-e2e.ts +396 -396
  760. package/scripts/acceptance-aml-hybrid-live.mjs +93 -93
  761. package/scripts/acceptance-aml-model-identity.ts +137 -137
  762. package/scripts/agent-daq-isolation-e2e.mjs +91 -91
  763. package/scripts/api-contract-smoke.mjs +126 -126
  764. package/scripts/ask-hitl-e2e.mjs +96 -96
  765. package/scripts/aw-expose.mjs +159 -159
  766. package/scripts/channel-interaction-smoke.mjs +80 -80
  767. package/scripts/data-studio-ui-e2e.mjs +163 -163
  768. package/scripts/demo-group-chat-all-real.ts +279 -279
  769. package/scripts/demo-group-chat-omp-cases.ts +210 -210
  770. package/scripts/demo-group-chat-omp.ts +184 -184
  771. package/scripts/demo-group-chat-order.ts +197 -197
  772. package/scripts/dev-modbus-simulator.mjs +55 -55
  773. package/scripts/docs-shots.mjs +36 -36
  774. package/scripts/e2e-agentteam-chat.mjs +473 -473
  775. package/scripts/e2e-agentteam-real-triage.mjs +421 -421
  776. package/scripts/e2e-aml-decoupled.mjs +162 -162
  777. package/scripts/e2e-aw-tui-global.mjs +277 -277
  778. package/scripts/e2e-closedloop/cleanup.mjs +27 -27
  779. package/scripts/e2e-closedloop/lib.mjs +109 -109
  780. package/scripts/e2e-closedloop/main.mjs +59 -59
  781. package/scripts/e2e-closedloop/scenarios-accounts.mjs +210 -210
  782. package/scripts/e2e-closedloop/scenarios-authz.mjs +196 -196
  783. package/scripts/e2e-closedloop/scenarios-daq-dcw.mjs +222 -222
  784. package/scripts/e2e-closedloop/scenarios-plugins.mjs +169 -169
  785. package/scripts/e2e-closedloop/state.mjs +10 -10
  786. package/scripts/e2e-config-groups.mjs +238 -238
  787. package/scripts/e2e-crash-cycle.mjs +108 -108
  788. package/scripts/e2e-full-closedloop.mjs +16 -16
  789. package/scripts/e2e-hil-multi-user.mjs +307 -307
  790. package/scripts/e2e-hil-restart.mjs +339 -339
  791. package/scripts/e2e-idd-results-ui.mjs +175 -0
  792. package/scripts/e2e-idd-results.mjs +48 -16
  793. package/scripts/e2e-injection-recipe-closedloop.mjs +203 -203
  794. package/scripts/e2e-line-governance.mjs +352 -352
  795. package/scripts/e2e-ontology.mjs +393 -393
  796. package/scripts/e2e-plc-plugin-closedloop.mjs +549 -549
  797. package/scripts/e2e-timezone-settings.mjs +57 -57
  798. package/scripts/full-stack-shots.mjs +145 -145
  799. package/scripts/full-tool-injection-harness-e2e.mjs +214 -214
  800. package/scripts/hitl-reject-e2e.mjs +131 -131
  801. package/scripts/line-log-smoke.mjs +260 -260
  802. package/scripts/live-aml-mockomp.mjs +304 -304
  803. package/scripts/live-aml-optloop-resume.mjs +322 -322
  804. package/scripts/live-aml-optloop.mjs +588 -588
  805. package/scripts/live-aml-stage9.mjs +169 -169
  806. package/scripts/live-aml-two-goals.mjs +315 -315
  807. package/scripts/live-optloop-two-modes.mjs +857 -857
  808. package/scripts/mes-agent-integration-e2e.mjs +361 -361
  809. package/scripts/ops-plugins-e2e.mjs +85 -85
  810. package/scripts/proof-omp-real.ts +189 -189
  811. package/scripts/scenario-suite-setup.mjs +337 -337
  812. package/scripts/scenario-suite-stability.mjs +144 -144
  813. package/scripts/smoke-optimization-verify.ts +72 -72
  814. package/scripts/team-coordination-e2e.mjs +96 -96
  815. package/scripts/test-agentteam-task-chat-flow.ts +420 -420
  816. package/scripts/test-agentteam-workflow.ts +472 -472
  817. package/scripts/test-aw-skills.mjs +102 -102
  818. package/scripts/test-cli-exit.mjs +343 -343
  819. package/scripts/test-daq-frame-race.mjs +358 -358
  820. package/scripts/test-data-root.mjs +208 -208
  821. package/scripts/test-events-index.mjs +176 -176
  822. package/scripts/test-group-chat-hardening.ts +265 -265
  823. package/scripts/test-group-chat-unit/lib.ts +186 -186
  824. package/scripts/test-group-chat-unit/main.ts +45 -45
  825. package/scripts/test-group-chat-unit/section-a-migration.ts +75 -75
  826. package/scripts/test-group-chat-unit/section-b-permission-matrix.ts +88 -88
  827. package/scripts/test-group-chat-unit/section-c-member-lifecycle.ts +64 -64
  828. package/scripts/test-group-chat-unit/section-d-mention-resolution.ts +36 -36
  829. package/scripts/test-group-chat-unit/section-e-chat-facts.ts +97 -97
  830. package/scripts/test-group-chat-unit/section-f-user-notifications.ts +52 -52
  831. package/scripts/test-group-chat-unit/section-g-member-projection.ts +44 -44
  832. package/scripts/test-group-chat-unit/section-h-outbox-consistency.ts +30 -30
  833. package/scripts/test-group-chat-unit/section-i-read-idempotency.ts +24 -24
  834. package/scripts/test-group-chat-unit/section-j-permission-scope.ts +150 -150
  835. package/scripts/test-group-chat-unit.ts +35 -35
  836. package/scripts/test-hitl-decision.ts +526 -526
  837. package/scripts/test-hitl-legacy-channel-auth.ts +143 -143
  838. package/scripts/test-hitl-registry.ts +112 -112
  839. package/scripts/test-log-flooding.mjs +160 -160
  840. package/scripts/test-lru.mjs +101 -101
  841. package/scripts/test-memory-month-query.mjs +70 -70
  842. package/scripts/test-plugin-hardening.mjs +90 -90
  843. package/scripts/test-plugin-lifecycle.mjs +173 -173
  844. package/scripts/test-rollback-index.mjs +137 -137
  845. package/scripts/test-schedule-runtime.ts +309 -309
  846. package/scripts/test-scheduler-loop/scenarios-supervise.ts +25 -25
  847. package/scripts/test-sdk-surface.mjs +158 -158
  848. package/scripts/test-serial-bridge.mjs +418 -418
  849. package/scripts/test-tui-commands.mjs +148 -148
  850. package/scripts/test-tui-reducers.mjs +72 -72
  851. package/scripts/three-system-e2e/lib.mjs +79 -79
  852. package/scripts/three-system-e2e/main.mjs +40 -40
  853. package/scripts/three-system-e2e/phases/phase-0-user-token.mjs +42 -42
  854. package/scripts/three-system-e2e/phases/phase-0a2-line-autoselect.mjs +35 -35
  855. package/scripts/three-system-e2e/phases/phase-0b-fixture-grants.mjs +39 -39
  856. package/scripts/three-system-e2e/phases/phase-0c-plugin-outbound-auth.mjs +95 -95
  857. package/scripts/three-system-e2e/phases/stage-1-health.mjs +47 -47
  858. package/scripts/three-system-e2e/phases/stage-2-5-team-plugins.mjs +84 -84
  859. package/scripts/three-system-e2e/phases/stage-2-teams-tools-hitl.mjs +184 -184
  860. package/scripts/three-system-e2e/phases/stage-3-diag.mjs +73 -73
  861. package/scripts/three-system-e2e/phases/stage-4-plugin-toggle.mjs +53 -53
  862. package/scripts/three-system-e2e/state.mjs +87 -87
  863. package/scripts/three-system-e2e.mjs +40 -40
  864. package/scripts/tool-face-batch-identity-e2e.mjs +222 -222
  865. package/scripts/tsconfig.json +14 -14
  866. package/scripts/tui-smoke.mjs +100 -100
  867. package/scripts/typecheck.mjs +75 -75
  868. package/scripts/ui/admin-shots.mjs +46 -46
  869. package/scripts/ui/bump-microfont.mjs +39 -39
  870. package/scripts/ui/linkcheck2.mjs +37 -37
  871. package/scripts/ui/live-render-check.mjs +72 -72
  872. package/scripts/ui/md-lint.mjs +80 -80
  873. package/scripts/ui/perf-audit.mjs +132 -132
  874. package/scripts/ui/readme-assets.mjs +30 -30
  875. package/scripts/ui/readme-shots.mjs +42 -42
  876. package/scripts/ui/record-demo.mjs +557 -557
  877. package/scripts/ui/record.mjs +225 -225
  878. package/scripts/ui/seed-admin.mjs +68 -68
  879. package/scripts/ui/seed-demo.mjs +83 -83
  880. package/scripts/ui/seed-industrial-demo.mjs +171 -171
  881. package/scripts/ui/shot-hero.mjs +25 -25
  882. package/scripts/ui/shots.mjs +75 -75
  883. package/scripts/ui/sim-ui-shot.mjs +16 -16
  884. package/scripts/ui/smoke-refactor.mjs +258 -258
  885. package/scripts/ui/verify-nav.mjs +51 -51
  886. package/scripts/ui/verify-responsive.mjs +285 -285
  887. package/sdk/client.d.mts +110 -110
  888. package/sdk/examples/line-sentinel/index.mjs +105 -105
  889. package/sdk/examples/ops-notifier/index.mjs +34 -34
  890. package/sdk/examples/sample-insight/index.mjs +39 -39
  891. package/server/api/plugins/[name]/[...path].ts +5 -1
  892. package/server/api/plugins/client/[name].get.ts +18 -18
  893. package/server/api/plugins/i18n.get.ts +12 -12
  894. package/server/api/plugins/manifest.get.ts +10 -10
  895. package/server/api/system/backup/list.get.ts +32 -32
  896. package/server/api/system/backup/run.post.ts +21 -21
  897. package/server/api/system/config-groups/[id].delete.ts +21 -21
  898. package/server/api/system/config-groups/[id].patch.ts +26 -26
  899. package/server/api/system/config-groups/index.get.ts +21 -21
  900. package/server/api/system/config-groups/index.post.ts +33 -33
  901. package/server/api/system/timezone.get.ts +20 -20
  902. package/server/api/users/tokens/[id]/token.get.ts +11 -11
  903. package/server/api/workshop/[...path].ts +13 -13
  904. package/server/api/workshop/agent-tools/approvals/index.get.ts +43 -43
  905. package/server/api/workshop/agent-tools/bindings/[id].delete.ts +26 -26
  906. package/server/api/workshop/agent-tools/bindings/grant.post.ts +45 -45
  907. package/server/api/workshop/agent-tools/bindings/index.get.ts +41 -41
  908. package/server/api/workshop/agent-tools/bindings/revoke.post.ts +42 -42
  909. package/server/api/workshop/aml/datasets/[id]/preview.get.ts +68 -68
  910. package/server/api/workshop/aml/datasets/[id].delete.ts +39 -39
  911. package/server/api/workshop/aml/datasets/[id].get.ts +53 -53
  912. package/server/api/workshop/aml/datasets/[id].patch.ts +30 -30
  913. package/server/api/workshop/aml/datasets/index.get.ts +20 -20
  914. package/server/api/workshop/aml/datasets/index.post.ts +27 -27
  915. package/server/api/workshop/aml/entities/index.get.ts +13 -13
  916. package/server/api/workshop/aml/entities/prune.post.ts +28 -28
  917. package/server/api/workshop/aml/env/index.get.ts +13 -13
  918. package/server/api/workshop/aml/env/recheck.post.ts +14 -14
  919. package/server/api/workshop/aml/env/uv.post.ts +21 -21
  920. package/server/api/workshop/aml/env/venv.post.ts +24 -24
  921. package/server/api/workshop/aml/experiments/index.get.ts +35 -35
  922. package/server/api/workshop/aml/index.get.ts +37 -37
  923. package/server/api/workshop/aml/jobs/[id]/cancel.post.ts +21 -21
  924. package/server/api/workshop/aml/jobs/[id]/logs.get.ts +23 -23
  925. package/server/api/workshop/aml/jobs/[id]/retry.post.ts +20 -20
  926. package/server/api/workshop/aml/jobs/[id].delete.ts +44 -44
  927. package/server/api/workshop/aml/jobs/[id].get.ts +23 -23
  928. package/server/api/workshop/aml/jobs/index.get.ts +26 -26
  929. package/server/api/workshop/aml/models/[id]/predict.post.ts +24 -24
  930. package/server/api/workshop/aml/models/[id]/promote.post.ts +30 -30
  931. package/server/api/workshop/aml/models/index.get.ts +48 -48
  932. package/server/api/workshop/aml/training-plans/[id]/train.post.ts +18 -18
  933. package/server/api/workshop/aml/training-plans/[id].delete.ts +18 -18
  934. package/server/api/workshop/aml/training-plans/[id].patch.ts +30 -30
  935. package/server/api/workshop/aml/training-plans/index.get.ts +9 -9
  936. package/server/api/workshop/aml/training-plans/index.post.ts +43 -43
  937. package/server/api/workshop/approvals/[id]/decide.post.ts +30 -30
  938. package/server/api/workshop/approvals/index.get.ts +22 -22
  939. package/server/api/workshop/audit.get.ts +43 -43
  940. package/server/api/workshop/channels/[id]/chat/messages/[messageId]/read.post.ts +22 -22
  941. package/server/api/workshop/channels/[id]/chat/messages/index.get.ts +29 -29
  942. package/server/api/workshop/channels/[id]/chat/messages/index.post.ts +51 -51
  943. package/server/api/workshop/channels/[id]/chat/permissions.get.ts +35 -35
  944. package/server/api/workshop/channels/[id]/index.patch.ts +64 -64
  945. package/server/api/workshop/channels/[id]/members/[userId]/approve.post.ts +20 -20
  946. package/server/api/workshop/channels/[id]/members/[userId].delete.ts +21 -21
  947. package/server/api/workshop/channels/[id]/members/index.get.ts +23 -23
  948. package/server/api/workshop/channels/[id]/members/leave.post.ts +20 -20
  949. package/server/api/workshop/channels/[id]/twin-profile.get.ts +45 -45
  950. package/server/api/workshop/channels/[id]/twin-profile.patch.ts +72 -72
  951. package/server/api/workshop/daq/[id]/test.post.ts +1 -1
  952. package/server/api/workshop/daq/alarms.get.ts +16 -16
  953. package/server/api/workshop/dcw/[id]/write.post.ts +4 -4
  954. package/server/api/workshop/dcw/[id].delete.ts +41 -41
  955. package/server/api/workshop/dcw/[id].patch.ts +40 -40
  956. package/server/api/workshop/dcw/mes-test-read.post.ts +24 -24
  957. package/server/api/workshop/dcw/params/[id]/read.post.ts +17 -17
  958. package/server/api/workshop/dcw/params/[id]/write.post.ts +21 -21
  959. package/server/api/workshop/dcw/params/[id].delete.ts +19 -19
  960. package/server/api/workshop/dcw/params/[id].patch.ts +23 -23
  961. package/server/api/workshop/dcw/params/index.get.ts +27 -27
  962. package/server/api/workshop/dcw/params/index.post.ts +25 -25
  963. package/server/api/workshop/dcw/products/[id].delete.ts +16 -16
  964. package/server/api/workshop/dcw/products/[id].patch.ts +17 -17
  965. package/server/api/workshop/dcw/recipes/[id]/index.patch.ts +22 -22
  966. package/server/api/workshop/dcw/recipes/[id]/versions.get.ts +14 -14
  967. package/server/api/workshop/dcw/recipes/[id].delete.ts +25 -25
  968. package/server/api/workshop/dcw/recipes/index.get.ts +12 -12
  969. package/server/api/workshop/dcw/runs/[id]/close.post.ts +15 -15
  970. package/server/api/workshop/dcw/templates/[key].delete.ts +14 -14
  971. package/server/api/workshop/dcw/templates/[key].patch.ts +16 -16
  972. package/server/api/workshop/dcw/templates/index.post.ts +15 -15
  973. package/server/api/workshop/dcw/test-driver.post.ts +16 -16
  974. package/server/api/workshop/device-twins/[id].delete.ts +25 -25
  975. package/server/api/workshop/eda/runs/[id]/labels.patch.ts +25 -25
  976. package/server/api/workshop/exp/confirmations/[id]/decide.post.ts +41 -41
  977. package/server/api/workshop/exp/confirmations/index.get.ts +25 -25
  978. package/server/api/workshop/harnesses/[id]/providers.get.ts +16 -16
  979. package/server/api/workshop/hitl/respond.post.ts +94 -94
  980. package/server/api/workshop/notifications/index.get.ts +60 -60
  981. package/server/api/workshop/notifications/read.post.ts +31 -31
  982. package/server/api/workshop/ontology/drafts/[draftId]/subgraph.ts +24 -24
  983. package/server/api/workshop/plugins/[name]/disable.post.ts +21 -21
  984. package/server/api/workshop/plugins/[name]/enable.post.ts +21 -21
  985. package/server/api/workshop/plugins/[name]/index.get.ts +14 -14
  986. package/server/api/workshop/schedules/[id]/run.post.ts +15 -15
  987. package/server/api/workshop/schedules/[id]/runs.get.ts +15 -15
  988. package/server/api/workshop/schedules/[id].delete.ts +14 -14
  989. package/server/api/workshop/schedules/[id].get.ts +13 -13
  990. package/server/api/workshop/schedules/[id].patch.ts +29 -29
  991. package/server/api/workshop/schedules/index.get.ts +12 -12
  992. package/server/api/workshop/schedules/index.post.ts +32 -32
  993. package/server/api/workshop/tasks/[id]/reassign.post.ts +32 -32
  994. package/server/api/workshop/tasks/[id]/update.post.ts +35 -35
  995. package/server/api/workshop/teams/[id]/plugins/index.get.ts +36 -36
  996. package/server/api/workshop/teams/[id]/plugins/index.put.ts +42 -42
  997. package/server/api/workshop/ws/audience.ts +56 -56
  998. package/server/api/workshop/ws/db-buffer.ts +68 -68
  999. package/server/api/workshop/ws/event-mapping.ts +47 -47
  1000. package/server/api/workshop/ws/handlers.ts +132 -132
  1001. package/server/api/workshop/ws/hub.ts +133 -133
  1002. package/server/api/workshop/ws/index.ts +23 -23
  1003. package/server/api/workshop/ws/notification-uplink.ts +77 -77
  1004. package/server/api/workshop/ws/shared.ts +94 -94
  1005. package/server/api/workshop/ws/streams.ts +146 -146
  1006. package/server/middleware/00-security-headers.ts +38 -38
  1007. package/server/middleware/01-rate-guard.ts +101 -101
  1008. package/server/plugins/aml-twin-worker.ts +32 -32
  1009. package/server/plugins/dev-stability-guard.ts +42 -42
  1010. package/server/plugins-builtin/diag-bridge/client.mjs +32 -12
  1011. package/server/plugins-builtin/diag-bridge/host/constants.mjs +25 -25
  1012. package/server/plugins-builtin/diag-bridge/host/exports.mjs +104 -104
  1013. package/server/plugins-builtin/diag-bridge/host/helpers.mjs +39 -9
  1014. package/server/plugins-builtin/diag-bridge/host/index.mjs +15 -15
  1015. package/server/plugins-builtin/diag-bridge/host/intents.mjs +62 -62
  1016. package/server/plugins-builtin/diag-bridge/host/plugin.mjs +60 -26
  1017. package/server/plugins-builtin/diag-bridge/host/snapshot.mjs +93 -93
  1018. package/server/plugins-builtin/diag-bridge/index.mjs +9 -9
  1019. package/server/plugins-builtin/serial-bridge/client.mjs +211 -211
  1020. package/server/plugins-builtin/serial-bridge/drivers.mjs +409 -409
  1021. package/server/plugins-builtin/serial-bridge/i18n.json +62 -62
  1022. package/server/plugins-builtin/serial-bridge/index.mjs +247 -247
  1023. package/server/plugins-builtin/serial-bridge/lib.mjs +208 -208
  1024. package/server/plugins-builtin/serial-bridge/rtu.mjs +168 -168
  1025. package/server/services/system-config/contracts.ts +29 -29
  1026. package/server/services/system-config/dispose.ts +19 -19
  1027. package/server/services/system-config/facade.ts +26 -26
  1028. package/server/services/system-config/groups.ts +108 -108
  1029. package/server/services/system-config/index.ts +21 -21
  1030. package/server/services/system-config/init.ts +26 -26
  1031. package/server/services/system-config/mutate.ts +103 -103
  1032. package/server/services/system-config/plugins.ts +104 -104
  1033. package/server/services/system-config/snapshot.ts +59 -59
  1034. package/server/services/system-config/state.ts +79 -79
  1035. package/server/services/system-config/types.ts +58 -58
  1036. package/server/services/workshop/agents/adapters/omp-rpc-client/api.ts +111 -111
  1037. package/server/services/workshop/agents/adapters/omp-rpc-client/contracts.ts +22 -22
  1038. package/server/services/workshop/agents/adapters/omp-rpc-client/facade.ts +7 -7
  1039. package/server/services/workshop/agents/adapters/omp-rpc-client/frames.ts +0 -18
  1040. package/server/services/workshop/agents/adapters/omp-rpc-client/helpers.ts +38 -38
  1041. package/server/services/workshop/agents/adapters/omp-rpc-client/index.ts +25 -25
  1042. package/server/services/workshop/agents/adapters/omp-rpc-client/start.ts +70 -70
  1043. package/server/services/workshop/agents/adapters/omp-rpc-client/state.ts +65 -65
  1044. package/server/services/workshop/agents/adapters/omp-rpc-client/stdout.ts +92 -92
  1045. package/server/services/workshop/agents/adapters/omp-rpc-client/usage.ts +47 -47
  1046. package/server/services/workshop/agents/agent-badge.ts +38 -38
  1047. package/server/services/workshop/agents/binding-authz.ts +60 -60
  1048. package/server/services/workshop/agents/binding-mode.ts +51 -51
  1049. package/server/services/workshop/agents/codex-agent/client.ts +170 -170
  1050. package/server/services/workshop/agents/codex-agent/core.ts +119 -119
  1051. package/server/services/workshop/agents/codex-agent/facade.ts +8 -8
  1052. package/server/services/workshop/agents/codex-agent/helpers.ts +13 -13
  1053. package/server/services/workshop/agents/codex-agent/hitl.ts +138 -138
  1054. package/server/services/workshop/agents/codex-agent/index.ts +14 -14
  1055. package/server/services/workshop/agents/codex-agent/turn.ts +367 -367
  1056. package/server/services/workshop/agents/codex-agent/types.ts +42 -42
  1057. package/server/services/workshop/agents/harness-process.ts +3 -3
  1058. package/server/services/workshop/agents/harness-terminal/api.ts +197 -197
  1059. package/server/services/workshop/agents/harness-terminal/index.ts +17 -17
  1060. package/server/services/workshop/agents/harness-terminal/io.ts +120 -120
  1061. package/server/services/workshop/agents/harness-terminal/park.ts +55 -55
  1062. package/server/services/workshop/agents/harness-terminal/sanitize.ts +98 -98
  1063. package/server/services/workshop/agents/harness-terminal/session.ts +124 -124
  1064. package/server/services/workshop/agents/harness-terminal/shared.ts +74 -74
  1065. package/server/services/workshop/agents/hitl-capabilities.ts +312 -312
  1066. package/server/services/workshop/agents/hitl-decision/answers.ts +32 -32
  1067. package/server/services/workshop/agents/hitl-decision/decide.ts +268 -268
  1068. package/server/services/workshop/agents/hitl-decision/payload.ts +45 -45
  1069. package/server/services/workshop/agents/hitl-decision/shared.ts +108 -108
  1070. package/server/services/workshop/agents/hitl-decision/visibility.ts +94 -94
  1071. package/server/services/workshop/agents/host-tool-bridge/tools/progress.ts +84 -84
  1072. package/server/services/workshop/agents/host-tool-bridge/tools/team-delegation.ts +104 -104
  1073. package/server/services/workshop/agents/host-tool-bridge/tools/team.ts +70 -70
  1074. package/server/services/workshop/agents/industrial/aml-activity.ts +131 -131
  1075. package/server/services/workshop/agents/industrial/audit-query.ts +66 -66
  1076. package/server/services/workshop/agents/industrial/daq-tools.ts +352 -352
  1077. package/server/services/workshop/agents/industrial/exp-tools.ts +104 -104
  1078. package/server/services/workshop/agents/industrial/ops-tools.ts +16 -54
  1079. package/server/services/workshop/agents/industrial/param-tools.ts +69 -69
  1080. package/server/services/workshop/agents/industrial/recipe-gate.ts +6 -19
  1081. package/server/services/workshop/agents/industrial/recipe-propose-tools.ts +1 -1
  1082. package/server/services/workshop/agents/node-bindings.repo.ts +207 -207
  1083. package/server/services/workshop/agents/node-delegation.ts +159 -159
  1084. package/server/services/workshop/agents/omp-agent/core.ts +146 -146
  1085. package/server/services/workshop/agents/omp-agent/facade.ts +8 -8
  1086. package/server/services/workshop/agents/omp-agent/helpers.ts +37 -37
  1087. package/server/services/workshop/agents/omp-agent/index.ts +16 -16
  1088. package/server/services/workshop/agents/omp-agent/tools-steer.ts +1 -18
  1089. package/server/services/workshop/agents/omp-agent/types.ts +45 -45
  1090. package/server/services/workshop/agents/opencode-agent/core.ts +77 -77
  1091. package/server/services/workshop/agents/opencode-agent/facade.ts +8 -8
  1092. package/server/services/workshop/agents/opencode-agent/helpers.ts +29 -29
  1093. package/server/services/workshop/agents/opencode-agent/hitl.ts +113 -113
  1094. package/server/services/workshop/agents/opencode-agent/index.ts +16 -16
  1095. package/server/services/workshop/agents/opencode-agent/lifecycle.ts +44 -44
  1096. package/server/services/workshop/agents/opencode-agent/server.ts +244 -244
  1097. package/server/services/workshop/agents/opencode-agent/turn.ts +278 -278
  1098. package/server/services/workshop/agents/opencode-agent/types.ts +54 -54
  1099. package/server/services/workshop/agents/tool-classes.ts +44 -44
  1100. package/server/services/workshop/aml/clean.ts +120 -120
  1101. package/server/services/workshop/aml/entity.ts +367 -367
  1102. package/server/services/workshop/aml/job-orchestrator/broadcast.ts +37 -37
  1103. package/server/services/workshop/aml/job-orchestrator/control.ts +94 -94
  1104. package/server/services/workshop/aml/job-orchestrator/failure.ts +96 -96
  1105. package/server/services/workshop/aml/job-orchestrator/index.ts +22 -22
  1106. package/server/services/workshop/aml/job-orchestrator/process.ts +101 -101
  1107. package/server/services/workshop/aml/job-orchestrator/shared.ts +53 -53
  1108. package/server/services/workshop/aml/job-orchestrator/status.ts +20 -20
  1109. package/server/services/workshop/aml/job-orchestrator/tick.ts +37 -37
  1110. package/server/services/workshop/aml/python/train-example.py +92 -92
  1111. package/server/services/workshop/aml/runtime.ts +137 -137
  1112. package/server/services/workshop/aml/stats.ts +140 -140
  1113. package/server/services/workshop/aml/twin/calibration-worker.ts +150 -150
  1114. package/server/services/workshop/aml/twin/model-backed-provider.ts +332 -332
  1115. package/server/services/workshop/aml/twin/physics-spec-draft.ts +185 -185
  1116. package/server/services/workshop/aml/twin/prompt-composer.ts +143 -143
  1117. package/server/services/workshop/aml/twin/training-plans.ts +260 -260
  1118. package/server/services/workshop/aml/twin/write-guard.ts +19 -19
  1119. package/server/services/workshop/assets/character-asset.repo.ts +1 -1
  1120. package/server/services/workshop/assets/device-twin.repo.ts +1 -1
  1121. package/server/services/workshop/daq/bus/index.ts +5 -12
  1122. package/server/services/workshop/daq/daq-controller/contracts.ts +39 -39
  1123. package/server/services/workshop/daq/daq-controller/facade.ts +28 -28
  1124. package/server/services/workshop/daq/daq-controller/frames.ts +137 -137
  1125. package/server/services/workshop/daq/daq-controller/helpers.ts +52 -52
  1126. package/server/services/workshop/daq/daq-controller/index.ts +22 -22
  1127. package/server/services/workshop/daq/daq-controller/runtime-control.ts +72 -72
  1128. package/server/services/workshop/daq/daq-controller/sweep-alarms.ts +176 -176
  1129. package/server/services/workshop/daq/daq-controller/tsdb-twin.ts +138 -138
  1130. package/server/services/workshop/daq/drivers/http.ts +95 -95
  1131. package/server/services/workshop/daq/drivers/mock.ts +130 -130
  1132. package/server/services/workshop/daq/drivers/modbus-rtu.ts +67 -67
  1133. package/server/services/workshop/daq/drivers/modbus-tcp.ts +307 -307
  1134. package/server/services/workshop/daq/drivers/opcua.ts +227 -227
  1135. package/server/services/workshop/daq/drivers/s7-stub.ts +29 -29
  1136. package/server/services/workshop/daq/host-bindings.ts +71 -71
  1137. package/server/services/workshop/daq/host-ports.ts +65 -65
  1138. package/server/services/workshop/db/aml-team-seeds.ts +118 -118
  1139. package/server/services/workshop/db/backup-registry.ts +33 -33
  1140. package/server/services/workshop/db/channel-member.repo.ts +122 -122
  1141. package/server/services/workshop/db/channel.repo.ts +203 -203
  1142. package/server/services/workshop/db/chat-message.repo.ts +233 -233
  1143. package/server/services/workshop/db/database/index.ts +18 -18
  1144. package/server/services/workshop/db/database/json.ts +14 -14
  1145. package/server/services/workshop/db/database/open.ts +97 -97
  1146. package/server/services/workshop/db/database/seed-data.ts +60 -60
  1147. package/server/services/workshop/db/hitl-request.repo.ts +221 -221
  1148. package/server/services/workshop/db/notification.repo.ts +199 -199
  1149. package/server/services/workshop/db/readonly.ts +30 -30
  1150. package/server/services/workshop/db/scheduled-task.repo.ts +235 -235
  1151. package/server/services/workshop/db/transaction.ts +72 -72
  1152. package/server/services/workshop/dcw/dcw-controller/contracts.ts +16 -16
  1153. package/server/services/workshop/dcw/dcw-controller/control.ts +78 -78
  1154. package/server/services/workshop/dcw/dcw-controller/facade.ts +19 -19
  1155. package/server/services/workshop/dcw/dcw-controller/index.ts +22 -22
  1156. package/server/services/workshop/dcw/dcw-controller/params.ts +97 -97
  1157. package/server/services/workshop/dcw/dcw-controller/products.ts +103 -103
  1158. package/server/services/workshop/dcw/dcw-controller/write-audit.ts +49 -49
  1159. package/server/services/workshop/dcw/dcw-templates.ts +136 -136
  1160. package/server/services/workshop/dcw/param-conversion.ts +78 -78
  1161. package/server/services/workshop/dcw/param-map.repo.ts +349 -349
  1162. package/server/services/workshop/dcw/plugin-bridge.ts +45 -45
  1163. package/server/services/workshop/dcw/recipe-rollback-manager/contracts.ts +26 -26
  1164. package/server/services/workshop/dcw/recipe-rollback-manager/facade.ts +13 -13
  1165. package/server/services/workshop/dcw/recipe-rollback-manager/helpers.ts +30 -30
  1166. package/server/services/workshop/dcw/recipe-rollback-manager/index.ts +17 -17
  1167. package/server/services/workshop/dcw/recipe-rollback-manager/internal.ts +33 -33
  1168. package/server/services/workshop/dcw/recipe-rollback-manager/judge.ts +52 -52
  1169. package/server/services/workshop/dcw/recipe-rollback-manager/lock.ts +137 -137
  1170. package/server/services/workshop/dcw/recipe-rollback-manager/rollback.ts +190 -190
  1171. package/server/services/workshop/dcw/recipe-rollback-manager/state.ts +21 -21
  1172. package/server/services/workshop/dcw/recipe-rollback-manager/sweep.ts +77 -77
  1173. package/server/services/workshop/dcw/recipe-rollback-manager/types.ts +3 -3
  1174. package/server/services/workshop/dcw/recipe-rollback-manager/views.ts +214 -214
  1175. package/server/services/workshop/exp/exp-collector.ts +275 -275
  1176. package/server/services/workshop/exp/exp-state.repo.ts +339 -339
  1177. package/server/services/workshop/mes/mes-controller.ts +1155 -1155
  1178. package/server/services/workshop/mes/mes-hook.ts +567 -567
  1179. package/server/services/workshop/ontology/subgraph.core.ts +300 -300
  1180. package/server/services/workshop/ontology/subgraph.service.ts +113 -113
  1181. package/server/services/workshop/plugins/host/api.mjs +90 -90
  1182. package/server/services/workshop/plugins/host/config.mjs +135 -135
  1183. package/server/services/workshop/plugins/host/index.mjs +23 -23
  1184. package/server/services/workshop/plugins/host/init.mjs +109 -109
  1185. package/server/services/workshop/plugins/host/load.mjs +321 -321
  1186. package/server/services/workshop/plugins/host/reload.mjs +94 -94
  1187. package/server/services/workshop/plugins/host/rollback.mjs +72 -72
  1188. package/server/services/workshop/plugins/host/state.mjs +54 -54
  1189. package/server/services/workshop/plugins/host/toggle.mjs +64 -64
  1190. package/server/services/workshop/plugins/host.mjs +9 -9
  1191. package/server/services/workshop/runtime/agent-runtime/facade.ts +7 -7
  1192. package/server/services/workshop/runtime/agent-runtime/helpers.ts +18 -18
  1193. package/server/services/workshop/runtime/agent-runtime/index.ts +19 -19
  1194. package/server/services/workshop/runtime/agent-runtime/lifecycle.ts +137 -137
  1195. package/server/services/workshop/runtime/chat-mention.ts +164 -164
  1196. package/server/services/workshop/runtime/chat-projection.ts +246 -246
  1197. package/server/services/workshop/runtime/manager/admin-agents.ts +268 -268
  1198. package/server/services/workshop/runtime/manager/bus.ts +182 -182
  1199. package/server/services/workshop/runtime/manager/channel-template-constants.ts +20 -20
  1200. package/server/services/workshop/runtime/manager/chat-reply.ts +181 -181
  1201. package/server/services/workshop/runtime/manager/chat.ts +384 -384
  1202. package/server/services/workshop/runtime/manager/facade.ts +24 -24
  1203. package/server/services/workshop/runtime/manager/helpers.ts +119 -119
  1204. package/server/services/workshop/runtime/manager/index.ts +42 -42
  1205. package/server/services/workshop/runtime/manager/internal.ts +73 -73
  1206. package/server/services/workshop/runtime/manager/notifications.ts +108 -108
  1207. package/server/services/workshop/runtime/manager/teams.ts +148 -148
  1208. package/server/services/workshop/runtime/memory/contracts.ts +18 -18
  1209. package/server/services/workshop/runtime/memory/facade.ts +10 -10
  1210. package/server/services/workshop/runtime/memory/helpers.ts +196 -196
  1211. package/server/services/workshop/runtime/memory/index.ts +27 -27
  1212. package/server/services/workshop/runtime/memory/score.ts +33 -33
  1213. package/server/services/workshop/runtime/memory/state.ts +40 -40
  1214. package/server/services/workshop/runtime/monitor.ts +3 -3
  1215. package/server/services/workshop/runtime/platform-notice.ts +113 -113
  1216. package/server/services/workshop/runtime/schedule-runtime.ts +347 -347
  1217. package/server/services/workshop/runtime/scheduler-loop/contracts.ts +29 -29
  1218. package/server/services/workshop/runtime/scheduler-loop/facade.ts +7 -7
  1219. package/server/services/workshop/runtime/scheduler-loop/helpers.ts +14 -14
  1220. package/server/services/workshop/runtime/scheduler-loop/index.ts +16 -16
  1221. package/server/services/workshop/runtime/task-engine/facade.ts +7 -7
  1222. package/server/services/workshop/runtime/task-engine/index.ts +15 -15
  1223. package/server/services/workshop/runtime/task-engine/types.ts +3 -3
  1224. package/server/services/workshop/runtime/user-notification-hub.ts +192 -192
  1225. package/server/types/pg.d.ts +49 -49
  1226. package/server/utils/approval-gate.ts +67 -67
  1227. package/server/utils/mojibake-guard.ts +29 -29
  1228. package/server/utils/stability-severity.ts +77 -77
  1229. package/shared/config/groups.mjs +241 -241
  1230. package/shared/dcw-protocol/catalog.ts +232 -232
  1231. package/shared/dcw-protocol/closed-loop.ts +137 -137
  1232. package/shared/lru.mjs +97 -97
  1233. package/tui/README.md +74 -74
  1234. package/tui/aw-tui.mjs +445 -445
  1235. package/tui/commands/index.mjs +287 -287
  1236. package/tui/components/chat-log.mjs +42 -42
  1237. package/tui/components/monitor-pane.mjs +39 -39
  1238. package/tui/components/root.mjs +53 -53
  1239. package/tui/components/status-bar.mjs +33 -33
  1240. package/tui/lib/api.mjs +82 -82
  1241. package/tui/lib/pickers.mjs +121 -121
  1242. package/tui/lib/reducers.mjs +218 -218
  1243. package/tui/lib/state.mjs +86 -86
  1244. package/tui/lib/virtual-terminal.mjs +48 -48
  1245. package/tui/lib/ws.mjs +125 -125
  1246. package/tui/theme.mjs +38 -38
  1247. package/.output/.AgentWorkShop/aml-python/__pycache__/aml_eval.cpython-312.pyc +0 -0
  1248. package/.output/.AgentWorkShop/aml-python/__pycache__/amlkit.cpython-312.pyc +0 -0
  1249. package/.output/.AgentWorkShop/aml-python/__pycache__/train-example.cpython-312.pyc +0 -0
  1250. package/.output/.AgentWorkShop/aml-python/__pycache__/train-hybrid-example.cpython-312.pyc +0 -0
  1251. package/.output/public/_nuxt/BRYBzVMJ.js +0 -1
  1252. package/.output/public/_nuxt/BW2uTUx52.js +0 -2
  1253. package/.output/public/_nuxt/BtZKe9ZV.js +0 -1
  1254. package/.output/public/_nuxt/CfFUK6932.js +0 -2
  1255. package/.output/public/_nuxt/DhW7cFOa.js +0 -1
  1256. package/.output/public/_nuxt/OmpTerminalPanel.ComMDrA8.css +0 -1
  1257. package/.output/public/_nuxt/PluginSlot.CGH0vb95.css +0 -1
  1258. package/.output/public/_nuxt/TownView.CC3t-Dte.css +0 -1
  1259. package/.output/public/_nuxt/aml.PalMp-5n.css +0 -1
  1260. package/.output/public/_nuxt/builds/meta/fa0af8b5-3929-428d-a6de-3b5cc6b8248f.json +0 -1
  1261. package/.output/public/_nuxt/permissions.DxuOOIqQ.css +0 -1
  1262. package/.output/public/_nuxt/schedules.BXNJ9q_I.css +0 -1
  1263. package/.output/public/_nuxt/tools.BwXFAb-X.css +0 -1
  1264. package/.output/server/chunks/build/AuthGate-nF1evO4v.mjs +0 -716
  1265. package/.output/server/chunks/build/AuthGate-nF1evO4v.mjs.map +0 -1
  1266. package/.output/server/chunks/build/FormItemContext-BlyzocS0.mjs +0 -72
  1267. package/.output/server/chunks/build/FormItemContext-BlyzocS0.mjs.map +0 -1
  1268. package/.output/server/chunks/build/OmpTerminalPanel-BhvhQ1gG.mjs +0 -942
  1269. package/.output/server/chunks/build/OmpTerminalPanel-BhvhQ1gG.mjs.map +0 -1
  1270. package/.output/server/chunks/build/PluginSlot-BUKXwV2X.mjs +0 -141
  1271. package/.output/server/chunks/build/PluginSlot-BUKXwV2X.mjs.map +0 -1
  1272. package/.output/server/chunks/build/TownView-BWMDbosY.mjs +0 -6489
  1273. package/.output/server/chunks/build/TownView-BWMDbosY.mjs.map +0 -1
  1274. package/.output/server/chunks/build/_id_-BK-t8nRG.mjs +0 -392
  1275. package/.output/server/chunks/build/_id_-BK-t8nRG.mjs.map +0 -1
  1276. package/.output/server/chunks/build/_id_-CZPlPDm4.mjs +0 -2045
  1277. package/.output/server/chunks/build/_id_-CZPlPDm4.mjs.map +0 -1
  1278. package/.output/server/chunks/build/_wsId_-BPy-Aj9L.mjs +0 -14297
  1279. package/.output/server/chunks/build/_wsId_-BPy-Aj9L.mjs.map +0 -1
  1280. package/.output/server/chunks/build/agents-CpNLdI8E.mjs +0 -1078
  1281. package/.output/server/chunks/build/agents-CpNLdI8E.mjs.map +0 -1
  1282. package/.output/server/chunks/build/alert-D0ivtTGy.mjs +0 -263
  1283. package/.output/server/chunks/build/alert-D0ivtTGy.mjs.map +0 -1
  1284. package/.output/server/chunks/build/aml-DRAFRcGU.mjs +0 -814
  1285. package/.output/server/chunks/build/aml-DRAFRcGU.mjs.map +0 -1
  1286. package/.output/server/chunks/build/analysis-p-dBkjoK.mjs +0 -533
  1287. package/.output/server/chunks/build/analysis-p-dBkjoK.mjs.map +0 -1
  1288. package/.output/server/chunks/build/api-B4Om0mEc.mjs.map +0 -1
  1289. package/.output/server/chunks/build/api-BEW_ebY_.mjs.map +0 -1
  1290. package/.output/server/chunks/build/api-BsAgXWxi.mjs.map +0 -1
  1291. package/.output/server/chunks/build/api-error-BwAQLw44.mjs +0 -47
  1292. package/.output/server/chunks/build/api-error-BwAQLw44.mjs.map +0 -1
  1293. package/.output/server/chunks/build/apiClient-BvXtNzC8.mjs +0 -81
  1294. package/.output/server/chunks/build/apiClient-BvXtNzC8.mjs.map +0 -1
  1295. package/.output/server/chunks/build/board-Dl2Ar22r.mjs +0 -178
  1296. package/.output/server/chunks/build/board-Dl2Ar22r.mjs.map +0 -1
  1297. package/.output/server/chunks/build/card-Cqk0Ur-L.mjs +0 -953
  1298. package/.output/server/chunks/build/card-Cqk0Ur-L.mjs.map +0 -1
  1299. package/.output/server/chunks/build/channel-templates-ByHOQQkO.mjs +0 -942
  1300. package/.output/server/chunks/build/channel-templates-ByHOQQkO.mjs.map +0 -1
  1301. package/.output/server/chunks/build/checkbox-CrT4cnfu.mjs +0 -439
  1302. package/.output/server/chunks/build/checkbox-CrT4cnfu.mjs.map +0 -1
  1303. package/.output/server/chunks/build/client-only-qNA2OVV_.mjs +0 -43
  1304. package/.output/server/chunks/build/client-only-qNA2OVV_.mjs.map +0 -1
  1305. package/.output/server/chunks/build/core-CgTOPS4t.mjs +0 -294
  1306. package/.output/server/chunks/build/core-CgTOPS4t.mjs.map +0 -1
  1307. package/.output/server/chunks/build/daq-CdxcfY_G.mjs +0 -1266
  1308. package/.output/server/chunks/build/daq-CdxcfY_G.mjs.map +0 -1
  1309. package/.output/server/chunks/build/data-D8uX1dnm.mjs +0 -481
  1310. package/.output/server/chunks/build/data-D8uX1dnm.mjs.map +0 -1
  1311. package/.output/server/chunks/build/dcw-BlDQtS4q.mjs +0 -505
  1312. package/.output/server/chunks/build/dcw-BlDQtS4q.mjs.map +0 -1
  1313. package/.output/server/chunks/build/default-CNWS6NUw.mjs +0 -2353
  1314. package/.output/server/chunks/build/default-CNWS6NUw.mjs.map +0 -1
  1315. package/.output/server/chunks/build/descriptions-BNlfKG9y.mjs +0 -406
  1316. package/.output/server/chunks/build/descriptions-BNlfKG9y.mjs.map +0 -1
  1317. package/.output/server/chunks/build/drawer-Caji0PLs.mjs +0 -834
  1318. package/.output/server/chunks/build/drawer-Caji0PLs.mjs.map +0 -1
  1319. package/.output/server/chunks/build/dropdown-BNwTVGde.mjs +0 -14
  1320. package/.output/server/chunks/build/dropdown-BNwTVGde.mjs.map +0 -1
  1321. package/.output/server/chunks/build/dropdown-Cd-xPhR6.mjs +0 -540
  1322. package/.output/server/chunks/build/dropdown-Cd-xPhR6.mjs.map +0 -1
  1323. package/.output/server/chunks/build/es-Bxu10NJ2.mjs.map +0 -1
  1324. package/.output/server/chunks/build/firstNotUndefined-8H5_qHUu.mjs +0 -2448
  1325. package/.output/server/chunks/build/firstNotUndefined-8H5_qHUu.mjs.map +0 -1
  1326. package/.output/server/chunks/build/form-D_UpWPN4.mjs +0 -4712
  1327. package/.output/server/chunks/build/form-D_UpWPN4.mjs.map +0 -1
  1328. package/.output/server/chunks/build/hasIn-DBdElbjM.mjs +0 -553
  1329. package/.output/server/chunks/build/hasIn-DBdElbjM.mjs.map +0 -1
  1330. package/.output/server/chunks/build/hitl-Bd30yr1J.mjs +0 -132
  1331. package/.output/server/chunks/build/hitl-Bd30yr1J.mjs.map +0 -1
  1332. package/.output/server/chunks/build/input-GtPuSEgt.mjs +0 -2181
  1333. package/.output/server/chunks/build/input-GtPuSEgt.mjs.map +0 -1
  1334. package/.output/server/chunks/build/input-number-BNlNDK7H.mjs +0 -1120
  1335. package/.output/server/chunks/build/input-number-BNlNDK7H.mjs.map +0 -1
  1336. package/.output/server/chunks/build/interval-DvHBIIZh.mjs +0 -9
  1337. package/.output/server/chunks/build/interval-DvHBIIZh.mjs.map +0 -1
  1338. package/.output/server/chunks/build/isNumeric-CP7q_yhz.mjs +0 -7
  1339. package/.output/server/chunks/build/isNumeric-CP7q_yhz.mjs.map +0 -1
  1340. package/.output/server/chunks/build/logs-pRb-TMWa.mjs +0 -427
  1341. package/.output/server/chunks/build/logs-pRb-TMWa.mjs.map +0 -1
  1342. package/.output/server/chunks/build/menu-BXt-X0dt.mjs +0 -1952
  1343. package/.output/server/chunks/build/menu-BXt-X0dt.mjs.map +0 -1
  1344. package/.output/server/chunks/build/monitor-Cq6hRFeQ.mjs +0 -2253
  1345. package/.output/server/chunks/build/monitor-Cq6hRFeQ.mjs.map +0 -1
  1346. package/.output/server/chunks/build/ontology-DK0Mf0zT.mjs +0 -1406
  1347. package/.output/server/chunks/build/ontology-DK0Mf0zT.mjs.map +0 -1
  1348. package/.output/server/chunks/build/operations-SMQrRAcr.mjs +0 -311
  1349. package/.output/server/chunks/build/operations-SMQrRAcr.mjs.map +0 -1
  1350. package/.output/server/chunks/build/optimizer-BlWTsM-W.mjs +0 -202
  1351. package/.output/server/chunks/build/optimizer-BlWTsM-W.mjs.map +0 -1
  1352. package/.output/server/chunks/build/pages-AFRP4-EL.mjs +0 -542
  1353. package/.output/server/chunks/build/pages-AFRP4-EL.mjs.map +0 -1
  1354. package/.output/server/chunks/build/pagination-DTAconUo.mjs +0 -1346
  1355. package/.output/server/chunks/build/pagination-DTAconUo.mjs.map +0 -1
  1356. package/.output/server/chunks/build/permissions-DgXQZSyx.mjs +0 -637
  1357. package/.output/server/chunks/build/permissions-DgXQZSyx.mjs.map +0 -1
  1358. package/.output/server/chunks/build/plugins-LRjaSEZy.mjs +0 -272
  1359. package/.output/server/chunks/build/plugins-LRjaSEZy.mjs.map +0 -1
  1360. package/.output/server/chunks/build/popconfirm-DxYPGRgS.mjs +0 -340
  1361. package/.output/server/chunks/build/popconfirm-DxYPGRgS.mjs.map +0 -1
  1362. package/.output/server/chunks/build/responsiveObserve-DM3hpzhU.mjs +0 -78
  1363. package/.output/server/chunks/build/responsiveObserve-DM3hpzhU.mjs.map +0 -1
  1364. package/.output/server/chunks/build/schedules-dSnr8url.mjs +0 -7172
  1365. package/.output/server/chunks/build/schedules-dSnr8url.mjs.map +0 -1
  1366. package/.output/server/chunks/build/segmented-D3HWtHPw.mjs +0 -341
  1367. package/.output/server/chunks/build/segmented-D3HWtHPw.mjs.map +0 -1
  1368. package/.output/server/chunks/build/select-B3Dsb9yq.mjs +0 -3923
  1369. package/.output/server/chunks/build/select-B3Dsb9yq.mjs.map +0 -1
  1370. package/.output/server/chunks/build/settings-BrIhnS2Z.mjs +0 -1014
  1371. package/.output/server/chunks/build/settings-BrIhnS2Z.mjs.map +0 -1
  1372. package/.output/server/chunks/build/space-Dwu2Skt8.mjs +0 -110
  1373. package/.output/server/chunks/build/space-Dwu2Skt8.mjs.map +0 -1
  1374. package/.output/server/chunks/build/spin-C2cuvGth.mjs +0 -357
  1375. package/.output/server/chunks/build/spin-C2cuvGth.mjs.map +0 -1
  1376. package/.output/server/chunks/build/studio-cdoNCfyy.mjs +0 -332
  1377. package/.output/server/chunks/build/studio-cdoNCfyy.mjs.map +0 -1
  1378. package/.output/server/chunks/build/switch-CyR-H6Fb.mjs +0 -377
  1379. package/.output/server/chunks/build/switch-CyR-H6Fb.mjs.map +0 -1
  1380. package/.output/server/chunks/build/table-CmVD-cA9.mjs +0 -7546
  1381. package/.output/server/chunks/build/table-CmVD-cA9.mjs.map +0 -1
  1382. package/.output/server/chunks/build/tabs-Vg0e7cZE.mjs +0 -1924
  1383. package/.output/server/chunks/build/tabs-Vg0e7cZE.mjs.map +0 -1
  1384. package/.output/server/chunks/build/tag-y0sn-xv9.mjs +0 -1156
  1385. package/.output/server/chunks/build/tag-y0sn-xv9.mjs.map +0 -1
  1386. package/.output/server/chunks/build/teams-B1d32eHK.mjs +0 -1203
  1387. package/.output/server/chunks/build/teams-B1d32eHK.mjs.map +0 -1
  1388. package/.output/server/chunks/build/tokens-GYaGJ35Z.mjs +0 -1062
  1389. package/.output/server/chunks/build/tokens-GYaGJ35Z.mjs.map +0 -1
  1390. package/.output/server/chunks/build/tools-s_9U1Djj.mjs +0 -487
  1391. package/.output/server/chunks/build/tools-s_9U1Djj.mjs.map +0 -1
  1392. package/.output/server/chunks/build/tooltip-C2n2nNiQ.mjs +0 -920
  1393. package/.output/server/chunks/build/tooltip-C2n2nNiQ.mjs.map +0 -1
  1394. package/.output/server/chunks/build/town-B5aoiG98.mjs +0 -133
  1395. package/.output/server/chunks/build/town-B5aoiG98.mjs.map +0 -1
  1396. package/.output/server/chunks/build/useAgentHarnessOptions-DOrQHeBh.mjs +0 -124
  1397. package/.output/server/chunks/build/useAgentHarnessOptions-DOrQHeBh.mjs.map +0 -1
  1398. package/.output/server/chunks/build/useAgentTemplateActions-CzlplRWh.mjs +0 -77
  1399. package/.output/server/chunks/build/useAgentTemplateActions-CzlplRWh.mjs.map +0 -1
  1400. package/.output/server/chunks/build/useAgentTemplateForm-DQo1enf2.mjs +0 -117
  1401. package/.output/server/chunks/build/useAgentTemplateForm-DQo1enf2.mjs.map +0 -1
  1402. package/.output/server/chunks/build/useAgentTemplatesCatalog-DP-iMmqz.mjs +0 -133
  1403. package/.output/server/chunks/build/useAgentTemplatesCatalog-DP-iMmqz.mjs.map +0 -1
  1404. package/.output/server/chunks/build/useAmlDatasets-DeoE1idn.mjs +0 -92
  1405. package/.output/server/chunks/build/useAmlDatasets-DeoE1idn.mjs.map +0 -1
  1406. package/.output/server/chunks/build/useAmlEntities-BJhvdqHJ.mjs +0 -86
  1407. package/.output/server/chunks/build/useAmlEntities-BJhvdqHJ.mjs.map +0 -1
  1408. package/.output/server/chunks/build/useAmlEnv-CDIZ6xTe.mjs +0 -194
  1409. package/.output/server/chunks/build/useAmlEnv-CDIZ6xTe.mjs.map +0 -1
  1410. package/.output/server/chunks/build/useAmlExperiments-Dloi834i.mjs +0 -89
  1411. package/.output/server/chunks/build/useAmlExperiments-Dloi834i.mjs.map +0 -1
  1412. package/.output/server/chunks/build/useAmlJobs-BF9LpwXz.mjs +0 -267
  1413. package/.output/server/chunks/build/useAmlJobs-BF9LpwXz.mjs.map +0 -1
  1414. package/.output/server/chunks/build/useAmlModels-_bweOr3R.mjs +0 -93
  1415. package/.output/server/chunks/build/useAmlModels-_bweOr3R.mjs.map +0 -1
  1416. package/.output/server/chunks/build/useAmlNotes-DQj980iX.mjs +0 -86
  1417. package/.output/server/chunks/build/useAmlNotes-DQj980iX.mjs.map +0 -1
  1418. package/.output/server/chunks/build/useAmlPredict-DHNgDSJn.mjs +0 -130
  1419. package/.output/server/chunks/build/useAmlPredict-DHNgDSJn.mjs.map +0 -1
  1420. package/.output/server/chunks/build/useAnalysisFeed-BrEGV_9x.mjs +0 -129
  1421. package/.output/server/chunks/build/useAnalysisFeed-BrEGV_9x.mjs.map +0 -1
  1422. package/.output/server/chunks/build/useDaqAddNode-D_Rkju0f.mjs +0 -142
  1423. package/.output/server/chunks/build/useDaqAddNode-D_Rkju0f.mjs.map +0 -1
  1424. package/.output/server/chunks/build/useDaqDetailBinding-DCWaLKXT.mjs +0 -70
  1425. package/.output/server/chunks/build/useDaqDetailBinding-DCWaLKXT.mjs.map +0 -1
  1426. package/.output/server/chunks/build/useDaqDetailFrames-BOIcOJRB.mjs +0 -79
  1427. package/.output/server/chunks/build/useDaqDetailFrames-BOIcOJRB.mjs.map +0 -1
  1428. package/.output/server/chunks/build/useDaqDetailHistory-D6WulPVs.mjs +0 -176
  1429. package/.output/server/chunks/build/useDaqDetailHistory-D6WulPVs.mjs.map +0 -1
  1430. package/.output/server/chunks/build/useDaqDetailNode-DeOsDxK5.mjs +0 -99
  1431. package/.output/server/chunks/build/useDaqDetailNode-DeOsDxK5.mjs.map +0 -1
  1432. package/.output/server/chunks/build/useDaqDetailParams-Cm9a9r5G.mjs +0 -159
  1433. package/.output/server/chunks/build/useDaqDetailParams-Cm9a9r5G.mjs.map +0 -1
  1434. package/.output/server/chunks/build/useDaqFilters-CctmO03p.mjs +0 -222
  1435. package/.output/server/chunks/build/useDaqFilters-CctmO03p.mjs.map +0 -1
  1436. package/.output/server/chunks/build/useDaqOptimizations-CmX_dpBc.mjs +0 -136
  1437. package/.output/server/chunks/build/useDaqOptimizations-CmX_dpBc.mjs.map +0 -1
  1438. package/.output/server/chunks/build/useDaqStream-B9ZBVQrI.mjs +0 -395
  1439. package/.output/server/chunks/build/useDaqStream-B9ZBVQrI.mjs.map +0 -1
  1440. package/.output/server/chunks/build/useDaqTemplates-CK37sMfi.mjs +0 -187
  1441. package/.output/server/chunks/build/useDaqTemplates-CK37sMfi.mjs.map +0 -1
  1442. package/.output/server/chunks/build/useDashboardData-B36wVWo2.mjs +0 -153
  1443. package/.output/server/chunks/build/useDashboardData-B36wVWo2.mjs.map +0 -1
  1444. package/.output/server/chunks/build/useDcwAddNode-DACVcEHs.mjs +0 -219
  1445. package/.output/server/chunks/build/useDcwAddNode-DACVcEHs.mjs.map +0 -1
  1446. package/.output/server/chunks/build/useDcwCards-SaiImIYQ.mjs.map +0 -1
  1447. package/.output/server/chunks/build/useDcwDetailScope-DLOklSMO.mjs +0 -184
  1448. package/.output/server/chunks/build/useDcwDetailScope-DLOklSMO.mjs.map +0 -1
  1449. package/.output/server/chunks/build/useDcwDetailTemplates-ClmIdZ40.mjs +0 -148
  1450. package/.output/server/chunks/build/useDcwDetailTemplates-ClmIdZ40.mjs.map +0 -1
  1451. package/.output/server/chunks/build/useDcwFilter-CPMyCltx.mjs +0 -71
  1452. package/.output/server/chunks/build/useDcwFilter-CPMyCltx.mjs.map +0 -1
  1453. package/.output/server/chunks/build/useDcwLedger-0ie-0WTc.mjs.map +0 -1
  1454. package/.output/server/chunks/build/useDcwLineMutations-DNxo66yM.mjs +0 -137
  1455. package/.output/server/chunks/build/useDcwLineMutations-DNxo66yM.mjs.map +0 -1
  1456. package/.output/server/chunks/build/useDcwLineRun-CHskwscT.mjs +0 -104
  1457. package/.output/server/chunks/build/useDcwLineRun-CHskwscT.mjs.map +0 -1
  1458. package/.output/server/chunks/build/useDcwParamApprovals-DtScUc-W.mjs +0 -121
  1459. package/.output/server/chunks/build/useDcwParamApprovals-DtScUc-W.mjs.map +0 -1
  1460. package/.output/server/chunks/build/useDcwProducts-BMaxzLu6.mjs +0 -93
  1461. package/.output/server/chunks/build/useDcwProducts-BMaxzLu6.mjs.map +0 -1
  1462. package/.output/server/chunks/build/useDcwQuery-TVU3Eo0M.mjs +0 -98
  1463. package/.output/server/chunks/build/useDcwQuery-TVU3Eo0M.mjs.map +0 -1
  1464. package/.output/server/chunks/build/useDcwQuickActions-BREFmR9T.mjs +0 -88
  1465. package/.output/server/chunks/build/useDcwQuickActions-BREFmR9T.mjs.map +0 -1
  1466. package/.output/server/chunks/build/useDcwRecipes-Bc9urA1N.mjs +0 -258
  1467. package/.output/server/chunks/build/useDcwRecipes-Bc9urA1N.mjs.map +0 -1
  1468. package/.output/server/chunks/build/useDcwStream-Dir5ufAU.mjs +0 -452
  1469. package/.output/server/chunks/build/useDcwStream-Dir5ufAU.mjs.map +0 -1
  1470. package/.output/server/chunks/build/useDcwTemplates-BzagZztS.mjs +0 -91
  1471. package/.output/server/chunks/build/useDcwTemplates-BzagZztS.mjs.map +0 -1
  1472. package/.output/server/chunks/build/useDcwWrites-BROwTLCn.mjs +0 -140
  1473. package/.output/server/chunks/build/useDcwWrites-BROwTLCn.mjs.map +0 -1
  1474. package/.output/server/chunks/build/useDeviceTwins-BqwVJaZg.mjs +0 -128
  1475. package/.output/server/chunks/build/useDeviceTwins-BqwVJaZg.mjs.map +0 -1
  1476. package/.output/server/chunks/build/useExpConfirmations-BM626N4p.mjs +0 -107
  1477. package/.output/server/chunks/build/useExpConfirmations-BM626N4p.mjs.map +0 -1
  1478. package/.output/server/chunks/build/useLocalTime-uVSM44Um.mjs +0 -55
  1479. package/.output/server/chunks/build/useLocalTime-uVSM44Um.mjs.map +0 -1
  1480. package/.output/server/chunks/build/useLogsManual-cVBZQ_Mt.mjs +0 -88
  1481. package/.output/server/chunks/build/useLogsManual-cVBZQ_Mt.mjs.map +0 -1
  1482. package/.output/server/chunks/build/useLogsQuery-D7hrJ3yn.mjs +0 -150
  1483. package/.output/server/chunks/build/useLogsQuery-D7hrJ3yn.mjs.map +0 -1
  1484. package/.output/server/chunks/build/useLogsScope-aaPQeTRm.mjs +0 -83
  1485. package/.output/server/chunks/build/useLogsScope-aaPQeTRm.mjs.map +0 -1
  1486. package/.output/server/chunks/build/useMonitorData-DIkiLr_h.mjs +0 -135
  1487. package/.output/server/chunks/build/useMonitorData-DIkiLr_h.mjs.map +0 -1
  1488. package/.output/server/chunks/build/useMonitorFormat-CyURtH8N.mjs +0 -91
  1489. package/.output/server/chunks/build/useMonitorFormat-CyURtH8N.mjs.map +0 -1
  1490. package/.output/server/chunks/build/useOperationsFeed-Ci4mZAn_.mjs +0 -195
  1491. package/.output/server/chunks/build/useOperationsFeed-Ci4mZAn_.mjs.map +0 -1
  1492. package/.output/server/chunks/build/useOpsLog-C-M6Eace.mjs +0 -149
  1493. package/.output/server/chunks/build/useOpsLog-C-M6Eace.mjs.map +0 -1
  1494. package/.output/server/chunks/build/useRecipeDispatchApprovals-BYtiqfeb.mjs +0 -156
  1495. package/.output/server/chunks/build/useRecipeDispatchApprovals-BYtiqfeb.mjs.map +0 -1
  1496. package/.output/server/chunks/build/useTeamActions-I_8QWp9w.mjs +0 -79
  1497. package/.output/server/chunks/build/useTeamActions-I_8QWp9w.mjs.map +0 -1
  1498. package/.output/server/chunks/build/useTeamAddMemberDialog-BLn4nTuy.mjs +0 -84
  1499. package/.output/server/chunks/build/useTeamAddMemberDialog-BLn4nTuy.mjs.map +0 -1
  1500. package/.output/server/chunks/build/useTeamCreateDialog-Bp5qKtpI.mjs +0 -97
  1501. package/.output/server/chunks/build/useTeamCreateDialog-Bp5qKtpI.mjs.map +0 -1
  1502. package/.output/server/chunks/build/useTeamDeployDialog-DwIaz6Cx.mjs +0 -80
  1503. package/.output/server/chunks/build/useTeamDeployDialog-DwIaz6Cx.mjs.map +0 -1
  1504. package/.output/server/chunks/build/useTeamPluginDialog-B932gZOI.mjs +0 -103
  1505. package/.output/server/chunks/build/useTeamPluginDialog-B932gZOI.mjs.map +0 -1
  1506. package/.output/server/chunks/build/useTeamsCatalog-DBwaLQBw.mjs +0 -123
  1507. package/.output/server/chunks/build/useTeamsCatalog-DBwaLQBw.mjs.map +0 -1
  1508. package/.output/server/chunks/build/useTokenCreate-Ctl0YGhL.mjs +0 -115
  1509. package/.output/server/chunks/build/useTokenCreate-Ctl0YGhL.mjs.map +0 -1
  1510. package/.output/server/chunks/build/useTokenRename-Cm3ypSfN.mjs +0 -87
  1511. package/.output/server/chunks/build/useTokenRename-Cm3ypSfN.mjs.map +0 -1
  1512. package/.output/server/chunks/build/useTokenReveal-CeoWL5Mt.mjs +0 -118
  1513. package/.output/server/chunks/build/useTokenReveal-CeoWL5Mt.mjs.map +0 -1
  1514. package/.output/server/chunks/build/useTokensList-CNIzON3u.mjs +0 -92
  1515. package/.output/server/chunks/build/useTokensList-CNIzON3u.mjs.map +0 -1
  1516. package/.output/server/chunks/build/useWorkbenchAuth-CY-bVFMu.mjs +0 -141
  1517. package/.output/server/chunks/build/useWorkbenchAuth-CY-bVFMu.mjs.map +0 -1
  1518. package/.output/server/chunks/build/useWorkbenchWorkspaces-DhZQFss9.mjs +0 -138
  1519. package/.output/server/chunks/build/useWorkbenchWorkspaces-DhZQFss9.mjs.map +0 -1
  1520. package/.output/server/chunks/build/useWorkshopApi-CaSItJVq.mjs +0 -119
  1521. package/.output/server/chunks/build/useWorkshopApi-CaSItJVq.mjs.map +0 -1
  1522. package/.output/server/chunks/build/useWorkshopWs-YQ5URrbt.mjs +0 -1659
  1523. package/.output/server/chunks/build/useWorkshopWs-YQ5URrbt.mjs.map +0 -1
  1524. package/.output/server/chunks/build/useWorkspaceAuth-Dlvj9csD.mjs.map +0 -1
  1525. package/.output/server/chunks/build/useWorkspaceChannels-CPFepxTN.mjs +0 -92
  1526. package/.output/server/chunks/build/useWorkspaceChannels-CPFepxTN.mjs.map +0 -1
  1527. package/.output/server/chunks/build/useWorkspaceShell-BCypjjjE.mjs +0 -168
  1528. package/.output/server/chunks/build/useWorkspaceShell-BCypjjjE.mjs.map +0 -1
  1529. package/.output/server/chunks/build/users-DjiVC_tS.mjs +0 -569
  1530. package/.output/server/chunks/build/users-DjiVC_tS.mjs.map +0 -1
  1531. package/.output/server/chunks/build/workshop-1gKeDASV.mjs +0 -546
  1532. package/.output/server/chunks/build/workshop-1gKeDASV.mjs.map +0 -1
  1533. package/app/.mimosa/hook-state/sess_05189059-e42d-4188-8911-4f7baabe009b.json +0 -1
  1534. package/app/.mimosa/hook-state/sess_05189059-e42d-4188-8911-4f7baabe009b.mtg0vz68-49792-75b0709555.baseline/1459e6269990a5d229b9228c8b2f62ffaa7d350068380ae8b875fee0db45cca6.source +0 -180
  1535. package/app/.mimosa/hook-state/sess_05189059-e42d-4188-8911-4f7baabe009b.mtg0vz68-49792-75b0709555.baseline/c2991e909c70c5c12b90a407c7adcf63384c51668a2b334e6e047fa675c268fe.source +0 -305
  1536. package/app/.mimosa/hook-state/sess_05189059-e42d-4188-8911-4f7baabe009b.mtg0vz68-49792-75b0709555.baseline/e09129039d1e27e3fac24becc9bdafd2d1a7c8049bff24173df007be865f0165.source +0 -264
  1537. package/app/.mimosa/hook-status/sess_05189059-e42d-4188-8911-4f7baabe009b-28ef7c75ea.json +0 -14
  1538. package/scripts/e2e-direct-rest-simulator-paper.mjs +0 -624
  1539. package/scripts/e2e-pi-simulator-paper.mjs +0 -2316
  1540. package/scripts/e2e-registered-harness-simulator-paper.mjs +0 -1926
  1541. package/scripts/e2e-simulator-optimizer-paper.mjs +0 -264
  1542. package/scripts/fixtures/omp-paper-harness.mjs +0 -163
  1543. package/server/.mimosa/hook-state/sess_869e5bfd-07f4-4b6e-a991-6221fcf6b7d2.json +0 -1
  1544. package/server/.mimosa/hook-state/sess_869e5bfd-07f4-4b6e-a991-6221fcf6b7d2.mvhn1irp-99488-e3fdc1cbfc.baseline/942d2679b87b96c612b4f2a425c3ccc5b6f3234f0cf589a8441602f866fbe277.source +0 -41
  1545. package/server/.mimosa/hook-state/sess_869e5bfd-07f4-4b6e-a991-6221fcf6b7d2.mvhn1irp-99488-e3fdc1cbfc.baseline/dd617a82339d2c61e49e28e416aabeb2fc100fb3cb1beca18d02dfb833214af6.source +0 -51
  1546. package/server/.mimosa/hook-status/sess_869e5bfd-07f4-4b6e-a991-6221fcf6b7d2-e67b6b91bf.json +0 -14
  1547. package/server/services/workshop/.mimosa/hook-state/sess_fed429fb-c8b7-4a50-bbd6-45afc580893f.json +0 -1
  1548. package/server/services/workshop/.mimosa/hook-status/sess_fed429fb-c8b7-4a50-bbd6-45afc580893f-e6b75bbfe6.json +0 -14
  1549. package/server/services/workshop/agents/omp-agent/supervision-history.ts +0 -38
  1550. package/server/services/workshop/aml/python/__pycache__/aml_eval.cpython-312.pyc +0 -0
  1551. package/server/services/workshop/aml/python/__pycache__/amlkit.cpython-312.pyc +0 -0
  1552. package/server/services/workshop/aml/python/__pycache__/train-example.cpython-312.pyc +0 -0
  1553. package/server/services/workshop/aml/python/__pycache__/train-hybrid-example.cpython-312.pyc +0 -0
  1554. package/server/services/workshop/optimization/python/.mimosa/hook-state/session_187ec97f45d4bd02369bbe94da527cf1.json +0 -1
  1555. package/server/services/workshop/optimization/python/.mimosa/hook-state/session_187ec97f45d4bd02369bbe94da527cf1.mvjqkcs6-68688-fb7131a89c.baseline/190a6772a4e43801737b4ba6072eb9d53d3099b5d8a9e6f57bc5e8592a26a6c4.source +0 -274
  1556. package/server/services/workshop/optimization/python/.mimosa/hook-status/session_187ec97f45d4bd02369bbe94da527cf1-01ed7f04fa.json +0 -14
  1557. package/server/services/workshop/optimization/python/__pycache__/problems.cpython-312.pyc +0 -0
  1558. /package/.output/public/_nuxt/{9j2J4k4w.js → 9j2J4k4w2.js} +0 -0
  1559. /package/.output/public/_nuxt/{BY3Lbz3h2.js → BY3Lbz3h.js} +0 -0
  1560. /package/.output/public/_nuxt/{Iub61dX92.js → Iub61dX9.js} +0 -0
  1561. /package/.output/public/_nuxt/{Q-JpBT032.js → Q-JpBT03.js} +0 -0
  1562. /package/.output/public/_nuxt/{dVw8IHY62.js → dVw8IHY6.js} +0 -0
  1563. /package/.output/public/_nuxt/{k9b520K-.js → k9b520K-2.js} +0 -0
@@ -1,549 +1,549 @@
1
- /**
2
- * 真实 PLC 闭环实测 — PLC 模拟器(挤出流延数字孪生) × AgentTeam × rag-knowledge × 深度诊断
3
- *
4
- * 前置:PLC 模拟器运行中(API 4010;Modbus TCP 16040:40001=熔体温度/40021=加热区1SP,float32 big)
5
- * AW 3001 生产实例;rag-knowledge(KB_BASE);诊断服务(DIAG);两桥接插件启用且 token 已配置。
6
- *
7
- * Stage A 服务与插件健康 Stage E 知识闭环(kb_store/kb_search + 诊断自动入库)
8
- * Stage B 真实产线供给 Stage F 插件参数回归(逐键热生效→复原)
9
- * Stage C 真实数采交叉核对 Stage G Channel 级插件开关
10
- * Stage D 闭环写控(HITL) Stage H Harness 集成面
11
- *
12
- * 运行:NO_PROXY='*' AW_BASE=http://127.0.0.1:3001 KB_BASE=http://127.0.0.1:8771 \
13
- * AW_E2E_TOKEN=<token> node scripts/e2e-plc-plugin-closedloop.mjs
14
- */
15
- import { DatabaseSync } from 'node:sqlite'
16
- import { join, resolve } from 'node:path'
17
-
18
- const BASE = process.env.AW_BASE ?? 'http://127.0.0.1:3001'
19
- const KB = process.env.KB_BASE ?? 'http://127.0.0.1:8771'
20
- const DIAG = process.env.DIAG_BASE ?? 'http://127.0.0.1:3210'
21
- const SIM = process.env.SIM_BASE ?? 'http://127.0.0.1:4010'
22
- const LINE = process.env.E2E_LINE ?? 'ln-af002514'
23
- const TAG = Date.now().toString(36)
24
- const sleep = ms => new Promise(r => setTimeout(r, ms))
25
-
26
- let pass = 0
27
- let fail = 0
28
- const failures = []
29
- function ok(cond, label, detail = '') {
30
- if (cond) {
31
- pass++
32
- console.log(` ✔ ${label}${detail ? ` —— ${detail}` : ''}`)
33
- }
34
- else {
35
- fail++
36
- failures.push(label)
37
- console.error(` ✘ ${label}${detail ? ` —— ${detail}` : ''}`)
38
- }
39
- }
40
-
41
- async function raw(method, url, { body, token, agent, timeoutMs = 30000 } = {}) {
42
- const headers = {}
43
- if (body !== undefined) headers['content-type'] = 'application/json'
44
- if (token) headers.authorization = `Bearer ${token}`
45
- if (agent) headers['x-aw-agent-token'] = agent.token
46
- try {
47
- const res = await fetch(url, { method, headers, body: body !== undefined ? JSON.stringify(body) : undefined, signal: AbortSignal.timeout(timeoutMs) })
48
- return { status: res.status, json: await res.json().catch(() => null) }
49
- }
50
- catch (e) { return { status: 0, json: { error: String(e) } } }
51
- }
52
- const api = (method, path, opts = {}) => raw(method, `${BASE}${path}`, opts)
53
- const env = r => r?.json?.data ?? r?.json
54
- const resultText = r => String(r?.json?.data?.result?.text ?? '')
55
- const invoke = (agent, tool, args, timeoutMs = 120000) => api('POST', '/api/workshop/agent-tools/invoke', { agent, timeoutMs, body: { agentId: agent.id, tool, args } })
56
-
57
- // ── 0. 用户(夹具:line operate 授权 + admin)─────────────────────────────
58
- let userToken = process.env.AW_E2E_TOKEN ?? ''
59
- if (!userToken) {
60
- const reg = await api('POST', '/api/workshop/users/register', { body: { name: `plc-e2e-${TAG}` } })
61
- userToken = env(reg)?.token ?? ''
62
- }
63
- ok(Boolean(userToken), 'e2e 用户 token 就绪')
64
- {
65
- const me = await api('GET', '/api/workshop/users/me', { token: userToken })
66
- const myId = env(me)?.id ?? ''
67
- ok(Boolean(myId), 'token 反查用户 id', myId)
68
- // 夹具库路径:默认仓库模式(.AgentWorkShop/data);隔离实例(AW_MODE=home)用
69
- // AW_E2E_USERS_DB 指向该实例的 users.sqlite —— 否则夹具写进另一个库,
70
- // 被测用户在该实例里既不是 admin 也没有产线授权(后续 DCW/HITL 段全 403)。
71
- const usersDb = process.env.AW_E2E_USERS_DB ?? join(resolve('.'), '.AgentWorkShop', 'data', 'users.sqlite')
72
- const db = new DatabaseSync(usersDb)
73
- db.exec('PRAGMA busy_timeout=4000')
74
- if (myId) {
75
- db.prepare(`INSERT OR REPLACE INTO user_line_grants (user_id, line_id, mode, granted_by, granted_at) VALUES (?, ?, 'operate', 'plc-e2e', ?)`)
76
- .run(myId, LINE, new Date().toISOString())
77
- db.prepare('UPDATE users SET role = \'admin\' WHERE id = ?').run(myId)
78
- }
79
- db.close()
80
- console.log(` · 夹具:授产线 operate + admin(${myId})@${usersDb}`)
81
- }
82
-
83
- // omp 执行器:必须挂在**本用户自有频道**下 —— HITL 待办按 channel 所有权过滤,
84
- // 用别人的频道成员 invoke 时审批待办对本用户不可见(权限域语义,非缺陷)
85
- let exec = null
86
- {
87
- const ch = await api('POST', '/api/workshop/channels', { token: userToken, body: { name: `PLC闭环频道-${TAG}` } })
88
- const channelId = env(ch)?.channelId
89
- const tpl = await api('POST', '/api/workshop/agents', { token: userToken, body: { name: `PLC执行器-${TAG}`, harness: 'omp' } })
90
- const tplId = env(tpl)?.id
91
- const add = await api('POST', `/api/workshop/channels/${channelId}/agents`, { token: userToken, body: { name: env(tpl)?.name, harness: 'omp', templateId: tplId, role: 'worker' } })
92
- const member = env(add)?.agent ?? env(add)
93
- if (member?.id && member?.token) exec = { id: member.id, name: member.name, token: member.token }
94
- }
95
- ok(Boolean(exec?.token), 'omp 执行器成员就绪(自有频道)', exec?.name ?? '')
96
- // 无 env 时:临时账号 → 会话 → 铸 idd_ token(脚本内完成,幂等)
97
- {
98
- const cur = env(await api('GET', '/api/system/settings', { token: userToken }))?.effective?.['plugins.diag-bridge.token'] ?? ''
99
- if (!cur.startsWith('idd_')) {
100
- const iu = `plce2e_${TAG}`
101
- const ipw = `Xy${TAG}ab9`
102
- await raw('POST', `${DIAG}/api/auth/register`, { body: { username: iu, password: ipw, email: `${iu}@e2e.local` } })
103
- const login = await raw('POST', `${DIAG}/api/auth/login`, { body: { username: iu, password: ipw } })
104
- const session = login.json?.data?.session_token ?? ''
105
- if (session) {
106
- const tk = await raw('POST', `${DIAG}/api/auth/tokens`, { token: session, body: { name: `plc-e2e-${TAG}` } })
107
- const idd = tk.json?.data?.token ?? ''
108
- if (idd.startsWith('idd_')) {
109
- await api('PATCH', '/api/system/settings', { token: userToken, body: { override: { 'plugins.diag-bridge.token': idd } } })
110
- console.log(' · 夹具:diag token 已更换为持久化 idd_ API Token(重启不失效)')
111
- }
112
- else {
113
- console.log(` ! idd_ token 铸造失败:${JSON.stringify(tk.json).slice(0, 120)}`)
114
- }
115
- }
116
- }
117
- }
118
-
119
- // ══ Stage A:服务与插件健康 ════════════════════════════════════════
120
- console.log('\n── A 服务与插件健康 ──')
121
- {
122
- const kbH = await raw('GET', `${KB}/api/v1/health`)
123
- ok(kbH.json?.status === 'healthy', 'rag-knowledge healthy', JSON.stringify(kbH.json))
124
- const dgH = await raw('GET', `${DIAG}/api/health`)
125
- ok(dgH.json?.status === 'ok', '诊断服务 healthy', `activeRuns=${dgH.json?.checks?.activeRuns}`)
126
- const simH = await raw('GET', `${SIM}/api/nodes`)
127
- ok(simH.status === 200, 'PLC 模拟器 API 可达', `${JSON.stringify(simH.json).length} bytes`)
128
- const plugs = await api('GET', '/api/workshop/plugins', { token: userToken })
129
- const list = plugs.json?.plugins ?? env(plugs)?.plugins ?? []
130
- const bridge = n => list.find(p => p?.name === n) ?? {}
131
- ok(bridge('rag-bridge').enabled === true && bridge('diag-bridge').enabled === true, '两桥接插件启用')
132
- ok(bridge('rag-bridge').hasClient === true && bridge('diag-bridge').hasClient === true, '两插件含浏览器面板')
133
- ok(bridge('rag-bridge').hasI18n === true && bridge('diag-bridge').hasI18n === true, '两插件含 i18n 包')
134
- ok((bridge('rag-bridge').settingsCount ?? 0) >= 3 && (bridge('diag-bridge').settingsCount ?? 0) >= 7, '插件设置描述符已注册', `rag=${bridge('rag-bridge').settingsCount} diag=${bridge('diag-bridge').settingsCount}`)
135
- const snap = await api('GET', '/api/system/settings', { token: userToken })
136
- const keys = (env(snap)?.descriptors ?? []).map(d => d.key)
137
- ok(keys.includes('plugins.rag-bridge.token') && keys.includes('plugins.diag-bridge.harness'), '设置快照含插件描述符')
138
- const noAuth = await raw('GET', `${BASE}/api/plugins/rag-bridge/health`)
139
- ok(noAuth.status === 401, '插件路由鉴权门', `status=${noAuth.status}`)
140
- const i18n = await raw('GET', `${BASE}/api/plugins/i18n`)
141
- ok(Boolean(i18n.json?.i18n?.['rag-bridge']?.['zh-CN']), 'i18n 汇编端点可用', Object.keys(i18n.json?.i18n ?? {}).join(','))
142
- }
143
-
144
- // ══ Stage B:真实产线供给(modbus-tcp 驱动)═══════════════════════════
145
- console.log('\n── B 真实产线供给(PLC 模拟器 Modbus TCP 16040)──')
146
- let lineId, dcwNodeId, meltDaqId, spDaqId, recipeId, dcwNodeIds
147
- {
148
- const line = await api('POST', '/api/workshop/dcw/lines', { token: userToken, body: { name: `PLC闭环实测-${TAG}` } })
149
- lineId = env(line)?.line?.id
150
- ok(Boolean(lineId), '产线创建', lineId ?? JSON.stringify(line.json).slice(0, 120))
151
-
152
- const prod = await api('POST', '/api/workshop/dcw/products', { token: userToken, body: { lineId, name: `硅油膜-${TAG}` } })
153
- const productId = env(prod)?.product?.id ?? env(prod)?.id
154
- ok(Boolean(productId), '产品创建', productId ?? '')
155
-
156
- const mb = { host: '127.0.0.1', port: 16040, unitId: 1 }
157
- // 工艺模板/信号模板(控制与数采节点都必须绑定模板)
158
- const tpl = await api('POST', '/api/workshop/dcw/templates', {
159
- token: userToken, body: { name: `加热区SP-${TAG}`, unit: '℃', min: 120, max: 260, decimals: 1, icon: 'thermo' },
160
- })
161
- const dcwTplKey = env(tpl)?.template?.key
162
- ok(Boolean(dcwTplKey), '工艺模板创建(加热区 SP)', dcwTplKey ?? JSON.stringify(tpl.json).slice(0, 120))
163
-
164
- const daqTpl = async (name, unit, min, max, decimals) => {
165
- const r = await api('POST', '/api/workshop/daq/templates', {
166
- token: userToken, body: { name: `${name}-${TAG}`, unit, min, max, decimals, icon: 'thermo' },
167
- })
168
- return env(r)?.template?.key ?? env(r)?.key ?? ''
169
- }
170
- const meltTpl = await daqTpl('熔体温度', '℃', 0, 400, 2)
171
- const spTpl = await daqTpl('SP回读', '℃', 120, 260, 1)
172
- ok(Boolean(meltTpl) && Boolean(spTpl), '数采信号模板创建', `${meltTpl}/${spTpl}`)
173
-
174
- // 三个加热区 SP 节点(40021/40023/40025):闭环实验同时驱动三区,熔温渐近线=210,物理信号清晰
175
- dcwNodeIds = []
176
- for (const [i, reg] of [40021, 40023, 40025].entries()) {
177
- const r = await api('POST', '/api/workshop/dcw', {
178
- token: userToken,
179
- body: { lineId, templateRef: dcwTplKey, name: `加热区${i + 1}SP`, driver: 'modbus-tcp',
180
- driverConfig: { ...mb, register: reg, dataType: 'float32', byteOrder: 'big' }, enabled: true },
181
- })
182
- const nid = env(r)?.node?.id
183
- ok(Boolean(nid), `数控节点创建(写 ${reg})`, nid ?? JSON.stringify(r.json).slice(0, 120))
184
- if (nid) dcwNodeIds.push(nid)
185
- }
186
- dcwNodeId = dcwNodeIds[0]
187
-
188
- const mkDaq = async (name, tplKey, register) => {
189
- const r = await api('POST', '/api/workshop/daq', {
190
- token: userToken,
191
- body: { lineId, templateRef: tplKey, name, driver: 'modbus-tcp',
192
- driverConfig: { ...mb, register, registerType: 'holding', dataType: 'float32', byteOrder: 'big' },
193
- intervalMs: 2000, enabled: true },
194
- })
195
- return env(r)?.node?.id ?? env(r)?.id ?? ''
196
- }
197
- meltDaqId = await mkDaq('熔体温度', meltTpl, 40001)
198
- ok(Boolean(meltDaqId), '数采节点创建(熔体温度 40001)', meltDaqId || JSON.stringify(env(await api('GET', '/api/workshop/daq', { token: userToken }))).slice(0, 0))
199
- spDaqId = await mkDaq('加热区1SP回读', spTpl, 40021)
200
- ok(Boolean(spDaqId), '数采节点创建(SP回读 40021)', spDaqId)
201
-
202
- const recipe = await api('POST', '/api/workshop/dcw/recipes', {
203
- token: userToken,
204
- body: { name: `标准工艺-${TAG}`, productId, params: dcwNodeIds.map(nid => ({ nodeId: nid, value: 200 })) },
205
- })
206
- recipeId = env(recipe)?.recipe?.id ?? env(recipe)?.id
207
- ok(Boolean(recipeId), '配方创建(SP=200 经真实寄存器下发)', recipeId ?? '')
208
- }
209
-
210
- // ══ Stage C:开跑(真实寄存器下发)+ 数采交叉核对 ════════════════════
211
- console.log('\n── C 产线开跑与真实数采交叉核对 ──')
212
- {
213
- const start = await api('POST', `/api/workshop/dcw/lines/${lineId}/start`, { token: userToken, body: { recipeId } })
214
- ok(start.status === 200 && Boolean(env(start)?.run?.id), '产线开跑(配方经 Modbus 真实下发)', start.status === 200 ? `run=${env(start)?.run?.id}` : JSON.stringify(start.json).slice(0, 160))
215
-
216
- await api('POST', '/api/workshop/daq/controller', { token: userToken, body: { action: 'start' } })
217
- await sleep(8000) // 等两个采样节拍
218
-
219
- const nodes = await api('GET', '/api/workshop/daq', { token: userToken })
220
- const all = env(nodes)?.nodes ?? env(nodes) ?? []
221
- const melt = (Array.isArray(all) ? all : []).find(n => n?.id === meltDaqId)
222
- const spN = (Array.isArray(all) ? all : []).find(n => n?.id === spDaqId)
223
- const meltVal = melt?.lastValue ?? melt?.value ?? null
224
- const spVal = spN?.lastValue ?? spN?.value ?? null
225
- ok(meltVal != null, '数采采到真实熔体温度(Modbus 40001)', `value=${meltVal}`)
226
- ok(spVal != null && Math.abs(Number(spVal) - 200) < 1.5, 'SP 回读=200(开跑下发真实生效)', `value=${spVal}`)
227
-
228
- // 与模拟器侧交叉核对
229
- const sim = await raw('GET', `${SIM}/api/nodes`)
230
- const devs = sim.json?.data ?? sim.json ?? []
231
- const extruder = (Array.isArray(devs) ? devs : []).find(d => d?.id === 'dev-extruder-mbtcp')
232
- const sig = (extruder?.signals ?? []).find(s => s?.id === 'melt-temp')
233
- const simMelt = sig?.current ?? sig?.value
234
- // 冷启动暖机阶段熔温爬升快,采样时点差会放大偏差 → 暖机判定放宽到 ±10
235
- ok(simMelt != null && Math.abs(Number(simMelt) - Number(meltVal)) < 10,
236
- 'AW 采样与模拟器寄存器交叉一致(暖机容差)', `aw=${meltVal} sim=${simMelt}`)
237
-
238
- // 暖机门控:等熔温爬到 198+(SP=200 的物理吸引域),保证 D 阶段收敛断言有意义
239
- let warm = false
240
- for (let i = 0; i < 60 && !warm; i++) {
241
- await sleep(5000)
242
- const ns = await api('GET', '/api/workshop/daq', { token: userToken })
243
- const arr2 = env(ns)?.nodes ?? env(ns) ?? []
244
- const m2 = (Array.isArray(arr2) ? arr2 : []).find(n => n?.id === meltDaqId)
245
- const v2 = m2?.lastValue ?? m2?.value ?? null
246
- if (v2 != null && Number(v2) >= 198) warm = true
247
- if (i % 6 === 5) console.log(` … 暖机(${(i + 1) * 5}s):melt=${v2}`)
248
- }
249
- ok(warm, '暖机门控:熔温进入 SP=200 吸引域(≥198)')
250
- }
251
-
252
- // ══ Stage D:闭环写控(HITL → 真实 Modbus 写 → 物理跟随)══════════════
253
- console.log('\n── D 闭环写控(熔温调控:SP 200 → 202)──')
254
- {
255
- for (const nid of dcwNodeIds) {
256
- const bind = await api('POST', '/api/workshop/agent-tools/bindings', {
257
- token: userToken, body: { agentId: exec.id, nodeId: nid, kind: 'dcw', mode: 'manual' },
258
- })
259
- ok(bind.status === 200, `执行器绑定 DCW 节点(manual) ${nid}`, `mode=${env(bind)?.binding?.mode}`)
260
- }
261
-
262
- // 三区并发发起(每区独立 HITL);审批轮询循环消费全部待办
263
- const writes = dcwNodeIds.map((nid, idx) => invoke(exec, 'dcw_control', {
264
- node_id: nid, value: 210,
265
- hypothesis: `熔温调控闭环实测:加热区${idx + 1}SP 200→210,观察熔体跟随`,
266
- }, 300000))
267
- let approvedAll = 0
268
- for (let i = 0; i < 45 && approvedAll < dcwNodeIds.length; i++) {
269
- await sleep(2000)
270
- const pend = await api('GET', '/api/workshop/hitl/pending', { token: userToken })
271
- const pd = env(pend)
272
- const arr = Array.isArray(pd) ? pd : (pd?.items ?? pd?.pending ?? [])
273
- for (const item of arr.filter(x => x?.kind === 'dcw-approval' && x?.agentId === exec.id)) {
274
- const resp = await api('POST', '/api/workshop/hitl/respond', { token: userToken, body: { kind: 'dcw-approval', id: item.id, confirmed: true, comment: 'plc-e2e 批准' } })
275
- if (resp.status === 200) approvedAll++
276
- }
277
- }
278
- const writeTexts = []
279
- for (const w of writes) writeTexts.push(resultText(await w))
280
- ok(approvedAll >= dcwNodeIds.length, `HITL 待办全部出现并批准(${dcwNodeIds.length} 区)`, `approved=${approvedAll}`)
281
- ok(writeTexts.every(t => t.includes('回读一致')), `${dcwNodeIds.length} 区 dcw_control 均经真实 Modbus 写入且回读一致`, writeTexts[0].slice(0, 100))
282
-
283
- // 模拟器侧确认寄存器真的变成 202
284
- const sim = await raw('GET', `${SIM}/api/nodes`)
285
- const devs = sim.json?.data ?? sim.json ?? []
286
- const extruder = (Array.isArray(devs) ? devs : []).find(d => d?.id === 'dev-extruder-mbtcp')
287
- const z1 = (extruder?.signals ?? []).find(s => s?.id === 'zone1-sp')
288
- const simSp = z1?.current ?? z1?.value
289
- ok(Math.abs(Number(simSp) - 210) < 0.5, '模拟器寄存器 40021 实际=210(真实写穿)', `sim zone1-sp=${simSp}`)
290
- const z2 = (extruder?.signals ?? []).find(s => s?.id === 'zone2-sp')
291
- const z3 = (extruder?.signals ?? []).find(s => s?.id === 'zone3-sp')
292
- ok(Math.abs(Number(z2?.current ?? z2?.value) - 210) < 0.5 && Math.abs(Number(z3?.current ?? z3?.value) - 210) < 0.5, '寄存器 40023/40025 同步=210')
293
-
294
- // 物理跟随:熔温向新 SP(210)收敛。暖机后在 200 附近,三区渐近线抬升约 3.3℃
295
- let meltBefore
296
- {
297
- const nodes0 = await api('GET', '/api/workshop/daq', { token: userToken })
298
- const arr0 = env(nodes0)?.nodes ?? env(nodes0) ?? []
299
- const m0 = (Array.isArray(arr0) ? arr0 : []).find(n => n?.id === meltDaqId)
300
- meltBefore = Number(m0?.lastValue ?? m0?.value ?? 0)
301
- }
302
- let meltAfter = null
303
- for (let i = 0; i < 100; i++) {
304
- await sleep(6000)
305
- const nodes = await api('GET', '/api/workshop/daq', { token: userToken })
306
- const all = env(nodes)?.nodes ?? env(nodes) ?? []
307
- const melt = (Array.isArray(all) ? all : []).find(n => n?.id === meltDaqId)
308
- meltAfter = melt?.lastValue ?? melt?.value ?? null
309
- if (meltAfter != null && Number(meltAfter) >= meltBefore + 3) break
310
- }
311
- // 三区渐近线 ≈210(从 ~200.5 起),热惯性下 10 分钟内抬升应远超 1.5℃
312
- const risen = meltAfter != null && Number(meltAfter) >= meltBefore + 1.5
313
- ok(risen, '熔体温度向新 SP 收敛(闭环物理生效)', `before=${meltBefore} after=${meltAfter}`)
314
-
315
- // 判定 keep:找到最新 open 优化记录
316
- const opts = await api('GET', '/api/workshop/dcw/optimizations', { token: userToken })
317
- const recs = env(opts)?.records ?? env(opts) ?? []
318
- const openRec = (Array.isArray(recs) ? recs : []).find(r => r?.nodeId === dcwNodeId && (r?.status === 'open' || r?.judge == null))
319
- if (openRec?.id) {
320
- const j = await invoke(exec, 'dcw_judge', { record_id: openRec.id, verdict: 'keep', reason: '熔温跟随达标,判 keep(plc-e2e)' }, 60000)
321
- ok(!j.json?.result?.isError, 'dcw_judge 落 keep 判定', resultText(j).slice(0, 80))
322
- }
323
- else {
324
- ok(false, '找到 open 优化记录以判定', JSON.stringify(recs).slice(0, 120))
325
- }
326
- }
327
-
328
- // ══ Stage E:知识闭环 ═══════════════════════════════════════════════
329
- console.log('\n── E 知识闭环(经验沉淀/检索 + 诊断自动入库)──')
330
- {
331
- // 两段都依赖**外部服务**,缺一即为"测试没准备好"而非产品缺陷 —— 按项目约定显式 SKIP
332
- // (环境不具备宁可 skip 并写明原因,绝不伪造通过):
333
- // · rag :kb_agent 需要 rag-knowledge 的 **web**(kb agent chat,claude SDK);
334
- // · diag:需要工业深度诊断服务(:3210)。
335
- const kbHealth = await raw('GET', `${KB}/api/v1/health`).catch(() => null)
336
- const kbWebUrl = String(env(await api('GET', '/api/system/settings', { token: userToken }))?.effective?.['plugins.rag-bridge.web_url'] ?? '')
337
- // 必须 **200** 才算可达:401/403 说明"服务在但没凭据",kb_agent 仍会失败,不能当就绪
338
- const kbWebReachable = kbWebUrl ? await raw('GET', `${kbWebUrl}/api/health`).then(r => r.status === 200).catch(() => false) : false
339
- const ragReady = kbHealth?.json?.status === 'healthy' && kbWebReachable
340
- const diagHealth = await raw('GET', `${DIAG}/api/health`).catch(() => null)
341
- const diagReady = diagHealth?.json?.status === 'ok'
342
-
343
- const marker = `PLC闭环实测${TAG}:SP 上调 2℃ 后熔体温度跟随收敛,判定 keep`
344
- if (!ragReady) {
345
- console.log(` SKIP rag 知识闭环(经验沉淀/检索)— 需要 rag-knowledge web(kb agent chat):KB health=${kbHealth?.json?.status ?? 'unreachable'} web=${kbWebUrl || '(未配置)'} reachable=${kbWebReachable}`)
346
- }
347
- else {
348
- // rag-bridge 的对外工具面是**单入口** kb_agent(旧 kb_store/kb_search/kb_index 已随
349
- // "功能解耦"重构下线):入库用 async,检索用 sync 并等待最终回复。
350
- const store = await invoke(exec, 'kb_agent', {
351
- mode: 'async',
352
- prompt: `请把下面这条经验沉淀进知识库(库名 aw-industrial,标题「plc-e2e 经验:${TAG} 熔温调控」):`
353
- + `类别 optimization;问题「熔体温度偏低需要上调」;解决方案「${marker}」;标签 plc-e2e,闭环。`,
354
- }, 120000)
355
- ok(!/未知工具|不支持|不可用|失败|错误/.test(resultText(store)), 'kb_agent 经验沉淀(async 提交)', resultText(store).slice(0, 90))
356
- let hit = ''
357
- for (let i = 0; i < 8 && !hit; i++) {
358
- await sleep(4000)
359
- const s = await invoke(exec, 'kb_agent', { mode: 'sync', prompt: `检索:${marker}` }, 300000)
360
- const text = resultText(s)
361
- if (!text.startsWith('未检索到') && !/未知工具|不支持|不可用|失败|错误/.test(text)) hit = text
362
- }
363
- ok(hit.length > 0, 'kb_agent 命中刚沉淀经验', hit.split('\n')[1]?.slice(0, 90) ?? '')
364
- }
365
-
366
- if (!diagReady) {
367
- console.log(` SKIP 诊断闭环(diag_run → completed → 自动入库 → 检索)— 诊断服务不可达:${DIAG}/api/health=${diagHealth?.json?.status ?? 'unreachable'}`)
368
- }
369
- else {
370
- // 诊断(mock 引擎,分钟级):先清线上在跑诊断(防收养长跑 omp),显式 mock,发起→completed→入库→检索
371
- // 鉴权用持久化 API Token(idd_;会话 JWT 的密钥/会话态可能随服务重启失效)
372
- const diagToken = env(await api('GET', '/api/system/settings', { token: userToken }))?.effective?.['plugins.diag-bridge.token'] ?? ''
373
- const dreq = (path, method = 'GET') => raw(method, `${DIAG}${path}`, { token: diagToken, timeoutMs: 20000 })
374
- {
375
- const list = await dreq('/api/diagnosis/list')
376
- const runs = list.json?.data ?? []
377
- for (const r of runs.filter(x => x?.status === 'running')) {
378
- await dreq(`/api/diagnosis/stop/${encodeURIComponent(r.runId ?? r.id)}`, 'POST').catch(() => {})
379
- }
380
- }
381
- const adminSnap = await api('GET', '/api/system/settings', { token: userToken })
382
- const prevHarness = env(adminSnap)?.effective?.['plugins.diag-bridge.harness'] ?? ''
383
- await api('PATCH', '/api/system/settings', { token: userToken, body: { override: { 'plugins.diag-bridge.harness': 'mock' } } })
384
- let runId = ''
385
- const r = await invoke(exec, 'diag_run', { line: lineId ?? LINE, from_ms: Date.now() - 30 * 60_000, to_ms: Date.now(), question: `${LINE} PLC 闭环实测时窗诊断(plc-e2e)`, scene: 'plc_e2e' }, 120000)
386
- runId = (resultText(r).match(/runId=([a-z0-9-]+)/i) ?? [])[1] ?? ''
387
- if (!runId) {
388
- const adopted = (resultText(r).match(/run_id=([a-z0-9-]+)/i) ?? [])[1] ?? ''
389
- if (adopted) runId = adopted
390
- }
391
- ok(Boolean(runId), 'diag_run 发起(mock 引擎)', runId || resultText(r).slice(0, 100))
392
- if (runId) {
393
- let done = false
394
- let last = ''
395
- for (let i = 0; i < 30 && !done; i++) {
396
- await sleep(15_000)
397
- const s = await invoke(exec, 'diag_status', { run_id: runId }, 30000)
398
- last = resultText(s)
399
- if (/状态=completed/.test(last)) done = true
400
- else if (/状态=(failed|stopped)/.test(last)) break
401
- }
402
- ok(done, '诊断跑至 completed', (last.match(/评分=\S+/g) ?? []).join(' '))
403
- if (done) {
404
- let stored = false
405
- for (let i = 0; i < 24 && !stored; i++) {
406
- await sleep(10_000)
407
- const runs = await api('GET', '/api/plugins/diag-bridge/runs', { token: userToken })
408
- const mine = (runs.json?.runs ?? []).find(x => x.runId === runId)
409
- if (mine?.stored === true) stored = true
410
- }
411
- ok(stored, '诊断报告自动入库')
412
- let kbHit = ''
413
- for (let i = 0; i < 8 && !kbHit; i++) {
414
- await sleep(5000)
415
- const s = await invoke(exec, 'kb_agent', { mode: 'sync', prompt: `检索:plc_e2e ${runId.slice(0, 8)} 诊断报告` }, 300000)
416
- if (!resultText(s).startsWith('未检索到')) kbHit = resultText(s)
417
- }
418
- ok(kbHit.length > 0, 'kb_agent 命中诊断报告', kbHit.split('\n')[1]?.slice(0, 90) ?? '')
419
- }
420
- }
421
- await api('PATCH', '/api/system/settings', { token: userToken, body: { override: { 'plugins.diag-bridge.harness': prevHarness } } })
422
- }
423
- }
424
-
425
- // ══ Stage F:插件参数回归(逐键热生效→复原)══════════════════════════
426
- console.log('\n── F 插件参数配置回归 ──')
427
- {
428
- // admin 夹具
429
- const areg = await api('POST', '/api/workshop/users/register', { body: { name: `plc-admin-${TAG}` } })
430
- const atok = env(areg)?.token ?? ''
431
- {
432
- const db = new DatabaseSync(join(resolve('.'), '.AgentWorkShop', 'data', 'users.sqlite'))
433
- db.exec('PRAGMA busy_timeout=4000')
434
- db.prepare('UPDATE users SET role = \'admin\' WHERE id = ?').run(env(areg)?.id ?? '')
435
- db.close()
436
- }
437
- const snap0 = await api('GET', '/api/system/settings', { token: atok })
438
- const eff0 = env(snap0)?.effective ?? {}
439
- const orig = {}
440
- for (const k of ['plugins.rag-bridge.base_url', 'plugins.rag-bridge.web_url', 'plugins.rag-bridge.token', 'plugins.diag-bridge.base_url', 'plugins.diag-bridge.token', 'plugins.diag-bridge.harness', 'plugins.diag-bridge.max_turns', 'plugins.diag-bridge.max_minutes', 'plugins.diag-bridge.auto_enabled', 'plugins.diag-bridge.auto_rules']) {
441
- orig[k] = eff0[k]
442
- }
443
- const patchSet = async obj => api('PATCH', '/api/system/settings', { token: atok, body: { override: obj } })
444
- const healthOf = async n => (await raw('GET', `${BASE}/api/plugins/${n}/health`, { token: userToken })).json
445
-
446
- // ① diag 热效可见键:harness / auto_enabled / max_turns
447
- const r1 = await patchSet({ 'plugins.diag-bridge.harness': 'mock', 'plugins.diag-bridge.auto_enabled': true, 'plugins.diag-bridge.max_turns': 123 })
448
- ok(r1.status === 200, 'PATCH 三个 diag 键成功')
449
- let h1 = await healthOf('diag-bridge')
450
- ok(h1?.harness === 'mock' && h1?.auth === 'bearer', 'diag-bridge health 即时反映 harness 切换', `harness=${h1?.harness} auth=${h1?.auth}`)
451
- let snap1 = env(await api('GET', '/api/system/settings', { token: atok }))?.effective ?? {}
452
- ok(snap1['plugins.diag-bridge.max_turns'] === 123 && snap1['plugins.diag-bridge.auto_enabled'] === true, 'max_turns/auto_enabled 生效值可读')
453
-
454
- // ② rag 热效可见键:base_url 切到模拟器端口(必然失败)→ 恢复
455
- await patchSet({ 'plugins.rag-bridge.base_url': 'http://127.0.0.1:59999' })
456
- let h2 = await healthOf('rag-bridge')
457
- ok(h2?.backend?.ok === false && String(h2?.backend?.url).endsWith('59999'), 'rag base_url 热切换生效(指向坏端口→探活失败)')
458
- await patchSet({ 'plugins.rag-bridge.base_url': orig['plugins.rag-bridge.base_url'] })
459
- let h3 = await healthOf('rag-bridge')
460
- ok(h3?.backend?.ok === true, '恢复 base_url → 探活恢复', `url=${h3?.backend?.url}`)
461
-
462
- // ③ token 热效:换成错误 token → catalog 401 → 恢复
463
- await patchSet({ 'plugins.rag-bridge.token': 'wrong-token-for-regression' })
464
- let h4 = await healthOf('rag-bridge')
465
- // web catalog 带 token → 401 → web.ok=false;kb.id 可能保留旧值
466
- ok(h4?.web?.ok === false || h4?.backend?.ok === false, '错误 token 热生效(出站 401)')
467
- await patchSet({ 'plugins.rag-bridge.token': orig['plugins.rag-bridge.token'] })
468
- let h5 = await healthOf('rag-bridge')
469
- ok(h5?.web?.ok === true && h5?.kb?.id, '恢复 token → 出站恢复')
470
-
471
- // ④ diag token 热效:diag /api/health 是公开端点,健康路由不反映 token ——
472
- // 改为配置层断言(生效值可读),出站鉴权行为已由 Stage E 的 diag_run 全链验证
473
- await patchSet({ 'plugins.diag-bridge.token': 'wrong-diag-token-regression' })
474
- const effDiag = env(await api('GET', '/api/system/settings', { token: atok }))?.effective ?? {}
475
- ok(effDiag['plugins.diag-bridge.token'] === 'wrong-diag-token-regression', 'diag token 热写生效(配置层)')
476
- await patchSet({ 'plugins.diag-bridge.token': orig['plugins.diag-bridge.token'] })
477
- const effDiag2 = env(await api('GET', '/api/system/settings', { token: atok }))?.effective ?? {}
478
- ok(effDiag2['plugins.diag-bridge.token'] === orig['plugins.diag-bridge.token'], '恢复 diag token(配置层)')
479
-
480
- // ⑤ 全量复原 + auto_enabled 保持关闭(防误触发自动诊断)
481
- const restore = {}
482
- for (const [k, v] of Object.entries(orig)) if (v !== undefined) restore[k] = v
483
- restore['plugins.diag-bridge.auto_enabled'] = false
484
- restore['plugins.diag-bridge.harness'] = orig['plugins.diag-bridge.harness'] ?? ''
485
- restore['plugins.diag-bridge.max_turns'] = orig['plugins.diag-bridge.max_turns'] ?? 0
486
- restore['plugins.diag-bridge.max_minutes'] = orig['plugins.diag-bridge.max_minutes'] ?? 0
487
- await patchSet(restore)
488
- const snapEnd = env(await api('GET', '/api/system/settings', { token: atok }))?.effective ?? {}
489
- ok(snapEnd['plugins.diag-bridge.auto_enabled'] === false && (snapEnd['plugins.diag-bridge.harness'] ?? '') === (orig['plugins.diag-bridge.harness'] ?? ''), '全部参数复原(auto_enabled 关闭防误触发)')
490
- console.log(' · 复原快照:', JSON.stringify({
491
- rag: snapEnd['plugins.rag-bridge.base_url'],
492
- diag: snapEnd['plugins.diag-bridge.base_url'],
493
- harness: snapEnd['plugins.diag-bridge.harness'] ?? '',
494
- }))
495
- }
496
-
497
- // ══ Stage G:Channel 级插件开关(点对点复核)══════════════════════════
498
- console.log('\n── G Channel 级插件开关 ──')
499
- {
500
- const ch = await api('POST', '/api/workshop/channels', { token: userToken, body: { name: `PLC开关频道-${TAG}` } })
501
- const channelId = env(ch)?.channelId
502
- ok(Boolean(channelId), '测试频道创建')
503
- const tpl = await api('POST', '/api/workshop/agents', { token: userToken, body: { name: `开关执行器-${TAG}`, harness: 'mock' } })
504
- const tplId = env(tpl)?.id
505
- const add = await api('POST', `/api/workshop/channels/${channelId}/agents`, { token: userToken, body: { name: env(tpl)?.name, harness: 'mock', templateId: tplId, role: 'worker' } })
506
- const member = env(add)?.agent ?? env(add)
507
- ok(Boolean(member?.id && member?.token), 'mock 成员加入频道')
508
- if (member?.id && channelId) {
509
- const off = await api('PUT', `/api/workshop/channels/${channelId}/plugins`, { token: userToken, body: { plugins: [{ name: 'rag-bridge', enabled: false }, { name: 'diag-bridge', enabled: true }] } })
510
- ok(off.status === 200, 'PUT 关闭 rag-bridge')
511
- const list1 = await api('GET', `/api/workshop/agent-tools/list?agentId=${member.id}`, { agent: member })
512
- const names1 = (list1?.json?.data?.tools ?? list1?.json?.tools ?? []).map(t => t?.name)
513
- // rag-bridge 的对外工具面已收敛为**单入口** `kb_agent`(+ kb_agent_status);
514
- // kb_search/kb_store/kb_index 是旧工具名,已不存在 —— 断言必须跟着当前事实源走。
515
- const RAG_TOOL = 'kb_agent'
516
- ok(!names1.includes(RAG_TOOL), '关闭插件工具不注入')
517
- ok(names1.includes('diag_run'), '开启插件工具注入')
518
- const denied = await invoke(member, RAG_TOOL, { prompt: 'x' }, 30000)
519
- ok(resultText(denied).includes('未启用插件'), 'dispatch 同源拒绝', resultText(denied).slice(0, 60))
520
- await api('PUT', `/api/workshop/channels/${channelId}/plugins`, { token: userToken, body: { plugins: [{ name: 'rag-bridge', enabled: true }, { name: 'diag-bridge', enabled: true }] } })
521
- let back = false
522
- for (let i = 0; i < 8 && !back; i++) {
523
- await sleep(1000)
524
- const list2 = await api('GET', `/api/workshop/agent-tools/list?agentId=${member.id}`, { agent: member })
525
- if (((list2?.json?.data?.tools ?? list2?.json?.tools ?? []).map(t => t?.name)).includes(RAG_TOOL)) back = true
526
- }
527
- ok(back, '重开后工具恢复')
528
- }
529
- }
530
-
531
- // ══ Stage H:Harness 集成面 ═════════════════════════════════════════
532
- console.log('\n── H Harness 集成面 ──')
533
- {
534
- const list = await api('GET', `/api/workshop/agent-tools/list?agentId=${exec.id}`, { agent: exec })
535
- const names = (list?.json?.data?.tools ?? list?.json?.tools ?? []).map(t => t?.name)
536
- // rag 侧工具面已收敛为单入口 kb_agent(+kb_agent_status);diag 侧仍是 diag_run/diag_status
537
- for (const t of ['kb_agent', 'kb_agent_status', 'diag_run', 'diag_status']) ok(names.includes(t), `omp 执行器工具清单含 ${t}`)
538
- for (const t of ['daq_query', 'dcw_control', 'dcw_judge', 'line_context']) ok(names.includes(t), `omp 执行器工业工具含 ${t}`)
539
- const ctxT = await invoke(exec, 'line_context', {}, 60000)
540
- ok(!resultText(ctxT).startsWith('工具') || resultText(ctxT).length > 0, 'line_context 可用(工业链路)', resultText(ctxT).slice(0, 60))
541
- }
542
-
543
- // ══ 汇总 ═══════════════════════════════════════════════════════════
544
- console.log(`\n══ 结果:${pass} 通过 / ${fail} 失败 ══`)
545
- if (failures.length) {
546
- console.error('失败项:')
547
- for (const f of failures) console.error(` - ${f}`)
548
- }
549
- process.exit(fail > 0 ? 1 : 0)
1
+ /**
2
+ * 真实 PLC 闭环实测 — PLC 模拟器(挤出流延数字孪生) × AgentTeam × rag-knowledge × 深度诊断
3
+ *
4
+ * 前置:PLC 模拟器运行中(API 4010;Modbus TCP 16040:40001=熔体温度/40021=加热区1SP,float32 big)
5
+ * AW 3001 生产实例;rag-knowledge(KB_BASE);诊断服务(DIAG);两桥接插件启用且 token 已配置。
6
+ *
7
+ * Stage A 服务与插件健康 Stage E 知识闭环(kb_store/kb_search + 诊断自动入库)
8
+ * Stage B 真实产线供给 Stage F 插件参数回归(逐键热生效→复原)
9
+ * Stage C 真实数采交叉核对 Stage G Channel 级插件开关
10
+ * Stage D 闭环写控(HITL) Stage H Harness 集成面
11
+ *
12
+ * 运行:NO_PROXY='*' AW_BASE=http://127.0.0.1:3001 KB_BASE=http://127.0.0.1:8771 \
13
+ * AW_E2E_TOKEN=<token> node scripts/e2e-plc-plugin-closedloop.mjs
14
+ */
15
+ import { DatabaseSync } from 'node:sqlite'
16
+ import { join, resolve } from 'node:path'
17
+
18
+ const BASE = process.env.AW_BASE ?? 'http://127.0.0.1:3001'
19
+ const KB = process.env.KB_BASE ?? 'http://127.0.0.1:8771'
20
+ const DIAG = process.env.DIAG_BASE ?? 'http://127.0.0.1:3210'
21
+ const SIM = process.env.SIM_BASE ?? 'http://127.0.0.1:4010'
22
+ const LINE = process.env.E2E_LINE ?? 'ln-af002514'
23
+ const TAG = Date.now().toString(36)
24
+ const sleep = ms => new Promise(r => setTimeout(r, ms))
25
+
26
+ let pass = 0
27
+ let fail = 0
28
+ const failures = []
29
+ function ok(cond, label, detail = '') {
30
+ if (cond) {
31
+ pass++
32
+ console.log(` ✔ ${label}${detail ? ` —— ${detail}` : ''}`)
33
+ }
34
+ else {
35
+ fail++
36
+ failures.push(label)
37
+ console.error(` ✘ ${label}${detail ? ` —— ${detail}` : ''}`)
38
+ }
39
+ }
40
+
41
+ async function raw(method, url, { body, token, agent, timeoutMs = 30000 } = {}) {
42
+ const headers = {}
43
+ if (body !== undefined) headers['content-type'] = 'application/json'
44
+ if (token) headers.authorization = `Bearer ${token}`
45
+ if (agent) headers['x-aw-agent-token'] = agent.token
46
+ try {
47
+ const res = await fetch(url, { method, headers, body: body !== undefined ? JSON.stringify(body) : undefined, signal: AbortSignal.timeout(timeoutMs) })
48
+ return { status: res.status, json: await res.json().catch(() => null) }
49
+ }
50
+ catch (e) { return { status: 0, json: { error: String(e) } } }
51
+ }
52
+ const api = (method, path, opts = {}) => raw(method, `${BASE}${path}`, opts)
53
+ const env = r => r?.json?.data ?? r?.json
54
+ const resultText = r => String(r?.json?.data?.result?.text ?? '')
55
+ const invoke = (agent, tool, args, timeoutMs = 120000) => api('POST', '/api/workshop/agent-tools/invoke', { agent, timeoutMs, body: { agentId: agent.id, tool, args } })
56
+
57
+ // ── 0. 用户(夹具:line operate 授权 + admin)─────────────────────────────
58
+ let userToken = process.env.AW_E2E_TOKEN ?? ''
59
+ if (!userToken) {
60
+ const reg = await api('POST', '/api/workshop/users/register', { body: { name: `plc-e2e-${TAG}` } })
61
+ userToken = env(reg)?.token ?? ''
62
+ }
63
+ ok(Boolean(userToken), 'e2e 用户 token 就绪')
64
+ {
65
+ const me = await api('GET', '/api/workshop/users/me', { token: userToken })
66
+ const myId = env(me)?.id ?? ''
67
+ ok(Boolean(myId), 'token 反查用户 id', myId)
68
+ // 夹具库路径:默认仓库模式(.AgentWorkShop/data);隔离实例(AW_MODE=home)用
69
+ // AW_E2E_USERS_DB 指向该实例的 users.sqlite —— 否则夹具写进另一个库,
70
+ // 被测用户在该实例里既不是 admin 也没有产线授权(后续 DCW/HITL 段全 403)。
71
+ const usersDb = process.env.AW_E2E_USERS_DB ?? join(resolve('.'), '.AgentWorkShop', 'data', 'users.sqlite')
72
+ const db = new DatabaseSync(usersDb)
73
+ db.exec('PRAGMA busy_timeout=4000')
74
+ if (myId) {
75
+ db.prepare(`INSERT OR REPLACE INTO user_line_grants (user_id, line_id, mode, granted_by, granted_at) VALUES (?, ?, 'operate', 'plc-e2e', ?)`)
76
+ .run(myId, LINE, new Date().toISOString())
77
+ db.prepare('UPDATE users SET role = \'admin\' WHERE id = ?').run(myId)
78
+ }
79
+ db.close()
80
+ console.log(` · 夹具:授产线 operate + admin(${myId})@${usersDb}`)
81
+ }
82
+
83
+ // omp 执行器:必须挂在**本用户自有频道**下 —— HITL 待办按 channel 所有权过滤,
84
+ // 用别人的频道成员 invoke 时审批待办对本用户不可见(权限域语义,非缺陷)
85
+ let exec = null
86
+ {
87
+ const ch = await api('POST', '/api/workshop/channels', { token: userToken, body: { name: `PLC闭环频道-${TAG}` } })
88
+ const channelId = env(ch)?.channelId
89
+ const tpl = await api('POST', '/api/workshop/agents', { token: userToken, body: { name: `PLC执行器-${TAG}`, harness: 'omp' } })
90
+ const tplId = env(tpl)?.id
91
+ const add = await api('POST', `/api/workshop/channels/${channelId}/agents`, { token: userToken, body: { name: env(tpl)?.name, harness: 'omp', templateId: tplId, role: 'worker' } })
92
+ const member = env(add)?.agent ?? env(add)
93
+ if (member?.id && member?.token) exec = { id: member.id, name: member.name, token: member.token }
94
+ }
95
+ ok(Boolean(exec?.token), 'omp 执行器成员就绪(自有频道)', exec?.name ?? '')
96
+ // 无 env 时:临时账号 → 会话 → 铸 idd_ token(脚本内完成,幂等)
97
+ {
98
+ const cur = env(await api('GET', '/api/system/settings', { token: userToken }))?.effective?.['plugins.diag-bridge.token'] ?? ''
99
+ if (!cur.startsWith('idd_')) {
100
+ const iu = `plce2e_${TAG}`
101
+ const ipw = `Xy${TAG}ab9`
102
+ await raw('POST', `${DIAG}/api/auth/register`, { body: { username: iu, password: ipw, email: `${iu}@e2e.local` } })
103
+ const login = await raw('POST', `${DIAG}/api/auth/login`, { body: { username: iu, password: ipw } })
104
+ const session = login.json?.data?.session_token ?? ''
105
+ if (session) {
106
+ const tk = await raw('POST', `${DIAG}/api/auth/tokens`, { token: session, body: { name: `plc-e2e-${TAG}` } })
107
+ const idd = tk.json?.data?.token ?? ''
108
+ if (idd.startsWith('idd_')) {
109
+ await api('PATCH', '/api/system/settings', { token: userToken, body: { override: { 'plugins.diag-bridge.token': idd } } })
110
+ console.log(' · 夹具:diag token 已更换为持久化 idd_ API Token(重启不失效)')
111
+ }
112
+ else {
113
+ console.log(` ! idd_ token 铸造失败:${JSON.stringify(tk.json).slice(0, 120)}`)
114
+ }
115
+ }
116
+ }
117
+ }
118
+
119
+ // ══ Stage A:服务与插件健康 ════════════════════════════════════════
120
+ console.log('\n── A 服务与插件健康 ──')
121
+ {
122
+ const kbH = await raw('GET', `${KB}/api/v1/health`)
123
+ ok(kbH.json?.status === 'healthy', 'rag-knowledge healthy', JSON.stringify(kbH.json))
124
+ const dgH = await raw('GET', `${DIAG}/api/health`)
125
+ ok(dgH.json?.status === 'ok', '诊断服务 healthy', `activeRuns=${dgH.json?.checks?.activeRuns}`)
126
+ const simH = await raw('GET', `${SIM}/api/nodes`)
127
+ ok(simH.status === 200, 'PLC 模拟器 API 可达', `${JSON.stringify(simH.json).length} bytes`)
128
+ const plugs = await api('GET', '/api/workshop/plugins', { token: userToken })
129
+ const list = plugs.json?.plugins ?? env(plugs)?.plugins ?? []
130
+ const bridge = n => list.find(p => p?.name === n) ?? {}
131
+ ok(bridge('rag-bridge').enabled === true && bridge('diag-bridge').enabled === true, '两桥接插件启用')
132
+ ok(bridge('rag-bridge').hasClient === true && bridge('diag-bridge').hasClient === true, '两插件含浏览器面板')
133
+ ok(bridge('rag-bridge').hasI18n === true && bridge('diag-bridge').hasI18n === true, '两插件含 i18n 包')
134
+ ok((bridge('rag-bridge').settingsCount ?? 0) >= 3 && (bridge('diag-bridge').settingsCount ?? 0) >= 7, '插件设置描述符已注册', `rag=${bridge('rag-bridge').settingsCount} diag=${bridge('diag-bridge').settingsCount}`)
135
+ const snap = await api('GET', '/api/system/settings', { token: userToken })
136
+ const keys = (env(snap)?.descriptors ?? []).map(d => d.key)
137
+ ok(keys.includes('plugins.rag-bridge.token') && keys.includes('plugins.diag-bridge.harness'), '设置快照含插件描述符')
138
+ const noAuth = await raw('GET', `${BASE}/api/plugins/rag-bridge/health`)
139
+ ok(noAuth.status === 401, '插件路由鉴权门', `status=${noAuth.status}`)
140
+ const i18n = await raw('GET', `${BASE}/api/plugins/i18n`)
141
+ ok(Boolean(i18n.json?.i18n?.['rag-bridge']?.['zh-CN']), 'i18n 汇编端点可用', Object.keys(i18n.json?.i18n ?? {}).join(','))
142
+ }
143
+
144
+ // ══ Stage B:真实产线供给(modbus-tcp 驱动)═══════════════════════════
145
+ console.log('\n── B 真实产线供给(PLC 模拟器 Modbus TCP 16040)──')
146
+ let lineId, dcwNodeId, meltDaqId, spDaqId, recipeId, dcwNodeIds
147
+ {
148
+ const line = await api('POST', '/api/workshop/dcw/lines', { token: userToken, body: { name: `PLC闭环实测-${TAG}` } })
149
+ lineId = env(line)?.line?.id
150
+ ok(Boolean(lineId), '产线创建', lineId ?? JSON.stringify(line.json).slice(0, 120))
151
+
152
+ const prod = await api('POST', '/api/workshop/dcw/products', { token: userToken, body: { lineId, name: `硅油膜-${TAG}` } })
153
+ const productId = env(prod)?.product?.id ?? env(prod)?.id
154
+ ok(Boolean(productId), '产品创建', productId ?? '')
155
+
156
+ const mb = { host: '127.0.0.1', port: 16040, unitId: 1 }
157
+ // 工艺模板/信号模板(控制与数采节点都必须绑定模板)
158
+ const tpl = await api('POST', '/api/workshop/dcw/templates', {
159
+ token: userToken, body: { name: `加热区SP-${TAG}`, unit: '℃', min: 120, max: 260, decimals: 1, icon: 'thermo' },
160
+ })
161
+ const dcwTplKey = env(tpl)?.template?.key
162
+ ok(Boolean(dcwTplKey), '工艺模板创建(加热区 SP)', dcwTplKey ?? JSON.stringify(tpl.json).slice(0, 120))
163
+
164
+ const daqTpl = async (name, unit, min, max, decimals) => {
165
+ const r = await api('POST', '/api/workshop/daq/templates', {
166
+ token: userToken, body: { name: `${name}-${TAG}`, unit, min, max, decimals, icon: 'thermo' },
167
+ })
168
+ return env(r)?.template?.key ?? env(r)?.key ?? ''
169
+ }
170
+ const meltTpl = await daqTpl('熔体温度', '℃', 0, 400, 2)
171
+ const spTpl = await daqTpl('SP回读', '℃', 120, 260, 1)
172
+ ok(Boolean(meltTpl) && Boolean(spTpl), '数采信号模板创建', `${meltTpl}/${spTpl}`)
173
+
174
+ // 三个加热区 SP 节点(40021/40023/40025):闭环实验同时驱动三区,熔温渐近线=210,物理信号清晰
175
+ dcwNodeIds = []
176
+ for (const [i, reg] of [40021, 40023, 40025].entries()) {
177
+ const r = await api('POST', '/api/workshop/dcw', {
178
+ token: userToken,
179
+ body: { lineId, templateRef: dcwTplKey, name: `加热区${i + 1}SP`, driver: 'modbus-tcp',
180
+ driverConfig: { ...mb, register: reg, dataType: 'float32', byteOrder: 'big' }, enabled: true },
181
+ })
182
+ const nid = env(r)?.node?.id
183
+ ok(Boolean(nid), `数控节点创建(写 ${reg})`, nid ?? JSON.stringify(r.json).slice(0, 120))
184
+ if (nid) dcwNodeIds.push(nid)
185
+ }
186
+ dcwNodeId = dcwNodeIds[0]
187
+
188
+ const mkDaq = async (name, tplKey, register) => {
189
+ const r = await api('POST', '/api/workshop/daq', {
190
+ token: userToken,
191
+ body: { lineId, templateRef: tplKey, name, driver: 'modbus-tcp',
192
+ driverConfig: { ...mb, register, registerType: 'holding', dataType: 'float32', byteOrder: 'big' },
193
+ intervalMs: 2000, enabled: true },
194
+ })
195
+ return env(r)?.node?.id ?? env(r)?.id ?? ''
196
+ }
197
+ meltDaqId = await mkDaq('熔体温度', meltTpl, 40001)
198
+ ok(Boolean(meltDaqId), '数采节点创建(熔体温度 40001)', meltDaqId || JSON.stringify(env(await api('GET', '/api/workshop/daq', { token: userToken }))).slice(0, 0))
199
+ spDaqId = await mkDaq('加热区1SP回读', spTpl, 40021)
200
+ ok(Boolean(spDaqId), '数采节点创建(SP回读 40021)', spDaqId)
201
+
202
+ const recipe = await api('POST', '/api/workshop/dcw/recipes', {
203
+ token: userToken,
204
+ body: { name: `标准工艺-${TAG}`, productId, params: dcwNodeIds.map(nid => ({ nodeId: nid, value: 200 })) },
205
+ })
206
+ recipeId = env(recipe)?.recipe?.id ?? env(recipe)?.id
207
+ ok(Boolean(recipeId), '配方创建(SP=200 经真实寄存器下发)', recipeId ?? '')
208
+ }
209
+
210
+ // ══ Stage C:开跑(真实寄存器下发)+ 数采交叉核对 ════════════════════
211
+ console.log('\n── C 产线开跑与真实数采交叉核对 ──')
212
+ {
213
+ const start = await api('POST', `/api/workshop/dcw/lines/${lineId}/start`, { token: userToken, body: { recipeId } })
214
+ ok(start.status === 200 && Boolean(env(start)?.run?.id), '产线开跑(配方经 Modbus 真实下发)', start.status === 200 ? `run=${env(start)?.run?.id}` : JSON.stringify(start.json).slice(0, 160))
215
+
216
+ await api('POST', '/api/workshop/daq/controller', { token: userToken, body: { action: 'start' } })
217
+ await sleep(8000) // 等两个采样节拍
218
+
219
+ const nodes = await api('GET', '/api/workshop/daq', { token: userToken })
220
+ const all = env(nodes)?.nodes ?? env(nodes) ?? []
221
+ const melt = (Array.isArray(all) ? all : []).find(n => n?.id === meltDaqId)
222
+ const spN = (Array.isArray(all) ? all : []).find(n => n?.id === spDaqId)
223
+ const meltVal = melt?.lastValue ?? melt?.value ?? null
224
+ const spVal = spN?.lastValue ?? spN?.value ?? null
225
+ ok(meltVal != null, '数采采到真实熔体温度(Modbus 40001)', `value=${meltVal}`)
226
+ ok(spVal != null && Math.abs(Number(spVal) - 200) < 1.5, 'SP 回读=200(开跑下发真实生效)', `value=${spVal}`)
227
+
228
+ // 与模拟器侧交叉核对
229
+ const sim = await raw('GET', `${SIM}/api/nodes`)
230
+ const devs = sim.json?.data ?? sim.json ?? []
231
+ const extruder = (Array.isArray(devs) ? devs : []).find(d => d?.id === 'dev-extruder-mbtcp')
232
+ const sig = (extruder?.signals ?? []).find(s => s?.id === 'melt-temp')
233
+ const simMelt = sig?.current ?? sig?.value
234
+ // 冷启动暖机阶段熔温爬升快,采样时点差会放大偏差 → 暖机判定放宽到 ±10
235
+ ok(simMelt != null && Math.abs(Number(simMelt) - Number(meltVal)) < 10,
236
+ 'AW 采样与模拟器寄存器交叉一致(暖机容差)', `aw=${meltVal} sim=${simMelt}`)
237
+
238
+ // 暖机门控:等熔温爬到 198+(SP=200 的物理吸引域),保证 D 阶段收敛断言有意义
239
+ let warm = false
240
+ for (let i = 0; i < 60 && !warm; i++) {
241
+ await sleep(5000)
242
+ const ns = await api('GET', '/api/workshop/daq', { token: userToken })
243
+ const arr2 = env(ns)?.nodes ?? env(ns) ?? []
244
+ const m2 = (Array.isArray(arr2) ? arr2 : []).find(n => n?.id === meltDaqId)
245
+ const v2 = m2?.lastValue ?? m2?.value ?? null
246
+ if (v2 != null && Number(v2) >= 198) warm = true
247
+ if (i % 6 === 5) console.log(` … 暖机(${(i + 1) * 5}s):melt=${v2}`)
248
+ }
249
+ ok(warm, '暖机门控:熔温进入 SP=200 吸引域(≥198)')
250
+ }
251
+
252
+ // ══ Stage D:闭环写控(HITL → 真实 Modbus 写 → 物理跟随)══════════════
253
+ console.log('\n── D 闭环写控(熔温调控:SP 200 → 202)──')
254
+ {
255
+ for (const nid of dcwNodeIds) {
256
+ const bind = await api('POST', '/api/workshop/agent-tools/bindings', {
257
+ token: userToken, body: { agentId: exec.id, nodeId: nid, kind: 'dcw', mode: 'manual' },
258
+ })
259
+ ok(bind.status === 200, `执行器绑定 DCW 节点(manual) ${nid}`, `mode=${env(bind)?.binding?.mode}`)
260
+ }
261
+
262
+ // 三区并发发起(每区独立 HITL);审批轮询循环消费全部待办
263
+ const writes = dcwNodeIds.map((nid, idx) => invoke(exec, 'dcw_control', {
264
+ node_id: nid, value: 210,
265
+ hypothesis: `熔温调控闭环实测:加热区${idx + 1}SP 200→210,观察熔体跟随`,
266
+ }, 300000))
267
+ let approvedAll = 0
268
+ for (let i = 0; i < 45 && approvedAll < dcwNodeIds.length; i++) {
269
+ await sleep(2000)
270
+ const pend = await api('GET', '/api/workshop/hitl/pending', { token: userToken })
271
+ const pd = env(pend)
272
+ const arr = Array.isArray(pd) ? pd : (pd?.items ?? pd?.pending ?? [])
273
+ for (const item of arr.filter(x => x?.kind === 'dcw-approval' && x?.agentId === exec.id)) {
274
+ const resp = await api('POST', '/api/workshop/hitl/respond', { token: userToken, body: { kind: 'dcw-approval', id: item.id, confirmed: true, comment: 'plc-e2e 批准' } })
275
+ if (resp.status === 200) approvedAll++
276
+ }
277
+ }
278
+ const writeTexts = []
279
+ for (const w of writes) writeTexts.push(resultText(await w))
280
+ ok(approvedAll >= dcwNodeIds.length, `HITL 待办全部出现并批准(${dcwNodeIds.length} 区)`, `approved=${approvedAll}`)
281
+ ok(writeTexts.every(t => t.includes('回读一致')), `${dcwNodeIds.length} 区 dcw_control 均经真实 Modbus 写入且回读一致`, writeTexts[0].slice(0, 100))
282
+
283
+ // 模拟器侧确认寄存器真的变成 202
284
+ const sim = await raw('GET', `${SIM}/api/nodes`)
285
+ const devs = sim.json?.data ?? sim.json ?? []
286
+ const extruder = (Array.isArray(devs) ? devs : []).find(d => d?.id === 'dev-extruder-mbtcp')
287
+ const z1 = (extruder?.signals ?? []).find(s => s?.id === 'zone1-sp')
288
+ const simSp = z1?.current ?? z1?.value
289
+ ok(Math.abs(Number(simSp) - 210) < 0.5, '模拟器寄存器 40021 实际=210(真实写穿)', `sim zone1-sp=${simSp}`)
290
+ const z2 = (extruder?.signals ?? []).find(s => s?.id === 'zone2-sp')
291
+ const z3 = (extruder?.signals ?? []).find(s => s?.id === 'zone3-sp')
292
+ ok(Math.abs(Number(z2?.current ?? z2?.value) - 210) < 0.5 && Math.abs(Number(z3?.current ?? z3?.value) - 210) < 0.5, '寄存器 40023/40025 同步=210')
293
+
294
+ // 物理跟随:熔温向新 SP(210)收敛。暖机后在 200 附近,三区渐近线抬升约 3.3℃
295
+ let meltBefore
296
+ {
297
+ const nodes0 = await api('GET', '/api/workshop/daq', { token: userToken })
298
+ const arr0 = env(nodes0)?.nodes ?? env(nodes0) ?? []
299
+ const m0 = (Array.isArray(arr0) ? arr0 : []).find(n => n?.id === meltDaqId)
300
+ meltBefore = Number(m0?.lastValue ?? m0?.value ?? 0)
301
+ }
302
+ let meltAfter = null
303
+ for (let i = 0; i < 100; i++) {
304
+ await sleep(6000)
305
+ const nodes = await api('GET', '/api/workshop/daq', { token: userToken })
306
+ const all = env(nodes)?.nodes ?? env(nodes) ?? []
307
+ const melt = (Array.isArray(all) ? all : []).find(n => n?.id === meltDaqId)
308
+ meltAfter = melt?.lastValue ?? melt?.value ?? null
309
+ if (meltAfter != null && Number(meltAfter) >= meltBefore + 3) break
310
+ }
311
+ // 三区渐近线 ≈210(从 ~200.5 起),热惯性下 10 分钟内抬升应远超 1.5℃
312
+ const risen = meltAfter != null && Number(meltAfter) >= meltBefore + 1.5
313
+ ok(risen, '熔体温度向新 SP 收敛(闭环物理生效)', `before=${meltBefore} after=${meltAfter}`)
314
+
315
+ // 判定 keep:找到最新 open 优化记录
316
+ const opts = await api('GET', '/api/workshop/dcw/optimizations', { token: userToken })
317
+ const recs = env(opts)?.records ?? env(opts) ?? []
318
+ const openRec = (Array.isArray(recs) ? recs : []).find(r => r?.nodeId === dcwNodeId && (r?.status === 'open' || r?.judge == null))
319
+ if (openRec?.id) {
320
+ const j = await invoke(exec, 'dcw_judge', { record_id: openRec.id, verdict: 'keep', reason: '熔温跟随达标,判 keep(plc-e2e)' }, 60000)
321
+ ok(!j.json?.result?.isError, 'dcw_judge 落 keep 判定', resultText(j).slice(0, 80))
322
+ }
323
+ else {
324
+ ok(false, '找到 open 优化记录以判定', JSON.stringify(recs).slice(0, 120))
325
+ }
326
+ }
327
+
328
+ // ══ Stage E:知识闭环 ═══════════════════════════════════════════════
329
+ console.log('\n── E 知识闭环(经验沉淀/检索 + 诊断自动入库)──')
330
+ {
331
+ // 两段都依赖**外部服务**,缺一即为"测试没准备好"而非产品缺陷 —— 按项目约定显式 SKIP
332
+ // (环境不具备宁可 skip 并写明原因,绝不伪造通过):
333
+ // · rag :kb_agent 需要 rag-knowledge 的 **web**(kb agent chat,claude SDK);
334
+ // · diag:需要工业深度诊断服务(:3210)。
335
+ const kbHealth = await raw('GET', `${KB}/api/v1/health`).catch(() => null)
336
+ const kbWebUrl = String(env(await api('GET', '/api/system/settings', { token: userToken }))?.effective?.['plugins.rag-bridge.web_url'] ?? '')
337
+ // 必须 **200** 才算可达:401/403 说明"服务在但没凭据",kb_agent 仍会失败,不能当就绪
338
+ const kbWebReachable = kbWebUrl ? await raw('GET', `${kbWebUrl}/api/health`).then(r => r.status === 200).catch(() => false) : false
339
+ const ragReady = kbHealth?.json?.status === 'healthy' && kbWebReachable
340
+ const diagHealth = await raw('GET', `${DIAG}/api/health`).catch(() => null)
341
+ const diagReady = diagHealth?.json?.status === 'ok'
342
+
343
+ const marker = `PLC闭环实测${TAG}:SP 上调 2℃ 后熔体温度跟随收敛,判定 keep`
344
+ if (!ragReady) {
345
+ console.log(` SKIP rag 知识闭环(经验沉淀/检索)— 需要 rag-knowledge web(kb agent chat):KB health=${kbHealth?.json?.status ?? 'unreachable'} web=${kbWebUrl || '(未配置)'} reachable=${kbWebReachable}`)
346
+ }
347
+ else {
348
+ // rag-bridge 的对外工具面是**单入口** kb_agent(旧 kb_store/kb_search/kb_index 已随
349
+ // "功能解耦"重构下线):入库用 async,检索用 sync 并等待最终回复。
350
+ const store = await invoke(exec, 'kb_agent', {
351
+ mode: 'async',
352
+ prompt: `请把下面这条经验沉淀进知识库(库名 aw-industrial,标题「plc-e2e 经验:${TAG} 熔温调控」):`
353
+ + `类别 optimization;问题「熔体温度偏低需要上调」;解决方案「${marker}」;标签 plc-e2e,闭环。`,
354
+ }, 120000)
355
+ ok(!/未知工具|不支持|不可用|失败|错误/.test(resultText(store)), 'kb_agent 经验沉淀(async 提交)', resultText(store).slice(0, 90))
356
+ let hit = ''
357
+ for (let i = 0; i < 8 && !hit; i++) {
358
+ await sleep(4000)
359
+ const s = await invoke(exec, 'kb_agent', { mode: 'sync', prompt: `检索:${marker}` }, 300000)
360
+ const text = resultText(s)
361
+ if (!text.startsWith('未检索到') && !/未知工具|不支持|不可用|失败|错误/.test(text)) hit = text
362
+ }
363
+ ok(hit.length > 0, 'kb_agent 命中刚沉淀经验', hit.split('\n')[1]?.slice(0, 90) ?? '')
364
+ }
365
+
366
+ if (!diagReady) {
367
+ console.log(` SKIP 诊断闭环(diag_run → completed → 自动入库 → 检索)— 诊断服务不可达:${DIAG}/api/health=${diagHealth?.json?.status ?? 'unreachable'}`)
368
+ }
369
+ else {
370
+ // 诊断(mock 引擎,分钟级):先清线上在跑诊断(防收养长跑 omp),显式 mock,发起→completed→入库→检索
371
+ // 鉴权用持久化 API Token(idd_;会话 JWT 的密钥/会话态可能随服务重启失效)
372
+ const diagToken = env(await api('GET', '/api/system/settings', { token: userToken }))?.effective?.['plugins.diag-bridge.token'] ?? ''
373
+ const dreq = (path, method = 'GET') => raw(method, `${DIAG}${path}`, { token: diagToken, timeoutMs: 20000 })
374
+ {
375
+ const list = await dreq('/api/diagnosis/list')
376
+ const runs = list.json?.data ?? []
377
+ for (const r of runs.filter(x => x?.status === 'running')) {
378
+ await dreq(`/api/diagnosis/stop/${encodeURIComponent(r.runId ?? r.id)}`, 'POST').catch(() => {})
379
+ }
380
+ }
381
+ const adminSnap = await api('GET', '/api/system/settings', { token: userToken })
382
+ const prevHarness = env(adminSnap)?.effective?.['plugins.diag-bridge.harness'] ?? ''
383
+ await api('PATCH', '/api/system/settings', { token: userToken, body: { override: { 'plugins.diag-bridge.harness': 'mock' } } })
384
+ let runId = ''
385
+ const r = await invoke(exec, 'diag_run', { line: lineId ?? LINE, from_ms: Date.now() - 30 * 60_000, to_ms: Date.now(), question: `${LINE} PLC 闭环实测时窗诊断(plc-e2e)`, scene: 'plc_e2e' }, 120000)
386
+ runId = (resultText(r).match(/runId=([a-z0-9-]+)/i) ?? [])[1] ?? ''
387
+ if (!runId) {
388
+ const adopted = (resultText(r).match(/run_id=([a-z0-9-]+)/i) ?? [])[1] ?? ''
389
+ if (adopted) runId = adopted
390
+ }
391
+ ok(Boolean(runId), 'diag_run 发起(mock 引擎)', runId || resultText(r).slice(0, 100))
392
+ if (runId) {
393
+ let done = false
394
+ let last = ''
395
+ for (let i = 0; i < 30 && !done; i++) {
396
+ await sleep(15_000)
397
+ const s = await invoke(exec, 'diag_status', { run_id: runId }, 30000)
398
+ last = resultText(s)
399
+ if (/状态=completed/.test(last)) done = true
400
+ else if (/状态=(failed|stopped)/.test(last)) break
401
+ }
402
+ ok(done, '诊断跑至 completed', (last.match(/评分=\S+/g) ?? []).join(' '))
403
+ if (done) {
404
+ let stored = false
405
+ for (let i = 0; i < 24 && !stored; i++) {
406
+ await sleep(10_000)
407
+ const runs = await api('GET', '/api/plugins/diag-bridge/runs', { token: userToken })
408
+ const mine = (runs.json?.runs ?? []).find(x => x.runId === runId)
409
+ if (mine?.stored === true) stored = true
410
+ }
411
+ ok(stored, '诊断报告自动入库')
412
+ let kbHit = ''
413
+ for (let i = 0; i < 8 && !kbHit; i++) {
414
+ await sleep(5000)
415
+ const s = await invoke(exec, 'kb_agent', { mode: 'sync', prompt: `检索:plc_e2e ${runId.slice(0, 8)} 诊断报告` }, 300000)
416
+ if (!resultText(s).startsWith('未检索到')) kbHit = resultText(s)
417
+ }
418
+ ok(kbHit.length > 0, 'kb_agent 命中诊断报告', kbHit.split('\n')[1]?.slice(0, 90) ?? '')
419
+ }
420
+ }
421
+ await api('PATCH', '/api/system/settings', { token: userToken, body: { override: { 'plugins.diag-bridge.harness': prevHarness } } })
422
+ }
423
+ }
424
+
425
+ // ══ Stage F:插件参数回归(逐键热生效→复原)══════════════════════════
426
+ console.log('\n── F 插件参数配置回归 ──')
427
+ {
428
+ // admin 夹具
429
+ const areg = await api('POST', '/api/workshop/users/register', { body: { name: `plc-admin-${TAG}` } })
430
+ const atok = env(areg)?.token ?? ''
431
+ {
432
+ const db = new DatabaseSync(join(resolve('.'), '.AgentWorkShop', 'data', 'users.sqlite'))
433
+ db.exec('PRAGMA busy_timeout=4000')
434
+ db.prepare('UPDATE users SET role = \'admin\' WHERE id = ?').run(env(areg)?.id ?? '')
435
+ db.close()
436
+ }
437
+ const snap0 = await api('GET', '/api/system/settings', { token: atok })
438
+ const eff0 = env(snap0)?.effective ?? {}
439
+ const orig = {}
440
+ for (const k of ['plugins.rag-bridge.base_url', 'plugins.rag-bridge.web_url', 'plugins.rag-bridge.token', 'plugins.diag-bridge.base_url', 'plugins.diag-bridge.token', 'plugins.diag-bridge.harness', 'plugins.diag-bridge.max_turns', 'plugins.diag-bridge.max_minutes', 'plugins.diag-bridge.auto_enabled', 'plugins.diag-bridge.auto_rules']) {
441
+ orig[k] = eff0[k]
442
+ }
443
+ const patchSet = async obj => api('PATCH', '/api/system/settings', { token: atok, body: { override: obj } })
444
+ const healthOf = async n => (await raw('GET', `${BASE}/api/plugins/${n}/health`, { token: userToken })).json
445
+
446
+ // ① diag 热效可见键:harness / auto_enabled / max_turns
447
+ const r1 = await patchSet({ 'plugins.diag-bridge.harness': 'mock', 'plugins.diag-bridge.auto_enabled': true, 'plugins.diag-bridge.max_turns': 123 })
448
+ ok(r1.status === 200, 'PATCH 三个 diag 键成功')
449
+ let h1 = await healthOf('diag-bridge')
450
+ ok(h1?.harness === 'mock' && h1?.auth === 'bearer', 'diag-bridge health 即时反映 harness 切换', `harness=${h1?.harness} auth=${h1?.auth}`)
451
+ let snap1 = env(await api('GET', '/api/system/settings', { token: atok }))?.effective ?? {}
452
+ ok(snap1['plugins.diag-bridge.max_turns'] === 123 && snap1['plugins.diag-bridge.auto_enabled'] === true, 'max_turns/auto_enabled 生效值可读')
453
+
454
+ // ② rag 热效可见键:base_url 切到模拟器端口(必然失败)→ 恢复
455
+ await patchSet({ 'plugins.rag-bridge.base_url': 'http://127.0.0.1:59999' })
456
+ let h2 = await healthOf('rag-bridge')
457
+ ok(h2?.backend?.ok === false && String(h2?.backend?.url).endsWith('59999'), 'rag base_url 热切换生效(指向坏端口→探活失败)')
458
+ await patchSet({ 'plugins.rag-bridge.base_url': orig['plugins.rag-bridge.base_url'] })
459
+ let h3 = await healthOf('rag-bridge')
460
+ ok(h3?.backend?.ok === true, '恢复 base_url → 探活恢复', `url=${h3?.backend?.url}`)
461
+
462
+ // ③ token 热效:换成错误 token → catalog 401 → 恢复
463
+ await patchSet({ 'plugins.rag-bridge.token': 'wrong-token-for-regression' })
464
+ let h4 = await healthOf('rag-bridge')
465
+ // web catalog 带 token → 401 → web.ok=false;kb.id 可能保留旧值
466
+ ok(h4?.web?.ok === false || h4?.backend?.ok === false, '错误 token 热生效(出站 401)')
467
+ await patchSet({ 'plugins.rag-bridge.token': orig['plugins.rag-bridge.token'] })
468
+ let h5 = await healthOf('rag-bridge')
469
+ ok(h5?.web?.ok === true && h5?.kb?.id, '恢复 token → 出站恢复')
470
+
471
+ // ④ diag token 热效:diag /api/health 是公开端点,健康路由不反映 token ——
472
+ // 改为配置层断言(生效值可读),出站鉴权行为已由 Stage E 的 diag_run 全链验证
473
+ await patchSet({ 'plugins.diag-bridge.token': 'wrong-diag-token-regression' })
474
+ const effDiag = env(await api('GET', '/api/system/settings', { token: atok }))?.effective ?? {}
475
+ ok(effDiag['plugins.diag-bridge.token'] === 'wrong-diag-token-regression', 'diag token 热写生效(配置层)')
476
+ await patchSet({ 'plugins.diag-bridge.token': orig['plugins.diag-bridge.token'] })
477
+ const effDiag2 = env(await api('GET', '/api/system/settings', { token: atok }))?.effective ?? {}
478
+ ok(effDiag2['plugins.diag-bridge.token'] === orig['plugins.diag-bridge.token'], '恢复 diag token(配置层)')
479
+
480
+ // ⑤ 全量复原 + auto_enabled 保持关闭(防误触发自动诊断)
481
+ const restore = {}
482
+ for (const [k, v] of Object.entries(orig)) if (v !== undefined) restore[k] = v
483
+ restore['plugins.diag-bridge.auto_enabled'] = false
484
+ restore['plugins.diag-bridge.harness'] = orig['plugins.diag-bridge.harness'] ?? ''
485
+ restore['plugins.diag-bridge.max_turns'] = orig['plugins.diag-bridge.max_turns'] ?? 0
486
+ restore['plugins.diag-bridge.max_minutes'] = orig['plugins.diag-bridge.max_minutes'] ?? 0
487
+ await patchSet(restore)
488
+ const snapEnd = env(await api('GET', '/api/system/settings', { token: atok }))?.effective ?? {}
489
+ ok(snapEnd['plugins.diag-bridge.auto_enabled'] === false && (snapEnd['plugins.diag-bridge.harness'] ?? '') === (orig['plugins.diag-bridge.harness'] ?? ''), '全部参数复原(auto_enabled 关闭防误触发)')
490
+ console.log(' · 复原快照:', JSON.stringify({
491
+ rag: snapEnd['plugins.rag-bridge.base_url'],
492
+ diag: snapEnd['plugins.diag-bridge.base_url'],
493
+ harness: snapEnd['plugins.diag-bridge.harness'] ?? '',
494
+ }))
495
+ }
496
+
497
+ // ══ Stage G:Channel 级插件开关(点对点复核)══════════════════════════
498
+ console.log('\n── G Channel 级插件开关 ──')
499
+ {
500
+ const ch = await api('POST', '/api/workshop/channels', { token: userToken, body: { name: `PLC开关频道-${TAG}` } })
501
+ const channelId = env(ch)?.channelId
502
+ ok(Boolean(channelId), '测试频道创建')
503
+ const tpl = await api('POST', '/api/workshop/agents', { token: userToken, body: { name: `开关执行器-${TAG}`, harness: 'mock' } })
504
+ const tplId = env(tpl)?.id
505
+ const add = await api('POST', `/api/workshop/channels/${channelId}/agents`, { token: userToken, body: { name: env(tpl)?.name, harness: 'mock', templateId: tplId, role: 'worker' } })
506
+ const member = env(add)?.agent ?? env(add)
507
+ ok(Boolean(member?.id && member?.token), 'mock 成员加入频道')
508
+ if (member?.id && channelId) {
509
+ const off = await api('PUT', `/api/workshop/channels/${channelId}/plugins`, { token: userToken, body: { plugins: [{ name: 'rag-bridge', enabled: false }, { name: 'diag-bridge', enabled: true }] } })
510
+ ok(off.status === 200, 'PUT 关闭 rag-bridge')
511
+ const list1 = await api('GET', `/api/workshop/agent-tools/list?agentId=${member.id}`, { agent: member })
512
+ const names1 = (list1?.json?.data?.tools ?? list1?.json?.tools ?? []).map(t => t?.name)
513
+ // rag-bridge 的对外工具面已收敛为**单入口** `kb_agent`(+ kb_agent_status);
514
+ // kb_search/kb_store/kb_index 是旧工具名,已不存在 —— 断言必须跟着当前事实源走。
515
+ const RAG_TOOL = 'kb_agent'
516
+ ok(!names1.includes(RAG_TOOL), '关闭插件工具不注入')
517
+ ok(names1.includes('diag_run'), '开启插件工具注入')
518
+ const denied = await invoke(member, RAG_TOOL, { prompt: 'x' }, 30000)
519
+ ok(resultText(denied).includes('未启用插件'), 'dispatch 同源拒绝', resultText(denied).slice(0, 60))
520
+ await api('PUT', `/api/workshop/channels/${channelId}/plugins`, { token: userToken, body: { plugins: [{ name: 'rag-bridge', enabled: true }, { name: 'diag-bridge', enabled: true }] } })
521
+ let back = false
522
+ for (let i = 0; i < 8 && !back; i++) {
523
+ await sleep(1000)
524
+ const list2 = await api('GET', `/api/workshop/agent-tools/list?agentId=${member.id}`, { agent: member })
525
+ if (((list2?.json?.data?.tools ?? list2?.json?.tools ?? []).map(t => t?.name)).includes(RAG_TOOL)) back = true
526
+ }
527
+ ok(back, '重开后工具恢复')
528
+ }
529
+ }
530
+
531
+ // ══ Stage H:Harness 集成面 ═════════════════════════════════════════
532
+ console.log('\n── H Harness 集成面 ──')
533
+ {
534
+ const list = await api('GET', `/api/workshop/agent-tools/list?agentId=${exec.id}`, { agent: exec })
535
+ const names = (list?.json?.data?.tools ?? list?.json?.tools ?? []).map(t => t?.name)
536
+ // rag 侧工具面已收敛为单入口 kb_agent(+kb_agent_status);diag 侧仍是 diag_run/diag_status
537
+ for (const t of ['kb_agent', 'kb_agent_status', 'diag_run', 'diag_status']) ok(names.includes(t), `omp 执行器工具清单含 ${t}`)
538
+ for (const t of ['daq_query', 'dcw_control', 'dcw_judge', 'line_context']) ok(names.includes(t), `omp 执行器工业工具含 ${t}`)
539
+ const ctxT = await invoke(exec, 'line_context', {}, 60000)
540
+ ok(!resultText(ctxT).startsWith('工具') || resultText(ctxT).length > 0, 'line_context 可用(工业链路)', resultText(ctxT).slice(0, 60))
541
+ }
542
+
543
+ // ══ 汇总 ═══════════════════════════════════════════════════════════
544
+ console.log(`\n══ 结果:${pass} 通过 / ${fail} 失败 ══`)
545
+ if (failures.length) {
546
+ console.error('失败项:')
547
+ for (const f of failures) console.error(` - ${f}`)
548
+ }
549
+ process.exit(fail > 0 ? 1 : 0)