agentworkshop 0.7.48 → 0.7.50

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 (892) hide show
  1. package/.AgentWorkShop/prompts/host-tools.json +409 -6
  2. package/.output/.AgentWorkShop/aml-python/__pycache__/aml_eval.cpython-312.pyc +0 -0
  3. package/.output/.AgentWorkShop/aml-python/__pycache__/amlkit.cpython-312.pyc +0 -0
  4. package/.output/.AgentWorkShop/aml-python/__pycache__/train-example.cpython-312.pyc +0 -0
  5. package/.output/.AgentWorkShop/aml-python/__pycache__/train-hybrid-example.cpython-312.pyc +0 -0
  6. package/.output/.AgentWorkShop/aml-python/aml_eval.py +39 -6
  7. package/.output/.AgentWorkShop/aml-python/amlkit.py +222 -3
  8. package/.output/.AgentWorkShop/aml-python/train-hybrid-example.py +278 -32
  9. package/.output/.AgentWorkShop/prompts/host-tools.json +409 -6
  10. package/.output/.AgentWorkShop/schema.json +135 -133
  11. package/.output/nitro.json +1 -1
  12. package/.output/public/_nuxt/2_DkYoqD2.js +1 -0
  13. package/.output/public/_nuxt/8FXd9As6.js +1 -0
  14. package/.output/public/_nuxt/{d-w5jR8R.js → B3zB6K6m.js} +1 -1
  15. package/.output/public/_nuxt/{OXtV_ukR.js → B4ujjkUI.js} +1 -1
  16. package/.output/public/_nuxt/B9BmiUil.js +2 -0
  17. package/.output/public/_nuxt/B9QzrmgE.js +1 -0
  18. package/.output/public/_nuxt/BE7BrEw6.js +1 -0
  19. package/.output/public/_nuxt/{Cu8c3oMN2.js → BFZIll912.js} +1 -1
  20. package/.output/public/_nuxt/{ChtjzEpK2.js → BGAaKBeo2.js} +1 -1
  21. package/.output/public/_nuxt/BOmDHp5L.js +14 -0
  22. package/.output/public/_nuxt/BPou3U7b.js +1 -0
  23. package/.output/public/_nuxt/{CiTQY_n32.js → BXx9AxdF2.js} +1 -1
  24. package/.output/public/_nuxt/Bfe2qOYs.js +1 -0
  25. package/.output/public/_nuxt/BgEDwFMf.js +1 -0
  26. package/.output/public/_nuxt/BgnhB8r5.js +1 -0
  27. package/.output/public/_nuxt/Bhe953zV2.js +1 -0
  28. package/.output/public/_nuxt/{BITZvQBK.js → Bpkm4W5P.js} +1 -1
  29. package/.output/public/_nuxt/C4lagVdN2.js +1 -0
  30. package/.output/public/_nuxt/C5cf3T4d.js +1 -0
  31. package/.output/public/_nuxt/CBIoheY42.js +1 -0
  32. package/.output/public/_nuxt/{CN1CDAwe.js → CFQSjB1h.js} +1 -1
  33. package/.output/public/_nuxt/CFQyYMEn2.js +1 -0
  34. package/.output/public/_nuxt/CHrErv1E.js +1 -0
  35. package/.output/public/_nuxt/{fxWyOzyp2.js → CI2yXRr42.js} +1 -1
  36. package/.output/public/_nuxt/CIduggmC.js +1 -0
  37. package/.output/public/_nuxt/CU-mhG0-.js +1 -0
  38. package/.output/public/_nuxt/CXzfXC5M.js +1 -0
  39. package/.output/public/_nuxt/{H6pPjo0l.js → C_sjV3Ee.js} +1 -1
  40. package/.output/public/_nuxt/Ccps4cxo.js +1 -0
  41. package/.output/public/_nuxt/{CPmNRTBk2.js → CdIsmU5a2.js} +10 -10
  42. package/.output/public/_nuxt/{BS9P_Ies2.js → ChGuLxwW2.js} +1 -1
  43. package/.output/public/_nuxt/{Ck5oMvUk.js → Cn6ihm8j.js} +1 -1
  44. package/.output/public/_nuxt/{CWzp2R6G.js → D-Xyb3DA.js} +1 -1
  45. package/.output/public/_nuxt/D0SNhlnt.js +1 -0
  46. package/.output/public/_nuxt/D0ldVwl-.js +1 -0
  47. package/.output/public/_nuxt/DClNt1uS.js +1 -0
  48. package/.output/public/_nuxt/{CTVfcnjU.js → DQMbdg4t.js} +2 -2
  49. package/.output/public/_nuxt/{DHSDk8Bq2.js → DTxfFIvL2.js} +1 -1
  50. package/.output/public/_nuxt/DVKXGuMz2.js +1 -0
  51. package/.output/public/_nuxt/{CLySL7mW.js → Da0h_6VA.js} +1 -1
  52. package/.output/public/_nuxt/{PixDfCSm.js → DefDtlKK.js} +1 -1
  53. package/.output/public/_nuxt/DjefmmJu.js +1 -0
  54. package/.output/public/_nuxt/DnH9SRMW2.js +1 -0
  55. package/.output/public/_nuxt/{BmiMC_BC.js → DppqsiPC.js} +1 -1
  56. package/.output/public/_nuxt/Drq9iy6V.js +1 -0
  57. package/.output/public/_nuxt/DsGf2IV82.js +1 -0
  58. package/.output/public/_nuxt/{DoKpLEqc.js → DzfVS8N72.js} +1 -1
  59. package/.output/public/_nuxt/{DRpFsrno.js → I1cI6sPJ2.js} +1 -1
  60. package/.output/public/_nuxt/IU-UGkCJ2.js +1 -0
  61. package/.output/public/_nuxt/KXjvpIk2.js +1 -0
  62. package/.output/public/_nuxt/NJn94js_.js +1 -0
  63. package/.output/public/_nuxt/ON2x-t6n.js +1 -0
  64. package/.output/public/_nuxt/S799kNo8.js +1 -0
  65. package/.output/public/_nuxt/{uI9Ki_XZ.js → S9rLP7_v.js} +1 -1
  66. package/.output/public/_nuxt/UN3nSFjj2.js +1 -0
  67. package/.output/public/_nuxt/WVTVkqef.js +1 -0
  68. package/.output/public/_nuxt/{C_VAXV7I2.js → Yv9YItEX2.js} +1 -1
  69. package/.output/public/_nuxt/_id_.DamiFT0Q.css +1 -0
  70. package/.output/public/_nuxt/{_id_.BTrFUIHX.css → _id_.DpRe1PRh.css} +1 -1
  71. package/.output/public/_nuxt/_wsId_.DkrQkT6r.css +1 -0
  72. package/.output/public/_nuxt/aml.-czpKIs8.css +1 -0
  73. package/.output/public/_nuxt/asmJ99nX2.js +47 -0
  74. package/.output/public/_nuxt/builds/latest.json +1 -1
  75. package/.output/public/_nuxt/builds/meta/08ba670b-7512-426b-a0ae-b10cbeb1c985.json +1 -0
  76. package/.output/public/_nuxt/{default.uao9U50c.css → default.CXb_zoN6.css} +1 -1
  77. package/.output/public/_nuxt/{entry.6DEjPWvR.css → entry.JdEG3KJg.css} +1 -1
  78. package/.output/public/_nuxt/jRTz0hjN2.js +1 -0
  79. package/.output/public/_nuxt/{DLPuRMeG.js → k5K6Jj6g.js} +1 -1
  80. package/.output/public/_nuxt/operations.B8X9uWK6.css +1 -0
  81. package/.output/public/_nuxt/{settings.Bo5EYkLI.css → settings.O26Dw1iT.css} +1 -1
  82. package/.output/public/_nuxt/{BACBBVdw.js → tKxYgsf-.js} +1 -1
  83. package/.output/public/_nuxt/{Cm_PTn9t2.js → vXrNItas2.js} +1 -1
  84. package/.output/public/_nuxt/{Cr518Gh02.js → zsRclU9w2.js} +1 -1
  85. package/.output/server/chunks/_/LeftOutlined.mjs +1 -1
  86. package/.output/server/chunks/_/SearchOutlined.mjs +1 -1
  87. package/.output/server/chunks/_/binding-authz.mjs +1 -1
  88. package/.output/server/chunks/_/character-asset.repo.mjs +1 -1
  89. package/.output/server/chunks/_/entity.mjs +1 -1
  90. package/.output/server/chunks/_/host-bindings.mjs +1 -1
  91. package/.output/server/chunks/_/nitro.mjs +26096 -20984
  92. package/.output/server/chunks/_/nitro.mjs.map +1 -1
  93. package/.output/server/chunks/_/scene-layout.repo.mjs +1 -1
  94. package/.output/server/chunks/build/Checkbox-4EdGAAl_.mjs +1 -1
  95. package/.output/server/chunks/build/FormItemContext-4ORSzhWv.mjs +1 -1
  96. package/.output/server/chunks/build/{OmpTerminalPanel-EQHrOJbw.mjs → OmpTerminalPanel-mk31gVzA.mjs} +3 -3
  97. package/.output/server/chunks/build/{OmpTerminalPanel-EQHrOJbw.mjs.map → OmpTerminalPanel-mk31gVzA.mjs.map} +1 -1
  98. package/.output/server/chunks/build/{PluginSlot-BP_qedpQ.mjs → PluginSlot-D2WUZgbp.mjs} +2 -2
  99. package/.output/server/chunks/build/{PluginSlot-BP_qedpQ.mjs.map → PluginSlot-D2WUZgbp.mjs.map} +1 -1
  100. package/.output/server/chunks/build/{TownView-BAR8CPIZ.mjs → TownView-fP9BiALv.mjs} +6 -6
  101. package/.output/server/chunks/build/{TownView-BAR8CPIZ.mjs.map → TownView-fP9BiALv.mjs.map} +1 -1
  102. package/.output/server/chunks/build/{_id_-DgMpjM3_.mjs → _id_-BUpQSlzo.mjs} +142 -106
  103. package/.output/server/chunks/build/_id_-BUpQSlzo.mjs.map +1 -0
  104. package/.output/server/chunks/build/{_id_-Dv3BQbYV.mjs → _id_-CDlur81q.mjs} +25 -24
  105. package/.output/server/chunks/build/_id_-CDlur81q.mjs.map +1 -0
  106. package/.output/server/chunks/build/{_wsId_-BKJvFmyf.mjs → _wsId_-DPy2BXRd.mjs} +547 -158
  107. package/.output/server/chunks/build/_wsId_-DPy2BXRd.mjs.map +1 -0
  108. package/.output/server/chunks/build/{agents-B2GLPmn2.mjs → agents-CDLcboCv.mjs} +12 -12
  109. package/.output/server/chunks/build/{agents-B2GLPmn2.mjs.map → agents-CDLcboCv.mjs.map} +1 -1
  110. package/.output/server/chunks/build/{aml-DdWicH3t.mjs → aml-DsgtDLWF.mjs} +28 -27
  111. package/.output/server/chunks/build/aml-DsgtDLWF.mjs.map +1 -0
  112. package/.output/server/chunks/build/api-BY6ji7RC.mjs +6 -6
  113. package/.output/server/chunks/build/card-CUSocE9p.mjs +1 -1
  114. package/.output/server/chunks/build/{channel-templates-RPOtkgRf.mjs → channel-templates-DjEsj0_v.mjs} +8 -8
  115. package/.output/server/chunks/build/{channel-templates-RPOtkgRf.mjs.map → channel-templates-DjEsj0_v.mjs.map} +1 -1
  116. package/.output/server/chunks/build/checkbox-C4AKj81e.mjs +1 -1
  117. package/.output/server/chunks/build/constants-HPHJvjne.mjs +6 -6
  118. package/.output/server/chunks/build/{daq-CPtsh0e7.mjs → daq-N69AOtgw.mjs} +12 -11
  119. package/.output/server/chunks/build/daq-N69AOtgw.mjs.map +1 -0
  120. package/.output/server/chunks/build/{dcw-ry5Gyw6Y.mjs → dcw-CN9d3Rs7.mjs} +10 -10
  121. package/.output/server/chunks/build/{dcw-ry5Gyw6Y.mjs.map → dcw-CN9d3Rs7.mjs.map} +1 -1
  122. package/.output/server/chunks/build/{default-DxOE1eB0.mjs → default-DCf9tn1i.mjs} +38 -30
  123. package/.output/server/chunks/build/{default-DxOE1eB0.mjs.map → default-DCf9tn1i.mjs.map} +1 -1
  124. package/.output/server/chunks/build/descriptions-CFaUq4y4.mjs +1 -1
  125. package/.output/server/chunks/build/drawer-Cfh9_zft.mjs +1 -1
  126. package/.output/server/chunks/build/dropdown-KdKWCS5K.mjs +1 -1
  127. package/.output/server/chunks/build/form-uSlNqIAV.mjs +1 -1
  128. package/.output/server/chunks/build/input-Cr_KFj4T.mjs +1 -1
  129. package/.output/server/chunks/build/input-number-BRVnxeiA.mjs +1 -1
  130. package/.output/server/chunks/build/{logs-CeaiO3y9.mjs → logs-BcAjU1Ps.mjs} +12 -11
  131. package/.output/server/chunks/build/logs-BcAjU1Ps.mjs.map +1 -0
  132. package/.output/server/chunks/build/menu-BgkRSSx7.mjs +1 -1
  133. package/.output/server/chunks/build/{monitor-DnuXEIi5.mjs → monitor-DX_K0WMq.mjs} +13 -13
  134. package/.output/server/chunks/build/{monitor-DnuXEIi5.mjs.map → monitor-DX_K0WMq.mjs.map} +1 -1
  135. package/.output/server/chunks/build/operations-OFHYXwh4.mjs +282 -0
  136. package/.output/server/chunks/build/operations-OFHYXwh4.mjs.map +1 -0
  137. package/.output/server/chunks/build/{pages-Bn90ijKD.mjs → pages-rZKH72eC.mjs} +10 -11
  138. package/.output/server/chunks/build/pages-rZKH72eC.mjs.map +1 -0
  139. package/.output/server/chunks/build/{permissions-DL70W1YD.mjs → permissions-BvmodvsO.mjs} +8 -8
  140. package/.output/server/chunks/build/{permissions-DL70W1YD.mjs.map → permissions-BvmodvsO.mjs.map} +1 -1
  141. package/.output/server/chunks/build/{plugins-DrsZo--K.mjs → plugins-DSka7-vS.mjs} +9 -9
  142. package/.output/server/chunks/build/{plugins-DrsZo--K.mjs.map → plugins-DSka7-vS.mjs.map} +1 -1
  143. package/.output/server/chunks/build/popconfirm-Ox-_2V8A.mjs +1 -1
  144. package/.output/server/chunks/build/{schedules-VLzNcjnW.mjs → schedules-lo4bfgVt.mjs} +8 -8
  145. package/.output/server/chunks/build/{schedules-VLzNcjnW.mjs.map → schedules-lo4bfgVt.mjs.map} +1 -1
  146. package/.output/server/chunks/build/segmented-C61yLHvo.mjs +1 -1
  147. package/.output/server/chunks/build/select-rdBWytVK.mjs +1 -1
  148. package/.output/server/chunks/build/{settings-DVAUVMsX.mjs → settings-CAJWvul5.mjs} +32 -13
  149. package/.output/server/chunks/build/settings-CAJWvul5.mjs.map +1 -0
  150. package/.output/server/chunks/build/space-B2uhHJG8.mjs +1 -1
  151. package/.output/server/chunks/build/spin-C2cuvGth.mjs +1 -1
  152. package/.output/server/chunks/build/switch-DZAUIbIN.mjs +1 -1
  153. package/.output/server/chunks/build/table-DOFAvY-v.mjs +1 -1
  154. package/.output/server/chunks/build/tabs-DTeIuZeP.mjs +1 -1
  155. package/.output/server/chunks/build/tag-CHLGvNM6.mjs +1 -1
  156. package/.output/server/chunks/build/{teams-Mc07PYO8.mjs → teams-DBBvIToa.mjs} +14 -14
  157. package/.output/server/chunks/build/{teams-Mc07PYO8.mjs.map → teams-DBBvIToa.mjs.map} +1 -1
  158. package/.output/server/chunks/build/{tokens-DiwD5qni.mjs → tokens-CloWk4x_.mjs} +12 -12
  159. package/.output/server/chunks/build/{tokens-DiwD5qni.mjs.map → tokens-CloWk4x_.mjs.map} +1 -1
  160. package/.output/server/chunks/build/{town-D8VmTCmN.mjs → town-BMlctE4m.mjs} +12 -12
  161. package/.output/server/chunks/build/{town-D8VmTCmN.mjs.map → town-BMlctE4m.mjs.map} +1 -1
  162. package/.output/server/chunks/build/types-D6J7slEa.mjs +1 -1
  163. package/.output/server/chunks/build/{useAgentHarnessOptions-CPn5dzKe.mjs → useAgentHarnessOptions-D6SJ_uUr.mjs} +7 -7
  164. package/.output/server/chunks/build/{useAgentHarnessOptions-CPn5dzKe.mjs.map → useAgentHarnessOptions-D6SJ_uUr.mjs.map} +1 -1
  165. package/.output/server/chunks/build/{useAgentTemplateActions-DQWzVnZ0.mjs → useAgentTemplateActions-CdG4g_PF.mjs} +7 -7
  166. package/.output/server/chunks/build/{useAgentTemplateActions-DQWzVnZ0.mjs.map → useAgentTemplateActions-CdG4g_PF.mjs.map} +1 -1
  167. package/.output/server/chunks/build/useAgentTemplateDialogState-CZzpu5og.mjs +6 -6
  168. package/.output/server/chunks/build/{useAgentTemplateForm-vqyiRPtt.mjs → useAgentTemplateForm-a5y-N5sB.mjs} +7 -7
  169. package/.output/server/chunks/build/{useAgentTemplateForm-vqyiRPtt.mjs.map → useAgentTemplateForm-a5y-N5sB.mjs.map} +1 -1
  170. package/.output/server/chunks/build/{useAgentTemplatesCatalog-DcQbsOik.mjs → useAgentTemplatesCatalog-pBVcUuN3.mjs} +7 -7
  171. package/.output/server/chunks/build/{useAgentTemplatesCatalog-DcQbsOik.mjs.map → useAgentTemplatesCatalog-pBVcUuN3.mjs.map} +1 -1
  172. package/.output/server/chunks/build/useAmlDatasets-BM0lZu40.mjs +6 -6
  173. package/.output/server/chunks/build/{useAmlEntities-BjXWvFd_.mjs → useAmlEntities-BDQ8TmLL.mjs} +7 -7
  174. package/.output/server/chunks/build/{useAmlEntities-BjXWvFd_.mjs.map → useAmlEntities-BDQ8TmLL.mjs.map} +1 -1
  175. package/.output/server/chunks/build/{useAmlEnv-BB7p6x_w.mjs → useAmlEnv-DgTVwpqi.mjs} +7 -7
  176. package/.output/server/chunks/build/{useAmlEnv-BB7p6x_w.mjs.map → useAmlEnv-DgTVwpqi.mjs.map} +1 -1
  177. package/.output/server/chunks/build/useAmlExperiments-BtyW32PO.mjs +6 -6
  178. package/.output/server/chunks/build/{useAmlFormat-WrKuRfw2.mjs → useAmlFormat-C2sl3MGB.mjs} +7 -7
  179. package/.output/server/chunks/build/{useAmlFormat-WrKuRfw2.mjs.map → useAmlFormat-C2sl3MGB.mjs.map} +1 -1
  180. package/.output/server/chunks/build/{useAmlJobs-DBuLvWMF.mjs → useAmlJobs-fk-H5Rp5.mjs} +10 -9
  181. package/.output/server/chunks/build/useAmlJobs-fk-H5Rp5.mjs.map +1 -0
  182. package/.output/server/chunks/build/{useAmlModels-VurmkBYe.mjs → useAmlModels-hgyVHoAq.mjs} +7 -7
  183. package/.output/server/chunks/build/{useAmlModels-VurmkBYe.mjs.map → useAmlModels-hgyVHoAq.mjs.map} +1 -1
  184. package/.output/server/chunks/build/{useAmlNotes-BUdj3X6Y.mjs → useAmlNotes-BjbYNADm.mjs} +7 -7
  185. package/.output/server/chunks/build/{useAmlNotes-BUdj3X6Y.mjs.map → useAmlNotes-BjbYNADm.mjs.map} +1 -1
  186. package/.output/server/chunks/build/{useAmlPredict-DFy-Do10.mjs → useAmlPredict-U24-SZNA.mjs} +7 -7
  187. package/.output/server/chunks/build/{useAmlPredict-DFy-Do10.mjs.map → useAmlPredict-U24-SZNA.mjs.map} +1 -1
  188. package/.output/server/chunks/build/useDaqAddNode-kW7uTSMQ.mjs +7 -7
  189. package/.output/server/chunks/build/useDaqDetailBinding-cpBz4hSL.mjs +6 -6
  190. package/.output/server/chunks/build/useDaqDetailFrames-BZGtKKXW.mjs +6 -6
  191. package/.output/server/chunks/build/{useDaqDetailHistory-C4_hVeqZ.mjs → useDaqDetailHistory-DtSTfyMi.mjs} +7 -7
  192. package/.output/server/chunks/build/{useDaqDetailHistory-C4_hVeqZ.mjs.map → useDaqDetailHistory-DtSTfyMi.mjs.map} +1 -1
  193. package/.output/server/chunks/build/{useDaqDetailNode-Bwid_iA8.mjs → useDaqDetailNode-D_vhG0jF.mjs} +8 -8
  194. package/.output/server/chunks/build/{useDaqDetailNode-Bwid_iA8.mjs.map → useDaqDetailNode-D_vhG0jF.mjs.map} +1 -1
  195. package/.output/server/chunks/build/useDaqDetailParams-JfqHvTxr.mjs +7 -7
  196. package/.output/server/chunks/build/{useDaqFilters-C13836p-.mjs → useDaqFilters-BUQtZ82a.mjs} +8 -8
  197. package/.output/server/chunks/build/{useDaqFilters-C13836p-.mjs.map → useDaqFilters-BUQtZ82a.mjs.map} +1 -1
  198. package/.output/server/chunks/build/useDaqNodeWindow-1DWj2H5G.mjs +6 -6
  199. package/.output/server/chunks/build/useDaqOptimizations-Ct-TSXxy.mjs +6 -6
  200. package/.output/server/chunks/build/useDaqStream-wOxZcMDA.mjs +1 -1
  201. package/.output/server/chunks/build/useDaqTemplates-BqQRdrIm.mjs +7 -7
  202. package/.output/server/chunks/build/{useDashboardCharts-DZysNDUX.mjs → useDashboardCharts-D45083s_.mjs} +7 -7
  203. package/.output/server/chunks/build/{useDashboardCharts-DZysNDUX.mjs.map → useDashboardCharts-D45083s_.mjs.map} +1 -1
  204. package/.output/server/chunks/build/{useDashboardData-Ny_wtbo6.mjs → useDashboardData-Do_Vsepa.mjs} +8 -8
  205. package/.output/server/chunks/build/{useDashboardData-Ny_wtbo6.mjs.map → useDashboardData-Do_Vsepa.mjs.map} +1 -1
  206. package/.output/server/chunks/build/{useDcwAddNode-C8nE7geh.mjs → useDcwAddNode-C1HDP3yG.mjs} +12 -9
  207. package/.output/server/chunks/build/useDcwAddNode-C1HDP3yG.mjs.map +1 -0
  208. package/.output/server/chunks/build/useDcwCards-ETEsHvVy.mjs +6 -6
  209. package/.output/server/chunks/build/{useDcwDetailScope-BNrpDzbO.mjs → useDcwDetailScope-QTr1G6Oe.mjs} +7 -7
  210. package/.output/server/chunks/build/{useDcwDetailScope-BNrpDzbO.mjs.map → useDcwDetailScope-QTr1G6Oe.mjs.map} +1 -1
  211. package/.output/server/chunks/build/{useDcwDetailTemplates-IcKAJ37Y.mjs → useDcwDetailTemplates-Djt-0Vse.mjs} +7 -7
  212. package/.output/server/chunks/build/{useDcwDetailTemplates-IcKAJ37Y.mjs.map → useDcwDetailTemplates-Djt-0Vse.mjs.map} +1 -1
  213. package/.output/server/chunks/build/useDcwFilter-FfVlDdyS.mjs +6 -6
  214. package/.output/server/chunks/build/useDcwLedger-BLoMmcu1.mjs +6 -6
  215. package/.output/server/chunks/build/useDcwLineMutations-BMC5BTWU.mjs +6 -6
  216. package/.output/server/chunks/build/{useDcwLineRun-Bpxk4mse.mjs → useDcwLineRun-74gN_s6T.mjs} +7 -7
  217. package/.output/server/chunks/build/{useDcwLineRun-Bpxk4mse.mjs.map → useDcwLineRun-74gN_s6T.mjs.map} +1 -1
  218. package/.output/server/chunks/build/useDcwProducts-D-zrMaeV.mjs +6 -6
  219. package/.output/server/chunks/build/{useDcwQuery-1lYHOaU6.mjs → useDcwQuery-7tX4QYmv.mjs} +7 -7
  220. package/.output/server/chunks/build/{useDcwQuery-1lYHOaU6.mjs.map → useDcwQuery-7tX4QYmv.mjs.map} +1 -1
  221. package/.output/server/chunks/build/useDcwQuickActions-C-tgcXIr.mjs +6 -6
  222. package/.output/server/chunks/build/{useDcwRecipes-BzGOymqz.mjs → useDcwRecipes-FVk5gDLV.mjs} +23 -15
  223. package/.output/server/chunks/build/useDcwRecipes-FVk5gDLV.mjs.map +1 -0
  224. package/.output/server/chunks/build/useDcwStream-D04kCV3J.mjs +1 -1
  225. package/.output/server/chunks/build/{useDcwTemplates-Dsjw9u6U.mjs → useDcwTemplates-LDZffy4u.mjs} +7 -7
  226. package/.output/server/chunks/build/{useDcwTemplates-Dsjw9u6U.mjs.map → useDcwTemplates-LDZffy4u.mjs.map} +1 -1
  227. package/.output/server/chunks/build/{useDcwWrites-3RxwN36I.mjs → useDcwWrites-B22mwliK.mjs} +25 -8
  228. package/.output/server/chunks/build/useDcwWrites-B22mwliK.mjs.map +1 -0
  229. package/.output/server/chunks/build/useLocalTime-DZ2RAtVs.mjs +49 -0
  230. package/.output/server/chunks/build/useLocalTime-DZ2RAtVs.mjs.map +1 -0
  231. package/.output/server/chunks/build/{useLogsFormat-BlwLpyzy.mjs → useLogsFormat-B-o4MHy7.mjs} +7 -7
  232. package/.output/server/chunks/build/{useLogsFormat-BlwLpyzy.mjs.map → useLogsFormat-B-o4MHy7.mjs.map} +1 -1
  233. package/.output/server/chunks/build/{useLogsManual-Deev2Cjk.mjs → useLogsManual-COfCyUtj.mjs} +7 -7
  234. package/.output/server/chunks/build/{useLogsManual-Deev2Cjk.mjs.map → useLogsManual-COfCyUtj.mjs.map} +1 -1
  235. package/.output/server/chunks/build/useLogsQuery-CRAm2hmS.mjs +6 -6
  236. package/.output/server/chunks/build/useLogsScope-ClNijVj4.mjs +6 -6
  237. package/.output/server/chunks/build/{useMonitorColumns-ylxrUNTK.mjs → useMonitorColumns-DhYvkLDq.mjs} +7 -7
  238. package/.output/server/chunks/build/{useMonitorColumns-ylxrUNTK.mjs.map → useMonitorColumns-DhYvkLDq.mjs.map} +1 -1
  239. package/.output/server/chunks/build/{useMonitorData-CEpKXoD4.mjs → useMonitorData-guVjMDtR.mjs} +9 -8
  240. package/.output/server/chunks/build/useMonitorData-guVjMDtR.mjs.map +1 -0
  241. package/.output/server/chunks/build/{useMonitorFormat-_7zLapf3.mjs → useMonitorFormat-C7lhZe4g.mjs} +13 -12
  242. package/.output/server/chunks/build/useMonitorFormat-C7lhZe4g.mjs.map +1 -0
  243. package/.output/server/chunks/build/useMonitorTerminal-Dj4QwRNW.mjs +6 -6
  244. package/.output/server/chunks/build/useOperationsFeed-CeXeHqUK.mjs +191 -0
  245. package/.output/server/chunks/build/useOperationsFeed-CeXeHqUK.mjs.map +1 -0
  246. package/.output/server/chunks/build/{useTeamActions-D6sxdpkP.mjs → useTeamActions-C4n-taBk.mjs} +7 -7
  247. package/.output/server/chunks/build/{useTeamActions-D6sxdpkP.mjs.map → useTeamActions-C4n-taBk.mjs.map} +1 -1
  248. package/.output/server/chunks/build/{useTeamAddMemberDialog-Q-ntQ6Vo.mjs → useTeamAddMemberDialog-Cp_z3nMa.mjs} +7 -7
  249. package/.output/server/chunks/build/{useTeamAddMemberDialog-Q-ntQ6Vo.mjs.map → useTeamAddMemberDialog-Cp_z3nMa.mjs.map} +1 -1
  250. package/.output/server/chunks/build/{useTeamCreateDialog-D7OMfDTM.mjs → useTeamCreateDialog-C8LKUoe2.mjs} +7 -7
  251. package/.output/server/chunks/build/{useTeamCreateDialog-D7OMfDTM.mjs.map → useTeamCreateDialog-C8LKUoe2.mjs.map} +1 -1
  252. package/.output/server/chunks/build/{useTeamDeployDialog-vBRqjiut.mjs → useTeamDeployDialog-wdBVsNWY.mjs} +7 -7
  253. package/.output/server/chunks/build/{useTeamDeployDialog-vBRqjiut.mjs.map → useTeamDeployDialog-wdBVsNWY.mjs.map} +1 -1
  254. package/.output/server/chunks/build/useTeamDialogState-CFRUQxAf.mjs +6 -6
  255. package/.output/server/chunks/build/{useTeamPluginDialog-B8kxewpZ.mjs → useTeamPluginDialog-CIk8G8nI.mjs} +7 -7
  256. package/.output/server/chunks/build/{useTeamPluginDialog-B8kxewpZ.mjs.map → useTeamPluginDialog-CIk8G8nI.mjs.map} +1 -1
  257. package/.output/server/chunks/build/{useTeamsCatalog-xRhk7ezA.mjs → useTeamsCatalog-D6TULzmS.mjs} +7 -7
  258. package/.output/server/chunks/build/{useTeamsCatalog-xRhk7ezA.mjs.map → useTeamsCatalog-D6TULzmS.mjs.map} +1 -1
  259. package/.output/server/chunks/build/useTokenClipboard-CwQpoFeP.mjs +6 -6
  260. package/.output/server/chunks/build/{useTokenCreate-DpDcF1Vx.mjs → useTokenCreate-DkYvEQUD.mjs} +7 -7
  261. package/.output/server/chunks/build/{useTokenCreate-DpDcF1Vx.mjs.map → useTokenCreate-DkYvEQUD.mjs.map} +1 -1
  262. package/.output/server/chunks/build/{useTokenRename-BRejFrtc.mjs → useTokenRename-DOCP4aeI.mjs} +7 -7
  263. package/.output/server/chunks/build/{useTokenRename-BRejFrtc.mjs.map → useTokenRename-DOCP4aeI.mjs.map} +1 -1
  264. package/.output/server/chunks/build/{useTokenReveal-DER2afAS.mjs → useTokenReveal-CybwwflV.mjs} +7 -7
  265. package/.output/server/chunks/build/{useTokenReveal-DER2afAS.mjs.map → useTokenReveal-CybwwflV.mjs.map} +1 -1
  266. package/.output/server/chunks/build/{useTokensList-DHt65IOY.mjs → useTokensList-BLiMvrc4.mjs} +7 -7
  267. package/.output/server/chunks/build/{useTokensList-DHt65IOY.mjs.map → useTokensList-BLiMvrc4.mjs.map} +1 -1
  268. package/.output/server/chunks/build/{useWorkbenchAuth-B2j-zILO.mjs → useWorkbenchAuth-DqjBX-6w.mjs} +7 -7
  269. package/.output/server/chunks/build/{useWorkbenchAuth-B2j-zILO.mjs.map → useWorkbenchAuth-DqjBX-6w.mjs.map} +1 -1
  270. package/.output/server/chunks/build/{useWorkbenchWorkspaces-B_2mOxN6.mjs → useWorkbenchWorkspaces-DgiSCzsX.mjs} +10 -9
  271. package/.output/server/chunks/build/useWorkbenchWorkspaces-DgiSCzsX.mjs.map +1 -0
  272. package/.output/server/chunks/build/{useWorkshopWs-B-Es2Xg3.mjs → useWorkshopWs-Bm80bLn7.mjs} +8 -7
  273. package/.output/server/chunks/build/useWorkshopWs-Bm80bLn7.mjs.map +1 -0
  274. package/.output/server/chunks/build/{useWorkspaceAuth-tQ1ORWXo.mjs → useWorkspaceAuth-Dlvj9csD.mjs} +8 -8
  275. package/.output/server/chunks/build/{useWorkspaceAuth-tQ1ORWXo.mjs.map → useWorkspaceAuth-Dlvj9csD.mjs.map} +1 -1
  276. package/.output/server/chunks/build/{useWorkspaceChannels-BwB6TAWY.mjs → useWorkspaceChannels-D61Al2dr.mjs} +11 -10
  277. package/.output/server/chunks/build/useWorkspaceChannels-D61Al2dr.mjs.map +1 -0
  278. package/.output/server/chunks/build/{useWorkspacePanels-CuAmDpT5.mjs → useWorkspacePanels-CTwREmq0.mjs} +8 -8
  279. package/.output/server/chunks/build/{useWorkspacePanels-CuAmDpT5.mjs.map → useWorkspacePanels-CTwREmq0.mjs.map} +1 -1
  280. package/.output/server/chunks/build/{useWorkspaceShell-CcQ4JlqO.mjs → useWorkspaceShell-BCypjjjE.mjs} +7 -7
  281. package/.output/server/chunks/build/{useWorkspaceShell-CcQ4JlqO.mjs.map → useWorkspaceShell-BCypjjjE.mjs.map} +1 -1
  282. package/.output/server/chunks/build/{users-De2HygNt.mjs → users-CCf5PgRs.mjs} +8 -8
  283. package/.output/server/chunks/build/{users-De2HygNt.mjs.map → users-CCf5PgRs.mjs.map} +1 -1
  284. package/.output/server/chunks/build/{workshop-CmgpTwyf.mjs → workshop-FQ4YzooB.mjs} +13 -12
  285. package/.output/server/chunks/build/workshop-FQ4YzooB.mjs.map +1 -0
  286. package/.output/server/chunks/build/{workspaces-DVIEk1Bl.mjs → workspaces-CmW0cpOt.mjs} +1 -1
  287. package/.output/server/chunks/build/{workspaces-DVIEk1Bl.mjs.map → workspaces-CmW0cpOt.mjs.map} +1 -1
  288. package/.output/server/chunks/routes/api/health.get.mjs +6 -6
  289. package/.output/server/chunks/routes/api/index.get.mjs +7 -7
  290. package/.output/server/chunks/routes/api/index.post.mjs +7 -7
  291. package/.output/server/chunks/routes/api/mcp/workshop.mjs +6 -6
  292. package/.output/server/chunks/routes/api/metrics.mjs +6 -6
  293. package/.output/server/chunks/routes/api/plugins/_name/_...path_.mjs +6 -6
  294. package/.output/server/chunks/routes/api/plugins/client/_name_.get.mjs +6 -6
  295. package/.output/server/chunks/routes/api/plugins/i18n.get.mjs +6 -6
  296. package/.output/server/chunks/routes/api/plugins/manifest.get.mjs +6 -6
  297. package/.output/server/chunks/routes/api/system/config-groups/_id_.delete.mjs +6 -6
  298. package/.output/server/chunks/routes/api/system/config-groups/_id_.patch.mjs +6 -6
  299. package/.output/server/chunks/routes/api/system/config.get.mjs +6 -6
  300. package/.output/server/chunks/routes/api/system/index.get.mjs +6 -6
  301. package/.output/server/chunks/routes/api/system/index.patch.mjs +6 -6
  302. package/.output/server/chunks/routes/api/system/index.post.mjs +6 -6
  303. package/.output/server/chunks/routes/api/system/index2.get.mjs +6 -6
  304. package/.output/server/chunks/routes/api/system/monitor/terminal/ws.mjs +6 -6
  305. package/.output/server/chunks/routes/api/system/monitor/terminate.post.mjs +6 -6
  306. package/.output/server/chunks/routes/api/system/monitor.get.mjs +6 -6
  307. package/.output/server/chunks/routes/api/system/settings/events.get.mjs +6 -6
  308. package/.output/server/chunks/routes/api/system/settings/reset.post.mjs +6 -6
  309. package/.output/server/chunks/routes/api/system/timezone.get.mjs +36 -0
  310. package/.output/server/chunks/routes/api/system/timezone.get.mjs.map +1 -0
  311. package/.output/server/chunks/routes/api/users/_id_.delete.mjs +7 -7
  312. package/.output/server/chunks/routes/api/users/_id_.get.mjs +7 -7
  313. package/.output/server/chunks/routes/api/users/_id_.put.mjs +7 -7
  314. package/.output/server/chunks/routes/api/users/index.get.mjs +7 -7
  315. package/.output/server/chunks/routes/api/users/index.post.mjs +7 -7
  316. package/.output/server/chunks/routes/api/users/login.post.mjs +7 -7
  317. package/.output/server/chunks/routes/api/users/logout.post.mjs +7 -7
  318. package/.output/server/chunks/routes/api/users/me.get.mjs +7 -7
  319. package/.output/server/chunks/routes/api/users/register.post.mjs +7 -7
  320. package/.output/server/chunks/routes/api/users/setup-status.get.mjs +7 -7
  321. package/.output/server/chunks/routes/api/users/tokens/_id/token.get.mjs +7 -7
  322. package/.output/server/chunks/routes/api/users/tokens/_id_.delete.mjs +7 -7
  323. package/.output/server/chunks/routes/api/users/tokens/_id_.patch.mjs +7 -7
  324. package/.output/server/chunks/routes/api/workshop/_...path_.mjs +6 -6
  325. package/.output/server/chunks/routes/api/workshop/a2a/_agentId/index.get.mjs +7 -7
  326. package/.output/server/chunks/routes/api/workshop/a2a/_agentId/index.post.mjs +5 -5
  327. package/.output/server/chunks/routes/api/workshop/a2a/send.post.mjs +6 -6
  328. package/.output/server/chunks/routes/api/workshop/agent-tools/approvals/_id/decide.post.mjs +7 -7
  329. package/.output/server/chunks/routes/api/workshop/agent-tools/bindings/_id_.delete.mjs +7 -7
  330. package/.output/server/chunks/routes/api/workshop/agent-tools/bindings/_id_.patch.mjs +10 -7
  331. package/.output/server/chunks/routes/api/workshop/agent-tools/bindings/_id_.patch.mjs.map +1 -1
  332. package/.output/server/chunks/routes/api/workshop/agent-tools/index.get.mjs +7 -7
  333. package/.output/server/chunks/routes/api/workshop/agent-tools/index.post.mjs +7 -7
  334. package/.output/server/chunks/routes/api/workshop/agent-tools/index2.get.mjs +7 -7
  335. package/.output/server/chunks/routes/api/workshop/agent-tools/invoke.post.mjs +7 -7
  336. package/.output/server/chunks/routes/api/workshop/agent-tools/list.get.mjs +7 -7
  337. package/.output/server/chunks/routes/api/workshop/agents/_id_.delete.mjs +6 -6
  338. package/.output/server/chunks/routes/api/workshop/agents/_id_.get.mjs +6 -6
  339. package/.output/server/chunks/routes/api/workshop/agents/_id_.patch.mjs +6 -6
  340. package/.output/server/chunks/routes/api/workshop/agents/subscribe.post.mjs +6 -6
  341. package/.output/server/chunks/routes/api/workshop/aml/datasets/_id/preview.get.mjs +6 -6
  342. package/.output/server/chunks/routes/api/workshop/aml/datasets/_id_.delete.mjs +7 -7
  343. package/.output/server/chunks/routes/api/workshop/aml/datasets/_id_.get.mjs +7 -7
  344. package/.output/server/chunks/routes/api/workshop/aml/datasets/_id_.patch.mjs +7 -7
  345. package/.output/server/chunks/routes/api/workshop/aml/entities/prune.post.mjs +7 -7
  346. package/.output/server/chunks/routes/api/workshop/aml/env/recheck.post.mjs +7 -8
  347. package/.output/server/chunks/routes/api/workshop/aml/env/recheck.post.mjs.map +1 -1
  348. package/.output/server/chunks/routes/api/workshop/aml/env/uv.post.mjs +7 -8
  349. package/.output/server/chunks/routes/api/workshop/aml/env/uv.post.mjs.map +1 -1
  350. package/.output/server/chunks/routes/api/workshop/aml/env/venv.post.mjs +7 -8
  351. package/.output/server/chunks/routes/api/workshop/aml/env/venv.post.mjs.map +1 -1
  352. package/.output/server/chunks/routes/api/workshop/aml/index.get.mjs +7 -7
  353. package/.output/server/chunks/routes/api/workshop/aml/index.post.mjs +7 -7
  354. package/.output/server/chunks/routes/api/workshop/aml/index2.get.mjs +6 -6
  355. package/.output/server/chunks/routes/api/workshop/aml/index2.post.mjs +20 -7
  356. package/.output/server/chunks/routes/api/workshop/aml/index2.post.mjs.map +1 -1
  357. package/.output/server/chunks/routes/api/workshop/aml/index3.get.mjs +7 -8
  358. package/.output/server/chunks/routes/api/workshop/aml/index3.get.mjs.map +1 -1
  359. package/.output/server/chunks/routes/api/workshop/aml/index3.post.mjs +49 -0
  360. package/.output/server/chunks/routes/api/workshop/aml/index3.post.mjs.map +1 -0
  361. package/.output/server/chunks/routes/api/workshop/aml/index4.get.mjs +7 -7
  362. package/.output/server/chunks/routes/api/workshop/aml/index5.get.mjs +7 -7
  363. package/.output/server/chunks/routes/api/workshop/aml/index6.get.mjs +7 -7
  364. package/.output/server/chunks/routes/api/workshop/aml/index7.get.mjs +28 -0
  365. package/.output/server/chunks/routes/api/workshop/aml/index7.get.mjs.map +1 -0
  366. package/.output/server/chunks/routes/api/workshop/aml/jobs/_id/cancel.post.mjs +7 -7
  367. package/.output/server/chunks/routes/api/workshop/aml/jobs/_id/logs.get.mjs +7 -7
  368. package/.output/server/chunks/routes/api/workshop/aml/jobs/_id/retry.post.mjs +7 -7
  369. package/.output/server/chunks/routes/api/workshop/aml/jobs/_id_.delete.mjs +7 -7
  370. package/.output/server/chunks/routes/api/workshop/aml/jobs/_id_.get.mjs +7 -7
  371. package/.output/server/chunks/routes/api/workshop/aml/models/_id/predict.post.mjs +7 -7
  372. package/.output/server/chunks/routes/api/workshop/aml/models/_id/promote.post.mjs +7 -7
  373. package/.output/server/chunks/routes/api/workshop/aml/models/_id_.delete.mjs +7 -7
  374. package/.output/server/chunks/routes/api/workshop/aml/models/_id_.patch.mjs +7 -7
  375. package/.output/server/chunks/routes/api/workshop/aml/training-plans/_id/train.post.mjs +35 -0
  376. package/.output/server/chunks/routes/api/workshop/aml/training-plans/_id/train.post.mjs.map +1 -0
  377. package/.output/server/chunks/routes/api/workshop/aml/training-plans/_id_.delete.mjs +35 -0
  378. package/.output/server/chunks/routes/api/workshop/aml/training-plans/_id_.delete.mjs.map +1 -0
  379. package/.output/server/chunks/routes/api/workshop/aml/training-plans/_id_.patch.mjs +44 -0
  380. package/.output/server/chunks/routes/api/workshop/aml/training-plans/_id_.patch.mjs.map +1 -0
  381. package/.output/server/chunks/routes/api/workshop/aml/twin/providers.get.mjs +46 -0
  382. package/.output/server/chunks/routes/api/workshop/aml/twin/providers.get.mjs.map +1 -0
  383. package/.output/server/chunks/routes/api/workshop/approvals/_id/decide.post.mjs +7 -7
  384. package/.output/server/chunks/routes/api/workshop/assets/character/_id_.delete.mjs +5 -5
  385. package/.output/server/chunks/routes/api/workshop/assets/devices/_id_.delete.mjs +5 -5
  386. package/.output/server/chunks/routes/api/workshop/assets/index.get.mjs +6 -6
  387. package/.output/server/chunks/routes/api/workshop/assets/index.post.mjs +6 -6
  388. package/.output/server/chunks/routes/api/workshop/assets/index2.get.mjs +5 -5
  389. package/.output/server/chunks/routes/api/workshop/assets/index2.post.mjs +6 -6
  390. package/.output/server/chunks/routes/api/workshop/audit.get.mjs +6 -6
  391. package/.output/server/chunks/routes/api/workshop/caller.mjs +7 -7
  392. package/.output/server/chunks/routes/api/workshop/channel-templates/_id/instantiate.post.mjs +16 -10
  393. package/.output/server/chunks/routes/api/workshop/channel-templates/_id/instantiate.post.mjs.map +1 -1
  394. package/.output/server/chunks/routes/api/workshop/channel-templates/_id_.delete.mjs +6 -6
  395. package/.output/server/chunks/routes/api/workshop/channel-templates/_id_.get.mjs +6 -6
  396. package/.output/server/chunks/routes/api/workshop/channel-templates/_id_.patch.mjs +6 -6
  397. package/.output/server/chunks/routes/api/workshop/channel-templates/from-channel.post.mjs +6 -6
  398. package/.output/server/chunks/routes/api/workshop/channels/_id/activate.post.mjs +7 -7
  399. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/index.get.mjs +6 -6
  400. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/index.post.mjs +6 -6
  401. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/memories/_memoryId_.delete.mjs +6 -6
  402. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/memories/search.post.mjs +6 -6
  403. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/model.patch.mjs +6 -6
  404. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/position.patch.mjs +6 -6
  405. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/range.patch.mjs +6 -6
  406. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/stop.post.mjs +6 -6
  407. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId_.delete.mjs +6 -6
  408. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId_.patch.mjs +6 -6
  409. package/.output/server/chunks/routes/api/workshop/channels/_id/chat/index.get.mjs +6 -6
  410. package/.output/server/chunks/routes/api/workshop/channels/_id/chat/index.post.mjs +6 -6
  411. package/.output/server/chunks/routes/api/workshop/channels/_id/chat/messages/_messageId/read.post.mjs +6 -6
  412. package/.output/server/chunks/routes/api/workshop/channels/_id/chat/permissions.get.mjs +6 -6
  413. package/.output/server/chunks/routes/api/workshop/channels/_id/events.get.mjs +6 -6
  414. package/.output/server/chunks/routes/api/workshop/channels/_id/index.get.mjs +6 -6
  415. package/.output/server/chunks/routes/api/workshop/channels/_id/index.post.mjs +6 -6
  416. package/.output/server/chunks/routes/api/workshop/channels/_id/index.put.mjs +7 -7
  417. package/.output/server/chunks/routes/api/workshop/channels/_id/index2.get.mjs +6 -6
  418. package/.output/server/chunks/routes/api/workshop/channels/_id/index2.post.mjs +6 -6
  419. package/.output/server/chunks/routes/api/workshop/channels/_id/index3.get.mjs +6 -6
  420. package/.output/server/chunks/routes/api/workshop/channels/_id/index3.post.mjs +6 -6
  421. package/.output/server/chunks/routes/api/workshop/channels/_id/index4.get.mjs +6 -6
  422. package/.output/server/chunks/routes/api/workshop/channels/_id/index4.post.mjs +6 -6
  423. package/.output/server/chunks/routes/api/workshop/channels/_id/index5.get.mjs +7 -7
  424. package/.output/server/chunks/routes/api/workshop/channels/_id/index6.get.mjs +6 -6
  425. package/.output/server/chunks/routes/api/workshop/channels/_id/members/_userId/approve.post.mjs +6 -6
  426. package/.output/server/chunks/routes/api/workshop/channels/_id/members/_userId_.delete.mjs +6 -6
  427. package/.output/server/chunks/routes/api/workshop/channels/_id/members/join.post.mjs +6 -6
  428. package/.output/server/chunks/routes/api/workshop/channels/_id/members/leave.post.mjs +6 -6
  429. package/.output/server/chunks/routes/api/workshop/channels/_id/memories/_memoryId_.delete.mjs +6 -6
  430. package/.output/server/chunks/routes/api/workshop/channels/_id/queue.get.mjs +6 -6
  431. package/.output/server/chunks/routes/api/workshop/channels/_id/terminals.get.mjs +7 -7
  432. package/.output/server/chunks/routes/api/workshop/channels/_id/twin-profile.get.mjs +51 -0
  433. package/.output/server/chunks/routes/api/workshop/channels/_id/twin-profile.get.mjs.map +1 -0
  434. package/.output/server/chunks/routes/api/workshop/channels/_id/twin-profile.patch.mjs +71 -0
  435. package/.output/server/chunks/routes/api/workshop/channels/_id/twin-profile.patch.mjs.map +1 -0
  436. package/.output/server/chunks/routes/api/workshop/channels/_id_.delete.mjs +6 -6
  437. package/.output/server/chunks/routes/api/workshop/channels/index.get.mjs +7 -7
  438. package/.output/server/chunks/routes/api/workshop/channels/index.patch.mjs +6 -6
  439. package/.output/server/chunks/routes/api/workshop/channels.get.mjs +6 -6
  440. package/.output/server/chunks/routes/api/workshop/channels.post.mjs +9 -9
  441. package/.output/server/chunks/routes/api/workshop/daq/_id/bind.post.mjs +7 -7
  442. package/.output/server/chunks/routes/api/workshop/daq/_id/bindings.put.mjs +7 -7
  443. package/.output/server/chunks/routes/api/workshop/daq/_id/frames/content.get.mjs +7 -7
  444. package/.output/server/chunks/routes/api/workshop/daq/_id/frames.get.mjs +7 -7
  445. package/.output/server/chunks/routes/api/workshop/daq/_id/samples.get.mjs +7 -7
  446. package/.output/server/chunks/routes/api/workshop/daq/_id/test.post.mjs +7 -7
  447. package/.output/server/chunks/routes/api/workshop/daq/_id_.delete.mjs +7 -7
  448. package/.output/server/chunks/routes/api/workshop/daq/_id_.patch.mjs +7 -7
  449. package/.output/server/chunks/routes/api/workshop/daq/alarms/_id/ack.post.mjs +7 -7
  450. package/.output/server/chunks/routes/api/workshop/daq/alarms.get.mjs +7 -7
  451. package/.output/server/chunks/routes/api/workshop/daq/controller.post.mjs +7 -7
  452. package/.output/server/chunks/routes/api/workshop/daq/index.post.mjs +7 -7
  453. package/.output/server/chunks/routes/api/workshop/daq/infra/reconnect.post.mjs +7 -7
  454. package/.output/server/chunks/routes/api/workshop/daq/infra.get.mjs +7 -7
  455. package/.output/server/chunks/routes/api/workshop/daq/templates/_key_.delete.mjs +7 -7
  456. package/.output/server/chunks/routes/api/workshop/daq/templates/_key_.patch.mjs +7 -7
  457. package/.output/server/chunks/routes/api/workshop/daq/test-driver.post.mjs +7 -7
  458. package/.output/server/chunks/routes/api/workshop/dcw/_id/bind.post.mjs +7 -7
  459. package/.output/server/chunks/routes/api/workshop/dcw/_id/bindings.put.mjs +7 -7
  460. package/.output/server/chunks/routes/api/workshop/dcw/_id/param-ledger.get.mjs +7 -7
  461. package/.output/server/chunks/routes/api/workshop/dcw/_id/read.post.mjs +7 -7
  462. package/.output/server/chunks/routes/api/workshop/dcw/_id/test.post.mjs +7 -7
  463. package/.output/server/chunks/routes/api/workshop/dcw/_id/write.post.mjs +7 -7
  464. package/.output/server/chunks/routes/api/workshop/dcw/_id_.delete.mjs +7 -7
  465. package/.output/server/chunks/routes/api/workshop/dcw/_id_.patch.mjs +7 -7
  466. package/.output/server/chunks/routes/api/workshop/dcw/controller.post.mjs +7 -7
  467. package/.output/server/chunks/routes/api/workshop/dcw/index.get.mjs +7 -7
  468. package/.output/server/chunks/routes/api/workshop/dcw/index.post.mjs +7 -7
  469. package/.output/server/chunks/routes/api/workshop/dcw/index2.get.mjs +7 -7
  470. package/.output/server/chunks/routes/api/workshop/dcw/index2.post.mjs +7 -7
  471. package/.output/server/chunks/routes/api/workshop/dcw/index3.get.mjs +7 -7
  472. package/.output/server/chunks/routes/api/workshop/dcw/index3.post.mjs +7 -7
  473. package/.output/server/chunks/routes/api/workshop/dcw/index4.get.mjs +7 -7
  474. package/.output/server/chunks/routes/api/workshop/dcw/index4.post.mjs +7 -7
  475. package/.output/server/chunks/routes/api/workshop/dcw/index5.get.mjs +7 -7
  476. package/.output/server/chunks/routes/api/workshop/dcw/index5.post.mjs +7 -7
  477. package/.output/server/chunks/routes/api/workshop/dcw/index6.get.mjs +7 -7
  478. package/.output/server/chunks/routes/api/workshop/dcw/journal/node/_nodeId/rollback.post.mjs +7 -7
  479. package/.output/server/chunks/routes/api/workshop/dcw/line/query.get.mjs +7 -7
  480. package/.output/server/chunks/routes/api/workshop/dcw/lines/_id/start.post.mjs +7 -7
  481. package/.output/server/chunks/routes/api/workshop/dcw/lines/_id/stop.post.mjs +7 -7
  482. package/.output/server/chunks/routes/api/workshop/dcw/lines/_id_.delete.mjs +7 -7
  483. package/.output/server/chunks/routes/api/workshop/dcw/lines/_id_.patch.mjs +7 -7
  484. package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id/judge.post.mjs +7 -7
  485. package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id/rollback.post.mjs +7 -7
  486. package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id/series.get.mjs +7 -7
  487. package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id_.get.mjs +7 -7
  488. package/.output/server/chunks/routes/api/workshop/dcw/params/_id/read.post.mjs +7 -7
  489. package/.output/server/chunks/routes/api/workshop/dcw/params/_id/write.post.mjs +7 -7
  490. package/.output/server/chunks/routes/api/workshop/dcw/params/_id_.delete.mjs +7 -7
  491. package/.output/server/chunks/routes/api/workshop/dcw/params/_id_.patch.mjs +7 -7
  492. package/.output/server/chunks/routes/api/workshop/dcw/products/_id_.delete.mjs +7 -7
  493. package/.output/server/chunks/routes/api/workshop/dcw/products/_id_.patch.mjs +7 -7
  494. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/apply.post.mjs +7 -7
  495. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/mark-good.post.mjs +7 -7
  496. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/revert.post.mjs +7 -7
  497. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/rollback-good.post.mjs +7 -7
  498. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/versions.get.mjs +7 -7
  499. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id_.delete.mjs +7 -7
  500. package/.output/server/chunks/routes/api/workshop/dcw/recipes/index.patch.mjs +7 -7
  501. package/.output/server/chunks/routes/api/workshop/dcw/runs/_id/close.post.mjs +7 -7
  502. package/.output/server/chunks/routes/api/workshop/dcw/runs/_id/data.get.mjs +7 -7
  503. package/.output/server/chunks/routes/api/workshop/dcw/runs/_id/rollback.post.mjs +7 -7
  504. package/.output/server/chunks/routes/api/workshop/dcw/templates/_key_.delete.mjs +7 -7
  505. package/.output/server/chunks/routes/api/workshop/dcw/templates/_key_.patch.mjs +7 -7
  506. package/.output/server/chunks/routes/api/workshop/dcw/test-driver.post.mjs +7 -7
  507. package/.output/server/chunks/routes/api/workshop/device-twins/_id/control.post.mjs +7 -7
  508. package/.output/server/chunks/routes/api/workshop/device-twins/_id/telemetry.post.mjs +7 -7
  509. package/.output/server/chunks/routes/api/workshop/device-twins/_id_.delete.mjs +7 -7
  510. package/.output/server/chunks/routes/api/workshop/device-twins/_id_.patch.mjs +7 -7
  511. package/.output/server/chunks/routes/api/workshop/fs/dirs.get.mjs +5 -5
  512. package/.output/server/chunks/routes/api/workshop/harnesses/_id/providers.get.mjs +7 -7
  513. package/.output/server/chunks/routes/api/workshop/harnesses.get.mjs +7 -7
  514. package/.output/server/chunks/routes/api/workshop/hitl/pending.get.mjs +7 -7
  515. package/.output/server/chunks/routes/api/workshop/hitl/respond.post.mjs +7 -7
  516. package/.output/server/chunks/routes/api/workshop/index.get.mjs +6 -6
  517. package/.output/server/chunks/routes/api/workshop/index.post.mjs +6 -6
  518. package/.output/server/chunks/routes/api/workshop/index.put.mjs +7 -7
  519. package/.output/server/chunks/routes/api/workshop/index10.get.mjs +7 -7
  520. package/.output/server/chunks/routes/api/workshop/index11.get.mjs +6 -6
  521. package/.output/server/chunks/routes/api/workshop/index12.get.mjs +6 -6
  522. package/.output/server/chunks/routes/api/workshop/index13.get.mjs +6 -6
  523. package/.output/server/chunks/routes/api/workshop/index14.get.mjs +6 -6
  524. package/.output/server/chunks/routes/api/workshop/index2.get.mjs +7 -8
  525. package/.output/server/chunks/routes/api/workshop/index2.get.mjs.map +1 -1
  526. package/.output/server/chunks/routes/api/workshop/index2.post.mjs +6 -6
  527. package/.output/server/chunks/routes/api/workshop/index3.get.mjs +6 -6
  528. package/.output/server/chunks/routes/api/workshop/index3.post.mjs +7 -7
  529. package/.output/server/chunks/routes/api/workshop/index4.get.mjs +6 -6
  530. package/.output/server/chunks/routes/api/workshop/index4.post.mjs +7 -7
  531. package/.output/server/chunks/routes/api/workshop/index5.get.mjs +7 -7
  532. package/.output/server/chunks/routes/api/workshop/index5.post.mjs +7 -7
  533. package/.output/server/chunks/routes/api/workshop/index6.get.mjs +7 -7
  534. package/.output/server/chunks/routes/api/workshop/index6.post.mjs +7 -7
  535. package/.output/server/chunks/routes/api/workshop/index7.get.mjs +7 -7
  536. package/.output/server/chunks/routes/api/workshop/index7.post.mjs +6 -6
  537. package/.output/server/chunks/routes/api/workshop/index8.get.mjs +6 -6
  538. package/.output/server/chunks/routes/api/workshop/index8.post.mjs +6 -6
  539. package/.output/server/chunks/routes/api/workshop/index9.get.mjs +6 -6
  540. package/.output/server/chunks/routes/api/workshop/index9.post.mjs +6 -6
  541. package/.output/server/chunks/routes/api/workshop/mailbox/all.get.mjs +6 -6
  542. package/.output/server/chunks/routes/api/workshop/mailbox.get.mjs +6 -6
  543. package/.output/server/chunks/routes/api/workshop/memories/maintenance.post.mjs +6 -6
  544. package/.output/server/chunks/routes/api/workshop/notifications/read.post.mjs +6 -6
  545. package/.output/server/chunks/routes/api/workshop/plugins/_name/disable.post.mjs +7 -7
  546. package/.output/server/chunks/routes/api/workshop/plugins/_name/enable.post.mjs +7 -7
  547. package/.output/server/chunks/routes/api/workshop/plugins/index.get.mjs +6 -6
  548. package/.output/server/chunks/routes/api/workshop/runtime.get.mjs +6 -6
  549. package/.output/server/chunks/routes/api/workshop/scene/layouts/_channelId_.delete.mjs +7 -7
  550. package/.output/server/chunks/routes/api/workshop/scene/layouts/_channelId_.put.mjs +7 -7
  551. package/.output/server/chunks/routes/api/workshop/scene/layouts.get.mjs +6 -6
  552. package/.output/server/chunks/routes/api/workshop/schedules/_id/run.post.mjs +6 -6
  553. package/.output/server/chunks/routes/api/workshop/schedules/_id/runs.get.mjs +6 -6
  554. package/.output/server/chunks/routes/api/workshop/schedules/_id_.delete.mjs +6 -6
  555. package/.output/server/chunks/routes/api/workshop/schedules/_id_.get.mjs +6 -6
  556. package/.output/server/chunks/routes/api/workshop/schedules/_id_.patch.mjs +6 -6
  557. package/.output/server/chunks/routes/api/workshop/tasks/_id/complete.post.mjs +6 -6
  558. package/.output/server/chunks/routes/api/workshop/tasks/_id/dispatch.post.mjs +6 -6
  559. package/.output/server/chunks/routes/api/workshop/tasks/_id/index.post.mjs +6 -6
  560. package/.output/server/chunks/routes/api/workshop/tasks/_id/reassign.post.mjs +6 -6
  561. package/.output/server/chunks/routes/api/workshop/tasks/_id/report.post.mjs +6 -6
  562. package/.output/server/chunks/routes/api/workshop/tasks/_id/retry.post.mjs +6 -6
  563. package/.output/server/chunks/routes/api/workshop/tasks/_id/update.post.mjs +6 -6
  564. package/.output/server/chunks/routes/api/workshop/tasks/_id_.get.mjs +6 -6
  565. package/.output/server/chunks/routes/api/workshop/tasks.get.mjs +6 -6
  566. package/.output/server/chunks/routes/api/workshop/teams/_id/deploy.post.mjs +6 -6
  567. package/.output/server/chunks/routes/api/workshop/teams/_id/index.get.mjs +6 -6
  568. package/.output/server/chunks/routes/api/workshop/teams/_id/index.post.mjs +6 -6
  569. package/.output/server/chunks/routes/api/workshop/teams/_id/index.put.mjs +7 -7
  570. package/.output/server/chunks/routes/api/workshop/teams/_id/index2.get.mjs +7 -7
  571. package/.output/server/chunks/routes/api/workshop/teams/_id/members/_agentId_.delete.mjs +6 -6
  572. package/.output/server/chunks/routes/api/workshop/teams/_id_.delete.mjs +6 -6
  573. package/.output/server/chunks/routes/api/workshop/teams/_id_.get.mjs +6 -6
  574. package/.output/server/chunks/routes/api/workshop/teams/_id_.patch.mjs +6 -6
  575. package/.output/server/chunks/routes/api/workshop/users/me.get.mjs +6 -6
  576. package/.output/server/chunks/routes/api/workshop/users/register.post.mjs +6 -6
  577. package/.output/server/chunks/routes/api/workshop/workspaces/_id/channel-templates/_tplId_.post.mjs +7 -7
  578. package/.output/server/chunks/routes/api/workshop/workspaces/_id/channels/_channelId_.delete.mjs +6 -6
  579. package/.output/server/chunks/routes/api/workshop/workspaces/_id/channels/_channelId_.post.mjs +6 -6
  580. package/.output/server/chunks/routes/api/workshop/workspaces/index.delete.mjs +6 -6
  581. package/.output/server/chunks/routes/renderer.mjs +2 -2
  582. package/.output/server/chunks/virtual/entry.mjs +645 -525
  583. package/.output/server/chunks/virtual/entry.mjs.map +1 -1
  584. package/.output/server/chunks/virtual/precomputed.mjs +1 -1
  585. package/.output/server/index.mjs +6 -6
  586. package/.output/server/package.json +1 -1
  587. package/README-zh.md +829 -811
  588. package/README.md +839 -821
  589. package/app/components/AppSidebar.vue +1 -0
  590. package/app/components/aml/AmlModelsTable.vue +180 -173
  591. package/app/components/daq/DaqDetailFramesTile.vue +140 -139
  592. package/app/components/daq/DaqDetailHistoryCard.vue +129 -128
  593. package/app/components/dcw/DcwAddNodeModal.vue +342 -328
  594. package/app/components/dcw/DcwNodesTable.vue +290 -253
  595. package/app/components/dcw/DcwQueryCard.vue +252 -251
  596. package/app/components/dcw/DcwRecipeEditModal.vue +297 -285
  597. package/app/components/dcw/DcwRecipePanel.vue +371 -367
  598. package/app/components/operations/OperationsFilterCard.vue +164 -0
  599. package/app/components/operations/OperationsPageHead.vue +47 -0
  600. package/app/components/operations/OperationsTimeline.vue +215 -0
  601. package/app/components/settings/RuntimeFieldRow.vue +207 -189
  602. package/app/components/workshop/ChatTimeline.vue +596 -569
  603. package/app/components/workshop/EventBlock.vue +224 -214
  604. package/app/components/workshop/blocks/ClusterTool.vue +20 -2
  605. package/app/components/workshop/console/LineOperationsPanel.vue +179 -0
  606. package/app/components/workshop/console/RightPane.vue +6 -0
  607. package/app/composables/workshop/event-blocks/constants.ts +48 -2
  608. package/app/composables/workshop/operation-events.ts +151 -0
  609. package/app/composables/workshop/useAmlStream.ts +137 -136
  610. package/app/composables/workshop/useLocalTime.ts +81 -37
  611. package/app/config/schema.ts +3 -0
  612. package/app/pages/aml/styles.css +422 -420
  613. package/app/pages/aml/types.ts +195 -189
  614. package/app/pages/dcw/[id].vue +300 -297
  615. package/app/pages/dcw/composables/useDcwAddNode.ts +124 -121
  616. package/app/pages/dcw/composables/useDcwRecipes.ts +242 -239
  617. package/app/pages/dcw/composables/useDcwWrites.ts +100 -81
  618. package/app/pages/monitor/composables/useMonitorData.ts +125 -124
  619. package/app/pages/monitor/composables/useMonitorFormat.ts +41 -39
  620. package/app/pages/operations/composables/useOperationsFeed.ts +137 -0
  621. package/app/pages/operations.vue +61 -0
  622. package/app/stores/runtime-config.ts +1 -1
  623. package/app/stores/workshop/chat.ts +434 -434
  624. package/app/stores/workshop/notifications.ts +288 -288
  625. package/app/utils/dcw-recipe-form.ts +26 -0
  626. package/cli/aw.mjs +3 -2
  627. package/cli/commands/mcp.mjs +154 -0
  628. package/cli/core/context.mjs +5 -0
  629. package/config.yml +5 -1
  630. package/docs/aml.md +112 -111
  631. package/docs/cli.en.md +447 -445
  632. package/docs/cli.md +412 -410
  633. package/docs/full-test-plan.md +191 -191
  634. package/docs/plugins.en.md +55 -1
  635. package/docs/plugins.md +51 -1
  636. package/docs/sdk.en.md +43 -1
  637. package/docs/sdk.md +40 -1
  638. package/i18n/dicts/aml.json +207 -205
  639. package/i18n/locales/en.ts +37 -0
  640. package/i18n/locales/zh-CN.ts +37 -0
  641. package/nuxt.config.ts +2 -0
  642. package/package.json +7 -1
  643. package/scripts/.chk-tok +1 -0
  644. package/scripts/.retrain-body.json +1 -0
  645. package/scripts/.retrain3-body.json +1 -0
  646. package/scripts/.rt-tok +1 -0
  647. package/scripts/.rt3-tok +1 -0
  648. package/scripts/_audit/.tmp/audit-data/dcw-params.json +15 -0
  649. package/scripts/_audit/.tmp/audit-data/dcws.json +30 -0
  650. package/scripts/_audit/aw-mcp-live-e2e.mjs +293 -0
  651. package/scripts/_audit/dcw-controller-e2e.ts +25 -18
  652. package/scripts/_audit/dcw-rollback-ledger.ts +4 -1
  653. package/scripts/_audit/feature-audit-e2e.mjs +339 -0
  654. package/scripts/_audit/full-e2e-adopt.mjs +238 -0
  655. package/scripts/_audit/full-e2e-close-loop.mjs +134 -0
  656. package/scripts/_audit/full-e2e-retrain.mjs +320 -0
  657. package/scripts/_audit/full-e2e-supplement.mjs +192 -0
  658. package/scripts/_audit/full-e2e-ui-final.mjs +111 -0
  659. package/scripts/_audit/full-e2e-ui-mount.mjs +111 -0
  660. package/scripts/_audit/full-feature-e2e-20260927.mjs +627 -0
  661. package/scripts/_audit/kb-diag-complete.mjs +261 -0
  662. package/scripts/_audit/kb-diag-complete2.mjs +271 -0
  663. package/scripts/_audit/kb-diag-loop-e2e.mjs +357 -0
  664. package/scripts/_audit/kb-diag-loop-mock.mjs +416 -0
  665. package/scripts/_audit/kb-diag-loop-v2.mjs +314 -0
  666. package/scripts/_audit/recipe-save-e2e.mjs +365 -0
  667. package/scripts/_audit/run.mjs +21 -0
  668. package/scripts/_audit/runtime-dir-e2e.mjs +393 -0
  669. package/scripts/_audit/skills-guided-e2e.mjs +316 -0
  670. package/scripts/_audit/stability-soak.mjs +252 -0
  671. package/scripts/_aw0746-stage5.mjs +159 -144
  672. package/scripts/_aw0746-stage7-twin.mjs +301 -267
  673. package/scripts/_aw0748-failclosed-probe.mjs +117 -90
  674. package/scripts/_aw0748-fresh-channel.mjs +21 -0
  675. package/scripts/_aw0748-mock-closedloop.mjs +101 -0
  676. package/scripts/_aw0748-mock-dispatch-diag.mjs +66 -0
  677. package/scripts/_aw0748-wake-channel.mjs +46 -0
  678. package/scripts/_aw0749-readme-rows.mjs +23 -0
  679. package/scripts/_dbg-configroot-audit.mjs +86 -84
  680. package/scripts/_dbg-daq-intervals-func.mjs +115 -94
  681. package/scripts/_dbg-optloop-ui-shots.mjs +52 -0
  682. package/scripts/_dbg-param-map-e2e.ts +7 -1
  683. package/scripts/_dbg-perms-e2e.mjs +11 -1
  684. package/scripts/_dbg-protocol-matrix.mjs +3 -1
  685. package/scripts/_dbg-render-regression.mjs +67 -25
  686. package/scripts/_lib-aml-python-run.mjs +17 -0
  687. package/scripts/_lint-reflow.mjs +105 -0
  688. package/scripts/_probe-lease.cjs +13 -0
  689. package/scripts/_probe-model-channel-link.cjs +25 -0
  690. package/scripts/_probe-task-queue.cjs +9 -0
  691. package/scripts/acceptance-aml-hybrid-e2e.ts +396 -0
  692. package/scripts/acceptance-aml-hybrid-twin.ts +3 -3
  693. package/scripts/acceptance-aml-model-identity.ts +137 -0
  694. package/scripts/dev-guard.mjs +4 -2
  695. package/scripts/dev-protocol-simulators.mjs +3 -2
  696. package/scripts/e2e-aml-decoupled.mjs +162 -0
  697. package/scripts/e2e-closedloop/scenarios-accounts.mjs +2 -0
  698. package/scripts/e2e-closedloop/scenarios-authz.mjs +12 -6
  699. package/scripts/e2e-closedloop/scenarios-daq-dcw.mjs +4 -1
  700. package/scripts/e2e-timezone-settings.mjs +57 -0
  701. package/scripts/live-aml-mockomp.mjs +304 -0
  702. package/scripts/live-aml-optloop-resume.mjs +322 -0
  703. package/scripts/live-aml-optloop.mjs +545 -0
  704. package/scripts/live-aml-stage9.mjs +169 -0
  705. package/scripts/live-aml-two-goals.mjs +315 -0
  706. package/scripts/live-optloop-two-modes.mjs +857 -0
  707. package/scripts/start.mjs +3 -1
  708. package/scripts/test-aw-skills.mjs +102 -0
  709. package/scripts/test-twin-plugin-sdk.mjs +30 -0
  710. package/sdk/context.mjs +305 -0
  711. package/sdk/index.d.mts +149 -0
  712. package/sdk/index.mjs +5 -2
  713. package/server/api/system/timezone.get.ts +20 -0
  714. package/server/api/workshop/agent-tools/bindings/[id].patch.ts +28 -23
  715. package/server/api/workshop/aml/jobs/index.post.ts +74 -44
  716. package/server/api/workshop/aml/training-plans/[id]/train.post.ts +18 -0
  717. package/server/api/workshop/aml/training-plans/[id].delete.ts +18 -0
  718. package/server/api/workshop/aml/training-plans/[id].patch.ts +30 -0
  719. package/server/api/workshop/aml/training-plans/index.get.ts +9 -0
  720. package/server/api/workshop/aml/training-plans/index.post.ts +43 -0
  721. package/server/api/workshop/aml/twin/providers.get.ts +33 -0
  722. package/server/api/workshop/channel-templates/[id]/instantiate.post.ts +8 -2
  723. package/server/api/workshop/channels/[id]/twin-profile.get.ts +45 -0
  724. package/server/api/workshop/channels/[id]/twin-profile.patch.ts +72 -0
  725. package/server/plugins/00-local-time.ts +13 -10
  726. package/server/plugins/aml-twin-worker.ts +32 -0
  727. package/server/plugins/aw-plugins.ts +16 -0
  728. package/server/plugins/workshop.ts +21 -0
  729. package/server/plugins-builtin/twin-injection-default/index.mjs +23 -0
  730. package/server/services/system-config/helpers.ts +42 -41
  731. package/server/services/system-config/recompute.ts +68 -66
  732. package/server/services/workshop/agents/host-tool-bridge/catalog.ts +50 -18
  733. package/server/services/workshop/agents/host-tool-bridge/dispatch.ts +51 -5
  734. package/server/services/workshop/agents/host-tool-bridge/tools/industrial.ts +19 -6
  735. package/server/services/workshop/agents/industrial/aml-dataset-tools.ts +276 -276
  736. package/server/services/workshop/agents/industrial/aml-job-tools.ts +549 -363
  737. package/server/services/workshop/agents/industrial/audit-query.ts +30 -0
  738. package/server/services/workshop/agents/industrial/dcw-judge-tools.ts +9 -13
  739. package/server/services/workshop/agents/industrial/dcw-tools.ts +208 -213
  740. package/server/services/workshop/agents/industrial/index.ts +3 -2
  741. package/server/services/workshop/agents/industrial/manual-approval.ts +45 -0
  742. package/server/services/workshop/agents/industrial/ops-tools.ts +370 -382
  743. package/server/services/workshop/agents/industrial/optimization-tools.ts +148 -0
  744. package/server/services/workshop/agents/industrial/param-tools.ts +169 -172
  745. package/server/services/workshop/agents/industrial/twin-tools.ts +618 -61
  746. package/server/services/workshop/agents/industrial-context.ts +4 -2
  747. package/server/services/workshop/agents/node-bindings.repo.ts +35 -2
  748. package/server/services/workshop/agents/tool-classes.ts +28 -0
  749. package/server/services/workshop/aml/aml.repo.ts +412 -386
  750. package/server/services/workshop/aml/job-orchestrator/stages.ts +108 -96
  751. package/server/services/workshop/aml/job-orchestrator/start-job.ts +29 -5
  752. package/server/services/workshop/aml/job-orchestrator/submit.ts +36 -1
  753. package/server/services/workshop/aml/model-registry.ts +265 -175
  754. package/server/services/workshop/aml/predictor.ts +336 -262
  755. package/server/services/workshop/aml/python/__pycache__/aml_eval.cpython-312.pyc +0 -0
  756. package/server/services/workshop/aml/python/__pycache__/amlkit.cpython-312.pyc +0 -0
  757. package/server/services/workshop/aml/python/__pycache__/train-example.cpython-312.pyc +0 -0
  758. package/server/services/workshop/aml/python/__pycache__/train-hybrid-example.cpython-312.pyc +0 -0
  759. package/server/services/workshop/aml/python/aml_eval.py +39 -6
  760. package/server/services/workshop/aml/python/amlkit.py +222 -3
  761. package/server/services/workshop/aml/python/train-hybrid-example.py +278 -32
  762. package/server/services/workshop/aml/runtime.ts +4 -3
  763. package/server/services/workshop/aml/twin/acceptance.ts +26 -0
  764. package/server/services/workshop/aml/twin/binding-snapshot.ts +603 -0
  765. package/server/services/workshop/aml/twin/calibration-worker.ts +150 -0
  766. package/server/services/workshop/aml/twin/channel-profile.ts +80 -7
  767. package/server/services/workshop/aml/twin/contracts.ts +3 -0
  768. package/server/services/workshop/aml/twin/declarative-provider.ts +108 -0
  769. package/server/services/workshop/aml/twin/feature-flags.ts +63 -0
  770. package/server/services/workshop/aml/twin/hybrid-provider.ts +86 -0
  771. package/server/services/workshop/aml/twin/model-backed-provider.ts +332 -0
  772. package/server/services/workshop/aml/twin/physics-spec-draft.ts +185 -0
  773. package/server/services/workshop/aml/twin/physics-spec.ts +338 -0
  774. package/server/services/workshop/aml/twin/prompt-composer.ts +143 -0
  775. package/server/services/workshop/aml/twin/provider-contracts.ts +98 -0
  776. package/server/services/workshop/aml/twin/provider-health.ts +69 -0
  777. package/server/services/workshop/aml/twin/provider-loader.ts +98 -0
  778. package/server/services/workshop/aml/twin/provider-registry.ts +671 -0
  779. package/server/services/workshop/aml/twin/repo.ts +63 -4
  780. package/server/services/workshop/aml/twin/scene-builder.ts +118 -0
  781. package/server/services/workshop/aml/twin/scene-lifecycle.ts +60 -0
  782. package/server/services/workshop/aml/twin/snapshot-service.ts +395 -22
  783. package/server/services/workshop/aml/twin/training-plans.ts +260 -0
  784. package/server/services/workshop/aml/twin/trial-service.ts +97 -13
  785. package/server/services/workshop/aml/twin/write-guard.ts +20 -0
  786. package/server/services/workshop/daq/daq-controller/state.ts +8 -5
  787. package/server/services/workshop/daq/drivers/registry.ts +116 -144
  788. package/server/services/workshop/db/database/migrations.ts +40 -0
  789. package/server/services/workshop/db/database/open.ts +4 -1
  790. package/server/services/workshop/db/database/schema.ts +68 -1
  791. package/server/services/workshop/db/database/seed.ts +22 -0
  792. package/server/services/workshop/db/readonly.ts +30 -0
  793. package/server/services/workshop/dcw/dcw-controller/crud.ts +162 -152
  794. package/server/services/workshop/dcw/dcw-controller/helpers.ts +61 -57
  795. package/server/services/workshop/dcw/dcw-controller/types.ts +61 -57
  796. package/server/services/workshop/dcw/dcw-controller/write-audit.ts +49 -0
  797. package/server/services/workshop/dcw/dcw-controller/write.ts +137 -147
  798. package/server/services/workshop/dcw/dcw-node.ts +18 -2
  799. package/server/services/workshop/dcw/dcw-recipe.repo.ts +5 -0
  800. package/server/services/workshop/dcw/dcw-runtime.ts +9 -3
  801. package/server/services/workshop/dcw/drivers/index.ts +2 -1
  802. package/server/services/workshop/dcw/drivers/modbus-rtu.ts +85 -93
  803. package/server/services/workshop/dcw/drivers/modbus.ts +131 -139
  804. package/server/services/workshop/dcw/drivers/opcua.ts +103 -110
  805. package/server/services/workshop/dcw/drivers/registry.ts +25 -45
  806. package/server/services/workshop/dcw/drivers/shared.ts +24 -6
  807. package/server/services/workshop/dcw/param-limits.ts +193 -142
  808. package/server/services/workshop/dcw/param-map.repo.ts +318 -305
  809. package/server/services/workshop/plugin-driver-registry.ts +108 -0
  810. package/server/services/workshop/runtime/manager/admin-channel.ts +13 -0
  811. package/server/services/workshop/runtime/manager/channel-templates.ts +29 -2
  812. package/server/services/workshop/runtime/manager/runtime-wiring.ts +8 -0
  813. package/server/services/workshop/runtime/manager/state.ts +21 -4
  814. package/server/services/workshop/runtime/permission-scope.ts +79 -81
  815. package/server/services/workshop/runtime/schedule-runtime.ts +33 -6
  816. package/server/utils/errors.ts +8 -0
  817. package/shared/config/engine.mjs +5 -0
  818. package/shared/config/home.mjs +15 -20
  819. package/shared/config/schema.json +135 -133
  820. package/shared/dcw-protocol/line.ts +133 -131
  821. package/shared/dcw-protocol/recipe.ts +311 -301
  822. package/shared/local-time.mjs +116 -36
  823. package/.output/public/_nuxt/-hB4kEmt.js +0 -1
  824. package/.output/public/_nuxt/74x7BOWv2.js +0 -1
  825. package/.output/public/_nuxt/9c5GOgbu.js +0 -1
  826. package/.output/public/_nuxt/BHwG4yNs.js +0 -1
  827. package/.output/public/_nuxt/BIOq3xqe2.js +0 -1
  828. package/.output/public/_nuxt/BL_dbd2v2.js +0 -1
  829. package/.output/public/_nuxt/BNnnYEYh2.js +0 -1
  830. package/.output/public/_nuxt/BxYTM0hb.js +0 -1
  831. package/.output/public/_nuxt/C3twEwTh2.js +0 -1
  832. package/.output/public/_nuxt/CGZVhYJ4.js +0 -1
  833. package/.output/public/_nuxt/CJRDL4EG.js +0 -1
  834. package/.output/public/_nuxt/CKQPwwZa2.js +0 -1
  835. package/.output/public/_nuxt/CeWnOF3O.js +0 -1
  836. package/.output/public/_nuxt/ChoLwR-s.js +0 -1
  837. package/.output/public/_nuxt/DGw8juu_.js +0 -2
  838. package/.output/public/_nuxt/DJdDFnjG2.js +0 -1
  839. package/.output/public/_nuxt/DXIaadqv.js +0 -1
  840. package/.output/public/_nuxt/D_7AzAWe.js +0 -1
  841. package/.output/public/_nuxt/DdvQ7LRI.js +0 -14
  842. package/.output/public/_nuxt/DeYsUzhr.js +0 -1
  843. package/.output/public/_nuxt/DkLCjrCk2.js +0 -47
  844. package/.output/public/_nuxt/DpqA8D8_.js +0 -1
  845. package/.output/public/_nuxt/DqtgGFEc.js +0 -1
  846. package/.output/public/_nuxt/Dy3oXKdn2.js +0 -1
  847. package/.output/public/_nuxt/PLGqdko0.js +0 -1
  848. package/.output/public/_nuxt/U8oQxruK.js +0 -1
  849. package/.output/public/_nuxt/WleoCtUX.js +0 -1
  850. package/.output/public/_nuxt/ZvXovq7N2.js +0 -1
  851. package/.output/public/_nuxt/_id_.Bossmhv1.css +0 -1
  852. package/.output/public/_nuxt/_wsId_.D-u-dbP9.css +0 -1
  853. package/.output/public/_nuxt/aml.Bi5X6_oi.css +0 -1
  854. package/.output/public/_nuxt/builds/meta/6f524f3b-53e1-4df9-84e6-84d8058b9f16.json +0 -1
  855. package/.output/public/_nuxt/cDcDztgb2.js +0 -1
  856. package/.output/public/_nuxt/e7BBCLxr.js +0 -1
  857. package/.output/public/_nuxt/hkMGMTqt.js +0 -1
  858. package/.output/public/_nuxt/ikAUnxx3.js +0 -1
  859. package/.output/public/_nuxt/y9kob70X.js +0 -1
  860. package/.output/server/chunks/_/env-manager.mjs +0 -162
  861. package/.output/server/chunks/_/env-manager.mjs.map +0 -1
  862. package/.output/server/chunks/build/_id_-DgMpjM3_.mjs.map +0 -1
  863. package/.output/server/chunks/build/_id_-Dv3BQbYV.mjs.map +0 -1
  864. package/.output/server/chunks/build/_wsId_-BKJvFmyf.mjs.map +0 -1
  865. package/.output/server/chunks/build/aml-DdWicH3t.mjs.map +0 -1
  866. package/.output/server/chunks/build/client-only-qNA2OVV_.mjs +0 -43
  867. package/.output/server/chunks/build/client-only-qNA2OVV_.mjs.map +0 -1
  868. package/.output/server/chunks/build/daq-CPtsh0e7.mjs.map +0 -1
  869. package/.output/server/chunks/build/logs-CeaiO3y9.mjs.map +0 -1
  870. package/.output/server/chunks/build/pages-Bn90ijKD.mjs.map +0 -1
  871. package/.output/server/chunks/build/settings-DVAUVMsX.mjs.map +0 -1
  872. package/.output/server/chunks/build/useAmlJobs-DBuLvWMF.mjs.map +0 -1
  873. package/.output/server/chunks/build/useDcwAddNode-C8nE7geh.mjs.map +0 -1
  874. package/.output/server/chunks/build/useDcwRecipes-BzGOymqz.mjs.map +0 -1
  875. package/.output/server/chunks/build/useDcwWrites-3RxwN36I.mjs.map +0 -1
  876. package/.output/server/chunks/build/useLocalTime-9a4B-aHv.mjs +0 -35
  877. package/.output/server/chunks/build/useLocalTime-9a4B-aHv.mjs.map +0 -1
  878. package/.output/server/chunks/build/useMonitorData-CEpKXoD4.mjs.map +0 -1
  879. package/.output/server/chunks/build/useMonitorFormat-_7zLapf3.mjs.map +0 -1
  880. package/.output/server/chunks/build/useWorkbenchWorkspaces-B_2mOxN6.mjs.map +0 -1
  881. package/.output/server/chunks/build/useWorkshopWs-B-Es2Xg3.mjs.map +0 -1
  882. package/.output/server/chunks/build/useWorkspaceChannels-BwB6TAWY.mjs.map +0 -1
  883. package/.output/server/chunks/build/workshop-CmgpTwyf.mjs.map +0 -1
  884. /package/.output/public/_nuxt/{B2x8SKRO.js → B2x8SKRO2.js} +0 -0
  885. /package/.output/public/_nuxt/{BzvHUfRR2.js → BzvHUfRR.js} +0 -0
  886. /package/.output/public/_nuxt/{DPUXbTg92.js → DPUXbTg9.js} +0 -0
  887. /package/.output/public/_nuxt/{DdNujZN5.js → DdNujZN52.js} +0 -0
  888. /package/.output/public/_nuxt/{DlUQa0wn2.js → DlUQa0wn.js} +0 -0
  889. /package/.output/public/_nuxt/{Du9v6qGB.js → Du9v6qGB2.js} +0 -0
  890. /package/.output/public/_nuxt/{TOWR4WpO.js → TOWR4WpO2.js} +0 -0
  891. /package/.output/public/_nuxt/{cBI0JqsV2.js → cBI0JqsV.js} +0 -0
  892. /package/.output/public/_nuxt/{zh-S_7rN.js → zh-S_7rN2.js} +0 -0
@@ -0,0 +1,162 @@
1
+ /**
2
+ * E2E · AML 训练与优化控制解耦验收(2026-09-26 计划 v3;验收规范 A/B/C/D/E 五组)。
3
+ * 用法: node scripts/e2e-aml-decoupled.mjs [base=3005]
4
+ * 依赖:平台已运行;复用现有产线/数据集/模型资产(训练 spec 来自 live-optloop run 目录)。
5
+ */
6
+ import { readFileSync, existsSync } from 'node:fs'
7
+ import { join, resolve } from 'node:path'
8
+
9
+ const REPO = resolve(import.meta.dirname, '..')
10
+ const BASE = process.argv[2] ? `http://127.0.0.1:${process.argv[2]}` : 'http://127.0.0.1:3005'
11
+ const RUNDIR = join(REPO, 'bench', 'results', '2026-09-26T01-55-11-aml-live-optloop')
12
+ const DATASET_ID = 'ds-muhrindr-0a4b2s'
13
+ const LINE_ID = 'ln-fd7cf3a0'
14
+ const MODEL_ID = 'mdl-muhy2feb-pd5iy3'
15
+ const SCENE_ID = 'castfilm-hold-opt-0926T0155'
16
+ const DATASET_SPEC_PATH = join(REPO, 'aml', 'datasets', DATASET_ID, 'spec.json')
17
+ process.env.NO_PROXY = '127.0.0.1,localhost'
18
+
19
+ const results = []
20
+ function assert(name, ok, detail = '') {
21
+ results.push({ name, ok, detail })
22
+ console.log(`${ok ? '✔' : '✘'} ${name}${detail ? ` — ${String(detail).slice(0, 160)}` : ''}`)
23
+ }
24
+ const sleep = ms => new Promise(r => setTimeout(r, ms))
25
+ async function api(method, path, body, token) {
26
+ for (let attempt = 0; attempt < 3; attempt++) {
27
+ try {
28
+ const r = await fetch(BASE + path, { method, headers: { 'content-type': 'application/json', ...(token ? { authorization: `Bearer ${token}` } : {}) }, body: body === undefined ? undefined : JSON.stringify(body), signal: AbortSignal.timeout(300_000) })
29
+ return { status: r.status, json: await r.json().catch(() => null) }
30
+ }
31
+ catch (err) {
32
+ if (attempt === 2) throw err
33
+ await sleep(3000)
34
+ }
35
+ }
36
+ }
37
+ const reg = await api('POST', '/api/workshop/users/register', { name: `decouple-${Date.now()}` })
38
+ const token = reg.json?.data?.token
39
+ {
40
+ const { DatabaseSync } = await import('node:sqlite')
41
+ const db = new DatabaseSync(join(REPO, '.AgentWorkShop', 'data', 'users.sqlite'))
42
+ db.prepare(`UPDATE users SET role='admin' WHERE email LIKE 'decouple-%' AND role='user'`).run()
43
+ db.close()
44
+ }
45
+ if (!token) throw new Error('注册失败')
46
+
47
+ /* ═══ A. 解耦:两面互斥 ═══ */
48
+ const tplTrain = await api('POST', '/api/workshop/channel-templates/chtpl-aml-training-default/instantiate', { name: `验收-训练通道-${Date.now() % 10000}` }, token)
49
+ const trainCh = tplTrain.json?.data
50
+ assert('A1a 训练通道实例化', tplTrain.status === 200 && !!trainCh?.channelId, JSON.stringify(tplTrain.json).slice(0, 120))
51
+ const trainWorker = trainCh.agents.find(a => a.role === 'worker')
52
+ const tplOpt = await api('POST', '/api/workshop/channel-templates/chtpl-aml-optimization-default/instantiate', { name: `验收-优化通道-${Date.now() % 10000}` }, token)
53
+ const optCh = tplOpt.json?.data
54
+ assert('A1b 优化通道实例化', tplOpt.status === 200 && !!optCh?.channelId, JSON.stringify(tplOpt.json).slice(0, 120))
55
+ const optWorker = optCh.agents.find(a => a.role === 'worker')
56
+
57
+ const trainTools = (await api('GET', `/api/workshop/agent-tools/list?agentId=${trainWorker.id}`, undefined, token)).json?.data?.tools?.map(t => t.name) ?? []
58
+ const optTools = (await api('GET', `/api/workshop/agent-tools/list?agentId=${optWorker.id}`, undefined, token)).json?.data?.tools?.map(t => t.name) ?? []
59
+ assert('A1c 训练面无 MPC/直写', !trainTools.includes('twin_trial_run') && !trainTools.includes('mpc_optimize') && !trainTools.includes('dcw_control') && !trainTools.includes('optimization_explore'), trainTools.filter(t => /twin_trial|mpc|dcw_control|explore|bayes/.test(t)).join(','))
60
+ assert('A1d 训练面有建模/训练/场景', trainTools.includes('aml_job_submit') && trainTools.includes('aml_dataset_build') && trainTools.includes('twin_scene_discover') && trainTools.includes('aml_training_plan_train'))
61
+ assert('A1e 优化面无训练族', !optTools.includes('aml_job_submit') && !optTools.includes('aml_dataset_build') && !optTools.includes('aml_training_plan_train'), optTools.filter(t => /aml_job|aml_dataset|plan/.test(t)).join(','))
62
+ assert('A1f 优化面有探索/验证/寻优', optTools.includes('optimization_explore') && optTools.includes('twin_trial_run') && optTools.includes('twin_bayes_optimize'))
63
+
64
+ const gateProfile = await api('GET', `/api/workshop/channels/${optCh.channelId}/twin-profile`, undefined, token)
65
+ assert('A2a 优化通道初始=探索模式', gateProfile.json?.data?.derived?.mode === 'exploration', JSON.stringify(gateProfile.json?.data?.derived ?? null).slice(0, 80))
66
+ const mpcReject = await api('POST', '/api/workshop/agent-tools/invoke', { agentId: optWorker.id, tool: 'mpc_optimize', args: { snapshot_id: 'snap-none', baseline_controls: {} } }, token)
67
+ assert('A2b 探索模式拒绝 MPC', mpcReject.status === 200 && /探索模式/.test(mpcReject.json?.data?.result?.text ?? ''), (mpcReject.json?.data?.result?.text ?? '').slice(0, 100))
68
+ const bayesReject = await api('POST', '/api/workshop/agent-tools/invoke', { agentId: optWorker.id, tool: 'twin_bayes_optimize', args: { snapshot_id: 'snap-none', baseline_controls: {} } }, token)
69
+ assert('A2c 探索模式拒绝贝叶斯', /探索模式|模型驱动/.test(bayesReject.json?.data?.result?.text ?? ''), (bayesReject.json?.data?.result?.text ?? '').slice(0, 80))
70
+ const trainJobReject = await api('POST', '/api/workshop/agent-tools/invoke', { agentId: optWorker.id, tool: 'aml_job_submit', args: { dataset_id: 'x', code: 'x', change_note: 'x' } }, token)
71
+ assert('A2d 优化通道拒绝训练族', /职责解耦|仅限/.test(trainJobReject.json?.data?.result?.text ?? ''), (trainJobReject.json?.data?.result?.text ?? '').slice(0, 80))
72
+
73
+ /* ═══ E1/E3 提示词:绑定节点 + 工况块 + 场景提示 ═══ */
74
+ const bindDcw = await api('POST', '/api/workshop/agent-tools/bindings', { agentId: optWorker.id, nodeId: 'dw-352ec66a', kind: 'dcw', mode: 'auto' }, token)
75
+ const bindDaq = await api('POST', '/api/workshop/agent-tools/bindings', { agentId: optWorker.id, nodeId: 'dn-a0d54660', kind: 'daq', mode: 'auto' }, token)
76
+ assert('E0a 绑定数控/数采节点', bindDcw.status === 200 && bindDaq.status === 200)
77
+ const tuningRes = await api('PATCH', `/api/workshop/agent-tools/bindings/${bindDcw.json?.data?.binding?.id}`, { tuning: { step: 0.5, note: '线速度微调;温度未稳时禁调' } }, token)
78
+ assert('E0b 绑定调试元数据(step=0.5)', tuningRes.status === 200 && tuningRes.json?.data?.binding?.tuning?.step === 0.5)
79
+
80
+ const goalObjective = { schemaVersion: 1, objectiveId: 'thickness-50um', targets: { node_cd2d2d09b5fd7d72: 50 }, weights: { node_cd2d2d09b5fd7d72: 1 }, controlCosts: {}, horizonSteps: 4, trustRegion: {} }
81
+ const patchGoal = await api('PATCH', `/api/workshop/channels/${optCh.channelId}/twin-profile`, { objective: goalObjective }, token)
82
+ assert('E0c goal 下发(REST)', patchGoal.status === 200 && patchGoal.json?.data?.profile?.objective?.objectiveId === 'thickness-50um')
83
+
84
+ const promptRes = await api('GET', `/api/workshop/channels/${optCh.channelId}/twin-profile?agentId=${optWorker.id}`, undefined, token)
85
+ const prompt = promptRes.json?.data?.derived?.promptPreview ?? ''
86
+ assert('E1 探索模式提示词(纪律+工况块+跨度)', /探索执行者/.test(prompt) && /调试范围/.test(prompt) && /每步跨度 0\.5/.test(prompt) && /物理意义/.test(prompt), prompt.slice(0, 120))
87
+ assert('E3 场景提示追加', /工艺优化团队/.test(prompt))
88
+
89
+ /* ═══ B. 真实探索与数据回流 ═══ */
90
+ const dcwBefore = (await api('GET', '/api/workshop/dcw/', undefined, token)).json?.data?.nodes.find(n => n.id === 'dw-352ec66a')?.value
91
+ const explore = await api('POST', '/api/workshop/agent-tools/invoke', { agentId: optWorker.id, tool: 'optimization_explore', args: { direction: 'up', settle_seconds: 12, hypothesis: 'E2E 探索:验证真实写入与响应配对' } }, token)
92
+ const exploreText = explore.json?.data?.result?.text ?? ''
93
+ assert('B1a 探索步真实写入成功', /探索步完成/.test(exploreText), exploreText.slice(0, 150))
94
+ const dcwAfter = (await api('GET', '/api/workshop/dcw/', undefined, token)).json?.data?.nodes.find(n => n.id === 'dw-352ec66a')?.value
95
+ assert('B1b DCW 设定实际变化', Number(dcwAfter) !== Number(dcwBefore), `${dcwBefore} → ${dcwAfter}`)
96
+ {
97
+ const { DatabaseSync } = await import('node:sqlite')
98
+ const db = new DatabaseSync(join(REPO, '.AgentWorkShop', 'data', 'workshop.sqlite'), { readOnly: true })
99
+ const row = db.prepare('SELECT COUNT(*) AS c FROM optimization_explorations WHERE channel_id = ? AND write_status = ?').get(optCh.channelId, 'ok')
100
+ db.close()
101
+ assert('B1c 探索记录落库(写入值↔响应值)', row.c >= 1, `rows=${row.c}`)
102
+ }
103
+
104
+ /* ═══ C. 建模任务:创建 → 立即修正训练 → 模型入册 ═══ */
105
+ const datasetsRes = await api('GET', '/api/workshop/aml/datasets', undefined, token)
106
+ const ds = (datasetsRes.json?.data?.datasets ?? []).find(d => d.id === DATASET_ID)
107
+ assert('C0 现有数据集可用', !!ds?.id, ds?.id)
108
+ const trainingSpecPath = join(RUNDIR, 'physics-spec-remapped.json')
109
+ const trainingSpec = existsSync(trainingSpecPath) ? JSON.parse(readFileSync(trainingSpecPath, 'utf8')) : null
110
+ const datasetSpec = existsSync(DATASET_SPEC_PATH) ? JSON.parse(readFileSync(DATASET_SPEC_PATH, 'utf8')) : ds?.spec ?? ds?.datasetSpec ?? null
111
+ assert('C0b 训练 spec 可用', !!trainingSpec)
112
+ assert('C0c 数据集 spec 可用', !!datasetSpec)
113
+ const planRes = await api('POST', '/api/workshop/aml/training-plans', {
114
+ name: 'E2E 修正训练任务', lineId: LINE_ID, productId: ds.productId, recipeId: ds.recipeId,
115
+ sceneId: SCENE_ID, sceneVersion: '1.0.0', objectiveId: 'thickness-50um',
116
+ strategy: 'manual', datasetSpec, trainingSpec,
117
+ modelNamePrefix: 'E2E 解耦验收模型', params: { epochs: 600, hidden: 192, lr: 0.0008, residual_scale: 2.5, ensemble: 3 }, seed: 7,
118
+ }, token)
119
+ assert('C1a 建模任务创建', planRes.status === 200 && !!planRes.json?.data?.plan?.id, JSON.stringify(planRes.json).slice(0, 150))
120
+ const planId = planRes.json?.data?.plan?.id
121
+ const trainRes = await api('POST', `/api/workshop/aml/training-plans/${planId}/train`, {}, token)
122
+ assert('C1b 修正训练触发', trainRes.status === 200 && !!trainRes.json?.data?.jobId, JSON.stringify(trainRes.json).slice(0, 120))
123
+ let planDone = null
124
+ for (let i = 0; i < 60; i++) {
125
+ await sleep(10_000)
126
+ const st = (await api('GET', '/api/workshop/aml/training-plans', undefined, token)).json?.data?.plans?.find(p => p.id === planId)
127
+ if (st && (st.lastStatus === 'done' || st.lastStatus === 'failed')) {
128
+ planDone = st
129
+ break
130
+ }
131
+ }
132
+ assert('C2 修正训练完成且模型入册', planDone?.lastStatus === 'done' && !!planDone?.lastModelId, `status=${planDone?.lastStatus} model=${planDone?.lastModelId}`)
133
+
134
+ /* ═══ D. 投用:绑定校验 → 模型受控 → trial/bayes ═══ */
135
+ const rejectBind = await api('PATCH', `/api/workshop/channels/${optCh.channelId}/twin-profile`, { boundModelId: 'mdl-muhrno7x-l5fp4f' }, token)
136
+ assert('D1 未过门模型绑定被拒(409)', rejectBind.status === 409, JSON.stringify(rejectBind.json).slice(0, 100))
137
+ const okBind = await api('PATCH', `/api/workshop/channels/${optCh.channelId}/twin-profile`, { boundModelId: MODEL_ID, optimizationMode: 'aml' }, token)
138
+ assert('D2 合规模型绑定 → 模型受控', okBind.status === 200 && okBind.json?.data?.mode === 'model_backed', JSON.stringify(okBind.json?.data).slice(0, 100))
139
+
140
+ const snapRes = await api('POST', '/api/workshop/agent-tools/invoke', { agentId: optWorker.id, tool: 'twin_snapshot_create', args: { auto_daq: true, channel_id: optCh.channelId, phase: 'calibration' } }, token)
141
+ const snapshotId = (snapRes.json?.data?.result?.text ?? '').match(/snapshot_id:\s*(\S+)/)?.[1]
142
+ assert('D3a 快照创建', !!snapshotId, (snapRes.json?.data?.result?.text ?? '').slice(0, 80))
143
+ const baseline = { node_3bb27a47f55e26fb: 95.2, node_82be092f2cdf43f4: 200, node_09ee97dc03e102a7: 150, node_45c7316fe5067dfd: 200, node_ca64b4f10ae9cd2c: 1, node_d1298f9e18c09b4d: 200 }
144
+ const trialRes = await api('POST', '/api/workshop/agent-tools/invoke', { agentId: optWorker.id, tool: 'twin_trial_run', args: { snapshot_id: snapshotId, model_id: MODEL_ID, baseline_controls: baseline, candidate_controls: Array.from({ length: 4 }, () => ({ ...baseline, node_3bb27a47f55e26fb: 95.2 + 0.5 })) } }, token)
145
+ const trialText = trialRes.json?.data?.result?.text ?? ''
146
+ assert('D3b 孪生验证用绑定模型 rollout', new RegExp(MODEL_ID).test(trialText) && /training|hybrid|模型驱动/.test(trialText), trialText.slice(0, 120))
147
+ const bayesRes = await api('POST', '/api/workshop/agent-tools/invoke', { agentId: optWorker.id, tool: 'twin_bayes_optimize', args: { snapshot_id: snapshotId, baseline_controls: baseline, rounds: 2, candidates_per_round: 4 } }, token)
148
+ const bayesText = bayesRes.json?.data?.result?.text ?? ''
149
+ assert('D4 贝叶斯寻优(收敛轨迹+受治理推荐)', /surrogate_ucb/.test(bayesText) && /convergence/.test(bayesText) && /recommendationId/.test(bayesText), bayesText.slice(0, 120))
150
+
151
+ /* ═══ E4 模式切换后提示词重算 ═══ */
152
+ const backToExplore = await api('PATCH', `/api/workshop/channels/${optCh.channelId}/twin-profile`, { optimizationMode: 'exploration' }, token)
153
+ const promptAfter = (await api('GET', `/api/workshop/channels/${optCh.channelId}/twin-profile?agentId=${optWorker.id}`, undefined, token)).json?.data?.derived
154
+ assert('E4 模式切换 → 提示词重算(回探索纪律)', backToExplore.status === 200 && promptAfter.mode === 'exploration' && /探索执行者/.test(promptAfter.promptPreview ?? ''), (promptAfter.promptPreview ?? '').slice(0, 80))
155
+
156
+ /* ═══ 汇总 ═══ */
157
+ const pass = results.filter(r => r.ok).length
158
+ console.log(`\n===== E2E 解耦验收:${pass}/${results.length} 通过 =====`)
159
+ if (pass < results.length) {
160
+ for (const f of results.filter(r => !r.ok)) console.log(` FAIL: ${f.name} ${f.detail}`)
161
+ process.exit(1)
162
+ }
@@ -139,6 +139,7 @@ export async function s2_model() {
139
139
  unit: '℃',
140
140
  min: 150,
141
141
  max: 220,
142
+ stepLimit: 10,
142
143
  lineId: ctx.line?.id,
143
144
  holdIntervalMs: 0,
144
145
  })
@@ -149,6 +150,7 @@ export async function s2_model() {
149
150
  unit: '℃',
150
151
  min: 150,
151
152
  max: 220,
153
+ stepLimit: 10,
152
154
  lineId: ctx.line?.id,
153
155
  holdIntervalMs: 0,
154
156
  })
@@ -3,7 +3,7 @@
3
3
  * (由 scripts/e2e-full-closedloop.mjs 按职责拆出;内容逐行原文搬运)
4
4
  */
5
5
  import { TAG, ctx } from './state.mjs'
6
- import { api, ok, raw, section, waitUntil } from './lib.mjs'
6
+ import { api, ok, raw, section, sleep, waitUntil } from './lib.mjs'
7
7
 
8
8
  // ════════════════════════════════════════════════════════════════
9
9
  // S8 Agent 鉴权矩阵(P0-D 回归)
@@ -52,15 +52,18 @@ export async function s8_agent_authz() {
52
52
  ok(bind.status === 200, '绑定 dcw 节点(auto)', JSON.stringify(bind.data ?? {}).slice(0, 80))
53
53
  // 断言的是「绑定闸门放行」而不是「下发一定成功」:S7 刚在同一节点做过用户回退,
54
54
  // 同向重写会被**写入保持窗口**(安全护栏)拦下 —— 那是正确行为,不该算绑定失败。
55
- // 但后面的 judge 断言需要一条本 agent 发起的 open 记录,因此窗口内小步重试
56
- // (旧写法:一次被护栏拦下 → judge 期望必然落空,把正确护栏报成失败)。
55
+ // v0.7.50 起在线写另有 60s 最小间隔卡控(429 WRITE_INTERVAL_NOT_ELAPSED),同属
56
+ // 正确护栏。但后面的 judge 断言需要一条本 agent 发起的 open 记录,因此窗口内按
57
+ // 提示的剩余秒数等待后重试(旧写法:一次被护栏拦下 → judge 期望必然落空,
58
+ // 把正确护栏报成失败)。
57
59
  let boundControl
58
60
  let bcText = ''
59
- for (let attempt = 0; attempt < 5; attempt += 1) {
61
+ for (let attempt = 0; attempt < 8; attempt += 1) {
60
62
  boundControl = await invoke('dcw_control', { node_id: ctx.dcw.main?.id, value: 196, hypothesis: 'e2e 绑定放行验证' })
61
63
  bcText = String(boundControl.data?.result?.text ?? '')
62
- if (!/写入保持窗口/.test(bcText)) break
63
- await new Promise(r => setTimeout(r, 10_000))
64
+ if (!/写入保持窗口/.test(bcText) && !/两次在线写入间隔/.test(bcText)) break
65
+ const need = Number(/当前还需 (\d+)s/.exec(bcText)?.[1] ?? 5)
66
+ await new Promise(r => setTimeout(r, Math.min(70, Math.max(2, need + 1)) * 1000))
64
67
  }
65
68
  ok(boundControl.data?.result?.isError !== true || !/无权|未绑定/.test(bcText),
66
69
  '已绑定 agent 的 dcw_control 通过绑定闸门', bcText.slice(0, 110))
@@ -115,6 +118,9 @@ export async function s8_agent_authz() {
115
118
 
116
119
  // 8) manual 模式 → 挂起审批(dcw_control)
117
120
  await api('POST', '/api/workshop/agent-tools/bindings', { body: { agentId: ctx.agent.id, nodeId: ctx.dcw.two?.id, kind: 'dcw', mode: 'manual' }, token: ctx.token })
121
+ // v0.7.50 治理卡控:在线写(agent)有 60s 最小间隔 —— 配方开跑刚逐参数写过节二,
122
+ // 先等冷却窗走完再发起 HITL 下发,否则批准后的执行会被 429 快速拒绝。
123
+ await sleep(61_000)
118
124
  const hitlPromise = invoke('dcw_control', { node_id: ctx.dcw.two?.id, value: 189 }, { timeoutMs: 120_000 }).catch(e => ({ data: { result: { isError: true, text: `invoke err ${e.message}` } } }))
119
125
  const pending = await waitUntil('manual 挂起审批', async () => {
120
126
  const r = await api('GET', '/api/workshop/agent-tools/approvals', { token: ctx.token })
@@ -3,7 +3,7 @@
3
3
  * (由 scripts/e2e-full-closedloop.mjs 按职责拆出;内容逐行原文搬运)
4
4
  */
5
5
  import { TAG, ctx } from './state.mjs'
6
- import { api, ok, section, waitUntil } from './lib.mjs'
6
+ import { api, ok, section, sleep, waitUntil } from './lib.mjs'
7
7
 
8
8
  // ════════════════════════════════════════════════════════════════
9
9
  // S4 数采闭环
@@ -156,6 +156,9 @@ export async function s5_frames() {
156
156
  // ════════════════════════════════════════════════════════════════
157
157
  export async function s6_dcw() {
158
158
  section('S6 数控闭环(下发→回读→记账→锚点→回退)')
159
+ // v0.7.50 治理卡控:在线写(manual/agent)有 60s 最小间隔。开跑产线时配方刚逐参数
160
+ // 写过本节点,这里等冷却窗走完,否则第一笔下发就被 429 快速拒绝。
161
+ await sleep(61_000)
159
162
  const w = await api('POST', `/api/workshop/dcw/${ctx.dcw.main?.id}/write`, { body: { value: 195 }, token: ctx.token })
160
163
  const outcome = w.data?.outcome ?? w.data
161
164
  ok(outcome?.ok === true, '下发 195℃ 成功', `readback=${outcome?.readback ?? '?'}`)
@@ -0,0 +1,57 @@
1
+ /**
2
+ * E2E · 系统时区真实切换验证。
3
+ * 用法: pnpm exec tsx scripts/e2e-timezone-settings.mjs [baseUrl]
4
+ * 默认连接 3005;脚本最后恢复 Asia/Shanghai。
5
+ */
6
+ import assert from 'node:assert/strict'
7
+ import { DatabaseSync } from 'node:sqlite'
8
+ import { join } from 'node:path'
9
+
10
+ const BASE = process.argv[2] ?? 'http://127.0.0.1:3005'
11
+ const ROOT = process.cwd()
12
+ process.env.NO_PROXY = '127.0.0.1,localhost'
13
+
14
+ async function api(method, path, body, token) {
15
+ const r = await fetch(BASE + path, {
16
+ method,
17
+ headers: { 'content-type': 'application/json', ...(token ? { authorization: `Bearer ${token}` } : {}) },
18
+ body: body === undefined ? undefined : JSON.stringify(body),
19
+ signal: AbortSignal.timeout(30_000),
20
+ })
21
+ return { status: r.status, json: await r.json().catch(() => null) }
22
+ }
23
+
24
+ const reg = await api('POST', '/api/workshop/users/register', { name: `tz-e2e-${Date.now()}` })
25
+ const token = reg.json?.data?.token
26
+ assert.ok(token, 'register token missing')
27
+ const users = new DatabaseSync(join(ROOT, '.AgentWorkShop', 'data', 'users.sqlite'))
28
+ users.prepare('UPDATE users SET role=\'admin\' WHERE email LIKE \'tz-e2e-%\' AND role=\'user\'').run()
29
+ users.close()
30
+
31
+ const db = new DatabaseSync(join(ROOT, '.AgentWorkShop', 'data', 'workshop.sqlite'))
32
+ const before = db.prepare('SELECT id, created_at AS createdAt FROM chat_messages ORDER BY rowid DESC LIMIT 1').get()
33
+ const written = []
34
+ try {
35
+ for (const zone of ['Asia/Shanghai', 'America/Los_Angeles']) {
36
+ const patch = await api('PATCH', '/api/system/settings', { override: { 'time.timeZone': zone } }, token)
37
+ assert.equal(patch.status, 200, `timezone patch failed for ${zone}`)
38
+ const current = await api('GET', '/api/system/timezone', undefined, token)
39
+ assert.equal(current.json?.data?.timeZone, zone, `timezone readback mismatch for ${zone}`)
40
+
41
+ const ops = await api('POST', '/api/workshop/ops-logs', { summary: `timezone e2e ${zone}` }, token)
42
+ assert.equal(ops.status, 200, `ops write failed for ${zone}`)
43
+ const row = db.prepare('SELECT at FROM audit_log WHERE summary = ? ORDER BY rowid DESC LIMIT 1').get(`timezone e2e ${zone}`)
44
+ assert.ok(row?.at, `audit row missing for ${zone}`)
45
+ assert.match(String(row.at), zone === 'Asia/Shanghai' ? /\+08:00$/ : /-0[78]:00$/)
46
+ written.push({ zone, at: String(row.at) })
47
+ }
48
+
49
+ assert.ok(before === undefined || Date.parse(String(before.createdAt)) > 0, 'existing chat timestamp must remain parseable')
50
+ assert.ok(written.every(item => Number.isFinite(Date.parse(item.at))), 'all timezone audit timestamps must remain parseable')
51
+ assert.notEqual(written[0].at.slice(-6), written[1].at.slice(-6), 'timezone switches must change the recorded offset')
52
+ console.log(JSON.stringify({ ok: true, written, timezoneApi: (await api('GET', '/api/system/timezone', undefined, token)).json?.data }, null, 2))
53
+ }
54
+ finally {
55
+ await api('PATCH', '/api/system/settings', { override: { 'time.timeZone': 'Asia/Shanghai' } }, token)
56
+ db.close()
57
+ }
@@ -0,0 +1,304 @@
1
+ /**
2
+ * LIVE AML · mock-omp 全自动链路验证(用户请求:mock 模拟真实 omp 的下发操作;
3
+ * 模型自动训练 → 验证自动执行 → 验证无误后自动投入使用;不调用真实 omp API)。
4
+ *
5
+ * mock 原理:omp worker/lead 的「下发操作」= 以 agent 身份经 agent-tools/invoke 桥调用
6
+ * host 工具(与真实 omp 完全同链路:同一工具面/权限/HITL 治理)。本脚本以确定性剧本
7
+ * 重演 omp 收到优化任务后的自主编排,所有动作真实落库落工件:
8
+ * [worker] aml_node_catalog → aml_model_find(目标选型) → aml_job_submit(hybrid_residual,
9
+ * 无 code → 平台参考训练器,自动训练) → aml_job_status(轮询,平台自动门禁 G1-G5)
10
+ * → twin_snapshot_create → twin_gate_evaluate(场景级门禁,eligibility 写回)
11
+ * [lead] aml_model_promote(→ production) ⇒ 阻塞等 HITL ⇒ 主脚本以用户身份经
12
+ * hitl/respond 自动批准(mock 人工) ⇒ 旧生产模型自动退役
13
+ * [worker] twin_trial_run + mpc_optimize(**不传 model_id**)⇒ 验证 production 自动投用
14
+ * → 推荐 → 写 DCW → 复测
15
+ * 用法: node scripts/live-aml-mockomp.mjs <live-run 目录>
16
+ */
17
+ import { writeFileSync, appendFileSync, existsSync, readdirSync, statSync, readFileSync } from 'node:fs'
18
+ import { join, resolve } from 'node:path'
19
+
20
+ const REPO = resolve(import.meta.dirname, '..')
21
+ const AW_BASE = process.env.AW_BASE ?? 'http://127.0.0.1:3005'
22
+ const PREV_DIR = resolve(process.argv[2] ?? '')
23
+ const LOG_PATH = join(PREV_DIR, 'live-run.log')
24
+ const DOC_PATH = join(PREV_DIR, 'MOCKOMP-LOG.md')
25
+ const AML_ROOT = process.env.AW_AML_DIR_LIVE ?? join(REPO, 'aml')
26
+ const OBJECTIVE = 'thickness-52um'
27
+ process.env.NO_PROXY = '127.0.0.1,localhost'
28
+
29
+ const pick = (re) => { const src = readFileSync(LOG_PATH, 'utf8'); const lines = src.split('\n').reverse(); for (const line of lines) { const m = line.match(re); if (m) return m } return null }
30
+ const datasetId = pick(/数据集 (ds-[0-9a-z-]+):/)[1]
31
+ const lineId = pick(/lineId=(ln-[0-9a-f]+)/)[1]
32
+ const recipeId = pick(/recipeId=(rc-[0-9a-f]+)/)[1]
33
+ const workerId = pick(/worker=([0-9a-z-]+)/)[1]
34
+ const channelId = pick(/channelId=([0-9a-z-]+)/)[1]
35
+ const SCENE_ID = pick(/scene=castfilm-hold-opt-[0-9T]+/)[0].split('scene=')[1]
36
+
37
+ const L2 = []
38
+ function log(line) {
39
+ const text = typeof line === 'string' ? line : JSON.stringify(line)
40
+ const stamped = `[${new Date().toISOString()}] ${text}`
41
+ console.log(stamped)
42
+ L2.push(text)
43
+ appendFileSync(LOG_PATH, stamped + '\n')
44
+ }
45
+ const sleep = ms => new Promise(r => setTimeout(r, ms))
46
+ async function api(method, path, body, token) {
47
+ const r = await fetch(AW_BASE + path, { method, headers: { 'content-type': 'application/json', ...(token ? { authorization: `Bearer ${token}` } : {}) }, body: body === undefined ? undefined : JSON.stringify(body), signal: AbortSignal.timeout(600_000) })
48
+ return { status: r.status, json: await r.json().catch(() => null) }
49
+ }
50
+ async function invoke(tool, args, agentId, token) {
51
+ const r = await api('POST', '/api/workshop/agent-tools/invoke', { agentId, tool, args }, token)
52
+ const text = r.json?.data?.result?.text ?? r.json?.result?.text ?? ''
53
+ log(` [agent→invoke] ${tool} → ${r.status}`)
54
+ return { status: r.status, text }
55
+ }
56
+
57
+ log(`mock-omp 全自动链路启动: dataset=${datasetId} line=${lineId} scene=${SCENE_ID} objective=${OBJECTIVE}`)
58
+
59
+ /* ── 0. 身份准备:平台用户(admin,用于 HITL 批准)+ 团队 lead 实例 ── */
60
+ const reg = await api('POST', '/api/workshop/users/register', { name: `mockomp-${Date.now()}` })
61
+ const token = reg.json?.data?.token
62
+ {
63
+ const { DatabaseSync } = await import('node:sqlite')
64
+ const usersDb = new DatabaseSync(join(REPO, '.AgentWorkShop', 'data', 'users.sqlite'))
65
+ usersDb.prepare(`UPDATE users SET role = 'admin' WHERE email LIKE 'mockomp-%' AND role = 'user'`).run()
66
+ usersDb.close()
67
+ const wsDb = new DatabaseSync(join(REPO, '.AgentWorkShop', 'data', 'workshop.sqlite'))
68
+ const lead = wsDb.prepare(`SELECT id, name FROM channel_agents WHERE channel_id = ? AND role = 'lead' AND enabled = 1 LIMIT 1`).get(channelId)
69
+ wsDb.close()
70
+ if (!lead) throw new Error('团队 lead 实例未找到(channel=' + channelId + ')')
71
+ var leadId = lead.id
72
+ }
73
+ log(`用户 token 就绪;团队 lead=${leadId} worker=${workerId}`)
74
+
75
+ /* ── 1. [worker] aml_node_catalog:确认绑定节点面 ── */
76
+ const catalog = await invoke('aml_node_catalog', {}, workerId, token)
77
+ log(catalog.text.split('\n').slice(0, 6).map(x => ' ' + x).join('\n'))
78
+
79
+ /* ── 2. [worker] aml_model_find:按优化目标选型(预期无 52μm 模型 → 新建) ── */
80
+ const find = await invoke('aml_model_find', { line_id: lineId, recipe_id: recipeId, purpose: 'mpc_surrogate', objective_id: OBJECTIVE }, workerId, token)
81
+ log(' 选型:\n' + find.text.split('\n').slice(0, 6).map(x => ' ' + x).join('\n'))
82
+ const hasExisting = /mdl-/.test(find.text) && !find.text.includes('没有匹配模型')
83
+
84
+ /* ── 3. [worker] aml_job_submit:hybrid_residual 无 code → 平台自动训练 ── */
85
+ const physicsSpec = JSON.parse(readFileSync(join(PREV_DIR, 'physics-spec-remapped.json'), 'utf8'))
86
+ const sfx = '0926T0155-mockomp'
87
+ const submitted = await invoke('aml_job_submit', {
88
+ dataset_id: datasetId,
89
+ job_kind: 'hybrid_residual',
90
+ change_note: `mock-omp 全自动:为优化目标 ${OBJECTIVE} 自动训练(平台参考训练器)`,
91
+ params: { epochs: 600, hidden: 192, lr: 0.0008, residual_scale: 2.5, ensemble: 3 },
92
+ seed: 7,
93
+ purpose: 'mpc_surrogate',
94
+ scene_id: SCENE_ID,
95
+ scene_version: '1.0.0',
96
+ objective_id: OBJECTIVE,
97
+ physics_spec: physicsSpec,
98
+ provider_id: physicsSpec.modelId,
99
+ provider_version: '1.0.0',
100
+ provider_hash: `sha256:${JSON.stringify(physicsSpec).length}`,
101
+ model_name: `流延膜厚闭环模型 ${sfx}`,
102
+ model_description: `输入=全部 6 个 DCW 执行器;输出=膜厚 goal(52μm);场景 ${SCENE_ID}@1.0.0;产线 ${lineId}/配方 ${recipeId};目标 ${OBJECTIVE};mock-omp 自动提交`,
103
+ }, workerId, token)
104
+ log(submitted.text.split('\n').slice(0, 7).map(x => ' ' + x).join('\n'))
105
+ const jobId = (submitted.text.match(/job_id:\s*(job-[0-9a-z-]+)/) || [])[1]
106
+ if (!jobId) throw new Error('aml_job_submit 未返回 job_id: ' + submitted.text.slice(0, 200))
107
+
108
+ /* ── 4. [worker] aml_job_status 轮询:平台自动训练 + 自动门禁 ── */
109
+ let jobDone = null
110
+ for (let i = 0; i < 90; i++) {
111
+ await sleep(10_000)
112
+ const st = await invoke('aml_job_status', { job_id: jobId }, workerId, token)
113
+ const statusM = st.text.match(/状态\s+(\w+)/)
114
+ if (i % 3 === 0) log(' ' + st.text.split('\n').slice(1, 3).join(' / ').slice(0, 160))
115
+ if (statusM && ['done', 'failed', 'cancelled', 'timeout'].includes(statusM[1])) {
116
+ jobDone = { status: statusM[1], text: st.text }
117
+ break
118
+ }
119
+ }
120
+ if (!jobDone) throw new Error('作业轮询超时')
121
+ log(`✔ 平台自动训练完成: status=${jobDone.status}`)
122
+ log(' 门禁摘要:\n ' + jobDone.text.split('\n').filter(x => x.includes('G1') || x.includes('G2') || x.includes('门禁') || x.includes('passed')).slice(0, 8).join('\n '))
123
+ if (jobDone.status !== 'done') throw new Error('自动训练失败: ' + jobDone.text.slice(0, 300))
124
+
125
+ /* ── 5. 定位新注册模型 ── */
126
+ const modelsRes = await api('GET', '/api/workshop/aml/models', undefined, token)
127
+ const model = (modelsRes.json?.data?.models ?? []).filter(m => m.objectiveId === OBJECTIVE).sort((a, b) => String(b.createdAt ?? '').localeCompare(String(a.createdAt ?? '')))[0]
128
+ if (!model) throw new Error('新模型未注册')
129
+ log(`✔ 新模型 ${model.id} [${model.stage}] label=${model.label}`)
130
+ log(` G1=${model.metrics?.oneStepTest?.nrmse} G2=${model.metrics?.rolloutTest?.nrmse} coverage=${model.metrics?.uncertainty?.coverage ?? model.metrics?.uncertainty?.calibrationCoverage}`)
131
+ log(` 工件: ${existsSync(model.path) ? readdirSync(model.path).map(f => f + '(' + statSync(join(model.path, f)).size + 'B)').join(', ') : model.path}`)
132
+
133
+ /* ── 6. [worker] 快照 + 场景级门禁(eligibility 写回) ── */
134
+ let snapshotId = null
135
+ let snap = null
136
+ for (let attempt = 1; attempt <= 8 && !snapshotId; attempt++) {
137
+ if (attempt > 1) { log(` 快照重试 ${attempt}`); await sleep(25_000) }
138
+ snap = await invoke('twin_snapshot_create', { auto_daq: true, channel_id: channelId, phase: 'calibration' }, workerId, token)
139
+ snapshotId = (snap.text.match(/snapshot_id:\s*([^\n]+)/) || [])[1]?.trim()
140
+ }
141
+ if (!snapshotId) throw new Error('快照失败: ' + snap.text.slice(0, 200))
142
+ log(` ✔ 快照 ${snapshotId}`)
143
+
144
+ /* ── 6b. [worker] 12 候选试验(挂 model_id,gate 以 twin_model_id 归集证据) ── */
145
+ const frozenScene = JSON.parse(readFileSync(join(AML_ROOT, 'twins', 'scenes', `${SCENE_ID}-1.0.0-frozen`, 'scenes.json'), 'utf8')).scene ?? {}
146
+ const targetObs = (frozenScene.observations ?? []).find(o => o.role === 'target')
147
+ const speedCtl = (frozenScene.controls ?? []).find(c => (c.nodeId ?? '').includes('linespeed')) ?? (frozenScene.controls ?? [])[0]
148
+ const dcwRes = await api('GET', '/api/workshop/dcw/', undefined, token)
149
+ const dwValueById = Object.fromEntries((dcwRes.json?.data?.nodes ?? []).filter(n => n.lineId === lineId).map(n => [n.id, Number(n.value)]))
150
+ const baseline = Object.fromEntries((frozenScene.controls ?? []).map(c => [c.id, dwValueById[c.nodeId]]).filter(([, v]) => Number.isFinite(v)))
151
+ log(` baseline: ${JSON.stringify(baseline)}`)
152
+ for (let k = 0; k < 12; k++) {
153
+ const delta = (k % 2 === 0 ? 1 : -0.5) * (speedCtl.maxStep ?? 2) * (0.3 + 0.07 * k)
154
+ const cand = { ...baseline, [speedCtl.id]: (baseline[speedCtl.id] ?? 95) + delta }
155
+ const t = await invoke('twin_trial_run', {
156
+ snapshot_id: snapshotId,
157
+ model_id: model.id,
158
+ baseline_controls: baseline,
159
+ candidate_controls: Array.from({ length: 4 }, () => cand),
160
+ }, workerId, token)
161
+ log(` trial#${k + 1} Δ=${delta.toFixed(2)} → ${(t.text.match(/improvement: [-\d.]+/) || [''])[0]}`)
162
+ }
163
+
164
+ /* ── 6c. [worker] 场景级门禁(eligibility 写回) ── */
165
+ const gate = await invoke('twin_gate_evaluate', { model_id: model.id, scene_id: SCENE_ID }, workerId, token)
166
+ log(' 场景级门禁:\n ' + gate.text.split('\n').slice(2, 24).join('\n '))
167
+ writeFileSync(join(PREV_DIR, 'mockomp-gate.txt'), gate.text)
168
+
169
+ /* ── 7. [lead] 两段式投用审批(candidate→shadow→production;治理禁止越级) ── */
170
+ const gatePassed = /"gatePassed":\s*true/.test(gate.text)
171
+ if (!gatePassed) {
172
+ log('✘ 场景级门禁未过(gatePassed=false)——fail-closed:不发起投用审批,不写 DCW。rejectCodes 见 gate 文本。')
173
+ const docFail = [
174
+ '# mock-omp 全自动链路验证记录',
175
+ '',
176
+ '- 结果:门禁未过,按治理纪律中止投用(fail-closed)。',
177
+ '```text',
178
+ gate.text.slice(0, 3000),
179
+ '```',
180
+ '## 日志',
181
+ '```text',
182
+ L2.join('\n'),
183
+ '```',
184
+ ].join('\n')
185
+ writeFileSync(DOC_PATH, docFail)
186
+ log('MOCKOMP GATE-REJECTED')
187
+ process.exit(2)
188
+ }
189
+ /** 单段晋升:lead 发起(阻塞等 HITL) → 主脚本以用户身份自动批准 */
190
+ async function promoteStage(toStage) {
191
+ log(` [lead] aml_model_promote(to_stage=${toStage})——HITL 审批挂起…`)
192
+ const p = invoke('aml_model_promote', { model_id: model.id, to_stage: toStage }, leadId, token)
193
+ let done = false
194
+ for (let i = 0; i < 30 && !done; i++) {
195
+ await sleep(2_000)
196
+ const pend = await api('GET', '/api/workshop/hitl/pending', undefined, token)
197
+ const items = pend.json?.data?.items ?? pend.json?.data ?? []
198
+ const hit = (Array.isArray(items) ? items : []).find(x => (x.detail ?? x.title ?? '').includes(model.id))
199
+ if (hit) {
200
+ const rid = hit.id ?? hit.requestId
201
+ log(` [用户/HITL] 批准待办 ${rid}(mock 人工批准)`)
202
+ const resp = await api('POST', '/api/workshop/hitl/respond', { kind: 'dcw-approval', id: rid, confirmed: true, comment: `mock-omp:门禁全过,自动批准 ${toStage}` }, token)
203
+ log(` [用户/HITL] respond → ${resp.status} ${JSON.stringify(resp.json).slice(0, 100)}`)
204
+ done = true
205
+ }
206
+ }
207
+ const r = await p
208
+ log(` promote(${toStage}) 结果: ` + r.text.split('\n')[0])
209
+ writeFileSync(join(PREV_DIR, `mockomp-promote-${toStage}.txt`), r.text)
210
+ return r
211
+ }
212
+ const promoShadow = await promoteStage('shadow')
213
+ if (/晋升完成/.test(promoShadow.text)) await promoteStage('production')
214
+
215
+ /* ── 8. [worker] MPC(不传 model_id → 验证 production 自动投用) ── */
216
+ const objective = {
217
+ schemaVersion: 1, createdAt: new Date().toISOString(), createdBy: 'mock-omp',
218
+ objectiveId: OBJECTIVE, targets: { [targetObs.id]: 52 }, weights: { [targetObs.id]: 1 },
219
+ controlCosts: {}, horizonSteps: 4, trustRegion: {},
220
+ }
221
+ const mpc = await invoke('mpc_optimize', {
222
+ snapshot_id: snapshotId,
223
+ baseline_controls: baseline,
224
+ horizon_steps: 4,
225
+ objective,
226
+ }, workerId, token)
227
+ writeFileSync(join(PREV_DIR, 'mockomp-mpc.txt'), mpc.text)
228
+ const rolloutModel = (mpc.text.match(/"rolloutModel":\s*"([^"]+)"/) || [])[1]
229
+ const modelBacked = (mpc.text.match(/"rolloutModelBacked":\s*(true|false)/) || [])[1]
230
+ const mode = (mpc.text.match(/"mode":\s*"([^"]+)"/) || [])[1]
231
+ const bestCandidate = (mpc.text.match(/"bestCandidate":\s*(\{[^}]*\})/) || [])[1]
232
+ log(`✔ MPC(未传 model_id): rolloutModel=${rolloutModel} modelBacked=${modelBacked} mode=${mode} best=${bestCandidate}`)
233
+ const autoSelected = rolloutModel === model.id && modelBacked === 'true'
234
+ log(autoSelected ? '✔✔ production 模型已自动投用(未传 model_id,rollout 由训练模型驱动)' : `⚠ 自动投用未生效(rolloutModel=${rolloutModel})`)
235
+
236
+ /* ── 9. 推荐写入 + 复测 ── */
237
+ let best
238
+ try {
239
+ best = JSON.parse(bestCandidate ?? 'null')
240
+ }
241
+ catch {
242
+ best = null
243
+ }
244
+ const idToNode = Object.fromEntries((frozenScene.controls ?? []).map(c => [c.id, c.nodeId]))
245
+ if (best && Object.keys(best).length > 0) {
246
+ for (const [specId, value] of Object.entries(best)) {
247
+ const nodeId = idToNode[specId]
248
+ if (!nodeId || !Number.isFinite(Number(value))) continue
249
+ const w = await api('POST', `/api/workshop/dcw/${nodeId}/write`, { value }, token)
250
+ log(` 写入 ${nodeId} ← ${Number(value).toFixed(2)} → HTTP ${w.status}`)
251
+ }
252
+ log(' 等待 90s 工艺响应…')
253
+ await sleep(90_000)
254
+ const r = await api('GET', `/api/workshop/daq/${targetObs.nodeId}/samples?bucketMs=1000&limit=60`, undefined, token)
255
+ const pts = (r.json?.data?.points ?? []).map(p => Number(p.avg ?? p.value)).filter(Number.isFinite).slice(0, 30)
256
+ const mean = pts.length ? pts.reduce((a, b) => a + b, 0) / pts.length : Number.NaN
257
+ log(`✔ 执行后膜厚均值: ${Number.isFinite(mean) ? mean.toFixed(2) : 'n/a'} μm(目标 52μm)`)
258
+ writeFileSync(join(PREV_DIR, 'mockomp-closed-loop.json'), JSON.stringify({ best, thicknessAfter: mean }, null, 2))
259
+ }
260
+ else log(' ⚠ MPC 无可执行 bestCandidate')
261
+
262
+ /* ── 10. 透明度文档 ── */
263
+ const doc = [
264
+ `# mock-omp 全自动链路验证记录(不调用真实 omp API)`,
265
+ ``,
266
+ `- 原理:omp 的下发操作 = 以 agent 身份经 agent-tools/invoke 桥调用 host 工具(与真实 omp 同链路);`,
267
+ ` 本验证用确定性剧本重演「收到 52μm 优化目标后的自主编排」,所有动作真实落库落工件。`,
268
+ `- Channel \`${channelId}\` · worker \`${workerId}\` · lead \`${leadId}\` · HITL 以用户身份自动批准(mock 人工)`,
269
+ `- 原有 ${hasExisting ? '命中模型(复用分支可见)' : '无模型(新建分支)'};本剧本仍完整走一遍自动训练以验证 aml_job_submit 全自动链`,
270
+ ``,
271
+ `## 自动化证据链`,
272
+ `| 步骤 | 执行者 | 工具/机制 | 结果 |`,
273
+ `| --- | --- | --- | --- |`,
274
+ `| 节点面确认 | worker(agent) | aml_node_catalog | ✔ |`,
275
+ `| 目标选型 | worker(agent) | aml_model_find(objective=${OBJECTIVE}) | ✔ |`,
276
+ `| 训练提交 | worker(agent) | aml_job_submit(hybrid_residual,无 code) | ✔ ${jobId} |`,
277
+ `| 自动训练 | 平台 | 参考训练器队列(物理校准+残差集成+UQ) | ✔ |`,
278
+ `| 自动验证(平台门禁) | 平台 | G1-G5(训练完成即判,未过则 failed) | ${jobDone.status === 'done' ? '✔ 通过' : '✘ 拦截'} |`,
279
+ `| 自动验证(场景门禁) | worker(agent) | twin_gate_evaluate(eligibility 写回) | ✔ |`,
280
+ `| 投用审批 | lead(agent)+用户(HITL) | aml_model_promote → hitl/respond 批准 | ✔ |`,
281
+ `| 自动投用 | 平台 | mpc_optimize **未传 model_id** → 自动选中 production | ${autoSelected ? '✔ ' + rolloutModel : '⚠ ' + rolloutModel} |`,
282
+ `| 闭环执行 | agent+平台 | mpc 推荐 → DCW 写入 → 复测 | ✔ |`,
283
+ ``,
284
+ `## 新模型身份`,
285
+ '```json',
286
+ JSON.stringify({ id: model.id, label: model.label, description: model.description, lineId: model.lineId, recipeId: model.recipeId, objectiveId: model.objectiveId, job: jobId }, null, 1),
287
+ '```',
288
+ ``,
289
+ `## 门禁与 MPC`,
290
+ '```text',
291
+ (readFileSync(join(PREV_DIR, 'mockomp-gate.txt'), 'utf8')).slice(0, 1800),
292
+ '```',
293
+ '```text',
294
+ (readFileSync(join(PREV_DIR, 'mockomp-mpc.txt'), 'utf8')).slice(0, 1800),
295
+ '```',
296
+ ``,
297
+ `## 本阶段日志`,
298
+ '```text',
299
+ L2.join('\n'),
300
+ '```',
301
+ ].join('\n')
302
+ writeFileSync(DOC_PATH, doc)
303
+ log(`✔ 文档: ${DOC_PATH}`)
304
+ log('MOCKOMP DONE')