agentworkshop 0.7.71 → 0.8.1

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 (629) hide show
  1. package/.AgentWorkShop/prompts/host-tools.json +455 -0
  2. package/.output/.AgentWorkShop/prompts/host-tools.json +455 -0
  3. package/.output/nitro.json +1 -1
  4. package/.output/public/_nuxt/{DJJDigim2.js → -FhgRqJl2.js} +1 -1
  5. package/.output/public/_nuxt/{CGk_VUhO2.js → 0qvcO_KM2.js} +1 -1
  6. package/.output/public/_nuxt/26OL4Ao82.js +1 -0
  7. package/.output/public/_nuxt/{sBDZymdy2.js → 2Kwo_j9G2.js} +1 -1
  8. package/.output/public/_nuxt/{BqYVLAcm.js → 2v5GdspM.js} +1 -1
  9. package/.output/public/_nuxt/{DkQBMVTs2.js → 8M7wFbEN2.js} +1 -1
  10. package/.output/public/_nuxt/{DtiY69xi2.js → 8SZLbrI42.js} +1 -1
  11. package/.output/public/_nuxt/{DF32f5EL2.js → B2NbzUau2.js} +1 -1
  12. package/.output/public/_nuxt/{CwZW1ZCe2.js → B4JlRHBB2.js} +1 -1
  13. package/.output/public/_nuxt/{BQOn0q6Y.js → B6C4WofF.js} +1 -1
  14. package/.output/public/_nuxt/{BC7W6lNm.js → B6UwtJ1a.js} +1 -1
  15. package/.output/public/_nuxt/{BfQ-ptH0.js → B8HFUsMH.js} +1 -1
  16. package/.output/public/_nuxt/{DzBbYWrw2.js → BBB_j2LU2.js} +1 -1
  17. package/.output/public/_nuxt/BCLUwdP52.js +1 -0
  18. package/.output/public/_nuxt/{CLxmY3Rh.js → BK4wbfGS.js} +1 -1
  19. package/.output/public/_nuxt/{BRMVDfPl2.js → BKidykmV2.js} +1 -1
  20. package/.output/public/_nuxt/BPUQZ9Lq2.js +8 -0
  21. package/.output/public/_nuxt/BRYBzVMJ.js +1 -0
  22. package/.output/public/_nuxt/{Bj5sjA5O.js → BRci9D_l.js} +1 -1
  23. package/.output/public/_nuxt/{Dmgqz2np2.js → BVGzwAxr2.js} +1 -1
  24. package/.output/public/_nuxt/BVg2R2VB2.js +1 -0
  25. package/.output/public/_nuxt/{C3aUN4Vp2.js → BW2uTUx52.js} +1 -1
  26. package/.output/public/_nuxt/{B5FKaMM02.js → BY3Lbz3h2.js} +1 -1
  27. package/.output/public/_nuxt/{DIwmMa_7.js → BYzim_Bn.js} +1 -1
  28. package/.output/public/_nuxt/{D8xUsQGt.js → B_Obcbiu.js} +1 -1
  29. package/.output/public/_nuxt/BaYDgyaR.js +3 -0
  30. package/.output/public/_nuxt/{DZJ11BTI.js → BbACaREb.js} +1 -1
  31. package/.output/public/_nuxt/{BJrj5JVe2.js → BcosvNXb2.js} +1 -1
  32. package/.output/public/_nuxt/{B_-vAvzb.js → BfeXib9G.js} +1 -1
  33. package/.output/public/_nuxt/{CeLqojCJ.js → BfgTar9L.js} +1 -1
  34. package/.output/public/_nuxt/BfvuWqSa.js +1 -0
  35. package/.output/public/_nuxt/{D8r8PNQa2.js → BiZWwdcD2.js} +1 -1
  36. package/.output/public/_nuxt/BkEokGX5.js +1 -0
  37. package/.output/public/_nuxt/{CJSohaqk2.js → BklGqEto2.js} +2 -2
  38. package/.output/public/_nuxt/{DkpmSnHX.js → Bko5adbu.js} +1 -1
  39. package/.output/public/_nuxt/{DTQTGA6v2.js → BmBlIIJo2.js} +1 -1
  40. package/.output/public/_nuxt/{D_NjL-Hz.js → Bmvt9ydE.js} +1 -1
  41. package/.output/public/_nuxt/{Cp4r6Eiz.js → BoyuIoSm.js} +1 -1
  42. package/.output/public/_nuxt/{62J4vljm2.js → Bq-tmkst.js} +1 -1
  43. package/.output/public/_nuxt/{BMMoqi94.js → BqFaZ4kS.js} +1 -1
  44. package/.output/public/_nuxt/BsJYieAL2.js +1 -0
  45. package/.output/public/_nuxt/{DD4J2Otc.js → BtZKe9ZV.js} +1 -1
  46. package/.output/public/_nuxt/{BnpY_zNx.js → BtumQhZK.js} +1 -1
  47. package/.output/public/_nuxt/{BjLzqWJH2.js → BwWs9EdO2.js} +1 -1
  48. package/.output/public/_nuxt/{Bx2a9cuY2.js → BxxpJxZf2.js} +1 -1
  49. package/.output/public/_nuxt/{qRXa-PM22.js → ByTnUqFw2.js} +1 -1
  50. package/.output/public/_nuxt/{DvOETuoT2.js → Byiiiwc72.js} +1 -1
  51. package/.output/public/_nuxt/{Car2lkbb.js → C1-SuwUN.js} +1 -1
  52. package/.output/public/_nuxt/{Dg81dOEO.js → C14pM5G4.js} +1 -1
  53. package/.output/public/_nuxt/{MDhaRQq_.js → C2Yp-B8m.js} +1 -1
  54. package/.output/public/_nuxt/{BJ2nJNlK2.js → C4e6_nom2.js} +1 -1
  55. package/.output/public/_nuxt/{CiCEprsp2.js → C5OStZJ62.js} +1 -1
  56. package/.output/public/_nuxt/{ByMj6e7s.js → C6lssmvl.js} +2 -2
  57. package/.output/public/_nuxt/{C6uBP0Xa.js → CC-GEjfN.js} +1 -1
  58. package/.output/public/_nuxt/CC2Pv8VL2.js +1 -0
  59. package/.output/public/_nuxt/{DKiqdYnj.js → CCcMgxV9.js} +1 -1
  60. package/.output/public/_nuxt/{5S26I34j2.js → CDL30A2z2.js} +1 -1
  61. package/.output/public/_nuxt/{B8C-QJB5.js → CDYLasP8.js} +1 -1
  62. package/.output/public/_nuxt/CElzwyXQ.js +1 -0
  63. package/.output/public/_nuxt/{2KE8xGVm.js → CEvJu-xI.js} +1 -1
  64. package/.output/public/_nuxt/{CR612R752.js → CFQRFctQ2.js} +1 -1
  65. package/.output/public/_nuxt/{DnzjxC0u.js → CHk9XxNi.js} +2 -2
  66. package/.output/public/_nuxt/{Bx4MR0jd.js → CLFmtXU7.js} +1 -1
  67. package/.output/public/_nuxt/{DW8k_0dQ.js → CMJi6yYS.js} +1 -1
  68. package/.output/public/_nuxt/{DD-r0S1p.js → CPvFGbr8.js} +1 -1
  69. package/.output/public/_nuxt/{CCgbgkid.js → CQSxS_Ek.js} +2 -2
  70. package/.output/public/_nuxt/{jGxHnjW6.js → CQuo31jF.js} +1 -1
  71. package/.output/public/_nuxt/{SoO2K-di.js → CRCrWy-6.js} +1 -1
  72. package/.output/public/_nuxt/CUCFFL9m.js +84 -0
  73. package/.output/public/_nuxt/CZYNy60j2.js +1 -0
  74. package/.output/public/_nuxt/{WPwdj9pg.js → CZsFf7ck.js} +1 -1
  75. package/.output/public/_nuxt/CfFUK6932.js +2 -0
  76. package/.output/public/_nuxt/{DAsjfdZD.js → CfIbFnJz.js} +1 -1
  77. package/.output/public/_nuxt/{Tk6TQZjU.js → CjF4QY9h.js} +1 -1
  78. package/.output/public/_nuxt/{DlUQa0wn.js → Cjo1t2IF.js} +1 -1
  79. package/.output/public/_nuxt/{CDn0eDn8.js → CmuGMxDP.js} +1 -1
  80. package/.output/public/_nuxt/Cn6EojFe.js +1 -0
  81. package/.output/public/_nuxt/{DLqSQbGv.js → CnYazk8d.js} +1 -1
  82. package/.output/public/_nuxt/{DQfy6R_2.js → CnrGVJIr.js} +1 -1
  83. package/.output/public/_nuxt/{C0YL0HKK.js → CtcBhkci.js} +1 -1
  84. package/.output/public/_nuxt/{h5gsh8E92.js → Cv-Mv7_h2.js} +1 -1
  85. package/.output/public/_nuxt/{vPcnBJsa2.js → CzlZrfq82.js} +1 -1
  86. package/.output/public/_nuxt/{C2YYOgMe.js → CznnUTZx.js} +2 -2
  87. package/.output/public/_nuxt/{csitHKnE2.js → D-80EfyA2.js} +1 -1
  88. package/.output/public/_nuxt/{BRdoISnJ2.js → D1C6qtS12.js} +1 -1
  89. package/.output/public/_nuxt/{Cnrmlixo.js → D1MkndMZ.js} +2 -2
  90. package/.output/public/_nuxt/{BLwDhlaa.js → D37gODe0.js} +1 -1
  91. package/.output/public/_nuxt/{NXY37IO62.js → D6FhDrYe2.js} +1 -1
  92. package/.output/public/_nuxt/{Btx8wL4-.js → D7TZLu4F.js} +1 -1
  93. package/.output/public/_nuxt/{qoUdVDnC.js → D7tEwf-o.js} +3 -3
  94. package/.output/public/_nuxt/D8HQPtm62.js +1 -0
  95. package/.output/public/_nuxt/D9O4L4jK.js +1 -0
  96. package/.output/public/_nuxt/{aQ1B7BZa2.js → D9lL3fJM2.js} +2 -2
  97. package/.output/public/_nuxt/{CT-vTjcG2.js → DC-2eKo62.js} +1 -1
  98. package/.output/public/_nuxt/DF9ETYJ32.js +1 -0
  99. package/.output/public/_nuxt/DGGBrc0q2.js +1 -0
  100. package/.output/public/_nuxt/DGu_fna7.js +1 -0
  101. package/.output/public/_nuxt/{BupBjt6B.js → DKOvbitt.js} +1 -1
  102. package/.output/public/_nuxt/{B1PzYsqN.js → DNxudyND.js} +1 -1
  103. package/.output/public/_nuxt/{BfX6_AjY.js → DOT-XQyi.js} +1 -1
  104. package/.output/public/_nuxt/{BsTZnkVK.js → DPPC9Teq.js} +1 -1
  105. package/.output/public/_nuxt/{HxohXQ_r.js → DRskyE7l.js} +1 -1
  106. package/.output/public/_nuxt/{B-U7E_Mc2.js → DW4ZgInh2.js} +1 -1
  107. package/.output/public/_nuxt/{BErG4kzc2.js → DWe6BMlp2.js} +1 -1
  108. package/.output/public/_nuxt/DWy0AjON.js +1 -0
  109. package/.output/public/_nuxt/{Bc_k6AVA.js → DXgw1dVL.js} +4 -4
  110. package/.output/public/_nuxt/{C3sWJ8SD2.js → DZsKIzKD2.js} +1 -1
  111. package/.output/public/_nuxt/D_59BNP1.js +14 -0
  112. package/.output/public/_nuxt/{BQIO4MkA2.js → D_FZ3KZI2.js} +1 -1
  113. package/.output/public/_nuxt/{n_Njdwii2.js → D__vJGHF2.js} +1 -1
  114. package/.output/public/_nuxt/{C9gErLQc2.js → DaizNGUm2.js} +1 -1
  115. package/.output/public/_nuxt/{C-MY-JQE2.js → DdyE0ylS.js} +1 -1
  116. package/.output/public/_nuxt/DgrK8UCQ.js +0 -0
  117. package/.output/public/_nuxt/DhLlTxQh2.js +1 -0
  118. package/.output/public/_nuxt/DhW7cFOa.js +1 -0
  119. package/.output/public/_nuxt/{Rt2i6k7C2.js → DhjgWrB62.js} +1 -1
  120. package/.output/public/_nuxt/{KwT4sN_d.js → DiWcX4gj.js} +1 -1
  121. package/.output/public/_nuxt/DiloA8vK.js +1 -0
  122. package/.output/public/_nuxt/{DX-c5laM2.js → DlS-SkQ42.js} +1 -1
  123. package/.output/public/_nuxt/{D_Zspo1y.js → DmHp9yQ3.js} +1 -1
  124. package/.output/public/_nuxt/{dq1HKoGD.js → DoL9u6wu.js} +1 -1
  125. package/.output/public/_nuxt/{CIvMT5Ic.js → DqxBCeDe.js} +1 -1
  126. package/.output/public/_nuxt/{BnNmkGJS2.js → DrlnrdvY2.js} +3 -3
  127. package/.output/public/_nuxt/{BAcjVcku2.js → Dt8TL8_X2.js} +1 -1
  128. package/.output/public/_nuxt/{BtfwbNC0.js → Du7gS8RU.js} +1 -1
  129. package/.output/public/_nuxt/DuUc4bbY2.js +1 -0
  130. package/.output/public/_nuxt/{DPUXbTg9.js → DudoisLM.js} +1 -1
  131. package/.output/public/_nuxt/{Ce5R-ZGf2.js → DwgVlehj2.js} +1 -1
  132. package/.output/public/_nuxt/Dyxf2xZw.js +1 -0
  133. package/.output/public/_nuxt/Dz9C2pTa.js +1 -0
  134. package/.output/public/_nuxt/{BYxG9Hb2.js → EMbqTHfT.js} +1 -1
  135. package/.output/public/_nuxt/{B1SzppY12.js → FsRVXpyF2.js} +1 -1
  136. package/.output/public/_nuxt/{0MLy6ogg2.js → GQrEW8nk2.js} +1 -1
  137. package/.output/public/_nuxt/{Tuz5LcLM.js → IXR1BWP5.js} +1 -1
  138. package/.output/public/_nuxt/{-jpUnM1I2.js → Iub61dX92.js} +1 -1
  139. package/.output/public/_nuxt/{CQgOzpvI.js → JegDslce.js} +2 -2
  140. package/.output/public/_nuxt/{DrF3TWoj.js → KzK37yIr.js} +1 -1
  141. package/.output/public/_nuxt/{Br3MggOL.js → N-CCmCsX.js} +1 -1
  142. package/.output/public/_nuxt/{DHhmq7s_.js → NfvZ5Lzv.js} +1 -1
  143. package/.output/public/_nuxt/{CzX_kaPL.js → POTcePF_.js} +1 -1
  144. package/.output/public/_nuxt/{D7s96J3r2.js → Q-JpBT032.js} +1 -1
  145. package/.output/public/_nuxt/{DzwIZ81f2.js → R1g64DNi2.js} +1 -1
  146. package/.output/public/_nuxt/{JgheoP3e.js → R5Pz7BqB.js} +1 -1
  147. package/.output/public/_nuxt/{yLyz0-Yz.js → SvjzWbn8.js} +1 -1
  148. package/.output/public/_nuxt/{Dd7MZc_Q.js → XqXoaoDs.js} +1 -1
  149. package/.output/public/_nuxt/{B6jtLy6z.js → YAA98rWJ.js} +11 -11
  150. package/.output/public/_nuxt/{HX4_xnak2.js → YLYSczSq2.js} +1 -1
  151. package/.output/public/_nuxt/{BBw9ylUY2.js → YNhAoK-R2.js} +1 -1
  152. package/.output/public/_nuxt/Zkbt8Uk5.js +1 -0
  153. package/.output/public/_nuxt/aml.PalMp-5n.css +1 -0
  154. package/.output/public/_nuxt/{C41CcsiD.js → b7UcqLKi.js} +1 -1
  155. package/.output/public/_nuxt/builds/latest.json +1 -1
  156. package/.output/public/_nuxt/builds/meta/fa0af8b5-3929-428d-a6de-3b5cc6b8248f.json +1 -0
  157. package/.output/public/_nuxt/{DVkFSOZi.js → cKj4vSo5.js} +1 -1
  158. package/.output/public/_nuxt/{r1CpGsFp.js → dHwWyr6b.js} +1 -1
  159. package/.output/public/_nuxt/{default.BzOcvmSE.css → default.BEXGWZFQ.css} +1 -1
  160. package/.output/public/_nuxt/{DlcA9Gxl.js → eePbiWEh.js} +1 -1
  161. package/.output/public/_nuxt/{entry.CL2i0F8o.css → entry.C7koBPom.css} +1 -1
  162. package/.output/public/_nuxt/{cjRzSvAg2.js → eymRov9Y2.js} +1 -1
  163. package/.output/public/_nuxt/{B8cViLJT.js → geMze5qw.js} +1 -1
  164. package/.output/public/_nuxt/{uu1wfdfR2.js → gh-WMxV_2.js} +1 -1
  165. package/.output/public/_nuxt/{Ce6e1mPk2.js → hCN555XP2.js} +1 -1
  166. package/.output/public/_nuxt/{rdUE8Khf.js → hZG5MLjK.js} +3 -3
  167. package/.output/public/_nuxt/{CcX_jP-d.js → hlfahYxK.js} +1 -1
  168. package/.output/public/_nuxt/{cGSl2GZp2.js → ilJHF1nA2.js} +1 -1
  169. package/.output/public/_nuxt/{D6ZcgHPz.js → jDuiDtGb.js} +1 -1
  170. package/.output/public/_nuxt/{DbeNMehP.js → k9b520K-.js} +1 -1
  171. package/.output/public/_nuxt/ontology.B_3Wn907.css +1 -0
  172. package/.output/public/_nuxt/optimizer.CLA8I1sy.css +1 -0
  173. package/.output/public/_nuxt/{DSORcpTJ.js → rDvMijKA.js} +2 -2
  174. package/.output/public/_nuxt/{CAiHhX8P2.js → rF7mggl72.js} +2 -2
  175. package/.output/public/_nuxt/ri9UF8rk.js +2 -0
  176. package/.output/public/_nuxt/{KgnxOsMr.js → toG_qAMH.js} +1 -1
  177. package/.output/public/_nuxt/{KQZmHR_K.js → u3h4pGpm.js} +2 -2
  178. package/.output/public/_nuxt/{dJ7gK7C2.js → uomnHjhM.js} +1 -1
  179. package/.output/public/_nuxt/{BUTg4W_x2.js → v77qozuJ2.js} +1 -1
  180. package/.output/public/_nuxt/{BcEr7tIB.js → v7cV7hJa.js} +1 -1
  181. package/.output/public/_nuxt/{D25dVZ822.js → vkQoYNQR2.js} +2 -2
  182. package/.output/public/_nuxt/{wR_w07322.js → vp3LtnTz2.js} +1 -1
  183. package/.output/public/_nuxt/{Bnc8HELj2.js → we7-sMSo2.js} +1 -1
  184. package/.output/public/_nuxt/{kN3ZzR1-.js → wxISMS1i.js} +1 -1
  185. package/.output/public/_nuxt/{DGrrucbG2.js → zy7efYKR.js} +1 -1
  186. package/.output/server/chunks/_/access.mjs +1 -1
  187. package/.output/server/chunks/_/binding-authz.mjs +1 -1
  188. package/.output/server/chunks/_/catalog-view.mjs +1 -1
  189. package/.output/server/chunks/_/character-asset.repo.mjs +1 -1
  190. package/.output/server/chunks/_/chart-repo.mjs +1 -1
  191. package/.output/server/chunks/_/dashboard-repo.mjs +1 -1
  192. package/.output/server/chunks/_/data-export.mjs +6 -6
  193. package/.output/server/chunks/_/data-query.mjs +3 -3
  194. package/.output/server/chunks/_/eda-run.repo.mjs +2 -2
  195. package/.output/server/chunks/_/entity.mjs +1 -1
  196. package/.output/server/chunks/_/features.mjs +5 -5
  197. package/.output/server/chunks/_/golden.mjs +3 -3
  198. package/.output/server/chunks/_/host-bindings.mjs +1 -1
  199. package/.output/server/chunks/_/index.mjs +1 -1
  200. package/.output/server/chunks/_/mes-console.mjs +1 -1
  201. package/.output/server/chunks/_/nitro.mjs +7291 -3540
  202. package/.output/server/chunks/_/nitro.mjs.map +1 -1
  203. package/.output/server/chunks/_/ocap.mjs +1 -1
  204. package/.output/server/chunks/_/rest-auth.mjs +1 -1
  205. package/.output/server/chunks/_/scene-layout.repo.mjs +1 -1
  206. package/.output/server/chunks/_/spc.mjs +2 -2
  207. package/.output/server/chunks/build/TownView-BWMDbosY.mjs +1 -1
  208. package/.output/server/chunks/build/{_wsId_-BNKrrV1H.mjs → _wsId_-BPy-Aj9L.mjs} +3 -3
  209. package/.output/server/chunks/build/{_wsId_-BNKrrV1H.mjs.map → _wsId_-BPy-Aj9L.mjs.map} +1 -1
  210. package/.output/server/chunks/build/{agents-8tV9xL97.mjs → agents-CpNLdI8E.mjs} +6 -6
  211. package/.output/server/chunks/build/{agents-8tV9xL97.mjs.map → agents-CpNLdI8E.mjs.map} +1 -1
  212. package/.output/server/chunks/build/{aml-BNTEDOsl.mjs → aml-DRAFRcGU.mjs} +15 -12
  213. package/.output/server/chunks/build/{aml-BNTEDOsl.mjs.map → aml-DRAFRcGU.mjs.map} +1 -1
  214. package/.output/server/chunks/build/api-BEW_ebY_.mjs +64 -0
  215. package/.output/server/chunks/build/api-BEW_ebY_.mjs.map +1 -0
  216. package/.output/server/chunks/build/{channel-templates-Iot9Y3vV.mjs → channel-templates-ByHOQQkO.mjs} +2 -2
  217. package/.output/server/chunks/build/{channel-templates-Iot9Y3vV.mjs.map → channel-templates-ByHOQQkO.mjs.map} +1 -1
  218. package/.output/server/chunks/build/daq-CdxcfY_G.mjs +1 -1
  219. package/.output/server/chunks/build/dcw-BlDQtS4q.mjs +1 -1
  220. package/.output/server/chunks/build/{default-BeB88U7y.mjs → default-CNWS6NUw.mjs} +17 -11
  221. package/.output/server/chunks/build/{default-BeB88U7y.mjs.map → default-CNWS6NUw.mjs.map} +1 -1
  222. package/.output/server/chunks/build/{dropdown-CjwsxU39.mjs → dropdown-BNwTVGde.mjs} +2 -2
  223. package/.output/server/chunks/build/{dropdown-CjwsxU39.mjs.map → dropdown-BNwTVGde.mjs.map} +1 -1
  224. package/.output/server/chunks/build/{dropdown-C6YH_kSO.mjs → dropdown-Cd-xPhR6.mjs} +2 -2
  225. package/.output/server/chunks/build/{dropdown-C6YH_kSO.mjs.map → dropdown-Cd-xPhR6.mjs.map} +1 -1
  226. package/.output/server/chunks/build/input-number-BNlNDK7H.mjs +1 -1
  227. package/.output/server/chunks/build/{logs-BTfJQ6vQ.mjs → logs-pRb-TMWa.mjs} +3 -3
  228. package/.output/server/chunks/build/{logs-BTfJQ6vQ.mjs.map → logs-pRb-TMWa.mjs.map} +1 -1
  229. package/.output/server/chunks/build/{monitor-DvaR3yo8.mjs → monitor-Cq6hRFeQ.mjs} +6 -6
  230. package/.output/server/chunks/build/{monitor-DvaR3yo8.mjs.map → monitor-Cq6hRFeQ.mjs.map} +1 -1
  231. package/.output/server/chunks/build/ontology-DK0Mf0zT.mjs +1406 -0
  232. package/.output/server/chunks/build/ontology-DK0Mf0zT.mjs.map +1 -0
  233. package/.output/server/chunks/build/{operations-Cl8nVm9D.mjs → operations-SMQrRAcr.mjs} +3 -3
  234. package/.output/server/chunks/build/{operations-Cl8nVm9D.mjs.map → operations-SMQrRAcr.mjs.map} +1 -1
  235. package/.output/server/chunks/build/optimizer-BlWTsM-W.mjs +202 -0
  236. package/.output/server/chunks/build/optimizer-BlWTsM-W.mjs.map +1 -0
  237. package/.output/server/chunks/build/{pagination-KaIvHBzi.mjs → pagination-DTAconUo.mjs} +2 -2
  238. package/.output/server/chunks/build/{pagination-KaIvHBzi.mjs.map → pagination-DTAconUo.mjs.map} +1 -1
  239. package/.output/server/chunks/build/{permissions-CVTfixZj.mjs → permissions-DgXQZSyx.mjs} +6 -6
  240. package/.output/server/chunks/build/{permissions-CVTfixZj.mjs.map → permissions-DgXQZSyx.mjs.map} +1 -1
  241. package/.output/server/chunks/build/{schedules-BLhn2CLn.mjs → schedules-dSnr8url.mjs} +6 -6
  242. package/.output/server/chunks/build/{schedules-BLhn2CLn.mjs.map → schedules-dSnr8url.mjs.map} +1 -1
  243. package/.output/server/chunks/build/{select--XFl7CtY.mjs → select-B3Dsb9yq.mjs} +3 -3
  244. package/.output/server/chunks/build/{select--XFl7CtY.mjs.map → select-B3Dsb9yq.mjs.map} +1 -1
  245. package/.output/server/chunks/build/{settings-DIf_iYdu.mjs → settings-BrIhnS2Z.mjs} +2 -2
  246. package/.output/server/chunks/build/{settings-DIf_iYdu.mjs.map → settings-BrIhnS2Z.mjs.map} +1 -1
  247. package/.output/server/chunks/build/{table-DIu_YCJN.mjs → table-CmVD-cA9.mjs} +4 -4
  248. package/.output/server/chunks/build/{table-DIu_YCJN.mjs.map → table-CmVD-cA9.mjs.map} +1 -1
  249. package/.output/server/chunks/build/{teams-B2J6ouRY.mjs → teams-B1d32eHK.mjs} +4 -4
  250. package/.output/server/chunks/build/{teams-B2J6ouRY.mjs.map → teams-B1d32eHK.mjs.map} +1 -1
  251. package/.output/server/chunks/build/{tokens-DFQGaN2n.mjs → tokens-GYaGJ35Z.mjs} +6 -6
  252. package/.output/server/chunks/build/{tokens-DFQGaN2n.mjs.map → tokens-GYaGJ35Z.mjs.map} +1 -1
  253. package/.output/server/chunks/build/{tools-DWJFnU_t.mjs → tools-s_9U1Djj.mjs} +6 -6
  254. package/.output/server/chunks/build/{tools-DWJFnU_t.mjs.map → tools-s_9U1Djj.mjs.map} +1 -1
  255. package/.output/server/chunks/build/types-D6J7slEa.mjs +6 -2
  256. package/.output/server/chunks/build/useDaqAddNode-D_Rkju0f.mjs +1 -1
  257. package/.output/server/chunks/build/useDaqDetailNode-DeOsDxK5.mjs +1 -1
  258. package/.output/server/chunks/build/useDaqDetailParams-Cm9a9r5G.mjs +1 -1
  259. package/.output/server/chunks/build/useDaqFilters-CctmO03p.mjs +1 -1
  260. package/.output/server/chunks/build/useDaqStream-B9ZBVQrI.mjs +1 -1
  261. package/.output/server/chunks/build/useDaqTemplates-CK37sMfi.mjs +1 -1
  262. package/.output/server/chunks/build/useDcwAddNode-DACVcEHs.mjs +1 -1
  263. package/.output/server/chunks/build/useDcwStream-Dir5ufAU.mjs +1 -1
  264. package/.output/server/chunks/build/{users-BWw0VCr9.mjs → users-DjiVC_tS.mjs} +6 -6
  265. package/.output/server/chunks/build/{users-BWw0VCr9.mjs.map → users-DjiVC_tS.mjs.map} +1 -1
  266. package/.output/server/chunks/routes/api/mcp/workshop.mjs +1 -1
  267. package/.output/server/chunks/routes/api/system/backup/run.post.mjs +2 -2
  268. package/.output/server/chunks/routes/api/workshop/agent-tools/approvals/_id/decide.post.mjs +17 -4
  269. package/.output/server/chunks/routes/api/workshop/agent-tools/approvals/_id/decide.post.mjs.map +1 -1
  270. package/.output/server/chunks/routes/api/workshop/agent-tools/bindings/_id_.delete.mjs +1 -1
  271. package/.output/server/chunks/routes/api/workshop/agent-tools/bindings/_id_.patch.mjs +1 -1
  272. package/.output/server/chunks/routes/api/workshop/agent-tools/bindings/grant.post.mjs +1 -1
  273. package/.output/server/chunks/routes/api/workshop/agent-tools/bindings/revoke.post.mjs +1 -1
  274. package/.output/server/chunks/routes/api/workshop/agent-tools/index.get.mjs +1 -1
  275. package/.output/server/chunks/routes/api/workshop/agent-tools/index.post.mjs +1 -1
  276. package/.output/server/chunks/routes/api/workshop/agent-tools/index2.get.mjs +1 -1
  277. package/.output/server/chunks/routes/api/workshop/agent-tools/invoke.post.mjs +1 -1
  278. package/.output/server/chunks/routes/api/workshop/agent-tools/list.get.mjs +1 -1
  279. package/.output/server/chunks/routes/api/workshop/aml/datasets/_id/preview.get.mjs +1 -1
  280. package/.output/server/chunks/routes/api/workshop/aml/datasets/_id_.delete.mjs +1 -1
  281. package/.output/server/chunks/routes/api/workshop/aml/datasets/_id_.get.mjs +1 -1
  282. package/.output/server/chunks/routes/api/workshop/aml/datasets/_id_.patch.mjs +1 -1
  283. package/.output/server/chunks/routes/api/workshop/aml/env/recheck.post.mjs +1 -1
  284. package/.output/server/chunks/routes/api/workshop/aml/env/uv.post.mjs +1 -1
  285. package/.output/server/chunks/routes/api/workshop/aml/env/venv.post.mjs +1 -1
  286. package/.output/server/chunks/routes/api/workshop/aml/index.get.mjs +1 -1
  287. package/.output/server/chunks/routes/api/workshop/aml/index.post.mjs +1 -1
  288. package/.output/server/chunks/routes/api/workshop/aml/index2.post.mjs +1 -1
  289. package/.output/server/chunks/routes/api/workshop/aml/index3.get.mjs +1 -1
  290. package/.output/server/chunks/routes/api/workshop/aml/index3.post.mjs +1 -1
  291. package/.output/server/chunks/routes/api/workshop/aml/index4.get.mjs +1 -1
  292. package/.output/server/chunks/routes/api/workshop/aml/index5.get.mjs +1 -1
  293. package/.output/server/chunks/routes/api/workshop/aml/index6.get.mjs +1 -1
  294. package/.output/server/chunks/routes/api/workshop/aml/index7.get.mjs +1 -1
  295. package/.output/server/chunks/routes/api/workshop/aml/jobs/_id/cancel.post.mjs +1 -1
  296. package/.output/server/chunks/routes/api/workshop/aml/jobs/_id/logs.get.mjs +1 -1
  297. package/.output/server/chunks/routes/api/workshop/aml/jobs/_id/retry.post.mjs +1 -1
  298. package/.output/server/chunks/routes/api/workshop/aml/jobs/_id_.delete.mjs +1 -1
  299. package/.output/server/chunks/routes/api/workshop/aml/jobs/_id_.get.mjs +1 -1
  300. package/.output/server/chunks/routes/api/workshop/aml/models/_id/predict.post.mjs +1 -1
  301. package/.output/server/chunks/routes/api/workshop/aml/models/_id/promote.post.mjs +1 -1
  302. package/.output/server/chunks/routes/api/workshop/aml/models/_id_.delete.mjs +1 -1
  303. package/.output/server/chunks/routes/api/workshop/aml/models/_id_.patch.mjs +8 -2
  304. package/.output/server/chunks/routes/api/workshop/aml/models/_id_.patch.mjs.map +1 -1
  305. package/.output/server/chunks/routes/api/workshop/aml/training-plans/_id/train.post.mjs +1 -1
  306. package/.output/server/chunks/routes/api/workshop/aml/training-plans/_id_.delete.mjs +1 -1
  307. package/.output/server/chunks/routes/api/workshop/aml/training-plans/_id_.patch.mjs +1 -1
  308. package/.output/server/chunks/routes/api/workshop/aml/twin/providers.get.mjs +1 -1
  309. package/.output/server/chunks/routes/api/workshop/analysis/_id_.delete.mjs +1 -1
  310. package/.output/server/chunks/routes/api/workshop/analysis/_id_.get.mjs +1 -1
  311. package/.output/server/chunks/routes/api/workshop/analysis/_id_.patch.mjs +1 -1
  312. package/.output/server/chunks/routes/api/workshop/approvals/_id/decide.post.mjs +1 -1
  313. package/.output/server/chunks/routes/api/workshop/assets/index.post.mjs +1 -1
  314. package/.output/server/chunks/routes/api/workshop/assets/index2.post.mjs +1 -1
  315. package/.output/server/chunks/routes/api/workshop/channel-templates/_id/instantiate.post.mjs +2 -2
  316. package/.output/server/chunks/routes/api/workshop/channels/_id/activate.post.mjs +1 -1
  317. package/.output/server/chunks/routes/api/workshop/channels/_id/chat/index.post.mjs +1 -1
  318. package/.output/server/chunks/routes/api/workshop/channels/_id/index.post.mjs +1 -1
  319. package/.output/server/chunks/routes/api/workshop/channels/_id/index.put.mjs +1 -1
  320. package/.output/server/chunks/routes/api/workshop/channels/_id/index2.put.mjs +1 -1
  321. package/.output/server/chunks/routes/api/workshop/channels/_id/index3.post.mjs +1 -1
  322. package/.output/server/chunks/routes/api/workshop/channels/_id/index4.post.mjs +1 -1
  323. package/.output/server/chunks/routes/api/workshop/channels/_id/index5.get.mjs +1 -1
  324. package/.output/server/chunks/routes/api/workshop/channels/_id/line.put.mjs +1 -1
  325. package/.output/server/chunks/routes/api/workshop/channels/_id/members/join.post.mjs +1 -1
  326. package/.output/server/chunks/routes/api/workshop/channels/_id/terminals.get.mjs +1 -1
  327. package/.output/server/chunks/routes/api/workshop/channels/_id/tools/reset.post.mjs +1 -1
  328. package/.output/server/chunks/routes/api/workshop/channels/_id/twin-profile.get.mjs +1 -1
  329. package/.output/server/chunks/routes/api/workshop/channels/_id/twin-profile.patch.mjs +1 -1
  330. package/.output/server/chunks/routes/api/workshop/channels/index.get.mjs +1 -1
  331. package/.output/server/chunks/routes/api/workshop/channels.post.mjs +7 -7
  332. package/.output/server/chunks/routes/api/workshop/daq/_id/bind.post.mjs +1 -1
  333. package/.output/server/chunks/routes/api/workshop/daq/_id/bindings.put.mjs +1 -1
  334. package/.output/server/chunks/routes/api/workshop/daq/_id/frames/content.get.mjs +1 -1
  335. package/.output/server/chunks/routes/api/workshop/daq/_id/frames.get.mjs +1 -1
  336. package/.output/server/chunks/routes/api/workshop/daq/_id/ingest.post.mjs +2 -2
  337. package/.output/server/chunks/routes/api/workshop/daq/_id/samples.get.mjs +1 -1
  338. package/.output/server/chunks/routes/api/workshop/daq/_id/test.post.mjs +1 -1
  339. package/.output/server/chunks/routes/api/workshop/daq/_id_.delete.mjs +1 -1
  340. package/.output/server/chunks/routes/api/workshop/daq/_id_.patch.mjs +1 -1
  341. package/.output/server/chunks/routes/api/workshop/daq/alarms/_id/ack.post.mjs +1 -1
  342. package/.output/server/chunks/routes/api/workshop/daq/alarms.get.mjs +1 -1
  343. package/.output/server/chunks/routes/api/workshop/daq/controller.post.mjs +1 -1
  344. package/.output/server/chunks/routes/api/workshop/daq/export/_id_.get.mjs +1 -1
  345. package/.output/server/chunks/routes/api/workshop/daq/index2.post.mjs +1 -1
  346. package/.output/server/chunks/routes/api/workshop/daq/infra/reconnect.post.mjs +1 -1
  347. package/.output/server/chunks/routes/api/workshop/daq/infra.get.mjs +1 -1
  348. package/.output/server/chunks/routes/api/workshop/daq/templates/_key_.delete.mjs +1 -1
  349. package/.output/server/chunks/routes/api/workshop/daq/templates/_key_.patch.mjs +1 -1
  350. package/.output/server/chunks/routes/api/workshop/daq/test-driver.post.mjs +1 -1
  351. package/.output/server/chunks/routes/api/workshop/dcw/_id/bind.post.mjs +1 -1
  352. package/.output/server/chunks/routes/api/workshop/dcw/_id/bindings.put.mjs +1 -1
  353. package/.output/server/chunks/routes/api/workshop/dcw/_id/param-ledger.get.mjs +1 -1
  354. package/.output/server/chunks/routes/api/workshop/dcw/_id/read.post.mjs +1 -1
  355. package/.output/server/chunks/routes/api/workshop/dcw/_id/test.post.mjs +1 -1
  356. package/.output/server/chunks/routes/api/workshop/dcw/_id/write.post.mjs +1 -1
  357. package/.output/server/chunks/routes/api/workshop/dcw/_id_.delete.mjs +1 -1
  358. package/.output/server/chunks/routes/api/workshop/dcw/_id_.patch.mjs +1 -1
  359. package/.output/server/chunks/routes/api/workshop/dcw/controller.post.mjs +1 -1
  360. package/.output/server/chunks/routes/api/workshop/dcw/index.get.mjs +1 -1
  361. package/.output/server/chunks/routes/api/workshop/dcw/index.post.mjs +1 -1
  362. package/.output/server/chunks/routes/api/workshop/dcw/index2.get.mjs +1 -1
  363. package/.output/server/chunks/routes/api/workshop/dcw/index2.post.mjs +1 -1
  364. package/.output/server/chunks/routes/api/workshop/dcw/index3.get.mjs +1 -1
  365. package/.output/server/chunks/routes/api/workshop/dcw/index3.post.mjs +1 -1
  366. package/.output/server/chunks/routes/api/workshop/dcw/index4.get.mjs +1 -1
  367. package/.output/server/chunks/routes/api/workshop/dcw/index4.post.mjs +1 -1
  368. package/.output/server/chunks/routes/api/workshop/dcw/index5.get.mjs +1 -1
  369. package/.output/server/chunks/routes/api/workshop/dcw/index5.post.mjs +1 -1
  370. package/.output/server/chunks/routes/api/workshop/dcw/index6.get.mjs +1 -1
  371. package/.output/server/chunks/routes/api/workshop/dcw/index7.get.mjs +1 -1
  372. package/.output/server/chunks/routes/api/workshop/dcw/journal/node/_nodeId/rollback.post.mjs +1 -1
  373. package/.output/server/chunks/routes/api/workshop/dcw/line/query.get.mjs +1 -1
  374. package/.output/server/chunks/routes/api/workshop/dcw/lines/_id/start.post.mjs +1 -1
  375. package/.output/server/chunks/routes/api/workshop/dcw/lines/_id/stop.post.mjs +1 -1
  376. package/.output/server/chunks/routes/api/workshop/dcw/lines/_id_.delete.mjs +1 -1
  377. package/.output/server/chunks/routes/api/workshop/dcw/lines/_id_.patch.mjs +1 -1
  378. package/.output/server/chunks/routes/api/workshop/dcw/mes-artifacts/file.get.mjs +1 -1
  379. package/.output/server/chunks/routes/api/workshop/dcw/mes-hook-test.post.mjs +1 -1
  380. package/.output/server/chunks/routes/api/workshop/dcw/mes-test-read.post.mjs +1 -1
  381. package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id/judge.post.mjs +1 -1
  382. package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id/rollback.post.mjs +1 -1
  383. package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id/series.get.mjs +1 -1
  384. package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id_.get.mjs +1 -1
  385. package/.output/server/chunks/routes/api/workshop/dcw/params/_id/read.post.mjs +1 -1
  386. package/.output/server/chunks/routes/api/workshop/dcw/params/_id/write.post.mjs +1 -1
  387. package/.output/server/chunks/routes/api/workshop/dcw/params/_id_.delete.mjs +1 -1
  388. package/.output/server/chunks/routes/api/workshop/dcw/params/_id_.patch.mjs +1 -1
  389. package/.output/server/chunks/routes/api/workshop/dcw/products/_id_.delete.mjs +1 -1
  390. package/.output/server/chunks/routes/api/workshop/dcw/products/_id_.patch.mjs +1 -1
  391. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/apply.post.mjs +1 -1
  392. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/mark-good.post.mjs +1 -1
  393. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/revert.post.mjs +1 -1
  394. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/rollback-good.post.mjs +1 -1
  395. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/versions.get.mjs +1 -1
  396. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id_.delete.mjs +1 -1
  397. package/.output/server/chunks/routes/api/workshop/dcw/recipes/index.patch.mjs +1 -1
  398. package/.output/server/chunks/routes/api/workshop/dcw/runs/_id/close.post.mjs +1 -1
  399. package/.output/server/chunks/routes/api/workshop/dcw/runs/_id/data.get.mjs +1 -1
  400. package/.output/server/chunks/routes/api/workshop/dcw/runs/_id/rollback.post.mjs +1 -1
  401. package/.output/server/chunks/routes/api/workshop/dcw/templates/_key_.delete.mjs +1 -1
  402. package/.output/server/chunks/routes/api/workshop/dcw/templates/_key_.patch.mjs +1 -1
  403. package/.output/server/chunks/routes/api/workshop/dcw/test-driver.post.mjs +1 -1
  404. package/.output/server/chunks/routes/api/workshop/device-twins/_id/control.post.mjs +1 -1
  405. package/.output/server/chunks/routes/api/workshop/device-twins/_id/telemetry.post.mjs +1 -1
  406. package/.output/server/chunks/routes/api/workshop/device-twins/_id_.delete.mjs +1 -1
  407. package/.output/server/chunks/routes/api/workshop/device-twins/_id_.patch.mjs +1 -1
  408. package/.output/server/chunks/routes/api/workshop/eda/commonality.get.mjs +1 -1
  409. package/.output/server/chunks/routes/api/workshop/eda/features/run.post.mjs +1 -1
  410. package/.output/server/chunks/routes/api/workshop/eda/index3.get.mjs +1 -1
  411. package/.output/server/chunks/routes/api/workshop/eda/index6.get.mjs +1 -1
  412. package/.output/server/chunks/routes/api/workshop/eda/index6.post.mjs +1 -1
  413. package/.output/server/chunks/routes/api/workshop/eda/runs/_id/labels.patch.mjs +1 -1
  414. package/.output/server/chunks/routes/api/workshop/eda/runs.get.mjs +1 -1
  415. package/.output/server/chunks/routes/api/workshop/eda/vm/predict.post.mjs +1 -1
  416. package/.output/server/chunks/routes/api/workshop/exp/confirmations/_id/decide.post.mjs +1 -1
  417. package/.output/server/chunks/routes/api/workshop/exp/index.get.mjs +1 -1
  418. package/.output/server/chunks/routes/api/workshop/fs/dirs.get.mjs +1 -1
  419. package/.output/server/chunks/routes/api/workshop/harnesses/_id/providers.get.mjs +1 -1
  420. package/.output/server/chunks/routes/api/workshop/harnesses.get.mjs +1 -1
  421. package/.output/server/chunks/routes/api/workshop/hitl/pending.get.mjs +1 -1
  422. package/.output/server/chunks/routes/api/workshop/hitl/respond.post.mjs +1 -1
  423. package/.output/server/chunks/routes/api/workshop/index.mjs +62 -0
  424. package/.output/server/chunks/routes/api/workshop/index.mjs.map +1 -0
  425. package/.output/server/chunks/routes/api/workshop/index.put.mjs +1 -1
  426. package/.output/server/chunks/routes/api/workshop/index10.get.mjs +1 -1
  427. package/.output/server/chunks/routes/api/workshop/index11.get.mjs +1 -1
  428. package/.output/server/chunks/routes/api/workshop/index12.get.mjs +1 -1
  429. package/.output/server/chunks/routes/api/workshop/index2.get.mjs +1 -1
  430. package/.output/server/chunks/routes/api/workshop/index3.get.mjs +1 -1
  431. package/.output/server/chunks/routes/api/workshop/index3.post.mjs +1 -1
  432. package/.output/server/chunks/routes/api/workshop/index4.post.mjs +1 -1
  433. package/.output/server/chunks/routes/api/workshop/index5.post.mjs +1 -1
  434. package/.output/server/chunks/routes/api/workshop/index6.get.mjs +1 -1
  435. package/.output/server/chunks/routes/api/workshop/index6.post.mjs +1 -1
  436. package/.output/server/chunks/routes/api/workshop/index7.get.mjs +1 -1
  437. package/.output/server/chunks/routes/api/workshop/index8.get.mjs +1 -1
  438. package/.output/server/chunks/routes/api/workshop/mes/datasets.get.mjs +1 -1
  439. package/.output/server/chunks/routes/api/workshop/mes/preview.post.mjs +1 -1
  440. package/.output/server/chunks/routes/api/workshop/ontology/drafts/_draftId/autofix.mjs +52 -0
  441. package/.output/server/chunks/routes/api/workshop/ontology/drafts/_draftId/autofix.mjs.map +1 -0
  442. package/.output/server/chunks/routes/api/workshop/ontology/drafts/_draftId/compile.mjs +54 -0
  443. package/.output/server/chunks/routes/api/workshop/ontology/drafts/_draftId/compile.mjs.map +1 -0
  444. package/.output/server/chunks/routes/api/workshop/ontology/drafts/_draftId/evidence.mjs +51 -0
  445. package/.output/server/chunks/routes/api/workshop/ontology/drafts/_draftId/evidence.mjs.map +1 -0
  446. package/.output/server/chunks/routes/api/workshop/ontology/drafts/_draftId/publish.mjs +67 -0
  447. package/.output/server/chunks/routes/api/workshop/ontology/drafts/_draftId/publish.mjs.map +1 -0
  448. package/.output/server/chunks/routes/api/workshop/ontology/drafts/_draftId/rules/_ruleId/approval-decision.mjs +49 -0
  449. package/.output/server/chunks/routes/api/workshop/ontology/drafts/_draftId/rules/_ruleId/approval-decision.mjs.map +1 -0
  450. package/.output/server/chunks/routes/api/workshop/ontology/drafts/_draftId/rules/_ruleId/approval.mjs +35 -0
  451. package/.output/server/chunks/routes/api/workshop/ontology/drafts/_draftId/rules/_ruleId/approval.mjs.map +1 -0
  452. package/.output/server/chunks/routes/api/workshop/ontology/drafts/_draftId/rules/_ruleId/transition.mjs +49 -0
  453. package/.output/server/chunks/routes/api/workshop/ontology/drafts/_draftId/rules/_ruleId/transition.mjs.map +1 -0
  454. package/.output/server/chunks/routes/api/workshop/ontology/drafts/_draftId/subgraph.mjs +38 -0
  455. package/.output/server/chunks/routes/api/workshop/ontology/drafts/_draftId/subgraph.mjs.map +1 -0
  456. package/.output/server/chunks/routes/api/workshop/ontology/drafts/_draftId/validate.mjs +35 -0
  457. package/.output/server/chunks/routes/api/workshop/ontology/drafts/_draftId/validate.mjs.map +1 -0
  458. package/.output/server/chunks/routes/api/workshop/ontology/drafts/_draftId_.mjs +70 -0
  459. package/.output/server/chunks/routes/api/workshop/ontology/drafts/_draftId_.mjs.map +1 -0
  460. package/.output/server/chunks/routes/api/workshop/ontology/export/_ontologyId_.mjs +64 -0
  461. package/.output/server/chunks/routes/api/workshop/ontology/export/_ontologyId_.mjs.map +1 -0
  462. package/.output/server/chunks/routes/api/workshop/ontology/index.mjs +44 -0
  463. package/.output/server/chunks/routes/api/workshop/ontology/index.mjs.map +1 -0
  464. package/.output/server/chunks/routes/api/workshop/ontology/scene.mjs +43 -0
  465. package/.output/server/chunks/routes/api/workshop/ontology/scene.mjs.map +1 -0
  466. package/.output/server/chunks/routes/api/workshop/ontology/traces/_ontologyId_.mjs +38 -0
  467. package/.output/server/chunks/routes/api/workshop/ontology/traces/_ontologyId_.mjs.map +1 -0
  468. package/.output/server/chunks/routes/api/workshop/ontology/versions/_ontologyId/compare.mjs +40 -0
  469. package/.output/server/chunks/routes/api/workshop/ontology/versions/_ontologyId/compare.mjs.map +1 -0
  470. package/.output/server/chunks/routes/api/workshop/ontology/versions/_ontologyId_.mjs +63 -0
  471. package/.output/server/chunks/routes/api/workshop/ontology/versions/_ontologyId_.mjs.map +1 -0
  472. package/.output/server/chunks/routes/api/workshop/optimization/capabilities.get.mjs +1 -1
  473. package/.output/server/chunks/routes/api/workshop/optimization/index.get.mjs +1 -1
  474. package/.output/server/chunks/routes/api/workshop/optimization/index.mjs +1 -1
  475. package/.output/server/chunks/routes/api/workshop/optimization/index2.mjs +1 -1
  476. package/.output/server/chunks/routes/api/workshop/optimization/profiles/_id/publish.post.mjs +1 -1
  477. package/.output/server/chunks/routes/api/workshop/optimization/recommendations/_id/crosscheck.post.mjs +1 -1
  478. package/.output/server/chunks/routes/api/workshop/optimization/recommendations/_id/dispatch.post.mjs +1 -1
  479. package/.output/server/chunks/routes/api/workshop/optimization/solve.post.mjs +1 -1
  480. package/.output/server/chunks/routes/api/workshop/plugins/_name/disable.post.mjs +1 -1
  481. package/.output/server/chunks/routes/api/workshop/plugins/_name/enable.post.mjs +1 -1
  482. package/.output/server/chunks/routes/api/workshop/process-model/datasets.post.mjs +1 -1
  483. package/.output/server/chunks/routes/api/workshop/process-model/eligibility.mjs +1 -1
  484. package/.output/server/chunks/routes/api/workshop/process-model/experiments.mjs +1 -1
  485. package/.output/server/chunks/routes/api/workshop/process-model/index.mjs +1 -1
  486. package/.output/server/chunks/routes/api/workshop/process-model/specs/_id/publish.post.mjs +1 -1
  487. package/.output/server/chunks/routes/api/workshop/process-model/train.post.mjs +1 -1
  488. package/.output/server/chunks/routes/api/workshop/scene/layouts/_channelId_.delete.mjs +1 -1
  489. package/.output/server/chunks/routes/api/workshop/scene/layouts/_channelId_.put.mjs +1 -1
  490. package/.output/server/chunks/routes/api/workshop/teams/_id/deploy.post.mjs +1 -1
  491. package/.output/server/chunks/routes/api/workshop/teams/_id/index.put.mjs +1 -1
  492. package/.output/server/chunks/routes/api/workshop/teams/_id/index2.get.mjs +1 -1
  493. package/.output/server/chunks/routes/api/workshop/tools/_name_.get.mjs +1 -1
  494. package/.output/server/chunks/routes/api/workshop/tools/sync.post.mjs +1 -1
  495. package/.output/server/chunks/routes/api/workshop/workspaces/_id/channel-templates/_tplId_.post.mjs +2 -2
  496. package/.output/server/chunks/routes/renderer.mjs +2 -2
  497. package/.output/server/chunks/virtual/entry.mjs +323 -18
  498. package/.output/server/chunks/virtual/precomputed.mjs +1 -1
  499. package/.output/server/package.json +1 -1
  500. package/README-zh.md +28 -6
  501. package/README.md +26 -4
  502. package/app/components/AppSidebar.vue +1 -0
  503. package/app/components/aml/AmlModelsTable.vue +5 -0
  504. package/app/components/ontology/OntologyGraph.vue +356 -0
  505. package/app/pages/aml/styles.css +1 -0
  506. package/app/pages/ontology/api.ts +18 -0
  507. package/app/pages/ontology/index.vue +1062 -0
  508. package/app/pages/ontology/types.ts +164 -0
  509. package/app/pages/optimizer/index.vue +21 -4
  510. package/config.yml +1 -1
  511. package/docs/cli.en.md +2 -2
  512. package/docs/cli.md +2 -2
  513. package/docs/plugins.en.md +1 -1
  514. package/docs/plugins.md +1 -1
  515. package/docs/sdk.en.md +1 -1
  516. package/docs/sdk.md +1 -1
  517. package/i18n/locales/en.ts +84 -0
  518. package/i18n/locales/zh-CN.ts +84 -0
  519. package/mcp/aw-mcp-server.mjs +53 -1
  520. package/package.json +1 -1
  521. package/scripts/docs-shots.mjs +36 -0
  522. package/scripts/e2e-direct-rest-simulator-paper.mjs +624 -0
  523. package/scripts/e2e-idd-results.mjs +177 -0
  524. package/scripts/e2e-model-loop-live.mjs +785 -0
  525. package/scripts/e2e-ontology-live.mjs +909 -0
  526. package/scripts/e2e-ontology.mjs +393 -0
  527. package/scripts/e2e-pi-simulator-paper.mjs +2316 -0
  528. package/scripts/e2e-registered-harness-simulator-paper.mjs +1926 -0
  529. package/scripts/e2e-simulator-optimizer-paper.mjs +264 -0
  530. package/scripts/fixtures/omp-paper-harness.mjs +163 -0
  531. package/scripts/ontology-idd-rag-e2e.mjs +449 -0
  532. package/sdk/context.mjs +6 -0
  533. package/sdk/index.d.mts +2 -0
  534. package/server/api/workshop/agent-tools/approvals/[id]/decide.post.ts +16 -0
  535. package/server/api/workshop/aml/models/[id].patch.ts +36 -30
  536. package/server/api/workshop/ontology/drafts/[draftId]/autofix.ts +31 -0
  537. package/server/api/workshop/ontology/drafts/[draftId]/compile.ts +39 -0
  538. package/server/api/workshop/ontology/drafts/[draftId]/evidence.ts +33 -0
  539. package/server/api/workshop/ontology/drafts/[draftId]/publish.ts +44 -0
  540. package/server/api/workshop/ontology/drafts/[draftId]/rules/[ruleId]/approval-decision.ts +28 -0
  541. package/server/api/workshop/ontology/drafts/[draftId]/rules/[ruleId]/approval.ts +17 -0
  542. package/server/api/workshop/ontology/drafts/[draftId]/rules/[ruleId]/transition.ts +32 -0
  543. package/server/api/workshop/ontology/drafts/[draftId]/subgraph.ts +24 -0
  544. package/server/api/workshop/ontology/drafts/[draftId]/validate.ts +16 -0
  545. package/server/api/workshop/ontology/drafts/[draftId].ts +52 -0
  546. package/server/api/workshop/ontology/drafts/index.ts +20 -0
  547. package/server/api/workshop/ontology/export/[ontologyId].ts +50 -0
  548. package/server/api/workshop/ontology/index.ts +38 -0
  549. package/server/api/workshop/ontology/scene.ts +34 -0
  550. package/server/api/workshop/ontology/traces/[ontologyId].ts +19 -0
  551. package/server/api/workshop/ontology/versions/[ontologyId]/compare.ts +21 -0
  552. package/server/api/workshop/ontology/versions/[ontologyId].ts +42 -0
  553. package/server/plugins-builtin/diag-bridge/client.mjs +390 -239
  554. package/server/plugins-builtin/diag-bridge/host/helpers.mjs +80 -0
  555. package/server/plugins-builtin/diag-bridge/host/plugin.mjs +264 -2
  556. package/server/plugins-builtin/diag-bridge/i18n.json +84 -4
  557. package/server/services/workshop/agents/adapters/omp-rpc-client/frames.ts +129 -111
  558. package/server/services/workshop/agents/hitl-decision/dispatcher.ts +15 -0
  559. package/server/services/workshop/agents/host-tool-bridge/tools/industrial.ts +17 -2
  560. package/server/services/workshop/agents/industrial/aml-job-tools.ts +602 -569
  561. package/server/services/workshop/agents/industrial/grant-guard.ts +73 -0
  562. package/server/services/workshop/agents/industrial/index.ts +38 -32
  563. package/server/services/workshop/agents/industrial/ontology-tools.ts +380 -0
  564. package/server/services/workshop/agents/industrial/ops-tools.ts +54 -16
  565. package/server/services/workshop/agents/industrial/optimizer-tools.ts +81 -0
  566. package/server/services/workshop/agents/industrial/recipe-gate.ts +19 -6
  567. package/server/services/workshop/agents/industrial/recipe-propose-tools.ts +1 -1
  568. package/server/services/workshop/agents/industrial/tool-verify.ts +32 -2
  569. package/server/services/workshop/agents/omp-agent/supervision-history.ts +38 -0
  570. package/server/services/workshop/agents/omp-agent/tools-steer.ts +18 -1
  571. package/server/services/workshop/agents/tool-reference-spec.ts +1 -1
  572. package/server/services/workshop/aml/aml.repo.ts +16 -0
  573. package/server/services/workshop/aml/twin/physics-spec.ts +6 -22
  574. package/server/services/workshop/daq/bus/index.ts +12 -5
  575. package/server/services/workshop/daq/storage/index.ts +6 -5
  576. package/server/services/workshop/daq/storage/sqlite.adapter.ts +25 -13
  577. package/server/services/workshop/db/database/open.ts +97 -95
  578. package/server/services/workshop/db/database/schema.ts +156 -1
  579. package/server/services/workshop/ontology/autofix.ts +198 -0
  580. package/server/services/workshop/ontology/compiler.ts +474 -0
  581. package/server/services/workshop/ontology/contracts.ts +443 -0
  582. package/server/services/workshop/ontology/guards.ts +139 -0
  583. package/server/services/workshop/ontology/index.ts +12 -0
  584. package/server/services/workshop/ontology/ontology.service.ts +938 -0
  585. package/server/services/workshop/ontology/repo.ts +449 -0
  586. package/server/services/workshop/ontology/semantic-binding.service.ts +226 -0
  587. package/server/services/workshop/ontology/subgraph.core.ts +300 -0
  588. package/server/services/workshop/ontology/subgraph.service.ts +113 -0
  589. package/server/services/workshop/ontology/validator.ts +218 -0
  590. package/server/services/workshop/optimization/binding.repo.ts +7 -0
  591. package/server/services/workshop/optimization/contracts.ts +16 -0
  592. package/server/services/workshop/optimization/dispatch.service.ts +16 -0
  593. package/server/services/workshop/optimization/profile-adopt.service.ts +261 -0
  594. package/server/services/workshop/optimization/profile.repo.ts +24 -6
  595. package/server/services/workshop/optimization/python/__pycache__/problems.cpython-312.pyc +0 -0
  596. package/shared/dimensions.ts +124 -0
  597. package/.output/public/_nuxt/B3Y5bCrM.js +0 -1
  598. package/.output/public/_nuxt/B7s2qeyT.js +0 -14
  599. package/.output/public/_nuxt/B8N8nsad2.js +0 -2
  600. package/.output/public/_nuxt/BO0BJx3w.js +0 -8
  601. package/.output/public/_nuxt/BWn-lfCp2.js +0 -1
  602. package/.output/public/_nuxt/Bcs9zzO62.js +0 -1
  603. package/.output/public/_nuxt/BwO2Y5FH2.js +0 -1
  604. package/.output/public/_nuxt/C-LU6xv_.js +0 -1
  605. package/.output/public/_nuxt/CJ0bjZ6v2.js +0 -1
  606. package/.output/public/_nuxt/CJ3Vul2u.js +0 -1
  607. package/.output/public/_nuxt/CNwx04ln.js +0 -84
  608. package/.output/public/_nuxt/CVCscYzb2.js +0 -1
  609. package/.output/public/_nuxt/C_A0MCol2.js +0 -1
  610. package/.output/public/_nuxt/CnP6snIz.js +0 -3
  611. package/.output/public/_nuxt/D3buuIkE.js +0 -1
  612. package/.output/public/_nuxt/D4_INWgq.js +0 -1
  613. package/.output/public/_nuxt/D5kCimyw.js +0 -1
  614. package/.output/public/_nuxt/DBtXLkyA.js +0 -1
  615. package/.output/public/_nuxt/DHURbGkn2.js +0 -1
  616. package/.output/public/_nuxt/DaBzS-iu.js +0 -1
  617. package/.output/public/_nuxt/DnlhV7Xe.js +0 -1
  618. package/.output/public/_nuxt/GtI6PUI32.js +0 -1
  619. package/.output/public/_nuxt/LHIav-Kv.js +0 -1
  620. package/.output/public/_nuxt/Nw_6OpQZ.js +0 -1
  621. package/.output/public/_nuxt/RuMLNeQE.js +0 -1
  622. package/.output/public/_nuxt/Y4sMSPrS.js +0 -1
  623. package/.output/public/_nuxt/aml.CeLxRzvI.css +0 -1
  624. package/.output/public/_nuxt/builds/meta/0ae8cb0f-6ce5-4096-9692-9b1fc197b30d.json +0 -1
  625. package/.output/public/_nuxt/goF_oZHF.js +0 -2
  626. package/.output/public/_nuxt/optimizer.B8gCbU1b.css +0 -1
  627. package/.output/public/_nuxt/rJ7To74v2.js +0 -1
  628. package/.output/server/chunks/build/optimizer-BOtGWEtc.mjs +0 -200
  629. package/.output/server/chunks/build/optimizer-BOtGWEtc.mjs.map +0 -1
@@ -16,7 +16,7 @@ import { getDcwParamRepo } from '../../dcw/param-map.repo'
16
16
  import { getOps } from '../../ops/ops'
17
17
  import { settingOf } from '../../settings'
18
18
  import { fanoutQuery, windowOf } from './audit-query'
19
- import { assertRecipeCreate, assertRecipeOperation, recipeApprovalPayload } from './recipe-gate'
19
+ import { assertRecipeCreate, assertRecipeOperation, recipeApprovalPayload, type ActiveRecipeContext } from './recipe-gate'
20
20
 
21
21
  // ================================================================
22
22
  // 运维日志 / Recipe 变更史查询(Agent 自查面:负责产线 scoped)
@@ -779,7 +779,7 @@ export async function toolRecipeUpdate(agentId: string, args: {
779
779
  const old = recipe.params.find(x => x.nodeId === String(p.node_id).trim())?.value
780
780
  return { nodeId: String(p.node_id).trim(), name: node?.name ?? String(p.node_id), from: old ?? null, to: Number(p.value), unit: node?.unit }
781
781
  }),
782
- runId: gate.activeRunId,
782
+ context: gate.activeContext,
783
783
  }) },
784
784
  )
785
785
  if (!gateDecision.approved) {
@@ -788,7 +788,7 @@ export async function toolRecipeUpdate(agentId: string, args: {
788
788
  }
789
789
  }
790
790
  if (gateDecision.comment) hitlNote = `\n人工附言:${gateDecision.comment}`
791
- const stale = await revalidateApprovedAction(agentId, recipe, 'update', 'recipe_update', { recipe_id: recipeId })
791
+ const stale = await revalidateApprovedAction(agentId, recipe, 'update', 'recipe_update', { recipe_id: recipeId }, gate.activeContext)
792
792
  if (stale) return stale
793
793
  }
794
794
  // 旧值快照(repo.update 原地改写 recipe.params,事后再取会把 before 读成新值)
@@ -887,7 +887,7 @@ export async function toolRecipeRollback(agentId: string, args: {
887
887
  recipe.id,
888
888
  `${emergency ? '【应急豁免频控】' : ''}配方回退:「${recipe.name}」→ ${toLastGood ? '已知良好批次冻结' : `v${version}`}${dispatch ? '(统一回退:定义回退+整批重下发)' : '(仅定义回退)'} | 理由:${reason} | 批准=执行回退;拒绝可附指导`,
889
889
  `${emergency ? '【应急】' : ''}配方回退审批`,
890
- { payload: { ...recipeApprovalPayload('rollback', recipe.id, recipe.name, { reason, runId: gate.activeRunId }), ...(emergency ? { emergency: true } : {}) } },
890
+ { payload: { ...recipeApprovalPayload('rollback', recipe.id, recipe.name, { reason, context: gate.activeContext }), ...(emergency ? { emergency: true } : {}) } },
891
891
  )
892
892
  gateApprovalId = gateDecision.id
893
893
  if (!gateDecision.approved) {
@@ -896,11 +896,15 @@ export async function toolRecipeRollback(agentId: string, args: {
896
896
  }
897
897
  }
898
898
  if (gateDecision.comment) hitlNote = `\n人工附言:${gateDecision.comment}`
899
- const stale = await revalidateApprovedAction(agentId, recipe, 'rollback', 'recipe_rollback', { recipe_id: recipeId })
899
+ const stale = await revalidateApprovedAction(agentId, recipe, 'rollback', 'recipe_rollback', { recipe_id: recipeId }, gate.activeContext)
900
900
  if (stale) return stale
901
901
  }
902
902
  try {
903
903
  if (dispatch) {
904
+ if (gate.hitlRequired) {
905
+ const staleAtDispatch = approvedContextError(agentId, recipe, 'rollback', gate.activeContext)
906
+ if (staleAtDispatch) return staleAtDispatch
907
+ }
904
908
  const { recipe: updated, run, definitionNoop } = await getDcwController().rollbackRecipeAndDispatch(recipeId, {
905
909
  version: toLastGood ? undefined : version,
906
910
  toLastGood,
@@ -979,23 +983,46 @@ async function hitlDispatchGate(agentId: string, recipeId: string, detail: strin
979
983
  }
980
984
 
981
985
  /**
982
- * 审批返回「批准」后的二次授权复核(2026-10-18):审批可能挂起数分钟,
983
- * 期间绑定/产线授权/运行批次都可能被撤销。批准不等于授权仍然有效:
986
+ * 审批返回「批准」后的二次状态复核:审批可能挂起数分钟,
987
+ * 期间绑定/产线授权/活动产线上下文都可能变化。批准不等于授权与上下文仍然有效:
984
988
  * - 重新跑 assertRecipeOperation(绑定/二级认证/运行门);
989
+ * - 将当前 line/product/recipe/run 元组与审批时快照比较,变化即拒绝;
985
990
  * - 重新跑 grant-guard(频道属主的产线 grant,收权即失活)。
986
- * 任一失败 → 本次不执行,回包说明原因(Agent 可据此重新申请)。
991
+ * 任一失败 → 本次不执行,回包说明原因(Agent 可据此核实上下文并重新申请)。
987
992
  */
993
+ function approvedContextError(
994
+ agentId: string,
995
+ recipe: { id: string, name: string, lineId?: string, access?: { requireAuth?: boolean, authorizedAgentIds?: string[] } },
996
+ op: 'update' | 'dispatch' | 'trial' | 'rollback',
997
+ expectedContext: ActiveRecipeContext,
998
+ ): { text: string, isError: true } | null {
999
+ const currentGate = assertRecipeOperation(agentId, recipe, op)
1000
+ if (!currentGate.ok) {
1001
+ return { text: `人工已批准,但审批期间授权已失效,本次未执行:${currentGate.text}`, isError: true }
1002
+ }
1003
+ const current = currentGate.activeContext
1004
+ if (current.lineId !== expectedContext.lineId
1005
+ || current.runId !== expectedContext.runId
1006
+ || current.recipeId !== expectedContext.recipeId
1007
+ || current.productId !== expectedContext.productId) {
1008
+ return {
1009
+ text: '人工已批准,但审批期间产线/产品/配方/批次上下文已变化,本次未执行。请核查当前运行上下文后重新提交。',
1010
+ isError: true,
1011
+ }
1012
+ }
1013
+ return null
1014
+ }
1015
+
988
1016
  export async function revalidateApprovedAction(
989
1017
  agentId: string,
990
1018
  recipe: { id: string, name: string, lineId?: string, access?: { requireAuth?: boolean, authorizedAgentIds?: string[] } },
991
1019
  op: 'update' | 'dispatch' | 'trial' | 'rollback',
992
1020
  toolName: string,
993
1021
  args: Record<string, unknown>,
1022
+ expectedContext: ActiveRecipeContext,
994
1023
  ): Promise<{ text: string, isError: true } | null> {
995
- const again = assertRecipeOperation(agentId, recipe, op)
996
- if (!again.ok) {
997
- return { text: `人工已批准,但审批期间授权已失效,本次未执行:${again.text}`, isError: true }
998
- }
1024
+ const initialContextError = approvedContextError(agentId, recipe, op, expectedContext)
1025
+ if (initialContextError) return initialContextError
999
1026
  try {
1000
1027
  // manager 未装配(单测/嵌入)→ 只做绑定与运行门复核;装配后叠加产线 grant 复核
1001
1028
  const g = globalThis as typeof globalThis & {
@@ -1011,6 +1038,11 @@ export async function revalidateApprovedAction(
1011
1038
  catch (err) {
1012
1039
  return { text: `人工已批准,但审批后权限复核不可用,本次未执行:${err instanceof Error ? err.message : String(err)}。请稍后重试。`, isError: true }
1013
1040
  }
1041
+ // Grant lookup is asynchronous. Re-read the active tuple after that await so
1042
+ // queued line/run changes cannot pass between the initial comparison and the
1043
+ // caller's dispatch continuation.
1044
+ const changedAfterGrantCheck = approvedContextError(agentId, recipe, op, expectedContext)
1045
+ if (changedAfterGrantCheck) return changedAfterGrantCheck
1014
1046
  return null
1015
1047
  }
1016
1048
 
@@ -1086,7 +1118,7 @@ export async function toolRecipeTrial(agentId: string, args: {
1086
1118
  const old = recipe.params.find(x => x.nodeId === p.nodeId)?.value
1087
1119
  return { nodeId: p.nodeId, name: node?.name ?? p.nodeId, from: old ?? null, to: p.value, unit: node?.unit }
1088
1120
  }),
1089
- runId: gate.activeRunId,
1121
+ context: gate.activeContext,
1090
1122
  }), ...(emergency ? { emergency: true } : {}) } },
1091
1123
  )
1092
1124
  gateApprovalId = gateDecision.id
@@ -1097,8 +1129,10 @@ export async function toolRecipeTrial(agentId: string, args: {
1097
1129
  }
1098
1130
  // 人工附言随批准回执回流(Agent 与审计都能看到放行时人的原话)
1099
1131
  if (gateDecision.comment) hitlNote = `\n人工附言:${gateDecision.comment}`
1100
- const stale = await revalidateApprovedAction(agentId, recipe, 'trial', 'recipe_trial', { recipe_id: recipeId })
1132
+ const stale = await revalidateApprovedAction(agentId, recipe, 'trial', 'recipe_trial', { recipe_id: recipeId }, gate.activeContext)
1101
1133
  if (stale) return stale
1134
+ const staleAtDispatch = approvedContextError(agentId, recipe, 'trial', gate.activeContext)
1135
+ if (staleAtDispatch) return staleAtDispatch
1102
1136
  }
1103
1137
  const run = await getDcwController().applyRecipe(recipeId, { overrides: list, trial: true, agentDispatch: true, agentApprovalId: gateApprovalId, emergency })
1104
1138
  // ACK 鉴定三段口径(2026-10-08):ok 只是命令受理,未证实/失败必须如实回给 Agent
@@ -1187,7 +1221,7 @@ export async function toolRecipeApply(agentId: string, args: {
1187
1221
  const node = getDcwController().byId(p.nodeId)
1188
1222
  return { nodeId: p.nodeId, name: node?.name ?? p.nodeId, from: null, to: p.value, unit: node?.unit }
1189
1223
  }),
1190
- runId: gate.activeRunId,
1224
+ context: gate.activeContext,
1191
1225
  }), recipeVersion: dispatch.version, ...(emergency ? { emergency: true } : {}) } },
1192
1226
  )
1193
1227
  gateApprovalId = gateDecision.id
@@ -1198,7 +1232,7 @@ export async function toolRecipeApply(agentId: string, args: {
1198
1232
  }
1199
1233
  // 人工附言随批准回执回流(与 recipe_trial 同口径)
1200
1234
  if (gateDecision.comment) hitlNote = `\n人工附言:${gateDecision.comment}`
1201
- const stale = await revalidateApprovedAction(agentId, recipe, 'dispatch', 'recipe_apply', { recipe_id: recipeId })
1235
+ const stale = await revalidateApprovedAction(agentId, recipe, 'dispatch', 'recipe_apply', { recipe_id: recipeId }, gate.activeContext)
1202
1236
  if (stale) return stale
1203
1237
  }
1204
1238
  // 放在最后一次 await 之后,与 applyRecipe 的同步取值/建批之间不再让出执行权。
@@ -1206,6 +1240,10 @@ export async function toolRecipeApply(agentId: string, args: {
1206
1240
  if (!currentRecipe || JSON.stringify(currentRecipe) !== approvedDefinition) {
1207
1241
  return { text: '配方在审批期间已变更,与本次审批展示的快照不一致,本次未执行。请核查最新配方后重新提交 recipe_apply。', isError: true }
1208
1242
  }
1243
+ if (gate.hitlRequired) {
1244
+ const staleAtDispatch = approvedContextError(agentId, recipe, 'dispatch', gate.activeContext)
1245
+ if (staleAtDispatch) return staleAtDispatch
1246
+ }
1209
1247
  // 完整覆盖集让控制器复制每个已批准值,逐参数异步写期间也不再共享可变配方参数。
1210
1248
  const run = await getDcwController().applyRecipe(recipeId, { overrides: dispatch.params, agentDispatch: true, agentApprovalId: gateApprovalId, emergency })
1211
1249
  // ACK 鉴定三段口径(2026-10-08):ok 只是命令受理,未证实/失败必须如实回给 Agent
@@ -17,6 +17,7 @@ import { getEligibilityRepo } from '../../process-model/eligibility'
17
17
  import { getProcessModelSpecRepo } from '../../process-model/spec.repo'
18
18
  import { cancel, getRunStatus, solve } from '../../optimization/manager'
19
19
  import { assertRecommendationUsable } from '../../optimization/recommendation.service'
20
+ import { proposeProfileAdoption } from '../../optimization/profile-adopt.service'
20
21
  import { deriveDualState } from '../../optimization/crosscheck.service'
21
22
 
22
23
  function ok(payload: unknown): HostToolResult {
@@ -191,3 +192,83 @@ export function hasOptimizerBinding(agentId: string): boolean {
191
192
  return false
192
193
  }
193
194
  }
195
+
196
+ /**
197
+ * 模型采纳提议(OW-adopt):把 AML 新训练登记的模型采纳为指定 Profile 的新版本。
198
+ *
199
+ * AI-first 闭环的"采纳"环节:复制当前已发布 Profile 的全部求解配置 → 换新模型工件 →
200
+ * 草稿新版本 → 挂 HITL 卡等待人类裁决。批准(单一咽喉)= 冻结发布 + 自动重绑所有
201
+ * 绑定在旧版本的 Agent(revision+1,在飞求解 BINDING_STALE 收敛);拒绝/超时 = 零写。
202
+ *
203
+ * 治理:工具属写族(grant-guard operate);Agent 必须已绑定该 Profile(防越权提议);
204
+ * 兼容性(D21 矩阵)在服务层提议时校验;发布仅发生在人类批准后。
205
+ */
206
+ export async function toolOptimizerProfilePropose(agentId: string, args: Record<string, unknown>): Promise<HostToolResult> {
207
+ try {
208
+ const bindings = listBindingsForAgent(agentId)
209
+ if (bindings.length === 0) {
210
+ return { text: '本 Agent 没有优化器绑定;模型采纳必须由已绑定该 Profile 的 Agent 发起(先在 Channel 设置里绑定)。', isError: true }
211
+ }
212
+ const modelId = String(args.model_id ?? '').trim()
213
+ if (!modelId) return { text: 'model_id 必填(aml_job_submit 训练完成登记的模型 id;aml_leaderboard/aml_model_find 可查)。', isError: true }
214
+ const profileId = String(args.profile_id ?? '').trim() || (() => {
215
+ const bound = bindings.map(b => b.profileId)
216
+ return new Set(bound).size === 1 ? bound[0]! : ''
217
+ })()
218
+ if (!profileId) {
219
+ return { text: `本 Agent 绑定了多个 Profile(${bindings.map(b => b.profileId).join(', ')});必须显式传 profile_id。`, isError: true }
220
+ }
221
+ if (!bindings.some(b => b.profileId === profileId)) {
222
+ return { text: `Profile ${profileId} 不在本 Agent 的绑定面内,不能代为提议采纳(越权拒绝)。`, isError: true }
223
+ }
224
+ const reason = String(args.reason ?? '').trim()
225
+ if (!reason) return { text: 'reason 必填:为什么采纳新模型(证据:训练指标对比/互校结论/业务动因)。', isError: true }
226
+
227
+ const result = await proposeProfileAdoption({
228
+ agentInstanceId: agentId,
229
+ initiatorId: agentId,
230
+ initiatorKind: 'agent',
231
+ profileId,
232
+ modelId,
233
+ templateRef: args.template_ref as Parameters<typeof proposeProfileAdoption>[0]['templateRef'],
234
+ solverRef: args.solver_ref as Parameters<typeof proposeProfileAdoption>[0]['solverRef'],
235
+ reason,
236
+ profileName: str(args.profile_name),
237
+ profileDescription: str(args.profile_description),
238
+ })
239
+
240
+ if (!result.decision.approved) {
241
+ return {
242
+ text: [
243
+ `采纳提议未被批准(卡 ${result.cardId}):`,
244
+ `${result.profileId} v${result.priorVersion} → v${result.version}(模型 ${result.modelId})`,
245
+ `裁决:${result.decision.comment || '拒绝/超时'}`,
246
+ '草稿已保留(零写);可修订理由后重新提议,或由管理员经 REST 发布。',
247
+ ].join('\n'),
248
+ isError: true,
249
+ }
250
+ }
251
+ if (!result.published) {
252
+ return {
253
+ text: [
254
+ `⚠️ 采纳提议获批准,但发布未由裁决咽喉完成(卡 ${result.cardId}):`,
255
+ `${result.profileId} v${result.priorVersion} → v${result.version} 仍为草稿;请管理员经 REST/管理面发布,或重新发起采纳。`,
256
+ ].join('\n'),
257
+ isError: true,
258
+ }
259
+ }
260
+ return {
261
+ text: [
262
+ '✅ 模型采纳完成(HITL 批准):',
263
+ `${result.profileId} v${result.priorVersion} → v${result.version}(published)`,
264
+ `模型:${result.modelId};重绑绑定 ${result.rebindCount} 个(revision+1,在飞求解 BINDING_STALE 收敛)`,
265
+ `裁决意见:${result.decision.comment || '(无)'}`,
266
+ '下一次 optimizer_solve 即使用新模型;旧版本保留可回退(retire/rebind 走管理面)。',
267
+ ].join('\n'),
268
+ }
269
+ }
270
+ catch (err) {
271
+ const message = err instanceof AppError ? `${err.code}: ${err.message}` : String(err)
272
+ return { text: `模型采纳提议失败:${message}`, isError: true }
273
+ }
274
+ }
@@ -20,12 +20,19 @@ import { getActiveLineRun } from '../../dcw/line-run'
20
20
 
21
21
  export type RecipeOp = 'update' | 'dispatch' | 'trial' | 'rollback' | 'create'
22
22
 
23
+ export type ActiveRecipeContext = {
24
+ lineId: string
25
+ runId: string
26
+ recipeId: string
27
+ productId: string
28
+ }
29
+
23
30
  export type RecipeGateResult
24
- = | { ok: true, binding: AgentNodeBinding, hitlRequired: boolean, activeRunId: string }
31
+ = | { ok: true, binding: AgentNodeBinding, hitlRequired: boolean, activeContext: ActiveRecipeContext }
25
32
  | { ok: false, text: string }
26
33
 
27
34
  /** 运行门:该配方当前是否有活动批次(未结束的 run) */
28
- export function activeRunOfRecipe(recipeId: string): { id: string } | null {
35
+ export function activeRunOfRecipe(recipeId: string): ActiveRecipeContext | null {
29
36
  const run = getDcwController().listRuns().find(r => r.recipeId === recipeId && !r.endedAt)
30
37
  if (!run) return null
31
38
  // 反僵尸交叉校验(鲁棒性):DB 行未结束 ≠ 产线在运行 —— 多次 apply/崩溃/重启会泄漏
@@ -33,8 +40,13 @@ export function activeRunOfRecipe(recipeId: string): { id: string } | null {
33
40
  // 权威运行态是 line-run 注册表(内存+line-runs.json 落盘,崩溃可恢复):
34
41
  // run 所属产线必须在注册表中运行,且注册表的活跃批次就是本批次。
35
42
  const active = getActiveLineRun(run.lineId)
36
- if (!active || active.runId !== run.id) return null
37
- return { id: run.id }
43
+ if (!active || active.runId !== run.id || active.recipeId !== recipeId) return null
44
+ return {
45
+ lineId: active.lineId,
46
+ runId: active.runId,
47
+ recipeId: active.recipeId,
48
+ productId: active.productId,
49
+ }
38
50
  }
39
51
 
40
52
  /** 统一鉴权门:绑定 → 二级认证 → 运行门;返回绑定与 HITL 判定(不做挂起,挂起由调用方执行) */
@@ -74,7 +86,7 @@ export function assertRecipeOperation(
74
86
  // ⑤ 全局开关兼容位:security.recipeDispatchApproval 开启时即便 auto 也挂审批(保留语义)
75
87
  const globalGate = false // 由调用方按 settingOf('security.recipeDispatchApproval') 叠加(本模块不依赖设置服务)
76
88
  void globalGate
77
- return { ok: true, binding, hitlRequired: binding.mode === 'manual' || lineManual, activeRunId: run.id }
89
+ return { ok: true, binding, hitlRequired: binding.mode === 'manual' || lineManual, activeContext: run }
78
90
  }
79
91
 
80
92
  /** 新建配方的授权门(尚无 recipe 可绑定):要求 Agent 在该线至少有一个写向绑定
@@ -116,6 +128,7 @@ export function assertRecipeCreate(agentId: string, lineId: string): { ok: true,
116
128
  export function recipeApprovalPayload(op: RecipeOp, recipeId: string, recipeName: string, extra: {
117
129
  reason: string
118
130
  params?: Array<{ nodeId: string, name: string, from: number | null, to: number, unit?: string }>
131
+ context?: ActiveRecipeContext
119
132
  runId?: string
120
133
  }): Record<string, unknown> {
121
134
  return {
@@ -126,6 +139,6 @@ export function recipeApprovalPayload(op: RecipeOp, recipeId: string, recipeName
126
139
  recipeName,
127
140
  reason: extra.reason,
128
141
  ...(extra.params ? { params: extra.params } : {}),
129
- ...(extra.runId ? { runId: extra.runId } : {}),
142
+ ...(extra.context ? { context: { ...extra.context }, runId: extra.context.runId } : extra.runId ? { runId: extra.runId } : {}),
130
143
  }
131
144
  }
@@ -278,7 +278,7 @@ export async function toolRecipePropose(agentId: string, args: {
278
278
  }
279
279
 
280
280
  // 批准不等于授权仍有效:复核绑定/认证/运行门/产线 grant(审批期间可能被撤销)
281
- const stale = await revalidateApprovedAction(agentId, recipe, 'dispatch', 'recipe_propose', { recipe_id: recipeId })
281
+ const stale = await revalidateApprovedAction(agentId, recipe, 'dispatch', 'recipe_propose', { recipe_id: recipeId }, gate.activeContext)
282
282
  if (stale) return stale
283
283
 
284
284
  // ---------- ⑦b 批准(choice 已由 decide 链 fail-closed 归一):选定包整批下发 ----------
@@ -168,7 +168,16 @@ function chainDeny(faces: ToolRefFaces, toolName: string, args: Record<string, u
168
168
  ], faces, hint, { param, value: id, lineId })
169
169
  }
170
170
 
171
- type ChainKind = 'dataset' | 'job' | 'model' | 'plan' | 'scene' | 'binding' | 'run' | 'recommendation'
171
+ function draftLineId(draftJson: string): string {
172
+ try {
173
+ return (JSON.parse(draftJson || '{}') as { lineId?: string }).lineId ?? ''
174
+ }
175
+ catch {
176
+ return ''
177
+ }
178
+ }
179
+
180
+ type ChainKind = 'dataset' | 'job' | 'model' | 'plan' | 'scene' | 'binding' | 'run' | 'recommendation' | 'ontology_draft' | 'ontology_version'
172
181
 
173
182
  /** 优化运行/建议 → 所属 Agent(经 binding 反查);不存在返回 null(交工具兜底)。 */
174
183
  function optimizerOwnership(id: string, kind: 'run' | 'recommendation'): { agentId: string } | null {
@@ -209,6 +218,27 @@ function chainLineOf(kind: ChainKind, id: string, args: Record<string, unknown>)
209
218
  const p = getTrainingPlan(id)
210
219
  return p ? { lineId: p.lineId, createdBy: '' } : null
211
220
  }
221
+ // 本体草稿:归属 = 草稿属主(agent 起草时 owner=agentId);取不到 → 交工具自身
222
+ if (kind === 'ontology_draft') {
223
+ const row = rt.db.prepare('SELECT owner_user_id AS ownerUserId, draft_json AS draftJson FROM ontology_drafts WHERE id = ?').get(id) as { ownerUserId?: string, draftJson?: string } | undefined
224
+ if (!row) return null
225
+ let lineId = draftLineId(row.draftJson ?? '')
226
+ if (!lineId) {
227
+ const v = rt.db.prepare('SELECT line_id AS lineId FROM ontology_versions WHERE id = (SELECT ontology_id FROM ontology_drafts WHERE id = ?) ORDER BY version DESC LIMIT 1').get(id) as { lineId?: string } | undefined
228
+ lineId = v?.lineId ?? ''
229
+ }
230
+ return { lineId, createdBy: row.ownerUserId ?? '' }
231
+ }
232
+ // 本体版本:id@version 或 (ontology_id, version);归属 = 版本产线
233
+ if (kind === 'ontology_version') {
234
+ const ontologyId = id
235
+ const wantsVersion = args.version !== undefined ? Number(args.version) : Number.NaN
236
+ const row = Number.isInteger(wantsVersion)
237
+ ? rt.db.prepare('SELECT line_id AS lineId FROM ontology_versions WHERE id = ? AND version = ?').get(ontologyId, wantsVersion) as { lineId?: string } | undefined
238
+ : rt.db.prepare(`SELECT line_id AS lineId FROM ontology_versions WHERE id = ? AND status = 'published' ORDER BY version DESC LIMIT 1`).get(ontologyId) as { lineId?: string } | undefined
239
+ if (!row) return null
240
+ return { lineId: row.lineId ?? '', createdBy: '' }
241
+ }
212
242
  // scene:需带版本(scene_id 多版本并存);取不到记录 → 交工具自身
213
243
  const version = String(args.scene_version ?? '').trim()
214
244
  if (!version) return null
@@ -372,7 +402,7 @@ export function verifyToolReferences(agentId: string, toolName: string, args: Re
372
402
  const mine = row.createdBy === agentId
373
403
  const readable = !!row.lineId && faces.readableLines.has(row.lineId)
374
404
  if (!mine && !readable) {
375
- const label = { dataset: '数据集', job: '训练作业', model: '模型', plan: '建模任务', scene: '场景' }[chain.kind]
405
+ const label = { dataset: '数据集', job: '训练作业', model: '模型', plan: '建模任务', scene: '场景', ontology_draft: '本体草稿', ontology_version: '本体版本' }[chain.kind]
376
406
  return chainDeny(faces, toolName, args, chain.param, id, label, row.lineId)
377
407
  }
378
408
  }
@@ -0,0 +1,38 @@
1
+ import type { AgentWorkspace } from '../agent-interface'
2
+ import type { AgentSessionEvent } from '../adapters/omp-rpc-client'
3
+ import { toolArgsPreview } from '../prompt-builder'
4
+
5
+ /** Compact, history-compatible audit line for a host tool used during lead supervision. */
6
+ export function supervisionToolHistoryMessage(event: AgentSessionEvent): string | null {
7
+ const toolName = typeof event.toolName === 'string' && event.toolName ? event.toolName : 'tool'
8
+ if (event.type === 'tool_execution_start') {
9
+ return `🔧 ${toolName}${toolArgsPreview(event.args)}`
10
+ }
11
+ if (event.type !== 'tool_execution_end') return null
12
+
13
+ const rawResult = event.result ?? event.output ?? ''
14
+ let summary: string
15
+ if (typeof rawResult === 'string') {
16
+ summary = rawResult
17
+ }
18
+ else {
19
+ try {
20
+ summary = JSON.stringify(rawResult) ?? ''
21
+ }
22
+ catch {
23
+ summary = '(不可序列化结果)'
24
+ }
25
+ }
26
+ summary = summary.slice(0, 300)
27
+ return `🔧 ${toolName} ${event.isError === true ? '❌ 失败' : '✅ 完成'}${summary ? `: ${summary}` : ''}`
28
+ }
29
+
30
+ /** Persist a supervisor host-tool event against the active root task when it is still open. */
31
+ export async function recordSupervisionToolHistory(
32
+ workspace: Pick<AgentWorkspace, 'reportTask'>,
33
+ taskId: string,
34
+ event: AgentSessionEvent,
35
+ ): Promise<void> {
36
+ const message = supervisionToolHistoryMessage(event)
37
+ if (message) await workspace.reportTask({ taskId, message })
38
+ }
@@ -7,6 +7,7 @@ import type { AgentEvent, AgentRunContext, AgentRunRequest, SupervisionDecision,
7
7
  import type { HostToolCallRequest } from '../adapters/omp-rpc-client'
8
8
  import { extractJsonArray, parseSteerBanner, peerPrompt, supervisePrompt, systemManual, workerPrompt } from '../prompt-builder'
9
9
  import { log } from './helpers'
10
+ import { recordSupervisionToolHistory } from './supervision-history'
10
11
 
11
12
  export abstract class OmpRpcAgentImplToolsSteer extends OmpRpcAgentImplLifecycle {
12
13
  /** 引擎无关工具面:REST/MCP 桥直调与 omp 内部 host_tool_call 共用同一实现 */
@@ -97,6 +98,12 @@ export abstract class OmpRpcAgentImplToolsSteer extends OmpRpcAgentImplLifecycle
97
98
  return new Promise<SupervisionDecision[]>((resolve) => {
98
99
  let assistantText = ''
99
100
  let resolved = false
101
+ const activeRootTask = snapshot.tasks.find(task =>
102
+ task.id === snapshot.activeRootId
103
+ && task.assigneeId === this.selfAgentId
104
+ && ['SUBMITTED', 'ASSIGNED', 'WORKING', 'WAITING'].includes(task.state),
105
+ )
106
+ let taskHistoryWrites = Promise.resolve()
100
107
 
101
108
  const finish = (decisions: SupervisionDecision[]) => {
102
109
  if (resolved) return
@@ -107,7 +114,7 @@ export abstract class OmpRpcAgentImplToolsSteer extends OmpRpcAgentImplLifecycle
107
114
  unsub()
108
115
  if (hardTimer) clearTimeout(hardTimer)
109
116
  signalUnsub?.()
110
- resolve(decisions)
117
+ void taskHistoryWrites.then(() => resolve(decisions), () => resolve(decisions))
111
118
  }
112
119
 
113
120
  const abortTurn = (reason: string): void => {
@@ -118,6 +125,16 @@ export abstract class OmpRpcAgentImplToolsSteer extends OmpRpcAgentImplLifecycle
118
125
  }
119
126
 
120
127
  const unsub = this.client!.onEvent((event) => {
128
+ if (activeRootTask && (event.type === 'tool_execution_start' || event.type === 'tool_execution_end')) {
129
+ // Lead supervision is not a workerTurn, so its host-tool events do not
130
+ // pass through promptAndStream's task event mapper. Persist them on the
131
+ // active root while it is open, preserving tool-call/result chronology.
132
+ taskHistoryWrites = taskHistoryWrites.then(async () => {
133
+ await recordSupervisionToolHistory(ctx.workspace, activeRootTask.id, event)
134
+ }).catch((err) => {
135
+ log.error(`[OmpRpcAgent:${this.selfAgentId}] supervise task-history write failed:`, err)
136
+ })
137
+ }
121
138
  if (event.type === 'message_update' && event.assistantMessageEvent?.type === 'text_delta') {
122
139
  this.streaming = true
123
140
  assistantText += event.assistantMessageEvent.delta ?? ''
@@ -17,7 +17,7 @@ import type { ToolRefKind as _RefKind } from './tool-reference-kinds'
17
17
  export type { ToolRefKind } from './tool-reference-kinds'
18
18
 
19
19
  /** 链式引用类别(经谱系回溯判定归属) */
20
- export type ToolChainKind = 'dataset' | 'job' | 'model' | 'plan' | 'scene' | 'binding' | 'run' | 'recommendation'
20
+ export type ToolChainKind = 'dataset' | 'job' | 'model' | 'plan' | 'scene' | 'binding' | 'run' | 'recommendation' | 'ontology_draft' | 'ontology_version'
21
21
 
22
22
  export interface ToolRefRule {
23
23
  param: string
@@ -460,6 +460,22 @@ export function createAmlRepo(db: DatabaseSync) {
460
460
  updateNote(id: string, note: string): void {
461
461
  db.prepare('UPDATE aml_models SET note = ? WHERE id = ?').run(note, id)
462
462
  },
463
+ /** 人读身份维护(Agent/REST 共用):只改 label/description,不改阶段与工件 */
464
+ updateIdentity(id: string, patch: { label?: string, description?: string }): void {
465
+ const sets: string[] = []
466
+ const args: unknown[] = []
467
+ if (patch.label !== undefined) {
468
+ sets.push('label = ?')
469
+ args.push(patch.label.slice(0, 200))
470
+ }
471
+ if (patch.description !== undefined) {
472
+ sets.push('description = ?')
473
+ args.push(patch.description.slice(0, 500))
474
+ }
475
+ if (!sets.length) return
476
+ args.push(id)
477
+ db.prepare(`UPDATE aml_models SET ${sets.join(', ')} WHERE id = ?`).run(...(args as never[]))
478
+ },
463
479
  },
464
480
  }
465
481
  }
@@ -1,3 +1,5 @@
1
+ import { dimensionsCompatible, dimensionOf } from '@/shared/dimensions'
2
+
1
3
  export const PHYSICS_SPEC_VERSION = 'physics-spec.v1' as const
2
4
  export const PHYSICS_OPERATORS = ['add', 'sub', 'mul', 'div', 'pow', 'exp', 'log', 'min', 'max', 'clamp'] as const
3
5
  export type PhysicsOperator = typeof PHYSICS_OPERATORS[number]
@@ -67,15 +69,6 @@ export interface PhysicsSpecValidationResult {
67
69
  const OPS = new Set<string>(PHYSICS_OPERATORS)
68
70
  const IDENTIFIER = /^[A-Za-z_][A-Za-z0-9_.:-]*$/
69
71
  const RESERVED = new Set(['__proto__', 'prototype', 'constructor'])
70
- const DIMENSIONLESS = new Set(['', '1', 'ratio', 'fraction', 'percent', '%'])
71
- const UNIT_DIMENSIONS: Record<string, string> = {
72
- s: 'time', sec: 'time', ms: 'time', min: 'time', h: 'time',
73
- degc: 'temperature', c: 'temperature', k: 'temperature', degf: 'temperature',
74
- pa: 'pressure', kpa: 'pressure', mpa: 'pressure', bar: 'pressure', psi: 'pressure',
75
- g: 'mass', kg: 'mass', mg: 'mass',
76
- m: 'length', cm: 'length', mm: 'length', km: 'length',
77
- a: 'current', v: 'voltage', w: 'power', j: 'energy', n: 'force',
78
- }
79
72
 
80
73
  function record(value: unknown): value is Record<string, unknown> {
81
74
  return !!value && typeof value === 'object' && !Array.isArray(value)
@@ -89,19 +82,10 @@ function idOk(value: unknown): value is string {
89
82
  function addIssue(issues: PhysicsSpecIssue[], path: string, code: string, message: string, severity: 'error' | 'warning' = 'error') {
90
83
  issues.push({ path, code, message, severity })
91
84
  }
92
- function unitKey(unit: string | undefined): string {
93
- return (unit ?? '').trim().toLowerCase().replace('°', 'deg')
94
- }
95
- function dimension(unit: string | undefined): string {
96
- const key = unitKey(unit)
97
- if (DIMENSIONLESS.has(key)) return 'dimensionless'
98
- if (UNIT_DIMENSIONS[key]) return UNIT_DIMENSIONS[key]
99
- if (key.includes('/') || key.includes('*') || key.includes('^')) return `compound:${key}`
100
- return key ? `unit:${key}` : 'scalar'
101
- }
102
- function compatible(a: string, b: string): boolean {
103
- return a === '*' || b === '*' || a === b || (a === 'dimensionless' && b === 'scalar') || (b === 'dimensionless' && a === 'scalar')
104
- }
85
+ /** 量纲归一与相容判定复用 shared/dimensions(本体与 PhysicsSpec 共用一张表;℃ 缺口在此已修) */
86
+ const dimension = dimensionOf
87
+ const compatible = dimensionsCompatible
88
+
105
89
  function normalizeExpr(value: unknown): PhysicsExpression | undefined {
106
90
  if (finite(value)) return value
107
91
  if (!record(value)) return undefined
@@ -22,16 +22,23 @@ export async function getDaqQueue(): Promise<DaqQueuePort> {
22
22
 
23
23
  /** 重连/初始装配:按 infra 判定结果(重新)构建 MQTT 或进程内队列 */
24
24
  export async function rebuildDaqQueue(online: boolean, url?: string | null): Promise<DaqQueuePort> {
25
- // 换装前释放旧 adapter(mqtt 连接 / inproc 泵),防重建泄漏
26
- await g.__daqQueue?.close?.()
27
25
  if (!online || !url) {
28
- if (g.__daqQueue?.backend !== 'inproc') {
29
- g.__daqQueue = new InProcQueueAdapter()
26
+ // Reuse an in-process adapter without closing it. close() clears consumers and
27
+ // stops its pump; getDaqQueue() will not initialize an existing instance again.
28
+ if (g.__daqQueue?.backend === 'inproc') {
30
29
  await g.__daqQueue.init()
31
- log.warn('[daq-queue] 降级进程内队列')
30
+ return g.__daqQueue
32
31
  }
32
+ // When falling back from MQTT, install a fresh adapter; the controller reattaches
33
+ // its consumer after this replacement.
34
+ await g.__daqQueue?.close?.()
35
+ g.__daqQueue = new InProcQueueAdapter()
36
+ await g.__daqQueue.init()
37
+ log.warn('[daq-queue] 降级进程内队列')
33
38
  return g.__daqQueue
34
39
  }
40
+ // Release the previous adapter before a transition to MQTT.
41
+ await g.__daqQueue?.close?.()
35
42
  try {
36
43
  const adapter = new MqttQueueAdapter(url)
37
44
  await adapter.init()
@@ -2,19 +2,20 @@
2
2
  * TsdbPort 工厂 —— 配置驱动(daqInfraUrls 提供真实 Timescale URL),降级 SQLite 仿真。
3
3
  * 单例挂 globalThis;rebuildTsdb() 支持重连时从降级实例切回真实实例。
4
4
  */
5
- import { createLogger } from '../../logger'
5
+ import { createLogger } from '../../logger'
6
6
  import { SqliteTimeSeriesAdapter } from './sqlite.adapter'
7
7
  import { TimescaleAdapter } from './timescale.adapter'
8
8
  import type { TsdbPort } from './tsdb-port'
9
9
 
10
- const log = createLogger('daq.tsdb')
11
-
10
+ const log = createLogger('daq.tsdb')
11
+
12
12
  interface DaqTsdbState { current?: TsdbPort, initError?: unknown }
13
13
  const g = globalThis as typeof globalThis & { __daqTsdbState?: DaqTsdbState }
14
14
 
15
15
  function makeFallback(reason: string): TsdbPort {
16
16
  const dev = new SqliteTimeSeriesAdapter()
17
- dev.init()
17
+ // init 失败不再静默:读路径有 ensureDb 惰性自愈兜底,但这里必须留下证据
18
+ dev.init().catch(err => log.error(`[daq-tsdb] SQLite 降级实例初始化失败(读路径将自愈重试):`, err instanceof Error ? err.message : err))
18
19
  log.warn(`[daq-tsdb] ${reason} → 已降级 SQLite 时序仿真`)
19
20
  return dev
20
21
  }
@@ -27,7 +28,7 @@ export const tsdbReady: Promise<void> = (() => {
27
28
  if (!url) {
28
29
  // 无配置(启动插件尚未装配):先占位仿真库;插件随后按 infra 状态 rebuild
29
30
  const dev = new SqliteTimeSeriesAdapter()
30
- dev.init()
31
+ dev.init().catch(err => log.error('[daq-tsdb] SQLite 占位实例初始化失败(读路径将自愈重试):', err instanceof Error ? err.message : err))
31
32
  st.current = dev
32
33
  }
33
34
  else {