agentworkshop 0.7.54 → 0.7.59

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 (1356) 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/92fd7e2e-18f2-45c3-8588-d93004dda6e3.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 +13085 -8339
  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/cli/commands/mcp.mjs +6 -0
  1017. package/config.yml +180 -180
  1018. package/docker-compose.yml +4 -0
  1019. package/docs/cli.en.md +447 -447
  1020. package/docs/cli.md +412 -412
  1021. package/docs/plugins.en.md +621 -621
  1022. package/docs/plugins.md +610 -610
  1023. package/docs/sdk.en.md +964 -964
  1024. package/docs/sdk.md +900 -900
  1025. package/i18n/locales/en.ts +2812 -2738
  1026. package/i18n/locales/zh-CN.ts +2812 -2738
  1027. package/mcp/aw-mcp-server.mjs +4 -1
  1028. package/package.json +181 -181
  1029. package/scripts/_audit/feature-audit-e2e.mjs +12 -9
  1030. package/scripts/_audit/idd-scenarios-e2e.mjs +239 -0
  1031. package/scripts/aw-start-smoke.mjs +7 -1
  1032. package/scripts/check-docs-sync.mjs +417 -367
  1033. package/scripts/dev-guard.mjs +2 -1
  1034. package/scripts/dev-mes-simulator.mjs +456 -0
  1035. package/scripts/feature-sweep-e2e.mjs +176 -0
  1036. package/scripts/onboarding/forge-channel.mjs +157 -0
  1037. package/scripts/onboarding/lib.mjs +78 -0
  1038. package/scripts/onboarding/onboard.mjs +196 -0
  1039. package/scripts/onboarding/provision-line.mjs +179 -0
  1040. package/scripts/onboarding/test-connection.mjs +42 -0
  1041. package/scripts/onboarding/verify-line.mjs +95 -0
  1042. package/scripts/perm-isolation-e2e.mjs +188 -0
  1043. package/scripts/render-opt-curve.mjs +97 -0
  1044. package/scripts/render-pressure-curve.mjs +89 -0
  1045. package/scripts/start.mjs +126 -2
  1046. package/scripts/testing/aep-live.mjs +60 -0
  1047. package/scripts/testing/aggregate-benchmarks.mjs +79 -0
  1048. package/scripts/testing/api-full-loop.mjs +172 -0
  1049. package/scripts/testing/benchmark.config.json +66 -0
  1050. package/scripts/testing/game-host.mjs +63 -0
  1051. package/scripts/testing/hitl-expert.mjs +143 -0
  1052. package/scripts/testing/idd-kb-smoke.mjs +46 -0
  1053. package/scripts/testing/run-benchmark.mjs +984 -0
  1054. package/scripts/testing/sdk-live.mjs +55 -0
  1055. package/scripts/ui/e2e-interactive.mjs +14 -14
  1056. package/scripts/ui/lib.mjs +210 -210
  1057. package/server/api/health.get.ts +12 -1
  1058. package/server/api/metrics.ts +89 -78
  1059. package/server/api/users/change-password.post.ts +18 -0
  1060. package/server/api/users/setup-status.get.ts +13 -8
  1061. package/server/api/workshop/agent-tools/approvals/[id]/decide.post.ts +21 -6
  1062. package/server/api/workshop/agent-tools/bindings/[id].patch.ts +36 -3
  1063. package/server/api/workshop/agent-tools/bindings/index.post.ts +60 -9
  1064. package/server/api/workshop/caller.ts +3 -2
  1065. package/server/api/workshop/channel-templates/[id]/instantiate.post.ts +1 -1
  1066. package/server/api/workshop/channels/[id]/line.put.ts +41 -30
  1067. package/server/api/workshop/channels/[id]/members/join.post.ts +35 -30
  1068. package/server/api/workshop/channels.post.ts +13 -0
  1069. package/server/api/workshop/daq/index.post.ts +6 -1
  1070. package/server/api/workshop/daq/test-driver.post.ts +3 -3
  1071. package/server/api/workshop/dcw/index.post.ts +26 -20
  1072. package/server/api/workshop/dcw/lines/[id].delete.ts +3 -2
  1073. package/server/api/workshop/dcw/lines/[id].patch.ts +5 -3
  1074. package/server/api/workshop/dcw/lines/index.post.ts +1 -1
  1075. package/server/api/workshop/dcw/mes-artifacts/file.get.ts +50 -0
  1076. package/server/api/workshop/dcw/mes-artifacts/index.get.ts +27 -0
  1077. package/server/api/workshop/dcw/mes-hook-test.post.ts +105 -0
  1078. package/server/api/workshop/dcw/products/index.post.ts +6 -2
  1079. package/server/api/workshop/dcw/recipes/[id]/apply.post.ts +6 -2
  1080. package/server/api/workshop/dcw/recipes/[id]/mark-good.post.ts +6 -2
  1081. package/server/api/workshop/dcw/recipes/[id]/revert.post.ts +33 -29
  1082. package/server/api/workshop/dcw/recipes/[id]/rollback-good.post.ts +7 -3
  1083. package/server/api/workshop/dcw/recipes/index.post.ts +27 -15
  1084. package/server/api/workshop/exp/confirmations/[id]/decide.post.ts +41 -0
  1085. package/server/api/workshop/exp/confirmations/index.get.ts +25 -0
  1086. package/server/api/workshop/hitl/pending.get.ts +57 -48
  1087. package/server/api/workshop/hitl/respond.post.ts +10 -2
  1088. package/server/api/workshop/ops-logs/index.get.ts +1 -0
  1089. package/server/api/workshop/tasks/[id]/reopen.post.ts +35 -0
  1090. package/server/api/workshop/ws/peer-sub.ts +135 -128
  1091. package/server/api/workshop/ws/subscriptions.ts +15 -1
  1092. package/server/plugins/backup.ts +94 -11
  1093. package/server/plugins/daq.ts +3 -0
  1094. package/server/plugins/memory-watch.ts +92 -0
  1095. package/server/plugins/parent-watch.ts +22 -0
  1096. package/server/plugins/workshop.ts +258 -230
  1097. package/server/plugins-builtin/diag-bridge/client.mjs +49 -1
  1098. package/server/plugins-builtin/diag-bridge/host/diagnosis.mjs +15 -6
  1099. package/server/plugins-builtin/diag-bridge/host/exports.mjs +104 -0
  1100. package/server/plugins-builtin/diag-bridge/host/plugin.mjs +120 -17
  1101. package/server/plugins-builtin/diag-bridge/host/sweep.mjs +47 -0
  1102. package/server/plugins-builtin/diag-bridge/i18n.json +82 -72
  1103. package/server/repositories/user.repository.ts +36 -12
  1104. package/server/schemas/user.schema.ts +7 -0
  1105. package/server/services/user.service.ts +50 -8
  1106. package/server/services/workshop/agents/agent-interface.ts +1 -1
  1107. package/server/services/workshop/agents/base-agent.ts +8 -1
  1108. package/server/services/workshop/agents/binding-authz.ts +8 -5
  1109. package/server/services/workshop/agents/binding-mode.ts +51 -0
  1110. package/server/services/workshop/agents/hitl-decision/dispatcher.ts +16 -3
  1111. package/server/services/workshop/agents/hitl-decision/index.ts +24 -24
  1112. package/server/services/workshop/agents/hitl-decision/line-of.ts +38 -0
  1113. package/server/services/workshop/agents/hitl-decision/reconcile.ts +152 -70
  1114. package/server/services/workshop/agents/hitl-decision/shared.ts +2 -0
  1115. package/server/services/workshop/agents/hitl-registry.ts +582 -577
  1116. package/server/services/workshop/agents/host-tool-bridge/catalog.ts +86 -2
  1117. package/server/services/workshop/agents/host-tool-bridge/dispatch.ts +25 -0
  1118. package/server/services/workshop/agents/host-tool-bridge/tools/industrial.ts +13 -1
  1119. package/server/services/workshop/agents/host-tool-bridge/tools/memory.ts +4 -1
  1120. package/server/services/workshop/agents/host-tool-bridge/tools/messaging.ts +45 -11
  1121. package/server/services/workshop/agents/host-tool-bridge/tools/tasks.ts +5 -1
  1122. package/server/services/workshop/agents/industrial/aml-activity.ts +131 -0
  1123. package/server/services/workshop/agents/industrial/aml-dataset-tools.ts +21 -0
  1124. package/server/services/workshop/agents/industrial/aml-job-tools.ts +9 -3
  1125. package/server/services/workshop/agents/industrial/daq-export.ts +510 -0
  1126. package/server/services/workshop/agents/industrial/dcw-judge-tools.ts +160 -149
  1127. package/server/services/workshop/agents/industrial/dcw-tools.ts +68 -21
  1128. package/server/services/workshop/agents/industrial/exp-tools.ts +104 -0
  1129. package/server/services/workshop/agents/industrial/grant-guard.ts +145 -0
  1130. package/server/services/workshop/agents/industrial/index.ts +4 -0
  1131. package/server/services/workshop/agents/industrial/line-tools.ts +151 -0
  1132. package/server/services/workshop/agents/industrial/manual-approval.ts +3 -2
  1133. package/server/services/workshop/agents/industrial/mes-tools.ts +143 -135
  1134. package/server/services/workshop/agents/industrial/ops-tools.ts +267 -68
  1135. package/server/services/workshop/agents/industrial/optimization-tools.ts +19 -9
  1136. package/server/services/workshop/agents/industrial/param-tools.ts +192 -169
  1137. package/server/services/workshop/agents/industrial/recipe-gate.ts +96 -0
  1138. package/server/services/workshop/agents/industrial/recipe-propose-tools.ts +366 -0
  1139. package/server/services/workshop/agents/industrial/twin-tools.ts +38 -4
  1140. package/server/services/workshop/agents/industrial-context.ts +122 -24
  1141. package/server/services/workshop/agents/mock-agent.ts +17 -0
  1142. package/server/services/workshop/agents/node-bindings.repo.ts +207 -206
  1143. package/server/services/workshop/agents/node-delegation.ts +4 -4
  1144. package/server/services/workshop/agents/omp-agent/event-mapping.ts +178 -142
  1145. package/server/services/workshop/agents/tool-approvals.ts +261 -13
  1146. package/server/services/workshop/aml/dataset-builder.ts +8 -1
  1147. package/server/services/workshop/aml/env-manager.ts +242 -242
  1148. package/server/services/workshop/aml/job-orchestrator/failure.ts +19 -0
  1149. package/server/services/workshop/aml/job-orchestrator/stages.ts +27 -0
  1150. package/server/services/workshop/aml/python-runtime.ts +600 -552
  1151. package/server/services/workshop/aml/twin/binding-snapshot.ts +637 -603
  1152. package/server/services/workshop/aml/twin/channel-profile.ts +3 -2
  1153. package/server/services/workshop/daq/bus/queue-port.ts +3 -0
  1154. package/server/services/workshop/daq/daq-controller/crud.ts +206 -202
  1155. package/server/services/workshop/daq/daq-controller/driver-probe.ts +64 -64
  1156. package/server/services/workshop/daq/daq-controller/ingest.ts +189 -189
  1157. package/server/services/workshop/daq/daq-controller/state.ts +204 -197
  1158. package/server/services/workshop/daq/daq-controller/views.ts +85 -84
  1159. package/server/services/workshop/daq/daq-node.repo.ts +27 -4
  1160. package/server/services/workshop/daq/daq-node.ts +4 -2
  1161. package/server/services/workshop/daq/daq-runtime.ts +2 -1
  1162. package/server/services/workshop/daq/drivers/index.ts +29 -29
  1163. package/server/services/workshop/daq/drivers/mqtt.ts +217 -182
  1164. package/server/services/workshop/daq/drivers/registry.ts +35 -1
  1165. package/server/services/workshop/daq/drivers/shared.ts +63 -60
  1166. package/server/services/workshop/daq/objectstore/disk.adapter.ts +48 -2
  1167. package/server/services/workshop/daq/objectstore/gc.ts +92 -0
  1168. package/server/services/workshop/daq/objectstore/objectstore-port.ts +12 -0
  1169. package/server/services/workshop/daq/storage/sqlite.adapter.ts +318 -318
  1170. package/server/services/workshop/daq/storage/timescale.adapter.ts +37 -3
  1171. package/server/services/workshop/db/database/migrations.ts +12 -1
  1172. package/server/services/workshop/db/database/open.ts +5 -1
  1173. package/server/services/workshop/db/database/rows.ts +4 -0
  1174. package/server/services/workshop/db/database/schema.ts +7 -2
  1175. package/server/services/workshop/db/database/seed.ts +71 -0
  1176. package/server/services/workshop/db/memory.repo.ts +1 -1
  1177. package/server/services/workshop/db/ops.repo.ts +24 -7
  1178. package/server/services/workshop/dcw/dcw-controller/actuation.ts +140 -127
  1179. package/server/services/workshop/dcw/dcw-controller/bindings.ts +97 -83
  1180. package/server/services/workshop/dcw/dcw-controller/crud.ts +19 -4
  1181. package/server/services/workshop/dcw/dcw-controller/gate-persist.ts +80 -0
  1182. package/server/services/workshop/dcw/dcw-controller/lines.ts +229 -213
  1183. package/server/services/workshop/dcw/dcw-controller/recipes.ts +286 -196
  1184. package/server/services/workshop/dcw/dcw-controller/state.ts +71 -66
  1185. package/server/services/workshop/dcw/dcw-controller/write-verify.ts +98 -0
  1186. package/server/services/workshop/dcw/dcw-controller/write.ts +51 -9
  1187. package/server/services/workshop/dcw/dcw-line.repo.ts +17 -1
  1188. package/server/services/workshop/dcw/dcw-node.repo.ts +110 -87
  1189. package/server/services/workshop/dcw/dcw-node.ts +8 -3
  1190. package/server/services/workshop/dcw/dcw-recipe.repo.ts +32 -0
  1191. package/server/services/workshop/dcw/dcw-runtime.ts +8 -1
  1192. package/server/services/workshop/dcw/drivers/http.ts +68 -66
  1193. package/server/services/workshop/dcw/drivers/index.ts +27 -27
  1194. package/server/services/workshop/dcw/drivers/mes-rest.ts +707 -543
  1195. package/server/services/workshop/dcw/drivers/mock.ts +47 -44
  1196. package/server/services/workshop/dcw/drivers/modbus-rtu.ts +1 -1
  1197. package/server/services/workshop/dcw/drivers/modbus.ts +1 -1
  1198. package/server/services/workshop/dcw/drivers/mqtt.ts +109 -108
  1199. package/server/services/workshop/dcw/drivers/opcua.ts +1 -1
  1200. package/server/services/workshop/dcw/drivers/registry.ts +142 -100
  1201. package/server/services/workshop/dcw/drivers/shared.ts +186 -161
  1202. package/server/services/workshop/dcw/param-map.repo.ts +349 -321
  1203. package/server/services/workshop/dcw/recipe-op-anchor.ts +117 -0
  1204. package/server/services/workshop/dcw/recipe-rollback.repo.ts +26 -0
  1205. package/server/services/workshop/exp/exp-collector.ts +275 -0
  1206. package/server/services/workshop/exp/exp-state.repo.ts +339 -0
  1207. package/server/services/workshop/json-store.mjs +137 -105
  1208. package/server/services/workshop/mes/mes-controller.ts +274 -26
  1209. package/server/services/workshop/mes/mes-datasets.ts +503 -441
  1210. package/server/services/workshop/mes/mes-hook.ts +567 -0
  1211. package/server/services/workshop/ops/ops.ts +3 -0
  1212. package/server/services/workshop/permissions.ts +7 -7
  1213. package/server/services/workshop/plugin-driver-registry.ts +123 -108
  1214. package/server/services/workshop/plugins/host/services.mjs +10 -0
  1215. package/server/services/workshop/prompts/loader.ts +11 -2
  1216. package/server/services/workshop/runtime/agent-runtime/lifecycle.ts +18 -0
  1217. package/server/services/workshop/runtime/agent-runtime/message.ts +10 -0
  1218. package/server/services/workshop/runtime/line-notify.ts +76 -0
  1219. package/server/services/workshop/runtime/manager/access.ts +488 -483
  1220. package/server/services/workshop/runtime/manager/channel-templates.ts +21 -2
  1221. package/server/services/workshop/runtime/manager/runtime-wiring.ts +96 -1
  1222. package/server/services/workshop/runtime/manager/state.ts +106 -1
  1223. package/server/services/workshop/runtime/manager/tasks.ts +67 -4
  1224. package/server/services/workshop/runtime/manager/workspace.ts +8 -2
  1225. package/server/services/workshop/runtime/memory/recall.ts +20 -1
  1226. package/server/services/workshop/runtime/memory/write.ts +149 -93
  1227. package/server/services/workshop/runtime/platform-notice.ts +113 -0
  1228. package/server/services/workshop/runtime/scheduler-loop/execute.ts +44 -12
  1229. package/server/services/workshop/runtime/scheduler-loop/rules.ts +24 -7
  1230. package/server/services/workshop/runtime/scheduler-loop/tick.ts +44 -1
  1231. package/server/services/workshop/runtime/task-engine/lifecycle.ts +11 -0
  1232. package/server/services/workshop/runtime/task-engine/update.ts +11 -0
  1233. package/server/services/workshop/settings.ts +17 -0
  1234. package/server/types/user.ts +4 -0
  1235. package/server/utils/errors.ts +1 -0
  1236. package/server/utils/response.ts +6 -0
  1237. package/shared/config/schema.json +140 -138
  1238. package/shared/config/single-instance.mjs +28 -1
  1239. package/shared/daq-protocol.ts +12 -2
  1240. package/shared/dcw-protocol/catalog.ts +6 -1
  1241. package/shared/dcw-protocol/index.ts +19 -19
  1242. package/shared/dcw-protocol/line.ts +34 -0
  1243. package/shared/dcw-protocol/recipe.ts +33 -3
  1244. package/shared/local-time.mjs +37 -13
  1245. package/shared/workshop-protocol.ts +4 -0
  1246. package/.output/public/_nuxt/B2x8SKRO2.js +0 -1
  1247. package/.output/public/_nuxt/BOhcoxIu.js +0 -2
  1248. package/.output/public/_nuxt/BQy0Yy7S.js +0 -1
  1249. package/.output/public/_nuxt/BTVyPFng2.js +0 -1
  1250. package/.output/public/_nuxt/BXR3tgEk.js +0 -1
  1251. package/.output/public/_nuxt/B_9_BM9G.js +0 -3
  1252. package/.output/public/_nuxt/BcX4fktE.js +0 -1
  1253. package/.output/public/_nuxt/Bfe2qOYs.js +0 -1
  1254. package/.output/public/_nuxt/BnoyYd0Z2.js +0 -1
  1255. package/.output/public/_nuxt/BqYO-UfR.js +0 -1
  1256. package/.output/public/_nuxt/Btv3HXrq.js +0 -1
  1257. package/.output/public/_nuxt/BuXaEtBG2.js +0 -1
  1258. package/.output/public/_nuxt/Bub2P5me.js +0 -28
  1259. package/.output/public/_nuxt/CAaSPBqk.js +0 -1
  1260. package/.output/public/_nuxt/CD9lpEz22.js +0 -13
  1261. package/.output/public/_nuxt/CFjveTJh.js +0 -1
  1262. package/.output/public/_nuxt/CI2yXRr42.js +0 -1
  1263. package/.output/public/_nuxt/COQM2L1M.js +0 -1
  1264. package/.output/public/_nuxt/Ch9KdZWb2.js +0 -1
  1265. package/.output/public/_nuxt/CtXOpljm2.js +0 -1
  1266. package/.output/public/_nuxt/CwLQAKay2.js +0 -1
  1267. package/.output/public/_nuxt/DB4ma-iU2.js +0 -1
  1268. package/.output/public/_nuxt/DV5joWTn2.js +0 -47
  1269. package/.output/public/_nuxt/DVKXGuMz2.js +0 -1
  1270. package/.output/public/_nuxt/DZDi8inD.js +0 -1
  1271. package/.output/public/_nuxt/DZuXfuXS.js +0 -14
  1272. package/.output/public/_nuxt/Db4_F1T2.js +0 -1
  1273. package/.output/public/_nuxt/DlX0nqUe.js +0 -1
  1274. package/.output/public/_nuxt/Dqz5HiXa.js +0 -2
  1275. package/.output/public/_nuxt/I1cI6sPJ2.js +0 -1
  1276. package/.output/public/_nuxt/Sjjmp5OD2.js +0 -1
  1277. package/.output/public/_nuxt/WVTVkqef.js +0 -1
  1278. package/.output/public/_nuxt/_id_.DZbVLNnu.css +0 -1
  1279. package/.output/public/_nuxt/a4X3ARNm2.js +0 -1
  1280. package/.output/public/_nuxt/bt__BP-I.js +0 -13
  1281. package/.output/public/_nuxt/builds/meta/af879435-fc74-4017-ade0-3b92c1ab35bb.json +0 -1
  1282. package/.output/public/_nuxt/cY_5jwFz2.js +0 -1
  1283. package/.output/public/_nuxt/daq.0uieKcZk.css +0 -1
  1284. package/.output/public/_nuxt/dcw.pQRVkAi_.css +0 -1
  1285. package/.output/public/_nuxt/eutnXI4F.js +0 -24
  1286. package/.output/public/_nuxt/k5K6Jj6g.js +0 -19
  1287. package/.output/public/_nuxt/logs.CD0Olr3c.css +0 -1
  1288. package/.output/public/_nuxt/wDPc4SSR.js +0 -106
  1289. package/.output/public/_nuxt/workshop.b4YRXEe0.css +0 -1
  1290. package/.output/server/chunks/_/SearchOutlined.mjs.map +0 -1
  1291. package/.output/server/chunks/build/TownView-Bf5VFYFj.mjs.map +0 -1
  1292. package/.output/server/chunks/build/_id_-CuUmVPRg.mjs.map +0 -1
  1293. package/.output/server/chunks/build/_id_-WF20tjqT.mjs.map +0 -1
  1294. package/.output/server/chunks/build/aml-C55iuLn-.mjs.map +0 -1
  1295. package/.output/server/chunks/build/daq-D0kLscVr.mjs.map +0 -1
  1296. package/.output/server/chunks/build/dcw-DuhEyu7S.mjs.map +0 -1
  1297. package/.output/server/chunks/build/input-Cr_KFj4T.mjs +0 -1381
  1298. package/.output/server/chunks/build/input-Cr_KFj4T.mjs.map +0 -1
  1299. package/.output/server/chunks/build/logs-BlOalbsZ.mjs.map +0 -1
  1300. package/.output/server/chunks/build/operations-BD6LK-Yz.mjs.map +0 -1
  1301. package/.output/server/chunks/build/pages-DloBBvU5.mjs.map +0 -1
  1302. package/.output/server/chunks/build/town-B2gBu_ZE.mjs.map +0 -1
  1303. package/.output/server/chunks/build/town-BIn3be5v.mjs.map +0 -1
  1304. package/.output/server/chunks/build/useAmlJobs--a_1ovew.mjs.map +0 -1
  1305. package/.output/server/chunks/build/useDaqDetailHistory-pfi6zXWU.mjs.map +0 -1
  1306. package/.output/server/chunks/build/useDaqDetailNode-qT7MjqJ7.mjs.map +0 -1
  1307. package/.output/server/chunks/build/useDaqFilters-CMysN13f.mjs.map +0 -1
  1308. package/.output/server/chunks/build/useDaqOptimizations-Coq5lsfM.mjs.map +0 -1
  1309. package/.output/server/chunks/build/useDashboardData-DgJcGJaF.mjs.map +0 -1
  1310. package/.output/server/chunks/build/useDcwAddNode-C9DbEKHi.mjs.map +0 -1
  1311. package/.output/server/chunks/build/useDcwCards-VDoMYG7l.mjs.map +0 -1
  1312. package/.output/server/chunks/build/useDcwDetailScope-CL97tJdJ.mjs.map +0 -1
  1313. package/.output/server/chunks/build/useDcwDetailTemplates-OLmjMSGD.mjs.map +0 -1
  1314. package/.output/server/chunks/build/useDcwFilter-Bs9C6-h_.mjs.map +0 -1
  1315. package/.output/server/chunks/build/useDcwLedger-Bbf_iFOY.mjs.map +0 -1
  1316. package/.output/server/chunks/build/useDcwLineMutations-Bhtuqw7J.mjs.map +0 -1
  1317. package/.output/server/chunks/build/useDcwLineRun-CGqZSnG4.mjs.map +0 -1
  1318. package/.output/server/chunks/build/useDcwParamApprovals-BBwdFsKv.mjs.map +0 -1
  1319. package/.output/server/chunks/build/useDcwProducts-BoBkJqpv.mjs.map +0 -1
  1320. package/.output/server/chunks/build/useDcwQuery-DP7b2qb6.mjs.map +0 -1
  1321. package/.output/server/chunks/build/useDcwQuickActions-DHRiA9KN.mjs.map +0 -1
  1322. package/.output/server/chunks/build/useDcwRecipes-CIMeH2oF.mjs.map +0 -1
  1323. package/.output/server/chunks/build/useDcwTemplates-M_-qjV8E.mjs.map +0 -1
  1324. package/.output/server/chunks/build/useDcwWrites-D94dAzqr.mjs.map +0 -1
  1325. package/.output/server/chunks/build/useLocalTime-DZ2RAtVs.mjs.map +0 -1
  1326. package/.output/server/chunks/build/useLogsQuery-2x1mKxT1.mjs.map +0 -1
  1327. package/.output/server/chunks/build/useLogsScope-04cUJCU-.mjs.map +0 -1
  1328. package/.output/server/chunks/build/useMonitorData-guVjMDtR.mjs.map +0 -1
  1329. package/.output/server/chunks/build/useMonitorFormat-C7lhZe4g.mjs.map +0 -1
  1330. package/.output/server/chunks/build/useWorkbenchAuth-DqjBX-6w.mjs.map +0 -1
  1331. package/.output/server/chunks/build/useWorkbenchWorkspaces-GQVU9BLv.mjs.map +0 -1
  1332. package/.output/server/chunks/build/useWorkspaceChannels-B13vROC1.mjs.map +0 -1
  1333. package/.output/server/chunks/build/workshop-BDqWzJtr.mjs.map +0 -1
  1334. package/scripts/_aw0746-stage5.mjs +0 -159
  1335. package/scripts/_aw0746-stage6-aml.mjs +0 -177
  1336. package/scripts/_aw0746-train-strong.py +0 -142
  1337. package/scripts/_aw0747-readme-rows.mjs +0 -32
  1338. package/scripts/_aw0748-fresh-channel.mjs +0 -21
  1339. package/scripts/_aw0748-mock-dispatch-diag.mjs +0 -66
  1340. package/scripts/_aw0748-wake-channel.mjs +0 -46
  1341. package/scripts/_aw0749-readme-rows.mjs +0 -23
  1342. package/scripts/_dbg-comm-verify.mjs +0 -188
  1343. package/scripts/_dbg-im-e2e.mjs +0 -169
  1344. package/scripts/_dbg-opt2-run.mjs +0 -114
  1345. package/scripts/_dbg-opt2-setup.mjs +0 -95
  1346. package/scripts/_dbg-param-map-e2e.ts +0 -248
  1347. package/scripts/_dbg-param-map-rest-smoke.mjs +0 -73
  1348. package/scripts/_dbg-param-real-scenario.mjs +0 -153
  1349. package/scripts/_dbg-real-scenario-e2e.mjs +0 -246
  1350. package/scripts/_dbg-recipe-stale-e2e.mjs +0 -135
  1351. package/scripts/_dbg-schedule-ui-verify.mjs +0 -115
  1352. package/scripts/_dbg-team-matrix.mjs +0 -148
  1353. package/scripts/_dbg-ui-fullcrawl.mjs +0 -91
  1354. package/scripts/_dbg-ui-static-audit.mjs +0 -65
  1355. package/scripts/_dbg-write-lock-e2e.mjs +0 -131
  1356. /package/.output/public/_nuxt/{DdNujZN52.js → DdNujZN5.js} +0 -0
@@ -1,603 +1,637 @@
1
- import { readFileSync } from 'node:fs'
2
- import { join } from 'node:path'
3
- import { createId, sha256, type NodeBindingSnapshot as ContractNodeBindingSnapshot, type SceneContract } from './contracts'
4
- import { sceneContractHash, sceneStatus, type SceneWithDraftMetadata } from './scene-lifecycle'
5
- import { dataDirFor } from '@/shared/config/home.mjs'
6
- import { withWorkshopDbReadonly } from '../../db/readonly'
7
-
8
- export type BindingControlPolicy = 'recommendation_only' | 'hitl_governed' | 'bounded_auto'
9
- export type BindingNodeKind = 'daq' | 'dcw'
10
- export type BindingMode = 'auto' | 'manual'
11
-
12
- export type NodeBindingSnapshotBinding = ContractNodeBindingSnapshot['bindings'][number] & {
13
- productId?: string
14
- recipeId?: string
15
- }
16
-
17
- /**
18
- * The legacy contract in contracts.ts remains readable by existing callers.
19
- * This local authority type carries the immutable lineage needed by P0.
20
- */
21
- export interface AuthoritativeNodeBindingSnapshot extends Omit<ContractNodeBindingSnapshot, 'bindings'> {
22
- lineId: string
23
- productId?: string
24
- recipeId?: string
25
- recipeVersion?: string | number
26
- recipeHash?: string
27
- sceneContractHash?: string
28
- bindings: NodeBindingSnapshotBinding[]
29
- }
30
-
31
- export type NodeBindingSnapshot = AuthoritativeNodeBindingSnapshot
32
- export type BindingSnapshot = AuthoritativeNodeBindingSnapshot
33
-
34
- export interface BindingSource {
35
- id?: string
36
- channelId?: string
37
- agentId: string
38
- agentRole?: string
39
- nodeId: string
40
- kind: BindingNodeKind
41
- mode: BindingMode
42
- controlPolicy?: BindingControlPolicy
43
- lineId?: string
44
- productId?: string
45
- recipeId?: string
46
- physicalMeaning?: string
47
- unit?: string
48
- min?: number
49
- max?: number
50
- samplePeriodMs?: number
51
- createdAt?: string
52
- name?: string
53
- semantics?: string
54
- intervalMs?: number | null
55
- samplingPeriodMs?: number | null
56
- readIntervalMs?: number | null
57
- holdIntervalMs?: number | null
58
- }
59
-
60
- export interface NodeBindingSnapshotInput {
61
- channelId: string
62
- createdBy: string
63
- scene?: SceneContract | SceneWithDraftMetadata
64
- sceneContract?: SceneContract | SceneWithDraftMetadata
65
- sceneId?: string
66
- sceneVersion?: string
67
- agentId?: string
68
- agentRole?: string
69
- lineId?: string
70
- productId?: string
71
- recipeId?: string
72
- recipeVersion?: string | number
73
- recipe?: unknown
74
- recipeHash?: string
75
- controlPolicy?: BindingControlPolicy
76
- bindings?: readonly BindingSource[]
77
- currentBindings?: readonly BindingSource[]
78
- agentBindings?: readonly BindingSource[]
79
- bindingRecords?: readonly BindingSource[]
80
- nodeCatalog?: Record<string, Partial<BindingSource>> | readonly Partial<BindingSource>[]
81
- nodes?: Record<string, Partial<BindingSource>> | readonly Partial<BindingSource>[]
82
- snapshotId?: string
83
- nowMs?: number
84
- expectedBindingEpoch?: string
85
- requireFrozenScene?: boolean
86
- }
87
-
88
- export interface NodeBindingSnapshotVerifyOptions {
89
- scene?: SceneContract | SceneWithDraftMetadata
90
- frozenScene?: SceneContract | SceneWithDraftMetadata
91
- expectedChannelId?: string
92
- expectedSceneId?: string
93
- expectedSceneVersion?: string
94
- expectedLineId?: string
95
- productId?: string
96
- recipeId?: string
97
- recipeVersion?: string | number
98
- recipe?: unknown
99
- recipeHash?: string
100
- expectedSnapshotHash?: string
101
- expectedBindingSnapshotHash?: string
102
- currentBindingEpoch?: string
103
- expectedBindingEpoch?: string
104
- currentSnapshot?: unknown
105
- nowMs?: number
106
- maxAgeMs?: number
107
- requireFrozenScene?: boolean
108
- requireRecipe?: boolean
109
- }
110
-
111
- export interface BindingSnapshotValidationResult {
112
- valid: boolean
113
- errors: string[]
114
- calculatedHash?: string
115
- calculatedBindingEpoch?: string
116
- }
117
-
118
- type AnyRecord = Record<string, unknown>
119
-
120
- function record(value: unknown): AnyRecord | null {
121
- return value && typeof value === 'object' ? value as AnyRecord : null
122
- }
123
-
124
- function text(value: unknown): string {
125
- return typeof value === 'string' ? value.trim() : value == null ? '' : String(value).trim()
126
- }
127
-
128
- function optionalText(value: unknown): string | undefined {
129
- const result = text(value)
130
- return result || undefined
131
- }
132
-
133
- function finite(value: unknown): value is number {
134
- return typeof value === 'number' && Number.isFinite(value)
135
- }
136
-
137
- function sameOptional(a: unknown, b: unknown): boolean {
138
- return optionalText(a) === optionalText(b)
139
- }
140
-
141
- function sceneOf(input: NodeBindingSnapshotInput): SceneContract | SceneWithDraftMetadata | undefined {
142
- return input.scene ?? input.sceneContract
143
- }
144
-
145
- function sceneIdOf(scene: unknown): string | undefined {
146
- return optionalText(record(scene)?.sceneId)
147
- }
148
-
149
- function sceneVersionOf(scene: unknown): string | undefined {
150
- return optionalText(record(scene)?.sceneVersion)
151
- }
152
-
153
- function sceneLineIdOf(scene: unknown): string | undefined {
154
- return optionalText(record(scene)?.lineId)
155
- }
156
-
157
- function sceneProductIdOf(scene: unknown): string | undefined {
158
- return optionalText(record(scene)?.productId)
159
- }
160
-
161
- function sceneRecipeIdOf(scene: unknown): string | undefined {
162
- return optionalText(record(scene)?.recipeId)
163
- }
164
-
165
- function recipeIdOf(recipe: unknown): string | undefined {
166
- const value = record(recipe)
167
- return optionalText(value?.id ?? value?.recipeId)
168
- }
169
-
170
- function recipeProductIdOf(recipe: unknown): string | undefined {
171
- return optionalText(record(recipe)?.productId)
172
- }
173
-
174
- function recipeLineIdOf(recipe: unknown): string | undefined {
175
- return optionalText(record(recipe)?.lineId)
176
- }
177
-
178
- function recipeVersionOf(recipe: unknown): string | number | undefined {
179
- const value = record(recipe)?.version ?? record(recipe)?.recipeVersion
180
- if (typeof value === 'string' && value.trim()) return value.trim()
181
- if (typeof value === 'number' && Number.isFinite(value)) return value
182
- return undefined
183
- }
184
-
185
- export function canonicalRecipeHash(recipe: unknown, explicitHash?: string): string | undefined {
186
- const supplied = optionalText(explicitHash)
187
- if (supplied) return supplied
188
- if (recipe == null) return undefined
189
- const value = record(recipe)
190
- return optionalText(value?.recipeHash ?? value?.hash) ?? sha256(recipe)
191
- }
192
-
193
- export const recipeHash = canonicalRecipeHash
194
-
195
- function isFrozenScene(scene: unknown): boolean {
196
- const value = record(scene)
197
- if (!value) return false
198
- return value.status === 'frozen' || sceneStatus(scene as SceneWithDraftMetadata) === 'frozen'
199
- }
200
-
201
- function nodeCatalogEntry(input: NodeBindingSnapshotInput, source: BindingSource): AnyRecord | undefined {
202
- const catalog = input.nodeCatalog ?? input.nodes
203
- if (!catalog) return undefined
204
- if (Array.isArray(catalog)) {
205
- return catalog.find(item => text(item.nodeId) === source.nodeId) as AnyRecord | undefined
206
- }
207
- return record((catalog as Record<string, Partial<BindingSource>>)[source.nodeId]) ?? undefined
208
- }
209
-
210
- function dataFile(name: string): string {
211
- return join(dataDirFor(), name)
212
- }
213
-
214
- function readJson(name: string): unknown {
215
- try {
216
- return JSON.parse(readFileSync(dataFile(name), 'utf8'))
217
- }
218
- catch {
219
- return undefined
220
- }
221
- }
222
-
223
- function channelAgents(channelId: string): Map<string, { channelId: string, role: string, enabled: boolean }> {
224
- return withWorkshopDbReadonly((db) => {
225
- const rows = db.prepare('SELECT id, channel_id AS channelId, role, enabled FROM channel_agents WHERE channel_id = ?').all(channelId) as Array<Record<string, unknown>>
226
- return new Map(rows.map(row => [
227
- text(row.id),
228
- { channelId: text(row.channelId), role: text(row.role) || 'worker', enabled: Number(row.enabled ?? 1) !== 0 },
229
- ]))
230
- }, () => new Map())
231
- }
232
-
233
- function liveBindingSources(input: NodeBindingSnapshotInput): BindingSource[] {
234
- const agents = channelAgents(input.channelId)
235
- if (!agents.size) throw new Error('BINDING_CHANNEL_UNRESOLVED')
236
- const rows = readJson('agent-node-bindings.json')
237
- const bindings = Array.isArray(rows) ? rows as Array<Record<string, unknown>> : []
238
- const selected = bindings
239
- .filter(row => input.agentId ? text(row.agentId) === input.agentId : agents.has(text(row.agentId)))
240
- .filter(row => agents.get(text(row.agentId))?.channelId === input.channelId)
241
- .filter(row => agents.get(text(row.agentId))?.enabled !== false)
242
- .map(row => ({
243
- id: text(row.id),
244
- channelId: input.channelId,
245
- agentId: text(row.agentId),
246
- agentRole: agents.get(text(row.agentId))?.role ?? input.agentRole,
247
- nodeId: text(row.nodeId),
248
- kind: text(row.kind) as BindingNodeKind,
249
- mode: text(row.mode) as BindingMode,
250
- createdAt: text(row.createdAt),
251
- }))
252
- if (input.agentId && !agents.has(input.agentId)) throw new Error('BINDING_AGENT_CHANNEL_MISMATCH')
253
- return selected
254
- }
255
-
256
- function nodeFromRepositories(source: BindingSource): AnyRecord | undefined {
257
- const rows = readJson(source.kind === 'daq' ? 'daqs.json' : 'dcws.json')
258
- if (!Array.isArray(rows)) return undefined
259
- return rows.find(row => text(record(row)?.id) === source.nodeId) as AnyRecord | undefined
260
- }
261
-
262
- function activeRunFor(lineId?: string): AnyRecord | undefined {
263
- if (!lineId) return undefined
264
- const rows = readJson('line-runs.json')
265
- if (!Array.isArray(rows)) return undefined
266
- return rows.find(row => text(record(row)?.lineId) === lineId) as AnyRecord | undefined
267
- }
268
-
269
- function resolveRecipe(input: NodeBindingSnapshotInput, recipeId?: string): unknown {
270
- if (input.recipe != null || !recipeId) return input.recipe
271
- const rows = readJson('dcw-recipes.json')
272
- if (!Array.isArray(rows)) return undefined
273
- return rows.find(row => recipeIdOf(row) === recipeId)
274
- }
275
-
276
- function channelPolicy(channelId: string): BindingControlPolicy | undefined {
277
- return withWorkshopDbReadonly((db) => {
278
- const row = db.prepare('SELECT control_policy AS controlPolicy FROM aml_channel_profiles WHERE channel_id = ?').get(channelId) as Record<string, unknown> | undefined
279
- const policy = text(row?.controlPolicy)
280
- return ['recommendation_only', 'hitl_governed', 'bounded_auto'].includes(policy) ? policy as BindingControlPolicy : undefined
281
- }, () => undefined)
282
- }
283
-
284
- function resolvedPolicy(input: NodeBindingSnapshotInput): BindingControlPolicy {
285
- if (input.controlPolicy) return input.controlPolicy
286
- return channelPolicy(input.channelId) ?? 'recommendation_only'
287
- }
288
-
289
- function samplePeriodOf(source: BindingSource, node: AnyRecord | undefined): number | undefined {
290
- // DCW is an actuator binding; its PLC read/hold interval is not a DAQ sampling period.
291
- if (source.kind === 'dcw' && source.samplePeriodMs == null && source.samplingPeriodMs == null) return undefined
292
- const supplied = source.samplePeriodMs ?? source.samplingPeriodMs
293
- if (supplied != null) return Number(supplied)
294
- const raw = node?.intervalMs ?? node?.samplingPeriodMs ?? node?.readIntervalMs ?? node?.holdIntervalMs
295
- return raw == null ? undefined : Number(raw)
296
- }
297
-
298
- function normalizedBinding(input: NodeBindingSnapshotInput, source: BindingSource, lineId: string, productId?: string, recipeId?: string): NodeBindingSnapshotBinding {
299
- if (source.kind !== 'daq' && source.kind !== 'dcw') throw new Error(`BINDING_KIND_INVALID:${source.nodeId}`)
300
- if (source.mode !== 'auto' && source.mode !== 'manual') throw new Error(`BINDING_MODE_INVALID:${source.nodeId}`)
301
- const node = nodeCatalogEntry(input, source) ?? nodeFromRepositories(source)
302
- const physicalMeaning = optionalText(source.physicalMeaning ?? source.semantics ?? node?.physicalMeaning ?? node?.semantics ?? node?.name)
303
- const unit = optionalText(source.unit ?? node?.unit)
304
- const min = source.min ?? (finite(node?.min) ? node.min : undefined)
305
- const max = source.max ?? (finite(node?.max) ? node.max : undefined)
306
- const sourceLineId = optionalText(source.lineId ?? node?.lineId) ?? lineId
307
- const sourceProductId = optionalText(source.productId ?? node?.productId) ?? productId
308
- const sourceRecipeId = optionalText(source.recipeId ?? node?.recipeId) ?? recipeId
309
- if (!source.agentId || !source.nodeId) throw new Error('BINDING_FIELD_REQUIRED')
310
- if (sourceLineId !== lineId) throw new Error(`BINDING_LINE_MISMATCH:${source.nodeId}`)
311
- if ((min != null && !finite(min)) || (max != null && !finite(max))) throw new Error(`BINDING_RANGE_INVALID:${source.nodeId}`)
312
- if (min != null && max != null && min > max) throw new Error(`BINDING_RANGE_ORDER:${source.nodeId}`)
313
- if (!physicalMeaning || !unit) throw new Error(`BINDING_SEMANTICS_REQUIRED:${source.nodeId}`)
314
- const samplePeriodMs = samplePeriodOf(source, node)
315
- if (samplePeriodMs != null && (!finite(samplePeriodMs) || samplePeriodMs <= 0)) throw new Error(`BINDING_SAMPLE_PERIOD_INVALID:${source.nodeId}`)
316
- const controlPolicy = source.controlPolicy ?? resolvedPolicy(input)
317
- if (!['recommendation_only', 'hitl_governed', 'bounded_auto'].includes(controlPolicy)) throw new Error(`BINDING_POLICY_INVALID:${source.nodeId}`)
318
- return {
319
- agentId: source.agentId,
320
- agentRole: optionalText(source.agentRole) ?? input.agentRole ?? 'worker',
321
- nodeId: source.nodeId,
322
- kind: source.kind,
323
- mode: source.mode,
324
- controlPolicy,
325
- lineId,
326
- physicalMeaning,
327
- unit,
328
- ...(min != null ? { min } : {}),
329
- ...(max != null ? { max } : {}),
330
- ...(samplePeriodMs != null ? { samplePeriodMs } : {}),
331
- ...(sourceProductId ? { productId: sourceProductId } : {}),
332
- ...(sourceRecipeId ? { recipeId: sourceRecipeId } : {}),
333
- }
334
- }
335
-
336
- function bindingSort(a: NodeBindingSnapshotBinding, b: NodeBindingSnapshotBinding): number {
337
- return `${a.agentId}\u0000${a.nodeId}\u0000${a.kind}`.localeCompare(`${b.agentId}\u0000${b.nodeId}\u0000${b.kind}`)
338
- }
339
-
340
- function epochPayload(snapshot: Pick<AuthoritativeNodeBindingSnapshot, 'schemaVersion' | 'channelId' | 'sceneId' | 'sceneVersion' | 'lineId' | 'productId' | 'recipeId' | 'recipeVersion' | 'recipeHash' | 'sceneContractHash' | 'bindings'>): unknown {
341
- return {
342
- schemaVersion: snapshot.schemaVersion,
343
- channelId: snapshot.channelId,
344
- sceneId: snapshot.sceneId,
345
- sceneVersion: snapshot.sceneVersion,
346
- lineId: snapshot.lineId,
347
- productId: snapshot.productId,
348
- recipeId: snapshot.recipeId,
349
- recipeVersion: snapshot.recipeVersion,
350
- recipeHash: snapshot.recipeHash,
351
- sceneContractHash: snapshot.sceneContractHash,
352
- bindings: snapshot.bindings.slice().sort(bindingSort),
353
- }
354
- }
355
-
356
- type HashableBindingSnapshot = Omit<AuthoritativeNodeBindingSnapshot, 'snapshotHash'> & { snapshotHash?: string } | ContractNodeBindingSnapshot
357
-
358
- function canonicalBindingSnapshotPayload(snapshot: HashableBindingSnapshot): AnyRecord {
359
- const { snapshotHash: _snapshotHash, createdAt: _createdAt, createdBy: _createdBy, snapshotId: _snapshotId, ...payload } = snapshot as AuthoritativeNodeBindingSnapshot
360
- return { ...payload, bindings: payload.bindings.slice().sort(bindingSort) }
361
- }
362
-
363
- export function computeBindingEpoch(snapshot: Pick<AuthoritativeNodeBindingSnapshot, 'schemaVersion' | 'channelId' | 'sceneId' | 'sceneVersion' | 'lineId' | 'productId' | 'recipeId' | 'recipeVersion' | 'recipeHash' | 'sceneContractHash' | 'bindings'>): string {
364
- return sha256(epochPayload(snapshot))
365
- }
366
-
367
- export const bindingEpochHash = computeBindingEpoch
368
-
369
- export function hashNodeBindingSnapshot(snapshot: Omit<AuthoritativeNodeBindingSnapshot, 'snapshotHash'> & { snapshotHash?: string } | ContractNodeBindingSnapshot): string {
370
- return sha256(canonicalBindingSnapshotPayload(snapshot))
371
- }
372
-
373
- export const canonicalBindingSnapshotHash = hashNodeBindingSnapshot
374
-
375
- export function createNodeBindingSnapshot(input: NodeBindingSnapshotInput): AuthoritativeNodeBindingSnapshot {
376
- const channelId = text(input.channelId)
377
- const createdBy = text(input.createdBy)
378
- if (!channelId) throw new Error('BINDING_CHANNEL_REQUIRED')
379
- if (!createdBy) throw new Error('BINDING_CREATED_BY_REQUIRED')
380
- const scene = sceneOf(input)
381
- const sceneId = text(input.sceneId ?? sceneIdOf(scene))
382
- const sceneVersion = text(input.sceneVersion ?? sceneVersionOf(scene))
383
- const lineId = text(input.lineId ?? sceneLineIdOf(scene) ?? recipeLineIdOf(input.recipe))
384
- const explicitRecipeId = optionalText(input.recipeId ?? sceneRecipeIdOf(scene) ?? recipeIdOf(input.recipe))
385
- const explicitProductId = optionalText(input.productId ?? sceneProductIdOf(scene) ?? recipeProductIdOf(input.recipe))
386
- const activeRun = activeRunFor(lineId)
387
- const activeRecipeId = optionalText(activeRun?.recipeId)
388
- const activeProductId = optionalText(activeRun?.productId)
389
- const recipeId = explicitRecipeId ?? activeRecipeId
390
- const productId = explicitProductId ?? activeProductId
391
- const recipe = resolveRecipe(input, recipeId)
392
- const recipeVersion = input.recipeVersion ?? recipeVersionOf(recipe)
393
- const recipeHashValue = canonicalRecipeHash(recipe, input.recipeHash)
394
- if (!sceneId || !sceneVersion) throw new Error('BINDING_SCENE_REQUIRED')
395
- if (!lineId) throw new Error('BINDING_LINE_REQUIRED')
396
- if (input.requireFrozenScene && !isFrozenScene(scene)) throw new Error('BINDING_SCENE_NOT_FROZEN')
397
- if (sceneLineIdOf(scene) && sceneLineIdOf(scene) !== lineId) throw new Error('BINDING_SCENE_LINE_MISMATCH')
398
- if (sceneProductIdOf(scene) && sceneProductIdOf(scene) !== productId) throw new Error('BINDING_SCENE_PRODUCT_MISMATCH')
399
- if (sceneRecipeIdOf(scene) && sceneRecipeIdOf(scene) !== recipeId) throw new Error('BINDING_SCENE_RECIPE_MISMATCH')
400
- if (activeRecipeId && recipeId && activeRecipeId !== recipeId) throw new Error('BINDING_RECIPE_MISMATCH')
401
- if (activeProductId && productId && activeProductId !== productId) throw new Error('BINDING_PRODUCT_MISMATCH')
402
- const sources = input.bindings ?? input.currentBindings ?? input.agentBindings ?? input.bindingRecords ?? liveBindingSources(input)
403
- const bindings = sources.map(source => normalizedBinding(input, source, lineId, productId, recipeId)).sort(bindingSort)
404
- if (!bindings.length) throw new Error('BINDING_SNAPSHOT_EMPTY')
405
- const seen = new Set<string>()
406
- for (const binding of bindings) {
407
- const key = `${binding.agentId}\u0000${binding.nodeId}\u0000${binding.kind}`
408
- if (seen.has(key)) throw new Error(`BINDING_DUPLICATE:${binding.nodeId}`)
409
- seen.add(key)
410
- if (productId && binding.productId && binding.productId !== productId) throw new Error(`BINDING_PRODUCT_MISMATCH:${binding.nodeId}`)
411
- if (recipeId && binding.recipeId && binding.recipeId !== recipeId) throw new Error(`BINDING_RECIPE_MISMATCH:${binding.nodeId}`)
412
- }
413
- const sceneHash = scene ? sceneContractHash(scene) : undefined
414
- const base = {
415
- schemaVersion: 1,
416
- createdAt: new Date(input.nowMs ?? Date.now()).toISOString(),
417
- createdBy,
418
- snapshotId: input.snapshotId ?? createId('binding'),
419
- channelId,
420
- sceneId,
421
- sceneVersion,
422
- lineId,
423
- ...(productId ? { productId } : {}),
424
- ...(recipeId ? { recipeId } : {}),
425
- ...(recipeVersion != null ? { recipeVersion } : {}),
426
- ...(recipeHashValue ? { recipeHash: recipeHashValue } : {}),
427
- ...(sceneHash ? { sceneContractHash: sceneHash } : {}),
428
- bindings,
429
- } satisfies Omit<AuthoritativeNodeBindingSnapshot, 'snapshotHash' | 'bindingEpoch'>
430
- const bindingEpoch = computeBindingEpoch(base)
431
- if (input.expectedBindingEpoch && input.expectedBindingEpoch !== bindingEpoch) throw new Error('BINDING_EPOCH_MISMATCH')
432
- const snapshot = { ...base, bindingEpoch, snapshotHash: hashNodeBindingSnapshot({ ...base, bindingEpoch }) }
433
- const verified = validateNodeBindingSnapshot(snapshot, {
434
- scene,
435
- frozenScene: input.requireFrozenScene ? scene : undefined,
436
- expectedChannelId: channelId,
437
- expectedSceneId: sceneId,
438
- expectedSceneVersion: sceneVersion,
439
- expectedLineId: lineId,
440
- productId,
441
- recipeId,
442
- recipeVersion,
443
- recipe,
444
- recipeHash: recipeHashValue,
445
- requireFrozenScene: Boolean(input.requireFrozenScene),
446
- requireRecipe: Boolean(recipeId || recipeHashValue),
447
- })
448
- if (!verified.valid) throw new Error(verified.errors[0] ?? 'BINDING_SNAPSHOT_INVALID')
449
- return snapshot
450
- }
451
-
452
- export const buildNodeBindingSnapshot = createNodeBindingSnapshot
453
- export const buildBindingSnapshot = createNodeBindingSnapshot
454
- export const createBindingSnapshot = createNodeBindingSnapshot
455
-
456
- function validateBindingShape(snapshot: AnyRecord, errors: string[]): snapshot is AnyRecord & { bindings: unknown[] } {
457
- for (const key of ['createdAt', 'createdBy', 'snapshotId', 'channelId', 'bindingEpoch', 'sceneId', 'sceneVersion', 'lineId', 'snapshotHash']) {
458
- if (!text(snapshot[key])) errors.push(`BINDING_${key.toUpperCase()}_REQUIRED`)
459
- }
460
- if (!Number.isInteger(snapshot.schemaVersion) || Number(snapshot.schemaVersion) <= 0) errors.push('BINDING_SCHEMA_INVALID')
461
- if (!Number.isFinite(Date.parse(text(snapshot.createdAt)))) errors.push('BINDING_CREATED_AT_INVALID')
462
- if (!Array.isArray(snapshot.bindings) || snapshot.bindings.length === 0) {
463
- errors.push('BINDING_SNAPSHOT_EMPTY')
464
- return false
465
- }
466
- return true
467
- }
468
-
469
- function validateSceneBinding(snapshot: AnyRecord, scene: SceneContract | SceneWithDraftMetadata, errors: string[]): void {
470
- if (snapshot.sceneId !== scene.sceneId) errors.push('BINDING_SCENE_MISMATCH')
471
- if (snapshot.sceneVersion !== scene.sceneVersion) errors.push('BINDING_SCENE_VERSION_MISMATCH')
472
- if (snapshot.lineId !== scene.lineId) errors.push('BINDING_LINE_MISMATCH')
473
- if (!sameOptional(snapshot.productId, scene.productId)) errors.push('BINDING_PRODUCT_MISMATCH')
474
- if (!sameOptional(snapshot.recipeId, scene.recipeId)) errors.push('BINDING_RECIPE_MISMATCH')
475
- const actualHash = sceneContractHash(scene)
476
- if (snapshot.sceneContractHash !== actualHash) errors.push('BINDING_SCENE_HASH_MISMATCH')
477
- const variables = [
478
- ...(scene.controls ?? []),
479
- ...(scene.states ?? []),
480
- ...(scene.disturbances ?? []),
481
- ...(scene.observations ?? []),
482
- ...(scene.guards ?? []),
483
- ]
484
- const bindings = snapshot.bindings as Array<AnyRecord>
485
- for (const variable of variables) {
486
- const nodeId = optionalText(variable.nodeId)
487
- if (!nodeId) continue
488
- const expectedKind: BindingNodeKind = variable.role === 'control' ? 'dcw' : 'daq'
489
- const candidates = bindings.filter(binding => binding.nodeId === nodeId)
490
- if (!candidates.length) {
491
- errors.push(`BINDING_SCENE_NODE_MISSING:${nodeId}`)
492
- continue
493
- }
494
- const match = candidates.find(binding => binding.kind === expectedKind)
495
- if (!match) {
496
- errors.push(`BINDING_NODE_KIND_MISMATCH:${nodeId}`)
497
- continue
498
- }
499
- if (match.unit !== variable.unit) errors.push(`BINDING_UNIT_MISMATCH:${nodeId}`)
500
- // Descriptions may be enriched/normalized by the node catalog; nodeId, role, unit, and range are authoritative.
501
- // Keep physicalMeaning in the snapshot for audit, but do not reject a same-node description rewrite.
502
- if (variable.min != null && match.min !== variable.min) errors.push(`BINDING_MIN_MISMATCH:${nodeId}`)
503
- if (variable.max != null && match.max !== variable.max) errors.push(`BINDING_MAX_MISMATCH:${nodeId}`)
504
- }
505
- }
506
-
507
- function validateRecipeBinding(snapshot: AnyRecord, options: NodeBindingSnapshotVerifyOptions, errors: string[]): void {
508
- const recipeId = optionalText(options.recipeId ?? recipeIdOf(options.recipe))
509
- const productId = optionalText(options.productId ?? recipeProductIdOf(options.recipe))
510
- const lineId = optionalText(options.expectedLineId ?? recipeLineIdOf(options.recipe))
511
- const recipeVersion = options.recipeVersion ?? recipeVersionOf(options.recipe)
512
- const recipeHashValue = canonicalRecipeHash(options.recipe, options.recipeHash)
513
- if (options.requireRecipe && !recipeId) errors.push('BINDING_RECIPE_REQUIRED')
514
- if (recipeId && snapshot.recipeId !== recipeId) errors.push('BINDING_RECIPE_MISMATCH')
515
- if (productId && snapshot.productId !== productId) errors.push('BINDING_PRODUCT_MISMATCH')
516
- if (lineId && snapshot.lineId !== lineId) errors.push('BINDING_LINE_MISMATCH')
517
- if (recipeVersion != null && snapshot.recipeVersion !== recipeVersion) errors.push('BINDING_RECIPE_VERSION_MISMATCH')
518
- if (recipeHashValue && snapshot.recipeHash !== recipeHashValue) errors.push('BINDING_RECIPE_HASH_MISMATCH')
519
- if (recipeHashValue && !snapshot.recipeHash) errors.push('BINDING_RECIPE_HASH_MISSING')
520
- }
521
-
522
- export function validateNodeBindingSnapshot(input: unknown, options: NodeBindingSnapshotVerifyOptions = {}): BindingSnapshotValidationResult {
523
- const snapshot = record(input)
524
- if (!snapshot) return { valid: false, errors: ['BINDING_SNAPSHOT_REQUIRED'] }
525
- const errors: string[] = []
526
- if (!validateBindingShape(snapshot, errors)) return { valid: false, errors }
527
- const bindings = snapshot.bindings as Array<AnyRecord>
528
- const seen = new Set<string>()
529
- for (const binding of bindings) {
530
- const kind = text(binding.kind)
531
- const mode = text(binding.mode)
532
- const policy = text(binding.controlPolicy)
533
- for (const key of ['agentId', 'agentRole', 'nodeId', 'lineId', 'physicalMeaning', 'unit']) {
534
- if (!text(binding[key])) errors.push(`BINDING_ENTRY_${key.toUpperCase()}_REQUIRED`)
535
- }
536
- if (kind !== 'daq' && kind !== 'dcw') errors.push(`BINDING_KIND_INVALID:${binding.nodeId ?? ''}`)
537
- if (mode !== 'auto' && mode !== 'manual') errors.push(`BINDING_MODE_INVALID:${binding.nodeId ?? ''}`)
538
- if (!['recommendation_only', 'hitl_governed', 'bounded_auto'].includes(policy)) errors.push(`BINDING_POLICY_INVALID:${binding.nodeId ?? ''}`)
539
- if ((binding.min != null && !finite(binding.min)) || (binding.max != null && !finite(binding.max))) errors.push(`BINDING_RANGE_INVALID:${binding.nodeId ?? ''}`)
540
- if (binding.min != null && binding.max != null && Number(binding.min) > Number(binding.max)) errors.push(`BINDING_RANGE_ORDER:${binding.nodeId ?? ''}`)
541
- if (binding.samplePeriodMs != null && (!finite(binding.samplePeriodMs) || Number(binding.samplePeriodMs) <= 0)) errors.push(`BINDING_SAMPLE_PERIOD_INVALID:${binding.nodeId ?? ''}`)
542
- const key = `${text(binding.agentId)}\u0000${text(binding.nodeId)}\u0000${kind}`
543
- if (seen.has(key)) errors.push(`BINDING_DUPLICATE:${binding.nodeId ?? ''}`)
544
- seen.add(key)
545
- if (binding.lineId !== snapshot.lineId) errors.push(`BINDING_LINE_MISMATCH:${binding.nodeId ?? ''}`)
546
- if (snapshot.productId && binding.productId && binding.productId !== snapshot.productId) errors.push(`BINDING_PRODUCT_MISMATCH:${binding.nodeId ?? ''}`)
547
- if (snapshot.recipeId && binding.recipeId && binding.recipeId !== snapshot.recipeId) errors.push(`BINDING_RECIPE_MISMATCH:${binding.nodeId ?? ''}`)
548
- }
549
- let calculatedHash: string | undefined
550
- let calculatedBindingEpoch: string | undefined
551
- try {
552
- calculatedHash = hashNodeBindingSnapshot(snapshot as unknown as AuthoritativeNodeBindingSnapshot)
553
- calculatedBindingEpoch = computeBindingEpoch(snapshot as unknown as AuthoritativeNodeBindingSnapshot)
554
- if (snapshot.snapshotHash !== calculatedHash) errors.push('BINDING_SNAPSHOT_HASH_MISMATCH')
555
- if (snapshot.bindingEpoch !== calculatedBindingEpoch) errors.push('BINDING_EPOCH_MISMATCH')
556
- }
557
- catch {
558
- errors.push('BINDING_SNAPSHOT_HASH_INVALID')
559
- }
560
- const scene = options.frozenScene ?? options.scene
561
- if (options.requireFrozenScene && !scene) errors.push('BINDING_SCENE_REQUIRED')
562
- if (options.requireFrozenScene && scene && !isFrozenScene(scene)) errors.push('BINDING_SCENE_NOT_FROZEN')
563
- if (scene) validateSceneBinding(snapshot, scene, errors)
564
- if (options.expectedChannelId && snapshot.channelId !== options.expectedChannelId) errors.push('BINDING_CHANNEL_MISMATCH')
565
- if (options.expectedSceneId && snapshot.sceneId !== options.expectedSceneId) errors.push('BINDING_SCENE_MISMATCH')
566
- if (options.expectedSceneVersion && snapshot.sceneVersion !== options.expectedSceneVersion) errors.push('BINDING_SCENE_VERSION_MISMATCH')
567
- if (options.expectedLineId && snapshot.lineId !== options.expectedLineId) errors.push('BINDING_LINE_MISMATCH')
568
- validateRecipeBinding(snapshot, options, errors)
569
- const expectedHash = options.expectedSnapshotHash ?? options.expectedBindingSnapshotHash
570
- if (expectedHash && snapshot.snapshotHash !== expectedHash) errors.push('BINDING_SNAPSHOT_HASH_MISMATCH')
571
- const expectedEpoch = options.currentBindingEpoch ?? options.expectedBindingEpoch
572
- if (expectedEpoch && snapshot.bindingEpoch !== expectedEpoch) errors.push('BINDING_EPOCH_MISMATCH')
573
- if (options.currentSnapshot != null) {
574
- const current = record(options.currentSnapshot)
575
- if (!current) errors.push('BINDING_CURRENT_SNAPSHOT_INVALID')
576
- else if (text(current.bindingEpoch) !== text(snapshot.bindingEpoch)) errors.push('BINDING_EPOCH_MISMATCH')
577
- }
578
- if (options.maxAgeMs != null) {
579
- const nowMs = options.nowMs ?? Date.now()
580
- const age = nowMs - Date.parse(text(snapshot.createdAt))
581
- if (age < 0) errors.push('BINDING_SNAPSHOT_FUTURE')
582
- else if (age > options.maxAgeMs) errors.push('BINDING_SNAPSHOT_EXPIRED')
583
- }
584
- return { valid: errors.length === 0, errors, calculatedHash, calculatedBindingEpoch }
585
- }
586
-
587
- function verifyOptions(options: NodeBindingSnapshotVerifyOptions | string | undefined): NodeBindingSnapshotVerifyOptions {
588
- return typeof options === 'string' ? { expectedSnapshotHash: options } : options ?? {}
589
- }
590
-
591
- export function verifyNodeBindingSnapshot(snapshot: unknown, options?: NodeBindingSnapshotVerifyOptions | string): boolean {
592
- return validateNodeBindingSnapshot(snapshot, verifyOptions(options)).valid
593
- }
594
-
595
- export function assertNodeBindingSnapshot(snapshot: unknown, options?: NodeBindingSnapshotVerifyOptions | string): asserts snapshot is AuthoritativeNodeBindingSnapshot {
596
- const result = validateNodeBindingSnapshot(snapshot, verifyOptions(options))
597
- if (!result.valid) throw new Error(result.errors[0] ?? 'BINDING_SNAPSHOT_INVALID')
598
- }
599
-
600
- export const validateBindingSnapshot = validateNodeBindingSnapshot
601
- export const verifyBindingSnapshot = verifyNodeBindingSnapshot
602
- export const assertBindingSnapshot = assertNodeBindingSnapshot
603
- export const bindingSnapshotHash = hashNodeBindingSnapshot
1
+ import { readFileSync } from 'node:fs'
2
+ import { join } from 'node:path'
3
+ import { createId, sha256, type NodeBindingSnapshot as ContractNodeBindingSnapshot, type SceneContract } from './contracts'
4
+ import { sceneContractHash, sceneStatus, type SceneWithDraftMetadata } from './scene-lifecycle'
5
+ import { dataDirFor } from '@/shared/config/home.mjs'
6
+ import { withWorkshopDbReadonly } from '../../db/readonly'
7
+
8
+ export type BindingControlPolicy = 'recommendation_only' | 'hitl_governed' | 'bounded_auto'
9
+ export type BindingNodeKind = 'daq' | 'dcw'
10
+ export type BindingMode = 'auto' | 'manual'
11
+
12
+ export type NodeBindingSnapshotBinding = ContractNodeBindingSnapshot['bindings'][number] & {
13
+ productId?: string
14
+ recipeId?: string
15
+ }
16
+
17
+ /**
18
+ * The legacy contract in contracts.ts remains readable by existing callers.
19
+ * This local authority type carries the immutable lineage needed by P0.
20
+ */
21
+ export interface AuthoritativeNodeBindingSnapshot extends Omit<ContractNodeBindingSnapshot, 'bindings'> {
22
+ lineId: string
23
+ productId?: string
24
+ recipeId?: string
25
+ recipeVersion?: string | number
26
+ recipeHash?: string
27
+ sceneContractHash?: string
28
+ bindings: NodeBindingSnapshotBinding[]
29
+ }
30
+
31
+ export type NodeBindingSnapshot = AuthoritativeNodeBindingSnapshot
32
+ export type BindingSnapshot = AuthoritativeNodeBindingSnapshot
33
+
34
+ export interface BindingSource {
35
+ id?: string
36
+ channelId?: string
37
+ agentId: string
38
+ agentRole?: string
39
+ nodeId: string
40
+ kind: BindingNodeKind
41
+ mode: BindingMode
42
+ controlPolicy?: BindingControlPolicy
43
+ lineId?: string
44
+ productId?: string
45
+ recipeId?: string
46
+ physicalMeaning?: string
47
+ unit?: string
48
+ min?: number
49
+ max?: number
50
+ samplePeriodMs?: number
51
+ createdAt?: string
52
+ name?: string
53
+ semantics?: string
54
+ intervalMs?: number | null
55
+ samplingPeriodMs?: number | null
56
+ readIntervalMs?: number | null
57
+ holdIntervalMs?: number | null
58
+ }
59
+
60
+ export interface NodeBindingSnapshotInput {
61
+ channelId: string
62
+ createdBy: string
63
+ scene?: SceneContract | SceneWithDraftMetadata
64
+ sceneContract?: SceneContract | SceneWithDraftMetadata
65
+ sceneId?: string
66
+ sceneVersion?: string
67
+ agentId?: string
68
+ agentRole?: string
69
+ lineId?: string
70
+ productId?: string
71
+ recipeId?: string
72
+ recipeVersion?: string | number
73
+ recipe?: unknown
74
+ recipeHash?: string
75
+ controlPolicy?: BindingControlPolicy
76
+ bindings?: readonly BindingSource[]
77
+ currentBindings?: readonly BindingSource[]
78
+ agentBindings?: readonly BindingSource[]
79
+ bindingRecords?: readonly BindingSource[]
80
+ nodeCatalog?: Record<string, Partial<BindingSource>> | readonly Partial<BindingSource>[]
81
+ nodes?: Record<string, Partial<BindingSource>> | readonly Partial<BindingSource>[]
82
+ snapshotId?: string
83
+ nowMs?: number
84
+ expectedBindingEpoch?: string
85
+ requireFrozenScene?: boolean
86
+ }
87
+
88
+ export interface NodeBindingSnapshotVerifyOptions {
89
+ scene?: SceneContract | SceneWithDraftMetadata
90
+ frozenScene?: SceneContract | SceneWithDraftMetadata
91
+ expectedChannelId?: string
92
+ expectedSceneId?: string
93
+ expectedSceneVersion?: string
94
+ expectedLineId?: string
95
+ productId?: string
96
+ recipeId?: string
97
+ recipeVersion?: string | number
98
+ recipe?: unknown
99
+ recipeHash?: string
100
+ expectedSnapshotHash?: string
101
+ expectedBindingSnapshotHash?: string
102
+ currentBindingEpoch?: string
103
+ expectedBindingEpoch?: string
104
+ currentSnapshot?: unknown
105
+ nowMs?: number
106
+ maxAgeMs?: number
107
+ requireFrozenScene?: boolean
108
+ requireRecipe?: boolean
109
+ }
110
+
111
+ export interface BindingSnapshotValidationResult {
112
+ valid: boolean
113
+ errors: string[]
114
+ calculatedHash?: string
115
+ calculatedBindingEpoch?: string
116
+ }
117
+
118
+ type AnyRecord = Record<string, unknown>
119
+
120
+ function record(value: unknown): AnyRecord | null {
121
+ return value && typeof value === 'object' ? value as AnyRecord : null
122
+ }
123
+
124
+ function text(value: unknown): string {
125
+ return typeof value === 'string' ? value.trim() : value == null ? '' : String(value).trim()
126
+ }
127
+
128
+ function optionalText(value: unknown): string | undefined {
129
+ const result = text(value)
130
+ return result || undefined
131
+ }
132
+
133
+ function finite(value: unknown): value is number {
134
+ return typeof value === 'number' && Number.isFinite(value)
135
+ }
136
+
137
+ function sameOptional(a: unknown, b: unknown): boolean {
138
+ return optionalText(a) === optionalText(b)
139
+ }
140
+
141
+ function sceneOf(input: NodeBindingSnapshotInput): SceneContract | SceneWithDraftMetadata | undefined {
142
+ return input.scene ?? input.sceneContract
143
+ }
144
+
145
+ function sceneIdOf(scene: unknown): string | undefined {
146
+ return optionalText(record(scene)?.sceneId)
147
+ }
148
+
149
+ function sceneVersionOf(scene: unknown): string | undefined {
150
+ return optionalText(record(scene)?.sceneVersion)
151
+ }
152
+
153
+ function sceneLineIdOf(scene: unknown): string | undefined {
154
+ return optionalText(record(scene)?.lineId)
155
+ }
156
+
157
+ function sceneProductIdOf(scene: unknown): string | undefined {
158
+ return optionalText(record(scene)?.productId)
159
+ }
160
+
161
+ function sceneRecipeIdOf(scene: unknown): string | undefined {
162
+ return optionalText(record(scene)?.recipeId)
163
+ }
164
+
165
+ function recipeIdOf(recipe: unknown): string | undefined {
166
+ const value = record(recipe)
167
+ return optionalText(value?.id ?? value?.recipeId)
168
+ }
169
+
170
+ function recipeProductIdOf(recipe: unknown): string | undefined {
171
+ return optionalText(record(recipe)?.productId)
172
+ }
173
+
174
+ function recipeLineIdOf(recipe: unknown): string | undefined {
175
+ return optionalText(record(recipe)?.lineId)
176
+ }
177
+
178
+ function recipeVersionOf(recipe: unknown): string | number | undefined {
179
+ const value = record(recipe)?.version ?? record(recipe)?.recipeVersion
180
+ if (typeof value === 'string' && value.trim()) return value.trim()
181
+ if (typeof value === 'number' && Number.isFinite(value)) return value
182
+ return undefined
183
+ }
184
+
185
+ export function canonicalRecipeHash(recipe: unknown, explicitHash?: string): string | undefined {
186
+ const supplied = optionalText(explicitHash)
187
+ if (supplied) return supplied
188
+ if (recipe == null) return undefined
189
+ const value = record(recipe)
190
+ return optionalText(value?.recipeHash ?? value?.hash) ?? sha256(recipe)
191
+ }
192
+
193
+ export const recipeHash = canonicalRecipeHash
194
+
195
+ function isFrozenScene(scene: unknown): boolean {
196
+ const value = record(scene)
197
+ if (!value) return false
198
+ return value.status === 'frozen' || sceneStatus(scene as SceneWithDraftMetadata) === 'frozen'
199
+ }
200
+
201
+ function nodeCatalogEntry(input: NodeBindingSnapshotInput, source: BindingSource): AnyRecord | undefined {
202
+ const catalog = input.nodeCatalog ?? input.nodes
203
+ if (!catalog) return undefined
204
+ if (Array.isArray(catalog)) {
205
+ return catalog.find(item => text(item.nodeId) === source.nodeId) as AnyRecord | undefined
206
+ }
207
+ return record((catalog as Record<string, Partial<BindingSource>>)[source.nodeId]) ?? undefined
208
+ }
209
+
210
+ function dataFile(name: string): string {
211
+ return join(dataDirFor(), name)
212
+ }
213
+
214
+ function readJson(name: string): unknown {
215
+ try {
216
+ return JSON.parse(readFileSync(dataFile(name), 'utf8'))
217
+ }
218
+ catch {
219
+ return undefined
220
+ }
221
+ }
222
+
223
+ function channelAgents(channelId: string): Map<string, { channelId: string, role: string, enabled: boolean }> {
224
+ return withWorkshopDbReadonly((db) => {
225
+ const rows = db.prepare('SELECT id, channel_id AS channelId, role, enabled FROM channel_agents WHERE channel_id = ?').all(channelId) as Array<Record<string, unknown>>
226
+ return new Map(rows.map(row => [
227
+ text(row.id),
228
+ { channelId: text(row.channelId), role: text(row.role) || 'worker', enabled: Number(row.enabled ?? 1) !== 0 },
229
+ ]))
230
+ }, () => new Map())
231
+ }
232
+
233
+ function liveBindingSources(input: NodeBindingSnapshotInput): BindingSource[] {
234
+ const agents = channelAgents(input.channelId)
235
+ if (!agents.size) throw new Error('BINDING_CHANNEL_UNRESOLVED')
236
+ const rows = readJson('agent-node-bindings.json')
237
+ const bindings = Array.isArray(rows) ? rows as Array<Record<string, unknown>> : []
238
+ const recipes = readJson('dcw-recipes.json')
239
+ const recipeRows = Array.isArray(recipes) ? recipes as Array<Record<string, unknown>> : []
240
+ const selected: BindingSource[] = []
241
+ const seen = new Set<string>()
242
+ for (const row of bindings) {
243
+ if (input.agentId ? text(row.agentId) !== input.agentId : !agents.has(text(row.agentId))) continue
244
+ if (agents.get(text(row.agentId))?.channelId !== input.channelId) continue
245
+ if (agents.get(text(row.agentId))?.enabled === false) continue
246
+ const kind = text(row.kind)
247
+ // 权限模型 v2 配方展开(2026-10-05 闭环修复):kind='recipe' 的绑定行按配方参数
248
+ // 展开为 dcw 项(mode 继承绑定行)—— 否则 hybrid 频道的绑定快照在此抛
249
+ // BINDING_KIND_INVALID,寻优闭环断在快照步。原始 recipe 行不再进入 selected。
250
+ if (kind === 'recipe') {
251
+ const recipeId = text(row.nodeId)
252
+ const recipe = recipeRows.find(r => text(record(r)?.id) === recipeId)
253
+ const params = Array.isArray(record(recipe)?.params) ? record(recipe)?.params as Array<Record<string, unknown>> : []
254
+ for (const param of params) {
255
+ const nodeId = text(param.nodeId)
256
+ if (!nodeId || seen.has(nodeId)) continue
257
+ seen.add(nodeId)
258
+ selected.push({
259
+ id: `${text(row.id)}:${nodeId}`,
260
+ channelId: input.channelId,
261
+ agentId: text(row.agentId),
262
+ agentRole: agents.get(text(row.agentId))?.role ?? input.agentRole,
263
+ nodeId,
264
+ kind: 'dcw',
265
+ mode: text(row.mode) as BindingMode,
266
+ createdAt: text(row.createdAt),
267
+ min: finite(param.min) ? Number(param.min) : undefined,
268
+ max: finite(param.max) ? Number(param.max) : undefined,
269
+ })
270
+ }
271
+ continue
272
+ }
273
+ if (seen.has(text(row.nodeId))) continue
274
+ seen.add(text(row.nodeId))
275
+ selected.push({
276
+ id: text(row.id),
277
+ channelId: input.channelId,
278
+ agentId: text(row.agentId),
279
+ agentRole: agents.get(text(row.agentId))?.role ?? input.agentRole,
280
+ nodeId: text(row.nodeId),
281
+ kind: kind as BindingNodeKind,
282
+ mode: text(row.mode) as BindingMode,
283
+ createdAt: text(row.createdAt),
284
+ })
285
+ }
286
+ if (input.agentId && !agents.has(input.agentId)) throw new Error('BINDING_AGENT_CHANNEL_MISMATCH')
287
+ return selected
288
+ }
289
+
290
+ function nodeFromRepositories(source: BindingSource): AnyRecord | undefined {
291
+ const rows = readJson(source.kind === 'daq' ? 'daqs.json' : 'dcws.json')
292
+ if (!Array.isArray(rows)) return undefined
293
+ return rows.find(row => text(record(row)?.id) === source.nodeId) as AnyRecord | undefined
294
+ }
295
+
296
+ function activeRunFor(lineId?: string): AnyRecord | undefined {
297
+ if (!lineId) return undefined
298
+ const rows = readJson('line-runs.json')
299
+ if (!Array.isArray(rows)) return undefined
300
+ return rows.find(row => text(record(row)?.lineId) === lineId) as AnyRecord | undefined
301
+ }
302
+
303
+ function resolveRecipe(input: NodeBindingSnapshotInput, recipeId?: string): unknown {
304
+ if (input.recipe != null || !recipeId) return input.recipe
305
+ const rows = readJson('dcw-recipes.json')
306
+ if (!Array.isArray(rows)) return undefined
307
+ return rows.find(row => recipeIdOf(row) === recipeId)
308
+ }
309
+
310
+ function channelPolicy(channelId: string): BindingControlPolicy | undefined {
311
+ return withWorkshopDbReadonly((db) => {
312
+ const row = db.prepare('SELECT control_policy AS controlPolicy FROM aml_channel_profiles WHERE channel_id = ?').get(channelId) as Record<string, unknown> | undefined
313
+ const policy = text(row?.controlPolicy)
314
+ return ['recommendation_only', 'hitl_governed', 'bounded_auto'].includes(policy) ? policy as BindingControlPolicy : undefined
315
+ }, () => undefined)
316
+ }
317
+
318
+ function resolvedPolicy(input: NodeBindingSnapshotInput): BindingControlPolicy {
319
+ if (input.controlPolicy) return input.controlPolicy
320
+ return channelPolicy(input.channelId) ?? 'recommendation_only'
321
+ }
322
+
323
+ function samplePeriodOf(source: BindingSource, node: AnyRecord | undefined): number | undefined {
324
+ // DCW is an actuator binding; its PLC read/hold interval is not a DAQ sampling period.
325
+ if (source.kind === 'dcw' && source.samplePeriodMs == null && source.samplingPeriodMs == null) return undefined
326
+ const supplied = source.samplePeriodMs ?? source.samplingPeriodMs
327
+ if (supplied != null) return Number(supplied)
328
+ const raw = node?.intervalMs ?? node?.samplingPeriodMs ?? node?.readIntervalMs ?? node?.holdIntervalMs
329
+ return raw == null ? undefined : Number(raw)
330
+ }
331
+
332
+ function normalizedBinding(input: NodeBindingSnapshotInput, source: BindingSource, lineId: string, productId?: string, recipeId?: string): NodeBindingSnapshotBinding {
333
+ if (source.kind !== 'daq' && source.kind !== 'dcw') throw new Error(`BINDING_KIND_INVALID:${source.nodeId}`)
334
+ if (source.mode !== 'auto' && source.mode !== 'manual') throw new Error(`BINDING_MODE_INVALID:${source.nodeId}`)
335
+ const node = nodeCatalogEntry(input, source) ?? nodeFromRepositories(source)
336
+ const physicalMeaning = optionalText(source.physicalMeaning ?? source.semantics ?? node?.physicalMeaning ?? node?.semantics ?? node?.name)
337
+ const unit = optionalText(source.unit ?? node?.unit)
338
+ const min = source.min ?? (finite(node?.min) ? node.min : undefined)
339
+ const max = source.max ?? (finite(node?.max) ? node.max : undefined)
340
+ const sourceLineId = optionalText(source.lineId ?? node?.lineId) ?? lineId
341
+ const sourceProductId = optionalText(source.productId ?? node?.productId) ?? productId
342
+ const sourceRecipeId = optionalText(source.recipeId ?? node?.recipeId) ?? recipeId
343
+ if (!source.agentId || !source.nodeId) throw new Error('BINDING_FIELD_REQUIRED')
344
+ if (sourceLineId !== lineId) throw new Error(`BINDING_LINE_MISMATCH:${source.nodeId}`)
345
+ if ((min != null && !finite(min)) || (max != null && !finite(max))) throw new Error(`BINDING_RANGE_INVALID:${source.nodeId}`)
346
+ if (min != null && max != null && min > max) throw new Error(`BINDING_RANGE_ORDER:${source.nodeId}`)
347
+ if (!physicalMeaning || !unit) throw new Error(`BINDING_SEMANTICS_REQUIRED:${source.nodeId}`)
348
+ const samplePeriodMs = samplePeriodOf(source, node)
349
+ if (samplePeriodMs != null && (!finite(samplePeriodMs) || samplePeriodMs <= 0)) throw new Error(`BINDING_SAMPLE_PERIOD_INVALID:${source.nodeId}`)
350
+ const controlPolicy = source.controlPolicy ?? resolvedPolicy(input)
351
+ if (!['recommendation_only', 'hitl_governed', 'bounded_auto'].includes(controlPolicy)) throw new Error(`BINDING_POLICY_INVALID:${source.nodeId}`)
352
+ return {
353
+ agentId: source.agentId,
354
+ agentRole: optionalText(source.agentRole) ?? input.agentRole ?? 'worker',
355
+ nodeId: source.nodeId,
356
+ kind: source.kind,
357
+ mode: source.mode,
358
+ controlPolicy,
359
+ lineId,
360
+ physicalMeaning,
361
+ unit,
362
+ ...(min != null ? { min } : {}),
363
+ ...(max != null ? { max } : {}),
364
+ ...(samplePeriodMs != null ? { samplePeriodMs } : {}),
365
+ ...(sourceProductId ? { productId: sourceProductId } : {}),
366
+ ...(sourceRecipeId ? { recipeId: sourceRecipeId } : {}),
367
+ }
368
+ }
369
+
370
+ function bindingSort(a: NodeBindingSnapshotBinding, b: NodeBindingSnapshotBinding): number {
371
+ return `${a.agentId}\u0000${a.nodeId}\u0000${a.kind}`.localeCompare(`${b.agentId}\u0000${b.nodeId}\u0000${b.kind}`)
372
+ }
373
+
374
+ function epochPayload(snapshot: Pick<AuthoritativeNodeBindingSnapshot, 'schemaVersion' | 'channelId' | 'sceneId' | 'sceneVersion' | 'lineId' | 'productId' | 'recipeId' | 'recipeVersion' | 'recipeHash' | 'sceneContractHash' | 'bindings'>): unknown {
375
+ return {
376
+ schemaVersion: snapshot.schemaVersion,
377
+ channelId: snapshot.channelId,
378
+ sceneId: snapshot.sceneId,
379
+ sceneVersion: snapshot.sceneVersion,
380
+ lineId: snapshot.lineId,
381
+ productId: snapshot.productId,
382
+ recipeId: snapshot.recipeId,
383
+ recipeVersion: snapshot.recipeVersion,
384
+ recipeHash: snapshot.recipeHash,
385
+ sceneContractHash: snapshot.sceneContractHash,
386
+ bindings: snapshot.bindings.slice().sort(bindingSort),
387
+ }
388
+ }
389
+
390
+ type HashableBindingSnapshot = Omit<AuthoritativeNodeBindingSnapshot, 'snapshotHash'> & { snapshotHash?: string } | ContractNodeBindingSnapshot
391
+
392
+ function canonicalBindingSnapshotPayload(snapshot: HashableBindingSnapshot): AnyRecord {
393
+ const { snapshotHash: _snapshotHash, createdAt: _createdAt, createdBy: _createdBy, snapshotId: _snapshotId, ...payload } = snapshot as AuthoritativeNodeBindingSnapshot
394
+ return { ...payload, bindings: payload.bindings.slice().sort(bindingSort) }
395
+ }
396
+
397
+ export function computeBindingEpoch(snapshot: Pick<AuthoritativeNodeBindingSnapshot, 'schemaVersion' | 'channelId' | 'sceneId' | 'sceneVersion' | 'lineId' | 'productId' | 'recipeId' | 'recipeVersion' | 'recipeHash' | 'sceneContractHash' | 'bindings'>): string {
398
+ return sha256(epochPayload(snapshot))
399
+ }
400
+
401
+ export const bindingEpochHash = computeBindingEpoch
402
+
403
+ export function hashNodeBindingSnapshot(snapshot: Omit<AuthoritativeNodeBindingSnapshot, 'snapshotHash'> & { snapshotHash?: string } | ContractNodeBindingSnapshot): string {
404
+ return sha256(canonicalBindingSnapshotPayload(snapshot))
405
+ }
406
+
407
+ export const canonicalBindingSnapshotHash = hashNodeBindingSnapshot
408
+
409
+ export function createNodeBindingSnapshot(input: NodeBindingSnapshotInput): AuthoritativeNodeBindingSnapshot {
410
+ const channelId = text(input.channelId)
411
+ const createdBy = text(input.createdBy)
412
+ if (!channelId) throw new Error('BINDING_CHANNEL_REQUIRED')
413
+ if (!createdBy) throw new Error('BINDING_CREATED_BY_REQUIRED')
414
+ const scene = sceneOf(input)
415
+ const sceneId = text(input.sceneId ?? sceneIdOf(scene))
416
+ const sceneVersion = text(input.sceneVersion ?? sceneVersionOf(scene))
417
+ const lineId = text(input.lineId ?? sceneLineIdOf(scene) ?? recipeLineIdOf(input.recipe))
418
+ const explicitRecipeId = optionalText(input.recipeId ?? sceneRecipeIdOf(scene) ?? recipeIdOf(input.recipe))
419
+ const explicitProductId = optionalText(input.productId ?? sceneProductIdOf(scene) ?? recipeProductIdOf(input.recipe))
420
+ const activeRun = activeRunFor(lineId)
421
+ const activeRecipeId = optionalText(activeRun?.recipeId)
422
+ const activeProductId = optionalText(activeRun?.productId)
423
+ const recipeId = explicitRecipeId ?? activeRecipeId
424
+ const productId = explicitProductId ?? activeProductId
425
+ const recipe = resolveRecipe(input, recipeId)
426
+ const recipeVersion = input.recipeVersion ?? recipeVersionOf(recipe)
427
+ const recipeHashValue = canonicalRecipeHash(recipe, input.recipeHash)
428
+ if (!sceneId || !sceneVersion) throw new Error('BINDING_SCENE_REQUIRED')
429
+ if (!lineId) throw new Error('BINDING_LINE_REQUIRED')
430
+ if (input.requireFrozenScene && !isFrozenScene(scene)) throw new Error('BINDING_SCENE_NOT_FROZEN')
431
+ if (sceneLineIdOf(scene) && sceneLineIdOf(scene) !== lineId) throw new Error('BINDING_SCENE_LINE_MISMATCH')
432
+ if (sceneProductIdOf(scene) && sceneProductIdOf(scene) !== productId) throw new Error('BINDING_SCENE_PRODUCT_MISMATCH')
433
+ if (sceneRecipeIdOf(scene) && sceneRecipeIdOf(scene) !== recipeId) throw new Error('BINDING_SCENE_RECIPE_MISMATCH')
434
+ if (activeRecipeId && recipeId && activeRecipeId !== recipeId) throw new Error('BINDING_RECIPE_MISMATCH')
435
+ if (activeProductId && productId && activeProductId !== productId) throw new Error('BINDING_PRODUCT_MISMATCH')
436
+ const sources = input.bindings ?? input.currentBindings ?? input.agentBindings ?? input.bindingRecords ?? liveBindingSources(input)
437
+ const bindings = sources.map(source => normalizedBinding(input, source, lineId, productId, recipeId)).sort(bindingSort)
438
+ if (!bindings.length) throw new Error('BINDING_SNAPSHOT_EMPTY')
439
+ const seen = new Set<string>()
440
+ for (const binding of bindings) {
441
+ const key = `${binding.agentId}\u0000${binding.nodeId}\u0000${binding.kind}`
442
+ if (seen.has(key)) throw new Error(`BINDING_DUPLICATE:${binding.nodeId}`)
443
+ seen.add(key)
444
+ if (productId && binding.productId && binding.productId !== productId) throw new Error(`BINDING_PRODUCT_MISMATCH:${binding.nodeId}`)
445
+ if (recipeId && binding.recipeId && binding.recipeId !== recipeId) throw new Error(`BINDING_RECIPE_MISMATCH:${binding.nodeId}`)
446
+ }
447
+ const sceneHash = scene ? sceneContractHash(scene) : undefined
448
+ const base = {
449
+ schemaVersion: 1,
450
+ createdAt: new Date(input.nowMs ?? Date.now()).toISOString(),
451
+ createdBy,
452
+ snapshotId: input.snapshotId ?? createId('binding'),
453
+ channelId,
454
+ sceneId,
455
+ sceneVersion,
456
+ lineId,
457
+ ...(productId ? { productId } : {}),
458
+ ...(recipeId ? { recipeId } : {}),
459
+ ...(recipeVersion != null ? { recipeVersion } : {}),
460
+ ...(recipeHashValue ? { recipeHash: recipeHashValue } : {}),
461
+ ...(sceneHash ? { sceneContractHash: sceneHash } : {}),
462
+ bindings,
463
+ } satisfies Omit<AuthoritativeNodeBindingSnapshot, 'snapshotHash' | 'bindingEpoch'>
464
+ const bindingEpoch = computeBindingEpoch(base)
465
+ if (input.expectedBindingEpoch && input.expectedBindingEpoch !== bindingEpoch) throw new Error('BINDING_EPOCH_MISMATCH')
466
+ const snapshot = { ...base, bindingEpoch, snapshotHash: hashNodeBindingSnapshot({ ...base, bindingEpoch }) }
467
+ const verified = validateNodeBindingSnapshot(snapshot, {
468
+ scene,
469
+ frozenScene: input.requireFrozenScene ? scene : undefined,
470
+ expectedChannelId: channelId,
471
+ expectedSceneId: sceneId,
472
+ expectedSceneVersion: sceneVersion,
473
+ expectedLineId: lineId,
474
+ productId,
475
+ recipeId,
476
+ recipeVersion,
477
+ recipe,
478
+ recipeHash: recipeHashValue,
479
+ requireFrozenScene: Boolean(input.requireFrozenScene),
480
+ requireRecipe: Boolean(recipeId || recipeHashValue),
481
+ })
482
+ if (!verified.valid) throw new Error(verified.errors[0] ?? 'BINDING_SNAPSHOT_INVALID')
483
+ return snapshot
484
+ }
485
+
486
+ export const buildNodeBindingSnapshot = createNodeBindingSnapshot
487
+ export const buildBindingSnapshot = createNodeBindingSnapshot
488
+ export const createBindingSnapshot = createNodeBindingSnapshot
489
+
490
+ function validateBindingShape(snapshot: AnyRecord, errors: string[]): snapshot is AnyRecord & { bindings: unknown[] } {
491
+ for (const key of ['createdAt', 'createdBy', 'snapshotId', 'channelId', 'bindingEpoch', 'sceneId', 'sceneVersion', 'lineId', 'snapshotHash']) {
492
+ if (!text(snapshot[key])) errors.push(`BINDING_${key.toUpperCase()}_REQUIRED`)
493
+ }
494
+ if (!Number.isInteger(snapshot.schemaVersion) || Number(snapshot.schemaVersion) <= 0) errors.push('BINDING_SCHEMA_INVALID')
495
+ if (!Number.isFinite(Date.parse(text(snapshot.createdAt)))) errors.push('BINDING_CREATED_AT_INVALID')
496
+ if (!Array.isArray(snapshot.bindings) || snapshot.bindings.length === 0) {
497
+ errors.push('BINDING_SNAPSHOT_EMPTY')
498
+ return false
499
+ }
500
+ return true
501
+ }
502
+
503
+ function validateSceneBinding(snapshot: AnyRecord, scene: SceneContract | SceneWithDraftMetadata, errors: string[]): void {
504
+ if (snapshot.sceneId !== scene.sceneId) errors.push('BINDING_SCENE_MISMATCH')
505
+ if (snapshot.sceneVersion !== scene.sceneVersion) errors.push('BINDING_SCENE_VERSION_MISMATCH')
506
+ if (snapshot.lineId !== scene.lineId) errors.push('BINDING_LINE_MISMATCH')
507
+ if (!sameOptional(snapshot.productId, scene.productId)) errors.push('BINDING_PRODUCT_MISMATCH')
508
+ if (!sameOptional(snapshot.recipeId, scene.recipeId)) errors.push('BINDING_RECIPE_MISMATCH')
509
+ const actualHash = sceneContractHash(scene)
510
+ if (snapshot.sceneContractHash !== actualHash) errors.push('BINDING_SCENE_HASH_MISMATCH')
511
+ const variables = [
512
+ ...(scene.controls ?? []),
513
+ ...(scene.states ?? []),
514
+ ...(scene.disturbances ?? []),
515
+ ...(scene.observations ?? []),
516
+ ...(scene.guards ?? []),
517
+ ]
518
+ const bindings = snapshot.bindings as Array<AnyRecord>
519
+ for (const variable of variables) {
520
+ const nodeId = optionalText(variable.nodeId)
521
+ if (!nodeId) continue
522
+ const expectedKind: BindingNodeKind = variable.role === 'control' ? 'dcw' : 'daq'
523
+ const candidates = bindings.filter(binding => binding.nodeId === nodeId)
524
+ if (!candidates.length) {
525
+ errors.push(`BINDING_SCENE_NODE_MISSING:${nodeId}`)
526
+ continue
527
+ }
528
+ const match = candidates.find(binding => binding.kind === expectedKind)
529
+ if (!match) {
530
+ errors.push(`BINDING_NODE_KIND_MISMATCH:${nodeId}`)
531
+ continue
532
+ }
533
+ if (match.unit !== variable.unit) errors.push(`BINDING_UNIT_MISMATCH:${nodeId}`)
534
+ // Descriptions may be enriched/normalized by the node catalog; nodeId, role, unit, and range are authoritative.
535
+ // Keep physicalMeaning in the snapshot for audit, but do not reject a same-node description rewrite.
536
+ if (variable.min != null && match.min !== variable.min) errors.push(`BINDING_MIN_MISMATCH:${nodeId}`)
537
+ if (variable.max != null && match.max !== variable.max) errors.push(`BINDING_MAX_MISMATCH:${nodeId}`)
538
+ }
539
+ }
540
+
541
+ function validateRecipeBinding(snapshot: AnyRecord, options: NodeBindingSnapshotVerifyOptions, errors: string[]): void {
542
+ const recipeId = optionalText(options.recipeId ?? recipeIdOf(options.recipe))
543
+ const productId = optionalText(options.productId ?? recipeProductIdOf(options.recipe))
544
+ const lineId = optionalText(options.expectedLineId ?? recipeLineIdOf(options.recipe))
545
+ const recipeVersion = options.recipeVersion ?? recipeVersionOf(options.recipe)
546
+ const recipeHashValue = canonicalRecipeHash(options.recipe, options.recipeHash)
547
+ if (options.requireRecipe && !recipeId) errors.push('BINDING_RECIPE_REQUIRED')
548
+ if (recipeId && snapshot.recipeId !== recipeId) errors.push('BINDING_RECIPE_MISMATCH')
549
+ if (productId && snapshot.productId !== productId) errors.push('BINDING_PRODUCT_MISMATCH')
550
+ if (lineId && snapshot.lineId !== lineId) errors.push('BINDING_LINE_MISMATCH')
551
+ if (recipeVersion != null && snapshot.recipeVersion !== recipeVersion) errors.push('BINDING_RECIPE_VERSION_MISMATCH')
552
+ if (recipeHashValue && snapshot.recipeHash !== recipeHashValue) errors.push('BINDING_RECIPE_HASH_MISMATCH')
553
+ if (recipeHashValue && !snapshot.recipeHash) errors.push('BINDING_RECIPE_HASH_MISSING')
554
+ }
555
+
556
+ export function validateNodeBindingSnapshot(input: unknown, options: NodeBindingSnapshotVerifyOptions = {}): BindingSnapshotValidationResult {
557
+ const snapshot = record(input)
558
+ if (!snapshot) return { valid: false, errors: ['BINDING_SNAPSHOT_REQUIRED'] }
559
+ const errors: string[] = []
560
+ if (!validateBindingShape(snapshot, errors)) return { valid: false, errors }
561
+ const bindings = snapshot.bindings as Array<AnyRecord>
562
+ const seen = new Set<string>()
563
+ for (const binding of bindings) {
564
+ const kind = text(binding.kind)
565
+ const mode = text(binding.mode)
566
+ const policy = text(binding.controlPolicy)
567
+ for (const key of ['agentId', 'agentRole', 'nodeId', 'lineId', 'physicalMeaning', 'unit']) {
568
+ if (!text(binding[key])) errors.push(`BINDING_ENTRY_${key.toUpperCase()}_REQUIRED`)
569
+ }
570
+ if (kind !== 'daq' && kind !== 'dcw') errors.push(`BINDING_KIND_INVALID:${binding.nodeId ?? ''}`)
571
+ if (mode !== 'auto' && mode !== 'manual') errors.push(`BINDING_MODE_INVALID:${binding.nodeId ?? ''}`)
572
+ if (!['recommendation_only', 'hitl_governed', 'bounded_auto'].includes(policy)) errors.push(`BINDING_POLICY_INVALID:${binding.nodeId ?? ''}`)
573
+ if ((binding.min != null && !finite(binding.min)) || (binding.max != null && !finite(binding.max))) errors.push(`BINDING_RANGE_INVALID:${binding.nodeId ?? ''}`)
574
+ if (binding.min != null && binding.max != null && Number(binding.min) > Number(binding.max)) errors.push(`BINDING_RANGE_ORDER:${binding.nodeId ?? ''}`)
575
+ if (binding.samplePeriodMs != null && (!finite(binding.samplePeriodMs) || Number(binding.samplePeriodMs) <= 0)) errors.push(`BINDING_SAMPLE_PERIOD_INVALID:${binding.nodeId ?? ''}`)
576
+ const key = `${text(binding.agentId)}\u0000${text(binding.nodeId)}\u0000${kind}`
577
+ if (seen.has(key)) errors.push(`BINDING_DUPLICATE:${binding.nodeId ?? ''}`)
578
+ seen.add(key)
579
+ if (binding.lineId !== snapshot.lineId) errors.push(`BINDING_LINE_MISMATCH:${binding.nodeId ?? ''}`)
580
+ if (snapshot.productId && binding.productId && binding.productId !== snapshot.productId) errors.push(`BINDING_PRODUCT_MISMATCH:${binding.nodeId ?? ''}`)
581
+ if (snapshot.recipeId && binding.recipeId && binding.recipeId !== snapshot.recipeId) errors.push(`BINDING_RECIPE_MISMATCH:${binding.nodeId ?? ''}`)
582
+ }
583
+ let calculatedHash: string | undefined
584
+ let calculatedBindingEpoch: string | undefined
585
+ try {
586
+ calculatedHash = hashNodeBindingSnapshot(snapshot as unknown as AuthoritativeNodeBindingSnapshot)
587
+ calculatedBindingEpoch = computeBindingEpoch(snapshot as unknown as AuthoritativeNodeBindingSnapshot)
588
+ if (snapshot.snapshotHash !== calculatedHash) errors.push('BINDING_SNAPSHOT_HASH_MISMATCH')
589
+ if (snapshot.bindingEpoch !== calculatedBindingEpoch) errors.push('BINDING_EPOCH_MISMATCH')
590
+ }
591
+ catch {
592
+ errors.push('BINDING_SNAPSHOT_HASH_INVALID')
593
+ }
594
+ const scene = options.frozenScene ?? options.scene
595
+ if (options.requireFrozenScene && !scene) errors.push('BINDING_SCENE_REQUIRED')
596
+ if (options.requireFrozenScene && scene && !isFrozenScene(scene)) errors.push('BINDING_SCENE_NOT_FROZEN')
597
+ if (scene) validateSceneBinding(snapshot, scene, errors)
598
+ if (options.expectedChannelId && snapshot.channelId !== options.expectedChannelId) errors.push('BINDING_CHANNEL_MISMATCH')
599
+ if (options.expectedSceneId && snapshot.sceneId !== options.expectedSceneId) errors.push('BINDING_SCENE_MISMATCH')
600
+ if (options.expectedSceneVersion && snapshot.sceneVersion !== options.expectedSceneVersion) errors.push('BINDING_SCENE_VERSION_MISMATCH')
601
+ if (options.expectedLineId && snapshot.lineId !== options.expectedLineId) errors.push('BINDING_LINE_MISMATCH')
602
+ validateRecipeBinding(snapshot, options, errors)
603
+ const expectedHash = options.expectedSnapshotHash ?? options.expectedBindingSnapshotHash
604
+ if (expectedHash && snapshot.snapshotHash !== expectedHash) errors.push('BINDING_SNAPSHOT_HASH_MISMATCH')
605
+ const expectedEpoch = options.currentBindingEpoch ?? options.expectedBindingEpoch
606
+ if (expectedEpoch && snapshot.bindingEpoch !== expectedEpoch) errors.push('BINDING_EPOCH_MISMATCH')
607
+ if (options.currentSnapshot != null) {
608
+ const current = record(options.currentSnapshot)
609
+ if (!current) errors.push('BINDING_CURRENT_SNAPSHOT_INVALID')
610
+ else if (text(current.bindingEpoch) !== text(snapshot.bindingEpoch)) errors.push('BINDING_EPOCH_MISMATCH')
611
+ }
612
+ if (options.maxAgeMs != null) {
613
+ const nowMs = options.nowMs ?? Date.now()
614
+ const age = nowMs - Date.parse(text(snapshot.createdAt))
615
+ if (age < 0) errors.push('BINDING_SNAPSHOT_FUTURE')
616
+ else if (age > options.maxAgeMs) errors.push('BINDING_SNAPSHOT_EXPIRED')
617
+ }
618
+ return { valid: errors.length === 0, errors, calculatedHash, calculatedBindingEpoch }
619
+ }
620
+
621
+ function verifyOptions(options: NodeBindingSnapshotVerifyOptions | string | undefined): NodeBindingSnapshotVerifyOptions {
622
+ return typeof options === 'string' ? { expectedSnapshotHash: options } : options ?? {}
623
+ }
624
+
625
+ export function verifyNodeBindingSnapshot(snapshot: unknown, options?: NodeBindingSnapshotVerifyOptions | string): boolean {
626
+ return validateNodeBindingSnapshot(snapshot, verifyOptions(options)).valid
627
+ }
628
+
629
+ export function assertNodeBindingSnapshot(snapshot: unknown, options?: NodeBindingSnapshotVerifyOptions | string): asserts snapshot is AuthoritativeNodeBindingSnapshot {
630
+ const result = validateNodeBindingSnapshot(snapshot, verifyOptions(options))
631
+ if (!result.valid) throw new Error(result.errors[0] ?? 'BINDING_SNAPSHOT_INVALID')
632
+ }
633
+
634
+ export const validateBindingSnapshot = validateNodeBindingSnapshot
635
+ export const verifyBindingSnapshot = verifyNodeBindingSnapshot
636
+ export const assertBindingSnapshot = assertNodeBindingSnapshot
637
+ export const bindingSnapshotHash = hashNodeBindingSnapshot