agentworkshop 0.8.8 → 0.9.0

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 (589) hide show
  1. package/.AgentWorkShop/prompts/host-tools.json +68 -0
  2. package/.output/.AgentWorkShop/prompts/host-tools.json +68 -0
  3. package/.output/.AgentWorkShop/schema.json +2 -0
  4. package/.output/nitro.json +1 -1
  5. package/.output/public/_nuxt/{Cdi9qfTr.js → CDO7Zey1.js} +2 -2
  6. package/.output/public/_nuxt/builds/latest.json +1 -1
  7. package/.output/public/_nuxt/builds/meta/f507c33b-4ecc-4e32-af88-2e3736b443e9.json +1 -0
  8. package/.output/server/chunks/_/access.mjs +1 -1
  9. package/.output/server/chunks/_/data-export.mjs +5 -5
  10. package/.output/server/chunks/_/data-query.mjs +2 -2
  11. package/.output/server/chunks/_/eda-run.repo.mjs +3 -3
  12. package/.output/server/chunks/_/features.mjs +5 -5
  13. package/.output/server/chunks/_/golden.mjs +2 -2
  14. package/.output/server/chunks/_/host-bindings.mjs +1 -1
  15. package/.output/server/chunks/_/index.mjs +2 -2
  16. package/.output/server/chunks/_/mes-secrets.repo.mjs +1 -1
  17. package/.output/server/chunks/_/nitro.mjs +2556 -1314
  18. package/.output/server/chunks/_/nitro.mjs.map +1 -1
  19. package/.output/server/chunks/_/spc.mjs +2 -2
  20. package/.output/server/chunks/build/_id_-CsCtnbwe.mjs +1 -1
  21. package/.output/server/chunks/build/_id_-P1W47Gqq.mjs +1 -1
  22. package/.output/server/chunks/build/_wsId_-DpOErFj6.mjs +1 -1
  23. package/.output/server/chunks/build/agents-D7CdEUTv.mjs +1 -1
  24. package/.output/server/chunks/build/aml-DRAFRcGU.mjs +1 -1
  25. package/.output/server/chunks/build/analysis-J9axLuRt.mjs +1 -1
  26. package/.output/server/chunks/build/api-B4Om0mEc.mjs +1 -1
  27. package/.output/server/chunks/build/api-BEW_ebY_.mjs +1 -1
  28. package/.output/server/chunks/build/api-BsAgXWxi.mjs +1 -1
  29. package/.output/server/chunks/build/board-CJUc032b.mjs +1 -1
  30. package/.output/server/chunks/build/channel-templates-ggsBacZF.mjs +1 -1
  31. package/.output/server/chunks/build/constants-HPHJvjne.mjs +1 -1
  32. package/.output/server/chunks/build/daq-B_dRMDw4.mjs +1 -1
  33. package/.output/server/chunks/build/data-D8uX1dnm.mjs +1 -1
  34. package/.output/server/chunks/build/dcw-D_HD_H_2.mjs +1 -1
  35. package/.output/server/chunks/build/default-CNWS6NUw.mjs +1 -1
  36. package/.output/server/chunks/build/es-Bxu10NJ2.mjs +1 -1
  37. package/.output/server/chunks/build/logs-BnYSMRXM.mjs +1 -1
  38. package/.output/server/chunks/build/monitor-Cq6hRFeQ.mjs +1 -1
  39. package/.output/server/chunks/build/ontology-ohICfVVb.mjs +1 -1
  40. package/.output/server/chunks/build/operations-4zOVhW7o.mjs +1 -1
  41. package/.output/server/chunks/build/optimizer-BlWTsM-W.mjs +1 -1
  42. package/.output/server/chunks/build/pages-DEv4ProW.mjs +1 -1
  43. package/.output/server/chunks/build/permissions-DgXQZSyx.mjs +1 -1
  44. package/.output/server/chunks/build/pipeline-CkavMBhk.mjs +1 -1
  45. package/.output/server/chunks/build/plugins-LRjaSEZy.mjs +1 -1
  46. package/.output/server/chunks/build/schedules-Hz2DJUE2.mjs +1 -1
  47. package/.output/server/chunks/build/settings-DXLJPq7d.mjs +1 -1
  48. package/.output/server/chunks/build/studio-hSqH9TYS.mjs +1 -1
  49. package/.output/server/chunks/build/teams-BbwYJyzv.mjs +1 -1
  50. package/.output/server/chunks/build/tokens-GYaGJ35Z.mjs +1 -1
  51. package/.output/server/chunks/build/tools-CnYi9cou.mjs +1 -1
  52. package/.output/server/chunks/build/town-BV-hbwb5.mjs +1 -1
  53. package/.output/server/chunks/build/town-CcoQKjMj.mjs +1 -1
  54. package/.output/server/chunks/build/types-D6J7slEa.mjs +1 -1
  55. package/.output/server/chunks/build/types-DWqIeMRP.mjs +1 -1
  56. package/.output/server/chunks/build/useAgentHarnessOptions-Dq0l0Z6d.mjs +1 -1
  57. package/.output/server/chunks/build/useAgentTemplateActions-BFOHb5-L.mjs +1 -1
  58. package/.output/server/chunks/build/useAgentTemplateDialogState-CZzpu5og.mjs +1 -1
  59. package/.output/server/chunks/build/useAgentTemplateForm-CuJPOPcK.mjs +1 -1
  60. package/.output/server/chunks/build/useAgentTemplatesCatalog-B2bIhZLA.mjs +1 -1
  61. package/.output/server/chunks/build/useAmlDatasets-DeoE1idn.mjs +1 -1
  62. package/.output/server/chunks/build/useAmlEntities-BJhvdqHJ.mjs +1 -1
  63. package/.output/server/chunks/build/useAmlEnv-CDIZ6xTe.mjs +1 -1
  64. package/.output/server/chunks/build/useAmlExperiments-Dloi834i.mjs +1 -1
  65. package/.output/server/chunks/build/useAmlFormat-C2sl3MGB.mjs +1 -1
  66. package/.output/server/chunks/build/useAmlJobs-BF9LpwXz.mjs +1 -1
  67. package/.output/server/chunks/build/useAmlModels-_bweOr3R.mjs +1 -1
  68. package/.output/server/chunks/build/useAmlNotes-DQj980iX.mjs +1 -1
  69. package/.output/server/chunks/build/useAmlPredict-DHNgDSJn.mjs +1 -1
  70. package/.output/server/chunks/build/useAnalysisFeed-BrEGV_9x.mjs +1 -1
  71. package/.output/server/chunks/build/useDaqAddNode-D_Rkju0f.mjs +1 -1
  72. package/.output/server/chunks/build/useDaqDetailBinding-DCWaLKXT.mjs +1 -1
  73. package/.output/server/chunks/build/useDaqDetailFrames-BOIcOJRB.mjs +1 -1
  74. package/.output/server/chunks/build/useDaqDetailHistory-D6WulPVs.mjs +1 -1
  75. package/.output/server/chunks/build/useDaqDetailNode-BGMRUIXN.mjs +1 -1
  76. package/.output/server/chunks/build/useDaqDetailParams-Cm9a9r5G.mjs +1 -1
  77. package/.output/server/chunks/build/useDaqFilters-zAAVlzJQ.mjs +1 -1
  78. package/.output/server/chunks/build/useDaqNodeWindow-1DWj2H5G.mjs +1 -1
  79. package/.output/server/chunks/build/useDaqOptimizations-BE_9Z2s_.mjs +1 -1
  80. package/.output/server/chunks/build/useDaqTemplates-CK37sMfi.mjs +1 -1
  81. package/.output/server/chunks/build/useDashboardCharts-D45083s_.mjs +1 -1
  82. package/.output/server/chunks/build/useDashboardData-Cw8lrPo5.mjs +1 -1
  83. package/.output/server/chunks/build/useDcwAddNode-KnocMk1m.mjs +1 -1
  84. package/.output/server/chunks/build/useDcwCards-C53IiOcg.mjs +1 -1
  85. package/.output/server/chunks/build/useDcwDetailScope-D6qXrfZu.mjs +1 -1
  86. package/.output/server/chunks/build/useDcwDetailTemplates-DPOXu1o_.mjs +1 -1
  87. package/.output/server/chunks/build/useDcwFilter-DNQ6Ivwd.mjs +1 -1
  88. package/.output/server/chunks/build/useDcwLedger-BhbUBCbi.mjs +1 -1
  89. package/.output/server/chunks/build/useDcwLineMutations-KA7VnggO.mjs +1 -1
  90. package/.output/server/chunks/build/useDcwLineRun-3zx_UCxi.mjs +1 -1
  91. package/.output/server/chunks/build/useDcwParamApprovals-DzyY6Tmi.mjs +1 -1
  92. package/.output/server/chunks/build/useDcwProducts-B05ymt3k.mjs +1 -1
  93. package/.output/server/chunks/build/useDcwQuery-vWpgpSmJ.mjs +1 -1
  94. package/.output/server/chunks/build/useDcwQuickActions-DUkLy34S.mjs +1 -1
  95. package/.output/server/chunks/build/useDcwRecipes-BAb4Yg3d.mjs +1 -1
  96. package/.output/server/chunks/build/useDcwTemplates-D2aoejps.mjs +1 -1
  97. package/.output/server/chunks/build/useDcwWrites-7w8txksD.mjs +1 -1
  98. package/.output/server/chunks/build/useExpConfirmations-BM626N4p.mjs +1 -1
  99. package/.output/server/chunks/build/useLogsFormat-B-o4MHy7.mjs +1 -1
  100. package/.output/server/chunks/build/useLogsManual-D0dvgCsP.mjs +1 -1
  101. package/.output/server/chunks/build/useLogsQuery-D7hrJ3yn.mjs +1 -1
  102. package/.output/server/chunks/build/useLogsScope-DEUyq-My.mjs +1 -1
  103. package/.output/server/chunks/build/useMonitorColumns-vVnt3r5Q.mjs +1 -1
  104. package/.output/server/chunks/build/useMonitorData-DIkiLr_h.mjs +1 -1
  105. package/.output/server/chunks/build/useMonitorFormat-CyURtH8N.mjs +1 -1
  106. package/.output/server/chunks/build/useMonitorTerminal-Dj4QwRNW.mjs +1 -1
  107. package/.output/server/chunks/build/useOperationsFeed-Ci4mZAn_.mjs +1 -1
  108. package/.output/server/chunks/build/useRecipeDispatchApprovals-BYtiqfeb.mjs +1 -1
  109. package/.output/server/chunks/build/useTeamActions-BDjU06LP.mjs +1 -1
  110. package/.output/server/chunks/build/useTeamAddMemberDialog-J3oFn3FI.mjs +1 -1
  111. package/.output/server/chunks/build/useTeamCreateDialog-fbn4ixYu.mjs +1 -1
  112. package/.output/server/chunks/build/useTeamDeployDialog-BNezMD2k.mjs +1 -1
  113. package/.output/server/chunks/build/useTeamDialogState-CFRUQxAf.mjs +1 -1
  114. package/.output/server/chunks/build/useTeamPluginDialog-BZznrOVe.mjs +1 -1
  115. package/.output/server/chunks/build/useTeamsCatalog-DuZFP3oG.mjs +1 -1
  116. package/.output/server/chunks/build/useTokenClipboard-CwQpoFeP.mjs +1 -1
  117. package/.output/server/chunks/build/useTokenCreate-Ctl0YGhL.mjs +1 -1
  118. package/.output/server/chunks/build/useTokenRename-Cm3ypSfN.mjs +1 -1
  119. package/.output/server/chunks/build/useTokenReveal-CeoWL5Mt.mjs +1 -1
  120. package/.output/server/chunks/build/useTokensList-CNIzON3u.mjs +1 -1
  121. package/.output/server/chunks/build/useWorkbenchAuth-CY-bVFMu.mjs +1 -1
  122. package/.output/server/chunks/build/useWorkbenchWorkspaces-DhZQFss9.mjs +1 -1
  123. package/.output/server/chunks/build/useWorkspaceAuth-Dlvj9csD.mjs +1 -1
  124. package/.output/server/chunks/build/useWorkspaceChannels-CPFepxTN.mjs +1 -1
  125. package/.output/server/chunks/build/useWorkspacePanels-CTwREmq0.mjs +1 -1
  126. package/.output/server/chunks/build/useWorkspaceShell-BCypjjjE.mjs +1 -1
  127. package/.output/server/chunks/build/users-DjiVC_tS.mjs +1 -1
  128. package/.output/server/chunks/build/workshop-1gKeDASV.mjs +1 -1
  129. package/.output/server/chunks/routes/api/health.get.mjs +1 -1
  130. package/.output/server/chunks/routes/api/index.get.mjs +1 -1
  131. package/.output/server/chunks/routes/api/index.post.mjs +1 -1
  132. package/.output/server/chunks/routes/api/mcp/workshop.mjs +1 -1
  133. package/.output/server/chunks/routes/api/metrics.mjs +1 -1
  134. package/.output/server/chunks/routes/api/plugins/_name/_...path_.mjs +1 -1
  135. package/.output/server/chunks/routes/api/plugins/client/_name_.get.mjs +1 -1
  136. package/.output/server/chunks/routes/api/plugins/i18n.get.mjs +1 -1
  137. package/.output/server/chunks/routes/api/plugins/manifest.get.mjs +1 -1
  138. package/.output/server/chunks/routes/api/system/backup/list.get.mjs +1 -1
  139. package/.output/server/chunks/routes/api/system/backup/run.post.mjs +3 -3
  140. package/.output/server/chunks/routes/api/system/config-groups/_id_.delete.mjs +1 -1
  141. package/.output/server/chunks/routes/api/system/config-groups/_id_.patch.mjs +1 -1
  142. package/.output/server/chunks/routes/api/system/config.get.mjs +1 -1
  143. package/.output/server/chunks/routes/api/system/index.get.mjs +1 -1
  144. package/.output/server/chunks/routes/api/system/index.patch.mjs +1 -1
  145. package/.output/server/chunks/routes/api/system/index.post.mjs +1 -1
  146. package/.output/server/chunks/routes/api/system/index2.get.mjs +1 -1
  147. package/.output/server/chunks/routes/api/system/monitor/terminal/ws.mjs +1 -1
  148. package/.output/server/chunks/routes/api/system/monitor/terminate.post.mjs +1 -1
  149. package/.output/server/chunks/routes/api/system/monitor.get.mjs +1 -1
  150. package/.output/server/chunks/routes/api/system/settings/events.get.mjs +1 -1
  151. package/.output/server/chunks/routes/api/system/settings/reset.post.mjs +1 -1
  152. package/.output/server/chunks/routes/api/system/timezone.get.mjs +1 -1
  153. package/.output/server/chunks/routes/api/users/_id_.delete.mjs +1 -1
  154. package/.output/server/chunks/routes/api/users/_id_.get.mjs +1 -1
  155. package/.output/server/chunks/routes/api/users/_id_.put.mjs +1 -1
  156. package/.output/server/chunks/routes/api/users/change-password.post.mjs +1 -1
  157. package/.output/server/chunks/routes/api/users/index.get.mjs +1 -1
  158. package/.output/server/chunks/routes/api/users/index.post.mjs +1 -1
  159. package/.output/server/chunks/routes/api/users/login.post.mjs +1 -1
  160. package/.output/server/chunks/routes/api/users/logout.post.mjs +1 -1
  161. package/.output/server/chunks/routes/api/users/me.get.mjs +1 -1
  162. package/.output/server/chunks/routes/api/users/register.post.mjs +1 -1
  163. package/.output/server/chunks/routes/api/users/setup-status.get.mjs +1 -1
  164. package/.output/server/chunks/routes/api/users/tokens/_id/token.get.mjs +1 -1
  165. package/.output/server/chunks/routes/api/users/tokens/_id_.delete.mjs +1 -1
  166. package/.output/server/chunks/routes/api/users/tokens/_id_.patch.mjs +1 -1
  167. package/.output/server/chunks/routes/api/workshop/_...path_.mjs +1 -1
  168. package/.output/server/chunks/routes/api/workshop/a2a/_agentId/index.get.mjs +1 -1
  169. package/.output/server/chunks/routes/api/workshop/a2a/_agentId/index.post.mjs +1 -1
  170. package/.output/server/chunks/routes/api/workshop/a2a/send.post.mjs +1 -1
  171. package/.output/server/chunks/routes/api/workshop/agent-tools/approvals/_id/decide.post.mjs +1 -1
  172. package/.output/server/chunks/routes/api/workshop/agent-tools/bindings/_id_.delete.mjs +1 -1
  173. package/.output/server/chunks/routes/api/workshop/agent-tools/bindings/_id_.patch.mjs +1 -1
  174. package/.output/server/chunks/routes/api/workshop/agent-tools/bindings/grant.post.mjs +1 -1
  175. package/.output/server/chunks/routes/api/workshop/agent-tools/bindings/revoke.post.mjs +1 -1
  176. package/.output/server/chunks/routes/api/workshop/agent-tools/index.get.mjs +1 -1
  177. package/.output/server/chunks/routes/api/workshop/agent-tools/index.post.mjs +2 -2
  178. package/.output/server/chunks/routes/api/workshop/agent-tools/index2.get.mjs +1 -1
  179. package/.output/server/chunks/routes/api/workshop/agent-tools/invoke.post.mjs +1 -1
  180. package/.output/server/chunks/routes/api/workshop/agent-tools/list.get.mjs +1 -1
  181. package/.output/server/chunks/routes/api/workshop/agents/_id_.delete.mjs +1 -1
  182. package/.output/server/chunks/routes/api/workshop/agents/_id_.get.mjs +1 -1
  183. package/.output/server/chunks/routes/api/workshop/agents/_id_.patch.mjs +1 -1
  184. package/.output/server/chunks/routes/api/workshop/agents/subscribe.post.mjs +1 -1
  185. package/.output/server/chunks/routes/api/workshop/aml/datasets/_id/preview.get.mjs +1 -1
  186. package/.output/server/chunks/routes/api/workshop/aml/datasets/_id_.delete.mjs +1 -1
  187. package/.output/server/chunks/routes/api/workshop/aml/datasets/_id_.get.mjs +1 -1
  188. package/.output/server/chunks/routes/api/workshop/aml/datasets/_id_.patch.mjs +1 -1
  189. package/.output/server/chunks/routes/api/workshop/aml/entities/prune.post.mjs +1 -1
  190. package/.output/server/chunks/routes/api/workshop/aml/env/recheck.post.mjs +1 -1
  191. package/.output/server/chunks/routes/api/workshop/aml/env/uv.post.mjs +1 -1
  192. package/.output/server/chunks/routes/api/workshop/aml/env/venv.post.mjs +1 -1
  193. package/.output/server/chunks/routes/api/workshop/aml/index.get.mjs +1 -1
  194. package/.output/server/chunks/routes/api/workshop/aml/index.post.mjs +1 -1
  195. package/.output/server/chunks/routes/api/workshop/aml/index2.get.mjs +1 -1
  196. package/.output/server/chunks/routes/api/workshop/aml/index2.post.mjs +1 -1
  197. package/.output/server/chunks/routes/api/workshop/aml/index3.get.mjs +1 -1
  198. package/.output/server/chunks/routes/api/workshop/aml/index3.post.mjs +1 -1
  199. package/.output/server/chunks/routes/api/workshop/aml/index4.get.mjs +1 -1
  200. package/.output/server/chunks/routes/api/workshop/aml/index5.get.mjs +1 -1
  201. package/.output/server/chunks/routes/api/workshop/aml/index6.get.mjs +1 -1
  202. package/.output/server/chunks/routes/api/workshop/aml/index7.get.mjs +1 -1
  203. package/.output/server/chunks/routes/api/workshop/aml/jobs/_id/cancel.post.mjs +1 -1
  204. package/.output/server/chunks/routes/api/workshop/aml/jobs/_id/logs.get.mjs +1 -1
  205. package/.output/server/chunks/routes/api/workshop/aml/jobs/_id/retry.post.mjs +1 -1
  206. package/.output/server/chunks/routes/api/workshop/aml/jobs/_id_.delete.mjs +1 -1
  207. package/.output/server/chunks/routes/api/workshop/aml/jobs/_id_.get.mjs +1 -1
  208. package/.output/server/chunks/routes/api/workshop/aml/models/_id/predict.post.mjs +1 -1
  209. package/.output/server/chunks/routes/api/workshop/aml/models/_id/promote.post.mjs +1 -1
  210. package/.output/server/chunks/routes/api/workshop/aml/models/_id_.delete.mjs +1 -1
  211. package/.output/server/chunks/routes/api/workshop/aml/models/_id_.patch.mjs +1 -1
  212. package/.output/server/chunks/routes/api/workshop/aml/training-plans/_id/train.post.mjs +1 -1
  213. package/.output/server/chunks/routes/api/workshop/aml/training-plans/_id_.delete.mjs +1 -1
  214. package/.output/server/chunks/routes/api/workshop/aml/training-plans/_id_.patch.mjs +1 -1
  215. package/.output/server/chunks/routes/api/workshop/aml/twin/providers.get.mjs +1 -1
  216. package/.output/server/chunks/routes/api/workshop/analysis/_id_.delete.mjs +1 -1
  217. package/.output/server/chunks/routes/api/workshop/analysis/_id_.get.mjs +1 -1
  218. package/.output/server/chunks/routes/api/workshop/analysis/_id_.patch.mjs +1 -1
  219. package/.output/server/chunks/routes/api/workshop/approvals/_id/decide.post.mjs +1 -1
  220. package/.output/server/chunks/routes/api/workshop/assets/character/_id_.delete.mjs +1 -1
  221. package/.output/server/chunks/routes/api/workshop/assets/devices/_id_.delete.mjs +1 -1
  222. package/.output/server/chunks/routes/api/workshop/assets/index.get.mjs +1 -1
  223. package/.output/server/chunks/routes/api/workshop/assets/index.post.mjs +1 -1
  224. package/.output/server/chunks/routes/api/workshop/assets/index2.get.mjs +1 -1
  225. package/.output/server/chunks/routes/api/workshop/assets/index2.post.mjs +1 -1
  226. package/.output/server/chunks/routes/api/workshop/audit.get.mjs +1 -1
  227. package/.output/server/chunks/routes/api/workshop/caller.mjs +1 -1
  228. package/.output/server/chunks/routes/api/workshop/channel-templates/_id/instantiate.post.mjs +2 -2
  229. package/.output/server/chunks/routes/api/workshop/channel-templates/_id_.delete.mjs +1 -1
  230. package/.output/server/chunks/routes/api/workshop/channel-templates/_id_.get.mjs +1 -1
  231. package/.output/server/chunks/routes/api/workshop/channel-templates/_id_.patch.mjs +1 -1
  232. package/.output/server/chunks/routes/api/workshop/channel-templates/from-channel.post.mjs +1 -1
  233. package/.output/server/chunks/routes/api/workshop/channels/_id/activate.post.mjs +1 -1
  234. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/index.get.mjs +1 -1
  235. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/index.post.mjs +1 -1
  236. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/memories/_memoryId_.delete.mjs +1 -1
  237. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/memories/search.post.mjs +1 -1
  238. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/model.patch.mjs +1 -1
  239. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/position.patch.mjs +1 -1
  240. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/range.patch.mjs +1 -1
  241. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/rotate-token.post.mjs +1 -1
  242. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/stop.post.mjs +1 -1
  243. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId_.delete.mjs +1 -1
  244. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId_.patch.mjs +1 -1
  245. package/.output/server/chunks/routes/api/workshop/channels/_id/chat/index.get.mjs +1 -1
  246. package/.output/server/chunks/routes/api/workshop/channels/_id/chat/index.post.mjs +1 -1
  247. package/.output/server/chunks/routes/api/workshop/channels/_id/chat/messages/_messageId/read.post.mjs +1 -1
  248. package/.output/server/chunks/routes/api/workshop/channels/_id/chat/permissions.get.mjs +1 -1
  249. package/.output/server/chunks/routes/api/workshop/channels/_id/events.get.mjs +1 -1
  250. package/.output/server/chunks/routes/api/workshop/channels/_id/execution-mode.patch.mjs +1 -1
  251. package/.output/server/chunks/routes/api/workshop/channels/_id/index.get.mjs +1 -1
  252. package/.output/server/chunks/routes/api/workshop/channels/_id/index.post.mjs +1 -1
  253. package/.output/server/chunks/routes/api/workshop/channels/_id/index.put.mjs +1 -1
  254. package/.output/server/chunks/routes/api/workshop/channels/_id/index2.get.mjs +1 -1
  255. package/.output/server/chunks/routes/api/workshop/channels/_id/index2.post.mjs +1 -1
  256. package/.output/server/chunks/routes/api/workshop/channels/_id/index2.put.mjs +1 -1
  257. package/.output/server/chunks/routes/api/workshop/channels/_id/index3.get.mjs +1 -1
  258. package/.output/server/chunks/routes/api/workshop/channels/_id/index3.post.mjs +1 -1
  259. package/.output/server/chunks/routes/api/workshop/channels/_id/index4.get.mjs +1 -1
  260. package/.output/server/chunks/routes/api/workshop/channels/_id/index4.post.mjs +1 -1
  261. package/.output/server/chunks/routes/api/workshop/channels/_id/index5.get.mjs +1 -1
  262. package/.output/server/chunks/routes/api/workshop/channels/_id/index6.get.mjs +1 -1
  263. package/.output/server/chunks/routes/api/workshop/channels/_id/index7.get.mjs +1 -1
  264. package/.output/server/chunks/routes/api/workshop/channels/_id/line.put.mjs +1 -1
  265. package/.output/server/chunks/routes/api/workshop/channels/_id/members/_userId/approve.post.mjs +1 -1
  266. package/.output/server/chunks/routes/api/workshop/channels/_id/members/_userId_.delete.mjs +1 -1
  267. package/.output/server/chunks/routes/api/workshop/channels/_id/members/join.post.mjs +1 -1
  268. package/.output/server/chunks/routes/api/workshop/channels/_id/members/leave.post.mjs +1 -1
  269. package/.output/server/chunks/routes/api/workshop/channels/_id/memories/_memoryId_.delete.mjs +1 -1
  270. package/.output/server/chunks/routes/api/workshop/channels/_id/queue.get.mjs +1 -1
  271. package/.output/server/chunks/routes/api/workshop/channels/_id/terminals.get.mjs +1 -1
  272. package/.output/server/chunks/routes/api/workshop/channels/_id/tools/reset.post.mjs +1 -1
  273. package/.output/server/chunks/routes/api/workshop/channels/_id/twin-profile.get.mjs +1 -1
  274. package/.output/server/chunks/routes/api/workshop/channels/_id/twin-profile.patch.mjs +1 -1
  275. package/.output/server/chunks/routes/api/workshop/channels/_id_.delete.mjs +1 -1
  276. package/.output/server/chunks/routes/api/workshop/channels/index.get.mjs +1 -1
  277. package/.output/server/chunks/routes/api/workshop/channels/index.patch.mjs +1 -1
  278. package/.output/server/chunks/routes/api/workshop/channels.get.mjs +1 -1
  279. package/.output/server/chunks/routes/api/workshop/channels.post.mjs +7 -7
  280. package/.output/server/chunks/routes/api/workshop/daq/_id/bind.post.mjs +1 -1
  281. package/.output/server/chunks/routes/api/workshop/daq/_id/bindings.put.mjs +1 -1
  282. package/.output/server/chunks/routes/api/workshop/daq/_id/frames/content.get.mjs +1 -1
  283. package/.output/server/chunks/routes/api/workshop/daq/_id/frames.get.mjs +1 -1
  284. package/.output/server/chunks/routes/api/workshop/daq/_id/ingest.post.mjs +2 -2
  285. package/.output/server/chunks/routes/api/workshop/daq/_id/samples.get.mjs +1 -1
  286. package/.output/server/chunks/routes/api/workshop/daq/_id/test.post.mjs +1 -1
  287. package/.output/server/chunks/routes/api/workshop/daq/_id_.delete.mjs +1 -1
  288. package/.output/server/chunks/routes/api/workshop/daq/_id_.patch.mjs +1 -1
  289. package/.output/server/chunks/routes/api/workshop/daq/alarms/_id/ack.post.mjs +1 -1
  290. package/.output/server/chunks/routes/api/workshop/daq/alarms.get.mjs +1 -1
  291. package/.output/server/chunks/routes/api/workshop/daq/controller.post.mjs +1 -1
  292. package/.output/server/chunks/routes/api/workshop/daq/export/_id_.get.mjs +1 -1
  293. package/.output/server/chunks/routes/api/workshop/daq/export-file.get.mjs +1 -1
  294. package/.output/server/chunks/routes/api/workshop/daq/index.get.mjs +1 -1
  295. package/.output/server/chunks/routes/api/workshop/daq/index.post.mjs +1 -1
  296. package/.output/server/chunks/routes/api/workshop/daq/index2.post.mjs +1 -1
  297. package/.output/server/chunks/routes/api/workshop/daq/infra/reconnect.post.mjs +1 -1
  298. package/.output/server/chunks/routes/api/workshop/daq/infra.get.mjs +1 -1
  299. package/.output/server/chunks/routes/api/workshop/daq/query.get.mjs +1 -1
  300. package/.output/server/chunks/routes/api/workshop/daq/storage/retention.put.mjs +1 -1
  301. package/.output/server/chunks/routes/api/workshop/daq/storage/rollup.post.mjs +1 -1
  302. package/.output/server/chunks/routes/api/workshop/daq/storage.get.mjs +1 -1
  303. package/.output/server/chunks/routes/api/workshop/daq/templates/_key_.delete.mjs +1 -1
  304. package/.output/server/chunks/routes/api/workshop/daq/templates/_key_.patch.mjs +1 -1
  305. package/.output/server/chunks/routes/api/workshop/daq/test-driver.post.mjs +1 -1
  306. package/.output/server/chunks/routes/api/workshop/dcw/_id/bind.post.mjs +1 -1
  307. package/.output/server/chunks/routes/api/workshop/dcw/_id/bindings.put.mjs +1 -1
  308. package/.output/server/chunks/routes/api/workshop/dcw/_id/param-ledger.get.mjs +1 -1
  309. package/.output/server/chunks/routes/api/workshop/dcw/_id/read.post.mjs +1 -1
  310. package/.output/server/chunks/routes/api/workshop/dcw/_id/test.post.mjs +1 -1
  311. package/.output/server/chunks/routes/api/workshop/dcw/_id/write.post.mjs +1 -1
  312. package/.output/server/chunks/routes/api/workshop/dcw/_id_.delete.mjs +1 -1
  313. package/.output/server/chunks/routes/api/workshop/dcw/_id_.patch.mjs +1 -1
  314. package/.output/server/chunks/routes/api/workshop/dcw/controller.post.mjs +1 -1
  315. package/.output/server/chunks/routes/api/workshop/dcw/index.get.mjs +1 -1
  316. package/.output/server/chunks/routes/api/workshop/dcw/index.post.mjs +1 -1
  317. package/.output/server/chunks/routes/api/workshop/dcw/index2.get.mjs +1 -1
  318. package/.output/server/chunks/routes/api/workshop/dcw/index2.post.mjs +1 -1
  319. package/.output/server/chunks/routes/api/workshop/dcw/index3.get.mjs +1 -1
  320. package/.output/server/chunks/routes/api/workshop/dcw/index3.post.mjs +1 -1
  321. package/.output/server/chunks/routes/api/workshop/dcw/index4.get.mjs +1 -1
  322. package/.output/server/chunks/routes/api/workshop/dcw/index4.post.mjs +1 -1
  323. package/.output/server/chunks/routes/api/workshop/dcw/index5.get.mjs +1 -1
  324. package/.output/server/chunks/routes/api/workshop/dcw/index5.post.mjs +1 -1
  325. package/.output/server/chunks/routes/api/workshop/dcw/index6.get.mjs +1 -1
  326. package/.output/server/chunks/routes/api/workshop/dcw/index7.get.mjs +1 -1
  327. package/.output/server/chunks/routes/api/workshop/dcw/journal/node/_nodeId/rollback.post.mjs +1 -1
  328. package/.output/server/chunks/routes/api/workshop/dcw/line/query.get.mjs +1 -1
  329. package/.output/server/chunks/routes/api/workshop/dcw/lines/_id/start.post.mjs +1 -1
  330. package/.output/server/chunks/routes/api/workshop/dcw/lines/_id/stop.post.mjs +1 -1
  331. package/.output/server/chunks/routes/api/workshop/dcw/lines/_id_.delete.mjs +1 -1
  332. package/.output/server/chunks/routes/api/workshop/dcw/lines/_id_.patch.mjs +1 -1
  333. package/.output/server/chunks/routes/api/workshop/dcw/mes-artifacts/file.get.mjs +1 -1
  334. package/.output/server/chunks/routes/api/workshop/dcw/mes-hook-test.post.mjs +1 -1
  335. package/.output/server/chunks/routes/api/workshop/dcw/mes-test-read.post.mjs +1 -1
  336. package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id/judge.post.mjs +1 -1
  337. package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id/rollback.post.mjs +1 -1
  338. package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id/series.get.mjs +1 -1
  339. package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id_.get.mjs +1 -1
  340. package/.output/server/chunks/routes/api/workshop/dcw/params/_id/read.post.mjs +1 -1
  341. package/.output/server/chunks/routes/api/workshop/dcw/params/_id/write.post.mjs +1 -1
  342. package/.output/server/chunks/routes/api/workshop/dcw/params/_id_.delete.mjs +1 -1
  343. package/.output/server/chunks/routes/api/workshop/dcw/params/_id_.patch.mjs +1 -1
  344. package/.output/server/chunks/routes/api/workshop/dcw/products/_id_.delete.mjs +1 -1
  345. package/.output/server/chunks/routes/api/workshop/dcw/products/_id_.patch.mjs +1 -1
  346. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/apply.post.mjs +1 -1
  347. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/mark-good.post.mjs +1 -1
  348. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/revert.post.mjs +1 -1
  349. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/rollback-good.post.mjs +1 -1
  350. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/versions.get.mjs +1 -1
  351. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id_.delete.mjs +2 -2
  352. package/.output/server/chunks/routes/api/workshop/dcw/recipes/index.patch.mjs +1 -1
  353. package/.output/server/chunks/routes/api/workshop/dcw/runs/_id/close.post.mjs +1 -1
  354. package/.output/server/chunks/routes/api/workshop/dcw/runs/_id/data.get.mjs +1 -1
  355. package/.output/server/chunks/routes/api/workshop/dcw/runs/_id/rollback.post.mjs +1 -1
  356. package/.output/server/chunks/routes/api/workshop/dcw/templates/_key_.delete.mjs +1 -1
  357. package/.output/server/chunks/routes/api/workshop/dcw/templates/_key_.patch.mjs +1 -1
  358. package/.output/server/chunks/routes/api/workshop/dcw/test-driver.post.mjs +1 -1
  359. package/.output/server/chunks/routes/api/workshop/device-twins/_id/control.post.mjs +1 -1
  360. package/.output/server/chunks/routes/api/workshop/device-twins/_id/telemetry.post.mjs +1 -1
  361. package/.output/server/chunks/routes/api/workshop/device-twins/_id_.delete.mjs +1 -1
  362. package/.output/server/chunks/routes/api/workshop/device-twins/_id_.patch.mjs +1 -1
  363. package/.output/server/chunks/routes/api/workshop/eda/charts/_id_.delete.mjs +1 -1
  364. package/.output/server/chunks/routes/api/workshop/eda/charts/_id_.get.mjs +1 -1
  365. package/.output/server/chunks/routes/api/workshop/eda/charts/_id_.patch.mjs +1 -1
  366. package/.output/server/chunks/routes/api/workshop/eda/commonality.get.mjs +1 -1
  367. package/.output/server/chunks/routes/api/workshop/eda/dashboards/_id_.delete.mjs +1 -1
  368. package/.output/server/chunks/routes/api/workshop/eda/dashboards/_id_.get.mjs +1 -1
  369. package/.output/server/chunks/routes/api/workshop/eda/dashboards/_id_.patch.mjs +1 -1
  370. package/.output/server/chunks/routes/api/workshop/eda/features/jobs.get.mjs +1 -1
  371. package/.output/server/chunks/routes/api/workshop/eda/features/run.post.mjs +1 -1
  372. package/.output/server/chunks/routes/api/workshop/eda/golden/_id_.delete.mjs +1 -1
  373. package/.output/server/chunks/routes/api/workshop/eda/golden/deviation.get.mjs +1 -1
  374. package/.output/server/chunks/routes/api/workshop/eda/golden/single.get.mjs +1 -1
  375. package/.output/server/chunks/routes/api/workshop/eda/index.get.mjs +1 -1
  376. package/.output/server/chunks/routes/api/workshop/eda/index.post.mjs +1 -1
  377. package/.output/server/chunks/routes/api/workshop/eda/index2.get.mjs +1 -1
  378. package/.output/server/chunks/routes/api/workshop/eda/index2.post.mjs +1 -1
  379. package/.output/server/chunks/routes/api/workshop/eda/index3.get.mjs +1 -1
  380. package/.output/server/chunks/routes/api/workshop/eda/index3.post.mjs +1 -1
  381. package/.output/server/chunks/routes/api/workshop/eda/index4.get.mjs +1 -1
  382. package/.output/server/chunks/routes/api/workshop/eda/index4.post.mjs +1 -1
  383. package/.output/server/chunks/routes/api/workshop/eda/index5.get.mjs +1 -1
  384. package/.output/server/chunks/routes/api/workshop/eda/index5.post.mjs +1 -1
  385. package/.output/server/chunks/routes/api/workshop/eda/index6.get.mjs +1 -1
  386. package/.output/server/chunks/routes/api/workshop/eda/index6.post.mjs +1 -1
  387. package/.output/server/chunks/routes/api/workshop/eda/index7.get.mjs +1 -1
  388. package/.output/server/chunks/routes/api/workshop/eda/index7.post.mjs +1 -1
  389. package/.output/server/chunks/routes/api/workshop/eda/index8.get.mjs +1 -1
  390. package/.output/server/chunks/routes/api/workshop/eda/index8.post.mjs +1 -1
  391. package/.output/server/chunks/routes/api/workshop/eda/ocap/_id_.get.mjs +1 -1
  392. package/.output/server/chunks/routes/api/workshop/eda/ocap/_id_.patch.mjs +1 -1
  393. package/.output/server/chunks/routes/api/workshop/eda/runs/_id/labels.patch.mjs +1 -1
  394. package/.output/server/chunks/routes/api/workshop/eda/runs.get.mjs +1 -1
  395. package/.output/server/chunks/routes/api/workshop/eda/spc/_id/recompute.post.mjs +1 -1
  396. package/.output/server/chunks/routes/api/workshop/eda/spc/_id_.delete.mjs +1 -1
  397. package/.output/server/chunks/routes/api/workshop/eda/spc/_id_.get.mjs +1 -1
  398. package/.output/server/chunks/routes/api/workshop/eda/templates/_id_.delete.mjs +1 -1
  399. package/.output/server/chunks/routes/api/workshop/eda/templates/_id_.get.mjs +1 -1
  400. package/.output/server/chunks/routes/api/workshop/eda/templates/_id_.patch.mjs +1 -1
  401. package/.output/server/chunks/routes/api/workshop/eda/vm/predict.post.mjs +1 -1
  402. package/.output/server/chunks/routes/api/workshop/exp/confirmations/_id/decide.post.mjs +1 -1
  403. package/.output/server/chunks/routes/api/workshop/exp/index.get.mjs +1 -1
  404. package/.output/server/chunks/routes/api/workshop/fs/dirs.get.mjs +1 -1
  405. package/.output/server/chunks/routes/api/workshop/harnesses/_id/providers.get.mjs +1 -1
  406. package/.output/server/chunks/routes/api/workshop/harnesses.get.mjs +1 -1
  407. package/.output/server/chunks/routes/api/workshop/hitl/pending.get.mjs +1 -1
  408. package/.output/server/chunks/routes/api/workshop/hitl/respond.post.mjs +1 -1
  409. package/.output/server/chunks/routes/api/workshop/index.get.mjs +1 -1
  410. package/.output/server/chunks/routes/api/workshop/index.mjs +1 -1
  411. package/.output/server/chunks/routes/api/workshop/index.post.mjs +1 -1
  412. package/.output/server/chunks/routes/api/workshop/index.put.mjs +1 -1
  413. package/.output/server/chunks/routes/api/workshop/index10.get.mjs +1 -1
  414. package/.output/server/chunks/routes/api/workshop/index10.post.mjs +1 -1
  415. package/.output/server/chunks/routes/api/workshop/index11.get.mjs +1 -1
  416. package/.output/server/chunks/routes/api/workshop/index12.get.mjs +1 -1
  417. package/.output/server/chunks/routes/api/workshop/index13.get.mjs +1 -1
  418. package/.output/server/chunks/routes/api/workshop/index14.get.mjs +1 -1
  419. package/.output/server/chunks/routes/api/workshop/index15.get.mjs +1 -1
  420. package/.output/server/chunks/routes/api/workshop/index16.get.mjs +1 -1
  421. package/.output/server/chunks/routes/api/workshop/index2.get.mjs +1 -1
  422. package/.output/server/chunks/routes/api/workshop/index2.post.mjs +1 -1
  423. package/.output/server/chunks/routes/api/workshop/index3.get.mjs +1 -1
  424. package/.output/server/chunks/routes/api/workshop/index3.post.mjs +1 -1
  425. package/.output/server/chunks/routes/api/workshop/index4.get.mjs +1 -1
  426. package/.output/server/chunks/routes/api/workshop/index4.post.mjs +1 -1
  427. package/.output/server/chunks/routes/api/workshop/index5.get.mjs +1 -1
  428. package/.output/server/chunks/routes/api/workshop/index5.post.mjs +1 -1
  429. package/.output/server/chunks/routes/api/workshop/index6.get.mjs +1 -1
  430. package/.output/server/chunks/routes/api/workshop/index6.post.mjs +1 -1
  431. package/.output/server/chunks/routes/api/workshop/index7.get.mjs +1 -1
  432. package/.output/server/chunks/routes/api/workshop/index7.post.mjs +1 -1
  433. package/.output/server/chunks/routes/api/workshop/index8.get.mjs +1 -1
  434. package/.output/server/chunks/routes/api/workshop/index8.post.mjs +1 -1
  435. package/.output/server/chunks/routes/api/workshop/index9.get.mjs +1 -1
  436. package/.output/server/chunks/routes/api/workshop/index9.post.mjs +1 -1
  437. package/.output/server/chunks/routes/api/workshop/mailbox/all.get.mjs +1 -1
  438. package/.output/server/chunks/routes/api/workshop/mailbox.get.mjs +1 -1
  439. package/.output/server/chunks/routes/api/workshop/memories/maintenance.post.mjs +1 -1
  440. package/.output/server/chunks/routes/api/workshop/mes/datasets.get.mjs +1 -1
  441. package/.output/server/chunks/routes/api/workshop/mes/index.get.mjs +1 -1
  442. package/.output/server/chunks/routes/api/workshop/mes/index.put.mjs +1 -1
  443. package/.output/server/chunks/routes/api/workshop/mes/points.get.mjs +1 -1
  444. package/.output/server/chunks/routes/api/workshop/mes/preview.post.mjs +1 -1
  445. package/.output/server/chunks/routes/api/workshop/mes/secrets/_ref_.delete.mjs +1 -1
  446. package/.output/server/chunks/routes/api/workshop/notifications/read.post.mjs +1 -1
  447. package/.output/server/chunks/routes/api/workshop/ontology/drafts/_draftId/autofix.mjs +1 -1
  448. package/.output/server/chunks/routes/api/workshop/ontology/drafts/_draftId/compile.mjs +1 -1
  449. package/.output/server/chunks/routes/api/workshop/ontology/drafts/_draftId/evidence.mjs +1 -1
  450. package/.output/server/chunks/routes/api/workshop/ontology/drafts/_draftId/publish.mjs +1 -1
  451. package/.output/server/chunks/routes/api/workshop/ontology/drafts/_draftId/rules/_ruleId/approval-decision.mjs +1 -1
  452. package/.output/server/chunks/routes/api/workshop/ontology/drafts/_draftId/rules/_ruleId/approval.mjs +1 -1
  453. package/.output/server/chunks/routes/api/workshop/ontology/drafts/_draftId/rules/_ruleId/transition.mjs +1 -1
  454. package/.output/server/chunks/routes/api/workshop/ontology/drafts/_draftId/subgraph.mjs +1 -1
  455. package/.output/server/chunks/routes/api/workshop/ontology/drafts/_draftId/validate.mjs +1 -1
  456. package/.output/server/chunks/routes/api/workshop/ontology/drafts/_draftId_.mjs +1 -1
  457. package/.output/server/chunks/routes/api/workshop/ontology/export/_ontologyId_.mjs +1 -1
  458. package/.output/server/chunks/routes/api/workshop/ontology/index.mjs +1 -1
  459. package/.output/server/chunks/routes/api/workshop/ontology/scene.mjs +1 -1
  460. package/.output/server/chunks/routes/api/workshop/ontology/traces/_ontologyId_.mjs +1 -1
  461. package/.output/server/chunks/routes/api/workshop/ontology/versions/_ontologyId/compare.mjs +1 -1
  462. package/.output/server/chunks/routes/api/workshop/ontology/versions/_ontologyId_.mjs +1 -1
  463. package/.output/server/chunks/routes/api/workshop/optimization/bindings/_id_.delete.mjs +1 -1
  464. package/.output/server/chunks/routes/api/workshop/optimization/capabilities.get.mjs +1 -1
  465. package/.output/server/chunks/routes/api/workshop/optimization/index.get.mjs +1 -1
  466. package/.output/server/chunks/routes/api/workshop/optimization/index.mjs +1 -1
  467. package/.output/server/chunks/routes/api/workshop/optimization/index2.mjs +1 -1
  468. package/.output/server/chunks/routes/api/workshop/optimization/profiles/_id/publish.post.mjs +1 -1
  469. package/.output/server/chunks/routes/api/workshop/optimization/recommendations/_id/crosscheck.post.mjs +1 -1
  470. package/.output/server/chunks/routes/api/workshop/optimization/recommendations/_id/dispatch.post.mjs +1 -1
  471. package/.output/server/chunks/routes/api/workshop/optimization/solve.post.mjs +1 -1
  472. package/.output/server/chunks/routes/api/workshop/plugins/_name/disable.post.mjs +1 -1
  473. package/.output/server/chunks/routes/api/workshop/plugins/_name/enable.post.mjs +1 -1
  474. package/.output/server/chunks/routes/api/workshop/plugins/index.get.mjs +1 -1
  475. package/.output/server/chunks/routes/api/workshop/process-model/datasets.post.mjs +1 -1
  476. package/.output/server/chunks/routes/api/workshop/process-model/eligibility.mjs +1 -1
  477. package/.output/server/chunks/routes/api/workshop/process-model/experiments.mjs +305 -20
  478. package/.output/server/chunks/routes/api/workshop/process-model/experiments.mjs.map +1 -1
  479. package/.output/server/chunks/routes/api/workshop/process-model/index.mjs +1 -1
  480. package/.output/server/chunks/routes/api/workshop/process-model/specs/_id/publish.post.mjs +1 -1
  481. package/.output/server/chunks/routes/api/workshop/process-model/train.post.mjs +1 -1
  482. package/.output/server/chunks/routes/api/workshop/runtime.get.mjs +1 -1
  483. package/.output/server/chunks/routes/api/workshop/scene/layouts/_channelId_.delete.mjs +1 -1
  484. package/.output/server/chunks/routes/api/workshop/scene/layouts/_channelId_.put.mjs +1 -1
  485. package/.output/server/chunks/routes/api/workshop/scene/layouts.get.mjs +1 -1
  486. package/.output/server/chunks/routes/api/workshop/schedules/_id/run.post.mjs +1 -1
  487. package/.output/server/chunks/routes/api/workshop/schedules/_id/runs.get.mjs +1 -1
  488. package/.output/server/chunks/routes/api/workshop/schedules/_id_.delete.mjs +1 -1
  489. package/.output/server/chunks/routes/api/workshop/schedules/_id_.get.mjs +1 -1
  490. package/.output/server/chunks/routes/api/workshop/schedules/_id_.patch.mjs +1 -1
  491. package/.output/server/chunks/routes/api/workshop/tasks/_id/complete.post.mjs +1 -1
  492. package/.output/server/chunks/routes/api/workshop/tasks/_id/dispatch.post.mjs +1 -1
  493. package/.output/server/chunks/routes/api/workshop/tasks/_id/index.post.mjs +1 -1
  494. package/.output/server/chunks/routes/api/workshop/tasks/_id/reassign.post.mjs +1 -1
  495. package/.output/server/chunks/routes/api/workshop/tasks/_id/reopen.post.mjs +1 -1
  496. package/.output/server/chunks/routes/api/workshop/tasks/_id/report.post.mjs +1 -1
  497. package/.output/server/chunks/routes/api/workshop/tasks/_id/retry.post.mjs +1 -1
  498. package/.output/server/chunks/routes/api/workshop/tasks/_id/supersede.post.mjs +1 -1
  499. package/.output/server/chunks/routes/api/workshop/tasks/_id/update.post.mjs +1 -1
  500. package/.output/server/chunks/routes/api/workshop/tasks/_id_.get.mjs +1 -1
  501. package/.output/server/chunks/routes/api/workshop/tasks.get.mjs +1 -1
  502. package/.output/server/chunks/routes/api/workshop/teams/_id/deploy.post.mjs +1 -1
  503. package/.output/server/chunks/routes/api/workshop/teams/_id/index.get.mjs +1 -1
  504. package/.output/server/chunks/routes/api/workshop/teams/_id/index.post.mjs +1 -1
  505. package/.output/server/chunks/routes/api/workshop/teams/_id/index.put.mjs +1 -1
  506. package/.output/server/chunks/routes/api/workshop/teams/_id/index2.get.mjs +1 -1
  507. package/.output/server/chunks/routes/api/workshop/teams/_id/members/_agentId_.delete.mjs +1 -1
  508. package/.output/server/chunks/routes/api/workshop/teams/_id_.delete.mjs +1 -1
  509. package/.output/server/chunks/routes/api/workshop/teams/_id_.get.mjs +1 -1
  510. package/.output/server/chunks/routes/api/workshop/teams/_id_.patch.mjs +1 -1
  511. package/.output/server/chunks/routes/api/workshop/tools/_name_.get.mjs +1 -1
  512. package/.output/server/chunks/routes/api/workshop/tools/sync.post.mjs +1 -1
  513. package/.output/server/chunks/routes/api/workshop/users/me.get.mjs +1 -1
  514. package/.output/server/chunks/routes/api/workshop/users/register.post.mjs +1 -1
  515. package/.output/server/chunks/routes/api/workshop/workspaces/_id/channel-templates/_tplId_.post.mjs +2 -2
  516. package/.output/server/chunks/routes/api/workshop/workspaces/_id/channels/_channelId_.delete.mjs +1 -1
  517. package/.output/server/chunks/routes/api/workshop/workspaces/_id/channels/_channelId_.post.mjs +1 -1
  518. package/.output/server/chunks/routes/api/workshop/workspaces/index.delete.mjs +1 -1
  519. package/.output/server/chunks/routes/renderer.mjs +2 -2
  520. package/.output/server/chunks/virtual/entry.mjs +5 -1
  521. package/.output/server/chunks/virtual/precomputed.mjs +1 -1
  522. package/.output/server/index.mjs +1 -1
  523. package/.output/server/package.json +1 -1
  524. package/README-zh.md +3 -3
  525. package/README.md +3 -3
  526. package/config.yml +1 -1
  527. package/docs/aml.md +112 -112
  528. package/docs/cli.en.md +4 -4
  529. package/docs/cli.md +3 -3
  530. package/docs/plugins.en.md +1 -1
  531. package/docs/plugins.md +1 -1
  532. package/docs/sdk.en.md +1 -1
  533. package/docs/sdk.md +1 -1
  534. package/i18n/locales/en.ts +2 -0
  535. package/i18n/locales/zh-CN.ts +2 -0
  536. package/package.json +1 -1
  537. package/scripts/_audit/demo-shot-studio.mjs +37 -0
  538. package/scripts/_audit/demo-shots.mjs +38 -0
  539. package/scripts/_audit/gen-demo-report.py +69 -0
  540. package/scripts/_audit/mqtt-pub.mjs +13 -0
  541. package/scripts/_audit/mqtt-topic-probe.mjs +15 -0
  542. package/scripts/_audit/proto-b3-device-4021.mjs +90 -0
  543. package/scripts/_audit/proto-doc-device-4120.mjs +53 -0
  544. package/scripts/acceptance-scientific-loop.ts +224 -0
  545. package/scripts/generate-identifiability-fixtures.ts +98 -0
  546. package/server/api/workshop/process-model/experiments.ts +28 -2
  547. package/server/plugins-builtin/diag-bridge/host/plugin.mjs +759 -753
  548. package/server/plugins-builtin/rag-bridge/index.mjs +490 -484
  549. package/server/repositories/user.repository.ts +24 -1
  550. package/server/services/user.service.ts +8 -6
  551. package/server/services/workshop/agents/host-tool-bridge/catalog.ts +2 -0
  552. package/server/services/workshop/agents/host-tool-bridge/tools/industrial.ts +4 -1
  553. package/server/services/workshop/agents/host-tool-bridge/tools/messaging.ts +5 -1
  554. package/server/services/workshop/agents/industrial/aml-dataset-tools.ts +3 -0
  555. package/server/services/workshop/agents/industrial/bench-approval-only.ts +335 -58
  556. package/server/services/workshop/agents/industrial/dcw-tools.ts +7 -1
  557. package/server/services/workshop/agents/industrial/identifiability-tools.ts +247 -0
  558. package/server/services/workshop/agents/industrial/index.ts +1 -0
  559. package/server/services/workshop/agents/industrial/manual-approval.ts +3 -1
  560. package/server/services/workshop/agents/industrial/ops-tools.ts +58 -15
  561. package/server/services/workshop/agents/industrial/optimization-tools.ts +33 -19
  562. package/server/services/workshop/agents/plugin-governance.ts +22 -2
  563. package/server/services/workshop/aml/action-coverage.ts +253 -0
  564. package/server/services/workshop/aml/causal-claim.ts +68 -0
  565. package/server/services/workshop/aml/dataset-builder.ts +19 -0
  566. package/server/services/workshop/aml/gates.ts +45 -1
  567. package/server/services/workshop/aml/identifiability.ts +335 -0
  568. package/server/services/workshop/aml/intervention-ledger.ts +281 -0
  569. package/server/services/workshop/aml/ontology-learning.ts +143 -0
  570. package/server/services/workshop/aml/twin/cross-check.ts +176 -0
  571. package/server/services/workshop/daq/daq-controller/contracts.ts +3 -0
  572. package/server/services/workshop/daq/daq-controller/crud.ts +12 -2
  573. package/server/services/workshop/daq/daq-controller/push.ts +22 -0
  574. package/server/services/workshop/daq/drivers/mqtt.ts +28 -0
  575. package/server/services/workshop/daq/drivers/shared.ts +6 -0
  576. package/server/services/workshop/db/database/open.ts +2 -0
  577. package/server/services/workshop/db/database/rows.ts +4 -1
  578. package/server/services/workshop/db/database/schema.ts +38 -2
  579. package/server/services/workshop/db/message.repo.ts +10 -3
  580. package/server/services/workshop/dcw/dcw-controller/write-audit.ts +21 -1
  581. package/server/services/workshop/process-model/experiment-runner.ts +393 -0
  582. package/server/services/workshop/process-model/experiment.ts +25 -10
  583. package/server/services/workshop/runtime/agent-runtime/lifecycle.ts +34 -11
  584. package/server/services/workshop/runtime/agent-runtime/state.ts +6 -1
  585. package/server/services/workshop/settings.ts +4 -1
  586. package/server/services/workshop/types/a2a.ts +16 -1
  587. package/shared/config/schema.json +2 -0
  588. package/shared/dcw-protocol/closed-loop.ts +2 -0
  589. package/.output/public/_nuxt/builds/meta/1231252d-2864-43c0-83b2-4e70d3b86dea.json +0 -1
@@ -0,0 +1,69 @@
1
+ """DEMO2 报告 HTML 生成器:读取 REPORT.md 结构 + shots/*.png 内嵌为单文件 report.html。"""
2
+ import base64
3
+ import os
4
+ from pathlib import Path
5
+
6
+ ROOT = Path(r'D:/codes/ABO/AgentWorkShop/docs/audit/evidence/2026-10-31-demo2')
7
+ SHOTS = ROOT / 'shots'
8
+
9
+ images = {}
10
+ for f in sorted(SHOTS.glob('*.png')):
11
+ images[f.stem] = base64.b64encode(f.read_bytes()).decode()
12
+
13
+ def img(stem, caption):
14
+ if stem not in images:
15
+ return ''
16
+ return '<figure><img src="data:image/png;base64,{b}" alt="{a}"/><figcaption>{c}</figcaption></figure>'.format(
17
+ b=images[stem], a=html_escape(caption), c=html_escape(caption))
18
+
19
+ def html_escape(text):
20
+ return (text.replace('&', '&amp;').replace('<', '&lt;').replace('>', '&gt;'))
21
+
22
+ sections = []
23
+ sections.append(('0. 结论', '<p class="lead">干净重启后,六大业务面(数采/数控/配方/日志/分析/EDA)在<b>真实 UI + 真实 API</b> 上全部走通并截图存证;harness 以 <code>ustc/deepseek-flash</code> 下发保压时间单变量寻优任务,<b>多 Agent 编排、HITL 审批、5 次写全部 ACK、负结果如实判定、complete_task 正常闭合</b>,KB 经验真实落库(7 chunks+向量索引,检索命中 0.772)。</p>'))
24
+ sections.append(('1. G1 干净重启', '<p>杀 40+ 进程树,15 端口全部释放后按依赖序重启;7 端点健康矩阵全 200(3300/3210/5180/8771/6789/4010/15160),admin token 验真通过。</p>'))
25
+ sections.append(('2. G2 数采管理业务', '<p>REST 创建面新建节点 <b>DEMO-缺陷率</b>(dn-46f0c0dd,http 驱动指向 sim 缺陷率信号,2s 周期)→ 控制器 startAll → <b>15/15 节点在线</b> → 2.7s 新鲜度采样 → 批量导出。实时事件流可见节点创建留痕。</p>' + img('02-daq-page', '数采中心:15/15 在线,发布 4123 · 消费 4114 · 入库 4110;实时事件含「创建数采节点 DEMO-缺陷率」')))
26
+ sections.append(('3. G3 数控下发', '<p>cool-water-sp 24→24.5℃(MQTT 平面 <code>transport-ack</code>);三条负向全中:+1℃ 撞单步限幅 0.7℃、999℃ 撞安全量程 10~45℃、60s 内重写撞频控。与 OPC UA 平面 <code>readback-verified</code> 构成<b>分级 ack 双类别</b>实证。</p>' + img('01-dcw-page', '产线运营:注塑线卡片(运行中,节点11/产品1/配方1)')))
27
+ sections.append(('4. G4 Recipe 管理', '<p>rc-923da07b <b>v2</b>(goal 阶梯固化产物),11 参数全带窗口值;操作流水完整呈现 recipe 语义链:trial 整批下发 → ACK 鉴定(证实 1/1)→ judge(keep)→ update_agent(v2)。</p>' + img('03-operations-page', '产线操作流水:39 写控 / 18 数采 / 13 配方 / 20 回退 / 5 告警全分类留痕')))
28
+ sections.append(('5. G5 日志 / 分析 / EDA', '<p><b>产线日志</b>(append-only):本轮每笔操作——节点创建、三次写拒绝、导出、下发——全部带归属(产线/产品/RECIPE)入账。<b>分析台账</b>:Agent 侧 + 用户侧双来源。<b>EDA 工坊</b>:趋势图渲染真实数据,新建节点曲线恰从创建时刻出现。</p>'
29
+ + img('06-logs-page', '产线日志:三次写拒绝 / 节点创建 / 导出全部留痕')
30
+ + img('05-analysis-page', '数据分析台账:Agent 侧分析 + 用户侧验收分析,append-only')
31
+ + img('04-eda-studio', 'EDA 工坊:六种图型 + Golden 参考轨迹面板')
32
+ + img('04b-eda-chart-rendered', 'EDA 渲染:part-weight 带 + 熔温 + DEMO-缺陷率(自 17:22 创建时刻起)')))
33
+ sections.append(('6. G6 Harness 优化任务(ustc/deepseek-flash)', '<p>任务「DEMO2-保压时间单变量寻优(6→7.8s)」goal 下发 → 根 <code>5dc07bf8</code> <b>COMPLETED 100%</b>。执行链:①稳定性诊断重跑 82.6/B(独立 1Hz 导出自校验);②知识检索命中历史经验 → <b>主动取消九步阶梯</b>(诚实的负结果处理);③闭环经验<b>真实入库</b>(7 chunks+向量+图索引,检索命中 0.772);④保压时间 5 次写全部 ACK 1/1,<b>陈旧指令重放被 Agent 自查发现并标注</b>;⑤收口:负结果成立、配方保持 v2、窗口 0 越限、残留交人工、complete_task 正常闭合。</p>'
34
+ + img('09-channel-chat', '工作区实时观测:产线作业计数器(DCW 25/DAQ 43/AML 1/SAFE 12)+ Agent 取数事件流 + 生产主管执行中')
35
+ + img('11-channel-tasks', '任务观测:goal 任务与生产主管状态')))
36
+ sections.append(('7. 终态 KPI(最后一窗 5 分钟)',
37
+ '<table><tr><th>指标</th><th>n</th><th>均值</th><th>区间</th><th>规格</th></tr>'
38
+ '<tr><td>part-weight</td><td>289</td><td><b>32.201 g</b></td><td>32.09~32.33</td><td>32.5±0.35 达标</td></tr>'
39
+ '<tr><td>flash-rate</td><td>289</td><td>0.011 %</td><td>0~0.068</td><td>≤0.4 达标</td></tr>'
40
+ '<tr><td>sink-mark</td><td>289</td><td>1.302 %</td><td>1.098~1.604</td><td>≤1.5 达标</td></tr>'
41
+ '<tr><td>melt-temp-pv</td><td>288</td><td>246.7 ℃</td><td>245.8~247.6</td><td>235~262 达标</td></tr></table>'
42
+ '<p>hold-time-sp 终态:PLC <b>6.2 s</b>(配方 v2 目标 6.0;0.2s 偏移已如实标注交人工)。</p>'))
43
+ sections.append(('8. 结论', '<p class="lead">六大业务面全通且可追溯(UI+API+台账三向印证);harness 优化闭环在弱模型上表现出<b>超出预期的治理素养</b>(取消无谓阶梯、自查陈旧重放、负结果如实、正确 complete_task)。系统维持<b>受控试点 GO</b> 判定;演示全过程零平台缺陷、零静默失败。</p>'))
44
+
45
+ parts = []
46
+ for title, content in sections:
47
+ parts.append('<section><h2>' + html_escape(title) + '</h2>' + content + '</section>')
48
+ body = ''.join(parts)
49
+ doc = ('<!doctype html><html lang="zh"><head><meta charset="utf-8"><title>AgentWorkShop 实机演示报告 DEMO2 · 2026-10-31</title>'
50
+ '<style>'
51
+ 'body{background:#0d1117;color:#d8dee6;font-family:"Segoe UI","Microsoft YaHei",sans-serif;max-width:1180px;margin:0 auto;padding:28px;line-height:1.65}'
52
+ 'h1{color:#3fe0a8;font-size:26px;border-bottom:1px solid #1f2a37;padding-bottom:10px}'
53
+ 'h2{color:#7fd8ff;font-size:19px;margin-top:10px}'
54
+ 'code{background:#161f2c;color:#9fe8c0;padding:1px 6px;border-radius:4px;font-size:.92em}'
55
+ '.lead{font-size:15.5px;color:#eef3f8}.meta{color:#8aa0b4;font-size:13px}'
56
+ 'table{border-collapse:collapse;width:100%;margin:12px 0}'
57
+ 'th,td{border:1px solid #24303f;padding:7px 12px;text-align:left;font-size:14px}'
58
+ 'th{background:#16202e;color:#a8c7e0}'
59
+ 'figure{margin:16px 0;text-align:center}'
60
+ 'img{max-width:100%;border:1px solid #24303f;border-radius:8px;box-shadow:0 4px 18px rgba(0,0,0,.4)}'
61
+ 'figcaption{color:#8aa0b4;font-size:12.5px;margin-top:6px}'
62
+ 'section{background:#101823;border:1px solid #1c2735;border-radius:10px;padding:18px 24px;margin-bottom:18px}'
63
+ '</style></head><body>'
64
+ '<h1>AgentWorkShop 实机演示报告(第二轮 · DEMO2)</h1>'
65
+ '<p class="meta">2026-10-31 17:00~18:45 · v0.8.8 · 平台 3300(home=D:/tmp/aw-prod-1031)· 模型 ustc/deepseek-flash(omp)· 账本 .omc/ultragoal 7/7 · 截图 shots 目录 ×10</p>'
66
+ + body + '</body></html>')
67
+ out = ROOT / 'report.html'
68
+ out.write_text(doc, encoding='utf-8')
69
+ print('report.html written:', round(out.stat().st_size / 1024), 'KB')
@@ -0,0 +1,13 @@
1
+ // MQTT 一次性发布器:node mqtt-pub.mjs <url> <topic> <json>
2
+ import mqtt from 'mqtt'
3
+
4
+ const [, , url = 'mqtt://127.0.0.1:18830', topic = 'aw/blow/b3/cmd/pressure', json = '{"sp":2.6}'] = process.argv
5
+ const c = mqtt.connect(url, { connectTimeout: 3000, reconnectPeriod: 0 })
6
+ c.on('connect', () => {
7
+ c.publish(topic, json, { qos: 1 }, (err) => {
8
+ console.log(err ? `pub err: ${err.message}` : `published → ${topic} ${json}`)
9
+ c.end(true, () => process.exit(err ? 1 : 0))
10
+ })
11
+ })
12
+ c.on('error', (e) => { console.log(`conn err: ${String(e).slice(0, 120)}`); process.exit(1) })
13
+ setTimeout(() => { console.log('timeout'); process.exit(1) }, 8000).unref()
@@ -0,0 +1,15 @@
1
+ // MQTT 主题探针:订阅指定 broker/topic 6s,打印报文数与首条(验证设备端发布活性)
2
+ import mqtt from 'mqtt'
3
+
4
+ const [, , url = 'mqtt://127.0.0.1:1883', topic = 'aw/proto/doc/env'] = process.argv
5
+ const c = mqtt.connect(url, { connectTimeout: 3000 })
6
+ const got = []
7
+ c.on('connect', () => { c.subscribe(topic, { qos: 0 }) })
8
+ c.on('error', (e) => { console.log('conn err:', String(e).slice(0, 120)) })
9
+ c.on('message', (t, p) => got.push(p.toString().slice(0, 160)))
10
+ setTimeout(() => {
11
+ console.log(`topic=${topic} messages in 6s: ${got.length}`)
12
+ if (got[0]) console.log('first:', got[0])
13
+ c.end(true)
14
+ process.exit(0)
15
+ }, 6000)
@@ -0,0 +1,90 @@
1
+ // 3# 吹瓶产线(BC-3)设备模拟器 —— 严格按 docs/audit/2026-10-31-b3-blowline-protocol-manual.md v1.4 合同实现
2
+ // HTTP 4021: GET /api/v1/melt/pressure | GET /api/v1/preform/temp | GET /api/v1/wall/profile | PUT+GET /api/v1/head/temp/sp
3
+ // MQTT 18830: publish aw/blow/b3/env(2s, temp+humidity 同报文) | subscribe aw/blow/b3/cmd/pressure → 应用后 publish aw/blow/b3/sp/pressure
4
+ import http from 'node:http'
5
+ import mqtt from 'mqtt'
6
+ import { appendFileSync } from 'node:fs'
7
+
8
+ const LOG = 'D:/tmp/proto-b3-device-4021.log'
9
+ const log = (s) => { try { appendFileSync(LOG, `${new Date().toISOString()} ${s}\n`) } catch {} }
10
+ const PORT = 4021
11
+ const MQTT_URL = 'mqtt://127.0.0.1:18830'
12
+
13
+ const state = { headSp: 210.0, blowSp: 2.6 }
14
+ const noise = a => (Math.random() - 0.5) * 2 * a
15
+ const now = () => Date.now()
16
+
17
+ // 工况曲线(文档 §2/§6 期望带内)
18
+ const meltPressure = () => +(23.5 + 1.5 * Math.sin(Date.now() / 60000) + noise(0.05)).toFixed(2)
19
+ const preformTemp = () => +(105 + 2 * Math.sin(Date.now() / 120000) + noise(0.2)).toFixed(1)
20
+ const envTemp = () => +(22.3 + 0.5 * Math.sin(Date.now() / 300000) + noise(0.05)).toFixed(1)
21
+ const envHumidity = () => +(52 + 1.5 * Math.sin(Date.now() / 240000) + noise(0.1)).toFixed(1)
22
+ const wallProfile = () => Array.from({ length: 16 }, (_, i) =>
23
+ +(1.4 + 0.3 * Math.sin((i / 16) * Math.PI * 2) + 0.05 * Math.sin(Date.now() / 45000) + noise(0.005)).toFixed(3))
24
+
25
+ // ── HTTP 面 ──
26
+ const server = http.createServer((req, res) => {
27
+ const url = (req.url ?? '').split('?')[0]
28
+ const send = (code, body) => { res.writeHead(code, { 'content-type': 'application/json' }); res.end(JSON.stringify(body)) }
29
+ if (req.method === 'GET' && url === '/api/v1/melt/pressure')
30
+ return send(200, { code: 0, data: { pressure: meltPressure(), ts: now() } })
31
+ if (req.method === 'GET' && url === '/api/v1/preform/temp')
32
+ return send(200, { code: 0, data: { temp: preformTemp(), ts: now() } })
33
+ if (req.method === 'GET' && url === '/api/v1/wall/profile')
34
+ return send(200, { code: 0, data: { points: wallProfile(), ts: now() } })
35
+ if (req.method === 'GET' && url === '/api/v1/head/temp/sp')
36
+ return send(200, { code: 0, data: { sp: state.headSp, applied: true } })
37
+ // 集成注记 v1.4.1:平台 http 写驱动仅发 POST(硬编码,dcw/drivers/http.ts:47);网关为集成兼容
38
+ // 同时接受 POST 别名(合同原生语义仍为 PUT,厂家设备不变)
39
+ if ((req.method === 'PUT' || req.method === 'POST') && url === '/api/v1/head/temp/sp') {
40
+ let raw = ''
41
+ req.on('data', (c) => { raw += c })
42
+ req.on('end', () => {
43
+ try {
44
+ const body = JSON.parse(raw || '{}')
45
+ const sp = Number(body.sp)
46
+ if (!Number.isFinite(sp)) return send(400, { code: 4001, message: 'BAD_PAYLOAD: sp 非数值' })
47
+ if (sp < 150 || sp > 260) return send(400, { code: 4002, message: `OUT_OF_RANGE: ${sp} 超出 150~260` })
48
+ state.headSp = +sp.toFixed(1)
49
+ log(`HTTP SP head-temp → ${state.headSp}`)
50
+ // 集成注记 v1.4.1(续):写应答按平台 http 写驱动合同平铺设定值字段(顶层 bodyKey);
51
+ // 合同原文的嵌套信封保留在 GET 读取面。两点均为网关别名,厂家设备原生不变。
52
+ send(200, { sp: state.headSp, applied: true })
53
+ } catch (e) { send(400, { code: 4003, message: `BAD_JSON: ${String(e).slice(0, 60)}` }) }
54
+ })
55
+ return
56
+ }
57
+ if (req.method === 'GET' && url === '/health') return send(200, { ok: true, port: PORT, blowSp: state.blowSp, headSp: state.headSp })
58
+ send(404, { code: 404, message: `NOT_FOUND: ${url}` })
59
+ })
60
+
61
+ // ── MQTT 面 ──
62
+ const client = mqtt.connect(MQTT_URL, { connectTimeout: 4000, reconnectPeriod: 2000 })
63
+ client.on('connect', () => {
64
+ log(`mqtt connected ${MQTT_URL}`)
65
+ client.subscribe('aw/blow/b3/cmd/pressure', { qos: 1 })
66
+ setInterval(() => {
67
+ const payload = JSON.stringify({ temp: envTemp(), humidity: envHumidity(), ts: now() })
68
+ client.publish('aw/blow/b3/env', payload, { qos: 0 })
69
+ }, 2000)
70
+ })
71
+ client.on('message', (_topic, payload) => {
72
+ try {
73
+ const body = JSON.parse(payload.toString())
74
+ const sp = Number(body.sp)
75
+ if (!Number.isFinite(sp) || sp < 0 || sp > 3.0) {
76
+ log(`MQTT cmd REJECT sp=${sp}(量程 0~3.0 预警线)`)
77
+ return
78
+ }
79
+ // 文档 §3.2:设备应用后(延迟 <1s)发布确认报文
80
+ setTimeout(() => {
81
+ state.blowSp = +sp.toFixed(2)
82
+ const confirm = JSON.stringify({ sp: state.blowSp, applied: true, ts: now() })
83
+ client.publish('aw/blow/b3/sp/pressure', confirm, { qos: 1 })
84
+ log(`MQTT cmd APPLIED sp=${state.blowSp} → confirm published`)
85
+ }, 250)
86
+ } catch (e) { log(`MQTT cmd parse err: ${String(e).slice(0, 80)}`) }
87
+ })
88
+ client.on('error', e => log(`mqtt err: ${String(e).slice(0, 100)}`))
89
+
90
+ server.listen(PORT, () => log(`HTTP listening :${PORT} (合同=2026-10-31-b3-blowline-protocol-manual.md v1.4)`))
@@ -0,0 +1,53 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * 2026-10-31 文档驱动虚拟验证用设备端(HTTP)。
4
+ * 端点:
5
+ * GET /health → {ok}
6
+ * GET /pv → {value, ts} 箱体温度 PV(24.5~25.5 正弦)
7
+ * GET /sp → {setpoint, ts} 当前设定值(供 DAQ 回读)
8
+ * POST /sp → {setpoint} 写入设定值(供 DCW HTTP 驱动下发)
9
+ * GET /profile → {points[64], ts} 壁厚轮廓(2.5mm 附近)
10
+ * 仅监听 127.0.0.1:4120;无认证(虚拟验证专用)。
11
+ */
12
+ import http from 'node:http'
13
+
14
+ const PORT = Number(process.env.DOC_DEVICE_PORT ?? 4120)
15
+ const started = Date.now()
16
+ let setpoint = 25
17
+
18
+ const send = (res, code, body) => {
19
+ res.writeHead(code, { 'content-type': 'application/json; charset=utf-8' })
20
+ res.end(JSON.stringify(body))
21
+ }
22
+
23
+ const server = http.createServer(async (req, res) => {
24
+ const url = new URL(req.url ?? '/', `http://127.0.0.1:${PORT}`)
25
+ if (req.method === 'GET' && url.pathname === '/health') return send(res, 200, { ok: true, ts: Date.now() })
26
+ if (req.method === 'GET' && url.pathname === '/pv') {
27
+ const t = (Date.now() - started) / 1000
28
+ return send(res, 200, { value: Number((25 + Math.sin(t * 0.2) * 0.5).toFixed(3)), ts: Date.now() })
29
+ }
30
+ if (req.method === 'GET' && url.pathname === '/sp') return send(res, 200, { setpoint, ts: Date.now() })
31
+ if (req.method === 'POST' && url.pathname === '/sp') {
32
+ let raw = ''
33
+ for await (const chunk of req) raw += chunk
34
+ try {
35
+ const j = JSON.parse(raw || '{}')
36
+ const v = Number(j.setpoint)
37
+ if (Number.isFinite(v)) setpoint = v
38
+ }
39
+ catch { /* 非法 JSON:保持原值,仍返回当前值供排查 */ }
40
+ return send(res, 200, { ok: true, setpoint, ts: Date.now() })
41
+ }
42
+ if (req.method === 'GET' && url.pathname === '/profile') {
43
+ const t = (Date.now() - started) / 1000
44
+ const points = Array.from({ length: 64 }, (_, i) =>
45
+ Number((2.5 + Math.sin(i / 8 + t * 0.1) * 0.02 + Math.sin(i / 3) * 0.005).toFixed(4)))
46
+ return send(res, 200, { points, ts: Date.now() })
47
+ }
48
+ return send(res, 404, { error: 'not found' })
49
+ })
50
+
51
+ server.listen(PORT, '127.0.0.1', () => {
52
+ console.log(`[proto-doc-device] ready http://127.0.0.1:${PORT}`)
53
+ })
@@ -0,0 +1,224 @@
1
+ /**
2
+ * 科学探索闭环验收(E2E-1..4,docs/plans/2026-11-02-scientific-exploration-acceptance.md):
3
+ *
4
+ * 正交 DoE 计划(真实线分级 → HITL 批准 → 随机化步序)
5
+ * → 每步经 DCW 写咽喉真实落 intervention_events
6
+ * → 引擎判读(UNDERPOWERED/负结论/有效应)回填台账
7
+ * → 判定回灌 ontology_evidence(support/refute 计数)
8
+ * → 通道 B 解析"明确无耦合" + 模型通道"有效应" → 互审拒绝
9
+ * → G6:事故型数据集 FAIL / 正交型 PASS
10
+ *
11
+ * 隔离:临时 AW_HOME + 临时 sqlite;AW_BENCH_MODE=1 旁路 60s 在线写间隔(仅验收加速,
12
+ * 生产模式恒不旁路);所有副作用在临时目录,进程退出即丢弃。
13
+ * 运行:npx tsx --tsconfig .nuxt/tsconfig.server.json scripts/acceptance-scientific-loop.ts
14
+ */
15
+ import { mkdtempSync, mkdirSync, rmSync, writeFileSync } from 'node:fs'
16
+ import { tmpdir } from 'node:os'
17
+ import { join } from 'node:path'
18
+
19
+ const home = mkdtempSync(join(tmpdir(), 'aw-sci-e2e-'))
20
+ process.env.AGENTWORKSHOP_TEST = '1'
21
+ process.env.AW_MODE = 'home'
22
+ process.env.AW_HOME = home
23
+ process.env.AW_BENCH_MODE = '1'
24
+ process.env.AW_BENCH_ACK = '1'
25
+ delete process.env.AW_IDENT_GATE
26
+
27
+ let pass = 0
28
+ let fail = 0
29
+ const failures: string[] = []
30
+ function check(id: string, name: string, cond: boolean, detail: string): void {
31
+ if (cond) {
32
+ pass++
33
+ console.log(` PASS ${id} ${name}${detail ? ` — ${detail}` : ''}`)
34
+ }
35
+ else {
36
+ fail++
37
+ failures.push(`${id} ${name}: ${detail}`)
38
+ console.log(` FAIL ${id} ${name} — ${detail}`)
39
+ }
40
+ }
41
+
42
+ const { openWorkshopDb } = await import('../server/services/workshop/db/database/open')
43
+ const { configureAmlRuntime } = await import('../server/services/workshop/aml/runtime')
44
+ const { bindOpsRepos } = await import('../server/services/workshop/ops/ops')
45
+ const { createAlarmEventRepo, createApprovalHistoryRepo, createApprovalRequestRepo, createAuditRepo } = await import('../server/services/workshop/db/ops.repo')
46
+ const { getDcwLineRepo } = await import('../server/services/workshop/dcw/dcw-line.repo')
47
+ const { getDcwController } = await import('../server/services/workshop/dcw/dcw-controller')
48
+ const { createExperimentPlan } = await import('../server/services/workshop/process-model/experiment')
49
+ const { approveExperimentPlan, runExperimentPlan, parsePlan } = await import('../server/services/workshop/process-model/experiment-runner')
50
+ const ledger = await import('../server/services/workshop/aml/intervention-ledger')
51
+ const learning = await import('../server/services/workshop/aml/ontology-learning')
52
+ const { evaluateCrossCheck } = await import('../server/services/workshop/aml/twin/cross-check')
53
+ const { computeActionCoverage, assessDatasetActionCoverage } = await import('../server/services/workshop/aml/action-coverage')
54
+ const { getOntologyRepo } = await import('../server/services/workshop/ontology/repo')
55
+
56
+ console.log(`\n[科学探索闭环验收] AW_HOME=${home}`)
57
+ const db = openWorkshopDb(join(home, 'sci-loop.sqlite'))
58
+ configureAmlRuntime(db)
59
+ bindOpsRepos({
60
+ approvalHistory: createApprovalHistoryRepo(db),
61
+ alarmEvents: createAlarmEventRepo(db),
62
+ audit: createAuditRepo(db),
63
+ approvalRequests: createApprovalRequestRepo(db),
64
+ })
65
+
66
+ // ---------- 夹具:真实线 + 两个 mock 数控节点 + 已发布本体 ----------
67
+ const line = getDcwLineRepo().create({ name: '科学闭环验收线', simulated: false })
68
+ const controller = getDcwController()
69
+ const sp = controller.create({ name: '验收·熔体压力SP', templateRef: 'pressure-sp', driver: 'mock', driverConfig: { key: 'sci-sp' }, min: 0.6, max: 1.2, unit: 'MPa', decimals: 2, lineId: line.id, maxStep: 0.2 } as Parameters<typeof controller.create>[0])
70
+ const sp2 = controller.create({ name: '验收·熔体温度SP', templateRef: 'temp-sp', driver: 'mock', driverConfig: { key: 'sci-hold' }, min: 150, max: 200, unit: '℃', decimals: 1, lineId: line.id, maxStep: 10 } as Parameters<typeof controller.create>[0])
71
+ const nowIso = new Date().toISOString()
72
+ db.prepare(`INSERT INTO ontology_versions (id, version, name, line_id, parent_version, content_hash, compiled_json, changelog_json, status, owner_user_id, published_by, created_at, updated_at)
73
+ VALUES ('ont-sci', 1, '科学闭环本体', ?, NULL, '', '{}', '{}', 'published', 'u1', 'u1', ?, ?)`).run(line.id, nowIso, nowIso)
74
+
75
+ // 目标响应:壁厚 = 0.28 + 4.71min 振荡 + 噪声(与控制量无耦合 —— 事故形态的"真无耦合"世界)
76
+ const periodBeats = 4.71 * 60
77
+ let tick = 0
78
+ function series(beats: number): number[] {
79
+ const out: number[] = []
80
+ for (let i = 0; i < beats; i++) {
81
+ tick++
82
+ // 单一主导振荡 + 微噪声(与事故一致;不加高频纹波,避免把"局部纹波 vs 全局周期"混进来)
83
+ out.push(0.28 + 0.05 * Math.sin((2 * Math.PI * tick) / periodBeats) + 0.0008 * Math.sin(tick * 2.3))
84
+ }
85
+ return out
86
+ }
87
+ const targetId = 'daq-sci-thickness'
88
+ /** 按请求窗长生成拍数(生产语义:读多长窗就得多少拍) */
89
+ const beatsOf = (from: number, to: number): number => Math.max(60, Math.ceil((to - from) / 1000))
90
+ /** Leg A(事故形态):按窗长生成 282 拍周期振荡 —— 长历史能估出周期,短窗只能判欠功效 */
91
+ const readSeriesShort = async (_node: string, from: number, to: number) => series(beatsOf(from, to))
92
+ /** Leg B(充分窗负结论):恒定目标无效应 → 应判"无可分辨效应"并产生 refute 证据 */
93
+ const readSeriesLong = async (_node: string, from: number, to: number) => new Array<number>(beatsOf(from, to)).fill(0.28)
94
+
95
+ // ---------- E2E-1 真实线计划:创建 → 成本 → 批准 → 正交执行 ----------
96
+ console.log('\nE2E-1 真实线 DoE 分级与执行')
97
+ const plan = createExperimentPlan({
98
+ lineId: line.id,
99
+ levels: { [sp.id]: [1.2, 1.1, 1.0], [sp2.id]: [170, 180] },
100
+ repeats: 2,
101
+ settleMs: 1000,
102
+ observeMs: 1000,
103
+ targets: { [sp.id]: targetId, [sp2.id]: targetId },
104
+ dominantPeriodMs: 4.71 * 60_000,
105
+ })
106
+ const body = parsePlan(plan)
107
+ check('E2E-1a', '真实线计划创建即待批准', plan.status === 'awaiting_approval', `status=${plan.status}`)
108
+ check('E2E-1b', '成本核算含 3×主导周期与预计总时长', !!body.cost?.suggestedWindowMs && /3×主导周期/.test(body.cost!.summary), body.cost?.summary ?? '(无)')
109
+ check('E2E-1c', '步数 = (3+2)×2 = 10', body.cost?.steps === 10, `steps=${body.cost?.steps}`)
110
+
111
+ let rejected = false
112
+ try {
113
+ await runExperimentPlan(plan.id)
114
+ }
115
+ catch (err) {
116
+ rejected = /批准/.test(err instanceof Error ? err.message : String(err))
117
+ }
118
+ check('E2E-1d', '未批准执行被拒(HITL 是硬门)', rejected)
119
+
120
+ const approved = approveExperimentPlan(plan.id, 'rest:u-accept:1', 'u-accept')
121
+ check('E2E-1e', '人工批准后转 planned 并留痕', approved.status === 'planned' && parsePlan(approved).approvalId === 'rest:u-accept:1')
122
+
123
+ const result = await runExperimentPlan(plan.id, { readTargetSeries: readSeriesShort, readTargetMean: async () => 0.28, sleep: async () => {} })
124
+ check('E2E-1f', '计划执行完成(10/10 步)', result.status === 'done' && result.executedSteps === 10 && result.totalSteps === 10, `${result.status} ${result.executedSteps}/${result.totalSteps} ${result.failedReason ?? ''}`)
125
+
126
+ // 充分窗负结论(leg B):900 拍窗 + 恒定目标 → no_resolvable_effect → refute 证据
127
+ const planB = createExperimentPlan({
128
+ lineId: line.id,
129
+ levels: { [sp.id]: [1.2, 1.1] },
130
+ repeats: 1,
131
+ settleMs: 900_000,
132
+ observeMs: 1,
133
+ targets: { [sp.id]: targetId },
134
+ })
135
+ approveExperimentPlan(planB.id, 'rest:u-accept:2', 'u-accept')
136
+ const resultB = await runExperimentPlan(planB.id, { readTargetSeries: readSeriesLong, readTargetMean: async () => 0.28, sleep: async () => {} })
137
+ check('E2E-1g', '充分窗计划执行完成', resultB.status === 'done' && resultB.executedSteps === 2, `${resultB.status} ${resultB.executedSteps}/2 ${resultB.failedReason ?? ''}`)
138
+ for (const r of ledger.listInterventions({ nodeId: sp.id, limit: 50 }).filter(x => x.verdict === 'identifiable_effect')) {
139
+ console.log(` [诊断] ${r.hypothesis.slice(0, 40)} verdict=${r.verdict} effect=${r.effect} mde=${r.mde} detail=${JSON.stringify(r.verdictDetail?.reasons ?? [])}`)
140
+ }
141
+
142
+ // ---------- E2E-2 台账逐步落行 + 判定回填 + 证据回灌 ----------
143
+ console.log('\nE2E-2 台账 → 判定 → 本体证据')
144
+ for (const nodeId of [sp.id, sp2.id]) {
145
+ const rows = ledger.listInterventions({ nodeId, limit: 50 }).filter(r => r.hypothesis.startsWith(`[pexp:${plan.id}]`))
146
+ check('E2E-2a', `${nodeId} 台账逐步落行`, rows.length >= 2, `${rows.length} 行`)
147
+ check('E2E-2b', `${nodeId} 判定已回填(非 pending)`, rows.every(r => r.verdict !== 'pending'), rows.map(r => r.verdict).join(','))
148
+ }
149
+ const evidence = getOntologyRepo().listEvidence('ont-sci', { targetKind: 'relation', limit: 200 })
150
+ check('E2E-2c', '判定回灌 ontology_evidence(sourceType=intervention)', evidence.length > 0 && evidence.every(e => e.sourceType === 'intervention'), `${evidence.length} 条`)
151
+ const verdictOf = (detailJson: string): string | undefined => {
152
+ try {
153
+ return (JSON.parse(detailJson) as { verdict?: string }).verdict
154
+ }
155
+ catch {
156
+ return undefined
157
+ }
158
+ }
159
+ const verdicts = evidence.map(e => verdictOf(e.detailJson))
160
+ const spurious = verdicts.filter(v => v === 'identifiable_effect').length
161
+ const refutes = verdicts.filter(v => v === 'no_resolvable_effect').length
162
+ const underpowered = verdicts.filter(v => v === 'underpowered').length
163
+ // 事故形态(短窗)下正确结论是"欠功效";声称有效应 = 假阳性,必须为 0
164
+ check('E2E-2d', '短窗步骤不得声称有效应(假阳性=0)', spurious === 0, `identifiable_effect=${spurious}, underpowered=${underpowered}`)
165
+ // 充分窗负结论必须落成 refute 证据(可证伪的一等事实)
166
+ check('E2E-2e', '充分窗负结论计 refute(无耦合可断言)', refutes > 0, `refute=${refutes}`)
167
+
168
+ // ---------- E2E-3 通道 B 用回灌证据 + 模型通道冲突 → 拒绝 ----------
169
+ console.log('\nE2E-3 互审:本体明确无耦合 vs 模型有效应')
170
+ const coupling = learning.resolveCouplingFromOntology(line.id, sp.id, targetId)
171
+ check('E2E-3a', '本体无该耦合边 → 明确无路径(false)', coupling.hasCouplingPath === false, JSON.stringify({ has: coupling.hasCouplingPath, refute: coupling.refuteCount }))
172
+ const withEffect = { A: [[0.5, 0.3], [0, 0]], B: [[0], [1]], C: [[1, 0]], D: [[0]], mvOrder: [sp.id], cvOrder: [targetId] }
173
+ const cross = evaluateCrossCheck({
174
+ controlNodeId: sp.id, targetNodeId: targetId, proposedDelta: -0.2, auto: true,
175
+ model: { artifact: withEffect, targetNodeId: targetId },
176
+ ontology: { hasCouplingPath: coupling.hasCouplingPath, evidence: coupling.evidence },
177
+ identifiability: { verdict: 'UNDERPOWERED', mde: 0.003 },
178
+ })
179
+ check('E2E-3b', '自动模式拒绝且理由含"模型有效应"+"无耦合路径"', cross.decision === 'reject' && cross.conflicts.some(c => /模型预测有效应/.test(c) && /无耦合路径/.test(c)), cross.conflicts.join(' | '))
180
+ check('E2E-3c', '科学载荷带 MDE 与可证伪方式', cross.payload.mde === 0.003 && cross.payload.falsificationMethod.length > 20)
181
+
182
+ // ---------- E2E-4 G6 动作覆盖门 ----------
183
+ console.log('\nE2E-4 G6:事故型数据集 vs 正交数据集')
184
+ const incident = computeActionCoverage(sp.id, Array.from({ length: 600 }, (_, i) => (i < 300 ? 2.6 : 2.4)))
185
+ const orthogonal = computeActionCoverage(sp.id, [2.6, 2.5, 2.4, 2.5, 2.6, 2.5, 2.4].flatMap(v => new Array<number>(80).fill(v)))
186
+ const t = { minControlLevels: 3, maxCollinearity: 0.9 }
187
+ check('E2E-4a', '事故型(2 水平纯阶梯)G6 不通过', assessDatasetActionCoverage([incident], t).pass === false, incident.monolithicSequence ? 'monolithic' : '')
188
+ check('E2E-4b', '正交 ABAB(3 档往返)G6 通过', assessDatasetActionCoverage([orthogonal], t).pass === true, `levels=${orthogonal.distinctLevels} blocks=${orthogonal.levelBlocks.join('/')}`)
189
+
190
+ // ---------- 汇总 ----------
191
+ const outDir = join(home, 'evidence')
192
+ mkdirSync(outDir, { recursive: true })
193
+ const summary = {
194
+ at: new Date().toISOString(),
195
+ planId: plan.id,
196
+ lineId: line.id,
197
+ pass,
198
+ fail,
199
+ failures,
200
+ run: result,
201
+ evidenceRows: evidence.length,
202
+ refutes,
203
+ coupling: { hasCouplingPath: coupling.hasCouplingPath, refuteCount: coupling.refuteCount },
204
+ crossCheck: { decision: cross.decision, conflicts: cross.conflicts },
205
+ g6: { incident: assessDatasetActionCoverage([incident], t).pass, orthogonal: assessDatasetActionCoverage([orthogonal], t).pass },
206
+ }
207
+ writeFileSync(join(outDir, 'scientific-loop-report.json'), JSON.stringify(summary, null, 2))
208
+ console.log(`\n[结果] pass=${pass} fail=${fail}`)
209
+ console.log(`[证据] ${join(outDir, 'scientific-loop-report.json')}`)
210
+ if (fail > 0) {
211
+ console.error('失败项:')
212
+ for (const f of failures) console.error(` - ${f}`)
213
+ // Windows 下 sqlite 句柄未释放时删目录会 EPERM:清理失败不影响验收结论
214
+ try {
215
+ rmSync(home, { recursive: true, force: true })
216
+ }
217
+ catch { console.error(`[提示] 临时目录未清理:${home}`) }
218
+ process.exit(1)
219
+ }
220
+ try {
221
+ rmSync(home, { recursive: true, force: true })
222
+ }
223
+ catch { console.log(`[提示] 临时目录未清理:${home}`) }
224
+ console.log('[科学探索闭环] ALL PASS\n')
@@ -0,0 +1,98 @@
1
+ /**
2
+ * 可辨识性事故回放夹具生成器(P0,docs/plans/2026-11-02-scientific-exploration-plan.md)。
3
+ *
4
+ * 真实帧库随实例清场不可复取时,按事故参数确定性重构(种子固定,输出逐字节可复现):
5
+ * - 吹压 SP 2.6 → 2.4 bar(单步干预,与作业后半段完全共线的原始形态)
6
+ * - 目标(壁厚)含 4.71 min 主导振荡 + 高斯噪声
7
+ * - 预窗 35 min(参照事故 06:19–06:54 写前段),响应窗 47 s(参照探索 settle 45–47s)
8
+ * 验收口径(tests/identifiability.test.ts):引擎对该夹具必须输出 UNDERPOWERED +
9
+ * suggestedWindowMs ≈ 3×周期 ≈ 14.1 min —— 即"这次事故 100% 会被门禁挡住"的可执行断言。
10
+ *
11
+ * 运行:npx tsx --tsconfig .nuxt/tsconfig.server.json scripts/generate-identifiability-fixtures.ts
12
+ */
13
+ import { mkdirSync, writeFileSync } from 'node:fs'
14
+ import { dirname, join } from 'node:path'
15
+ import { fileURLToPath } from 'node:url'
16
+
17
+ const ROOT = join(dirname(fileURLToPath(import.meta.url)), '..')
18
+ const OUT = join(ROOT, 'tests', 'fixtures', 'identifiability-incident-replay.json')
19
+
20
+ interface FixtureMeta {
21
+ seed: number
22
+ beatMs: number
23
+ periodMin: number
24
+ amplitude: number
25
+ noiseStd: number
26
+ baseline: number
27
+ preMinutes: number
28
+ settleSeconds: number
29
+ spFrom: number
30
+ spTo: number
31
+ reference: string
32
+ }
33
+
34
+ const meta: FixtureMeta = {
35
+ seed: 20261102,
36
+ beatMs: 1000,
37
+ periodMin: 4.71,
38
+ amplitude: 0.05,
39
+ noiseStd: 0.002,
40
+ baseline: 0.28,
41
+ preMinutes: 35,
42
+ settleSeconds: 47,
43
+ spFrom: 2.6,
44
+ spTo: 2.4,
45
+ reference: '事故参数重构(2026-11-02 会话核验):吹压SP 2.6→2.4 bar 单步干预;壁厚 4.71min 主导振荡;探索响应窗 47s;预窗参照 06:19–06:54(35min)',
46
+ }
47
+
48
+ function mulberry32(seed: number): () => number {
49
+ let a = seed >>> 0
50
+ return () => {
51
+ a |= 0
52
+ a = (a + 0x6D2B79F5) | 0
53
+ let t = Math.imul(a ^ (a >>> 15), 1 | a)
54
+ t = (t + Math.imul(t ^ (t >>> 7), 61 | t)) ^ t
55
+ return ((t ^ (t >>> 15)) >>> 0) / 4294967296
56
+ }
57
+ }
58
+
59
+ /** Box-Muller 高斯噪声(确定性) */
60
+ function gaussianStream(seed: number): () => number {
61
+ const uni = mulberry32(seed)
62
+ let spare: number | null = null
63
+ return () => {
64
+ if (spare != null) {
65
+ const v = spare
66
+ spare = null
67
+ return v
68
+ }
69
+ const u1 = Math.max(1e-12, uni())
70
+ const u2 = uni()
71
+ const mag = Math.sqrt(-2 * Math.log(u1))
72
+ spare = mag * Math.sin(2 * Math.PI * u2)
73
+ return mag * Math.cos(2 * Math.PI * u2)
74
+ }
75
+ }
76
+
77
+ function build(): { target: { pre: number[], post: number[] }, control: { pre: number[], post: number[] } } {
78
+ const periodBeats = meta.periodMin * 60_000 / meta.beatMs
79
+ const nPre = meta.preMinutes * 60_000 / meta.beatMs
80
+ const nPost = meta.settleSeconds * 1000 / meta.beatMs
81
+ const gauss = gaussianStream(meta.seed)
82
+ const sample = (i: number, phaseOffset: number): number =>
83
+ meta.baseline + meta.amplitude * Math.sin((2 * Math.PI * i) / periodBeats + phaseOffset) + meta.noiseStd * gauss()
84
+ const pre: number[] = []
85
+ for (let i = 0; i < nPre; i++) pre.push(Number(sample(i, 0).toFixed(6)))
86
+ const post: number[] = []
87
+ for (let i = 0; i < nPost; i++) post.push(Number(sample(i, 0.7).toFixed(6)))
88
+ return {
89
+ target: { pre, post },
90
+ control: { pre: new Array<number>(nPre).fill(meta.spFrom), post: new Array<number>(nPost).fill(meta.spTo) },
91
+ }
92
+ }
93
+
94
+ const fixture = { meta, targetNodeId: 'sim-wall-thickness', controlNodeId: 'sim-blow-pressure-sp', ...build() }
95
+ mkdirSync(dirname(OUT), { recursive: true })
96
+ writeFileSync(OUT, JSON.stringify(fixture))
97
+ console.log(`fixture written: ${OUT}`)
98
+ console.log(`pre=${fixture.target.pre.length} beats, post=${fixture.target.post.length} beats, periodBeats=${meta.periodMin * 60000 / meta.beatMs}`)
@@ -1,12 +1,17 @@
1
1
  /**
2
- * GET /api/workshop/process-model/experiments?lineId= —— 模拟参数试验计划列表(非 admin 必须带 lineId)
3
- * POST —— 创建计划(仅 simulated 产线;真实线 SIM_ONLY_VIOLATION;创建入册 D16/SW1.6)
2
+ * GET /api/workshop/process-model/experiments?lineId= —— 参数试验计划列表(非 admin 必须带 lineId)
3
+ * POST —— body.action 分派:
4
+ * (缺省) 创建计划(仿真线→planned 可直接执行;真实线→awaiting_approval,单卡 HITL 批准);
5
+ * 'approve' 人工批准真实线计划(记录批准人/时间入 plan_json);
6
+ * 'run' 执行计划(执行器走 DCW 写咽喉:步限/60s 间隔/保持窗照常生效);
7
+ * 全部动作经 recordConfigAction 入册(D16/SW1.6)。
4
8
  */
5
9
  import { getQuery, readBody } from 'h3'
6
10
  import { defineApiHandler } from '@/server/utils/response'
7
11
  import { requireRole } from '@/server/api/workshop/caller'
8
12
  import { filterByLine } from '@/server/services/workshop/permissions'
9
13
  import { createExperimentPlan, listExperimentPlans } from '@/server/services/workshop/process-model/experiment'
14
+ import { approveExperimentPlan, runExperimentPlan } from '@/server/services/workshop/process-model/experiment-runner'
10
15
  import { assertOptimizationAccess, recordConfigAction } from '@/server/services/workshop/optimization/access'
11
16
 
12
17
  export default defineApiHandler(async (event) => {
@@ -21,6 +26,25 @@ export default defineApiHandler(async (event) => {
21
26
  return { plans: user.role === 'admin' ? rows : filterByLine(user, rows, (r: { lineId?: string }) => r.lineId) }
22
27
  }
23
28
  const body = await readBody<Record<string, unknown>>(event) ?? {}
29
+ const action = String(body.action ?? '')
30
+ if (action === 'approve' || action === 'run') {
31
+ const planId = String(body.planId ?? '')
32
+ if (!planId) throw createError({ statusCode: 400, statusMessage: 'planId required' })
33
+ const row = listExperimentPlans(undefined, 500).find(p => p.id === planId)
34
+ if (!row) throw createError({ statusCode: 404, statusMessage: 'plan not found' })
35
+ assertOptimizationAccess(user, 'write', { kind: 'experiment', lineId: row.lineId })
36
+ if (action === 'approve') {
37
+ const approved = approveExperimentPlan(planId, `rest:${user.id}:${Date.now()}`, user.id)
38
+ recordConfigAction(user, 'process_model.experiment.approve', { kind: 'process_model_experiment', id: planId },
39
+ `人工批准试验计划 ${planId}`, { lineId: row.lineId }, row.lineId)
40
+ return { plan: approved }
41
+ }
42
+ const result = await runExperimentPlan(planId)
43
+ recordConfigAction(user, 'process_model.experiment.run', { kind: 'process_model_experiment', id: planId },
44
+ `执行试验计划 ${planId}:${result.status}(${result.executedSteps}/${result.totalSteps} 步)${result.failedReason ? `;${result.failedReason}` : ''}`,
45
+ { lineId: row.lineId }, row.lineId)
46
+ return { result }
47
+ }
24
48
  const lineId = String(body.lineId ?? '')
25
49
  if (!lineId) throw createError({ statusCode: 400, statusMessage: 'lineId required' })
26
50
  assertOptimizationAccess(user, 'write', { kind: 'experiment', lineId })
@@ -35,6 +59,8 @@ export default defineApiHandler(async (event) => {
35
59
  abortOnAlarm: body.abortOnAlarm !== false,
36
60
  budget: body.budget as { maxRuns?: number, maxDurationMs?: number } | undefined,
37
61
  createdBy: user.id,
62
+ targets: body.targets as Record<string, string> | undefined,
63
+ dominantPeriodMs: typeof body.dominantPeriodMs === 'number' ? body.dominantPeriodMs : undefined,
38
64
  })
39
65
  const planDetail = JSON.parse(plan.planJson || '{}') as { repeats?: number, specId?: string | null }
40
66
  recordConfigAction(user, 'process_model.experiment.create', { kind: 'process_model_experiment', id: plan.id },