agentworkshop 0.7.54 → 0.7.58

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 (1354) hide show
  1. package/.AgentWorkShop/prompts/host-tools.json +2418 -2184
  2. package/.env.example +1 -0
  3. package/.output/.AgentWorkShop/prompts/host-tools.json +2418 -2184
  4. package/.output/.AgentWorkShop/schema.json +140 -138
  5. package/.output/nitro.json +1 -1
  6. package/.output/public/_nuxt/2pU5BiaQ2.js +1 -0
  7. package/.output/public/_nuxt/{BdF9OAZq2.js → 4RTUlYvj2.js} +1 -1
  8. package/.output/public/_nuxt/AuthGate.Cvsc4atp.css +1 -0
  9. package/.output/public/_nuxt/B-Y_rsfn.js +106 -0
  10. package/.output/public/_nuxt/{BhcbvVOa2.js → B02cxZz72.js} +1 -1
  11. package/.output/public/_nuxt/{DNZmwhSD.js → B03LfmKR.js} +1 -1
  12. package/.output/public/_nuxt/{BZtgVXC5.js → B4R5CHkk.js} +3 -3
  13. package/.output/public/_nuxt/{B3zB6K6m.js → BAqtRt0q.js} +1 -1
  14. package/.output/public/_nuxt/BDC8YDyc.js +1 -0
  15. package/.output/public/_nuxt/{uY58gQqR2.js → BG7XSX-S2.js} +1 -1
  16. package/.output/public/_nuxt/{DUribplv2.js → BH30ZaLl2.js} +1 -1
  17. package/.output/public/_nuxt/BKHd_sKD2.js +47 -0
  18. package/.output/public/_nuxt/{S9rLP7_v.js → BMUEVeOK.js} +1 -1
  19. package/.output/public/_nuxt/{D9TpiWjt.js → BMZ1d25O.js} +1 -1
  20. package/.output/public/_nuxt/{DFhyhDGa2.js → BNl_jGa12.js} +1 -1
  21. package/.output/public/_nuxt/{BxoaZc_U2.js → BSG-4Ecg2.js} +1 -1
  22. package/.output/public/_nuxt/{BPqXOlYX.js → BU7WuuKh.js} +1 -1
  23. package/.output/public/_nuxt/{BP8TgWo02.js → BVH9j8dQ2.js} +1 -1
  24. package/.output/public/_nuxt/{C7_F68I7.js → BXKCB3rS.js} +1 -1
  25. package/.output/public/_nuxt/{DioKmYyB2.js → Bd85nb9X2.js} +1 -1
  26. package/.output/public/_nuxt/BhrnGVGz.js +1 -0
  27. package/.output/public/_nuxt/BikIgp9R.js +1 -0
  28. package/.output/public/_nuxt/Bj7BcqHn.js +1 -0
  29. package/.output/public/_nuxt/BkGqyjWm.js +3 -0
  30. package/.output/public/_nuxt/{CP0Nep9S.js → BkO2MZZU.js} +1 -1
  31. package/.output/public/_nuxt/{KXjvpIk2.js → Bn1N3mJv.js} +1 -1
  32. package/.output/public/_nuxt/Br2LgfbH2.js +13 -0
  33. package/.output/public/_nuxt/BrFF_9742.js +1 -0
  34. package/.output/public/_nuxt/{tKxYgsf-.js → BtDBBofS.js} +1 -1
  35. package/.output/public/_nuxt/BtNT93vm2.js +1 -0
  36. package/.output/public/_nuxt/{BxWvUgMz2.js → BtYg4aGR2.js} +1 -1
  37. package/.output/public/_nuxt/BuVH9MB-.js +1 -0
  38. package/.output/public/_nuxt/BupBjt6B2.js +1 -0
  39. package/.output/public/_nuxt/{D2Sm-GTk2.js → ByvqxkcN.js} +1 -1
  40. package/.output/public/_nuxt/{CzlUIbK32.js → BzKT-ne_2.js} +3 -3
  41. package/.output/public/_nuxt/{vPfDYgvR.js → C4X_Z1lA.js} +1 -1
  42. package/.output/public/_nuxt/C5wBzGO7.js +1 -0
  43. package/.output/public/_nuxt/{BgnhB8r5.js → C8uaVABF.js} +1 -1
  44. package/.output/public/_nuxt/{BmTzcKJg2.js → C98jxVaK.js} +1 -1
  45. package/.output/public/_nuxt/CBATzTUf.js +13 -0
  46. package/.output/public/_nuxt/{B9rIcCX12.js → CCCq9H7D2.js} +1 -1
  47. package/.output/public/_nuxt/{CvGYm7w8.js → CEP4UrDv.js} +1 -1
  48. package/.output/public/_nuxt/CHyzK5m52.js +1 -0
  49. package/.output/public/_nuxt/CIPKYgrH2.js +1 -0
  50. package/.output/public/_nuxt/{Drq9iy6V.js → CIz7SM4H.js} +1 -1
  51. package/.output/public/_nuxt/{PY2GW_3N2.js → CKE_kTL92.js} +1 -1
  52. package/.output/public/_nuxt/CPSHP_EI.js +1 -0
  53. package/.output/public/_nuxt/{DCPhrNWR2.js → CSyIwYcJ2.js} +1 -1
  54. package/.output/public/_nuxt/{v55S8LnT.js → CW1HGp5X.js} +1 -1
  55. package/.output/public/_nuxt/{Yv9YItEX2.js → CYGkUj5M2.js} +1 -1
  56. package/.output/public/_nuxt/{DppqsiPC.js → CZ0Gt81h.js} +2 -2
  57. package/.output/public/_nuxt/{Cg8Pgbeu.js → CZkTlW93.js} +2 -2
  58. package/.output/public/_nuxt/{Dz2SLIde.js → CZwDnomB.js} +1 -1
  59. package/.output/public/_nuxt/{DnAn2LgG.js → CZyYdpqZ2.js} +1 -1
  60. package/.output/public/_nuxt/{BJhsCisg2.js → CaBVMdqG2.js} +1 -1
  61. package/.output/public/_nuxt/{CMWyj56j.js → CeDkXWCz.js} +1 -1
  62. package/.output/public/_nuxt/{C-y_g11k.js → Cl19UD7U.js} +1 -1
  63. package/.output/public/_nuxt/ClEbKcuS.js +1 -0
  64. package/.output/public/_nuxt/{B4ujjkUI.js → ClrkV0C4.js} +1 -1
  65. package/.output/public/_nuxt/{nT-bgxvf.js → CmTqFlYZ.js} +1 -1
  66. package/.output/public/_nuxt/{deBcbALe2.js → CnF6dXcZ2.js} +1 -1
  67. package/.output/public/_nuxt/CoGETbe-2.js +1 -0
  68. package/.output/public/_nuxt/{Dq0emNZi2.js → CuRtzvsa2.js} +1 -1
  69. package/.output/public/_nuxt/{CBUIODly2.js → Cv_H1gOM2.js} +1 -1
  70. package/.output/public/_nuxt/{Cmp8PMrA.js → CxLxiOGV.js} +1 -1
  71. package/.output/public/_nuxt/{MbT4wXb62.js → D1Xw30Dj2.js} +1 -1
  72. package/.output/public/_nuxt/{DJyNDnag.js → D5hI4Fhu.js} +1 -1
  73. package/.output/public/_nuxt/D5i2ofVw2.js +1 -0
  74. package/.output/public/_nuxt/D6XGn5vM.js +2 -0
  75. package/.output/public/_nuxt/{DjefmmJu.js → D6c5ppqB.js} +1 -1
  76. package/.output/public/_nuxt/D8VQGThE.js +28 -0
  77. package/.output/public/_nuxt/{DmzmgYHb2.js → DBwuADr82.js} +1 -1
  78. package/.output/public/_nuxt/{DO9xaI9a.js → DEhjFhZ2.js} +1 -1
  79. package/.output/public/_nuxt/{DuPM4HXw.js → DIDbAMv5.js} +1 -1
  80. package/.output/public/_nuxt/{CfLUvgr32.js → DJZzthKt2.js} +1 -1
  81. package/.output/public/_nuxt/{Bpkm4W5P.js → DKhRushG.js} +1 -1
  82. package/.output/public/_nuxt/DLAFNaPf.js +1 -0
  83. package/.output/public/_nuxt/{DffgG8vT.js → DMPpE41S2.js} +1 -1
  84. package/.output/public/_nuxt/{CPeZNE4S2.js → DTZO6WMs2.js} +1 -1
  85. package/.output/public/_nuxt/{Dk6Zf3-L.js → DTx_DtUo.js} +1 -1
  86. package/.output/public/_nuxt/DYtV50yi2.js +1 -0
  87. package/.output/public/_nuxt/{CV61ysvv.js → DctCtJq7.js} +1 -1
  88. package/.output/public/_nuxt/{xX7ccjDl2.js → DelESEcl2.js} +1 -1
  89. package/.output/public/_nuxt/DfqRQSFn.js +19 -0
  90. package/.output/public/_nuxt/{BFZIll912.js → DgldLfCZ2.js} +1 -1
  91. package/.output/public/_nuxt/Dmgqz2np.js +16 -0
  92. package/.output/public/_nuxt/Do0dCE8C2.js +1 -0
  93. package/.output/public/_nuxt/DraEWn4N2.js +1 -0
  94. package/.output/public/_nuxt/{Bwc6lt2X.js → Drhta6gr.js} +2 -2
  95. package/.output/public/_nuxt/{Cn6ihm8j.js → Du0zf-d3.js} +1 -1
  96. package/.output/public/_nuxt/{DqtnqNgL2.js → DvUt9uMt2.js} +1 -1
  97. package/.output/public/_nuxt/{C5cf3T4d.js → Dxo1GW5U.js} +1 -1
  98. package/.output/public/_nuxt/{Ca3iDJwu2.js → Dy-V8OEW2.js} +9 -9
  99. package/.output/public/_nuxt/{BWowAAJb.js → DyMgrV29.js} +1 -1
  100. package/.output/public/_nuxt/{Dm_iKz8k2.js → Eo2BYEIo2.js} +1 -1
  101. package/.output/public/_nuxt/{aV6YPjg02.js → H7Rbu32y2.js} +1 -1
  102. package/.output/public/_nuxt/{vXrNItas2.js → KS3KQF222.js} +1 -1
  103. package/.output/public/_nuxt/{BjWbbMHs.js → M58CVYnv.js} +1 -1
  104. package/.output/public/_nuxt/M6NcguDO.js +1 -0
  105. package/.output/public/_nuxt/{CtPNnATm2.js → MEwEMEMl2.js} +6 -6
  106. package/.output/public/_nuxt/MW-V7IIP2.js +1 -0
  107. package/.output/public/_nuxt/{tq3HbWr9.js → P0EcfD3j.js} +1 -1
  108. package/.output/public/_nuxt/{CHrErv1E.js → TjGWqrHo.js} +1 -1
  109. package/.output/public/_nuxt/{TownView.Xt1yygrh.css → TownView.BuMpDRkf.css} +1 -1
  110. package/.output/public/_nuxt/VVomhVqu2.js +1 -0
  111. package/.output/public/_nuxt/{QHo9mN-M2.js → WYqAa0r52.js} +1 -1
  112. package/.output/public/_nuxt/YDs3mbQu2.js +1 -0
  113. package/.output/public/_nuxt/{Dep0Hc9w2.js → Z3MSTcdu2.js} +1 -1
  114. package/.output/public/_nuxt/_id_.DOqX4gwB.css +1 -0
  115. package/.output/public/_nuxt/_vR_sc7t.js +24 -0
  116. package/.output/public/_nuxt/{aml.-czpKIs8.css → aml.BeFTP6_M.css} +1 -1
  117. package/.output/public/_nuxt/bTFhJlrI2.js +1 -0
  118. package/.output/public/_nuxt/builds/latest.json +1 -1
  119. package/.output/public/_nuxt/builds/meta/082ac92a-d8d0-4e78-8d5a-b4a610080231.json +1 -0
  120. package/.output/public/_nuxt/daq.YQas76du.css +1 -0
  121. package/.output/public/_nuxt/dcw.UIcWRyIS.css +1 -0
  122. package/.output/public/_nuxt/{default.CyLpQD1C.css → default.8ac6QU28.css} +1 -1
  123. package/.output/public/_nuxt/{entry.JdEG3KJg.css → entry.BHNNQA9H.css} +1 -1
  124. package/.output/public/_nuxt/{D-Xyb3DA.js → gbaq2UOO.js} +1 -1
  125. package/.output/public/_nuxt/goF_oZHF.js +2 -0
  126. package/.output/public/_nuxt/h46i74oE.js +14 -0
  127. package/.output/public/_nuxt/{Cpm5JYv4.js → iZa330UY.js} +1 -1
  128. package/.output/public/_nuxt/logs.Bf65Kw17.css +1 -0
  129. package/.output/public/_nuxt/lyJsJl_G.js +1 -0
  130. package/.output/public/_nuxt/o-G6YtmK2.js +1 -0
  131. package/.output/public/_nuxt/{BkfA3BbD.js → pNy4V4kd.js} +1 -1
  132. package/.output/public/_nuxt/{C_sjV3Ee.js → pncSmP5n.js} +1 -1
  133. package/.output/public/_nuxt/{DVOR2pWg.js → qIQFsHtF.js} +1 -1
  134. package/.output/public/_nuxt/town.DFotRPod.css +1 -0
  135. package/.output/public/_nuxt/workshop.BX2YeO0g.css +1 -0
  136. package/.output/public/_nuxt/yPlLXpEw2.js +1 -0
  137. package/.output/public/_nuxt/ylowSquM2.js +1 -0
  138. package/.output/public/_nuxt/{Da0h_6VA.js → zGDAozGA.js} +4 -4
  139. package/.output/server/chunks/_/binding-authz.mjs +8 -4
  140. package/.output/server/chunks/_/binding-authz.mjs.map +1 -1
  141. package/.output/server/chunks/_/character-asset.repo.mjs +1 -1
  142. package/.output/server/chunks/_/entity.mjs +1 -1
  143. package/.output/server/chunks/_/host-bindings.mjs +22 -2
  144. package/.output/server/chunks/_/host-bindings.mjs.map +1 -1
  145. package/.output/server/chunks/_/nitro.mjs +13029 -8283
  146. package/.output/server/chunks/_/nitro.mjs.map +1 -1
  147. package/.output/server/chunks/_/scene-layout.repo.mjs +1 -1
  148. package/.output/server/chunks/_/user.schema.mjs +5 -1
  149. package/.output/server/chunks/_/user.schema.mjs.map +1 -1
  150. package/.output/server/chunks/build/{workshop-BDqWzJtr.mjs → AuthGate-DDPYswkA.mjs} +22 -327
  151. package/.output/server/chunks/build/AuthGate-DDPYswkA.mjs.map +1 -0
  152. package/.output/server/chunks/build/FormItemContext-4ORSzhWv.mjs +1 -1
  153. package/.output/server/chunks/build/{OmpTerminalPanel-mk31gVzA.mjs → OmpTerminalPanel-DZ2wHMS1.mjs} +4 -4
  154. package/.output/server/chunks/build/{OmpTerminalPanel-mk31gVzA.mjs.map → OmpTerminalPanel-DZ2wHMS1.mjs.map} +1 -1
  155. package/.output/server/chunks/build/{TownView-Bf5VFYFj.mjs → TownView-CZbFn6mO.mjs} +216 -107
  156. package/.output/server/chunks/build/TownView-CZbFn6mO.mjs.map +1 -0
  157. package/.output/server/chunks/build/{_id_-WF20tjqT.mjs → _id_-CCVhpJtj.mjs} +7 -6
  158. package/.output/server/chunks/build/_id_-CCVhpJtj.mjs.map +1 -0
  159. package/.output/server/chunks/build/{_id_-CuUmVPRg.mjs → _id_-Df2pgsAq.mjs} +521 -94
  160. package/.output/server/chunks/build/_id_-Df2pgsAq.mjs.map +1 -0
  161. package/.output/server/chunks/build/{_wsId_-BUIKB68b.mjs → _wsId_-CJqF-hmP.mjs} +19 -19
  162. package/.output/server/chunks/build/{_wsId_-BUIKB68b.mjs.map → _wsId_-CJqF-hmP.mjs.map} +1 -1
  163. package/.output/server/chunks/build/{agents-DqICy4AL.mjs → agents-BTsbna5H.mjs} +13 -13
  164. package/.output/server/chunks/build/{agents-DqICy4AL.mjs.map → agents-BTsbna5H.mjs.map} +1 -1
  165. package/.output/server/chunks/build/{aml-C55iuLn-.mjs → aml-BBKfWto1.mjs} +28 -27
  166. package/.output/server/chunks/build/aml-BBKfWto1.mjs.map +1 -0
  167. package/.output/server/chunks/build/api-B4Om0mEc.mjs +2 -1
  168. package/.output/server/chunks/build/api-B4Om0mEc.mjs.map +1 -1
  169. package/.output/server/chunks/build/{card-CUSocE9p.mjs → card-DJOYGuVH.mjs} +4 -4
  170. package/.output/server/chunks/build/{card-CUSocE9p.mjs.map → card-DJOYGuVH.mjs.map} +1 -1
  171. package/.output/server/chunks/build/{channel-templates-gdCLajKy.mjs → channel-templates-BPKJ8e4l.mjs} +9 -9
  172. package/.output/server/chunks/build/{channel-templates-gdCLajKy.mjs.map → channel-templates-BPKJ8e4l.mjs.map} +1 -1
  173. package/.output/server/chunks/build/constants-HPHJvjne.mjs +2 -1
  174. package/.output/server/chunks/build/constants-HPHJvjne.mjs.map +1 -1
  175. package/.output/server/chunks/build/{daq-D0kLscVr.mjs → daq-Cz7TaUAM.mjs} +38 -29
  176. package/.output/server/chunks/build/daq-Cz7TaUAM.mjs.map +1 -0
  177. package/.output/server/chunks/build/{dcw-DuhEyu7S.mjs → dcw-EhjJpVQM.mjs} +45 -20
  178. package/.output/server/chunks/build/dcw-EhjJpVQM.mjs.map +1 -0
  179. package/.output/server/chunks/build/{default-aFGiNebw.mjs → default-DweMY872.mjs} +260 -48
  180. package/.output/server/chunks/build/{default-aFGiNebw.mjs.map → default-DweMY872.mjs.map} +1 -1
  181. package/.output/server/chunks/build/{dropdown-Yev6knaj.mjs → dropdown-CIsqbX4P.mjs} +2 -2
  182. package/.output/server/chunks/build/{dropdown-Yev6knaj.mjs.map → dropdown-CIsqbX4P.mjs.map} +1 -1
  183. package/.output/server/chunks/build/{dropdown-KdKWCS5K.mjs → dropdown-CV9GW3z9.mjs} +5 -5
  184. package/.output/server/chunks/build/{dropdown-KdKWCS5K.mjs.map → dropdown-CV9GW3z9.mjs.map} +1 -1
  185. package/.output/server/chunks/build/{form-uSlNqIAV.mjs → form-cs_RcfGx.mjs} +4 -5
  186. package/.output/server/chunks/build/{form-uSlNqIAV.mjs.map → form-cs_RcfGx.mjs.map} +1 -1
  187. package/.output/server/chunks/{_/SearchOutlined.mjs → build/input-CobQ5LJ5.mjs} +1476 -103
  188. package/.output/server/chunks/build/input-CobQ5LJ5.mjs.map +1 -0
  189. package/.output/server/chunks/build/{input-number-BRVnxeiA.mjs → input-number-BpPYAWMk.mjs} +4 -4
  190. package/.output/server/chunks/build/{input-number-BRVnxeiA.mjs.map → input-number-BpPYAWMk.mjs.map} +1 -1
  191. package/.output/server/chunks/build/{logs-BlOalbsZ.mjs → logs-As9fZqU-.mjs} +49 -35
  192. package/.output/server/chunks/build/logs-As9fZqU-.mjs.map +1 -0
  193. package/.output/server/chunks/build/{menu-BgkRSSx7.mjs → menu-CVmvHyFT.mjs} +3 -3
  194. package/.output/server/chunks/build/{menu-BgkRSSx7.mjs.map → menu-CVmvHyFT.mjs.map} +1 -1
  195. package/.output/server/chunks/build/{monitor-DX_K0WMq.mjs → monitor-CdFQ2z4g.mjs} +17 -17
  196. package/.output/server/chunks/build/{monitor-DX_K0WMq.mjs.map → monitor-CdFQ2z4g.mjs.map} +1 -1
  197. package/.output/server/chunks/build/{operations-BD6LK-Yz.mjs → operations-B2gHCWgZ.mjs} +7 -6
  198. package/.output/server/chunks/build/operations-B2gHCWgZ.mjs.map +1 -0
  199. package/.output/server/chunks/build/{pages-DloBBvU5.mjs → pages-BItCt1ar.mjs} +5 -4
  200. package/.output/server/chunks/build/pages-BItCt1ar.mjs.map +1 -0
  201. package/.output/server/chunks/build/{permissions-BvmodvsO.mjs → permissions-D6mQw_9j.mjs} +12 -12
  202. package/.output/server/chunks/build/{permissions-BvmodvsO.mjs.map → permissions-D6mQw_9j.mjs.map} +1 -1
  203. package/.output/server/chunks/build/plugins-NAS9MQ5r.mjs +2 -1
  204. package/.output/server/chunks/build/plugins-NAS9MQ5r.mjs.map +1 -1
  205. package/.output/server/chunks/build/{popconfirm-Ox-_2V8A.mjs → popconfirm-DFfoFhmt.mjs} +2 -2
  206. package/.output/server/chunks/build/{popconfirm-Ox-_2V8A.mjs.map → popconfirm-DFfoFhmt.mjs.map} +1 -1
  207. package/.output/server/chunks/build/{schedules-D8vYHgQ5.mjs → schedules-BjWNDWL5.mjs} +16 -16
  208. package/.output/server/chunks/build/{schedules-D8vYHgQ5.mjs.map → schedules-BjWNDWL5.mjs.map} +1 -1
  209. package/.output/server/chunks/build/{segmented-C61yLHvo.mjs → segmented-D7FkCgg7.mjs} +2 -2
  210. package/.output/server/chunks/build/{segmented-C61yLHvo.mjs.map → segmented-D7FkCgg7.mjs.map} +1 -1
  211. package/.output/server/chunks/build/{select-rdBWytVK.mjs → select-FqBNxgxT.mjs} +3 -3
  212. package/.output/server/chunks/build/{select-rdBWytVK.mjs.map → select-FqBNxgxT.mjs.map} +1 -1
  213. package/.output/server/chunks/build/{settings-B7HA-sdb.mjs → settings-Cl_KRyEn.mjs} +9 -9
  214. package/.output/server/chunks/build/{settings-B7HA-sdb.mjs.map → settings-Cl_KRyEn.mjs.map} +1 -1
  215. package/.output/server/chunks/build/{table-DOFAvY-v.mjs → table-CeOYERqr.mjs} +8 -9
  216. package/.output/server/chunks/build/{table-DOFAvY-v.mjs.map → table-CeOYERqr.mjs.map} +1 -1
  217. package/.output/server/chunks/build/{tabs-DTeIuZeP.mjs → tabs-LLNSdLl2.mjs} +5 -6
  218. package/.output/server/chunks/build/{tabs-DTeIuZeP.mjs.map → tabs-LLNSdLl2.mjs.map} +1 -1
  219. package/.output/server/chunks/build/{tag-CHLGvNM6.mjs → tag-Dwvkh0Dj.mjs} +2 -3
  220. package/.output/server/chunks/build/{tag-CHLGvNM6.mjs.map → tag-Dwvkh0Dj.mjs.map} +1 -1
  221. package/.output/server/chunks/build/{teams-wM-MdLv9.mjs → teams-CGDZHaQl.mjs} +11 -11
  222. package/.output/server/chunks/build/{teams-wM-MdLv9.mjs.map → teams-CGDZHaQl.mjs.map} +1 -1
  223. package/.output/server/chunks/build/{tokens-CloWk4x_.mjs → tokens-BOYkZuoB.mjs} +13 -13
  224. package/.output/server/chunks/build/{tokens-CloWk4x_.mjs.map → tokens-BOYkZuoB.mjs.map} +1 -1
  225. package/.output/server/chunks/build/{town-BIn3be5v.mjs → town-BV-hbwb5.mjs} +41 -6
  226. package/.output/server/chunks/build/town-BV-hbwb5.mjs.map +1 -0
  227. package/.output/server/chunks/build/{town-B2gBu_ZE.mjs → town-P1rYoi0v.mjs} +7 -6
  228. package/.output/server/chunks/build/town-P1rYoi0v.mjs.map +1 -0
  229. package/.output/server/chunks/build/types-D6J7slEa.mjs +1 -1
  230. package/.output/server/chunks/build/useAgentHarnessOptions-BnFCh23W.mjs +2 -1
  231. package/.output/server/chunks/build/useAgentHarnessOptions-BnFCh23W.mjs.map +1 -1
  232. package/.output/server/chunks/build/useAgentTemplateActions-DsBRUQni.mjs +2 -1
  233. package/.output/server/chunks/build/useAgentTemplateActions-DsBRUQni.mjs.map +1 -1
  234. package/.output/server/chunks/build/useAgentTemplateDialogState-CZzpu5og.mjs +2 -1
  235. package/.output/server/chunks/build/useAgentTemplateDialogState-CZzpu5og.mjs.map +1 -1
  236. package/.output/server/chunks/build/useAgentTemplateForm-DzQ_t2Ue.mjs +2 -1
  237. package/.output/server/chunks/build/useAgentTemplateForm-DzQ_t2Ue.mjs.map +1 -1
  238. package/.output/server/chunks/build/useAgentTemplatesCatalog-Q7LgG1Af.mjs +2 -1
  239. package/.output/server/chunks/build/useAgentTemplatesCatalog-Q7LgG1Af.mjs.map +1 -1
  240. package/.output/server/chunks/build/useAmlDatasets-DeoE1idn.mjs +2 -1
  241. package/.output/server/chunks/build/useAmlDatasets-DeoE1idn.mjs.map +1 -1
  242. package/.output/server/chunks/build/useAmlEntities-BMLHU_39.mjs +3 -2
  243. package/.output/server/chunks/build/useAmlEntities-BMLHU_39.mjs.map +1 -1
  244. package/.output/server/chunks/build/useAmlEnv-DdlyVzPu.mjs +2 -1
  245. package/.output/server/chunks/build/useAmlEnv-DdlyVzPu.mjs.map +1 -1
  246. package/.output/server/chunks/build/useAmlExperiments-Dloi834i.mjs +2 -1
  247. package/.output/server/chunks/build/useAmlExperiments-Dloi834i.mjs.map +1 -1
  248. package/.output/server/chunks/build/useAmlFormat-C2sl3MGB.mjs +2 -1
  249. package/.output/server/chunks/build/useAmlFormat-C2sl3MGB.mjs.map +1 -1
  250. package/.output/server/chunks/build/{useAmlJobs--a_1ovew.mjs → useAmlJobs-BG_v21hJ.mjs} +4 -3
  251. package/.output/server/chunks/build/useAmlJobs-BG_v21hJ.mjs.map +1 -0
  252. package/.output/server/chunks/build/useAmlModels-D7MuOWOy.mjs +2 -1
  253. package/.output/server/chunks/build/useAmlModels-D7MuOWOy.mjs.map +1 -1
  254. package/.output/server/chunks/build/useAmlNotes-CTZe-GI0.mjs +2 -1
  255. package/.output/server/chunks/build/useAmlNotes-CTZe-GI0.mjs.map +1 -1
  256. package/.output/server/chunks/build/useAmlPredict-BToRrVRV.mjs +2 -1
  257. package/.output/server/chunks/build/useAmlPredict-BToRrVRV.mjs.map +1 -1
  258. package/.output/server/chunks/build/useDaqAddNode-CaOCbe4-.mjs +3 -2
  259. package/.output/server/chunks/build/useDaqAddNode-CaOCbe4-.mjs.map +1 -1
  260. package/.output/server/chunks/build/useDaqDetailBinding-C7AbGIdP.mjs +2 -1
  261. package/.output/server/chunks/build/useDaqDetailBinding-C7AbGIdP.mjs.map +1 -1
  262. package/.output/server/chunks/build/useDaqDetailFrames-CmAEdbAL.mjs +2 -1
  263. package/.output/server/chunks/build/useDaqDetailFrames-CmAEdbAL.mjs.map +1 -1
  264. package/.output/server/chunks/build/{useDaqDetailHistory-pfi6zXWU.mjs → useDaqDetailHistory-C4LWayu1.mjs} +4 -3
  265. package/.output/server/chunks/build/useDaqDetailHistory-C4LWayu1.mjs.map +1 -0
  266. package/.output/server/chunks/build/{useDaqDetailNode-qT7MjqJ7.mjs → useDaqDetailNode-DXgwAu5u.mjs} +5 -4
  267. package/.output/server/chunks/build/useDaqDetailNode-DXgwAu5u.mjs.map +1 -0
  268. package/.output/server/chunks/build/useDaqDetailParams-CrTMDs-2.mjs +3 -2
  269. package/.output/server/chunks/build/useDaqDetailParams-CrTMDs-2.mjs.map +1 -1
  270. package/.output/server/chunks/build/{useDaqFilters-CMysN13f.mjs → useDaqFilters-Jx6EERfr.mjs} +5 -4
  271. package/.output/server/chunks/build/useDaqFilters-Jx6EERfr.mjs.map +1 -0
  272. package/.output/server/chunks/build/useDaqNodeWindow-1DWj2H5G.mjs +2 -1
  273. package/.output/server/chunks/build/useDaqNodeWindow-1DWj2H5G.mjs.map +1 -1
  274. package/.output/server/chunks/build/{useDaqOptimizations-Coq5lsfM.mjs → useDaqOptimizations-C5N4bcu4.mjs} +4 -3
  275. package/.output/server/chunks/build/useDaqOptimizations-C5N4bcu4.mjs.map +1 -0
  276. package/.output/server/chunks/build/useDaqStream-DhzdoyIR.mjs +1 -1
  277. package/.output/server/chunks/build/useDaqTemplates-C7GzQmdJ.mjs +3 -2
  278. package/.output/server/chunks/build/useDaqTemplates-C7GzQmdJ.mjs.map +1 -1
  279. package/.output/server/chunks/build/useDashboardCharts-D45083s_.mjs +2 -1
  280. package/.output/server/chunks/build/useDashboardCharts-D45083s_.mjs.map +1 -1
  281. package/.output/server/chunks/build/{useDashboardData-DgJcGJaF.mjs → useDashboardData-Ce-EU5DJ.mjs} +4 -3
  282. package/.output/server/chunks/build/useDashboardData-Ce-EU5DJ.mjs.map +1 -0
  283. package/.output/server/chunks/build/{useDcwAddNode-C9DbEKHi.mjs → useDcwAddNode-4mTPQ6T8.mjs} +38 -4
  284. package/.output/server/chunks/build/useDcwAddNode-4mTPQ6T8.mjs.map +1 -0
  285. package/.output/server/chunks/build/{useDcwCards-VDoMYG7l.mjs → useDcwCards-DvLGgUYr.mjs} +4 -3
  286. package/.output/server/chunks/build/useDcwCards-DvLGgUYr.mjs.map +1 -0
  287. package/.output/server/chunks/build/{useDcwDetailScope-CL97tJdJ.mjs → useDcwDetailScope-4j3B03Pi.mjs} +4 -3
  288. package/.output/server/chunks/build/useDcwDetailScope-4j3B03Pi.mjs.map +1 -0
  289. package/.output/server/chunks/build/{useDcwDetailTemplates-OLmjMSGD.mjs → useDcwDetailTemplates-yzNEAMK-.mjs} +4 -3
  290. package/.output/server/chunks/build/useDcwDetailTemplates-yzNEAMK-.mjs.map +1 -0
  291. package/.output/server/chunks/build/{useDcwFilter-Bs9C6-h_.mjs → useDcwFilter-BQDmQYY0.mjs} +4 -3
  292. package/.output/server/chunks/build/useDcwFilter-BQDmQYY0.mjs.map +1 -0
  293. package/.output/server/chunks/build/{useDcwLedger-Bbf_iFOY.mjs → useDcwLedger-DWGufEor.mjs} +4 -3
  294. package/.output/server/chunks/build/useDcwLedger-DWGufEor.mjs.map +1 -0
  295. package/.output/server/chunks/build/{useDcwLineMutations-Bhtuqw7J.mjs → useDcwLineMutations-DHF-Bemn.mjs} +4 -3
  296. package/.output/server/chunks/build/useDcwLineMutations-DHF-Bemn.mjs.map +1 -0
  297. package/.output/server/chunks/build/{useDcwLineRun-CGqZSnG4.mjs → useDcwLineRun-VFe35xou.mjs} +4 -3
  298. package/.output/server/chunks/build/useDcwLineRun-VFe35xou.mjs.map +1 -0
  299. package/.output/server/chunks/build/{useDcwParamApprovals-BBwdFsKv.mjs → useDcwParamApprovals-Bc0BGBds.mjs} +8 -7
  300. package/.output/server/chunks/build/useDcwParamApprovals-Bc0BGBds.mjs.map +1 -0
  301. package/.output/server/chunks/build/{useDcwProducts-BoBkJqpv.mjs → useDcwProducts-DXisXYMh.mjs} +4 -3
  302. package/.output/server/chunks/build/useDcwProducts-DXisXYMh.mjs.map +1 -0
  303. package/.output/server/chunks/build/{useDcwQuery-DP7b2qb6.mjs → useDcwQuery-Cmo3UtIQ.mjs} +4 -3
  304. package/.output/server/chunks/build/useDcwQuery-Cmo3UtIQ.mjs.map +1 -0
  305. package/.output/server/chunks/build/{useDcwQuickActions-DHRiA9KN.mjs → useDcwQuickActions-BkAcxVnj.mjs} +4 -3
  306. package/.output/server/chunks/build/useDcwQuickActions-BkAcxVnj.mjs.map +1 -0
  307. package/.output/server/chunks/build/{useDcwRecipes-CIMeH2oF.mjs → useDcwRecipes-BvtGPQJ9.mjs} +16 -5
  308. package/.output/server/chunks/build/useDcwRecipes-BvtGPQJ9.mjs.map +1 -0
  309. package/.output/server/chunks/build/{useDcwStream-B9ugUWRq.mjs → useDcwStream-BXJ2V8HM.mjs} +12 -2
  310. package/.output/server/chunks/build/{useDcwStream-B9ugUWRq.mjs.map → useDcwStream-BXJ2V8HM.mjs.map} +1 -1
  311. package/.output/server/chunks/build/{useDcwTemplates-M_-qjV8E.mjs → useDcwTemplates-Zxz2DPdu.mjs} +4 -3
  312. package/.output/server/chunks/build/useDcwTemplates-Zxz2DPdu.mjs.map +1 -0
  313. package/.output/server/chunks/build/{useDcwWrites-D94dAzqr.mjs → useDcwWrites-66CKxcos.mjs} +4 -3
  314. package/.output/server/chunks/build/useDcwWrites-66CKxcos.mjs.map +1 -0
  315. package/.output/server/chunks/build/useExpConfirmations-BbInIHsn.mjs +106 -0
  316. package/.output/server/chunks/build/useExpConfirmations-BbInIHsn.mjs.map +1 -0
  317. package/.output/server/chunks/build/{useLocalTime-DZ2RAtVs.mjs → useLocalTime-CUnDHV5V.mjs} +8 -2
  318. package/.output/server/chunks/build/useLocalTime-CUnDHV5V.mjs.map +1 -0
  319. package/.output/server/chunks/build/useLogsFormat-B-o4MHy7.mjs +2 -1
  320. package/.output/server/chunks/build/useLogsFormat-B-o4MHy7.mjs.map +1 -1
  321. package/.output/server/chunks/build/useLogsManual-CMjD62nt.mjs +2 -1
  322. package/.output/server/chunks/build/useLogsManual-CMjD62nt.mjs.map +1 -1
  323. package/.output/server/chunks/build/{useLogsQuery-2x1mKxT1.mjs → useLogsQuery-C5nadU1m.mjs} +15 -4
  324. package/.output/server/chunks/build/useLogsQuery-C5nadU1m.mjs.map +1 -0
  325. package/.output/server/chunks/build/{useLogsScope-04cUJCU-.mjs → useLogsScope-DgrB1ur3.mjs} +4 -3
  326. package/.output/server/chunks/build/useLogsScope-DgrB1ur3.mjs.map +1 -0
  327. package/.output/server/chunks/build/useMonitorColumns-DhYvkLDq.mjs +2 -1
  328. package/.output/server/chunks/build/useMonitorColumns-DhYvkLDq.mjs.map +1 -1
  329. package/.output/server/chunks/build/{useMonitorData-guVjMDtR.mjs → useMonitorData-D2gFSonG.mjs} +4 -3
  330. package/.output/server/chunks/build/useMonitorData-D2gFSonG.mjs.map +1 -0
  331. package/.output/server/chunks/build/{useMonitorFormat-C7lhZe4g.mjs → useMonitorFormat-DRCXsKwh.mjs} +4 -3
  332. package/.output/server/chunks/build/useMonitorFormat-DRCXsKwh.mjs.map +1 -0
  333. package/.output/server/chunks/build/useMonitorTerminal-Dj4QwRNW.mjs +2 -1
  334. package/.output/server/chunks/build/useMonitorTerminal-Dj4QwRNW.mjs.map +1 -1
  335. package/.output/server/chunks/build/useOperationsFeed-DsA2ym7M.mjs +2 -1
  336. package/.output/server/chunks/build/useOperationsFeed-DsA2ym7M.mjs.map +1 -1
  337. package/.output/server/chunks/build/useOpsLog-SnWPuRtK.mjs.map +1 -1
  338. package/.output/server/chunks/build/useRecipeDispatchApprovals-CbL2El3n.mjs +155 -0
  339. package/.output/server/chunks/build/useRecipeDispatchApprovals-CbL2El3n.mjs.map +1 -0
  340. package/.output/server/chunks/build/useTeamActions-BOLQkYxg.mjs +2 -1
  341. package/.output/server/chunks/build/useTeamActions-BOLQkYxg.mjs.map +1 -1
  342. package/.output/server/chunks/build/useTeamAddMemberDialog-BCgrLPxI.mjs +2 -1
  343. package/.output/server/chunks/build/useTeamAddMemberDialog-BCgrLPxI.mjs.map +1 -1
  344. package/.output/server/chunks/build/useTeamCreateDialog-CJk40LqS.mjs +2 -1
  345. package/.output/server/chunks/build/useTeamCreateDialog-CJk40LqS.mjs.map +1 -1
  346. package/.output/server/chunks/build/useTeamDeployDialog-49hdUXQP.mjs +2 -1
  347. package/.output/server/chunks/build/useTeamDeployDialog-49hdUXQP.mjs.map +1 -1
  348. package/.output/server/chunks/build/useTeamDialogState-CFRUQxAf.mjs +2 -1
  349. package/.output/server/chunks/build/useTeamDialogState-CFRUQxAf.mjs.map +1 -1
  350. package/.output/server/chunks/build/useTeamPluginDialog-Dh-QOoiU.mjs +2 -1
  351. package/.output/server/chunks/build/useTeamPluginDialog-Dh-QOoiU.mjs.map +1 -1
  352. package/.output/server/chunks/build/useTeamsCatalog-HBSyKt5P.mjs +2 -1
  353. package/.output/server/chunks/build/useTeamsCatalog-HBSyKt5P.mjs.map +1 -1
  354. package/.output/server/chunks/build/useTokenClipboard-CwQpoFeP.mjs +2 -1
  355. package/.output/server/chunks/build/useTokenClipboard-CwQpoFeP.mjs.map +1 -1
  356. package/.output/server/chunks/build/useTokenCreate-DkYvEQUD.mjs +2 -1
  357. package/.output/server/chunks/build/useTokenCreate-DkYvEQUD.mjs.map +1 -1
  358. package/.output/server/chunks/build/useTokenRename-DOCP4aeI.mjs +2 -1
  359. package/.output/server/chunks/build/useTokenRename-DOCP4aeI.mjs.map +1 -1
  360. package/.output/server/chunks/build/useTokenReveal-CybwwflV.mjs +2 -1
  361. package/.output/server/chunks/build/useTokenReveal-CybwwflV.mjs.map +1 -1
  362. package/.output/server/chunks/build/useTokensList-BLiMvrc4.mjs +2 -1
  363. package/.output/server/chunks/build/useTokensList-BLiMvrc4.mjs.map +1 -1
  364. package/.output/server/chunks/build/{useWorkbenchAuth-DqjBX-6w.mjs → useWorkbenchAuth-DAabQl7X.mjs} +6 -2
  365. package/.output/server/chunks/build/useWorkbenchAuth-DAabQl7X.mjs.map +1 -0
  366. package/.output/server/chunks/build/{useWorkbenchWorkspaces-GQVU9BLv.mjs → useWorkbenchWorkspaces-6-mpCGCR.mjs} +5 -4
  367. package/.output/server/chunks/build/useWorkbenchWorkspaces-6-mpCGCR.mjs.map +1 -0
  368. package/.output/server/chunks/build/{useWorkshopWs-CgeCsaYJ.mjs → useWorkshopWs-CM-Ywk4h.mjs} +2 -2
  369. package/.output/server/chunks/build/{useWorkshopWs-CgeCsaYJ.mjs.map → useWorkshopWs-CM-Ywk4h.mjs.map} +1 -1
  370. package/.output/server/chunks/build/useWorkspaceAuth-Dlvj9csD.mjs +2 -1
  371. package/.output/server/chunks/build/useWorkspaceAuth-Dlvj9csD.mjs.map +1 -1
  372. package/.output/server/chunks/build/{useWorkspaceChannels-B13vROC1.mjs → useWorkspaceChannels--65yU02b.mjs} +5 -4
  373. package/.output/server/chunks/build/useWorkspaceChannels--65yU02b.mjs.map +1 -0
  374. package/.output/server/chunks/build/useWorkspacePanels-CTwREmq0.mjs +2 -1
  375. package/.output/server/chunks/build/useWorkspacePanels-CTwREmq0.mjs.map +1 -1
  376. package/.output/server/chunks/build/useWorkspaceShell-BCypjjjE.mjs +2 -1
  377. package/.output/server/chunks/build/useWorkspaceShell-BCypjjjE.mjs.map +1 -1
  378. package/.output/server/chunks/build/{users-CCf5PgRs.mjs → users-B_pHStEa.mjs} +13 -13
  379. package/.output/server/chunks/build/{users-CCf5PgRs.mjs.map → users-B_pHStEa.mjs.map} +1 -1
  380. package/.output/server/chunks/build/workshop-C0DefygA.mjs +522 -0
  381. package/.output/server/chunks/build/workshop-C0DefygA.mjs.map +1 -0
  382. package/.output/server/chunks/routes/api/health.get.mjs +12 -2
  383. package/.output/server/chunks/routes/api/health.get.mjs.map +1 -1
  384. package/.output/server/chunks/routes/api/index.get.mjs +4 -3
  385. package/.output/server/chunks/routes/api/index.get.mjs.map +1 -1
  386. package/.output/server/chunks/routes/api/index.post.mjs +3 -2
  387. package/.output/server/chunks/routes/api/index.post.mjs.map +1 -1
  388. package/.output/server/chunks/routes/api/mcp/workshop.mjs +3 -2
  389. package/.output/server/chunks/routes/api/mcp/workshop.mjs.map +1 -1
  390. package/.output/server/chunks/routes/api/metrics.mjs +11 -1
  391. package/.output/server/chunks/routes/api/metrics.mjs.map +1 -1
  392. package/.output/server/chunks/routes/api/plugins/_name/_...path_.mjs +2 -1
  393. package/.output/server/chunks/routes/api/plugins/_name/_...path_.mjs.map +1 -1
  394. package/.output/server/chunks/routes/api/plugins/client/_name_.get.mjs +2 -1
  395. package/.output/server/chunks/routes/api/plugins/client/_name_.get.mjs.map +1 -1
  396. package/.output/server/chunks/routes/api/plugins/i18n.get.mjs +2 -1
  397. package/.output/server/chunks/routes/api/plugins/i18n.get.mjs.map +1 -1
  398. package/.output/server/chunks/routes/api/plugins/manifest.get.mjs +2 -1
  399. package/.output/server/chunks/routes/api/plugins/manifest.get.mjs.map +1 -1
  400. package/.output/server/chunks/routes/api/system/backup/list.get.mjs +2 -1
  401. package/.output/server/chunks/routes/api/system/backup/list.get.mjs.map +1 -1
  402. package/.output/server/chunks/routes/api/system/backup/run.post.mjs +4 -3
  403. package/.output/server/chunks/routes/api/system/backup/run.post.mjs.map +1 -1
  404. package/.output/server/chunks/routes/api/system/config-groups/_id_.delete.mjs +2 -1
  405. package/.output/server/chunks/routes/api/system/config-groups/_id_.delete.mjs.map +1 -1
  406. package/.output/server/chunks/routes/api/system/config-groups/_id_.patch.mjs +2 -1
  407. package/.output/server/chunks/routes/api/system/config-groups/_id_.patch.mjs.map +1 -1
  408. package/.output/server/chunks/routes/api/system/config.get.mjs +2 -1
  409. package/.output/server/chunks/routes/api/system/config.get.mjs.map +1 -1
  410. package/.output/server/chunks/routes/api/system/index.get.mjs +2 -1
  411. package/.output/server/chunks/routes/api/system/index.get.mjs.map +1 -1
  412. package/.output/server/chunks/routes/api/system/index.patch.mjs +2 -1
  413. package/.output/server/chunks/routes/api/system/index.patch.mjs.map +1 -1
  414. package/.output/server/chunks/routes/api/system/index.post.mjs +2 -1
  415. package/.output/server/chunks/routes/api/system/index.post.mjs.map +1 -1
  416. package/.output/server/chunks/routes/api/system/index2.get.mjs +2 -1
  417. package/.output/server/chunks/routes/api/system/index2.get.mjs.map +1 -1
  418. package/.output/server/chunks/routes/api/system/monitor/terminal/ws.mjs +2 -1
  419. package/.output/server/chunks/routes/api/system/monitor/terminal/ws.mjs.map +1 -1
  420. package/.output/server/chunks/routes/api/system/monitor/terminate.post.mjs +2 -1
  421. package/.output/server/chunks/routes/api/system/monitor/terminate.post.mjs.map +1 -1
  422. package/.output/server/chunks/routes/api/system/monitor.get.mjs +2 -1
  423. package/.output/server/chunks/routes/api/system/monitor.get.mjs.map +1 -1
  424. package/.output/server/chunks/routes/api/system/settings/events.get.mjs +2 -1
  425. package/.output/server/chunks/routes/api/system/settings/events.get.mjs.map +1 -1
  426. package/.output/server/chunks/routes/api/system/settings/reset.post.mjs +2 -1
  427. package/.output/server/chunks/routes/api/system/settings/reset.post.mjs.map +1 -1
  428. package/.output/server/chunks/routes/api/system/timezone.get.mjs +2 -1
  429. package/.output/server/chunks/routes/api/system/timezone.get.mjs.map +1 -1
  430. package/.output/server/chunks/routes/api/users/_id_.delete.mjs +2 -1
  431. package/.output/server/chunks/routes/api/users/_id_.delete.mjs.map +1 -1
  432. package/.output/server/chunks/routes/api/users/_id_.get.mjs +2 -1
  433. package/.output/server/chunks/routes/api/users/_id_.get.mjs.map +1 -1
  434. package/.output/server/chunks/routes/api/users/_id_.put.mjs +2 -1
  435. package/.output/server/chunks/routes/api/users/_id_.put.mjs.map +1 -1
  436. package/.output/server/chunks/routes/api/users/change-password.post.mjs +35 -0
  437. package/.output/server/chunks/routes/api/users/change-password.post.mjs.map +1 -0
  438. package/.output/server/chunks/routes/api/users/index.get.mjs +3 -2
  439. package/.output/server/chunks/routes/api/users/index.get.mjs.map +1 -1
  440. package/.output/server/chunks/routes/api/users/index.post.mjs +4 -3
  441. package/.output/server/chunks/routes/api/users/index.post.mjs.map +1 -1
  442. package/.output/server/chunks/routes/api/users/login.post.mjs +4 -3
  443. package/.output/server/chunks/routes/api/users/login.post.mjs.map +1 -1
  444. package/.output/server/chunks/routes/api/users/logout.post.mjs +3 -2
  445. package/.output/server/chunks/routes/api/users/logout.post.mjs.map +1 -1
  446. package/.output/server/chunks/routes/api/users/me.get.mjs +3 -2
  447. package/.output/server/chunks/routes/api/users/me.get.mjs.map +1 -1
  448. package/.output/server/chunks/routes/api/users/register.post.mjs +3 -2
  449. package/.output/server/chunks/routes/api/users/register.post.mjs.map +1 -1
  450. package/.output/server/chunks/routes/api/users/setup-status.get.mjs +6 -3
  451. package/.output/server/chunks/routes/api/users/setup-status.get.mjs.map +1 -1
  452. package/.output/server/chunks/routes/api/users/tokens/_id/token.get.mjs +3 -2
  453. package/.output/server/chunks/routes/api/users/tokens/_id/token.get.mjs.map +1 -1
  454. package/.output/server/chunks/routes/api/users/tokens/_id_.delete.mjs +3 -2
  455. package/.output/server/chunks/routes/api/users/tokens/_id_.delete.mjs.map +1 -1
  456. package/.output/server/chunks/routes/api/users/tokens/_id_.patch.mjs +4 -3
  457. package/.output/server/chunks/routes/api/users/tokens/_id_.patch.mjs.map +1 -1
  458. package/.output/server/chunks/routes/api/workshop/_...path_.mjs +2 -1
  459. package/.output/server/chunks/routes/api/workshop/_...path_.mjs.map +1 -1
  460. package/.output/server/chunks/routes/api/workshop/a2a/_agentId/index.get.mjs +2 -1
  461. package/.output/server/chunks/routes/api/workshop/a2a/_agentId/index.get.mjs.map +1 -1
  462. package/.output/server/chunks/routes/api/workshop/a2a/_agentId/index.post.mjs +2 -1
  463. package/.output/server/chunks/routes/api/workshop/a2a/_agentId/index.post.mjs.map +1 -1
  464. package/.output/server/chunks/routes/api/workshop/a2a/send.post.mjs +2 -1
  465. package/.output/server/chunks/routes/api/workshop/a2a/send.post.mjs.map +1 -1
  466. package/.output/server/chunks/routes/api/workshop/agent-tools/approvals/_id/decide.post.mjs +15 -5
  467. package/.output/server/chunks/routes/api/workshop/agent-tools/approvals/_id/decide.post.mjs.map +1 -1
  468. package/.output/server/chunks/routes/api/workshop/agent-tools/bindings/_id_.delete.mjs +3 -2
  469. package/.output/server/chunks/routes/api/workshop/agent-tools/bindings/_id_.delete.mjs.map +1 -1
  470. package/.output/server/chunks/routes/api/workshop/agent-tools/bindings/_id_.patch.mjs +24 -3
  471. package/.output/server/chunks/routes/api/workshop/agent-tools/bindings/_id_.patch.mjs.map +1 -1
  472. package/.output/server/chunks/routes/api/workshop/agent-tools/bindings/grant.post.mjs +3 -2
  473. package/.output/server/chunks/routes/api/workshop/agent-tools/bindings/grant.post.mjs.map +1 -1
  474. package/.output/server/chunks/routes/api/workshop/agent-tools/bindings/revoke.post.mjs +3 -2
  475. package/.output/server/chunks/routes/api/workshop/agent-tools/bindings/revoke.post.mjs.map +1 -1
  476. package/.output/server/chunks/routes/api/workshop/agent-tools/index.get.mjs +3 -2
  477. package/.output/server/chunks/routes/api/workshop/agent-tools/index.get.mjs.map +1 -1
  478. package/.output/server/chunks/routes/api/workshop/agent-tools/index.post.mjs +48 -8
  479. package/.output/server/chunks/routes/api/workshop/agent-tools/index.post.mjs.map +1 -1
  480. package/.output/server/chunks/routes/api/workshop/agent-tools/index2.get.mjs +3 -2
  481. package/.output/server/chunks/routes/api/workshop/agent-tools/index2.get.mjs.map +1 -1
  482. package/.output/server/chunks/routes/api/workshop/agent-tools/invoke.post.mjs +3 -2
  483. package/.output/server/chunks/routes/api/workshop/agent-tools/invoke.post.mjs.map +1 -1
  484. package/.output/server/chunks/routes/api/workshop/agent-tools/list.get.mjs +3 -2
  485. package/.output/server/chunks/routes/api/workshop/agent-tools/list.get.mjs.map +1 -1
  486. package/.output/server/chunks/routes/api/workshop/agents/_id_.delete.mjs +2 -1
  487. package/.output/server/chunks/routes/api/workshop/agents/_id_.delete.mjs.map +1 -1
  488. package/.output/server/chunks/routes/api/workshop/agents/_id_.get.mjs +2 -1
  489. package/.output/server/chunks/routes/api/workshop/agents/_id_.get.mjs.map +1 -1
  490. package/.output/server/chunks/routes/api/workshop/agents/_id_.patch.mjs +2 -1
  491. package/.output/server/chunks/routes/api/workshop/agents/_id_.patch.mjs.map +1 -1
  492. package/.output/server/chunks/routes/api/workshop/agents/subscribe.post.mjs +2 -1
  493. package/.output/server/chunks/routes/api/workshop/agents/subscribe.post.mjs.map +1 -1
  494. package/.output/server/chunks/routes/api/workshop/aml/datasets/_id/preview.get.mjs +3 -2
  495. package/.output/server/chunks/routes/api/workshop/aml/datasets/_id/preview.get.mjs.map +1 -1
  496. package/.output/server/chunks/routes/api/workshop/aml/datasets/_id_.delete.mjs +3 -2
  497. package/.output/server/chunks/routes/api/workshop/aml/datasets/_id_.delete.mjs.map +1 -1
  498. package/.output/server/chunks/routes/api/workshop/aml/datasets/_id_.get.mjs +3 -2
  499. package/.output/server/chunks/routes/api/workshop/aml/datasets/_id_.get.mjs.map +1 -1
  500. package/.output/server/chunks/routes/api/workshop/aml/datasets/_id_.patch.mjs +3 -2
  501. package/.output/server/chunks/routes/api/workshop/aml/datasets/_id_.patch.mjs.map +1 -1
  502. package/.output/server/chunks/routes/api/workshop/aml/entities/prune.post.mjs +2 -1
  503. package/.output/server/chunks/routes/api/workshop/aml/entities/prune.post.mjs.map +1 -1
  504. package/.output/server/chunks/routes/api/workshop/aml/env/recheck.post.mjs +3 -2
  505. package/.output/server/chunks/routes/api/workshop/aml/env/recheck.post.mjs.map +1 -1
  506. package/.output/server/chunks/routes/api/workshop/aml/env/uv.post.mjs +3 -2
  507. package/.output/server/chunks/routes/api/workshop/aml/env/uv.post.mjs.map +1 -1
  508. package/.output/server/chunks/routes/api/workshop/aml/env/venv.post.mjs +3 -2
  509. package/.output/server/chunks/routes/api/workshop/aml/env/venv.post.mjs.map +1 -1
  510. package/.output/server/chunks/routes/api/workshop/aml/index.get.mjs +3 -2
  511. package/.output/server/chunks/routes/api/workshop/aml/index.get.mjs.map +1 -1
  512. package/.output/server/chunks/routes/api/workshop/aml/index.post.mjs +3 -2
  513. package/.output/server/chunks/routes/api/workshop/aml/index.post.mjs.map +1 -1
  514. package/.output/server/chunks/routes/api/workshop/aml/index2.get.mjs +2 -1
  515. package/.output/server/chunks/routes/api/workshop/aml/index2.get.mjs.map +1 -1
  516. package/.output/server/chunks/routes/api/workshop/aml/index2.post.mjs +3 -2
  517. package/.output/server/chunks/routes/api/workshop/aml/index2.post.mjs.map +1 -1
  518. package/.output/server/chunks/routes/api/workshop/aml/index3.get.mjs +3 -2
  519. package/.output/server/chunks/routes/api/workshop/aml/index3.get.mjs.map +1 -1
  520. package/.output/server/chunks/routes/api/workshop/aml/index3.post.mjs +3 -2
  521. package/.output/server/chunks/routes/api/workshop/aml/index3.post.mjs.map +1 -1
  522. package/.output/server/chunks/routes/api/workshop/aml/index4.get.mjs +3 -2
  523. package/.output/server/chunks/routes/api/workshop/aml/index4.get.mjs.map +1 -1
  524. package/.output/server/chunks/routes/api/workshop/aml/index5.get.mjs +3 -2
  525. package/.output/server/chunks/routes/api/workshop/aml/index5.get.mjs.map +1 -1
  526. package/.output/server/chunks/routes/api/workshop/aml/index6.get.mjs +3 -2
  527. package/.output/server/chunks/routes/api/workshop/aml/index6.get.mjs.map +1 -1
  528. package/.output/server/chunks/routes/api/workshop/aml/index7.get.mjs +3 -2
  529. package/.output/server/chunks/routes/api/workshop/aml/index7.get.mjs.map +1 -1
  530. package/.output/server/chunks/routes/api/workshop/aml/jobs/_id/cancel.post.mjs +3 -2
  531. package/.output/server/chunks/routes/api/workshop/aml/jobs/_id/cancel.post.mjs.map +1 -1
  532. package/.output/server/chunks/routes/api/workshop/aml/jobs/_id/logs.get.mjs +3 -2
  533. package/.output/server/chunks/routes/api/workshop/aml/jobs/_id/logs.get.mjs.map +1 -1
  534. package/.output/server/chunks/routes/api/workshop/aml/jobs/_id/retry.post.mjs +3 -2
  535. package/.output/server/chunks/routes/api/workshop/aml/jobs/_id/retry.post.mjs.map +1 -1
  536. package/.output/server/chunks/routes/api/workshop/aml/jobs/_id_.delete.mjs +3 -2
  537. package/.output/server/chunks/routes/api/workshop/aml/jobs/_id_.delete.mjs.map +1 -1
  538. package/.output/server/chunks/routes/api/workshop/aml/jobs/_id_.get.mjs +3 -2
  539. package/.output/server/chunks/routes/api/workshop/aml/jobs/_id_.get.mjs.map +1 -1
  540. package/.output/server/chunks/routes/api/workshop/aml/models/_id/predict.post.mjs +3 -2
  541. package/.output/server/chunks/routes/api/workshop/aml/models/_id/predict.post.mjs.map +1 -1
  542. package/.output/server/chunks/routes/api/workshop/aml/models/_id/promote.post.mjs +3 -2
  543. package/.output/server/chunks/routes/api/workshop/aml/models/_id/promote.post.mjs.map +1 -1
  544. package/.output/server/chunks/routes/api/workshop/aml/models/_id_.delete.mjs +3 -2
  545. package/.output/server/chunks/routes/api/workshop/aml/models/_id_.delete.mjs.map +1 -1
  546. package/.output/server/chunks/routes/api/workshop/aml/models/_id_.patch.mjs +3 -2
  547. package/.output/server/chunks/routes/api/workshop/aml/models/_id_.patch.mjs.map +1 -1
  548. package/.output/server/chunks/routes/api/workshop/aml/training-plans/_id/train.post.mjs +3 -2
  549. package/.output/server/chunks/routes/api/workshop/aml/training-plans/_id/train.post.mjs.map +1 -1
  550. package/.output/server/chunks/routes/api/workshop/aml/training-plans/_id_.delete.mjs +3 -2
  551. package/.output/server/chunks/routes/api/workshop/aml/training-plans/_id_.delete.mjs.map +1 -1
  552. package/.output/server/chunks/routes/api/workshop/aml/training-plans/_id_.patch.mjs +3 -2
  553. package/.output/server/chunks/routes/api/workshop/aml/training-plans/_id_.patch.mjs.map +1 -1
  554. package/.output/server/chunks/routes/api/workshop/aml/twin/providers.get.mjs +3 -2
  555. package/.output/server/chunks/routes/api/workshop/aml/twin/providers.get.mjs.map +1 -1
  556. package/.output/server/chunks/routes/api/workshop/approvals/_id/decide.post.mjs +3 -2
  557. package/.output/server/chunks/routes/api/workshop/approvals/_id/decide.post.mjs.map +1 -1
  558. package/.output/server/chunks/routes/api/workshop/assets/character/_id_.delete.mjs +2 -1
  559. package/.output/server/chunks/routes/api/workshop/assets/character/_id_.delete.mjs.map +1 -1
  560. package/.output/server/chunks/routes/api/workshop/assets/devices/_id_.delete.mjs +2 -1
  561. package/.output/server/chunks/routes/api/workshop/assets/devices/_id_.delete.mjs.map +1 -1
  562. package/.output/server/chunks/routes/api/workshop/assets/index.get.mjs +2 -1
  563. package/.output/server/chunks/routes/api/workshop/assets/index.get.mjs.map +1 -1
  564. package/.output/server/chunks/routes/api/workshop/assets/index.post.mjs +3 -2
  565. package/.output/server/chunks/routes/api/workshop/assets/index.post.mjs.map +1 -1
  566. package/.output/server/chunks/routes/api/workshop/assets/index2.get.mjs +2 -1
  567. package/.output/server/chunks/routes/api/workshop/assets/index2.get.mjs.map +1 -1
  568. package/.output/server/chunks/routes/api/workshop/assets/index2.post.mjs +3 -2
  569. package/.output/server/chunks/routes/api/workshop/assets/index2.post.mjs.map +1 -1
  570. package/.output/server/chunks/routes/api/workshop/audit.get.mjs +2 -1
  571. package/.output/server/chunks/routes/api/workshop/audit.get.mjs.map +1 -1
  572. package/.output/server/chunks/routes/api/workshop/caller.mjs +3 -2
  573. package/.output/server/chunks/routes/api/workshop/caller.mjs.map +1 -1
  574. package/.output/server/chunks/routes/api/workshop/channel-templates/_id/instantiate.post.mjs +5 -4
  575. package/.output/server/chunks/routes/api/workshop/channel-templates/_id/instantiate.post.mjs.map +1 -1
  576. package/.output/server/chunks/routes/api/workshop/channel-templates/_id_.delete.mjs +2 -1
  577. package/.output/server/chunks/routes/api/workshop/channel-templates/_id_.delete.mjs.map +1 -1
  578. package/.output/server/chunks/routes/api/workshop/channel-templates/_id_.get.mjs +2 -1
  579. package/.output/server/chunks/routes/api/workshop/channel-templates/_id_.get.mjs.map +1 -1
  580. package/.output/server/chunks/routes/api/workshop/channel-templates/_id_.patch.mjs +2 -1
  581. package/.output/server/chunks/routes/api/workshop/channel-templates/_id_.patch.mjs.map +1 -1
  582. package/.output/server/chunks/routes/api/workshop/channel-templates/from-channel.post.mjs +2 -1
  583. package/.output/server/chunks/routes/api/workshop/channel-templates/from-channel.post.mjs.map +1 -1
  584. package/.output/server/chunks/routes/api/workshop/channels/_id/activate.post.mjs +3 -2
  585. package/.output/server/chunks/routes/api/workshop/channels/_id/activate.post.mjs.map +1 -1
  586. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/index.get.mjs +2 -1
  587. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/index.get.mjs.map +1 -1
  588. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/index.post.mjs +2 -1
  589. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/index.post.mjs.map +1 -1
  590. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/memories/_memoryId_.delete.mjs +2 -1
  591. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/memories/_memoryId_.delete.mjs.map +1 -1
  592. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/memories/search.post.mjs +2 -1
  593. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/memories/search.post.mjs.map +1 -1
  594. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/model.patch.mjs +2 -1
  595. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/model.patch.mjs.map +1 -1
  596. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/position.patch.mjs +2 -1
  597. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/position.patch.mjs.map +1 -1
  598. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/range.patch.mjs +2 -1
  599. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/range.patch.mjs.map +1 -1
  600. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/stop.post.mjs +2 -1
  601. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/stop.post.mjs.map +1 -1
  602. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId_.delete.mjs +2 -1
  603. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId_.delete.mjs.map +1 -1
  604. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId_.patch.mjs +2 -1
  605. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId_.patch.mjs.map +1 -1
  606. package/.output/server/chunks/routes/api/workshop/channels/_id/chat/index.get.mjs +2 -1
  607. package/.output/server/chunks/routes/api/workshop/channels/_id/chat/index.get.mjs.map +1 -1
  608. package/.output/server/chunks/routes/api/workshop/channels/_id/chat/index.post.mjs +3 -2
  609. package/.output/server/chunks/routes/api/workshop/channels/_id/chat/index.post.mjs.map +1 -1
  610. package/.output/server/chunks/routes/api/workshop/channels/_id/chat/messages/_messageId/read.post.mjs +2 -1
  611. package/.output/server/chunks/routes/api/workshop/channels/_id/chat/messages/_messageId/read.post.mjs.map +1 -1
  612. package/.output/server/chunks/routes/api/workshop/channels/_id/chat/permissions.get.mjs +2 -1
  613. package/.output/server/chunks/routes/api/workshop/channels/_id/chat/permissions.get.mjs.map +1 -1
  614. package/.output/server/chunks/routes/api/workshop/channels/_id/events.get.mjs +2 -1
  615. package/.output/server/chunks/routes/api/workshop/channels/_id/events.get.mjs.map +1 -1
  616. package/.output/server/chunks/routes/api/workshop/channels/_id/index.get.mjs +2 -1
  617. package/.output/server/chunks/routes/api/workshop/channels/_id/index.get.mjs.map +1 -1
  618. package/.output/server/chunks/routes/api/workshop/channels/_id/index.post.mjs +3 -2
  619. package/.output/server/chunks/routes/api/workshop/channels/_id/index.post.mjs.map +1 -1
  620. package/.output/server/chunks/routes/api/workshop/channels/_id/index.put.mjs +3 -2
  621. package/.output/server/chunks/routes/api/workshop/channels/_id/index.put.mjs.map +1 -1
  622. package/.output/server/chunks/routes/api/workshop/channels/_id/index2.get.mjs +2 -1
  623. package/.output/server/chunks/routes/api/workshop/channels/_id/index2.get.mjs.map +1 -1
  624. package/.output/server/chunks/routes/api/workshop/channels/_id/index2.post.mjs +2 -1
  625. package/.output/server/chunks/routes/api/workshop/channels/_id/index2.post.mjs.map +1 -1
  626. package/.output/server/chunks/routes/api/workshop/channels/_id/index3.get.mjs +2 -1
  627. package/.output/server/chunks/routes/api/workshop/channels/_id/index3.get.mjs.map +1 -1
  628. package/.output/server/chunks/routes/api/workshop/channels/_id/index3.post.mjs +3 -2
  629. package/.output/server/chunks/routes/api/workshop/channels/_id/index3.post.mjs.map +1 -1
  630. package/.output/server/chunks/routes/api/workshop/channels/_id/index4.get.mjs +2 -1
  631. package/.output/server/chunks/routes/api/workshop/channels/_id/index4.get.mjs.map +1 -1
  632. package/.output/server/chunks/routes/api/workshop/channels/_id/index4.post.mjs +3 -2
  633. package/.output/server/chunks/routes/api/workshop/channels/_id/index4.post.mjs.map +1 -1
  634. package/.output/server/chunks/routes/api/workshop/channels/_id/index5.get.mjs +3 -2
  635. package/.output/server/chunks/routes/api/workshop/channels/_id/index5.get.mjs.map +1 -1
  636. package/.output/server/chunks/routes/api/workshop/channels/_id/index6.get.mjs +2 -1
  637. package/.output/server/chunks/routes/api/workshop/channels/_id/index6.get.mjs.map +1 -1
  638. package/.output/server/chunks/routes/api/workshop/channels/_id/line.put.mjs +9 -2
  639. package/.output/server/chunks/routes/api/workshop/channels/_id/line.put.mjs.map +1 -1
  640. package/.output/server/chunks/routes/api/workshop/channels/_id/members/_userId/approve.post.mjs +2 -1
  641. package/.output/server/chunks/routes/api/workshop/channels/_id/members/_userId/approve.post.mjs.map +1 -1
  642. package/.output/server/chunks/routes/api/workshop/channels/_id/members/_userId_.delete.mjs +2 -1
  643. package/.output/server/chunks/routes/api/workshop/channels/_id/members/_userId_.delete.mjs.map +1 -1
  644. package/.output/server/chunks/routes/api/workshop/channels/_id/members/join.post.mjs +5 -2
  645. package/.output/server/chunks/routes/api/workshop/channels/_id/members/join.post.mjs.map +1 -1
  646. package/.output/server/chunks/routes/api/workshop/channels/_id/members/leave.post.mjs +2 -1
  647. package/.output/server/chunks/routes/api/workshop/channels/_id/members/leave.post.mjs.map +1 -1
  648. package/.output/server/chunks/routes/api/workshop/channels/_id/memories/_memoryId_.delete.mjs +2 -1
  649. package/.output/server/chunks/routes/api/workshop/channels/_id/memories/_memoryId_.delete.mjs.map +1 -1
  650. package/.output/server/chunks/routes/api/workshop/channels/_id/queue.get.mjs +2 -1
  651. package/.output/server/chunks/routes/api/workshop/channels/_id/queue.get.mjs.map +1 -1
  652. package/.output/server/chunks/routes/api/workshop/channels/_id/terminals.get.mjs +3 -2
  653. package/.output/server/chunks/routes/api/workshop/channels/_id/terminals.get.mjs.map +1 -1
  654. package/.output/server/chunks/routes/api/workshop/channels/_id/twin-profile.get.mjs +3 -2
  655. package/.output/server/chunks/routes/api/workshop/channels/_id/twin-profile.get.mjs.map +1 -1
  656. package/.output/server/chunks/routes/api/workshop/channels/_id/twin-profile.patch.mjs +3 -2
  657. package/.output/server/chunks/routes/api/workshop/channels/_id/twin-profile.patch.mjs.map +1 -1
  658. package/.output/server/chunks/routes/api/workshop/channels/_id_.delete.mjs +2 -1
  659. package/.output/server/chunks/routes/api/workshop/channels/_id_.delete.mjs.map +1 -1
  660. package/.output/server/chunks/routes/api/workshop/channels/index.get.mjs +3 -2
  661. package/.output/server/chunks/routes/api/workshop/channels/index.get.mjs.map +1 -1
  662. package/.output/server/chunks/routes/api/workshop/channels/index.patch.mjs +2 -1
  663. package/.output/server/chunks/routes/api/workshop/channels/index.patch.mjs.map +1 -1
  664. package/.output/server/chunks/routes/api/workshop/channels.get.mjs +2 -1
  665. package/.output/server/chunks/routes/api/workshop/channels.get.mjs.map +1 -1
  666. package/.output/server/chunks/routes/api/workshop/channels.post.mjs +18 -5
  667. package/.output/server/chunks/routes/api/workshop/channels.post.mjs.map +1 -1
  668. package/.output/server/chunks/routes/api/workshop/daq/_id/bind.post.mjs +4 -3
  669. package/.output/server/chunks/routes/api/workshop/daq/_id/bind.post.mjs.map +1 -1
  670. package/.output/server/chunks/routes/api/workshop/daq/_id/bindings.put.mjs +4 -3
  671. package/.output/server/chunks/routes/api/workshop/daq/_id/bindings.put.mjs.map +1 -1
  672. package/.output/server/chunks/routes/api/workshop/daq/_id/frames/content.get.mjs +3 -2
  673. package/.output/server/chunks/routes/api/workshop/daq/_id/frames/content.get.mjs.map +1 -1
  674. package/.output/server/chunks/routes/api/workshop/daq/_id/frames.get.mjs +3 -2
  675. package/.output/server/chunks/routes/api/workshop/daq/_id/frames.get.mjs.map +1 -1
  676. package/.output/server/chunks/routes/api/workshop/daq/_id/samples.get.mjs +3 -2
  677. package/.output/server/chunks/routes/api/workshop/daq/_id/samples.get.mjs.map +1 -1
  678. package/.output/server/chunks/routes/api/workshop/daq/_id/test.post.mjs +4 -3
  679. package/.output/server/chunks/routes/api/workshop/daq/_id/test.post.mjs.map +1 -1
  680. package/.output/server/chunks/routes/api/workshop/daq/_id_.delete.mjs +4 -3
  681. package/.output/server/chunks/routes/api/workshop/daq/_id_.delete.mjs.map +1 -1
  682. package/.output/server/chunks/routes/api/workshop/daq/_id_.patch.mjs +4 -3
  683. package/.output/server/chunks/routes/api/workshop/daq/_id_.patch.mjs.map +1 -1
  684. package/.output/server/chunks/routes/api/workshop/daq/alarms/_id/ack.post.mjs +3 -2
  685. package/.output/server/chunks/routes/api/workshop/daq/alarms/_id/ack.post.mjs.map +1 -1
  686. package/.output/server/chunks/routes/api/workshop/daq/alarms.get.mjs +3 -2
  687. package/.output/server/chunks/routes/api/workshop/daq/alarms.get.mjs.map +1 -1
  688. package/.output/server/chunks/routes/api/workshop/daq/controller.post.mjs +4 -3
  689. package/.output/server/chunks/routes/api/workshop/daq/controller.post.mjs.map +1 -1
  690. package/.output/server/chunks/routes/api/workshop/daq/index.post.mjs +3 -2
  691. package/.output/server/chunks/routes/api/workshop/daq/index.post.mjs.map +1 -1
  692. package/.output/server/chunks/routes/api/workshop/daq/infra/reconnect.post.mjs +3 -2
  693. package/.output/server/chunks/routes/api/workshop/daq/infra/reconnect.post.mjs.map +1 -1
  694. package/.output/server/chunks/routes/api/workshop/daq/infra.get.mjs +3 -2
  695. package/.output/server/chunks/routes/api/workshop/daq/infra.get.mjs.map +1 -1
  696. package/.output/server/chunks/routes/api/workshop/daq/templates/_key_.delete.mjs +3 -2
  697. package/.output/server/chunks/routes/api/workshop/daq/templates/_key_.delete.mjs.map +1 -1
  698. package/.output/server/chunks/routes/api/workshop/daq/templates/_key_.patch.mjs +3 -2
  699. package/.output/server/chunks/routes/api/workshop/daq/templates/_key_.patch.mjs.map +1 -1
  700. package/.output/server/chunks/routes/api/workshop/daq/test-driver.post.mjs +5 -4
  701. package/.output/server/chunks/routes/api/workshop/daq/test-driver.post.mjs.map +1 -1
  702. package/.output/server/chunks/routes/api/workshop/dcw/_id/bind.post.mjs +3 -2
  703. package/.output/server/chunks/routes/api/workshop/dcw/_id/bind.post.mjs.map +1 -1
  704. package/.output/server/chunks/routes/api/workshop/dcw/_id/bindings.put.mjs +3 -2
  705. package/.output/server/chunks/routes/api/workshop/dcw/_id/bindings.put.mjs.map +1 -1
  706. package/.output/server/chunks/routes/api/workshop/dcw/_id/param-ledger.get.mjs +3 -2
  707. package/.output/server/chunks/routes/api/workshop/dcw/_id/param-ledger.get.mjs.map +1 -1
  708. package/.output/server/chunks/routes/api/workshop/dcw/_id/read.post.mjs +3 -2
  709. package/.output/server/chunks/routes/api/workshop/dcw/_id/read.post.mjs.map +1 -1
  710. package/.output/server/chunks/routes/api/workshop/dcw/_id/test.post.mjs +3 -2
  711. package/.output/server/chunks/routes/api/workshop/dcw/_id/test.post.mjs.map +1 -1
  712. package/.output/server/chunks/routes/api/workshop/dcw/_id/write.post.mjs +3 -2
  713. package/.output/server/chunks/routes/api/workshop/dcw/_id/write.post.mjs.map +1 -1
  714. package/.output/server/chunks/routes/api/workshop/dcw/_id_.delete.mjs +3 -2
  715. package/.output/server/chunks/routes/api/workshop/dcw/_id_.delete.mjs.map +1 -1
  716. package/.output/server/chunks/routes/api/workshop/dcw/_id_.patch.mjs +3 -2
  717. package/.output/server/chunks/routes/api/workshop/dcw/_id_.patch.mjs.map +1 -1
  718. package/.output/server/chunks/routes/api/workshop/dcw/controller.post.mjs +3 -2
  719. package/.output/server/chunks/routes/api/workshop/dcw/controller.post.mjs.map +1 -1
  720. package/.output/server/chunks/routes/api/workshop/dcw/index.get.mjs +3 -2
  721. package/.output/server/chunks/routes/api/workshop/dcw/index.get.mjs.map +1 -1
  722. package/.output/server/chunks/routes/api/workshop/dcw/index.post.mjs +4 -3
  723. package/.output/server/chunks/routes/api/workshop/dcw/index.post.mjs.map +1 -1
  724. package/.output/server/chunks/routes/api/workshop/dcw/index2.get.mjs +3 -2
  725. package/.output/server/chunks/routes/api/workshop/dcw/index2.get.mjs.map +1 -1
  726. package/.output/server/chunks/routes/api/workshop/dcw/index2.post.mjs +3 -2
  727. package/.output/server/chunks/routes/api/workshop/dcw/index2.post.mjs.map +1 -1
  728. package/.output/server/chunks/routes/api/workshop/dcw/index3.get.mjs +15 -12
  729. package/.output/server/chunks/routes/api/workshop/dcw/index3.get.mjs.map +1 -1
  730. package/.output/server/chunks/routes/api/workshop/dcw/index3.post.mjs +7 -4
  731. package/.output/server/chunks/routes/api/workshop/dcw/index3.post.mjs.map +1 -1
  732. package/.output/server/chunks/routes/api/workshop/dcw/index4.get.mjs +15 -14
  733. package/.output/server/chunks/routes/api/workshop/dcw/index4.get.mjs.map +1 -1
  734. package/.output/server/chunks/routes/api/workshop/dcw/index4.post.mjs +12 -4
  735. package/.output/server/chunks/routes/api/workshop/dcw/index4.post.mjs.map +1 -1
  736. package/.output/server/chunks/routes/api/workshop/dcw/index5.get.mjs +16 -5
  737. package/.output/server/chunks/routes/api/workshop/dcw/index5.get.mjs.map +1 -1
  738. package/.output/server/chunks/routes/api/workshop/dcw/index5.post.mjs +3 -2
  739. package/.output/server/chunks/routes/api/workshop/dcw/index5.post.mjs.map +1 -1
  740. package/.output/server/chunks/routes/api/workshop/dcw/index6.get.mjs +6 -4
  741. package/.output/server/chunks/routes/api/workshop/dcw/index6.get.mjs.map +1 -1
  742. package/.output/server/chunks/routes/api/workshop/dcw/index7.get.mjs +30 -0
  743. package/.output/server/chunks/routes/api/workshop/dcw/index7.get.mjs.map +1 -0
  744. package/.output/server/chunks/routes/api/workshop/dcw/journal/node/_nodeId/rollback.post.mjs +3 -2
  745. package/.output/server/chunks/routes/api/workshop/dcw/journal/node/_nodeId/rollback.post.mjs.map +1 -1
  746. package/.output/server/chunks/routes/api/workshop/dcw/line/query.get.mjs +3 -2
  747. package/.output/server/chunks/routes/api/workshop/dcw/line/query.get.mjs.map +1 -1
  748. package/.output/server/chunks/routes/api/workshop/dcw/lines/_id/start.post.mjs +3 -2
  749. package/.output/server/chunks/routes/api/workshop/dcw/lines/_id/start.post.mjs.map +1 -1
  750. package/.output/server/chunks/routes/api/workshop/dcw/lines/_id/stop.post.mjs +3 -2
  751. package/.output/server/chunks/routes/api/workshop/dcw/lines/_id/stop.post.mjs.map +1 -1
  752. package/.output/server/chunks/routes/api/workshop/dcw/lines/_id_.delete.mjs +5 -4
  753. package/.output/server/chunks/routes/api/workshop/dcw/lines/_id_.delete.mjs.map +1 -1
  754. package/.output/server/chunks/routes/api/workshop/dcw/lines/_id_.patch.mjs +5 -4
  755. package/.output/server/chunks/routes/api/workshop/dcw/lines/_id_.patch.mjs.map +1 -1
  756. package/.output/server/chunks/routes/api/workshop/dcw/mes-artifacts/file.get.mjs +62 -0
  757. package/.output/server/chunks/routes/api/workshop/dcw/mes-artifacts/file.get.mjs.map +1 -0
  758. package/.output/server/chunks/routes/api/workshop/dcw/mes-hook-test.post.mjs +99 -0
  759. package/.output/server/chunks/routes/api/workshop/dcw/mes-hook-test.post.mjs.map +1 -0
  760. package/.output/server/chunks/routes/api/workshop/dcw/mes-test-read.post.mjs +3 -2
  761. package/.output/server/chunks/routes/api/workshop/dcw/mes-test-read.post.mjs.map +1 -1
  762. package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id/judge.post.mjs +3 -2
  763. package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id/judge.post.mjs.map +1 -1
  764. package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id/rollback.post.mjs +3 -2
  765. package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id/rollback.post.mjs.map +1 -1
  766. package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id/series.get.mjs +3 -2
  767. package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id/series.get.mjs.map +1 -1
  768. package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id_.get.mjs +3 -2
  769. package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id_.get.mjs.map +1 -1
  770. package/.output/server/chunks/routes/api/workshop/dcw/params/_id/read.post.mjs +3 -2
  771. package/.output/server/chunks/routes/api/workshop/dcw/params/_id/read.post.mjs.map +1 -1
  772. package/.output/server/chunks/routes/api/workshop/dcw/params/_id/write.post.mjs +3 -2
  773. package/.output/server/chunks/routes/api/workshop/dcw/params/_id/write.post.mjs.map +1 -1
  774. package/.output/server/chunks/routes/api/workshop/dcw/params/_id_.delete.mjs +3 -2
  775. package/.output/server/chunks/routes/api/workshop/dcw/params/_id_.delete.mjs.map +1 -1
  776. package/.output/server/chunks/routes/api/workshop/dcw/params/_id_.patch.mjs +3 -2
  777. package/.output/server/chunks/routes/api/workshop/dcw/params/_id_.patch.mjs.map +1 -1
  778. package/.output/server/chunks/routes/api/workshop/dcw/products/_id_.delete.mjs +3 -2
  779. package/.output/server/chunks/routes/api/workshop/dcw/products/_id_.delete.mjs.map +1 -1
  780. package/.output/server/chunks/routes/api/workshop/dcw/products/_id_.patch.mjs +3 -2
  781. package/.output/server/chunks/routes/api/workshop/dcw/products/_id_.patch.mjs.map +1 -1
  782. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/apply.post.mjs +7 -4
  783. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/apply.post.mjs.map +1 -1
  784. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/mark-good.post.mjs +7 -4
  785. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/mark-good.post.mjs.map +1 -1
  786. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/revert.post.mjs +7 -4
  787. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/revert.post.mjs.map +1 -1
  788. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/rollback-good.post.mjs +7 -4
  789. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/rollback-good.post.mjs.map +1 -1
  790. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/versions.get.mjs +3 -2
  791. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/versions.get.mjs.map +1 -1
  792. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id_.delete.mjs +3 -2
  793. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id_.delete.mjs.map +1 -1
  794. package/.output/server/chunks/routes/api/workshop/dcw/recipes/index.patch.mjs +3 -2
  795. package/.output/server/chunks/routes/api/workshop/dcw/recipes/index.patch.mjs.map +1 -1
  796. package/.output/server/chunks/routes/api/workshop/dcw/runs/_id/close.post.mjs +3 -2
  797. package/.output/server/chunks/routes/api/workshop/dcw/runs/_id/close.post.mjs.map +1 -1
  798. package/.output/server/chunks/routes/api/workshop/dcw/runs/_id/data.get.mjs +3 -2
  799. package/.output/server/chunks/routes/api/workshop/dcw/runs/_id/data.get.mjs.map +1 -1
  800. package/.output/server/chunks/routes/api/workshop/dcw/runs/_id/rollback.post.mjs +3 -2
  801. package/.output/server/chunks/routes/api/workshop/dcw/runs/_id/rollback.post.mjs.map +1 -1
  802. package/.output/server/chunks/routes/api/workshop/dcw/templates/_key_.delete.mjs +3 -2
  803. package/.output/server/chunks/routes/api/workshop/dcw/templates/_key_.delete.mjs.map +1 -1
  804. package/.output/server/chunks/routes/api/workshop/dcw/templates/_key_.patch.mjs +3 -2
  805. package/.output/server/chunks/routes/api/workshop/dcw/templates/_key_.patch.mjs.map +1 -1
  806. package/.output/server/chunks/routes/api/workshop/dcw/test-driver.post.mjs +3 -2
  807. package/.output/server/chunks/routes/api/workshop/dcw/test-driver.post.mjs.map +1 -1
  808. package/.output/server/chunks/routes/api/workshop/device-twins/_id/control.post.mjs +3 -2
  809. package/.output/server/chunks/routes/api/workshop/device-twins/_id/control.post.mjs.map +1 -1
  810. package/.output/server/chunks/routes/api/workshop/device-twins/_id/telemetry.post.mjs +3 -2
  811. package/.output/server/chunks/routes/api/workshop/device-twins/_id/telemetry.post.mjs.map +1 -1
  812. package/.output/server/chunks/routes/api/workshop/device-twins/_id_.delete.mjs +3 -2
  813. package/.output/server/chunks/routes/api/workshop/device-twins/_id_.delete.mjs.map +1 -1
  814. package/.output/server/chunks/routes/api/workshop/device-twins/_id_.patch.mjs +3 -2
  815. package/.output/server/chunks/routes/api/workshop/device-twins/_id_.patch.mjs.map +1 -1
  816. package/.output/server/chunks/routes/api/workshop/exp/confirmations/_id/decide.post.mjs +55 -0
  817. package/.output/server/chunks/routes/api/workshop/exp/confirmations/_id/decide.post.mjs.map +1 -0
  818. package/.output/server/chunks/routes/api/workshop/exp/index.get.mjs +38 -0
  819. package/.output/server/chunks/routes/api/workshop/exp/index.get.mjs.map +1 -0
  820. package/.output/server/chunks/routes/api/workshop/fs/dirs.get.mjs +3 -2
  821. package/.output/server/chunks/routes/api/workshop/fs/dirs.get.mjs.map +1 -1
  822. package/.output/server/chunks/routes/api/workshop/harnesses/_id/providers.get.mjs +3 -2
  823. package/.output/server/chunks/routes/api/workshop/harnesses/_id/providers.get.mjs.map +1 -1
  824. package/.output/server/chunks/routes/api/workshop/harnesses.get.mjs +3 -2
  825. package/.output/server/chunks/routes/api/workshop/harnesses.get.mjs.map +1 -1
  826. package/.output/server/chunks/routes/api/workshop/hitl/pending.get.mjs +8 -2
  827. package/.output/server/chunks/routes/api/workshop/hitl/pending.get.mjs.map +1 -1
  828. package/.output/server/chunks/routes/api/workshop/hitl/respond.post.mjs +6 -3
  829. package/.output/server/chunks/routes/api/workshop/hitl/respond.post.mjs.map +1 -1
  830. package/.output/server/chunks/routes/api/workshop/index.get.mjs +2 -1
  831. package/.output/server/chunks/routes/api/workshop/index.get.mjs.map +1 -1
  832. package/.output/server/chunks/routes/api/workshop/index.post.mjs +2 -1
  833. package/.output/server/chunks/routes/api/workshop/index.post.mjs.map +1 -1
  834. package/.output/server/chunks/routes/api/workshop/index.put.mjs +3 -2
  835. package/.output/server/chunks/routes/api/workshop/index.put.mjs.map +1 -1
  836. package/.output/server/chunks/routes/api/workshop/index10.get.mjs +3 -2
  837. package/.output/server/chunks/routes/api/workshop/index10.get.mjs.map +1 -1
  838. package/.output/server/chunks/routes/api/workshop/index11.get.mjs +2 -1
  839. package/.output/server/chunks/routes/api/workshop/index11.get.mjs.map +1 -1
  840. package/.output/server/chunks/routes/api/workshop/index12.get.mjs +2 -1
  841. package/.output/server/chunks/routes/api/workshop/index12.get.mjs.map +1 -1
  842. package/.output/server/chunks/routes/api/workshop/index13.get.mjs +2 -1
  843. package/.output/server/chunks/routes/api/workshop/index13.get.mjs.map +1 -1
  844. package/.output/server/chunks/routes/api/workshop/index14.get.mjs +2 -1
  845. package/.output/server/chunks/routes/api/workshop/index14.get.mjs.map +1 -1
  846. package/.output/server/chunks/routes/api/workshop/index2.get.mjs +3 -2
  847. package/.output/server/chunks/routes/api/workshop/index2.get.mjs.map +1 -1
  848. package/.output/server/chunks/routes/api/workshop/index2.post.mjs +2 -1
  849. package/.output/server/chunks/routes/api/workshop/index2.post.mjs.map +1 -1
  850. package/.output/server/chunks/routes/api/workshop/index3.get.mjs +2 -1
  851. package/.output/server/chunks/routes/api/workshop/index3.get.mjs.map +1 -1
  852. package/.output/server/chunks/routes/api/workshop/index3.post.mjs +8 -4
  853. package/.output/server/chunks/routes/api/workshop/index3.post.mjs.map +1 -1
  854. package/.output/server/chunks/routes/api/workshop/index4.get.mjs +2 -1
  855. package/.output/server/chunks/routes/api/workshop/index4.get.mjs.map +1 -1
  856. package/.output/server/chunks/routes/api/workshop/index4.post.mjs +8 -4
  857. package/.output/server/chunks/routes/api/workshop/index4.post.mjs.map +1 -1
  858. package/.output/server/chunks/routes/api/workshop/index5.get.mjs +4 -3
  859. package/.output/server/chunks/routes/api/workshop/index5.get.mjs.map +1 -1
  860. package/.output/server/chunks/routes/api/workshop/index5.post.mjs +3 -2
  861. package/.output/server/chunks/routes/api/workshop/index5.post.mjs.map +1 -1
  862. package/.output/server/chunks/routes/api/workshop/index6.get.mjs +3 -2
  863. package/.output/server/chunks/routes/api/workshop/index6.get.mjs.map +1 -1
  864. package/.output/server/chunks/routes/api/workshop/index6.post.mjs +3 -2
  865. package/.output/server/chunks/routes/api/workshop/index6.post.mjs.map +1 -1
  866. package/.output/server/chunks/routes/api/workshop/index7.get.mjs +3 -2
  867. package/.output/server/chunks/routes/api/workshop/index7.get.mjs.map +1 -1
  868. package/.output/server/chunks/routes/api/workshop/index7.post.mjs +2 -1
  869. package/.output/server/chunks/routes/api/workshop/index7.post.mjs.map +1 -1
  870. package/.output/server/chunks/routes/api/workshop/index8.get.mjs +2 -1
  871. package/.output/server/chunks/routes/api/workshop/index8.get.mjs.map +1 -1
  872. package/.output/server/chunks/routes/api/workshop/index8.post.mjs +2 -1
  873. package/.output/server/chunks/routes/api/workshop/index8.post.mjs.map +1 -1
  874. package/.output/server/chunks/routes/api/workshop/index9.get.mjs +3 -1
  875. package/.output/server/chunks/routes/api/workshop/index9.get.mjs.map +1 -1
  876. package/.output/server/chunks/routes/api/workshop/index9.post.mjs +2 -1
  877. package/.output/server/chunks/routes/api/workshop/index9.post.mjs.map +1 -1
  878. package/.output/server/chunks/routes/api/workshop/mailbox/all.get.mjs +2 -1
  879. package/.output/server/chunks/routes/api/workshop/mailbox/all.get.mjs.map +1 -1
  880. package/.output/server/chunks/routes/api/workshop/mailbox.get.mjs +2 -1
  881. package/.output/server/chunks/routes/api/workshop/mailbox.get.mjs.map +1 -1
  882. package/.output/server/chunks/routes/api/workshop/memories/maintenance.post.mjs +2 -1
  883. package/.output/server/chunks/routes/api/workshop/memories/maintenance.post.mjs.map +1 -1
  884. package/.output/server/chunks/routes/api/workshop/notifications/read.post.mjs +2 -1
  885. package/.output/server/chunks/routes/api/workshop/notifications/read.post.mjs.map +1 -1
  886. package/.output/server/chunks/routes/api/workshop/plugins/_name/disable.post.mjs +3 -2
  887. package/.output/server/chunks/routes/api/workshop/plugins/_name/disable.post.mjs.map +1 -1
  888. package/.output/server/chunks/routes/api/workshop/plugins/_name/enable.post.mjs +3 -2
  889. package/.output/server/chunks/routes/api/workshop/plugins/_name/enable.post.mjs.map +1 -1
  890. package/.output/server/chunks/routes/api/workshop/plugins/index.get.mjs +2 -1
  891. package/.output/server/chunks/routes/api/workshop/plugins/index.get.mjs.map +1 -1
  892. package/.output/server/chunks/routes/api/workshop/runtime.get.mjs +2 -1
  893. package/.output/server/chunks/routes/api/workshop/runtime.get.mjs.map +1 -1
  894. package/.output/server/chunks/routes/api/workshop/scene/layouts/_channelId_.delete.mjs +3 -2
  895. package/.output/server/chunks/routes/api/workshop/scene/layouts/_channelId_.delete.mjs.map +1 -1
  896. package/.output/server/chunks/routes/api/workshop/scene/layouts/_channelId_.put.mjs +3 -2
  897. package/.output/server/chunks/routes/api/workshop/scene/layouts/_channelId_.put.mjs.map +1 -1
  898. package/.output/server/chunks/routes/api/workshop/scene/layouts.get.mjs +2 -1
  899. package/.output/server/chunks/routes/api/workshop/scene/layouts.get.mjs.map +1 -1
  900. package/.output/server/chunks/routes/api/workshop/schedules/_id/run.post.mjs +2 -1
  901. package/.output/server/chunks/routes/api/workshop/schedules/_id/run.post.mjs.map +1 -1
  902. package/.output/server/chunks/routes/api/workshop/schedules/_id/runs.get.mjs +2 -1
  903. package/.output/server/chunks/routes/api/workshop/schedules/_id/runs.get.mjs.map +1 -1
  904. package/.output/server/chunks/routes/api/workshop/schedules/_id_.delete.mjs +2 -1
  905. package/.output/server/chunks/routes/api/workshop/schedules/_id_.delete.mjs.map +1 -1
  906. package/.output/server/chunks/routes/api/workshop/schedules/_id_.get.mjs +2 -1
  907. package/.output/server/chunks/routes/api/workshop/schedules/_id_.get.mjs.map +1 -1
  908. package/.output/server/chunks/routes/api/workshop/schedules/_id_.patch.mjs +2 -1
  909. package/.output/server/chunks/routes/api/workshop/schedules/_id_.patch.mjs.map +1 -1
  910. package/.output/server/chunks/routes/api/workshop/tasks/_id/complete.post.mjs +2 -1
  911. package/.output/server/chunks/routes/api/workshop/tasks/_id/complete.post.mjs.map +1 -1
  912. package/.output/server/chunks/routes/api/workshop/tasks/_id/dispatch.post.mjs +2 -1
  913. package/.output/server/chunks/routes/api/workshop/tasks/_id/dispatch.post.mjs.map +1 -1
  914. package/.output/server/chunks/routes/api/workshop/tasks/_id/index.post.mjs +2 -1
  915. package/.output/server/chunks/routes/api/workshop/tasks/_id/index.post.mjs.map +1 -1
  916. package/.output/server/chunks/routes/api/workshop/tasks/_id/reassign.post.mjs +2 -1
  917. package/.output/server/chunks/routes/api/workshop/tasks/_id/reassign.post.mjs.map +1 -1
  918. package/.output/server/chunks/routes/api/workshop/tasks/_id/reopen.post.mjs +48 -0
  919. package/.output/server/chunks/routes/api/workshop/tasks/_id/reopen.post.mjs.map +1 -0
  920. package/.output/server/chunks/routes/api/workshop/tasks/_id/report.post.mjs +2 -1
  921. package/.output/server/chunks/routes/api/workshop/tasks/_id/report.post.mjs.map +1 -1
  922. package/.output/server/chunks/routes/api/workshop/tasks/_id/retry.post.mjs +2 -1
  923. package/.output/server/chunks/routes/api/workshop/tasks/_id/retry.post.mjs.map +1 -1
  924. package/.output/server/chunks/routes/api/workshop/tasks/_id/update.post.mjs +2 -1
  925. package/.output/server/chunks/routes/api/workshop/tasks/_id/update.post.mjs.map +1 -1
  926. package/.output/server/chunks/routes/api/workshop/tasks/_id_.get.mjs +2 -1
  927. package/.output/server/chunks/routes/api/workshop/tasks/_id_.get.mjs.map +1 -1
  928. package/.output/server/chunks/routes/api/workshop/tasks.get.mjs +2 -1
  929. package/.output/server/chunks/routes/api/workshop/tasks.get.mjs.map +1 -1
  930. package/.output/server/chunks/routes/api/workshop/teams/_id/deploy.post.mjs +3 -2
  931. package/.output/server/chunks/routes/api/workshop/teams/_id/deploy.post.mjs.map +1 -1
  932. package/.output/server/chunks/routes/api/workshop/teams/_id/index.get.mjs +2 -1
  933. package/.output/server/chunks/routes/api/workshop/teams/_id/index.get.mjs.map +1 -1
  934. package/.output/server/chunks/routes/api/workshop/teams/_id/index.post.mjs +2 -1
  935. package/.output/server/chunks/routes/api/workshop/teams/_id/index.post.mjs.map +1 -1
  936. package/.output/server/chunks/routes/api/workshop/teams/_id/index.put.mjs +3 -2
  937. package/.output/server/chunks/routes/api/workshop/teams/_id/index.put.mjs.map +1 -1
  938. package/.output/server/chunks/routes/api/workshop/teams/_id/index2.get.mjs +3 -2
  939. package/.output/server/chunks/routes/api/workshop/teams/_id/index2.get.mjs.map +1 -1
  940. package/.output/server/chunks/routes/api/workshop/teams/_id/members/_agentId_.delete.mjs +2 -1
  941. package/.output/server/chunks/routes/api/workshop/teams/_id/members/_agentId_.delete.mjs.map +1 -1
  942. package/.output/server/chunks/routes/api/workshop/teams/_id_.delete.mjs +2 -1
  943. package/.output/server/chunks/routes/api/workshop/teams/_id_.delete.mjs.map +1 -1
  944. package/.output/server/chunks/routes/api/workshop/teams/_id_.get.mjs +2 -1
  945. package/.output/server/chunks/routes/api/workshop/teams/_id_.get.mjs.map +1 -1
  946. package/.output/server/chunks/routes/api/workshop/teams/_id_.patch.mjs +2 -1
  947. package/.output/server/chunks/routes/api/workshop/teams/_id_.patch.mjs.map +1 -1
  948. package/.output/server/chunks/routes/api/workshop/users/me.get.mjs +2 -1
  949. package/.output/server/chunks/routes/api/workshop/users/me.get.mjs.map +1 -1
  950. package/.output/server/chunks/routes/api/workshop/users/register.post.mjs +2 -1
  951. package/.output/server/chunks/routes/api/workshop/users/register.post.mjs.map +1 -1
  952. package/.output/server/chunks/routes/api/workshop/workspaces/_id/channel-templates/_tplId_.post.mjs +4 -3
  953. package/.output/server/chunks/routes/api/workshop/workspaces/_id/channel-templates/_tplId_.post.mjs.map +1 -1
  954. package/.output/server/chunks/routes/api/workshop/workspaces/_id/channels/_channelId_.delete.mjs +2 -1
  955. package/.output/server/chunks/routes/api/workshop/workspaces/_id/channels/_channelId_.delete.mjs.map +1 -1
  956. package/.output/server/chunks/routes/api/workshop/workspaces/_id/channels/_channelId_.post.mjs +2 -1
  957. package/.output/server/chunks/routes/api/workshop/workspaces/_id/channels/_channelId_.post.mjs.map +1 -1
  958. package/.output/server/chunks/routes/api/workshop/workspaces/index.delete.mjs +2 -1
  959. package/.output/server/chunks/routes/api/workshop/workspaces/index.delete.mjs.map +1 -1
  960. package/.output/server/chunks/routes/renderer.mjs +3 -3
  961. package/.output/server/chunks/virtual/entry.mjs +250 -57
  962. package/.output/server/chunks/virtual/entry.mjs.map +1 -1
  963. package/.output/server/chunks/virtual/precomputed.mjs +1 -1
  964. package/.output/server/index.mjs +2 -1
  965. package/.output/server/index.mjs.map +1 -1
  966. package/.output/server/package.json +1 -1
  967. package/LICENSE +69 -91
  968. package/README-zh.md +928 -833
  969. package/README.md +949 -845
  970. package/app/components/AppSidebar.vue +1 -1
  971. package/app/components/aml/AmlEnvPanel.vue +230 -230
  972. package/app/components/app-header/LoginModal.vue +131 -0
  973. package/app/components/app-header/UserChip.vue +161 -150
  974. package/app/components/dcw/DcwAddNodeModal.vue +29 -1
  975. package/app/components/dcw/DcwEditLineModal.vue +216 -108
  976. package/app/components/dcw/DcwLineCard.vue +129 -117
  977. package/app/components/dcw/DcwMesArtifacts.vue +140 -0
  978. package/app/components/dcw/DcwNodesTable.vue +9 -0
  979. package/app/components/dcw/DcwParamApprovalCard.vue +116 -110
  980. package/app/components/dcw/DcwRecipeEditModal.vue +399 -306
  981. package/app/components/dcw/ExpConfirmCard.vue +103 -0
  982. package/app/components/dcw/RecipeDispatchApprovalCard.vue +330 -0
  983. package/app/components/dcw/RecipeGateApprovalCard.vue +159 -0
  984. package/app/components/logs/LogsEventTable.vue +321 -309
  985. package/app/components/logs/LogsFilterCard.vue +253 -234
  986. package/app/components/workshop/DaqNodeRow.vue +616 -592
  987. package/app/components/workshop/town/TownView.vue +6 -2
  988. package/app/components/workshop/town/components/AutoModeConfirmModal.vue +94 -0
  989. package/app/components/workshop/town/components/TownAgentBindings.vue +18 -2
  990. package/app/components/workshop/town/components/TownAgentInspector.vue +10 -2
  991. package/app/components/workshop/town/components/TownRightRail.vue +4 -1
  992. package/app/components/workshop/workbench/AuthGate.vue +182 -179
  993. package/app/components/workshop/workbench/ChangePasswordModal.vue +106 -0
  994. package/app/composables/workshop/town/town-relay-props.ts +6 -1
  995. package/app/composables/workshop/town/useTownAgentBindings.ts +73 -6
  996. package/app/composables/workshop/useDcwStream.ts +374 -362
  997. package/app/composables/workshop/useOpsLog.ts +3 -0
  998. package/app/layouts/default.vue +201 -161
  999. package/app/layouts/town.vue +40 -21
  1000. package/app/pages/daq/composables/useDaqDetailHistory.ts +199 -199
  1001. package/app/pages/dcw/[id].vue +380 -318
  1002. package/app/pages/dcw/composables/useDcwAddNode.ts +29 -0
  1003. package/app/pages/dcw/composables/useDcwParamApprovals.ts +123 -119
  1004. package/app/pages/dcw/composables/useDcwRecipes.ts +256 -242
  1005. package/app/pages/dcw/composables/useExpConfirmations.ts +108 -0
  1006. package/app/pages/dcw/composables/useRecipeDispatchApprovals.ts +200 -0
  1007. package/app/pages/dcw/dcw-page.css +360 -344
  1008. package/app/pages/dcw/index.vue +11 -0
  1009. package/app/pages/logs/composables/useLogsQuery.ts +57 -52
  1010. package/app/pages/logs/index.vue +95 -94
  1011. package/app/pages/workshop/composables/useWorkbenchAuth.ts +131 -125
  1012. package/app/pages/workshop/index.vue +121 -116
  1013. package/app/plugins/http.ts +6 -0
  1014. package/app/stores/workshop/auth-ui.ts +26 -0
  1015. package/app/stores/workshop/user.ts +19 -2
  1016. package/config.yml +180 -180
  1017. package/docker-compose.yml +4 -0
  1018. package/docs/cli.en.md +447 -447
  1019. package/docs/cli.md +412 -412
  1020. package/docs/plugins.en.md +621 -621
  1021. package/docs/plugins.md +610 -610
  1022. package/docs/sdk.en.md +964 -964
  1023. package/docs/sdk.md +900 -900
  1024. package/i18n/locales/en.ts +2812 -2738
  1025. package/i18n/locales/zh-CN.ts +2812 -2738
  1026. package/package.json +181 -181
  1027. package/scripts/_audit/feature-audit-e2e.mjs +12 -9
  1028. package/scripts/_audit/idd-scenarios-e2e.mjs +239 -0
  1029. package/scripts/aw-start-smoke.mjs +7 -1
  1030. package/scripts/check-docs-sync.mjs +417 -367
  1031. package/scripts/dev-guard.mjs +2 -1
  1032. package/scripts/dev-mes-simulator.mjs +456 -0
  1033. package/scripts/feature-sweep-e2e.mjs +176 -0
  1034. package/scripts/onboarding/forge-channel.mjs +157 -0
  1035. package/scripts/onboarding/lib.mjs +78 -0
  1036. package/scripts/onboarding/onboard.mjs +196 -0
  1037. package/scripts/onboarding/provision-line.mjs +179 -0
  1038. package/scripts/onboarding/test-connection.mjs +42 -0
  1039. package/scripts/onboarding/verify-line.mjs +95 -0
  1040. package/scripts/perm-isolation-e2e.mjs +188 -0
  1041. package/scripts/render-opt-curve.mjs +97 -0
  1042. package/scripts/render-pressure-curve.mjs +89 -0
  1043. package/scripts/start.mjs +126 -2
  1044. package/scripts/testing/aep-live.mjs +60 -0
  1045. package/scripts/testing/aggregate-benchmarks.mjs +79 -0
  1046. package/scripts/testing/api-full-loop.mjs +172 -0
  1047. package/scripts/testing/benchmark.config.json +66 -0
  1048. package/scripts/testing/game-host.mjs +63 -0
  1049. package/scripts/testing/hitl-expert.mjs +143 -0
  1050. package/scripts/testing/idd-kb-smoke.mjs +46 -0
  1051. package/scripts/testing/run-benchmark.mjs +984 -0
  1052. package/scripts/testing/sdk-live.mjs +55 -0
  1053. package/scripts/ui/e2e-interactive.mjs +14 -14
  1054. package/scripts/ui/lib.mjs +210 -210
  1055. package/server/api/health.get.ts +12 -1
  1056. package/server/api/metrics.ts +89 -78
  1057. package/server/api/users/change-password.post.ts +18 -0
  1058. package/server/api/users/setup-status.get.ts +13 -8
  1059. package/server/api/workshop/agent-tools/approvals/[id]/decide.post.ts +21 -6
  1060. package/server/api/workshop/agent-tools/bindings/[id].patch.ts +36 -3
  1061. package/server/api/workshop/agent-tools/bindings/index.post.ts +60 -9
  1062. package/server/api/workshop/caller.ts +3 -2
  1063. package/server/api/workshop/channel-templates/[id]/instantiate.post.ts +1 -1
  1064. package/server/api/workshop/channels/[id]/line.put.ts +41 -30
  1065. package/server/api/workshop/channels/[id]/members/join.post.ts +35 -30
  1066. package/server/api/workshop/channels.post.ts +13 -0
  1067. package/server/api/workshop/daq/index.post.ts +6 -1
  1068. package/server/api/workshop/daq/test-driver.post.ts +3 -3
  1069. package/server/api/workshop/dcw/index.post.ts +26 -20
  1070. package/server/api/workshop/dcw/lines/[id].delete.ts +3 -2
  1071. package/server/api/workshop/dcw/lines/[id].patch.ts +5 -3
  1072. package/server/api/workshop/dcw/lines/index.post.ts +1 -1
  1073. package/server/api/workshop/dcw/mes-artifacts/file.get.ts +50 -0
  1074. package/server/api/workshop/dcw/mes-artifacts/index.get.ts +27 -0
  1075. package/server/api/workshop/dcw/mes-hook-test.post.ts +105 -0
  1076. package/server/api/workshop/dcw/products/index.post.ts +6 -2
  1077. package/server/api/workshop/dcw/recipes/[id]/apply.post.ts +6 -2
  1078. package/server/api/workshop/dcw/recipes/[id]/mark-good.post.ts +6 -2
  1079. package/server/api/workshop/dcw/recipes/[id]/revert.post.ts +33 -29
  1080. package/server/api/workshop/dcw/recipes/[id]/rollback-good.post.ts +7 -3
  1081. package/server/api/workshop/dcw/recipes/index.post.ts +27 -15
  1082. package/server/api/workshop/exp/confirmations/[id]/decide.post.ts +41 -0
  1083. package/server/api/workshop/exp/confirmations/index.get.ts +25 -0
  1084. package/server/api/workshop/hitl/pending.get.ts +57 -48
  1085. package/server/api/workshop/hitl/respond.post.ts +10 -2
  1086. package/server/api/workshop/ops-logs/index.get.ts +1 -0
  1087. package/server/api/workshop/tasks/[id]/reopen.post.ts +35 -0
  1088. package/server/api/workshop/ws/peer-sub.ts +135 -128
  1089. package/server/api/workshop/ws/subscriptions.ts +15 -1
  1090. package/server/plugins/backup.ts +94 -11
  1091. package/server/plugins/daq.ts +3 -0
  1092. package/server/plugins/memory-watch.ts +92 -0
  1093. package/server/plugins/parent-watch.ts +22 -0
  1094. package/server/plugins/workshop.ts +258 -230
  1095. package/server/plugins-builtin/diag-bridge/client.mjs +49 -1
  1096. package/server/plugins-builtin/diag-bridge/host/diagnosis.mjs +15 -6
  1097. package/server/plugins-builtin/diag-bridge/host/exports.mjs +104 -0
  1098. package/server/plugins-builtin/diag-bridge/host/plugin.mjs +120 -17
  1099. package/server/plugins-builtin/diag-bridge/host/sweep.mjs +47 -0
  1100. package/server/plugins-builtin/diag-bridge/i18n.json +82 -72
  1101. package/server/repositories/user.repository.ts +36 -12
  1102. package/server/schemas/user.schema.ts +7 -0
  1103. package/server/services/user.service.ts +50 -8
  1104. package/server/services/workshop/agents/agent-interface.ts +1 -1
  1105. package/server/services/workshop/agents/base-agent.ts +8 -1
  1106. package/server/services/workshop/agents/binding-authz.ts +8 -5
  1107. package/server/services/workshop/agents/binding-mode.ts +51 -0
  1108. package/server/services/workshop/agents/hitl-decision/dispatcher.ts +16 -3
  1109. package/server/services/workshop/agents/hitl-decision/index.ts +24 -24
  1110. package/server/services/workshop/agents/hitl-decision/line-of.ts +38 -0
  1111. package/server/services/workshop/agents/hitl-decision/reconcile.ts +152 -70
  1112. package/server/services/workshop/agents/hitl-decision/shared.ts +2 -0
  1113. package/server/services/workshop/agents/hitl-registry.ts +582 -577
  1114. package/server/services/workshop/agents/host-tool-bridge/catalog.ts +86 -2
  1115. package/server/services/workshop/agents/host-tool-bridge/dispatch.ts +25 -0
  1116. package/server/services/workshop/agents/host-tool-bridge/tools/industrial.ts +13 -1
  1117. package/server/services/workshop/agents/host-tool-bridge/tools/memory.ts +4 -1
  1118. package/server/services/workshop/agents/host-tool-bridge/tools/messaging.ts +45 -11
  1119. package/server/services/workshop/agents/host-tool-bridge/tools/tasks.ts +5 -1
  1120. package/server/services/workshop/agents/industrial/aml-activity.ts +131 -0
  1121. package/server/services/workshop/agents/industrial/aml-dataset-tools.ts +21 -0
  1122. package/server/services/workshop/agents/industrial/aml-job-tools.ts +9 -3
  1123. package/server/services/workshop/agents/industrial/daq-export.ts +510 -0
  1124. package/server/services/workshop/agents/industrial/dcw-judge-tools.ts +160 -149
  1125. package/server/services/workshop/agents/industrial/dcw-tools.ts +68 -21
  1126. package/server/services/workshop/agents/industrial/exp-tools.ts +104 -0
  1127. package/server/services/workshop/agents/industrial/grant-guard.ts +145 -0
  1128. package/server/services/workshop/agents/industrial/index.ts +4 -0
  1129. package/server/services/workshop/agents/industrial/line-tools.ts +151 -0
  1130. package/server/services/workshop/agents/industrial/manual-approval.ts +3 -2
  1131. package/server/services/workshop/agents/industrial/mes-tools.ts +143 -135
  1132. package/server/services/workshop/agents/industrial/ops-tools.ts +267 -68
  1133. package/server/services/workshop/agents/industrial/optimization-tools.ts +19 -9
  1134. package/server/services/workshop/agents/industrial/param-tools.ts +192 -169
  1135. package/server/services/workshop/agents/industrial/recipe-gate.ts +96 -0
  1136. package/server/services/workshop/agents/industrial/recipe-propose-tools.ts +366 -0
  1137. package/server/services/workshop/agents/industrial/twin-tools.ts +38 -4
  1138. package/server/services/workshop/agents/industrial-context.ts +122 -24
  1139. package/server/services/workshop/agents/mock-agent.ts +17 -0
  1140. package/server/services/workshop/agents/node-bindings.repo.ts +207 -206
  1141. package/server/services/workshop/agents/node-delegation.ts +4 -4
  1142. package/server/services/workshop/agents/omp-agent/event-mapping.ts +178 -142
  1143. package/server/services/workshop/agents/tool-approvals.ts +261 -13
  1144. package/server/services/workshop/aml/dataset-builder.ts +8 -1
  1145. package/server/services/workshop/aml/env-manager.ts +242 -242
  1146. package/server/services/workshop/aml/job-orchestrator/failure.ts +19 -0
  1147. package/server/services/workshop/aml/job-orchestrator/stages.ts +27 -0
  1148. package/server/services/workshop/aml/python-runtime.ts +600 -552
  1149. package/server/services/workshop/aml/twin/binding-snapshot.ts +637 -603
  1150. package/server/services/workshop/aml/twin/channel-profile.ts +3 -2
  1151. package/server/services/workshop/daq/bus/queue-port.ts +3 -0
  1152. package/server/services/workshop/daq/daq-controller/crud.ts +206 -202
  1153. package/server/services/workshop/daq/daq-controller/driver-probe.ts +64 -64
  1154. package/server/services/workshop/daq/daq-controller/ingest.ts +189 -189
  1155. package/server/services/workshop/daq/daq-controller/state.ts +204 -197
  1156. package/server/services/workshop/daq/daq-controller/views.ts +85 -84
  1157. package/server/services/workshop/daq/daq-node.repo.ts +27 -4
  1158. package/server/services/workshop/daq/daq-node.ts +4 -2
  1159. package/server/services/workshop/daq/daq-runtime.ts +2 -1
  1160. package/server/services/workshop/daq/drivers/index.ts +29 -29
  1161. package/server/services/workshop/daq/drivers/mqtt.ts +217 -182
  1162. package/server/services/workshop/daq/drivers/registry.ts +35 -1
  1163. package/server/services/workshop/daq/drivers/shared.ts +63 -60
  1164. package/server/services/workshop/daq/objectstore/disk.adapter.ts +48 -2
  1165. package/server/services/workshop/daq/objectstore/gc.ts +92 -0
  1166. package/server/services/workshop/daq/objectstore/objectstore-port.ts +12 -0
  1167. package/server/services/workshop/daq/storage/sqlite.adapter.ts +318 -318
  1168. package/server/services/workshop/daq/storage/timescale.adapter.ts +37 -3
  1169. package/server/services/workshop/db/database/migrations.ts +12 -1
  1170. package/server/services/workshop/db/database/open.ts +5 -1
  1171. package/server/services/workshop/db/database/rows.ts +4 -0
  1172. package/server/services/workshop/db/database/schema.ts +7 -2
  1173. package/server/services/workshop/db/database/seed.ts +71 -0
  1174. package/server/services/workshop/db/memory.repo.ts +1 -1
  1175. package/server/services/workshop/db/ops.repo.ts +24 -7
  1176. package/server/services/workshop/dcw/dcw-controller/actuation.ts +140 -127
  1177. package/server/services/workshop/dcw/dcw-controller/bindings.ts +97 -83
  1178. package/server/services/workshop/dcw/dcw-controller/crud.ts +19 -4
  1179. package/server/services/workshop/dcw/dcw-controller/gate-persist.ts +80 -0
  1180. package/server/services/workshop/dcw/dcw-controller/lines.ts +229 -213
  1181. package/server/services/workshop/dcw/dcw-controller/recipes.ts +286 -196
  1182. package/server/services/workshop/dcw/dcw-controller/state.ts +71 -66
  1183. package/server/services/workshop/dcw/dcw-controller/write-verify.ts +98 -0
  1184. package/server/services/workshop/dcw/dcw-controller/write.ts +51 -9
  1185. package/server/services/workshop/dcw/dcw-line.repo.ts +17 -1
  1186. package/server/services/workshop/dcw/dcw-node.repo.ts +110 -87
  1187. package/server/services/workshop/dcw/dcw-node.ts +8 -3
  1188. package/server/services/workshop/dcw/dcw-recipe.repo.ts +32 -0
  1189. package/server/services/workshop/dcw/dcw-runtime.ts +8 -1
  1190. package/server/services/workshop/dcw/drivers/http.ts +68 -66
  1191. package/server/services/workshop/dcw/drivers/index.ts +27 -27
  1192. package/server/services/workshop/dcw/drivers/mes-rest.ts +707 -543
  1193. package/server/services/workshop/dcw/drivers/mock.ts +47 -44
  1194. package/server/services/workshop/dcw/drivers/modbus-rtu.ts +1 -1
  1195. package/server/services/workshop/dcw/drivers/modbus.ts +1 -1
  1196. package/server/services/workshop/dcw/drivers/mqtt.ts +109 -108
  1197. package/server/services/workshop/dcw/drivers/opcua.ts +1 -1
  1198. package/server/services/workshop/dcw/drivers/registry.ts +142 -100
  1199. package/server/services/workshop/dcw/drivers/shared.ts +186 -161
  1200. package/server/services/workshop/dcw/param-map.repo.ts +349 -321
  1201. package/server/services/workshop/dcw/recipe-op-anchor.ts +117 -0
  1202. package/server/services/workshop/dcw/recipe-rollback.repo.ts +26 -0
  1203. package/server/services/workshop/exp/exp-collector.ts +275 -0
  1204. package/server/services/workshop/exp/exp-state.repo.ts +339 -0
  1205. package/server/services/workshop/json-store.mjs +137 -105
  1206. package/server/services/workshop/mes/mes-controller.ts +274 -26
  1207. package/server/services/workshop/mes/mes-datasets.ts +503 -441
  1208. package/server/services/workshop/mes/mes-hook.ts +567 -0
  1209. package/server/services/workshop/ops/ops.ts +3 -0
  1210. package/server/services/workshop/permissions.ts +7 -7
  1211. package/server/services/workshop/plugin-driver-registry.ts +123 -108
  1212. package/server/services/workshop/plugins/host/services.mjs +10 -0
  1213. package/server/services/workshop/prompts/loader.ts +11 -2
  1214. package/server/services/workshop/runtime/agent-runtime/lifecycle.ts +18 -0
  1215. package/server/services/workshop/runtime/agent-runtime/message.ts +10 -0
  1216. package/server/services/workshop/runtime/line-notify.ts +76 -0
  1217. package/server/services/workshop/runtime/manager/access.ts +488 -483
  1218. package/server/services/workshop/runtime/manager/channel-templates.ts +21 -2
  1219. package/server/services/workshop/runtime/manager/runtime-wiring.ts +96 -1
  1220. package/server/services/workshop/runtime/manager/state.ts +106 -1
  1221. package/server/services/workshop/runtime/manager/tasks.ts +67 -4
  1222. package/server/services/workshop/runtime/manager/workspace.ts +8 -2
  1223. package/server/services/workshop/runtime/memory/recall.ts +20 -1
  1224. package/server/services/workshop/runtime/memory/write.ts +149 -93
  1225. package/server/services/workshop/runtime/platform-notice.ts +113 -0
  1226. package/server/services/workshop/runtime/scheduler-loop/execute.ts +44 -12
  1227. package/server/services/workshop/runtime/scheduler-loop/rules.ts +24 -7
  1228. package/server/services/workshop/runtime/scheduler-loop/tick.ts +44 -1
  1229. package/server/services/workshop/runtime/task-engine/lifecycle.ts +11 -0
  1230. package/server/services/workshop/runtime/task-engine/update.ts +11 -0
  1231. package/server/services/workshop/settings.ts +17 -0
  1232. package/server/types/user.ts +4 -0
  1233. package/server/utils/errors.ts +1 -0
  1234. package/server/utils/response.ts +6 -0
  1235. package/shared/config/schema.json +140 -138
  1236. package/shared/config/single-instance.mjs +28 -1
  1237. package/shared/daq-protocol.ts +12 -2
  1238. package/shared/dcw-protocol/catalog.ts +6 -1
  1239. package/shared/dcw-protocol/index.ts +19 -19
  1240. package/shared/dcw-protocol/line.ts +34 -0
  1241. package/shared/dcw-protocol/recipe.ts +33 -3
  1242. package/shared/local-time.mjs +37 -13
  1243. package/shared/workshop-protocol.ts +4 -0
  1244. package/.output/public/_nuxt/B2x8SKRO2.js +0 -1
  1245. package/.output/public/_nuxt/BOhcoxIu.js +0 -2
  1246. package/.output/public/_nuxt/BQy0Yy7S.js +0 -1
  1247. package/.output/public/_nuxt/BTVyPFng2.js +0 -1
  1248. package/.output/public/_nuxt/BXR3tgEk.js +0 -1
  1249. package/.output/public/_nuxt/B_9_BM9G.js +0 -3
  1250. package/.output/public/_nuxt/BcX4fktE.js +0 -1
  1251. package/.output/public/_nuxt/Bfe2qOYs.js +0 -1
  1252. package/.output/public/_nuxt/BnoyYd0Z2.js +0 -1
  1253. package/.output/public/_nuxt/BqYO-UfR.js +0 -1
  1254. package/.output/public/_nuxt/Btv3HXrq.js +0 -1
  1255. package/.output/public/_nuxt/BuXaEtBG2.js +0 -1
  1256. package/.output/public/_nuxt/Bub2P5me.js +0 -28
  1257. package/.output/public/_nuxt/CAaSPBqk.js +0 -1
  1258. package/.output/public/_nuxt/CD9lpEz22.js +0 -13
  1259. package/.output/public/_nuxt/CFjveTJh.js +0 -1
  1260. package/.output/public/_nuxt/CI2yXRr42.js +0 -1
  1261. package/.output/public/_nuxt/COQM2L1M.js +0 -1
  1262. package/.output/public/_nuxt/Ch9KdZWb2.js +0 -1
  1263. package/.output/public/_nuxt/CtXOpljm2.js +0 -1
  1264. package/.output/public/_nuxt/CwLQAKay2.js +0 -1
  1265. package/.output/public/_nuxt/DB4ma-iU2.js +0 -1
  1266. package/.output/public/_nuxt/DV5joWTn2.js +0 -47
  1267. package/.output/public/_nuxt/DVKXGuMz2.js +0 -1
  1268. package/.output/public/_nuxt/DZDi8inD.js +0 -1
  1269. package/.output/public/_nuxt/DZuXfuXS.js +0 -14
  1270. package/.output/public/_nuxt/Db4_F1T2.js +0 -1
  1271. package/.output/public/_nuxt/DlX0nqUe.js +0 -1
  1272. package/.output/public/_nuxt/Dqz5HiXa.js +0 -2
  1273. package/.output/public/_nuxt/I1cI6sPJ2.js +0 -1
  1274. package/.output/public/_nuxt/Sjjmp5OD2.js +0 -1
  1275. package/.output/public/_nuxt/WVTVkqef.js +0 -1
  1276. package/.output/public/_nuxt/_id_.DZbVLNnu.css +0 -1
  1277. package/.output/public/_nuxt/a4X3ARNm2.js +0 -1
  1278. package/.output/public/_nuxt/bt__BP-I.js +0 -13
  1279. package/.output/public/_nuxt/builds/meta/af879435-fc74-4017-ade0-3b92c1ab35bb.json +0 -1
  1280. package/.output/public/_nuxt/cY_5jwFz2.js +0 -1
  1281. package/.output/public/_nuxt/daq.0uieKcZk.css +0 -1
  1282. package/.output/public/_nuxt/dcw.pQRVkAi_.css +0 -1
  1283. package/.output/public/_nuxt/eutnXI4F.js +0 -24
  1284. package/.output/public/_nuxt/k5K6Jj6g.js +0 -19
  1285. package/.output/public/_nuxt/logs.CD0Olr3c.css +0 -1
  1286. package/.output/public/_nuxt/wDPc4SSR.js +0 -106
  1287. package/.output/public/_nuxt/workshop.b4YRXEe0.css +0 -1
  1288. package/.output/server/chunks/_/SearchOutlined.mjs.map +0 -1
  1289. package/.output/server/chunks/build/TownView-Bf5VFYFj.mjs.map +0 -1
  1290. package/.output/server/chunks/build/_id_-CuUmVPRg.mjs.map +0 -1
  1291. package/.output/server/chunks/build/_id_-WF20tjqT.mjs.map +0 -1
  1292. package/.output/server/chunks/build/aml-C55iuLn-.mjs.map +0 -1
  1293. package/.output/server/chunks/build/daq-D0kLscVr.mjs.map +0 -1
  1294. package/.output/server/chunks/build/dcw-DuhEyu7S.mjs.map +0 -1
  1295. package/.output/server/chunks/build/input-Cr_KFj4T.mjs +0 -1381
  1296. package/.output/server/chunks/build/input-Cr_KFj4T.mjs.map +0 -1
  1297. package/.output/server/chunks/build/logs-BlOalbsZ.mjs.map +0 -1
  1298. package/.output/server/chunks/build/operations-BD6LK-Yz.mjs.map +0 -1
  1299. package/.output/server/chunks/build/pages-DloBBvU5.mjs.map +0 -1
  1300. package/.output/server/chunks/build/town-B2gBu_ZE.mjs.map +0 -1
  1301. package/.output/server/chunks/build/town-BIn3be5v.mjs.map +0 -1
  1302. package/.output/server/chunks/build/useAmlJobs--a_1ovew.mjs.map +0 -1
  1303. package/.output/server/chunks/build/useDaqDetailHistory-pfi6zXWU.mjs.map +0 -1
  1304. package/.output/server/chunks/build/useDaqDetailNode-qT7MjqJ7.mjs.map +0 -1
  1305. package/.output/server/chunks/build/useDaqFilters-CMysN13f.mjs.map +0 -1
  1306. package/.output/server/chunks/build/useDaqOptimizations-Coq5lsfM.mjs.map +0 -1
  1307. package/.output/server/chunks/build/useDashboardData-DgJcGJaF.mjs.map +0 -1
  1308. package/.output/server/chunks/build/useDcwAddNode-C9DbEKHi.mjs.map +0 -1
  1309. package/.output/server/chunks/build/useDcwCards-VDoMYG7l.mjs.map +0 -1
  1310. package/.output/server/chunks/build/useDcwDetailScope-CL97tJdJ.mjs.map +0 -1
  1311. package/.output/server/chunks/build/useDcwDetailTemplates-OLmjMSGD.mjs.map +0 -1
  1312. package/.output/server/chunks/build/useDcwFilter-Bs9C6-h_.mjs.map +0 -1
  1313. package/.output/server/chunks/build/useDcwLedger-Bbf_iFOY.mjs.map +0 -1
  1314. package/.output/server/chunks/build/useDcwLineMutations-Bhtuqw7J.mjs.map +0 -1
  1315. package/.output/server/chunks/build/useDcwLineRun-CGqZSnG4.mjs.map +0 -1
  1316. package/.output/server/chunks/build/useDcwParamApprovals-BBwdFsKv.mjs.map +0 -1
  1317. package/.output/server/chunks/build/useDcwProducts-BoBkJqpv.mjs.map +0 -1
  1318. package/.output/server/chunks/build/useDcwQuery-DP7b2qb6.mjs.map +0 -1
  1319. package/.output/server/chunks/build/useDcwQuickActions-DHRiA9KN.mjs.map +0 -1
  1320. package/.output/server/chunks/build/useDcwRecipes-CIMeH2oF.mjs.map +0 -1
  1321. package/.output/server/chunks/build/useDcwTemplates-M_-qjV8E.mjs.map +0 -1
  1322. package/.output/server/chunks/build/useDcwWrites-D94dAzqr.mjs.map +0 -1
  1323. package/.output/server/chunks/build/useLocalTime-DZ2RAtVs.mjs.map +0 -1
  1324. package/.output/server/chunks/build/useLogsQuery-2x1mKxT1.mjs.map +0 -1
  1325. package/.output/server/chunks/build/useLogsScope-04cUJCU-.mjs.map +0 -1
  1326. package/.output/server/chunks/build/useMonitorData-guVjMDtR.mjs.map +0 -1
  1327. package/.output/server/chunks/build/useMonitorFormat-C7lhZe4g.mjs.map +0 -1
  1328. package/.output/server/chunks/build/useWorkbenchAuth-DqjBX-6w.mjs.map +0 -1
  1329. package/.output/server/chunks/build/useWorkbenchWorkspaces-GQVU9BLv.mjs.map +0 -1
  1330. package/.output/server/chunks/build/useWorkspaceChannels-B13vROC1.mjs.map +0 -1
  1331. package/.output/server/chunks/build/workshop-BDqWzJtr.mjs.map +0 -1
  1332. package/scripts/_aw0746-stage5.mjs +0 -159
  1333. package/scripts/_aw0746-stage6-aml.mjs +0 -177
  1334. package/scripts/_aw0746-train-strong.py +0 -142
  1335. package/scripts/_aw0747-readme-rows.mjs +0 -32
  1336. package/scripts/_aw0748-fresh-channel.mjs +0 -21
  1337. package/scripts/_aw0748-mock-dispatch-diag.mjs +0 -66
  1338. package/scripts/_aw0748-wake-channel.mjs +0 -46
  1339. package/scripts/_aw0749-readme-rows.mjs +0 -23
  1340. package/scripts/_dbg-comm-verify.mjs +0 -188
  1341. package/scripts/_dbg-im-e2e.mjs +0 -169
  1342. package/scripts/_dbg-opt2-run.mjs +0 -114
  1343. package/scripts/_dbg-opt2-setup.mjs +0 -95
  1344. package/scripts/_dbg-param-map-e2e.ts +0 -248
  1345. package/scripts/_dbg-param-map-rest-smoke.mjs +0 -73
  1346. package/scripts/_dbg-param-real-scenario.mjs +0 -153
  1347. package/scripts/_dbg-real-scenario-e2e.mjs +0 -246
  1348. package/scripts/_dbg-recipe-stale-e2e.mjs +0 -135
  1349. package/scripts/_dbg-schedule-ui-verify.mjs +0 -115
  1350. package/scripts/_dbg-team-matrix.mjs +0 -148
  1351. package/scripts/_dbg-ui-fullcrawl.mjs +0 -91
  1352. package/scripts/_dbg-ui-static-audit.mjs +0 -65
  1353. package/scripts/_dbg-write-lock-e2e.mjs +0 -131
  1354. /package/.output/public/_nuxt/{DdNujZN52.js → DdNujZN5.js} +0 -0
@@ -1,543 +1,707 @@
1
- /**
2
- * MES 集成(REST API 映射)写驱动:用声明式 readMap/writeMap/historyMap 把任意
3
- * MES REST 端点映射成 DCW 的 读/写/历史 三个原语(映射为 text 表单的 JSON 字符串)。
4
- *
5
- * 设计边界:
6
- * - 坏映射在配置期拒绝(safeParse + 形状校验),不进请求链路。
7
- * - 凭据零明文:secretRef 只存引用名,token 从 env AW_MES_<REF>_TOKEN 或
8
- * 运行时设置 mes.secret.<ref> 解析;401 文案直接指向该链路。
9
- * - SSRF 防护:baseUrl 强制 http/https;DNS 解析后任一 IP 落私有/环回段且未
10
- * 显式 allowPrivateHost='true' 一律拒绝(生产 MES 在内网属预期,白名单须显式)。
11
- * - 限速:同驱动实例令牌桶(默认 5 req/s),防把 MES 打挂。
12
- */
13
- import { lookup } from 'node:dns/promises'
14
- import { isIP } from 'node:net'
15
- import { AppError } from '../../../../utils/errors'
16
- import type { DcwFetchHistoryInput, DcwFetchHistoryResult, DcwHistoryRow, DcwReadInput, DcwReadResult, DcwWriteDriver, DcwWriteInput, DcwWriteResult } from './shared'
17
- import { num, readbackAck } from './shared'
18
-
19
- // ============================================================
20
- // 映射配置形状(safeParse 目标)
21
- // ============================================================
22
-
23
- interface MesReadMap {
24
- method: string
25
- path: string
26
- query: Record<string, string>
27
- headers: Record<string, string>
28
- response: { valuePath: string, tsPath?: string, tsFormat?: 'epoch_s' | 'epoch_ms' | 'iso' }
29
- }
30
-
31
- interface MesWriteMap {
32
- method: string
33
- path: string
34
- query: Record<string, string>
35
- headers: Record<string, string>
36
- /** {{value}} 为治理后工程值的插值模板(缺省 {"value":"{{value}}"});字符串/对象均可 */
37
- bodyTemplate?: unknown
38
- /** 受理状态码(缺省 [200,201]) */
39
- successOn: number[]
40
- response?: { ackPath?: string }
41
- }
42
-
43
- interface MesHistoryMap {
44
- method: string
45
- path: string
46
- query: Record<string, string>
47
- headers: Record<string, string>
48
- response: { rowsPath: string, valuePath: string, tsPath: string, nextCursorPath?: string }
49
- pageSize?: number
50
- maxPages: number
51
- }
52
-
53
- // ============================================================
54
- // 映射解析(text 字段 JSON 字符串 → 结构;坏映射配置期拒绝)
55
- // ============================================================
56
-
57
- function parseJsonField(cfg: Record<string, unknown>, key: string): unknown {
58
- const raw = cfg[key]
59
- if (raw === null || raw === undefined || String(raw).trim() === '') return undefined
60
- try {
61
- return JSON.parse(String(raw)) as unknown
62
- }
63
- catch (err) {
64
- throw new AppError(400, 'BAD_REQUEST', `${key} 不是合法 JSON:${err instanceof Error ? err.message : String(err)}`)
65
- }
66
- }
67
-
68
- function asRecord(v: unknown, what: string): Record<string, unknown> {
69
- if (v === null || v === undefined || typeof v !== 'object' || Array.isArray(v)) {
70
- throw new AppError(400, 'BAD_REQUEST', `${what} 应为 JSON 对象`)
71
- }
72
- return v as Record<string, unknown>
73
- }
74
-
75
- function stringRecord(v: unknown, what: string): Record<string, string> {
76
- if (v === null || v === undefined) return {}
77
- const rec = asRecord(v, what)
78
- return Object.fromEntries(Object.entries(rec).map(([k, x]): [string, string] => [k, String(x)]))
79
- }
80
-
81
- function reqString(rec: Record<string, unknown>, key: string, what: string): string {
82
- const v = rec[key]
83
- if (typeof v !== 'string' || v.trim() === '') throw new AppError(400, 'BAD_REQUEST', `${what} 缺少必填字符串字段 ${key}`)
84
- return v
85
- }
86
-
87
- const optString = (v: unknown): string | undefined => (v === null || v === undefined ? undefined : String(v))
88
-
89
- function parseReadMap(cfg: Record<string, unknown>): MesReadMap | null {
90
- const v = parseJsonField(cfg, 'readMap')
91
- if (v === undefined) return null
92
- const rec = asRecord(v, 'readMap')
93
- const resp = asRecord(rec.response, 'readMap.response')
94
- const fmt = optString(resp.tsFormat)
95
- if (fmt !== undefined && fmt !== 'epoch_s' && fmt !== 'epoch_ms' && fmt !== 'iso') {
96
- throw new AppError(400, 'BAD_REQUEST', `readMap.response.tsFormat 仅支持 epoch_s/epoch_ms/iso(当前 ${fmt})`)
97
- }
98
- return {
99
- method: optString(rec.method) ?? 'GET',
100
- path: reqString(rec, 'path', 'readMap'),
101
- query: stringRecord(rec.query, 'readMap.query'),
102
- headers: stringRecord(rec.headers, 'readMap.headers'),
103
- response: { valuePath: reqString(resp, 'valuePath', 'readMap.response'), tsPath: optString(resp.tsPath), tsFormat: fmt },
104
- }
105
- }
106
-
107
- function parseWriteMap(cfg: Record<string, unknown>): MesWriteMap | null {
108
- const v = parseJsonField(cfg, 'writeMap')
109
- if (v === undefined) return null
110
- const rec = asRecord(v, 'writeMap')
111
- const successOnRaw = rec.successOn === undefined ? [200, 201] : rec.successOn
112
- if (!Array.isArray(successOnRaw)) throw new AppError(400, 'BAD_REQUEST', 'writeMap.successOn 应为状态码数组(如 [200,201])')
113
- const successOn = successOnRaw.map(Number).filter(n => Number.isFinite(n))
114
- if (successOn.length === 0) throw new AppError(400, 'BAD_REQUEST', 'writeMap.successOn 未包含任何有效状态码')
115
- const response = rec.response === undefined ? undefined : asRecord(rec.response, 'writeMap.response')
116
- return {
117
- method: optString(rec.method) ?? 'POST',
118
- path: reqString(rec, 'path', 'writeMap'),
119
- query: stringRecord(rec.query, 'writeMap.query'),
120
- headers: stringRecord(rec.headers, 'writeMap.headers'),
121
- bodyTemplate: rec.bodyTemplate,
122
- successOn,
123
- response: response ? { ackPath: optString(response.ackPath) } : undefined,
124
- }
125
- }
126
-
127
- function parseHistoryMap(cfg: Record<string, unknown>): MesHistoryMap | null {
128
- const v = parseJsonField(cfg, 'historyMap')
129
- if (v === undefined) return null
130
- const rec = asRecord(v, 'historyMap')
131
- const resp = asRecord(rec.response, 'historyMap.response')
132
- const pageSize = rec.pageSize === undefined ? undefined : Number(rec.pageSize)
133
- const maxPages = rec.maxPages === undefined ? 40 : Number(rec.maxPages)
134
- return {
135
- method: optString(rec.method) ?? 'GET',
136
- path: reqString(rec, 'path', 'historyMap'),
137
- query: stringRecord(rec.query, 'historyMap.query'),
138
- headers: stringRecord(rec.headers, 'historyMap.headers'),
139
- response: {
140
- rowsPath: reqString(resp, 'rowsPath', 'historyMap.response'),
141
- valuePath: reqString(resp, 'valuePath', 'historyMap.response'),
142
- tsPath: reqString(resp, 'tsPath', 'historyMap.response'),
143
- nextCursorPath: optString(resp.nextCursorPath),
144
- },
145
- pageSize: pageSize !== undefined && Number.isFinite(pageSize) && pageSize > 0 ? pageSize : undefined,
146
- maxPages: Number.isFinite(maxPages) && maxPages > 0 ? maxPages : 40,
147
- }
148
- }
149
-
150
- // ============================================================
151
- // SSRF 防护:协议白名单 + DNS 解析后私网/环回段判定
152
- // ============================================================
153
-
154
- /** 私有/环回段:IPv4 127/8 · 10/8 · 172.16/12 · 192.168/16 · 169.254/16;IPv6 ::1 · :: · fc00::/7 · fe80::/10 */
155
- function isPrivateIp(ip: string): boolean {
156
- const v4 = ip.toLowerCase().startsWith('::ffff:') ? ip.slice(7) : ip // IPv4-mapped IPv6 按 IPv4 判
157
- if (isIP(v4) === 4) {
158
- const seg = v4.split('.').map(Number)
159
- const a = seg[0]!
160
- const b = seg[1]!
161
- return a === 127 || a === 10 || (a === 172 && b >= 16 && b <= 31) || (a === 192 && b === 168) || (a === 169 && b === 254)
162
- }
163
- const h16 = Number.parseInt(v4.split(':')[0] ?? '', 16)
164
- if (!Number.isFinite(h16)) return true // 解析不了按保守拒绝
165
- return h16 === 0x0001 || h16 === 0 || (h16 & 0xfe00) === 0xfc00 || (h16 & 0xffc0) === 0xfe80
166
- }
167
-
168
- /** 主机名 → IP 列表(字面 IP 直判不经 DNS;域名全量解析,任一内网地址即整批拒绝) */
169
- async function resolveTargetIps(hostname: string): Promise<string[]> {
170
- if (isIP(hostname)) return [hostname]
171
- try {
172
- const recs = await lookup(hostname, { all: true, verbatim: true })
173
- return recs.map(r => r.address)
174
- }
175
- catch (err) {
176
- throw new AppError(400, 'BAD_REQUEST', `MES 主机 DNS 解析失败:${hostname}(${err instanceof Error ? err.message : String(err)})`)
177
- }
178
- }
179
-
180
- /** 校验 baseUrl 并返回归一 origin;未显式开白名单时解析目标并拒绝内网/环回地址 */
181
- async function assertPublicOrigin(cfg: Record<string, unknown>): Promise<string> {
182
- const raw = cfg.baseUrl
183
- if (raw === null || raw === undefined || String(raw).trim() === '') {
184
- throw new AppError(400, 'BAD_REQUEST', '缺少 MES 服务地址 baseUrl')
185
- }
186
- let u: URL
187
- try {
188
- u = new URL(String(raw))
189
- }
190
- catch {
191
- throw new AppError(400, 'BAD_REQUEST', `baseUrl 不是合法 URL:${String(raw)}`)
192
- }
193
- if (u.protocol !== 'http:' && u.protocol !== 'https:') {
194
- throw new AppError(400, 'BAD_REQUEST', `baseUrl 仅支持 http/https 协议(当前 ${u.protocol});请改填 http:// 或 https:// 的 MES 地址`)
195
- }
196
- if (String(cfg.allowPrivateHost ?? 'false') !== 'true') {
197
- const ips = await resolveTargetIps(u.hostname)
198
- const privateHits = [...new Set(ips.filter(a => isPrivateIp(a)))]
199
- if (privateHits.length > 0) {
200
- throw new AppError(400, 'BAD_REQUEST', `目标 ${u.hostname} 解析到内网/环回地址(${privateHits.join(', ')}),已按 SSRF 防护拒绝;生产 MES 通常在内网——确认安全后把驱动配置 allowPrivateHost 显式设为 'true' 开启白名单`)
201
- }
202
- }
203
- return u.origin
204
- }
205
-
206
- // ============================================================
207
- // 凭据解析(零明文:配置只存引用名,token 运行时解析)
208
- // ============================================================
209
-
210
- /** secretRef → env 键:大写、非字母数字折叠为下划线(如 line1.mes → AW_MES_LINE1_MES_TOKEN) */
211
- function secretEnvKey(ref: string): string {
212
- return `AW_MES_${ref.toUpperCase().replace(/[^A-Z0-9]/g, '_')}_TOKEN`
213
- }
214
-
215
- async function resolveMesSecret(ref: unknown): Promise<string | null> {
216
- const name = String(ref ?? '').trim()
217
- if (name === '') return null
218
- const fromEnv = process.env[secretEnvKey(name)]
219
- if (fromEnv) return fromEnv
220
- // TODO(运行时设置):mes.secret.<ref> 为自由键,尚未注册进 shared/config/schema.json
221
- // 描述符,loadEffective 只回传已注册键 → settingOf 通常 undefined;此处仍按链路试探,
222
- // 待自由键/专用凭据仓落地即成完整实现。设置服务不可用(单测/极早期)静默回落 env。
223
- try {
224
- const { settingOf } = await import('../../settings')
225
- const v = settingOf(`mes.secret.${name}`)
226
- if (typeof v === 'string' && v !== '') return v
227
- }
228
- catch { /* 设置服务不可用 → env-only */ }
229
- return null
230
- }
231
-
232
- function applyAuth(headers: Record<string, string>, cfg: Record<string, unknown>, token: string | null): void {
233
- const authType = String(cfg.authType ?? 'bearer')
234
- if (token === null || authType === 'none') return // 无凭据/明示不认证 → 裸请求
235
- if (authType === 'header') headers[String(cfg.authHeaderName ?? '') || 'X-Api-Token'] = token
236
- else headers.authorization = `Bearer ${token}`
237
- }
238
-
239
- // ============================================================
240
- // 令牌桶限速(同驱动实例;默认 5 req/s,桶容 = 速率 的短突发)
241
- // ============================================================
242
-
243
- class TokenBucket {
244
- private tokens: number
245
- private last: number
246
-
247
- constructor(private readonly ratePerSec = 5) {
248
- this.tokens = ratePerSec
249
- this.last = Date.now()
250
- }
251
-
252
- async take(): Promise<void> {
253
- for (;;) {
254
- const now = Date.now()
255
- this.tokens = Math.min(this.ratePerSec, this.tokens + ((now - this.last) / 1000) * this.ratePerSec)
256
- this.last = now
257
- if (this.tokens >= 1) {
258
- this.tokens -= 1
259
- return
260
- }
261
- await new Promise(r => setTimeout(r, Math.ceil(((1 - this.tokens) / this.ratePerSec) * 1000)))
262
- }
263
- }
264
- }
265
-
266
- const limiter = new TokenBucket(5)
267
-
268
- // ============================================================
269
- // 请求核心(fetch + 超时 + 限速 + 认证注入)与 HTTP 状态分类
270
- // ============================================================
271
-
272
- interface MesReply {
273
- status: number
274
- /** JSON 响应体(非 JSON 响应为 null,状态码判定兜底) */
275
- json: unknown
276
- }
277
-
278
- async function mesRequest(
279
- cfg: Record<string, unknown>,
280
- req: { method?: string, path: string, query?: Record<string, string>, headers?: Record<string, string>, body?: unknown },
281
- ): Promise<MesReply> {
282
- const origin = await assertPublicOrigin(cfg)
283
- await limiter.take()
284
- const path = req.path.startsWith('/') ? req.path : `/${req.path}`
285
- const url = new URL(origin + path)
286
- for (const [k, v] of Object.entries(req.query ?? {})) url.searchParams.set(k, v)
287
- const headers: Record<string, string> = { accept: 'application/json', ...(req.headers ?? {}) }
288
- if (req.body !== undefined) headers['content-type'] = 'application/json'
289
- applyAuth(headers, cfg, await resolveMesSecret(cfg.secretRef))
290
- const res = await fetch(url, {
291
- method: (req.method ?? 'GET').toUpperCase(),
292
- headers,
293
- body: req.body === undefined ? undefined : JSON.stringify(req.body),
294
- // 表单值是字符串,num 归一;缺省 10s
295
- signal: AbortSignal.timeout(num(cfg.requestTimeoutMs) ?? 10_000),
296
- })
297
- let json: unknown = null
298
- try {
299
- json = await res.json() as unknown
300
- }
301
- catch { /* 非 JSON 响应忽略,由状态码判定 */ }
302
- return { status: res.status, json }
303
- }
304
-
305
- /** HTTP 状态 → 分类错误文案(401 指向凭据链路;429/5xx 各自语义) */
306
- function classifyHttpFail(status: number): string {
307
- if (status === 401 || status === 403) return `MES 鉴权失败(HTTP ${status}):凭据失效,请检查 secretRef 对应的 token(env AW_MES_<REF>_TOKEN 或运行时设置 mes.secret.<ref>)`
308
- if (status === 404) return `MES 接口不存在(HTTP 404):请检查映射 path 与 {name} 占位符取值`
309
- if (status === 429) return `MES 限流(HTTP 429):请求过于频繁,请调低节点读写节拍或提升 MES 侧配额`
310
- if (status >= 500) return `MES 服务端错误(HTTP ${status}):MES 侧异常,可稍后重试并优先排查 MES 服务日志`
311
- return `MES 返回 HTTP ${status},未按成功语义受理`
312
- }
313
-
314
- // ============================================================
315
- // 模板渲染:{name} 路径占位符 + {{value}} 深度插值
316
- // ============================================================
317
-
318
- /**
319
- * path 模板:{name} 从 query 同名键取值(URL 编码)替换,该键随即从 querystring
320
- * 移除(避免同名参数重复出现在查询串);无同名键的占位符原样保留。
321
- */
322
- function applyPathTemplate(path: string, query: Record<string, string>): { path: string, query: Record<string, string> } {
323
- const consumed = new Set<string>()
324
- const resolved = path.replace(/\{(\w+)\}/g, (m0, key: string) => {
325
- const v = query[key]
326
- if (v === undefined) return m0
327
- consumed.add(key)
328
- return encodeURIComponent(v)
329
- })
330
- const rest: Record<string, string> = {}
331
- for (const [k, v] of Object.entries(query)) if (!consumed.has(k)) rest[k] = v
332
- return { path: resolved, query: rest }
333
- }
334
-
335
- /** bodyTemplate 深度渲染:{{value}} → 治理后工程值(整串恰为占位符时保持 number 类型) */
336
- function renderBodyTemplate(tpl: unknown, eng: number): unknown {
337
- if (typeof tpl === 'string') {
338
- if (tpl.trim() === '{{value}}') return eng
339
- return tpl.replace(/\{\{\s*value\s*\}\}/g, String(eng))
340
- }
341
- if (Array.isArray(tpl)) return tpl.map(x => renderBodyTemplate(x, eng))
342
- if (tpl !== null && typeof tpl === 'object') {
343
- return Object.fromEntries(Object.entries(tpl as Record<string, unknown>).map(([k, x]) => [k, renderBodyTemplate(x, eng)]))
344
- }
345
- return tpl
346
- }
347
-
348
- // ============================================================
349
- // 响应提取:dotted-path + [*] 数组段 + 时间戳归一
350
- // ============================================================
351
-
352
- const pickKey = (base: unknown, key: string): unknown =>
353
- base !== null && typeof base === 'object' ? (base as Record<string, unknown>)[key] : undefined
354
-
355
- /**
356
- * dotted-path 取值:'data.value';数组段写作 'data.rows[*]'(historyMap.rowsPath 用),
357
- * [*] 把该层展平逐元素继续下沉 —— 以 [*] 结尾时返回数组,其余返回单值。
358
- */
359
- function extract(root: unknown, dotted: string): unknown {
360
- let level: unknown[] = [root]
361
- let expanded = false
362
- for (const segRaw of dotted.split('.')) {
363
- const seg = segRaw.trim()
364
- if (seg === '') continue
365
- const star = seg.match(/^(.*)\[\*\]$/)
366
- const next: unknown[] = []
367
- for (const base of level) {
368
- if (star) {
369
- expanded = true
370
- const arr = star[1] !== '' ? pickKey(base, star[1]!) : base
371
- if (Array.isArray(arr)) next.push(...arr)
372
- }
373
- else {
374
- next.push(pickKey(base, seg))
375
- }
376
- }
377
- level = next
378
- }
379
- return expanded ? level : level[0]
380
- }
381
-
382
- /** 数值归一(数值/数值字符串 → 有限数,其余 undefined) */
383
- function toFinite(v: unknown): number | undefined {
384
- if (v === null || v === undefined || v === '') return undefined
385
- const n = Number(v)
386
- return Number.isFinite(n) ? n : undefined
387
- }
388
-
389
- /**
390
- * 时间戳 → ISO。tsFormat 显式 epoch_s/epoch_ms 按指定换算;缺省自动:
391
- * 字符串先试 ISO 解析,纯数字按量级判秒/毫秒(≥1e12 视为 ms;1e12 ms ≈ 2001-09)。
392
- */
393
- function tsToIso(raw: unknown, fmt?: 'epoch_s' | 'epoch_ms' | 'iso'): string | null {
394
- if (raw === null || raw === undefined || raw === '') return null
395
- if (fmt === 'epoch_s' || fmt === 'epoch_ms') {
396
- const n = Number(raw)
397
- return Number.isFinite(n) ? new Date(fmt === 'epoch_s' ? n * 1000 : n).toISOString() : null
398
- }
399
- if (typeof raw === 'string') {
400
- const t = Date.parse(raw)
401
- if (Number.isFinite(t)) return new Date(t).toISOString()
402
- }
403
- const n = Number(raw)
404
- if (Number.isFinite(n) && n > 0) return new Date(n >= 1e12 ? n : n * 1000).toISOString()
405
- return String(raw)
406
- }
407
-
408
- /** readMap 一次取数:valuePath 数值 + tsPath 归一 ISO(HTTP 非 2xx 抛分类错误) */
409
- async function readOnce(cfg: Record<string, unknown>, map: MesReadMap): Promise<{ value: number | null, tsIso: string | null }> {
410
- const { path, query } = applyPathTemplate(map.path, map.query)
411
- const { status, json } = await mesRequest(cfg, { method: map.method, path, query, headers: map.headers })
412
- if (status < 200 || status >= 300) throw new AppError(502, 'MES_HTTP_ERROR', classifyHttpFail(status))
413
- const value = toFinite(extract(json, map.response.valuePath))
414
- const tsIso = map.response.tsPath ? tsToIso(extract(json, map.response.tsPath), map.response.tsFormat) : null
415
- return { value: value === undefined ? null : value, tsIso }
416
- }
417
-
418
- // ============================================================
419
- // 驱动本体
420
- // ============================================================
421
-
422
- export const mesRestDcwDriver: DcwWriteDriver = {
423
- kind: 'mes-rest',
424
- async available() {
425
- return true // Node 18+ 全局 fetch
426
- },
427
-
428
- async write(input: DcwWriteInput): Promise<DcwWriteResult> {
429
- try {
430
- const cfg = input.driverConfig
431
- const map = parseWriteMap(cfg)
432
- if (!map) throw new AppError(400, 'BAD_REQUEST', '未配置 writeMap(写映射),无法写入 MES')
433
- const { path, query } = applyPathTemplate(map.path, map.query)
434
- const body = renderBodyTemplate(map.bodyTemplate ?? { value: '{{value}}' }, input.eng)
435
- const { status, json } = await mesRequest(cfg, { method: map.method, path, query, headers: map.headers, body })
436
- if (!map.successOn.includes(status)) {
437
- return { ok: false, message: classifyHttpFail(status), raw: null, readback: null }
438
- }
439
- // ackPath:MES 业务受理语义(如 {ack:true});配置了就必须真值才算受理
440
- const ackPath = map.response?.ackPath
441
- if (ackPath && !extract(json, ackPath)) {
442
- return { ok: false, message: `MES 返回 HTTP ${status},但 ack(${ackPath})为假值,视为未受理`, raw: null, readback: null }
443
- }
444
- const readMap = parseReadMap(cfg)
445
- if (readMap) {
446
- // 有回读映射:再读一次,|回读-设定| ≤ 容差 才 ACK(readback 填实值)
447
- try {
448
- const back = await readOnce(cfg, readMap)
449
- return readbackAck(input, back.value, { raw: input.eng })
450
- }
451
- catch (backErr) {
452
- const why = backErr instanceof Error ? backErr.message : String(backErr)
453
- return { ok: false, message: `MES 已受理写入(HTTP ${status}),但回读失败,无法确认:${why}`, raw: input.eng, readback: null }
454
- }
455
- }
456
- return {
457
- ok: true,
458
- message: `MES 写入受理(HTTP ${status}${ackPath ? ',ack 已确认' : ''});无回读映射,以 MES ack 为准`,
459
- raw: input.eng,
460
- readback: null,
461
- }
462
- }
463
- catch (err) {
464
- // 配置类错误(坏映射/协议/内网)原样上抛,网关会收敛为写失败;运行时错误收敛为 ok=false
465
- if (err instanceof AppError) throw err
466
- return { ok: false, message: `MES 写入失败:${err instanceof Error ? err.message : String(err)}`, raw: null, readback: null }
467
- }
468
- },
469
-
470
- async read(input: DcwReadInput): Promise<DcwReadResult> {
471
- try {
472
- const cfg = input.driverConfig
473
- const map = parseReadMap(cfg)
474
- if (!map) return { ok: false, message: '未配置 readMap(当前值映射),无法读取', eng: null, raw: null }
475
- const { value, tsIso } = await readOnce(cfg, map)
476
- if (value === null) return { ok: false, message: `MES 响应中 valuePath(${map.response.valuePath})未提取到数值`, eng: null, raw: null }
477
- return { ok: true, message: `MES 读数 ${Number(value.toFixed(4))},ts=${tsIso ?? '未提供'}`, eng: value, raw: value }
478
- }
479
- catch (err) {
480
- // 读是调度周期原语:一切失败(含配置错)收敛为 ok=false,不打断网关节拍
481
- return { ok: false, message: err instanceof Error ? err.message : String(err), eng: null, raw: null }
482
- }
483
- },
484
-
485
- async fetchHistory(input: DcwFetchHistoryInput): Promise<DcwFetchHistoryResult> {
486
- const cfg = input.driverConfig
487
- const map = parseHistoryMap(cfg)
488
- if (!map) throw new AppError(400, 'BAD_REQUEST', '未配置 historyMap(历史映射),无法拉取 MES 历史')
489
- let cursor: string | null = null
490
- let rows = 0
491
- let pages = 0
492
- let complete = false
493
- // 声明式分页:终止 = nextCursor 缺失/空(取完)或 rows>=maxRows 或 pages>maxPages
494
- while (rows < input.maxRows && pages < map.maxPages) {
495
- const query: Record<string, string> = { ...map.query, from: input.fromIso, to: input.toIso }
496
- if (map.pageSize !== undefined && query.pageSize === undefined) query.pageSize = String(map.pageSize)
497
- if (cursor !== null) query.cursor = cursor
498
- const { path, query: qs } = applyPathTemplate(map.path, query)
499
- const { status, json } = await mesRequest(cfg, { method: map.method, path, query: qs, headers: map.headers })
500
- if (status < 200 || status >= 300) throw new AppError(502, 'MES_HTTP_ERROR', classifyHttpFail(status))
501
- const rawRows = extract(json, map.response.rowsPath)
502
- if (!Array.isArray(rawRows)) throw new AppError(502, 'MES_HTTP_ERROR', `historyMap.response.rowsPath(${map.response.rowsPath})未提取到数组`)
503
- const batch: DcwHistoryRow[] = []
504
- for (const row of rawRows) {
505
- if (rows + batch.length >= input.maxRows) break
506
- const value = toFinite(extract(row, map.response.valuePath))
507
- const ts = tsToIso(extract(row, map.response.tsPath))
508
- if (value !== undefined && ts !== null) batch.push({ ts, value })
509
- }
510
- if (batch.length > 0) await input.onRows(batch)
511
- rows += batch.length
512
- pages += 1
513
- const next = map.response.nextCursorPath ? extract(json, map.response.nextCursorPath) : undefined
514
- const nextStr = next === null || next === undefined || next === '' ? null : String(next)
515
- if (nextStr === null) {
516
- complete = true // nextCursor 缺失/空 = 数据自然耗尽
517
- break
518
- }
519
- cursor = nextStr
520
- }
521
- return { rows, complete }
522
- },
523
-
524
- async test(driverConfig: Record<string, unknown>): Promise<{ ok: boolean, message: string }> {
525
- try {
526
- const cfg = driverConfig
527
- const readMap = parseReadMap(cfg)
528
- parseWriteMap(cfg)
529
- parseHistoryMap(cfg) // 已配置的映射全部过一遍形状校验(可选映射缺省跳过)
530
- if (readMap) {
531
- const t0 = Date.now()
532
- const { value } = await readOnce(cfg, readMap)
533
- const ms = Date.now() - t0
534
- if (value === null) return { ok: false, message: `试读失败:readMap.response.valuePath(${readMap.response.valuePath})未提取到数值` }
535
- return { ok: true, message: `试读 ${Number(value.toFixed(4))} (${ms}ms)` }
536
- }
537
- return { ok: true, message: '配置校验通过(未配置 readMap,跳过试读)' }
538
- }
539
- catch (err) {
540
- return { ok: false, message: err instanceof Error ? err.message : String(err) }
541
- }
542
- },
543
- }
1
+ /**
2
+ * MES 集成(REST API 映射)写驱动:用声明式 readMap/writeMap/historyMap 把任意
3
+ * MES REST 端点映射成 DCW 的 读/写/历史 三个原语(映射为 text 表单的 JSON 字符串)。
4
+ *
5
+ * 设计边界:
6
+ * - 坏映射在配置期拒绝(safeParse + 形状校验),不进请求链路。
7
+ * - 凭据零明文:secretRef 只存引用名,token 从 env AW_MES_<REF>_TOKEN 或
8
+ * 运行时设置 mes.secret.<ref> 解析;401 文案直接指向该链路。
9
+ * - SSRF 防护:baseUrl 强制 http/https;DNS 解析后任一 IP 落私有/环回段且未
10
+ * 显式 allowPrivateHost='true' 一律拒绝(生产 MES 在内网属预期,白名单须显式)。
11
+ * - 限速:同驱动实例令牌桶(默认 5 req/s),防把 MES 打挂。
12
+ */
13
+ import { lookup } from 'node:dns/promises'
14
+ import { isIP } from 'node:net'
15
+ import { AppError } from '../../../../utils/errors'
16
+ import { mesWriteCheckHookCode, mesWriteHookCode, runMesWriteCheckHook, runMesWriteHook } from '../../mes/mes-hook'
17
+ import type { DcwFetchHistoryInput, DcwFetchHistoryResult, DcwHistoryFormat, DcwHistoryRow, DcwReadInput, DcwReadResult, DcwWriteDriver, DcwWriteInput, DcwWriteResult } from './shared'
18
+ import { num, readbackAck } from './shared'
19
+
20
+ // ============================================================
21
+ // 映射配置形状(safeParse 目标)
22
+ // ============================================================
23
+
24
+ interface MesReadMap {
25
+ method: string
26
+ path: string
27
+ query: Record<string, string>
28
+ headers: Record<string, string>
29
+ response: { valuePath: string, tsPath?: string, tsFormat?: 'epoch_s' | 'epoch_ms' | 'iso' }
30
+ }
31
+
32
+ interface MesWriteMap {
33
+ method: string
34
+ path: string
35
+ query: Record<string, string>
36
+ headers: Record<string, string>
37
+ /** {{value}} 为治理后工程值的插值模板(缺省 {"value":"{{value}}"});字符串/对象均可 */
38
+ bodyTemplate?: unknown
39
+ /** 受理状态码(缺省 [200,201]) */
40
+ successOn: number[]
41
+ response?: { ackPath?: string }
42
+ }
43
+
44
+ interface MesHistoryMap {
45
+ method: string
46
+ path: string
47
+ query: Record<string, string>
48
+ headers: Record<string, string>
49
+ response: {
50
+ rowsPath: string
51
+ /** scalar 行数值路径(format=scalar 时必填;其余格式可省) */
52
+ valuePath?: string
53
+ tsPath: string
54
+ /** 格式缺省 scalar;vector/image/table/event 见 DcwHistoryFormat */
55
+ format: DcwHistoryFormat
56
+ /** vector:每行向量数组路径 */
57
+ valuesPath?: string
58
+ /** image:每行 base64 路径与 MIME 路径 */
59
+ dataPath?: string
60
+ mimePath?: string
61
+ nextCursorPath?: string
62
+ }
63
+ pageSize?: number
64
+ maxPages: number
65
+ }
66
+
67
+ // ============================================================
68
+ // 映射解析(text 字段 JSON 字符串 → 结构;坏映射配置期拒绝)
69
+ // ============================================================
70
+
71
+ function parseJsonField(cfg: Record<string, unknown>, key: string): unknown {
72
+ const raw = cfg[key]
73
+ if (raw === null || raw === undefined || String(raw).trim() === '') return undefined
74
+ try {
75
+ return JSON.parse(String(raw)) as unknown
76
+ }
77
+ catch (err) {
78
+ throw new AppError(400, 'BAD_REQUEST', `${key} 不是合法 JSON:${err instanceof Error ? err.message : String(err)}`)
79
+ }
80
+ }
81
+
82
+ function asRecord(v: unknown, what: string): Record<string, unknown> {
83
+ if (v === null || v === undefined || typeof v !== 'object' || Array.isArray(v)) {
84
+ throw new AppError(400, 'BAD_REQUEST', `${what} 应为 JSON 对象`)
85
+ }
86
+ return v as Record<string, unknown>
87
+ }
88
+
89
+ function stringRecord(v: unknown, what: string): Record<string, string> {
90
+ if (v === null || v === undefined) return {}
91
+ const rec = asRecord(v, what)
92
+ return Object.fromEntries(Object.entries(rec).map(([k, x]): [string, string] => [k, String(x)]))
93
+ }
94
+
95
+ function reqString(rec: Record<string, unknown>, key: string, what: string): string {
96
+ const v = rec[key]
97
+ if (typeof v !== 'string' || v.trim() === '') throw new AppError(400, 'BAD_REQUEST', `${what} 缺少必填字符串字段 ${key}`)
98
+ return v
99
+ }
100
+
101
+ const optString = (v: unknown): string | undefined => (v === null || v === undefined ? undefined : String(v))
102
+
103
+ function parseReadMap(cfg: Record<string, unknown>): MesReadMap | null {
104
+ const v = parseJsonField(cfg, 'readMap')
105
+ if (v === undefined) return null
106
+ const rec = asRecord(v, 'readMap')
107
+ const resp = asRecord(rec.response, 'readMap.response')
108
+ const fmt = optString(resp.tsFormat)
109
+ if (fmt !== undefined && fmt !== 'epoch_s' && fmt !== 'epoch_ms' && fmt !== 'iso') {
110
+ throw new AppError(400, 'BAD_REQUEST', `readMap.response.tsFormat 仅支持 epoch_s/epoch_ms/iso(当前 ${fmt})`)
111
+ }
112
+ return {
113
+ method: optString(rec.method) ?? 'GET',
114
+ path: reqString(rec, 'path', 'readMap'),
115
+ query: stringRecord(rec.query, 'readMap.query'),
116
+ headers: stringRecord(rec.headers, 'readMap.headers'),
117
+ response: { valuePath: reqString(resp, 'valuePath', 'readMap.response'), tsPath: optString(resp.tsPath), tsFormat: fmt },
118
+ }
119
+ }
120
+
121
+ function parseWriteMap(cfg: Record<string, unknown>): MesWriteMap | null {
122
+ const v = parseJsonField(cfg, 'writeMap')
123
+ if (v === undefined) return null
124
+ const rec = asRecord(v, 'writeMap')
125
+ const successOnRaw = rec.successOn === undefined ? [200, 201] : rec.successOn
126
+ if (!Array.isArray(successOnRaw)) throw new AppError(400, 'BAD_REQUEST', 'writeMap.successOn 应为状态码数组(如 [200,201])')
127
+ const successOn = successOnRaw.map(Number).filter(n => Number.isFinite(n))
128
+ if (successOn.length === 0) throw new AppError(400, 'BAD_REQUEST', 'writeMap.successOn 未包含任何有效状态码')
129
+ const response = rec.response === undefined ? undefined : asRecord(rec.response, 'writeMap.response')
130
+ return {
131
+ method: optString(rec.method) ?? 'POST',
132
+ path: reqString(rec, 'path', 'writeMap'),
133
+ query: stringRecord(rec.query, 'writeMap.query'),
134
+ headers: stringRecord(rec.headers, 'writeMap.headers'),
135
+ bodyTemplate: rec.bodyTemplate,
136
+ successOn,
137
+ response: response ? { ackPath: optString(response.ackPath) } : undefined,
138
+ }
139
+ }
140
+
141
+ function parseHistoryMap(cfg: Record<string, unknown>): MesHistoryMap | null {
142
+ const v = parseJsonField(cfg, 'historyMap')
143
+ if (v === undefined) return null
144
+ const rec = asRecord(v, 'historyMap')
145
+ const resp = asRecord(rec.response, 'historyMap.response')
146
+ const formatRaw = optString(resp.format) ?? 'scalar'
147
+ const FORMATS: DcwHistoryFormat[] = ['scalar', 'vector', 'image', 'table', 'event']
148
+ if (!FORMATS.includes(formatRaw as DcwHistoryFormat)) {
149
+ throw new AppError(400, 'BAD_REQUEST', `historyMap.response.format 仅支持 ${FORMATS.join('/')}(当前 ${formatRaw})`)
150
+ }
151
+ const format = formatRaw as DcwHistoryFormat
152
+ const valuePath = optString(resp.valuePath)
153
+ const valuesPath = optString(resp.valuesPath)
154
+ const dataPath = optString(resp.dataPath)
155
+ // 载荷路径按格式校验:scalar 必须给 valuePath;vector 必须给 valuesPath;image 必须给 dataPath
156
+ if (format === 'scalar' && !valuePath) {
157
+ throw new AppError(400, 'BAD_REQUEST', 'historyMap.response.valuePath 必填(format=scalar)')
158
+ }
159
+ if (format === 'vector' && !valuesPath) {
160
+ throw new AppError(400, 'BAD_REQUEST', 'historyMap.response.valuesPath 必填(format=vector,每行向量数组路径,如 "profile")')
161
+ }
162
+ if (format === 'image' && !dataPath) {
163
+ throw new AppError(400, 'BAD_REQUEST', 'historyMap.response.dataPath 必填(format=image,每行图像 base64 路径,如 "data")')
164
+ }
165
+ const pageSize = rec.pageSize === undefined ? undefined : Number(rec.pageSize)
166
+ const maxPages = rec.maxPages === undefined ? 40 : Number(rec.maxPages)
167
+ return {
168
+ method: optString(rec.method) ?? 'GET',
169
+ path: reqString(rec, 'path', 'historyMap'),
170
+ query: stringRecord(rec.query, 'historyMap.query'),
171
+ headers: stringRecord(rec.headers, 'historyMap.headers'),
172
+ response: {
173
+ rowsPath: reqString(resp, 'rowsPath', 'historyMap.response'),
174
+ valuePath,
175
+ tsPath: reqString(resp, 'tsPath', 'historyMap.response'),
176
+ format,
177
+ valuesPath,
178
+ dataPath,
179
+ mimePath: optString(resp.mimePath),
180
+ nextCursorPath: optString(resp.nextCursorPath),
181
+ },
182
+ pageSize: pageSize !== undefined && Number.isFinite(pageSize) && pageSize > 0 ? pageSize : undefined,
183
+ maxPages: Number.isFinite(maxPages) && maxPages > 0 ? maxPages : 40,
184
+ }
185
+ }
186
+
187
+ // ============================================================
188
+ // SSRF 防护:协议白名单 + DNS 解析后私网/环回段判定
189
+ // ============================================================
190
+
191
+ /** 私有/环回段:IPv4 127/8 · 10/8 · 172.16/12 · 192.168/16 · 169.254/16;IPv6 ::1 · :: · fc00::/7 · fe80::/10 */
192
+ function isPrivateIp(ip: string): boolean {
193
+ const v4 = ip.toLowerCase().startsWith('::ffff:') ? ip.slice(7) : ip // IPv4-mapped IPv6 按 IPv4 判
194
+ if (isIP(v4) === 4) {
195
+ const seg = v4.split('.').map(Number)
196
+ const a = seg[0]!
197
+ const b = seg[1]!
198
+ return a === 127 || a === 10 || (a === 172 && b >= 16 && b <= 31) || (a === 192 && b === 168) || (a === 169 && b === 254)
199
+ }
200
+ const h16 = Number.parseInt(v4.split(':')[0] ?? '', 16)
201
+ if (!Number.isFinite(h16)) return true // 解析不了按保守拒绝
202
+ return h16 === 0x0001 || h16 === 0 || (h16 & 0xfe00) === 0xfc00 || (h16 & 0xffc0) === 0xfe80
203
+ }
204
+
205
+ /** 主机名 → IP 列表(字面 IP 直判不经 DNS;域名全量解析,任一内网地址即整批拒绝) */
206
+ async function resolveTargetIps(hostname: string): Promise<string[]> {
207
+ if (isIP(hostname)) return [hostname]
208
+ try {
209
+ const recs = await lookup(hostname, { all: true, verbatim: true })
210
+ return recs.map(r => r.address)
211
+ }
212
+ catch (err) {
213
+ throw new AppError(400, 'BAD_REQUEST', `MES 主机 DNS 解析失败:${hostname}(${err instanceof Error ? err.message : String(err)})`)
214
+ }
215
+ }
216
+
217
+ /** 校验 baseUrl 并返回归一 origin;未显式开白名单时解析目标并拒绝内网/环回地址 */
218
+ async function assertPublicOrigin(cfg: Record<string, unknown>): Promise<string> {
219
+ const raw = cfg.baseUrl
220
+ if (raw === null || raw === undefined || String(raw).trim() === '') {
221
+ throw new AppError(400, 'BAD_REQUEST', '缺少 MES 服务地址 baseUrl')
222
+ }
223
+ let u: URL
224
+ try {
225
+ u = new URL(String(raw))
226
+ }
227
+ catch {
228
+ throw new AppError(400, 'BAD_REQUEST', `baseUrl 不是合法 URL:${String(raw)}`)
229
+ }
230
+ if (u.protocol !== 'http:' && u.protocol !== 'https:') {
231
+ throw new AppError(400, 'BAD_REQUEST', `baseUrl 仅支持 http/https 协议(当前 ${u.protocol});请改填 http:// 或 https:// 的 MES 地址`)
232
+ }
233
+ if (String(cfg.allowPrivateHost ?? 'false') !== 'true') {
234
+ const ips = await resolveTargetIps(u.hostname)
235
+ const privateHits = [...new Set(ips.filter(a => isPrivateIp(a)))]
236
+ if (privateHits.length > 0) {
237
+ throw new AppError(400, 'BAD_REQUEST', `目标 ${u.hostname} 解析到内网/环回地址(${privateHits.join(', ')}),已按 SSRF 防护拒绝;生产 MES 通常在内网——确认安全后把驱动配置 allowPrivateHost 显式设为 'true' 开启白名单`)
238
+ }
239
+ }
240
+ return u.origin
241
+ }
242
+
243
+ // ============================================================
244
+ // 凭据解析(零明文:配置只存引用名,token 运行时解析)
245
+ // ============================================================
246
+
247
+ /** secretRef → env 键:大写、非字母数字折叠为下划线(如 line1.mes → AW_MES_LINE1_MES_TOKEN) */
248
+ function secretEnvKey(ref: string): string {
249
+ return `AW_MES_${ref.toUpperCase().replace(/[^A-Z0-9]/g, '_')}_TOKEN`
250
+ }
251
+
252
+ async function resolveMesSecret(ref: unknown): Promise<string | null> {
253
+ const name = String(ref ?? '').trim()
254
+ if (name === '') return null
255
+ const fromEnv = process.env[secretEnvKey(name)]
256
+ if (fromEnv) return fromEnv
257
+ // TODO(运行时设置):mes.secret.<ref> 为自由键,尚未注册进 shared/config/schema.json
258
+ // 描述符,loadEffective 只回传已注册键 → settingOf 通常 undefined;此处仍按链路试探,
259
+ // 待自由键/专用凭据仓落地即成完整实现。设置服务不可用(单测/极早期)静默回落 env。
260
+ try {
261
+ const { settingOf } = await import('../../settings')
262
+ const v = settingOf(`mes.secret.${name}`)
263
+ if (typeof v === 'string' && v !== '') return v
264
+ }
265
+ catch { /* 设置服务不可用 → env-only */ }
266
+ return null
267
+ }
268
+
269
+ function applyAuth(headers: Record<string, string>, cfg: Record<string, unknown>, token: string | null): void {
270
+ const authType = String(cfg.authType ?? 'bearer')
271
+ if (token === null || authType === 'none') return // 无凭据/明示不认证 → 裸请求
272
+ if (authType === 'header') headers[String(cfg.authHeaderName ?? '') || 'X-Api-Token'] = token
273
+ else headers.authorization = `Bearer ${token}`
274
+ }
275
+
276
+ /** 头值插值:{{SECRET:REF}} → 凭据解析(env/runtime-settings);含未解析占位符 → null(整头省略,避免明文外泄) */
277
+ async function interpolateHeaderValue(value: string): Promise<string | null> {
278
+ const placeholder = /\{\{SECRET:([^}]+)\}\}/g
279
+ if (!placeholder.test(value)) return value
280
+ placeholder.lastIndex = 0
281
+ let out = ''
282
+ let last = 0
283
+ for (const m of value.matchAll(placeholder)) {
284
+ out += value.slice(last, m.index)
285
+ const secret = await resolveMesSecret(m[1])
286
+ if (secret === null || secret === undefined || secret === '') return null
287
+ out += secret
288
+ last = m.index + m[0].length
289
+ }
290
+ out += value.slice(last)
291
+ return out
292
+ }
293
+
294
+ /** 节点级默认请求头(cfg.headers JSON)——随所有请求携带;映射级 headers 与认证头可覆盖 */
295
+ async function applyDefaultHeaders(headers: Record<string, string>, cfg: Record<string, unknown>): Promise<void> {
296
+ const raw = String(cfg.headers ?? '').trim()
297
+ if (!raw) return
298
+ let parsed: unknown
299
+ try {
300
+ parsed = JSON.parse(raw)
301
+ }
302
+ catch {
303
+ return
304
+ }
305
+ if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) return
306
+ for (const [k, v] of Object.entries(parsed as Record<string, unknown>)) {
307
+ if (typeof v !== 'string' || !k.trim()) continue
308
+ const interpolated = await interpolateHeaderValue(v)
309
+ if (interpolated !== null) headers[k.trim()] = interpolated
310
+ }
311
+ }
312
+
313
+ // ============================================================
314
+ // 令牌桶限速(同驱动实例;默认 5 req/s,桶容 = 速率 的短突发)
315
+ // ============================================================
316
+
317
+ class TokenBucket {
318
+ private tokens: number
319
+ private last: number
320
+
321
+ constructor(private readonly ratePerSec = 5) {
322
+ this.tokens = ratePerSec
323
+ this.last = Date.now()
324
+ }
325
+
326
+ async take(): Promise<void> {
327
+ for (;;) {
328
+ const now = Date.now()
329
+ this.tokens = Math.min(this.ratePerSec, this.tokens + ((now - this.last) / 1000) * this.ratePerSec)
330
+ this.last = now
331
+ if (this.tokens >= 1) {
332
+ this.tokens -= 1
333
+ return
334
+ }
335
+ await new Promise(r => setTimeout(r, Math.ceil(((1 - this.tokens) / this.ratePerSec) * 1000)))
336
+ }
337
+ }
338
+ }
339
+
340
+ const limiter = new TokenBucket(5)
341
+
342
+ // ============================================================
343
+ // 请求核心(fetch + 超时 + 限速 + 认证注入)与 HTTP 状态分类
344
+ // ============================================================
345
+
346
+ interface MesReply {
347
+ status: number
348
+ /** JSON 响应体(非 JSON 响应为 null,状态码判定兜底) */
349
+ json: unknown
350
+ }
351
+
352
+ async function mesRequest(
353
+ cfg: Record<string, unknown>,
354
+ req: { method?: string, path: string, query?: Record<string, string>, headers?: Record<string, string>, body?: unknown },
355
+ ): Promise<MesReply> {
356
+ const origin = await assertPublicOrigin(cfg)
357
+ await limiter.take()
358
+ const path = req.path.startsWith('/') ? req.path : `/${req.path}`
359
+ const url = new URL(origin + path)
360
+ for (const [k, v] of Object.entries(req.query ?? {})) url.searchParams.set(k, v)
361
+ const headers: Record<string, string> = { accept: 'application/json' }
362
+ await applyDefaultHeaders(headers, cfg)
363
+ for (const [k, v] of Object.entries(req.headers ?? {})) {
364
+ const interpolated = await interpolateHeaderValue(v)
365
+ if (interpolated !== null) headers[k] = interpolated
366
+ }
367
+ if (req.body !== undefined) headers['content-type'] = 'application/json'
368
+ applyAuth(headers, cfg, await resolveMesSecret(cfg.secretRef))
369
+ const res = await fetch(url, {
370
+ method: (req.method ?? 'GET').toUpperCase(),
371
+ headers,
372
+ body: req.body === undefined ? undefined : JSON.stringify(req.body),
373
+ // 表单值是字符串,num 归一;缺省 10s
374
+ signal: AbortSignal.timeout(num(cfg.requestTimeoutMs) ?? 10_000),
375
+ })
376
+ let json: unknown = null
377
+ try {
378
+ json = await res.json() as unknown
379
+ }
380
+ catch { /* 非 JSON 响应忽略,由状态码判定 */ }
381
+ return { status: res.status, json }
382
+ }
383
+
384
+ /** HTTP 状态 → 分类错误文案(401 指向凭据链路;429/5xx 各自语义) */
385
+ function classifyHttpFail(status: number): string {
386
+ if (status === 401 || status === 403) return `MES 鉴权失败(HTTP ${status}):凭据失效,请检查 secretRef 对应的 token(env AW_MES_<REF>_TOKEN 或运行时设置 mes.secret.<ref>)`
387
+ if (status === 404) return `MES 接口不存在(HTTP 404):请检查映射 path 与 {name} 占位符取值`
388
+ if (status === 429) return `MES 限流(HTTP 429):请求过于频繁,请调低节点读写节拍或提升 MES 侧配额`
389
+ if (status >= 500) return `MES 服务端错误(HTTP ${status}):MES 侧异常,可稍后重试并优先排查 MES 服务日志`
390
+ return `MES 返回 HTTP ${status},未按成功语义受理`
391
+ }
392
+
393
+ // ============================================================
394
+ // 模板渲染:{name} 路径占位符 + {{value}} 深度插值
395
+ // ============================================================
396
+
397
+ /**
398
+ * path 模板:{name} 从 query 同名键取值(URL 编码)替换,该键随即从 querystring
399
+ * 移除(避免同名参数重复出现在查询串);无同名键的占位符原样保留。
400
+ */
401
+ function applyPathTemplate(path: string, query: Record<string, string>): { path: string, query: Record<string, string> } {
402
+ const consumed = new Set<string>()
403
+ const resolved = path.replace(/\{(\w+)\}/g, (m0, key: string) => {
404
+ const v = query[key]
405
+ if (v === undefined) return m0
406
+ consumed.add(key)
407
+ return encodeURIComponent(v)
408
+ })
409
+ const rest: Record<string, string> = {}
410
+ for (const [k, v] of Object.entries(query)) if (!consumed.has(k)) rest[k] = v
411
+ return { path: resolved, query: rest }
412
+ }
413
+
414
+ /** bodyTemplate 深度渲染:{{value}} → 治理后工程值(整串恰为占位符时保持 number 类型) */
415
+ function renderBodyTemplate(tpl: unknown, eng: number): unknown {
416
+ if (typeof tpl === 'string') {
417
+ if (tpl.trim() === '{{value}}') return eng
418
+ return tpl.replace(/\{\{\s*value\s*\}\}/g, String(eng))
419
+ }
420
+ if (Array.isArray(tpl)) return tpl.map(x => renderBodyTemplate(x, eng))
421
+ if (tpl !== null && typeof tpl === 'object') {
422
+ return Object.fromEntries(Object.entries(tpl as Record<string, unknown>).map(([k, x]) => [k, renderBodyTemplate(x, eng)]))
423
+ }
424
+ return tpl
425
+ }
426
+
427
+ // ============================================================
428
+ // 响应提取:dotted-path + [*] 数组段 + 时间戳归一
429
+ // ============================================================
430
+
431
+ const pickKey = (base: unknown, key: string): unknown =>
432
+ base !== null && typeof base === 'object' ? (base as Record<string, unknown>)[key] : undefined
433
+
434
+ /**
435
+ * dotted-path 取值:'data.value';数组段写作 'data.rows[*]'(historyMap.rowsPath 用),
436
+ * [*] 把该层展平逐元素继续下沉 —— 以 [*] 结尾时返回数组,其余返回单值。
437
+ */
438
+ function extract(root: unknown, dotted: string): unknown {
439
+ let level: unknown[] = [root]
440
+ let expanded = false
441
+ for (const segRaw of dotted.split('.')) {
442
+ const seg = segRaw.trim()
443
+ if (seg === '') continue
444
+ const star = seg.match(/^(.*)\[\*\]$/)
445
+ const next: unknown[] = []
446
+ for (const base of level) {
447
+ if (star) {
448
+ expanded = true
449
+ const arr = star[1] !== '' ? pickKey(base, star[1]!) : base
450
+ if (Array.isArray(arr)) next.push(...arr)
451
+ }
452
+ else {
453
+ next.push(pickKey(base, seg))
454
+ }
455
+ }
456
+ level = next
457
+ }
458
+ return expanded ? level : level[0]
459
+ }
460
+
461
+ /** 数值归一(数值/数值字符串 → 有限数,其余 undefined) */
462
+ function toFinite(v: unknown): number | undefined {
463
+ if (v === null || v === undefined || v === '') return undefined
464
+ const n = Number(v)
465
+ return Number.isFinite(n) ? n : undefined
466
+ }
467
+
468
+ /**
469
+ * 时间戳 → ISO。tsFormat 显式 epoch_s/epoch_ms 按指定换算;缺省自动:
470
+ * 字符串先试 ISO 解析,纯数字按量级判秒/毫秒(≥1e12 视为 ms;1e12 ms ≈ 2001-09)。
471
+ */
472
+ function tsToIso(raw: unknown, fmt?: 'epoch_s' | 'epoch_ms' | 'iso'): string | null {
473
+ if (raw === null || raw === undefined || raw === '') return null
474
+ if (fmt === 'epoch_s' || fmt === 'epoch_ms') {
475
+ const n = Number(raw)
476
+ return Number.isFinite(n) ? new Date(fmt === 'epoch_s' ? n * 1000 : n).toISOString() : null
477
+ }
478
+ if (typeof raw === 'string') {
479
+ const t = Date.parse(raw)
480
+ if (Number.isFinite(t)) return new Date(t).toISOString()
481
+ }
482
+ const n = Number(raw)
483
+ if (Number.isFinite(n) && n > 0) return new Date(n >= 1e12 ? n : n * 1000).toISOString()
484
+ return String(raw)
485
+ }
486
+
487
+ /** readMap 一次取数:valuePath 数值 + tsPath 归一 ISO(HTTP 非 2xx 抛分类错误) */
488
+ async function readOnce(cfg: Record<string, unknown>, map: MesReadMap): Promise<{ value: number | null, tsIso: string | null }> {
489
+ const { path, query } = applyPathTemplate(map.path, map.query)
490
+ const { status, json } = await mesRequest(cfg, { method: map.method, path, query, headers: map.headers })
491
+ if (status < 200 || status >= 300) throw new AppError(502, 'MES_HTTP_ERROR', classifyHttpFail(status))
492
+ const value = toFinite(extract(json, map.response.valuePath))
493
+ const tsIso = map.response.tsPath ? tsToIso(extract(json, map.response.tsPath), map.response.tsFormat) : null
494
+ return { value: value === undefined ? null : value, tsIso }
495
+ }
496
+
497
+ // ============================================================
498
+ // 驱动本体
499
+ // ============================================================
500
+
501
+ /** 写钩子产物目录键(secretRef 优先,非法路径字符折叠下划线;避免 baseUrl 的 :// 破坏目录名) */
502
+ function writeHookKey(cfg: Record<string, unknown>): string {
503
+ return `write-${String(cfg.secretRef ?? cfg.baseUrl ?? 'mes').replace(/[^\w-]+/g, '_').slice(0, 64)}`
504
+ }
505
+
506
+ /** 节点历史格式速查(目录/控制器展示与模式分流用;坏配置按 scalar 兜底不抛) */
507
+ export function historyFormatOf(cfg: Record<string, unknown>): DcwHistoryFormat {
508
+ try {
509
+ return parseHistoryMap(cfg)?.response.format ?? 'scalar'
510
+ }
511
+ catch {
512
+ return 'scalar'
513
+ }
514
+ }
515
+
516
+ export const mesRestDcwDriver: DcwWriteDriver = {
517
+ kind: 'mes-rest',
518
+ async available() {
519
+ return true // Node 18+ 全局 fetch
520
+ },
521
+
522
+ async write(input: DcwWriteInput): Promise<DcwWriteResult> {
523
+ try {
524
+ const cfg = input.driverConfig
525
+ const map = parseWriteMap(cfg)
526
+ if (!map) throw new AppError(400, 'BAD_REQUEST', '未配置 writeMap(写映射),无法写入 MES')
527
+ // writeHook(可选,用户自写代码):声明本节点写 API 的真实调用方式 —— 多字段 JSON API
528
+ // ({tem,vol,rot}) 场景下,节点只对**一个字段**负责:hook 把工程值组装成单字段请求体。
529
+ // 覆盖键:method/path/query/headers/body(未覆盖的键回退 writeMap 声明;body 缺省 {{value}} 模板)。
530
+ let hookReq: { method?: string, path?: string, query?: Record<string, string>, headers?: Record<string, string>, body?: unknown } | null = null
531
+ const writeHook = mesWriteHookCode(cfg)
532
+ if (writeHook) {
533
+ try {
534
+ hookReq = await runMesWriteHook(writeHook, input.eng, { nodeId: writeHookKey(cfg) })
535
+ }
536
+ catch (hookErr) {
537
+ // 配置期错误(代码超长 400)原样上抛;运行期失败(hook 抛错/超时/形状不对)收敛 ok=false
538
+ if (hookErr instanceof AppError && hookErr.status === 400) throw hookErr
539
+ return { ok: false, message: `writeHook 执行失败:${hookErr instanceof Error ? hookErr.message : String(hookErr)}`, raw: null, readback: null, ack: 'unverified' }
540
+ }
541
+ }
542
+ const method = hookReq?.method ?? map.method
543
+ const basePath = hookReq?.path ?? map.path
544
+ const query = { ...map.query, ...(hookReq?.query ?? {}) }
545
+ const headers = { ...map.headers, ...(hookReq?.headers ?? {}) }
546
+ const { path, query: qs } = applyPathTemplate(basePath, query)
547
+ const body = hookReq && 'body' in hookReq
548
+ ? hookReq.body
549
+ : renderBodyTemplate(map.bodyTemplate ?? { value: '{{value}}' }, input.eng)
550
+ const { status, json } = await mesRequest(cfg, { method, path, query: qs, headers, body })
551
+ if (!map.successOn.includes(status)) {
552
+ return { ok: false, message: classifyHttpFail(status), raw: null, readback: null, ack: 'unverified' }
553
+ }
554
+ // writeCheckHook(可选,用户自写):对 MES 响应 data 做二次校验(回读之外的业务正确性判定;
555
+ // 如 applied 字段必须等于本次设定)。ok=false → 写失败(诚实语义,不静默吞)。
556
+ const checkHook = mesWriteCheckHookCode(cfg)
557
+ if (checkHook) {
558
+ const check = await runMesWriteCheckHook(checkHook, status, json, input.eng, { nodeId: writeHookKey(cfg) })
559
+ if (!check.ok) {
560
+ return { ok: false, message: `MES 已受理(HTTP ${status}),但二次校验未通过:${check.message}`, raw: input.eng, readback: null }
561
+ }
562
+ }
563
+ // ackPath:MES 业务受理语义(如 {ack:true});配置了就必须真值才算受理
564
+ const ackPath = map.response?.ackPath
565
+ if (ackPath && !extract(json, ackPath)) {
566
+ return { ok: false, message: `MES 返回 HTTP ${status},但 ack(${ackPath})为假值,视为未受理`, raw: null, readback: null }
567
+ }
568
+ const readMap = parseReadMap(cfg)
569
+ if (readMap) {
570
+ // 有回读映射:再读一次,|回读-设定| ≤ 容差 才 ACK(readback 填实值)
571
+ try {
572
+ const back = await readOnce(cfg, readMap)
573
+ return readbackAck(input, back.value, { raw: input.eng })
574
+ }
575
+ catch (backErr) {
576
+ const why = backErr instanceof Error ? backErr.message : String(backErr)
577
+ return { ok: false, message: `MES 已受理写入(HTTP ${status}),但回读失败,无法确认:${why}`, raw: input.eng, readback: null }
578
+ }
579
+ }
580
+ return {
581
+ ok: true,
582
+ // MES 业务 ack(HTTP+ackPath)只是**应用层受理**,设备/工位侧未回读证实 → transport-ack,
583
+ // 交写后验证器经 readMap/readNow 补验;有回读映射时 readbackAck 已给 readback-verified。
584
+ ack: 'transport-ack',
585
+ message: `MES 写入受理(HTTP ${status}${ackPath ? ',ack 已确认' : ''});无回读映射,以 MES ack 为准(设备侧待验证)`,
586
+ raw: input.eng,
587
+ readback: null,
588
+ }
589
+ }
590
+ catch (err) {
591
+ // 配置类错误(坏映射/协议/内网)原样上抛,网关会收敛为写失败;运行时错误收敛为 ok=false
592
+ if (err instanceof AppError) throw err
593
+ return { ok: false, message: `MES 写入失败:${err instanceof Error ? err.message : String(err)}`, raw: null, readback: null, ack: 'unverified' }
594
+ }
595
+ },
596
+
597
+ async read(input: DcwReadInput): Promise<DcwReadResult> {
598
+ try {
599
+ const cfg = input.driverConfig
600
+ const map = parseReadMap(cfg)
601
+ if (!map) return { ok: false, message: '未配置 readMap(当前值映射),无法读取', eng: null, raw: null }
602
+ const { value, tsIso } = await readOnce(cfg, map)
603
+ if (value === null) return { ok: false, message: `MES 响应中 valuePath(${map.response.valuePath})未提取到数值`, eng: null, raw: null }
604
+ return { ok: true, message: `MES 读数 ${Number(value.toFixed(4))},ts=${tsIso ?? '未提供'}`, eng: value, raw: value }
605
+ }
606
+ catch (err) {
607
+ // 读是调度周期原语:一切失败(含配置错)收敛为 ok=false,不打断网关节拍
608
+ return { ok: false, message: err instanceof Error ? err.message : String(err), eng: null, raw: null }
609
+ }
610
+ },
611
+
612
+ async fetchHistory(input: DcwFetchHistoryInput): Promise<DcwFetchHistoryResult> {
613
+ const cfg = input.driverConfig
614
+ const map = parseHistoryMap(cfg)
615
+ if (!map) throw new AppError(400, 'BAD_REQUEST', '未配置 historyMap(历史映射),无法拉取 MES 历史')
616
+ let cursor: string | null = null
617
+ let rows = 0
618
+ let pages = 0
619
+ let complete = false
620
+ // 声明式分页:终止 = nextCursor 缺失/空(取完)或 rows>=maxRows 或 pages>maxPages
621
+ while (rows < input.maxRows && pages < map.maxPages) {
622
+ const query: Record<string, string> = { ...map.query, from: input.fromIso, to: input.toIso }
623
+ if (map.pageSize !== undefined && query.pageSize === undefined) query.pageSize = String(map.pageSize)
624
+ if (cursor !== null) query.cursor = cursor
625
+ const { path, query: qs } = applyPathTemplate(map.path, query)
626
+ const { status, json } = await mesRequest(cfg, { method: map.method, path, query: qs, headers: map.headers })
627
+ if (status < 200 || status >= 300) throw new AppError(502, 'MES_HTTP_ERROR', classifyHttpFail(status))
628
+ const rawRows = extract(json, map.response.rowsPath)
629
+ if (!Array.isArray(rawRows)) throw new AppError(502, 'MES_HTTP_ERROR', `historyMap.response.rowsPath(${map.response.rowsPath})未提取到数组`)
630
+ const fmt = map.response.format
631
+ const batch: DcwHistoryRow[] = []
632
+ for (const row of rawRows) {
633
+ if (rows + batch.length >= input.maxRows) break
634
+ const ts = tsToIso(extract(row, map.response.tsPath))
635
+ if (ts === null) continue
636
+ if (fmt === 'vector') {
637
+ // 检测向量行:valuesPath 提取数组,逐元素数值归一(非数值元素剔除)
638
+ const arr = extract(row, map.response.valuesPath ?? '')
639
+ if (!Array.isArray(arr) || arr.length === 0) continue
640
+ const values = arr.map(v => toFinite(v)).filter((x): x is number => x !== undefined)
641
+ if (values.length === 0) continue
642
+ batch.push({ ts, values })
643
+ }
644
+ else if (fmt === 'image') {
645
+ // 图像帧:base64 提取(空串跳过);MIME 缺省 image/png。
646
+ // 同时保留行元数据(去掉 base64 字段后的原始行:defects/width 等)到 record,
647
+ // 供钩子/统计读取 —— 图像的信息量不止像素,MES 检测算法的伴随字段常是诊断关键。
648
+ const data = extract(row, map.response.dataPath ?? '')
649
+ if (typeof data !== 'string' || data.trim() === '') continue
650
+ const mimeRaw = map.response.mimePath ? extract(row, map.response.mimePath) : undefined
651
+ const meta: Record<string, unknown> = {}
652
+ if (row !== null && typeof row === 'object') {
653
+ const dataKey = (map.response.dataPath ?? '').split('.').pop() ?? ''
654
+ for (const [k, v] of Object.entries(row as Record<string, unknown>)) {
655
+ if (k === dataKey || v === data) continue
656
+ if (typeof v === 'string' && v.length > 256) continue // 超长字符串不入 meta(防 base64 变体)
657
+ meta[k] = v
658
+ }
659
+ }
660
+ batch.push({ ts, data, mime: typeof mimeRaw === 'string' && mimeRaw.includes('/') ? mimeRaw : 'image/png', record: meta })
661
+ }
662
+ else if (fmt === 'table' || fmt === 'event') {
663
+ // 记录行:整行 JSON 保留(table=批次汇总/事件=离散事件;ts 仍归一 ISO 供对齐)
664
+ if (row === null || typeof row !== 'object') continue
665
+ batch.push({ ts, record: row })
666
+ }
667
+ else {
668
+ const value = toFinite(extract(row, map.response.valuePath ?? ''))
669
+ if (value !== undefined) batch.push({ ts, value })
670
+ }
671
+ }
672
+ if (batch.length > 0) await input.onRows(batch)
673
+ rows += batch.length
674
+ pages += 1
675
+ const next = map.response.nextCursorPath ? extract(json, map.response.nextCursorPath) : undefined
676
+ const nextStr = next === null || next === undefined || next === '' ? null : String(next)
677
+ if (nextStr === null) {
678
+ complete = true // nextCursor 缺失/空 = 数据自然耗尽
679
+ break
680
+ }
681
+ cursor = nextStr
682
+ }
683
+ return { rows, complete }
684
+ },
685
+
686
+ async test(driverConfig: Record<string, unknown>): Promise<{ ok: boolean, message: string }> {
687
+ try {
688
+ const cfg = driverConfig
689
+ const readMap = parseReadMap(cfg)
690
+ parseWriteMap(cfg)
691
+ parseHistoryMap(cfg) // 已配置的映射全部过一遍形状校验(可选映射缺省跳过)
692
+ mesWriteHookCode(cfg) // 已配置的钩子代码过长度校验(语法在执行期诚实报错)
693
+ mesWriteCheckHookCode(cfg)
694
+ if (readMap) {
695
+ const t0 = Date.now()
696
+ const { value } = await readOnce(cfg, readMap)
697
+ const ms = Date.now() - t0
698
+ if (value === null) return { ok: false, message: `试读失败:readMap.response.valuePath(${readMap.response.valuePath})未提取到数值` }
699
+ return { ok: true, message: `试读 ${Number(value.toFixed(4))} (${ms}ms)` }
700
+ }
701
+ return { ok: true, message: '配置校验通过(未配置 readMap,跳过试读)' }
702
+ }
703
+ catch (err) {
704
+ return { ok: false, message: err instanceof Error ? err.message : String(err) }
705
+ }
706
+ },
707
+ }