agentworkshop 0.7.51 → 0.7.52

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 (259) hide show
  1. package/.AgentWorkShop/prompts/host-tools.json +2028 -1955
  2. package/.output/.AgentWorkShop/prompts/host-tools.json +2028 -1955
  3. package/.output/nitro.json +1 -1
  4. package/.output/public/_nuxt/{CdIsmU5a2.js → 4wrEQ3np2.js} +1 -1
  5. package/.output/public/_nuxt/{asmJ99nX2.js → B8zP7kaj2.js} +1 -1
  6. package/.output/public/_nuxt/{D89BUtx6.js → B9cGf8mg.js} +1 -1
  7. package/.output/public/_nuxt/{CP0I2l-6.js → BVzw5a_0.js} +1 -1
  8. package/.output/public/_nuxt/{CFQSjB1h.js → B_opxrHJ.js} +1 -1
  9. package/.output/public/_nuxt/{BGAaKBeo2.js → BiUhxH3t2.js} +1 -1
  10. package/.output/public/_nuxt/{B7jlMWsz.js → C00Rd6Cg.js} +1 -1
  11. package/.output/public/_nuxt/{BOmDHp5L.js → CGQvF-Gg.js} +3 -3
  12. package/.output/public/_nuxt/CTvh8v4T.js +1 -0
  13. package/.output/public/_nuxt/{B9QzrmgE.js → Cbeifv55.js} +1 -1
  14. package/.output/public/_nuxt/{BWU1pvLL.js → CcGuXiOa.js} +1 -1
  15. package/.output/public/_nuxt/{zh-S_7rN2.js → CkPxL4UX2.js} +1 -1
  16. package/.output/public/_nuxt/{DzfVS8N72.js → D_Ce9Fon2.js} +1 -1
  17. package/.output/public/_nuxt/{DClNt1uS.js → Da90gveK.js} +1 -1
  18. package/.output/public/_nuxt/builds/latest.json +1 -1
  19. package/.output/public/_nuxt/builds/meta/c64014ca-3595-4b7a-a5ca-055687c83ba2.json +1 -0
  20. package/.output/public/_nuxt/channel-templates.DkNZg-lF.css +1 -0
  21. package/.output/public/_nuxt/{JAM4aNC_.js → evt5VGDh.js} +1 -1
  22. package/.output/public/_nuxt/{DhFv8S2Z.js → mNnuUoSy.js} +1 -1
  23. package/.output/public/_nuxt/{CU-mhG0-.js → mgWHSRc8.js} +1 -1
  24. package/.output/public/_nuxt/{jRTz0hjN2.js → qPsch_ny2.js} +1 -1
  25. package/.output/public/_nuxt/{lWYQbIR3.js → ty5W5QwO.js} +1 -1
  26. package/.output/public/_nuxt/{DMYYS5sK.js → xQX5r6tW.js} +1 -1
  27. package/.output/server/chunks/_/character-asset.repo.mjs +1 -1
  28. package/.output/server/chunks/_/entity.mjs +1 -1
  29. package/.output/server/chunks/_/host-bindings.mjs +1 -1
  30. package/.output/server/chunks/_/nitro.mjs +1209 -967
  31. package/.output/server/chunks/_/nitro.mjs.map +1 -1
  32. package/.output/server/chunks/_/scene-layout.repo.mjs +1 -1
  33. package/.output/server/chunks/build/TownView-fP9BiALv.mjs +1 -1
  34. package/.output/server/chunks/build/{_wsId_-DPy2BXRd.mjs → _wsId_-C4L9fVHC.mjs} +2 -2
  35. package/.output/server/chunks/build/{_wsId_-DPy2BXRd.mjs.map → _wsId_-C4L9fVHC.mjs.map} +1 -1
  36. package/.output/server/chunks/build/{agents-CDLcboCv.mjs → agents-ydYu-Ol9.mjs} +6 -6
  37. package/.output/server/chunks/build/{agents-CDLcboCv.mjs.map → agents-ydYu-Ol9.mjs.map} +1 -1
  38. package/.output/server/chunks/build/{channel-templates-DjEsj0_v.mjs → channel-templates-DP1ndA5K.mjs} +114 -25
  39. package/.output/server/chunks/build/channel-templates-DP1ndA5K.mjs.map +1 -0
  40. package/.output/server/chunks/build/daq-N69AOtgw.mjs +1 -1
  41. package/.output/server/chunks/build/dcw-CN9d3Rs7.mjs +1 -1
  42. package/.output/server/chunks/build/{pages-rZKH72eC.mjs → pages-BzmrmLL_.mjs} +3 -3
  43. package/.output/server/chunks/build/{pages-rZKH72eC.mjs.map → pages-BzmrmLL_.mjs.map} +1 -1
  44. package/.output/server/chunks/build/{schedules-lo4bfgVt.mjs → schedules-BYR-lA1k.mjs} +2 -2
  45. package/.output/server/chunks/build/{schedules-lo4bfgVt.mjs.map → schedules-BYR-lA1k.mjs.map} +1 -1
  46. package/.output/server/chunks/build/{settings-CAJWvul5.mjs → settings-UyZ78w2e.mjs} +2 -2
  47. package/.output/server/chunks/build/{settings-CAJWvul5.mjs.map → settings-UyZ78w2e.mjs.map} +1 -1
  48. package/.output/server/chunks/build/{teams-DBBvIToa.mjs → teams-D-Y5mzU7.mjs} +8 -8
  49. package/.output/server/chunks/build/{teams-DBBvIToa.mjs.map → teams-D-Y5mzU7.mjs.map} +1 -1
  50. package/.output/server/chunks/build/types-D6J7slEa.mjs +1 -1
  51. package/.output/server/chunks/build/{useAgentHarnessOptions-D6SJ_uUr.mjs → useAgentHarnessOptions-CRyQYYY0.mjs} +2 -2
  52. package/.output/server/chunks/build/{useAgentHarnessOptions-D6SJ_uUr.mjs.map → useAgentHarnessOptions-CRyQYYY0.mjs.map} +1 -1
  53. package/.output/server/chunks/build/{useAgentTemplateActions-CdG4g_PF.mjs → useAgentTemplateActions-CaRsOBmB.mjs} +2 -2
  54. package/.output/server/chunks/build/{useAgentTemplateActions-CdG4g_PF.mjs.map → useAgentTemplateActions-CaRsOBmB.mjs.map} +1 -1
  55. package/.output/server/chunks/build/{useAgentTemplateForm-a5y-N5sB.mjs → useAgentTemplateForm-ChiIuPYr.mjs} +2 -2
  56. package/.output/server/chunks/build/{useAgentTemplateForm-a5y-N5sB.mjs.map → useAgentTemplateForm-ChiIuPYr.mjs.map} +1 -1
  57. package/.output/server/chunks/build/{useAgentTemplatesCatalog-pBVcUuN3.mjs → useAgentTemplatesCatalog-Bf5hk6Jf.mjs} +2 -2
  58. package/.output/server/chunks/build/{useAgentTemplatesCatalog-pBVcUuN3.mjs.map → useAgentTemplatesCatalog-Bf5hk6Jf.mjs.map} +1 -1
  59. package/.output/server/chunks/build/useDaqAddNode-kW7uTSMQ.mjs +1 -1
  60. package/.output/server/chunks/build/useDaqDetailNode-D_vhG0jF.mjs +1 -1
  61. package/.output/server/chunks/build/useDaqDetailParams-JfqHvTxr.mjs +1 -1
  62. package/.output/server/chunks/build/useDaqFilters-BUQtZ82a.mjs +1 -1
  63. package/.output/server/chunks/build/useDaqStream-wOxZcMDA.mjs +1 -1
  64. package/.output/server/chunks/build/useDaqTemplates-BqQRdrIm.mjs +1 -1
  65. package/.output/server/chunks/build/{useDashboardData-Do_Vsepa.mjs → useDashboardData-CNOY4Bi3.mjs} +2 -2
  66. package/.output/server/chunks/build/{useDashboardData-Do_Vsepa.mjs.map → useDashboardData-CNOY4Bi3.mjs.map} +1 -1
  67. package/.output/server/chunks/build/useDcwAddNode-C1HDP3yG.mjs +1 -1
  68. package/.output/server/chunks/build/useDcwStream-D04kCV3J.mjs +1 -1
  69. package/.output/server/chunks/build/{useTeamActions-C4n-taBk.mjs → useTeamActions-C51ciLb0.mjs} +2 -2
  70. package/.output/server/chunks/build/{useTeamActions-C4n-taBk.mjs.map → useTeamActions-C51ciLb0.mjs.map} +1 -1
  71. package/.output/server/chunks/build/{useTeamAddMemberDialog-Cp_z3nMa.mjs → useTeamAddMemberDialog-DthpCMP8.mjs} +2 -2
  72. package/.output/server/chunks/build/{useTeamAddMemberDialog-Cp_z3nMa.mjs.map → useTeamAddMemberDialog-DthpCMP8.mjs.map} +1 -1
  73. package/.output/server/chunks/build/{useTeamCreateDialog-C8LKUoe2.mjs → useTeamCreateDialog-Dc2KTwyg.mjs} +2 -2
  74. package/.output/server/chunks/build/{useTeamCreateDialog-C8LKUoe2.mjs.map → useTeamCreateDialog-Dc2KTwyg.mjs.map} +1 -1
  75. package/.output/server/chunks/build/{useTeamDeployDialog-wdBVsNWY.mjs → useTeamDeployDialog-CXpvPnJD.mjs} +2 -2
  76. package/.output/server/chunks/build/{useTeamDeployDialog-wdBVsNWY.mjs.map → useTeamDeployDialog-CXpvPnJD.mjs.map} +1 -1
  77. package/.output/server/chunks/build/{useTeamPluginDialog-CIk8G8nI.mjs → useTeamPluginDialog-DTs-7SSm.mjs} +2 -2
  78. package/.output/server/chunks/build/{useTeamPluginDialog-CIk8G8nI.mjs.map → useTeamPluginDialog-DTs-7SSm.mjs.map} +1 -1
  79. package/.output/server/chunks/build/{useTeamsCatalog-D6TULzmS.mjs → useTeamsCatalog-CcpetYyW.mjs} +2 -2
  80. package/.output/server/chunks/build/{useTeamsCatalog-D6TULzmS.mjs.map → useTeamsCatalog-CcpetYyW.mjs.map} +1 -1
  81. package/.output/server/chunks/build/{useWorkshopApi-B1B9vd4m.mjs → useWorkshopApi-CO3ophqt.mjs} +5 -2
  82. package/.output/server/chunks/build/{useWorkshopApi-B1B9vd4m.mjs.map → useWorkshopApi-CO3ophqt.mjs.map} +1 -1
  83. package/.output/server/chunks/routes/api/mcp/workshop.mjs +1 -1
  84. package/.output/server/chunks/routes/api/workshop/agent-tools/bindings/grant.post.mjs +54 -0
  85. package/.output/server/chunks/routes/api/workshop/agent-tools/bindings/grant.post.mjs.map +1 -0
  86. package/.output/server/chunks/routes/api/workshop/agent-tools/bindings/revoke.post.mjs +51 -0
  87. package/.output/server/chunks/routes/api/workshop/agent-tools/bindings/revoke.post.mjs.map +1 -0
  88. package/.output/server/chunks/routes/api/workshop/agent-tools/index2.get.mjs +1 -1
  89. package/.output/server/chunks/routes/api/workshop/agent-tools/invoke.post.mjs +1 -1
  90. package/.output/server/chunks/routes/api/workshop/agent-tools/list.get.mjs +1 -1
  91. package/.output/server/chunks/routes/api/workshop/aml/datasets/_id/preview.get.mjs +1 -1
  92. package/.output/server/chunks/routes/api/workshop/aml/datasets/_id_.delete.mjs +1 -1
  93. package/.output/server/chunks/routes/api/workshop/aml/datasets/_id_.get.mjs +1 -1
  94. package/.output/server/chunks/routes/api/workshop/aml/datasets/_id_.patch.mjs +1 -1
  95. package/.output/server/chunks/routes/api/workshop/aml/entities/prune.post.mjs +1 -1
  96. package/.output/server/chunks/routes/api/workshop/aml/env/recheck.post.mjs +1 -1
  97. package/.output/server/chunks/routes/api/workshop/aml/env/uv.post.mjs +1 -1
  98. package/.output/server/chunks/routes/api/workshop/aml/env/venv.post.mjs +1 -1
  99. package/.output/server/chunks/routes/api/workshop/aml/index.get.mjs +1 -1
  100. package/.output/server/chunks/routes/api/workshop/aml/index.post.mjs +1 -1
  101. package/.output/server/chunks/routes/api/workshop/aml/index2.post.mjs +1 -1
  102. package/.output/server/chunks/routes/api/workshop/aml/index3.get.mjs +1 -1
  103. package/.output/server/chunks/routes/api/workshop/aml/index3.post.mjs +1 -1
  104. package/.output/server/chunks/routes/api/workshop/aml/index4.get.mjs +1 -1
  105. package/.output/server/chunks/routes/api/workshop/aml/index5.get.mjs +1 -1
  106. package/.output/server/chunks/routes/api/workshop/aml/index6.get.mjs +1 -1
  107. package/.output/server/chunks/routes/api/workshop/aml/index7.get.mjs +1 -1
  108. package/.output/server/chunks/routes/api/workshop/aml/jobs/_id/cancel.post.mjs +1 -1
  109. package/.output/server/chunks/routes/api/workshop/aml/jobs/_id/logs.get.mjs +1 -1
  110. package/.output/server/chunks/routes/api/workshop/aml/jobs/_id/retry.post.mjs +1 -1
  111. package/.output/server/chunks/routes/api/workshop/aml/jobs/_id_.delete.mjs +1 -1
  112. package/.output/server/chunks/routes/api/workshop/aml/jobs/_id_.get.mjs +1 -1
  113. package/.output/server/chunks/routes/api/workshop/aml/models/_id/predict.post.mjs +1 -1
  114. package/.output/server/chunks/routes/api/workshop/aml/models/_id/promote.post.mjs +1 -1
  115. package/.output/server/chunks/routes/api/workshop/aml/models/_id_.delete.mjs +1 -1
  116. package/.output/server/chunks/routes/api/workshop/aml/models/_id_.patch.mjs +1 -1
  117. package/.output/server/chunks/routes/api/workshop/aml/training-plans/_id/train.post.mjs +1 -1
  118. package/.output/server/chunks/routes/api/workshop/aml/training-plans/_id_.delete.mjs +1 -1
  119. package/.output/server/chunks/routes/api/workshop/aml/training-plans/_id_.patch.mjs +1 -1
  120. package/.output/server/chunks/routes/api/workshop/aml/twin/providers.get.mjs +1 -1
  121. package/.output/server/chunks/routes/api/workshop/assets/index.post.mjs +1 -1
  122. package/.output/server/chunks/routes/api/workshop/assets/index2.post.mjs +1 -1
  123. package/.output/server/chunks/routes/api/workshop/channel-templates/_id/instantiate.post.mjs +5 -4
  124. package/.output/server/chunks/routes/api/workshop/channel-templates/_id/instantiate.post.mjs.map +1 -1
  125. package/.output/server/chunks/routes/api/workshop/channels/_id/activate.post.mjs +1 -1
  126. package/.output/server/chunks/routes/api/workshop/channels/_id/chat/index.post.mjs +1 -1
  127. package/.output/server/chunks/routes/api/workshop/channels/_id/index.post.mjs +1 -1
  128. package/.output/server/chunks/routes/api/workshop/channels/_id/index.put.mjs +1 -1
  129. package/.output/server/chunks/routes/api/workshop/channels/_id/index3.post.mjs +1 -1
  130. package/.output/server/chunks/routes/api/workshop/channels/_id/index4.post.mjs +1 -1
  131. package/.output/server/chunks/routes/api/workshop/channels/_id/index5.get.mjs +1 -1
  132. package/.output/server/chunks/routes/api/workshop/channels/_id/terminals.get.mjs +1 -1
  133. package/.output/server/chunks/routes/api/workshop/channels/_id/twin-profile.get.mjs +1 -1
  134. package/.output/server/chunks/routes/api/workshop/channels/_id/twin-profile.patch.mjs +1 -1
  135. package/.output/server/chunks/routes/api/workshop/channels/index.get.mjs +1 -1
  136. package/.output/server/chunks/routes/api/workshop/channels.post.mjs +4 -4
  137. package/.output/server/chunks/routes/api/workshop/daq/_id/bind.post.mjs +1 -1
  138. package/.output/server/chunks/routes/api/workshop/daq/_id/bindings.put.mjs +1 -1
  139. package/.output/server/chunks/routes/api/workshop/daq/_id/frames/content.get.mjs +1 -1
  140. package/.output/server/chunks/routes/api/workshop/daq/_id/frames.get.mjs +1 -1
  141. package/.output/server/chunks/routes/api/workshop/daq/_id/samples.get.mjs +1 -1
  142. package/.output/server/chunks/routes/api/workshop/daq/_id/test.post.mjs +1 -1
  143. package/.output/server/chunks/routes/api/workshop/daq/_id_.delete.mjs +1 -1
  144. package/.output/server/chunks/routes/api/workshop/daq/_id_.patch.mjs +1 -1
  145. package/.output/server/chunks/routes/api/workshop/daq/alarms/_id/ack.post.mjs +1 -1
  146. package/.output/server/chunks/routes/api/workshop/daq/controller.post.mjs +1 -1
  147. package/.output/server/chunks/routes/api/workshop/daq/index.post.mjs +1 -1
  148. package/.output/server/chunks/routes/api/workshop/daq/infra/reconnect.post.mjs +1 -1
  149. package/.output/server/chunks/routes/api/workshop/daq/infra.get.mjs +1 -1
  150. package/.output/server/chunks/routes/api/workshop/daq/templates/_key_.delete.mjs +1 -1
  151. package/.output/server/chunks/routes/api/workshop/daq/templates/_key_.patch.mjs +1 -1
  152. package/.output/server/chunks/routes/api/workshop/daq/test-driver.post.mjs +1 -1
  153. package/.output/server/chunks/routes/api/workshop/dcw/_id/bind.post.mjs +1 -1
  154. package/.output/server/chunks/routes/api/workshop/dcw/_id/bindings.put.mjs +1 -1
  155. package/.output/server/chunks/routes/api/workshop/dcw/_id/param-ledger.get.mjs +1 -1
  156. package/.output/server/chunks/routes/api/workshop/dcw/_id/read.post.mjs +1 -1
  157. package/.output/server/chunks/routes/api/workshop/dcw/_id/test.post.mjs +1 -1
  158. package/.output/server/chunks/routes/api/workshop/dcw/_id/write.post.mjs +1 -1
  159. package/.output/server/chunks/routes/api/workshop/dcw/_id_.delete.mjs +1 -1
  160. package/.output/server/chunks/routes/api/workshop/dcw/_id_.patch.mjs +1 -1
  161. package/.output/server/chunks/routes/api/workshop/dcw/controller.post.mjs +1 -1
  162. package/.output/server/chunks/routes/api/workshop/dcw/index.get.mjs +1 -1
  163. package/.output/server/chunks/routes/api/workshop/dcw/index.post.mjs +1 -1
  164. package/.output/server/chunks/routes/api/workshop/dcw/index2.get.mjs +1 -1
  165. package/.output/server/chunks/routes/api/workshop/dcw/index2.post.mjs +1 -1
  166. package/.output/server/chunks/routes/api/workshop/dcw/index3.get.mjs +1 -1
  167. package/.output/server/chunks/routes/api/workshop/dcw/index3.post.mjs +1 -1
  168. package/.output/server/chunks/routes/api/workshop/dcw/index4.get.mjs +1 -1
  169. package/.output/server/chunks/routes/api/workshop/dcw/index4.post.mjs +1 -1
  170. package/.output/server/chunks/routes/api/workshop/dcw/index5.get.mjs +1 -1
  171. package/.output/server/chunks/routes/api/workshop/dcw/index5.post.mjs +1 -1
  172. package/.output/server/chunks/routes/api/workshop/dcw/index6.get.mjs +1 -1
  173. package/.output/server/chunks/routes/api/workshop/dcw/journal/node/_nodeId/rollback.post.mjs +1 -1
  174. package/.output/server/chunks/routes/api/workshop/dcw/line/query.get.mjs +1 -1
  175. package/.output/server/chunks/routes/api/workshop/dcw/lines/_id/start.post.mjs +1 -1
  176. package/.output/server/chunks/routes/api/workshop/dcw/lines/_id/stop.post.mjs +1 -1
  177. package/.output/server/chunks/routes/api/workshop/dcw/lines/_id_.delete.mjs +1 -1
  178. package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id/judge.post.mjs +1 -1
  179. package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id/rollback.post.mjs +1 -1
  180. package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id/series.get.mjs +1 -1
  181. package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id_.get.mjs +1 -1
  182. package/.output/server/chunks/routes/api/workshop/dcw/params/_id/read.post.mjs +1 -1
  183. package/.output/server/chunks/routes/api/workshop/dcw/params/_id/write.post.mjs +1 -1
  184. package/.output/server/chunks/routes/api/workshop/dcw/params/_id_.delete.mjs +1 -1
  185. package/.output/server/chunks/routes/api/workshop/dcw/params/_id_.patch.mjs +1 -1
  186. package/.output/server/chunks/routes/api/workshop/dcw/products/_id_.delete.mjs +1 -1
  187. package/.output/server/chunks/routes/api/workshop/dcw/products/_id_.patch.mjs +1 -1
  188. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/apply.post.mjs +1 -1
  189. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/mark-good.post.mjs +1 -1
  190. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/rollback-good.post.mjs +1 -1
  191. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id_.delete.mjs +1 -1
  192. package/.output/server/chunks/routes/api/workshop/dcw/runs/_id/close.post.mjs +1 -1
  193. package/.output/server/chunks/routes/api/workshop/dcw/runs/_id/data.get.mjs +1 -1
  194. package/.output/server/chunks/routes/api/workshop/dcw/runs/_id/rollback.post.mjs +1 -1
  195. package/.output/server/chunks/routes/api/workshop/dcw/templates/_key_.delete.mjs +1 -1
  196. package/.output/server/chunks/routes/api/workshop/dcw/templates/_key_.patch.mjs +1 -1
  197. package/.output/server/chunks/routes/api/workshop/dcw/test-driver.post.mjs +1 -1
  198. package/.output/server/chunks/routes/api/workshop/device-twins/_id/control.post.mjs +1 -1
  199. package/.output/server/chunks/routes/api/workshop/device-twins/_id/telemetry.post.mjs +1 -1
  200. package/.output/server/chunks/routes/api/workshop/device-twins/_id_.delete.mjs +1 -1
  201. package/.output/server/chunks/routes/api/workshop/device-twins/_id_.patch.mjs +1 -1
  202. package/.output/server/chunks/routes/api/workshop/harnesses/_id/providers.get.mjs +1 -1
  203. package/.output/server/chunks/routes/api/workshop/harnesses.get.mjs +1 -1
  204. package/.output/server/chunks/routes/api/workshop/hitl/pending.get.mjs +1 -1
  205. package/.output/server/chunks/routes/api/workshop/hitl/respond.post.mjs +1 -1
  206. package/.output/server/chunks/routes/api/workshop/index.put.mjs +1 -1
  207. package/.output/server/chunks/routes/api/workshop/index2.get.mjs +1 -1
  208. package/.output/server/chunks/routes/api/workshop/index3.post.mjs +1 -1
  209. package/.output/server/chunks/routes/api/workshop/index4.post.mjs +1 -1
  210. package/.output/server/chunks/routes/api/workshop/index5.get.mjs +1 -1
  211. package/.output/server/chunks/routes/api/workshop/index5.post.mjs +1 -1
  212. package/.output/server/chunks/routes/api/workshop/index6.get.mjs +1 -1
  213. package/.output/server/chunks/routes/api/workshop/index6.post.mjs +1 -1
  214. package/.output/server/chunks/routes/api/workshop/index7.get.mjs +1 -1
  215. package/.output/server/chunks/routes/api/workshop/plugins/_name/disable.post.mjs +1 -1
  216. package/.output/server/chunks/routes/api/workshop/plugins/_name/enable.post.mjs +1 -1
  217. package/.output/server/chunks/routes/api/workshop/scene/layouts/_channelId_.delete.mjs +1 -1
  218. package/.output/server/chunks/routes/api/workshop/scene/layouts/_channelId_.put.mjs +1 -1
  219. package/.output/server/chunks/routes/api/workshop/teams/_id/deploy.post.mjs +1 -1
  220. package/.output/server/chunks/routes/api/workshop/teams/_id/index.put.mjs +1 -1
  221. package/.output/server/chunks/routes/api/workshop/teams/_id/index2.get.mjs +1 -1
  222. package/.output/server/chunks/routes/api/workshop/workspaces/_id/channel-templates/_tplId_.post.mjs +2 -2
  223. package/.output/server/chunks/routes/renderer.mjs +2 -2
  224. package/.output/server/chunks/virtual/entry.mjs +29 -19
  225. package/.output/server/chunks/virtual/precomputed.mjs +1 -1
  226. package/.output/server/package.json +1 -1
  227. package/README-zh.md +2 -2
  228. package/README.md +2 -2
  229. package/app/composables/workshop/useWorkshopApi.ts +4 -2
  230. package/app/pages/workshop/channel-templates.vue +43 -4
  231. package/config.yml +1 -1
  232. package/docs/cli.en.md +2 -2
  233. package/docs/cli.md +2 -2
  234. package/docs/plugins.en.md +1 -1
  235. package/docs/plugins.md +1 -1
  236. package/docs/sdk.en.md +1 -1
  237. package/docs/sdk.md +1 -1
  238. package/i18n/dicts/ctpl.json +37 -32
  239. package/i18n/locales/en.ts +5 -0
  240. package/i18n/locales/zh-CN.ts +5 -0
  241. package/package.json +1 -1
  242. package/scripts/_audit/kb-team-mock-e2e.mjs +146 -0
  243. package/scripts/_audit/kb-team-omp-e2e.mjs +229 -0
  244. package/server/api/workshop/agent-tools/bindings/grant.post.ts +45 -0
  245. package/server/api/workshop/agent-tools/bindings/revoke.post.ts +42 -0
  246. package/server/api/workshop/channel-templates/[id]/instantiate.post.ts +2 -1
  247. package/server/services/workshop/agents/host-tool-bridge/dispatch.ts +6 -1
  248. package/server/services/workshop/agents/host-tool-bridge/tools/tasks.ts +15 -2
  249. package/server/services/workshop/agents/host-tool-bridge/tools/team-delegation.ts +104 -0
  250. package/server/services/workshop/agents/node-bindings.repo.ts +10 -1
  251. package/server/services/workshop/agents/node-delegation.ts +150 -0
  252. package/server/services/workshop/agents/tool-classes.ts +2 -0
  253. package/server/services/workshop/db/database/seed.ts +20 -0
  254. package/server/services/workshop/runtime/manager/channel-templates.ts +26 -2
  255. package/server/services/workshop/runtime/manager/types.ts +2 -0
  256. package/.output/public/_nuxt/8FXd9As6.js +0 -1
  257. package/.output/public/_nuxt/builds/meta/912eb5bb-670e-4cc8-b21d-7fc097723466.json +0 -1
  258. package/.output/public/_nuxt/channel-templates.DplM1pJ3.css +0 -1
  259. package/.output/server/chunks/build/channel-templates-DjEsj0_v.mjs.map +0 -1
@@ -1,1955 +1,2028 @@
1
- [
2
- {
3
- "name": "report_progress",
4
- "label": "Report Progress",
5
- "description": "Report your current task progress as a percentage (0-100). Call this whenever you make meaningful progress on your task.",
6
- "parameters": {
7
- "type": "object",
8
- "properties": {
9
- "progress": {
10
- "type": "number",
11
- "description": "Progress percentage 0-100"
12
- },
13
- "message": {
14
- "type": "string",
15
- "description": "Brief status message describing what you are doing"
16
- }
17
- },
18
- "required": [
19
- "progress"
20
- ]
21
- }
22
- },
23
- {
24
- "name": "complete_task",
25
- "label": "Complete Task",
26
- "description": "Mark a task as completed with final deliverables. Workers call this when their assigned task is done. Lead calls this for parent tasks when all children are done.",
27
- "parameters": {
28
- "type": "object",
29
- "properties": {
30
- "summary": {
31
- "type": "string",
32
- "description": "Summary of what was accomplished"
33
- },
34
- "deliverable": {
35
- "type": "string",
36
- "description": "Final deliverable: code, analysis result, document content, etc."
37
- },
38
- "task_id": {
39
- "type": "string",
40
- "description": "Task ID to complete. If omitted, completes your current assigned task."
41
- }
42
- },
43
- "required": [
44
- "summary"
45
- ]
46
- }
47
- },
48
- {
49
- "name": "submit_task",
50
- "label": "Submit Task",
51
- "description": "(Lead only) Register one tracked root task for a genuinely multi-step HUMAN request. A single source chat message has exactly one root, even if the title changes. Do not create a second root to polish or revise wording; reuse the existing root and close it with an ordered acceptance summary. If the request is simple, answer directly without submit_task.",
52
- "parameters": {
53
- "type": "object",
54
- "properties": {
55
- "title": {
56
- "type": "string",
57
- "description": "Short, verifiable title of the request (becomes the root task title)"
58
- },
59
- "description": {
60
- "type": "string",
61
- "description": "The full user request plus its constraints, in the user's own terms — this is what you will decompose and later verify each deliverable against"
62
- }
63
- },
64
- "required": [
65
- "title",
66
- "description"
67
- ]
68
- }
69
- },
70
- {
71
- "name": "dispatch_task",
72
- "label": "Dispatch Task",
73
- "description": "(Lead only) Create one bounded child under an existing parent and assign it to a worker. The platform enforces finite root budgets (total child attempts, active children, canceled children, and ordinary depth); changing the title does not reset them. Freeze the child ID/title/contract after dispatch. Prefer update_task, send_message_to_agent, or reassign_task over cancel-and-recreate. Always include parent_task_id, route_reason, and a self-contained objective/deliverable/acceptance/boundary brief.",
74
- "parameters": {
75
- "type": "object",
76
- "properties": {
77
- "assignee_id": {
78
- "type": "string",
79
- "description": "ID of the worker agent to assign this task to"
80
- },
81
- "title": {
82
- "type": "string",
83
- "description": "Short task title"
84
- },
85
- "route_reason": {
86
- "type": "string",
87
- "description": "Why this agent was chosen (specialty fit / load / past success evidence) — one short line, kept as the auditable routing decision"
88
- },
89
- "description": {
90
- "type": "string",
91
- "description": "Detailed task description with requirements"
92
- },
93
- "parent_task_id": {
94
- "type": "string",
95
- "description": "The ID of the submitted parent task this subtask belongs to (from the task list)"
96
- }
97
- },
98
- "required": [
99
- "assignee_id",
100
- "title",
101
- "parent_task_id"
102
- ]
103
- }
104
- },
105
- {
106
- "name": "send_message_to_agent",
107
- "label": "Send Message",
108
- "description": "Send a message to another agent (lead or worker) in the same channel via the channel mailbox (routed to the recipient's own mailbox). Use priority \"immediate\" for urgent real-time messages that the recipient sees instantly during work; use \"task\" (default) for messages that queue until the recipient finishes their current task. Set require_reply=true to demand a response: the recipient must reply with their result via this same tool. When replying to a message, pass its message_id as in_reply_to — replies are auto-upgraded to real-time delivery and pushed straight into the recipient's running session, so the answer reaches a waiting sender instantly.",
109
- "parameters": {
110
- "type": "object",
111
- "properties": {
112
- "to_agent_id": {
113
- "type": "string",
114
- "description": "Recipient agent ID"
115
- },
116
- "message": {
117
- "type": "string",
118
- "description": "Message content (when replying: your execution result + the content they asked for)"
119
- },
120
- "priority": {
121
- "type": "string",
122
- "enum": [
123
- "immediate",
124
- "task"
125
- ],
126
- "description": "Message priority: \"immediate\" = inject into recipient's running session instantly; \"task\" = queue for later consumption (default)"
127
- },
128
- "require_reply": {
129
- "type": "boolean",
130
- "description": "Trigger: true = recipient MUST reply with result/content (default false)"
131
- },
132
- "in_reply_to": {
133
- "type": "string",
134
- "description": "Message ID this reply refers to (set when replying to a trigger message)"
135
- }
136
- },
137
- "required": [
138
- "to_agent_id",
139
- "message"
140
- ]
141
- }
142
- },
143
- {
144
- "name": "poll_messages",
145
- "label": "Poll Inbox",
146
- "description": "Check your own mailbox for unread messages from other agents. When waiting for a reply, pass wait_seconds (e.g. 90) to block until it arrives or the wait expires — one blocking call replaces repeated empty polling. Returned collaboration messages are acknowledged on read (removed from the queue); task assignments are left for execution. Replies to your trigger messages are also pushed into your running session in real time — if you already saw an injected \"[实时消息 from X]\", that IS the reply, no need to poll again.",
147
- "parameters": {
148
- "type": "object",
149
- "properties": {
150
- "limit": {
151
- "type": "number",
152
- "description": "Max messages to return (default 10)"
153
- },
154
- "wait_seconds": {
155
- "type": "number",
156
- "description": "Block up to N seconds (0-180) waiting for a message before returning empty (default 0 = immediate check)"
157
- }
158
- }
159
- }
160
- },
161
- {
162
- "name": "read_channel_mail",
163
- "label": "Read Channel Mail",
164
- "description": "(Lead only) Read the FULL channel mail log: every message routed through the channel mailbox (peer messages, real-time replies with in_reply_to chains, and task deliveries), newest first, with read/unread state. Pass agent_id to inspect a specific member's mailbox. Use this BEFORE dispatching a task whose result may already exist — if a worker already computed/delivered the value via mail, do NOT re-dispatch it; reference the concrete result from the mail instead.",
165
- "parameters": {
166
- "type": "object",
167
- "properties": {
168
- "limit": {
169
- "type": "number",
170
- "description": "Max mails to return (default 50, max 500)"
171
- },
172
- "agent_id": {
173
- "type": "string",
174
- "description": "Optional: only show mails involving this agent (as sender or recipient)"
175
- }
176
- }
177
- }
178
- },
179
- {
180
- "name": "broadcast_message",
181
- "label": "Broadcast",
182
- "description": "Broadcast a message to ALL agents in the channel (lead + all workers). Useful for announcements.",
183
- "parameters": {
184
- "type": "object",
185
- "properties": {
186
- "message": {
187
- "type": "string",
188
- "description": "Message content to broadcast"
189
- },
190
- "priority": {
191
- "type": "string",
192
- "enum": [
193
- "immediate",
194
- "task"
195
- ],
196
- "description": "Message priority (default \"task\")"
197
- }
198
- },
199
- "required": [
200
- "message"
201
- ]
202
- }
203
- },
204
- {
205
- "name": "list_channel_tasks",
206
- "label": "List Tasks",
207
- "description": "List all tasks in the current channel, including their status, progress, and assignee.",
208
- "parameters": {
209
- "type": "object",
210
- "properties": {}
211
- }
212
- },
213
- {
214
- "name": "list_team_agents",
215
- "label": "List Team",
216
- "description": "List all agents in the current channel (lead + workers) with their roles and names.",
217
- "parameters": {
218
- "type": "object",
219
- "properties": {}
220
- }
221
- },
222
- {
223
- "name": "get_task_details",
224
- "label": "Get Task",
225
- "description": "Get detailed information about a specific task, including artifacts and history.",
226
- "parameters": {
227
- "type": "object",
228
- "properties": {
229
- "task_id": {
230
- "type": "string",
231
- "description": "Task ID"
232
- }
233
- },
234
- "required": [
235
- "task_id"
236
- ]
237
- }
238
- },
239
- {
240
- "name": "get_my_task_queue",
241
- "label": "My Queue",
242
- "description": "View your own task queue: pending tasks (FIFO order), the task you are currently executing, and completed tasks. Use this to check if you have unfinished work.",
243
- "parameters": {
244
- "type": "object",
245
- "properties": {}
246
- }
247
- },
248
- {
249
- "name": "get_queue_overview",
250
- "label": "Queue Overview",
251
- "description": "(Lead only) Real-time overview of every team member: status (idle/busy), current task, pending queue length, completed count. Use this to make optimal scheduling and rebalancing decisions.",
252
- "parameters": {
253
- "type": "object",
254
- "properties": {}
255
- }
256
- },
257
- {
258
- "name": "reassign_task",
259
- "label": "Reassign Task",
260
- "description": "(Lead only) Move a pending (not yet started) or failed task from one worker to another. Use for load rebalancing or when a worker is stuck. The old worker's queued delivery is revoked automatically.",
261
- "parameters": {
262
- "type": "object",
263
- "properties": {
264
- "task_id": {
265
- "type": "string",
266
- "description": "Task ID to move"
267
- },
268
- "to_agent_id": {
269
- "type": "string",
270
- "description": "Worker agent ID to receive the task"
271
- }
272
- },
273
- "required": [
274
- "task_id",
275
- "to_agent_id"
276
- ]
277
- }
278
- },
279
- {
280
- "name": "update_task",
281
- "label": "Update Task",
282
- "description": "(Lead only) Modify the title/description of a pending (queued, not started) task. The assignee's queued delivery is refreshed with the new content automatically.",
283
- "parameters": {
284
- "type": "object",
285
- "properties": {
286
- "task_id": {
287
- "type": "string",
288
- "description": "Task ID to update"
289
- },
290
- "title": {
291
- "type": "string",
292
- "description": "New title (optional)"
293
- },
294
- "description": {
295
- "type": "string",
296
- "description": "New description (optional)"
297
- }
298
- },
299
- "required": [
300
- "task_id"
301
- ]
302
- }
303
- },
304
- {
305
- "name": "cancel_task",
306
- "label": "Cancel Task",
307
- "description": "Cancel a task only when it is genuinely abandoned or blocked. Canceling a parent cascades to all non-terminal descendants and stops matching active runs; cancellation consumes the root budget. Do not cancel to rename/polish/revise a task. Prefer messaging, update_task, or reassign_task. Pending queued deliveries are revoked automatically.",
308
- "parameters": {
309
- "type": "object",
310
- "properties": {
311
- "task_id": {
312
- "type": "string",
313
- "description": "Task ID to cancel"
314
- }
315
- },
316
- "required": [
317
- "task_id"
318
- ]
319
- }
320
- },
321
- {
322
- "name": "search_memory",
323
- "label": "Search Memory",
324
- "description": "Search your persistent memory (hybrid keyword+semantic retrieval over your private memories and the channel's shared team memories). Results may include: your task history, the TEAM CHRONICLE (团队编年史 = rolling log of everything the team finished), past SESSION COMPACTION SUMMARIES (会话压缩摘要 = conclusions from earlier context windows), monthly reflections (作业反思), and shared conventions. Use this ANY TIME you need prior context: before starting a task, when you suspect relevant past work exists, or when the injected memory hints/brief mention something you need details on. Pass a focused query describing what you want to remember.",
325
- "parameters": {
326
- "type": "object",
327
- "properties": {
328
- "query": {
329
- "type": "string",
330
- "description": "What you want to recall, e.g. \"数据库连接池配置结论\" or \"previous deployment checklist\""
331
- },
332
- "scope": {
333
- "type": "string",
334
- "enum": [
335
- "auto",
336
- "private",
337
- "shared"
338
- ],
339
- "description": "Which memory domain to search: \"auto\" = your private + channel shared (default), \"private\" = only your own, \"shared\" = only channel-wide shared memories"
340
- },
341
- "limit": {
342
- "type": "number",
343
- "description": "Max results (default 5, max 20)"
344
- }
345
- },
346
- "required": [
347
- "query"
348
- ]
349
- }
350
- },
351
- {
352
- "name": "save_memory",
353
- "label": "Save Memory",
354
- "description": "Persist a distilled, reusable insight into memory for future tasks. scope=\"private\" saves to YOUR personal memory (only you recall it); scope=\"shared\" saves to the CHANNEL shared memory visible to ALL teammates (use for conclusions, conventions, or knowledge the whole team benefits from — not task-specific minutiae). Distill before saving: title = short topic, content = the reusable conclusion. Use a stable dedup_key to update an existing memory instead of duplicating. NOTE: the platform already auto-archives task outcomes, team results, the team chronicle, and session compaction summaries — never save whole task logs or raw session transcripts.",
355
- "parameters": {
356
- "type": "object",
357
- "properties": {
358
- "title": {
359
- "type": "string",
360
- "description": "Short topic title, e.g. \"API 网关限流方案结论\""
361
- },
362
- "content": {
363
- "type": "string",
364
- "description": "The distilled reusable knowledge/conclusion (plain text)"
365
- },
366
- "importance": {
367
- "type": "number",
368
- "description": "0-1 importance (default 0.7 private / 0.85 shared)"
369
- },
370
- "scope": {
371
- "type": "string",
372
- "enum": [
373
- "private",
374
- "shared"
375
- ],
376
- "description": "\"private\" = your memory only; \"shared\" = channel-wide shared memory for all teammates"
377
- },
378
- "dedup_key": {
379
- "type": "string",
380
- "description": "Stable key for idempotent update (same key overwrites instead of duplicating)"
381
- }
382
- },
383
- "required": [
384
- "title",
385
- "content",
386
- "scope"
387
- ]
388
- }
389
- },
390
- {
391
- "name": "create_team_agent",
392
- "label": "Create Team Agent",
393
- "description": "(Lead only) Create a NEW worker only when capability/load evidence shows existing members cannot handle the work. Reuse existing workers first. The platform enforces a per-Channel worker roster cap, including disabled members; do not retry with another name after TEAM_WORKER_LIMIT.",
394
- "parameters": {
395
- "type": "object",
396
- "properties": {
397
- "name": {
398
- "type": "string",
399
- "description": "Short, descriptive member name, e.g. \"db-migrator\" or \"test-writer\""
400
- },
401
- "harness": {
402
- "type": "string",
403
- "enum": [
404
- "omp",
405
- "mock",
406
- "claude"
407
- ],
408
- "description": "Agent harness: \"omp\" = full LLM agent with native work tools (default, use this for real work), \"mock\" = scripted test agent, \"claude\" = claude harness"
409
- },
410
- "system_prompt": {
411
- "type": "string",
412
- "description": "System prompt prefix defining this member's specialty, working style, and conventions (maps to its systemPromptPrefix config)"
413
- },
414
- "reason": {
415
- "type": "string",
416
- "description": "Why this member is being added (shown to the user in the team event timeline)"
417
- }
418
- },
419
- "required": [
420
- "name"
421
- ]
422
- }
423
- },
424
- {
425
- "name": "update_team_agent",
426
- "label": "Update Team Agent",
427
- "description": "(Lead only) Update an existing team member (worker): rename it, revise its system prompt (e.g. to specialize or correct its behavior), or enable/disable it. The member's runtime reloads with the new config on its next assignment. You cannot update yourself.",
428
- "parameters": {
429
- "type": "object",
430
- "properties": {
431
- "agent_id": {
432
- "type": "string",
433
- "description": "ID of the worker agent to update (from list_team_agents)"
434
- },
435
- "name": {
436
- "type": "string",
437
- "description": "New name (optional)"
438
- },
439
- "system_prompt": {
440
- "type": "string",
441
- "description": "New system prompt prefix defining its specialty/conventions (optional)"
442
- },
443
- "enabled": {
444
- "type": "boolean",
445
- "description": "true = activate member, false = disable member (disabled members receive no new tasks; default true)"
446
- },
447
- "reason": {
448
- "type": "string",
449
- "description": "Why this change is made (shown in the team event timeline)"
450
- }
451
- },
452
- "required": [
453
- "agent_id"
454
- ]
455
- }
456
- },
457
- {
458
- "name": "remove_team_agent",
459
- "label": "Remove Team Agent",
460
- "description": "(Lead only) Remove a worker from your channel's team. Its queued tasks are automatically re-dispatched to the remaining worker with the shortest queue (or failed for retry if it was mid-execution), so no work is lost — but the member's context is. Use ONLY for sustained idle surplus or persistent underperformance; never as an experiment, and avoid removing members with active work. You cannot remove yourself.",
461
- "parameters": {
462
- "type": "object",
463
- "properties": {
464
- "agent_id": {
465
- "type": "string",
466
- "description": "ID of the worker agent to remove"
467
- },
468
- "reason": {
469
- "type": "string",
470
- "description": "Why this member is removed (shown in the team event timeline)"
471
- }
472
- },
473
- "required": [
474
- "agent_id"
475
- ]
476
- }
477
- },
478
- {
479
- "name": "refuse_task",
480
- "label": "Refuse Task",
481
- "description": "Reject a task assigned to you because it is outside your capability or work scope (wrong recipient, unrelated domain, or missing prerequisites). The task is marked FAILED with your reason and a rejection notice is immediately sent back to the dispatcher (task creator, or the channel lead), who should reassign it to a fitting member. Use this INSTEAD of silently ignoring the task or doing unrelated work; do NOT use it for tasks you are able to do, and do NOT use cancel_task for refusals.",
482
- "parameters": {
483
- "type": "object",
484
- "properties": {
485
- "task_id": {
486
- "type": "string",
487
- "description": "ID of the task you are refusing (must be assigned to you)"
488
- },
489
- "reason": {
490
- "type": "string",
491
- "description": "Why the task is out of your scope: capability mismatch / wrong recipient / prerequisites missing. Be specific so the dispatcher can reassign properly."
492
- }
493
- },
494
- "required": [
495
- "task_id",
496
- "reason"
497
- ]
498
- }
499
- },
500
- {
501
- "name": "my_industrial_nodes",
502
- "label": "My Industrial Nodes",
503
- "description": "列出你绑定的全部数采/数控节点及其物理含义(参数含义/单位/安全量程/活动配方工艺窗口/控制模式)。在进行任何工业操作前必须先调用本工具理解节点语义与设定规则。",
504
- "parameters": {
505
- "type": "object",
506
- "properties": {}
507
- }
508
- },
509
- {
510
- "name": "dcw_control",
511
- "label": "DCW Control",
512
- "description": "对绑定的数控节点下发工艺设定值(真实物理量纲)。仅限你有权控制的节点;设定值会被安全量程与活动配方工艺窗口联锁校验,越窗直接拒绝。手动确认模式下需等待用户批准,用户备注会随结果返回。下发前先调用 my_industrial_nodes 理解节点物理含义。",
513
- "parameters": {
514
- "type": "object",
515
- "properties": {
516
- "node_id": {
517
- "type": "string",
518
- "description": "数控节点 id(见 my_industrial_nodes)"
519
- },
520
- "value": {
521
- "type": "number",
522
- "description": "目标设定值(真实物理量纲,如 ℃)"
523
- },
524
- "hypothesis": {
525
- "type": "string",
526
- "description": "本次调参假设(入优化记录档案):目标 + 预期效果 + 观察计划,如「提温 1℃ 预期张力上升 2%,5 分钟后复测」"
527
- },
528
- "task_id": {
529
- "type": "string",
530
- "description": "关联的优化任务 id(可选,入优化记录档案)"
531
- }
532
- },
533
- "required": [
534
- "node_id",
535
- "value"
536
- ]
537
- }
538
- },
539
- {
540
- "name": "dcw_read",
541
- "label": "DCW Read",
542
- "description": "读取绑定的数控节点的 PLC 当前值(读写集成的读半边)。返回 PLC 实时读数(经标定解码的物理量纲)与设定值对照;用于下发前取证、下发后复核设定是否生效。读取是被动观测,不影响控制状态,也不需要审批。",
543
- "parameters": {
544
- "type": "object",
545
- "properties": {
546
- "node_id": {
547
- "type": "string",
548
- "description": "数控节点 id(见 my_industrial_nodes)"
549
- }
550
- },
551
- "required": [
552
- "node_id"
553
- ]
554
- }
555
- },
556
- {
557
- "name": "param_control",
558
- "label": "Param Control",
559
- "description": "按工艺参数下发设定值(推荐的参数语义寻址面;param=工艺参数 id 或 key)。参数 → PLC 执行点的映射由系统封装,你只面对真实物理量纲,不需要也不可见寄存器/数据类型等底层细节。设定值受四层限界联锁(节点安全量程 ∩ 工艺参数基准限界 ∩ 活动产品限界 ∩ 活动配方工艺窗口)逐层收窄,用户与 Agent 一体约束,越界直接拒绝。手动确认模式下需等待用户批准。下发前先调用 my_industrial_nodes 理解参数语义。",
560
- "parameters": {
561
- "type": "object",
562
- "properties": {
563
- "param": {
564
- "type": "string",
565
- "description": "工艺参数 id(pp-*)或参数 key(产线内唯一,见 my_industrial_nodes / line_context)"
566
- },
567
- "value": {
568
- "type": "number",
569
- "description": "目标设定值(真实物理量纲,如 ℃)"
570
- },
571
- "line_id": {
572
- "type": "string",
573
- "description": "产线 id(可选;参数 key 跨产线同名时用于消歧)"
574
- },
575
- "hypothesis": {
576
- "type": "string",
577
- "description": "本次调参假设(入优化记录档案):目标 + 预期效果 + 观察计划"
578
- },
579
- "task_id": {
580
- "type": "string",
581
- "description": "关联的优化任务 id(可选,入优化记录档案)"
582
- }
583
- },
584
- "required": [
585
- "param",
586
- "value"
587
- ]
588
- }
589
- },
590
- {
591
- "name": "param_read",
592
- "label": "Param Read",
593
- "description": "按工艺参数读取 PLC 当前值(param=工艺参数 id 或 key),返回实时读数(物理量纲)与当前设定值对照,以及该参数当前的有效写入区间(分层限界)。用于下发前取证、下发后复核。读取是被动观测,不需要审批。",
594
- "parameters": {
595
- "type": "object",
596
- "properties": {
597
- "param": {
598
- "type": "string",
599
- "description": "工艺参数 id(pp-*)或参数 key"
600
- },
601
- "line_id": {
602
- "type": "string",
603
- "description": "产线 id(可选;参数 key 跨产线同名时用于消歧)"
604
- }
605
- },
606
- "required": [
607
- "param"
608
- ]
609
- }
610
- },
611
- {
612
- "name": "daq_query",
613
- "label": "DAQ Query",
614
- "description": "从时序数据库检索你绑定的数采节点的历史/实时数据。支持按产线/产品/配方/批次/时间窗/降采样多维过滤(产品/配方过滤基于逐样本打标,可精确取某批次数据);返回结果携带物理含义(参数语义/单位/量程/统计摘要/最近序列)。默认只取**当前活动批次(活动配方)**的数据:产线正在跑什么配方就只查那个配方,不会把上一轮配方的样本混进本轮判读;需要跨配方看整段历史时显式传 scope=all。",
615
- "parameters": {
616
- "type": "object",
617
- "properties": {
618
- "node_id": {
619
- "type": "string",
620
- "description": "限定单个数采节点 id(缺省 = 全部绑定节点)"
621
- },
622
- "line_id": {
623
- "type": "string",
624
- "description": "按产线过滤(数据归属产线)"
625
- },
626
- "product_id": {
627
- "type": "string",
628
- "description": "按产品过滤(逐样本打标);显式传入即覆盖默认的活动批次过滤"
629
- },
630
- "recipe_id": {
631
- "type": "string",
632
- "description": "按配方过滤(逐样本打标);显式传入即覆盖默认过滤。缺省 = 该节点所在产线的活动配方(产线未开跑则不过滤)"
633
- },
634
- "run_id": {
635
- "type": "string",
636
- "description": "按批次 run 过滤(同一配方多次开跑时精确定位某一次);显式传入即覆盖默认过滤"
637
- },
638
- "scope": {
639
- "type": "string",
640
- "description": "作用域:active(缺省)= 只取当前活动批次;all = 不做配方过滤,返回窗口内全部样本(跨配方对比/历史复盘用)"
641
- },
642
- "last_minutes": {
643
- "type": "number",
644
- "description": "最近 N 分钟(缺省 30)"
645
- },
646
- "from_ms": {
647
- "type": "number",
648
- "description": "起始 epoch ms(与 to_ms 配合,优先于 last_minutes)"
649
- },
650
- "to_ms": {
651
- "type": "number",
652
- "description": "结束 epoch ms"
653
- },
654
- "bucket_ms": {
655
- "type": "number",
656
- "description": "时间间隔(降采样桶宽 ms):缺省 {queryDefaultBucketMs}(15s);可调,下限 {queryMinBucketMs}。不传即用缺省;系统配置变更后以新值为准"
657
- },
658
- "limit": {
659
- "type": "number",
660
- "description": "返回点数上限(缺省 500)"
661
- }
662
- }
663
- }
664
- },
665
- {
666
- "name": "dcw_judge",
667
- "label": "DCW Judge",
668
- "description": "对你发起的优化记录(调控 step)落判定。keep=已验证经验(配方可标 lastGood);rollback=判定应回退(判定入册后必须再调 dcw_rollback 执行,判定不自动改 PLC);uncertain=证据不足保持观察。判定必须引用数采证据(daq_query 窗口数据),禁止无证据判定。",
669
- "parameters": {
670
- "type": "object",
671
- "properties": {
672
- "record_id": {
673
- "type": "string",
674
- "description": "优化记录 id(dcw_control 下发成功后返回)"
675
- },
676
- "verdict": {
677
- "type": "string",
678
- "description": "判定结论:keep / rollback / uncertain",
679
- "enum": [
680
- "keep",
681
- "rollback",
682
- "uncertain"
683
- ]
684
- },
685
- "reason": {
686
- "type": "string",
687
- "description": "判定理由(必须引用具体数值/时间窗证据)"
688
- }
689
- },
690
- "required": [
691
- "record_id",
692
- "verdict",
693
- "reason"
694
- ]
695
- }
696
- },
697
- {
698
- "name": "dcw_rollback",
699
- "label": "DCW Rollback",
700
- "description": "执行参数回退(经与下发相同的安全门控,回退本身入册可审计)。record_id=回退你自己发起的优化记录到其设定前值;node_id=单步撤销到最近稳定锚。回退后必须 daq_query 复测确认恢复。冷却期内同向重写/重复回退会被拒绝。",
701
- "parameters": {
702
- "type": "object",
703
- "properties": {
704
- "record_id": {
705
- "type": "string",
706
- "description": "要回退的优化记录 id(与 node_id 二选一)"
707
- },
708
- "node_id": {
709
- "type": "string",
710
- "description": "节点单步回退(撤销栈栈顶;与 record_id 二选一)"
711
- },
712
- "to": {
713
- "type": "string",
714
- "description": "可选:指定目标锚 id(dcw_journal 可查)"
715
- }
716
- }
717
- }
718
- },
719
- {
720
- "name": "dcw_journal",
721
- "label": "DCW Journal",
722
- "description": "查询参数变更史与优化记录(在册审计):谁/何时/从多少到多少/判定结论/假设声明。优化前先读史可避免重复试错;回退定位也在此查。",
723
- "parameters": {
724
- "type": "object",
725
- "properties": {
726
- "node_id": {
727
- "type": "string",
728
- "description": "限定数控节点 id(仅限自己绑定的节点)"
729
- },
730
- "recipe_id": {
731
- "type": "string",
732
- "description": "按配方过滤优化记录"
733
- },
734
- "limit": {
735
- "type": "number",
736
- "description": "返回条数上限(缺省 20,最大 100)"
737
- }
738
- }
739
- }
740
- },
741
- {
742
- "name": "send_cross_channel_message",
743
- "label": "Cross-Channel Message",
744
- "description": "[Leader only] Send a message to the LEADER of another channel, so the two teams can collaborate without being siloed. The message lands directly in the target channel leader mailbox; that leader will read your request and act on it (dispatch tasks in their channel, gather info, etc.) and can reply to you via the mailbox. Params: to_channel_id accepts the target channel id OR its exact name; message is your request to the other leader (state your need, deadline and what you expect back); require_reply=true to demand a response. Only channel leaders may call this tool - workers will be rejected. When replying to a cross-channel request you received, use this same tool addressed to the requester channel.",
745
- "parameters": {
746
- "type": "object",
747
- "properties": {
748
- "to_channel_id": {
749
- "type": "string",
750
- "description": "Target channel id or exact name (must be another channel, not your own)"
751
- },
752
- "message": {
753
- "type": "string",
754
- "description": "Request text for the target channel leader: what you need, why, and what to return"
755
- },
756
- "require_reply": {
757
- "type": "boolean",
758
- "description": "true = demand the target leader reply with their result/answer"
759
- }
760
- },
761
- "required": [
762
- "to_channel_id",
763
- "message"
764
- ]
765
- }
766
- },
767
- {
768
- "name": "list_other_teams",
769
- "label": "List Other Teams",
770
- "description": "[Leader only] Overview of the OTHER teams (channels) in this workspace: each team name, description, lead, its in-progress scenario tasks, recently completed tasks, and how many shared memories it has (shared_memories > 0 means searchable knowledge exists - use search_other_teams_memory with that team). Decision flow: found knowledge -> reuse it directly; relevant work in progress but no knowledge yet -> message their leader via send_cross_channel_message; nothing -> consider whether your request justifies starting collaboration. Workers cannot call this tool.",
771
- "parameters": {
772
- "type": "object",
773
- "properties": {},
774
- "required": []
775
- }
776
- },
777
- {
778
- "name": "search_other_teams_memory",
779
- "label": "Search Other Teams Memory",
780
- "description": "[All members] Read-only search across the SHARED memory of other teams (channels) in this workspace - what other teams have learned/concluded/done. Use it to reuse existing knowledge instead of asking for it: if you find relevant results, apply them directly; if nothing relevant exists but the other team is working on it, ask your leader to message that team leader via send_cross_channel_message. Results are attributed to their team.",
781
- "parameters": {
782
- "type": "object",
783
- "properties": {
784
- "query": {
785
- "type": "string",
786
- "description": "What to look for (keywords of the knowledge/conclusion)"
787
- },
788
- "limit": {
789
- "type": "number",
790
- "description": "Max results (default 5)"
791
- }
792
- },
793
- "required": [
794
- "query"
795
- ]
796
- }
797
- },
798
- {
799
- "name": "daq_frames",
800
- "label": "DAQ Frames",
801
- "description": "Query multi-modal DAQ frames for your BOUND daq nodes: multi-point profiles (thickness scanners, profile scanners — returns point-count summary, a point preview and derived metrics) and camera image frames (CCD — returns resolution, object reference and derived metrics like brightness/contrast; pixels are NOT loaded into context, view them in the frontend gallery). Supports kind=vector|image filter and time windows. Use BEFORE judging surface quality or profile measurements.",
802
- "parameters": {
803
- "type": "object",
804
- "properties": {
805
- "node_id": {
806
- "type": "string",
807
- "description": "Limit to one bound daq node id (optional; default all your bound daq nodes)"
808
- },
809
- "line_id": {
810
- "type": "string",
811
- "description": "Filter by line id (can only narrow, never widen your access)"
812
- },
813
- "kind": {
814
- "type": "string",
815
- "enum": [
816
- "vector",
817
- "image"
818
- ],
819
- "description": "Frame kind filter (optional)"
820
- },
821
- "last_minutes": {
822
- "type": "number",
823
- "description": "Time window in minutes back from now (default 30)"
824
- },
825
- "from_ms": {
826
- "type": "number",
827
- "description": "Window start (epoch ms; overrides last_minutes)"
828
- },
829
- "to_ms": {
830
- "type": "number",
831
- "description": "Window end (epoch ms; default now)"
832
- },
833
- "limit": {
834
- "type": "number",
835
- "description": "Max frames per node (default 20, max 100)"
836
- }
837
- }
838
- }
839
- },
840
- {
841
- "name": "ops_log",
842
- "label": "Ops Log",
843
- "description": "查询你负责产线的运维日志(数控下发/优化判定/回退/配方下发/产线事件,新→旧)。来源区分 Agent/用户/系统:Agent 的操作者格式为「Channel名/成员名」。用于作业前后自查:你对节点做过哪些操作、他人或系统做过哪些干预。",
844
- "parameters": {
845
- "type": "object",
846
- "properties": {
847
- "line_id": {
848
- "type": "string",
849
- "description": "限定产线 id(须为你绑定节点所属产线;缺省=全部负责产线)"
850
- },
851
- "node_id": {
852
- "type": "string",
853
- "description": "限定数控/数采节点 id(须为你绑定的节点)"
854
- },
855
- "kind": {
856
- "type": "string",
857
- "description": "按分类过滤:write(下发)/recipe(配方)/rollback(回退)/daq(采集)/line(产线)"
858
- },
859
- "actor_kind": {
860
- "type": "string",
861
- "description": "按来源过滤:agent/user/system"
862
- },
863
- "minutes": {
864
- "type": "number",
865
- "description": "回看窗口(分钟,缺省 1440=24 小时)"
866
- },
867
- "limit": {
868
- "type": "number",
869
- "description": "返回条数上限(缺省 20,最大 100)"
870
- },
871
- "mine": {
872
- "type": "boolean",
873
- "description": "true=只看你自己发起的操作"
874
- }
875
- }
876
- }
877
- },
878
- {
879
- "name": "recipe_log",
880
- "label": "Recipe Change Log",
881
- "description": "查询你负责产线的 Recipe 变更史:配方一键下发(recipe.apply)、优化开窗、判定、回退执行(新→旧)。你据此知道配方层面对当前节点做过哪些下发变更、由谁执行、是否已回退。节点级参数值逐笔历史用 dcw_journal。",
882
- "parameters": {
883
- "type": "object",
884
- "properties": {
885
- "line_id": {
886
- "type": "string",
887
- "description": "限定产线 id(须为你绑定节点所属产线;缺省=全部负责产线)"
888
- },
889
- "recipe_id": {
890
- "type": "string",
891
- "description": "按配方 id 过滤"
892
- },
893
- "minutes": {
894
- "type": "number",
895
- "description": "回看窗口(分钟,缺省 1440=24 小时)"
896
- },
897
- "limit": {
898
- "type": "number",
899
- "description": "返回条数上限(缺省 20,最大 100)"
900
- }
901
- }
902
- }
903
- },
904
- {
905
- "name": "line_context",
906
- "label": "Line Context",
907
- "description": "查看你控制的产线/产品/配方全景:产线名与运行态、活动批次(产品、配方名/版本/逐参数目标 vs PLC 当前值)、你绑定的节点、已知良好批次。动手前必读,确认自己操控的是哪条产线、哪个产品、哪个配方。",
908
- "parameters": {
909
- "type": "object",
910
- "properties": {
911
- "line_id": {
912
- "type": "string",
913
- "description": "限定产线 id(须为你绑定节点所属产线;缺省=全部负责产线)"
914
- }
915
- }
916
- }
917
- },
918
- {
919
- "name": "recipe_versions",
920
- "label": "Recipe Versions",
921
- "description": "查看配方参数版本史(旧→新):每版的来源(user/agent/system)、操作者(用户名或 Channel名/成员名)、变更原因、参数 diff。回退定位与审计必查。",
922
- "parameters": {
923
- "type": "object",
924
- "properties": {
925
- "recipe_id": {
926
- "type": "string",
927
- "description": "配方 id(必填;line_context 可看到)"
928
- },
929
- "limit": {
930
- "type": "number",
931
- "description": "返回最近 N 条(缺省 20,最大 50)"
932
- }
933
- }
934
- }
935
- },
936
- {
937
- "name": "recipe_update",
938
- "label": "Recipe Update",
939
- "description": "把验证过的最佳工艺参数保存进配方(部分合并,生成新版本并记录你的名字与原因)。只改配方定义,下一批次生效;不改运行中 PLC 当前值(用 dcw_control)。必须提供 reason(数采证据/判定结论)。",
940
- "parameters": {
941
- "type": "object",
942
- "properties": {
943
- "recipe_id": {
944
- "type": "string",
945
- "description": "配方 id(必填)"
946
- },
947
- "params": {
948
- "type": "array",
949
- "description": "要更新的参数列表(部分合并,只列要改的节点)",
950
- "items": {
951
- "type": "object",
952
- "properties": {
953
- "node_id": {
954
- "type": "string",
955
- "description": "数控节点 id(须为你绑定 dcw 的节点)"
956
- },
957
- "value": {
958
- "type": "number",
959
- "description": "新的目标值"
960
- },
961
- "min": {
962
- "type": "number",
963
- "description": "可选:新配方窗口下限"
964
- },
965
- "max": {
966
- "type": "number",
967
- "description": "可选:新配方窗口上限"
968
- }
969
- }
970
- }
971
- },
972
- "reason": {
973
- "type": "string",
974
- "description": "保存原因(必填;写明依据)"
975
- },
976
- "task_id": {
977
- "type": "string",
978
- "description": "关联任务 id(可选)"
979
- }
980
- }
981
- }
982
- },
983
- {
984
- "name": "recipe_rollback",
985
- "label": "Recipe Rollback",
986
- "description": "回退配方参数到稳定版本:指定历史版本(version)或已知良好批次冻结(to_last_good=true)。生成新版本(非破坏,历史保留);不改运行中 PLC。必须提供 reason。",
987
- "parameters": {
988
- "type": "object",
989
- "properties": {
990
- "recipe_id": {
991
- "type": "string",
992
- "description": "配方 id(必填)"
993
- },
994
- "version": {
995
- "type": "number",
996
- "description": "回退到该历史版本(version 与 to_last_good 二选一)"
997
- },
998
- "to_last_good": {
999
- "type": "boolean",
1000
- "description": "true=回退到已知良好批次参数冻结"
1001
- },
1002
- "reason": {
1003
- "type": "string",
1004
- "description": "回退原因(必填)"
1005
- }
1006
- }
1007
- }
1008
- },
1009
- {
1010
- "name": "aml_node_catalog",
1011
- "label": "AML Node Catalog",
1012
- "description": "列出你可用的 AML 建模节点(全部 daq 绑定):节点 id/名称/物理语义/单位/量程/所属产线/近 24h 是否有批次打标数据。开始任何自动建模前先调用本工具选节点(control=可控输入/target=预测目标/feature=仅历史特征);无绑定会给出指引。",
1013
- "parameters": {
1014
- "type": "object",
1015
- "properties": {}
1016
- }
1017
- },
1018
- {
1019
- "name": "aml_dataset_build",
1020
- "label": "AML Dataset Build",
1021
- "description": "构建 AML 训练数据集:按隔离三元组(产线/产品/配方,防配方串味)拉取批次打标数据,清洗(状态/量程/Hampel)后对齐到 beat_ms 网格,按批次滑窗切分 train/val/test。鉴权:每个 node_id 都必须有你的 daq 绑定且归属 line_id(绑定只缩不放)。返回 dataset_id、行数、窗口计数、逐节点清洗摘要、控制→目标滞后估计。",
1022
- "parameters": {
1023
- "type": "object",
1024
- "properties": {
1025
- "line_id": {
1026
- "type": "string",
1027
- "description": "产线 id(必填;line_context 可查)"
1028
- },
1029
- "product_id": {
1030
- "type": "string",
1031
- "description": "产品 id(必填)"
1032
- },
1033
- "recipe_id": {
1034
- "type": "string",
1035
- "description": "配方 id(必填)"
1036
- },
1037
- "nodes": {
1038
- "type": "array",
1039
- "description": "节点与角色列表(≥2 项,必须含 1 个 target)",
1040
- "items": {
1041
- "type": "object",
1042
- "properties": {
1043
- "node_id": {
1044
- "type": "string",
1045
- "description": "数采节点 id(须有你的 daq 绑定)"
1046
- },
1047
- "role": {
1048
- "type": "string",
1049
- "enum": [
1050
- "control",
1051
- "feature",
1052
- "target"
1053
- ],
1054
- "description": "control=可控输入(未来轨迹已知)/ target=预测目标 / feature=仅历史特征"
1055
- }
1056
- },
1057
- "required": [
1058
- "node_id",
1059
- "role"
1060
- ]
1061
- }
1062
- },
1063
- "beat_ms": {
1064
- "type": "number",
1065
- "description": "数据对齐节拍(ms,≥1000,常用 5000~15000)"
1066
- },
1067
- "history_steps": {
1068
- "type": "number",
1069
- "description": "历史窗口步数(1~2048;覆盖主要滞后即可)"
1070
- },
1071
- "horizon_steps": {
1072
- "type": "number",
1073
- "description": "预测步长(1~512;mpc_surrogate 建议覆盖调控响应期)"
1074
- },
1075
- "split_seed": {
1076
- "type": "number",
1077
- "description": "切分随机种子(缺省 42)"
1078
- },
1079
- "val_ratio": {
1080
- "type": "number",
1081
- "description": "验证集比例(缺省 0.15)"
1082
- },
1083
- "test_ratio": {
1084
- "type": "number",
1085
- "description": "测试集比例(缺省 0.15)"
1086
- },
1087
- "purpose": {
1088
- "type": "string",
1089
- "enum": [
1090
- "mpc_surrogate",
1091
- "quality_predict"
1092
- ],
1093
- "description": "建模目的:mpc_surrogate=代理模型(缺省)/ quality_predict=质量预测"
1094
- },
1095
- "note": {
1096
- "type": "string",
1097
- "description": "数据集备注(为什么建这个数据集)"
1098
- },
1099
- "run_ids": {
1100
- "type": "array",
1101
- "items": {
1102
- "type": "string"
1103
- },
1104
- "description": "限定批次 id 列表(缺省 = 该配方全部已完结批次)"
1105
- },
1106
- "from_ms": {
1107
- "type": "number",
1108
- "description": "起始 epoch ms(可选)"
1109
- },
1110
- "to_ms": {
1111
- "type": "number",
1112
- "description": "结束 epoch ms(可选)"
1113
- }
1114
- },
1115
- "required": [
1116
- "line_id",
1117
- "product_id",
1118
- "recipe_id",
1119
- "nodes",
1120
- "beat_ms",
1121
- "history_steps",
1122
- "horizon_steps"
1123
- ]
1124
- }
1125
- },
1126
- {
1127
- "name": "aml_dataset_stats",
1128
- "label": "AML Dataset Stats",
1129
- "description": "查看数据集完整统计报告:逐节点 mean/std/p05/p50/p95/缺失率/清洗率、控制→目标滞后估计、逐批次目标均值轮廓(漂移检测)、train/val/test 窗口计数。提交训练前用它确认数据质量。",
1130
- "parameters": {
1131
- "type": "object",
1132
- "properties": {
1133
- "dataset_id": {
1134
- "type": "string",
1135
- "description": "数据集 id(aml_dataset_build 返回)"
1136
- }
1137
- },
1138
- "required": [
1139
- "dataset_id"
1140
- ]
1141
- }
1142
- },
1143
- {
1144
- "name": "aml_job_submit",
1145
- "label": "AML Job Submit",
1146
- "description": "提交训练作业(内联 train.py 全文,≤500KB)。代码契约:必须 import amlkit;amlkit.load_bundle(datasetPath) 加载数据集;amlkit.report_progress(pct, note) 上报进度(防停摆误杀);amlkit.export_torch_onnx(model, manifest) 导出模型到 artifacts/model.onnx(契约缺失=永久失败);模型接口=one-step:输入 [batch, history_steps, 全节点数](归一化)→ 输出 [batch, 目标数](归一化)。change_note 遵守单组件改动纪律:每次实验只改一个组件(网络/特征/超参之一)并写明。",
1147
- "parameters": {
1148
- "type": "object",
1149
- "properties": {
1150
- "dataset_id": {
1151
- "type": "string",
1152
- "description": "数据集 id(aml_dataset_build 返回)"
1153
- },
1154
- "code": {
1155
- "type": "string",
1156
- "description": "train.py 全文(≤500KB,须 import amlkit 并导出 artifacts/model.onnx)。job_kind=hybrid_residual 时可省略:平台自动使用内置参考训练器(物理参数校准→有界残差集成→UQ 校准)"
1157
- },
1158
- "change_note": {
1159
- "type": "string",
1160
- "description": "本次实验改动说明(必填;单组件改动纪律:只改一个组件,写明改了什么与预期)"
1161
- },
1162
- "params": {
1163
- "type": "object",
1164
- "description": "超参数字典(如 {\"epochs\": 50, \"lr\": 0.001};传入训练代码的 job.json.params)"
1165
- },
1166
- "seed": {
1167
- "type": "number",
1168
- "description": "随机种子(缺省 42)"
1169
- },
1170
- "purpose": {
1171
- "type": "string",
1172
- "enum": [
1173
- "mpc_surrogate",
1174
- "quality_predict"
1175
- ],
1176
- "description": "建模目的(缺省继承数据集 spec)"
1177
- },
1178
- "parent_experiment_id": {
1179
- "type": "string",
1180
- "description": "父实验 id(谱系对照:本次是在哪个实验基础上改的)"
1181
- },
1182
- "scene_id": {
1183
- "type": "string",
1184
- "description": "Hybrid Twin 场景 id(可选;写入作业谱系)"
1185
- },
1186
- "scene_version": {
1187
- "type": "string",
1188
- "description": "Hybrid Twin 场景版本"
1189
- },
1190
- "objective_id": {
1191
- "type": "string",
1192
- "description": "ObjectiveProfile id"
1193
- },
1194
- "job_kind": {
1195
- "type": "string",
1196
- "enum": [
1197
- "supervised",
1198
- "physics_calibration",
1199
- "hybrid_residual",
1200
- "uncertainty_calibration"
1201
- ],
1202
- "description": "训练阶段;legacy 留空"
1203
- },
1204
- "physics_spec": {
1205
- "type": "object",
1206
- "description": "已冻结 SceneContract 对应的声明式 PhysicsSpec;平台会在隔离 workspace 写入 physics_spec.json"
1207
- },
1208
- "physics_manifest": {
1209
- "type": "object",
1210
- "description": "物理模型 manifest 快照"
1211
- },
1212
- "twin_snapshot": {
1213
- "type": "object",
1214
- "description": "训练所依据的 TwinSnapshot"
1215
- },
1216
- "objective_profile": {
1217
- "type": "object",
1218
- "description": "优化目标契约"
1219
- },
1220
- "model_name": {
1221
- "type": "string",
1222
- "description": "模型人读标识(可选,≤80 字符):注册时作 label 前缀;平台会自动追加「产品/配方·优化目标」谱系尾,换配方或换目标的模型必须能从名字区分"
1223
- },
1224
- "model_description": {
1225
- "type": "string",
1226
- "description": "建模意图描述(可选,≤500 字符):写清本模型针对的场景/配方与优化目标;缺省由平台按谱系派生"
1227
- }
1228
- },
1229
- "required": [
1230
- "dataset_id",
1231
- "code",
1232
- "change_note"
1233
- ]
1234
- }
1235
- },
1236
- {
1237
- "name": "aml_job_status",
1238
- "label": "AML Job Status",
1239
- "description": "查看训练作业状态:状态/阶段(provision→train→evaluate)/进度/平台门禁逐项(G1 单步/G2 滚动 NRMSE 等)/错误。不带 job_id 列出最近 10 个;带 job_id 看单作业详情。训练中建议 30~60 秒轮询一次。",
1240
- "parameters": {
1241
- "type": "object",
1242
- "properties": {
1243
- "job_id": {
1244
- "type": "string",
1245
- "description": "作业 id(缺省 = 列最近 10 个)"
1246
- }
1247
- }
1248
- }
1249
- },
1250
- {
1251
- "name": "aml_job_logs",
1252
- "label": "AML Job Logs",
1253
- "description": "查看训练作业日志尾(平台 ##AML 协议行 + 训练输出)。失败定位/进度细节用这个。",
1254
- "parameters": {
1255
- "type": "object",
1256
- "properties": {
1257
- "job_id": {
1258
- "type": "string",
1259
- "description": "作业 id"
1260
- },
1261
- "lines": {
1262
- "type": "number",
1263
- "description": "返回行数(缺省 80,上限 400)"
1264
- }
1265
- },
1266
- "required": [
1267
- "job_id"
1268
- ]
1269
- }
1270
- },
1271
- {
1272
- "name": "aml_job_cancel",
1273
- "label": "AML Job Cancel",
1274
- "description": "取消排队/运行中的训练作业(运行中的会终止进程树;取消动作入册可审计)。数据集不受影响,可复用重训。",
1275
- "parameters": {
1276
- "type": "object",
1277
- "properties": {
1278
- "job_id": {
1279
- "type": "string",
1280
- "description": "作业 id"
1281
- }
1282
- },
1283
- "required": [
1284
- "job_id"
1285
- ]
1286
- }
1287
- },
1288
- {
1289
- "name": "aml_leaderboard",
1290
- "label": "AML Leaderboard",
1291
- "description": "查看数据集的实验谱系表(新→旧):每条实验的 change_note/父实验/状态/G1 单步与 G2 滚动 NRMSE/门禁通过情况,并标注当前最优(门禁通过且 G1 最小);同时列出已登记模型(model_id,晋升对象)。优化前先读榜,避免重复试错。",
1292
- "parameters": {
1293
- "type": "object",
1294
- "properties": {
1295
- "dataset_id": {
1296
- "type": "string",
1297
- "description": "数据集 id"
1298
- }
1299
- },
1300
- "required": [
1301
- "dataset_id"
1302
- ]
1303
- }
1304
- },
1305
- {
1306
- "name": "aml_model_find",
1307
- "label": "AML Model Find",
1308
- "description": "模型发现与选型:按产线/产品/配方/purpose/优化目标/阶段过滤模型注册表,每个模型给出「label(产线·配方·优化目标标识)/阶段/G1+G2 指标/描述」,生产模型置顶,并按当前情况给出 选型指引:复用已有生产模型(aml_model_reference)→ 晋升候选(aml_model_promote,lead 专属)→ 新建模型(aml_dataset_build → aml_job_submit)。开始优化任务前先查:模型按 (产品, 配方, purpose) 隔离,不同 recipe 的模型不可跨用。",
1309
- "parameters": {
1310
- "type": "object",
1311
- "properties": {
1312
- "line_id": {
1313
- "type": "string",
1314
- "description": "限定产线 id(须为你绑定节点所属产线;缺省 = 全部负责产线)"
1315
- },
1316
- "product_id": {
1317
- "type": "string",
1318
- "description": "限定产品 id"
1319
- },
1320
- "recipe_id": {
1321
- "type": "string",
1322
- "description": "限定配方 id(配方隔离:换配方必须换模型,选型前务必指定)"
1323
- },
1324
- "purpose": {
1325
- "type": "string",
1326
- "enum": [
1327
- "mpc_surrogate",
1328
- "quality_predict"
1329
- ],
1330
- "description": "限定建模目的"
1331
- },
1332
- "objective_id": {
1333
- "type": "string",
1334
- "description": "限定优化目标(ObjectiveProfile id;hybrid twin 模型携带)"
1335
- },
1336
- "stage": {
1337
- "type": "string",
1338
- "enum": [
1339
- "candidate",
1340
- "shadow",
1341
- "production",
1342
- "retired"
1343
- ],
1344
- "description": "限定阶段(缺省 = 全部,production 置顶)"
1345
- }
1346
- }
1347
- }
1348
- },
1349
- {
1350
- "name": "aml_model_promote",
1351
- "label": "AML Model Promote",
1352
- "description": "(Lead only) 晋升模型阶段:to_stage=shadow(影子观测)或 production(生产生效)。必须经人工审批(HITL 挂起,用户批准/拒绝/超时);批准晋升 production 时同组旧生产模型自动退役。worker 无此工具;模型 id 从 aml_leaderboard 查。",
1353
- "parameters": {
1354
- "type": "object",
1355
- "properties": {
1356
- "model_id": {
1357
- "type": "string",
1358
- "description": "模型 id(aml_leaderboard 的已登记模型段)"
1359
- },
1360
- "to_stage": {
1361
- "type": "string",
1362
- "enum": [
1363
- "shadow",
1364
- "production"
1365
- ],
1366
- "description": "目标阶段:shadow=影子观测 / production=生产生效"
1367
- }
1368
- },
1369
- "required": [
1370
- "model_id",
1371
- "to_stage"
1372
- ]
1373
- }
1374
- },
1375
- {
1376
- "name": "aml_model_reference",
1377
- "label": "AML Model Reference",
1378
- "description": "影子模型参考(调参前先问影子模型):拉取最近历史数据组装生产模型输入,按当前/指定控制轨迹预测未来每拍的目标值(物理量纲)。用于 dcw_control 下发前对比不同设定方案的目标响应;预测仅供参考,真实下发仍走安全联锁。product/recipe 缺省时取你绑定节点所属产线的唯一活动批次。",
1379
- "parameters": {
1380
- "type": "object",
1381
- "properties": {
1382
- "line_id": {
1383
- "type": "string",
1384
- "description": "限定产线 id(须为你绑定节点所属产线;多产线绑定且未给全 product/recipe 时必传以消歧)"
1385
- },
1386
- "product_id": {
1387
- "type": "string",
1388
- "description": "产品 id(缺省 = 活动批次)"
1389
- },
1390
- "recipe_id": {
1391
- "type": "string",
1392
- "description": "配方 id(缺省 = 活动批次)"
1393
- },
1394
- "purpose": {
1395
- "type": "string",
1396
- "enum": [
1397
- "mpc_surrogate",
1398
- "quality_predict"
1399
- ],
1400
- "description": "建模目的(缺省 mpc_surrogate)"
1401
- },
1402
- "controls": {
1403
- "type": "object",
1404
- "description": "控制节点设定值映射 {node_id: value}(候选方案;缺省 = 持最后观测)"
1405
- },
1406
- "steps": {
1407
- "type": "number",
1408
- "description": "滚动预测步数(≤ 模型 horizon;缺省 = 全 horizon)"
1409
- }
1410
- }
1411
- }
1412
- },
1413
- {
1414
- "name": "twin_provider_catalog",
1415
- "label": "Twin Provider Catalog",
1416
- "description": "读取当前已注册的场景 Provider、ScenePack、SolverAdapter 及 generation/health 元数据;只读,不执行控制。",
1417
- "parameters": {
1418
- "type": "object",
1419
- "properties": {
1420
- "scene_kind": {
1421
- "type": "string",
1422
- "description": "可选场景类型过滤"
1423
- }
1424
- }
1425
- }
1426
- },
1427
- {
1428
- "name": "twin_scene_discover",
1429
- "label": "Twin Scene Discover",
1430
- "description": "读取当前 Agent 已绑定的 DAQ/DCW 节点,推断 control/state/disturbance/target/guard 语义并返回证据与置信度;只读,不执行控制。",
1431
- "parameters": {
1432
- "type": "object",
1433
- "properties": {
1434
- "scene_kind": {
1435
- "type": "string",
1436
- "description": "可选场景类型"
1437
- }
1438
- }
1439
- }
1440
- },
1441
- {
1442
- "name": "twin_scene_compile",
1443
- "label": "Twin Scene Compile",
1444
- "description": "根据已绑定节点和场景提示词生成 SceneContract Draft;默认 draft,首次训练/上线前必须由用户确认后冻结。",
1445
- "parameters": {
1446
- "type": "object",
1447
- "properties": {
1448
- "scene_id": {
1449
- "type": "string"
1450
- },
1451
- "scene_version": {
1452
- "type": "string"
1453
- },
1454
- "line_id": {
1455
- "type": "string"
1456
- },
1457
- "product_id": {
1458
- "type": "string"
1459
- },
1460
- "recipe_id": {
1461
- "type": "string"
1462
- },
1463
- "prompt": {
1464
- "type": "string"
1465
- },
1466
- "physics_profile_id": {
1467
- "type": "string"
1468
- },
1469
- "objective_profile_ids": {
1470
- "type": "array",
1471
- "items": {
1472
- "type": "string"
1473
- }
1474
- },
1475
- "node_ids": {
1476
- "type": "array",
1477
- "items": {
1478
- "type": "string"
1479
- }
1480
- }
1481
- },
1482
- "required": [
1483
- "scene_id",
1484
- "line_id"
1485
- ]
1486
- }
1487
- },
1488
- {
1489
- "name": "twin_scene_freeze",
1490
- "label": "Twin Scene Freeze",
1491
- "description": "在用户明确确认后冻结 SceneContract;冻结后同一 scene_id/version 的契约不可覆盖,变更必须新建版本。",
1492
- "parameters": {
1493
- "type": "object",
1494
- "properties": {
1495
- "scene_id": {
1496
- "type": "string"
1497
- },
1498
- "scene_version": {
1499
- "type": "string"
1500
- },
1501
- "expected_hash": {
1502
- "type": "string"
1503
- },
1504
- "approved_by": {
1505
- "type": "string"
1506
- },
1507
- "confirmation": {
1508
- "type": "string",
1509
- "description": "必须为 USER_CONFIRMED_SCENE_CONTRACT"
1510
- }
1511
- },
1512
- "required": [
1513
- "scene_id",
1514
- "scene_version",
1515
- "confirmation"
1516
- ]
1517
- }
1518
- },
1519
- {
1520
- "name": "twin_physics_spec_draft",
1521
- "label": "Twin PhysicsSpec Draft",
1522
- "description": "从场景(SceneContract,须含 nodeId 映射)自动生成骨架 PhysicsSpec:每个状态变量=一阶惯性弛豫方程(τ/控制增益为带先验盒的可校准参数),观测=持久性恒等基线,约束继承场景。这是任意工况建模的起点:生成后按真实物理润色方程 → twin_physics_spec_validate → twin_physics_spec_compile → aml_job_submit(job_kind=hybrid_residual,训练 stage A 会自动按数据拟合 τ/增益)。传 dt_sec 指定与数据集 beat 一致的步长(缺省 1s)。",
1523
- "parameters": {
1524
- "type": "object",
1525
- "properties": {
1526
- "scene_json": {
1527
- "type": "object",
1528
- "description": "SceneContract 全文(hybrid Channel 已绑定冻结场景时可省略)"
1529
- },
1530
- "dt_sec": {
1531
- "type": "number",
1532
- "description": "求解步长(秒;应与训练数据集 beatMs/1000 一致,缺省 1)"
1533
- }
1534
- }
1535
- }
1536
- },
1537
- {
1538
- "name": "twin_physics_spec_validate",
1539
- "label": "Twin PhysicsSpec Validate",
1540
- "description": "校验声明式物理模型的白名单 AST、变量/参数引用、单位、边界、稳定性和单调性;禁止任意代码执行。",
1541
- "parameters": {
1542
- "type": "object",
1543
- "properties": {
1544
- "physics_spec": {
1545
- "type": "object"
1546
- },
1547
- "spec_json": {
1548
- "type": "string"
1549
- }
1550
- },
1551
- "required": [
1552
- "physics_spec"
1553
- ]
1554
- }
1555
- },
1556
- {
1557
- "name": "twin_physics_spec_compile",
1558
- "label": "Twin PhysicsSpec Compile",
1559
- "description": "将已冻结场景的 PhysicsSpec 编译为隔离的 Generic Declarative Provider 候选并保存 artifact;不注册 production、不写 PLC。",
1560
- "parameters": {
1561
- "type": "object",
1562
- "properties": {
1563
- "physics_spec": {
1564
- "type": "object"
1565
- },
1566
- "spec_json": {
1567
- "type": "string"
1568
- },
1569
- "scene_json": {
1570
- "type": "object"
1571
- }
1572
- },
1573
- "required": [
1574
- "physics_spec",
1575
- "scene_json"
1576
- ]
1577
- }
1578
- },
1579
- {
1580
- "name": "twin_scene_read",
1581
- "label": "Twin Scene Read",
1582
- "description": "读取绑定场景的机器可验证 SceneContract 与控制策略;仅返回场景/节点语义,不执行任何控制。",
1583
- "parameters": {
1584
- "type": "object",
1585
- "properties": {
1586
- "scene_id": {
1587
- "type": "string",
1588
- "description": "场景 id,缺省使用当前注塑 MVP 场景"
1589
- }
1590
- }
1591
- }
1592
- },
1593
- {
1594
- "name": "twin_snapshot_create",
1595
- "label": "Twin Snapshot Create",
1596
- "description": "根据服务端绑定的 DAQ 样本创建带 freshness/watermark/hash/binding epoch 的不可变 TwinSnapshot;Hybrid Twin 必须 auto_daq=true、冻结场景和 BindingSnapshot,禁止 Agent 伪造样本。",
1597
- "parameters": {
1598
- "type": "object",
1599
- "properties": {
1600
- "scene_json": {
1601
- "type": "object",
1602
- "description": "SceneContract JSON(可选)"
1603
- },
1604
- "channel_id": {
1605
- "type": "string"
1606
- },
1607
- "phase": {
1608
- "type": "string"
1609
- },
1610
- "controls": {
1611
- "type": "object"
1612
- },
1613
- "states": {
1614
- "type": "object"
1615
- },
1616
- "disturbances": {
1617
- "type": "object"
1618
- },
1619
- "samples": {
1620
- "type": "array",
1621
- "description": "[{nodeId,at,value,sequence}]"
1622
- },
1623
- "now_ms": {
1624
- "type": "number"
1625
- }
1626
- },
1627
- "required": [
1628
- "samples",
1629
- "controls"
1630
- ]
1631
- }
1632
- },
1633
- {
1634
- "name": "twin_trial_run",
1635
- "label": "Twin Virtual Trial",
1636
- "description": "在隔离模型副本中注入候选控制轨迹,输出全轨迹约束、UQ/OOD 与收益;candidateExecuted=false,不触碰 PLC/DCW。传 model_id 时 rollout 由该训练注册的 hybrid 模型驱动(校准后物理主干+有界残差集成,UQ coverage 来自训练工件),且模型谱系必须与场景 line/product/recipe 一致;不传则用场景物理 provider。",
1637
- "parameters": {
1638
- "type": "object",
1639
- "properties": {
1640
- "scene_json": {
1641
- "type": "object"
1642
- },
1643
- "snapshot_json": {
1644
- "type": "object"
1645
- },
1646
- "snapshot_id": {
1647
- "type": "string",
1648
- "description": "生产 VirtualTrial 使用已持久化 TwinSnapshot id;Hybrid Twin 必填"
1649
- },
1650
- "model_id": {
1651
- "type": "string",
1652
- "description": "驱动 rollout 的 AML 模型 id(须为 hybrid 模型且与场景同谱系;aml_model_find 可查);缺省=场景物理 provider"
1653
- },
1654
- "baseline_controls": {
1655
- "type": "object"
1656
- },
1657
- "candidate_controls": {
1658
- "type": "array"
1659
- },
1660
- "objective": {
1661
- "type": "object"
1662
- },
1663
- "uncertainty": {
1664
- "type": "object"
1665
- }
1666
- },
1667
- "required": [
1668
- "snapshot_json",
1669
- "candidate_controls"
1670
- ]
1671
- }
1672
- },
1673
- {
1674
- "name": "mpc_optimize",
1675
- "label": "MPC Recommendation Only",
1676
- "description": "先检查冻结 SceneContract、绑定快照、模型门禁;未通过时只生成 safe_small_step 小步参数试探,门禁通过后才允许更精确的候选搜索;始终 recommendation-only。传 model_id 时候选评估由该训练注册的 hybrid 模型 rollout(残差修正+集成 UQ);不传则用场景物理 provider。",
1677
- "parameters": {
1678
- "type": "object",
1679
- "properties": {
1680
- "scene_json": {
1681
- "type": "object"
1682
- },
1683
- "snapshot_id": {
1684
- "type": "string",
1685
- "description": "生产 MPC 使用已持久化 TwinSnapshot id;Hybrid Twin 必填"
1686
- },
1687
- "baseline_controls": {
1688
- "type": "object"
1689
- },
1690
- "model_ready": {
1691
- "type": "boolean"
1692
- },
1693
- "horizon_steps": {
1694
- "type": "number"
1695
- }
1696
- },
1697
- "required": [
1698
- "baseline_controls"
1699
- ]
1700
- }
1701
- },
1702
- {
1703
- "name": "twin_gate_evaluate",
1704
- "label": "Twin Gate Evaluate",
1705
- "description": "评估 AML 数据门、物理门、UQ/OOD、VirtualTrial 候选数量和硬约束;零候选/零分母自动拒绝。",
1706
- "parameters": {
1707
- "type": "object",
1708
- "properties": {
1709
- "rows": {
1710
- "type": "number"
1711
- },
1712
- "runs": {
1713
- "type": "number"
1714
- },
1715
- "one_step_nrmse": {
1716
- "type": "number"
1717
- },
1718
- "rollout_nrmse": {
1719
- "type": "number"
1720
- },
1721
- "val_test_gap": {
1722
- "type": "number"
1723
- },
1724
- "calibration_rows": {
1725
- "type": "number"
1726
- },
1727
- "coverage": {
1728
- "type": "number"
1729
- },
1730
- "physics_failure_rate": {
1731
- "type": "number"
1732
- },
1733
- "candidate_trials": {
1734
- "type": "array"
1735
- }
1736
- },
1737
- "required": [
1738
- "rows",
1739
- "runs",
1740
- "candidate_trials"
1741
- ]
1742
- }
1743
- },
1744
- {
1745
- "name": "twin_calibration_request",
1746
- "label": "Twin Calibration Request",
1747
- "description": "按新 DAQ run/rows、漂移或误差阈值登记一次去重的自动校准候选;只进入 AgentTeam 校准队列,不覆盖 production,不写 DCW。",
1748
- "parameters": {
1749
- "type": "object",
1750
- "properties": {
1751
- "scene_id": {
1752
- "type": "string"
1753
- },
1754
- "line_id": {
1755
- "type": "string"
1756
- },
1757
- "recipe_id": {
1758
- "type": "string"
1759
- },
1760
- "new_runs": {
1761
- "type": "number"
1762
- },
1763
- "new_rows": {
1764
- "type": "number"
1765
- },
1766
- "drift_score": {
1767
- "type": "number"
1768
- },
1769
- "error_score": {
1770
- "type": "number"
1771
- },
1772
- "reason": {
1773
- "type": "string"
1774
- }
1775
- },
1776
- "required": [
1777
- "line_id",
1778
- "new_runs",
1779
- "new_rows"
1780
- ]
1781
- }
1782
- },
1783
- {
1784
- "name": "optimization_explore",
1785
- "label": "Optimization Explore Step",
1786
- "description": "工艺优化探索步(探索模式核心):按 goal 与指定方向/步长生成激励值,经数控下发治理链(绑定鉴权/HITL/写限界)真实写入产线,等待工艺响应后读回目标量均值,并把【写入值↔响应值】配对落库为探索记录(训练数据回流的事实源)。步长缺省取绑定 tuning.step 或场景调试跨度;方向 up/down 由你依据节点物理意义判断。多轮迭代以积累「参数波动↔目标响应」数据,供 AML 修正训练与后续模型寻优。",
1787
- "parameters": {
1788
- "type": "object",
1789
- "properties": {
1790
- "control_node_id": {
1791
- "type": "string",
1792
- "description": "数控节点 id(缺省=第一个数控绑定)"
1793
- },
1794
- "target_node_id": {
1795
- "type": "string",
1796
- "description": "目标观测节点 id(缺省=第一个数采绑定)"
1797
- },
1798
- "direction": {
1799
- "type": "string",
1800
- "enum": [
1801
- "up",
1802
- "down"
1803
- ],
1804
- "description": "激励方向(依据节点物理意义与 goal 偏差判断)"
1805
- },
1806
- "step": {
1807
- "type": "number",
1808
- "description": "激励步长(缺省=绑定 tuning.step 或场景 maxStep)"
1809
- },
1810
- "settle_seconds": {
1811
- "type": "number",
1812
- "description": "写入后等待工艺响应的秒数(10~300,缺省 45)"
1813
- },
1814
- "hypothesis": {
1815
- "type": "string",
1816
- "description": "本次探索假设(入册追溯)"
1817
- }
1818
- }
1819
- }
1820
- },
1821
- {
1822
- "name": "twin_bayes_optimize",
1823
- "label": "Twin Bayesian Optimize",
1824
- "description": "AML 模式贝叶斯寻优(须已绑定通过门禁的 AML 模型):以绑定模型 rollout 为代理,围绕当前最优邻域多轮生成候选,UCB(μ-κ·σ)权衡利用与探索,产出收敛轨迹与最终受治理推荐(recommendation-only,写入须审批)。快照/绑定校验与 mpc_optimize 同源。",
1825
- "parameters": {
1826
- "type": "object",
1827
- "properties": {
1828
- "scene_json": {
1829
- "type": "object"
1830
- },
1831
- "snapshot_id": {
1832
- "type": "string",
1833
- "description": "已持久化 TwinSnapshot id(必填,requireFresh)"
1834
- },
1835
- "baseline_controls": {
1836
- "type": "object"
1837
- },
1838
- "objective": {
1839
- "type": "object",
1840
- "description": "ObjectiveProfile(缺省=Channel goal)"
1841
- },
1842
- "rounds": {
1843
- "type": "number",
1844
- "description": "搜索轮数(1~10,缺省 4)"
1845
- },
1846
- "candidates_per_round": {
1847
- "type": "number",
1848
- "description": "每轮候选数(2~20,缺省 6)"
1849
- },
1850
- "kappa": {
1851
- "type": "number",
1852
- "description": "UCB 探索系数(缺省 1.96)"
1853
- },
1854
- "horizon_steps": {
1855
- "type": "number",
1856
- "description": "rollout 步数(缺省 4)"
1857
- }
1858
- },
1859
- "required": [
1860
- "snapshot_id",
1861
- "baseline_controls"
1862
- ]
1863
- }
1864
- },
1865
- {
1866
- "name": "aml_training_plan_list",
1867
- "label": "AML Training Plan List",
1868
- "description": "建模任务清单(解耦编排面):列出全部建模任务的谱系绑定/策略(auto=新批次自动修正训练)/状态/最新模型与 spec 固化情况。",
1869
- "parameters": {
1870
- "type": "object",
1871
- "properties": {}
1872
- }
1873
- },
1874
- {
1875
- "name": "aml_training_plan_create",
1876
- "label": "AML Training Plan Create",
1877
- "description": "创建建模任务(绑定产线/产品/配方三元组 + 数据集 IO 契约:control=DCW 输入,target=DAQ 输出 + 固化训练 spec)。auto 策略的任务在新批次(含工艺优化 Channel 的探索数据)到达时由平台自动修正训练;模型入册后可在 AML 界面绑定到工艺优化 Channel。",
1878
- "parameters": {
1879
- "type": "object",
1880
- "properties": {
1881
- "name": {
1882
- "type": "string"
1883
- },
1884
- "line_id": {
1885
- "type": "string"
1886
- },
1887
- "product_id": {
1888
- "type": "string"
1889
- },
1890
- "recipe_id": {
1891
- "type": "string"
1892
- },
1893
- "scene_id": {
1894
- "type": "string"
1895
- },
1896
- "scene_version": {
1897
- "type": "string"
1898
- },
1899
- "objective_id": {
1900
- "type": "string"
1901
- },
1902
- "strategy": {
1903
- "type": "string",
1904
- "enum": [
1905
- "auto",
1906
- "manual"
1907
- ]
1908
- },
1909
- "dataset_spec": {
1910
- "type": "object",
1911
- "description": "AmlDatasetSpec 完整契约"
1912
- },
1913
- "training_spec": {
1914
- "type": "object",
1915
- "description": "固化的 PhysicsSpec(含 modelId;来自 twin_physics_spec_draft/compile 流程)"
1916
- },
1917
- "model_name_prefix": {
1918
- "type": "string"
1919
- },
1920
- "params": {
1921
- "type": "object"
1922
- },
1923
- "seed": {
1924
- "type": "number"
1925
- },
1926
- "min_interval_sec": {
1927
- "type": "number"
1928
- }
1929
- },
1930
- "required": [
1931
- "line_id",
1932
- "product_id",
1933
- "recipe_id",
1934
- "dataset_spec"
1935
- ]
1936
- }
1937
- },
1938
- {
1939
- "name": "aml_training_plan_train",
1940
- "label": "AML Training Plan Train",
1941
- "description": "立即触发建模任务的修正训练:重建数据集(历史+新批次)→ 平台参考训练器 → 门禁 → 模型入册;plan 状态回写,AML 界面可渲染。",
1942
- "parameters": {
1943
- "type": "object",
1944
- "properties": {
1945
- "plan_id": {
1946
- "type": "string",
1947
- "description": "建模任务 id"
1948
- }
1949
- },
1950
- "required": [
1951
- "plan_id"
1952
- ]
1953
- }
1954
- }
1955
- ]
1
+ [
2
+ {
3
+ "name": "report_progress",
4
+ "label": "Report Progress",
5
+ "description": "Report your current task progress as a percentage (0-100). Call this whenever you make meaningful progress on your task.",
6
+ "parameters": {
7
+ "type": "object",
8
+ "properties": {
9
+ "progress": {
10
+ "type": "number",
11
+ "description": "Progress percentage 0-100"
12
+ },
13
+ "message": {
14
+ "type": "string",
15
+ "description": "Brief status message describing what you are doing"
16
+ }
17
+ },
18
+ "required": [
19
+ "progress"
20
+ ]
21
+ }
22
+ },
23
+ {
24
+ "name": "complete_task",
25
+ "label": "Complete Task",
26
+ "description": "Mark a task as completed with final deliverables. Workers call this when their assigned task is done. Lead calls this for parent tasks when all children are done.",
27
+ "parameters": {
28
+ "type": "object",
29
+ "properties": {
30
+ "summary": {
31
+ "type": "string",
32
+ "description": "Summary of what was accomplished"
33
+ },
34
+ "deliverable": {
35
+ "type": "string",
36
+ "description": "Final deliverable: code, analysis result, document content, etc."
37
+ },
38
+ "task_id": {
39
+ "type": "string",
40
+ "description": "Task ID to complete. If omitted, completes your current assigned task."
41
+ }
42
+ },
43
+ "required": [
44
+ "summary"
45
+ ]
46
+ }
47
+ },
48
+ {
49
+ "name": "submit_task",
50
+ "label": "Submit Task",
51
+ "description": "(Lead only) Register one tracked root task for a genuinely multi-step HUMAN request. A single source chat message has exactly one root, even if the title changes. Do not create a second root to polish or revise wording; reuse the existing root and close it with an ordered acceptance summary. If the request is simple, answer directly without submit_task.",
52
+ "parameters": {
53
+ "type": "object",
54
+ "properties": {
55
+ "title": {
56
+ "type": "string",
57
+ "description": "Short, verifiable title of the request (becomes the root task title)"
58
+ },
59
+ "description": {
60
+ "type": "string",
61
+ "description": "The full user request plus its constraints, in the user's own terms — this is what you will decompose and later verify each deliverable against"
62
+ }
63
+ },
64
+ "required": [
65
+ "title",
66
+ "description"
67
+ ]
68
+ }
69
+ },
70
+ {
71
+ "name": "dispatch_task",
72
+ "label": "Dispatch Task",
73
+ "description": "(Lead only) Create one bounded child under an existing parent and assign it to a worker. The platform enforces finite root budgets (total child attempts, active children, canceled children, and ordinary depth); changing the title does not reset them. Freeze the child ID/title/contract after dispatch. Prefer update_task, send_message_to_agent, or reassign_task over cancel-and-recreate. Always include parent_task_id, route_reason, and a self-contained objective/deliverable/acceptance/boundary brief.",
74
+ "parameters": {
75
+ "type": "object",
76
+ "properties": {
77
+ "assignee_id": {
78
+ "type": "string",
79
+ "description": "ID of the worker agent to assign this task to"
80
+ },
81
+ "title": {
82
+ "type": "string",
83
+ "description": "Short task title"
84
+ },
85
+ "route_reason": {
86
+ "type": "string",
87
+ "description": "Why this agent was chosen (specialty fit / load / past success evidence) — one short line, kept as the auditable routing decision"
88
+ },
89
+ "description": {
90
+ "type": "string",
91
+ "description": "Detailed task description with requirements"
92
+ },
93
+ "parent_task_id": {
94
+ "type": "string",
95
+ "description": "The ID of the submitted parent task this subtask belongs to (from the task list)"
96
+ },
97
+ "grant_node_ids": {
98
+ "type": "array",
99
+ "items": {
100
+ "type": "string"
101
+ },
102
+ "description": "可选(Lead only):随本任务把节点授权授予 assignee —— 数组元素为节点 id,每个节点必须是 lead 自己已绑定的节点(daq/dcw 均可);任一节点不在 lead 绑定面则整单失败、任务不创建。用于派发时一并下发 DAQ/DCW 权限,worker 无需再等手动绑定。"
103
+ },
104
+ "grant_mode": {
105
+ "type": "string",
106
+ "enum": [
107
+ "auto",
108
+ "manual"
109
+ ],
110
+ "description": "可选:随任务授予的绑定模式;缺省随 lead 自己的绑定模式(manual=每次写入需用户批准)"
111
+ }
112
+ },
113
+ "required": [
114
+ "assignee_id",
115
+ "title",
116
+ "parent_task_id"
117
+ ]
118
+ }
119
+ },
120
+ {
121
+ "name": "send_message_to_agent",
122
+ "label": "Send Message",
123
+ "description": "Send a message to another agent (lead or worker) in the same channel via the channel mailbox (routed to the recipient's own mailbox). Use priority \"immediate\" for urgent real-time messages that the recipient sees instantly during work; use \"task\" (default) for messages that queue until the recipient finishes their current task. Set require_reply=true to demand a response: the recipient must reply with their result via this same tool. When replying to a message, pass its message_id as in_reply_to — replies are auto-upgraded to real-time delivery and pushed straight into the recipient's running session, so the answer reaches a waiting sender instantly.",
124
+ "parameters": {
125
+ "type": "object",
126
+ "properties": {
127
+ "to_agent_id": {
128
+ "type": "string",
129
+ "description": "Recipient agent ID"
130
+ },
131
+ "message": {
132
+ "type": "string",
133
+ "description": "Message content (when replying: your execution result + the content they asked for)"
134
+ },
135
+ "priority": {
136
+ "type": "string",
137
+ "enum": [
138
+ "immediate",
139
+ "task"
140
+ ],
141
+ "description": "Message priority: \"immediate\" = inject into recipient's running session instantly; \"task\" = queue for later consumption (default)"
142
+ },
143
+ "require_reply": {
144
+ "type": "boolean",
145
+ "description": "Trigger: true = recipient MUST reply with result/content (default false)"
146
+ },
147
+ "in_reply_to": {
148
+ "type": "string",
149
+ "description": "Message ID this reply refers to (set when replying to a trigger message)"
150
+ }
151
+ },
152
+ "required": [
153
+ "to_agent_id",
154
+ "message"
155
+ ]
156
+ }
157
+ },
158
+ {
159
+ "name": "poll_messages",
160
+ "label": "Poll Inbox",
161
+ "description": "Check your own mailbox for unread messages from other agents. When waiting for a reply, pass wait_seconds (e.g. 90) to block until it arrives or the wait expires — one blocking call replaces repeated empty polling. Returned collaboration messages are acknowledged on read (removed from the queue); task assignments are left for execution. Replies to your trigger messages are also pushed into your running session in real time — if you already saw an injected \"[实时消息 from X]\", that IS the reply, no need to poll again.",
162
+ "parameters": {
163
+ "type": "object",
164
+ "properties": {
165
+ "limit": {
166
+ "type": "number",
167
+ "description": "Max messages to return (default 10)"
168
+ },
169
+ "wait_seconds": {
170
+ "type": "number",
171
+ "description": "Block up to N seconds (0-180) waiting for a message before returning empty (default 0 = immediate check)"
172
+ }
173
+ }
174
+ }
175
+ },
176
+ {
177
+ "name": "read_channel_mail",
178
+ "label": "Read Channel Mail",
179
+ "description": "(Lead only) Read the FULL channel mail log: every message routed through the channel mailbox (peer messages, real-time replies with in_reply_to chains, and task deliveries), newest first, with read/unread state. Pass agent_id to inspect a specific member's mailbox. Use this BEFORE dispatching a task whose result may already exist — if a worker already computed/delivered the value via mail, do NOT re-dispatch it; reference the concrete result from the mail instead.",
180
+ "parameters": {
181
+ "type": "object",
182
+ "properties": {
183
+ "limit": {
184
+ "type": "number",
185
+ "description": "Max mails to return (default 50, max 500)"
186
+ },
187
+ "agent_id": {
188
+ "type": "string",
189
+ "description": "Optional: only show mails involving this agent (as sender or recipient)"
190
+ }
191
+ }
192
+ }
193
+ },
194
+ {
195
+ "name": "broadcast_message",
196
+ "label": "Broadcast",
197
+ "description": "Broadcast a message to ALL agents in the channel (lead + all workers). Useful for announcements.",
198
+ "parameters": {
199
+ "type": "object",
200
+ "properties": {
201
+ "message": {
202
+ "type": "string",
203
+ "description": "Message content to broadcast"
204
+ },
205
+ "priority": {
206
+ "type": "string",
207
+ "enum": [
208
+ "immediate",
209
+ "task"
210
+ ],
211
+ "description": "Message priority (default \"task\")"
212
+ }
213
+ },
214
+ "required": [
215
+ "message"
216
+ ]
217
+ }
218
+ },
219
+ {
220
+ "name": "list_channel_tasks",
221
+ "label": "List Tasks",
222
+ "description": "List all tasks in the current channel, including their status, progress, and assignee.",
223
+ "parameters": {
224
+ "type": "object",
225
+ "properties": {}
226
+ }
227
+ },
228
+ {
229
+ "name": "list_team_agents",
230
+ "label": "List Team",
231
+ "description": "List all agents in the current channel (lead + workers) with their roles and names.",
232
+ "parameters": {
233
+ "type": "object",
234
+ "properties": {}
235
+ }
236
+ },
237
+ {
238
+ "name": "get_task_details",
239
+ "label": "Get Task",
240
+ "description": "Get detailed information about a specific task, including artifacts and history.",
241
+ "parameters": {
242
+ "type": "object",
243
+ "properties": {
244
+ "task_id": {
245
+ "type": "string",
246
+ "description": "Task ID"
247
+ }
248
+ },
249
+ "required": [
250
+ "task_id"
251
+ ]
252
+ }
253
+ },
254
+ {
255
+ "name": "get_my_task_queue",
256
+ "label": "My Queue",
257
+ "description": "View your own task queue: pending tasks (FIFO order), the task you are currently executing, and completed tasks. Use this to check if you have unfinished work.",
258
+ "parameters": {
259
+ "type": "object",
260
+ "properties": {}
261
+ }
262
+ },
263
+ {
264
+ "name": "get_queue_overview",
265
+ "label": "Queue Overview",
266
+ "description": "(Lead only) Real-time overview of every team member: status (idle/busy), current task, pending queue length, completed count. Use this to make optimal scheduling and rebalancing decisions.",
267
+ "parameters": {
268
+ "type": "object",
269
+ "properties": {}
270
+ }
271
+ },
272
+ {
273
+ "name": "reassign_task",
274
+ "label": "Reassign Task",
275
+ "description": "(Lead only) Move a pending (not yet started) or failed task from one worker to another. Use for load rebalancing or when a worker is stuck. The old worker's queued delivery is revoked automatically.",
276
+ "parameters": {
277
+ "type": "object",
278
+ "properties": {
279
+ "task_id": {
280
+ "type": "string",
281
+ "description": "Task ID to move"
282
+ },
283
+ "to_agent_id": {
284
+ "type": "string",
285
+ "description": "Worker agent ID to receive the task"
286
+ }
287
+ },
288
+ "required": [
289
+ "task_id",
290
+ "to_agent_id"
291
+ ]
292
+ }
293
+ },
294
+ {
295
+ "name": "update_task",
296
+ "label": "Update Task",
297
+ "description": "(Lead only) Modify the title/description of a pending (queued, not started) task. The assignee's queued delivery is refreshed with the new content automatically.",
298
+ "parameters": {
299
+ "type": "object",
300
+ "properties": {
301
+ "task_id": {
302
+ "type": "string",
303
+ "description": "Task ID to update"
304
+ },
305
+ "title": {
306
+ "type": "string",
307
+ "description": "New title (optional)"
308
+ },
309
+ "description": {
310
+ "type": "string",
311
+ "description": "New description (optional)"
312
+ }
313
+ },
314
+ "required": [
315
+ "task_id"
316
+ ]
317
+ }
318
+ },
319
+ {
320
+ "name": "cancel_task",
321
+ "label": "Cancel Task",
322
+ "description": "Cancel a task only when it is genuinely abandoned or blocked. Canceling a parent cascades to all non-terminal descendants and stops matching active runs; cancellation consumes the root budget. Do not cancel to rename/polish/revise a task. Prefer messaging, update_task, or reassign_task. Pending queued deliveries are revoked automatically.",
323
+ "parameters": {
324
+ "type": "object",
325
+ "properties": {
326
+ "task_id": {
327
+ "type": "string",
328
+ "description": "Task ID to cancel"
329
+ }
330
+ },
331
+ "required": [
332
+ "task_id"
333
+ ]
334
+ }
335
+ },
336
+ {
337
+ "name": "search_memory",
338
+ "label": "Search Memory",
339
+ "description": "Search your persistent memory (hybrid keyword+semantic retrieval over your private memories and the channel's shared team memories). Results may include: your task history, the TEAM CHRONICLE (团队编年史 = rolling log of everything the team finished), past SESSION COMPACTION SUMMARIES (会话压缩摘要 = conclusions from earlier context windows), monthly reflections (作业反思), and shared conventions. Use this ANY TIME you need prior context: before starting a task, when you suspect relevant past work exists, or when the injected memory hints/brief mention something you need details on. Pass a focused query describing what you want to remember.",
340
+ "parameters": {
341
+ "type": "object",
342
+ "properties": {
343
+ "query": {
344
+ "type": "string",
345
+ "description": "What you want to recall, e.g. \"数据库连接池配置结论\" or \"previous deployment checklist\""
346
+ },
347
+ "scope": {
348
+ "type": "string",
349
+ "enum": [
350
+ "auto",
351
+ "private",
352
+ "shared"
353
+ ],
354
+ "description": "Which memory domain to search: \"auto\" = your private + channel shared (default), \"private\" = only your own, \"shared\" = only channel-wide shared memories"
355
+ },
356
+ "limit": {
357
+ "type": "number",
358
+ "description": "Max results (default 5, max 20)"
359
+ }
360
+ },
361
+ "required": [
362
+ "query"
363
+ ]
364
+ }
365
+ },
366
+ {
367
+ "name": "save_memory",
368
+ "label": "Save Memory",
369
+ "description": "Persist a distilled, reusable insight into memory for future tasks. scope=\"private\" saves to YOUR personal memory (only you recall it); scope=\"shared\" saves to the CHANNEL shared memory visible to ALL teammates (use for conclusions, conventions, or knowledge the whole team benefits from — not task-specific minutiae). Distill before saving: title = short topic, content = the reusable conclusion. Use a stable dedup_key to update an existing memory instead of duplicating. NOTE: the platform already auto-archives task outcomes, team results, the team chronicle, and session compaction summaries — never save whole task logs or raw session transcripts.",
370
+ "parameters": {
371
+ "type": "object",
372
+ "properties": {
373
+ "title": {
374
+ "type": "string",
375
+ "description": "Short topic title, e.g. \"API 网关限流方案结论\""
376
+ },
377
+ "content": {
378
+ "type": "string",
379
+ "description": "The distilled reusable knowledge/conclusion (plain text)"
380
+ },
381
+ "importance": {
382
+ "type": "number",
383
+ "description": "0-1 importance (default 0.7 private / 0.85 shared)"
384
+ },
385
+ "scope": {
386
+ "type": "string",
387
+ "enum": [
388
+ "private",
389
+ "shared"
390
+ ],
391
+ "description": "\"private\" = your memory only; \"shared\" = channel-wide shared memory for all teammates"
392
+ },
393
+ "dedup_key": {
394
+ "type": "string",
395
+ "description": "Stable key for idempotent update (same key overwrites instead of duplicating)"
396
+ }
397
+ },
398
+ "required": [
399
+ "title",
400
+ "content",
401
+ "scope"
402
+ ]
403
+ }
404
+ },
405
+ {
406
+ "name": "create_team_agent",
407
+ "label": "Create Team Agent",
408
+ "description": "(Lead only) Create a NEW worker only when capability/load evidence shows existing members cannot handle the work. Reuse existing workers first. The platform enforces a per-Channel worker roster cap, including disabled members; do not retry with another name after TEAM_WORKER_LIMIT.",
409
+ "parameters": {
410
+ "type": "object",
411
+ "properties": {
412
+ "name": {
413
+ "type": "string",
414
+ "description": "Short, descriptive member name, e.g. \"db-migrator\" or \"test-writer\""
415
+ },
416
+ "harness": {
417
+ "type": "string",
418
+ "enum": [
419
+ "omp",
420
+ "mock",
421
+ "claude"
422
+ ],
423
+ "description": "Agent harness: \"omp\" = full LLM agent with native work tools (default, use this for real work), \"mock\" = scripted test agent, \"claude\" = claude harness"
424
+ },
425
+ "system_prompt": {
426
+ "type": "string",
427
+ "description": "System prompt prefix defining this member's specialty, working style, and conventions (maps to its systemPromptPrefix config)"
428
+ },
429
+ "reason": {
430
+ "type": "string",
431
+ "description": "Why this member is being added (shown to the user in the team event timeline)"
432
+ }
433
+ },
434
+ "required": [
435
+ "name"
436
+ ]
437
+ }
438
+ },
439
+ {
440
+ "name": "update_team_agent",
441
+ "label": "Update Team Agent",
442
+ "description": "(Lead only) Update an existing team member (worker): rename it, revise its system prompt (e.g. to specialize or correct its behavior), or enable/disable it. The member's runtime reloads with the new config on its next assignment. You cannot update yourself.",
443
+ "parameters": {
444
+ "type": "object",
445
+ "properties": {
446
+ "agent_id": {
447
+ "type": "string",
448
+ "description": "ID of the worker agent to update (from list_team_agents)"
449
+ },
450
+ "name": {
451
+ "type": "string",
452
+ "description": "New name (optional)"
453
+ },
454
+ "system_prompt": {
455
+ "type": "string",
456
+ "description": "New system prompt prefix defining its specialty/conventions (optional)"
457
+ },
458
+ "enabled": {
459
+ "type": "boolean",
460
+ "description": "true = activate member, false = disable member (disabled members receive no new tasks; default true)"
461
+ },
462
+ "reason": {
463
+ "type": "string",
464
+ "description": "Why this change is made (shown in the team event timeline)"
465
+ }
466
+ },
467
+ "required": [
468
+ "agent_id"
469
+ ]
470
+ }
471
+ },
472
+ {
473
+ "name": "remove_team_agent",
474
+ "label": "Remove Team Agent",
475
+ "description": "(Lead only) Remove a worker from your channel's team. Its queued tasks are automatically re-dispatched to the remaining worker with the shortest queue (or failed for retry if it was mid-execution), so no work is lost — but the member's context is. Use ONLY for sustained idle surplus or persistent underperformance; never as an experiment, and avoid removing members with active work. You cannot remove yourself.",
476
+ "parameters": {
477
+ "type": "object",
478
+ "properties": {
479
+ "agent_id": {
480
+ "type": "string",
481
+ "description": "ID of the worker agent to remove"
482
+ },
483
+ "reason": {
484
+ "type": "string",
485
+ "description": "Why this member is removed (shown in the team event timeline)"
486
+ }
487
+ },
488
+ "required": [
489
+ "agent_id"
490
+ ]
491
+ }
492
+ },
493
+ {
494
+ "name": "refuse_task",
495
+ "label": "Refuse Task",
496
+ "description": "Reject a task assigned to you because it is outside your capability or work scope (wrong recipient, unrelated domain, or missing prerequisites). The task is marked FAILED with your reason and a rejection notice is immediately sent back to the dispatcher (task creator, or the channel lead), who should reassign it to a fitting member. Use this INSTEAD of silently ignoring the task or doing unrelated work; do NOT use it for tasks you are able to do, and do NOT use cancel_task for refusals.",
497
+ "parameters": {
498
+ "type": "object",
499
+ "properties": {
500
+ "task_id": {
501
+ "type": "string",
502
+ "description": "ID of the task you are refusing (must be assigned to you)"
503
+ },
504
+ "reason": {
505
+ "type": "string",
506
+ "description": "Why the task is out of your scope: capability mismatch / wrong recipient / prerequisites missing. Be specific so the dispatcher can reassign properly."
507
+ }
508
+ },
509
+ "required": [
510
+ "task_id",
511
+ "reason"
512
+ ]
513
+ }
514
+ },
515
+ {
516
+ "name": "my_industrial_nodes",
517
+ "label": "My Industrial Nodes",
518
+ "description": "列出你绑定的全部数采/数控节点及其物理含义(参数含义/单位/安全量程/活动配方工艺窗口/控制模式)。在进行任何工业操作前必须先调用本工具理解节点语义与设定规则。",
519
+ "parameters": {
520
+ "type": "object",
521
+ "properties": {}
522
+ }
523
+ },
524
+ {
525
+ "name": "dcw_control",
526
+ "label": "DCW Control",
527
+ "description": "对绑定的数控节点下发工艺设定值(真实物理量纲)。仅限你有权控制的节点;设定值会被安全量程与活动配方工艺窗口联锁校验,越窗直接拒绝。手动确认模式下需等待用户批准,用户备注会随结果返回。下发前先调用 my_industrial_nodes 理解节点物理含义。",
528
+ "parameters": {
529
+ "type": "object",
530
+ "properties": {
531
+ "node_id": {
532
+ "type": "string",
533
+ "description": "数控节点 id(见 my_industrial_nodes)"
534
+ },
535
+ "value": {
536
+ "type": "number",
537
+ "description": "目标设定值(真实物理量纲,如 ℃)"
538
+ },
539
+ "hypothesis": {
540
+ "type": "string",
541
+ "description": "本次调参假设(入优化记录档案):目标 + 预期效果 + 观察计划,如「提温 1℃ 预期张力上升 2%,5 分钟后复测」"
542
+ },
543
+ "task_id": {
544
+ "type": "string",
545
+ "description": "关联的优化任务 id(可选,入优化记录档案)"
546
+ }
547
+ },
548
+ "required": [
549
+ "node_id",
550
+ "value"
551
+ ]
552
+ }
553
+ },
554
+ {
555
+ "name": "dcw_read",
556
+ "label": "DCW Read",
557
+ "description": "读取绑定的数控节点的 PLC 当前值(读写集成的读半边)。返回 PLC 实时读数(经标定解码的物理量纲)与设定值对照;用于下发前取证、下发后复核设定是否生效。读取是被动观测,不影响控制状态,也不需要审批。",
558
+ "parameters": {
559
+ "type": "object",
560
+ "properties": {
561
+ "node_id": {
562
+ "type": "string",
563
+ "description": "数控节点 id(见 my_industrial_nodes)"
564
+ }
565
+ },
566
+ "required": [
567
+ "node_id"
568
+ ]
569
+ }
570
+ },
571
+ {
572
+ "name": "param_control",
573
+ "label": "Param Control",
574
+ "description": "按工艺参数下发设定值(推荐的参数语义寻址面;param=工艺参数 id 或 key)。参数 → PLC 执行点的映射由系统封装,你只面对真实物理量纲,不需要也不可见寄存器/数据类型等底层细节。设定值受四层限界联锁(节点安全量程 ∩ 工艺参数基准限界 ∩ 活动产品限界 ∩ 活动配方工艺窗口)逐层收窄,用户与 Agent 一体约束,越界直接拒绝。手动确认模式下需等待用户批准。下发前先调用 my_industrial_nodes 理解参数语义。",
575
+ "parameters": {
576
+ "type": "object",
577
+ "properties": {
578
+ "param": {
579
+ "type": "string",
580
+ "description": "工艺参数 id(pp-*)或参数 key(产线内唯一,见 my_industrial_nodes / line_context)"
581
+ },
582
+ "value": {
583
+ "type": "number",
584
+ "description": "目标设定值(真实物理量纲,如 ℃)"
585
+ },
586
+ "line_id": {
587
+ "type": "string",
588
+ "description": "产线 id(可选;参数 key 跨产线同名时用于消歧)"
589
+ },
590
+ "hypothesis": {
591
+ "type": "string",
592
+ "description": "本次调参假设(入优化记录档案):目标 + 预期效果 + 观察计划"
593
+ },
594
+ "task_id": {
595
+ "type": "string",
596
+ "description": "关联的优化任务 id(可选,入优化记录档案)"
597
+ }
598
+ },
599
+ "required": [
600
+ "param",
601
+ "value"
602
+ ]
603
+ }
604
+ },
605
+ {
606
+ "name": "param_read",
607
+ "label": "Param Read",
608
+ "description": "按工艺参数读取 PLC 当前值(param=工艺参数 id 或 key),返回实时读数(物理量纲)与当前设定值对照,以及该参数当前的有效写入区间(分层限界)。用于下发前取证、下发后复核。读取是被动观测,不需要审批。",
609
+ "parameters": {
610
+ "type": "object",
611
+ "properties": {
612
+ "param": {
613
+ "type": "string",
614
+ "description": "工艺参数 id(pp-*)或参数 key"
615
+ },
616
+ "line_id": {
617
+ "type": "string",
618
+ "description": "产线 id(可选;参数 key 跨产线同名时用于消歧)"
619
+ }
620
+ },
621
+ "required": [
622
+ "param"
623
+ ]
624
+ }
625
+ },
626
+ {
627
+ "name": "daq_query",
628
+ "label": "DAQ Query",
629
+ "description": "从时序数据库检索你绑定的数采节点的历史/实时数据。支持按产线/产品/配方/批次/时间窗/降采样多维过滤(产品/配方过滤基于逐样本打标,可精确取某批次数据);返回结果携带物理含义(参数语义/单位/量程/统计摘要/最近序列)。默认只取**当前活动批次(活动配方)**的数据:产线正在跑什么配方就只查那个配方,不会把上一轮配方的样本混进本轮判读;需要跨配方看整段历史时显式传 scope=all。",
630
+ "parameters": {
631
+ "type": "object",
632
+ "properties": {
633
+ "node_id": {
634
+ "type": "string",
635
+ "description": "限定单个数采节点 id(缺省 = 全部绑定节点)"
636
+ },
637
+ "line_id": {
638
+ "type": "string",
639
+ "description": "按产线过滤(数据归属产线)"
640
+ },
641
+ "product_id": {
642
+ "type": "string",
643
+ "description": "按产品过滤(逐样本打标);显式传入即覆盖默认的活动批次过滤"
644
+ },
645
+ "recipe_id": {
646
+ "type": "string",
647
+ "description": "按配方过滤(逐样本打标);显式传入即覆盖默认过滤。缺省 = 该节点所在产线的活动配方(产线未开跑则不过滤)"
648
+ },
649
+ "run_id": {
650
+ "type": "string",
651
+ "description": "按批次 run 过滤(同一配方多次开跑时精确定位某一次);显式传入即覆盖默认过滤"
652
+ },
653
+ "scope": {
654
+ "type": "string",
655
+ "description": "作用域:active(缺省)= 只取当前活动批次;all = 不做配方过滤,返回窗口内全部样本(跨配方对比/历史复盘用)"
656
+ },
657
+ "last_minutes": {
658
+ "type": "number",
659
+ "description": "最近 N 分钟(缺省 30)"
660
+ },
661
+ "from_ms": {
662
+ "type": "number",
663
+ "description": "起始 epoch ms(与 to_ms 配合,优先于 last_minutes)"
664
+ },
665
+ "to_ms": {
666
+ "type": "number",
667
+ "description": "结束 epoch ms"
668
+ },
669
+ "bucket_ms": {
670
+ "type": "number",
671
+ "description": "时间间隔(降采样桶宽 ms):缺省 {queryDefaultBucketMs}(15s);可调,下限 {queryMinBucketMs}。不传即用缺省;系统配置变更后以新值为准"
672
+ },
673
+ "limit": {
674
+ "type": "number",
675
+ "description": "返回点数上限(缺省 500)"
676
+ }
677
+ }
678
+ }
679
+ },
680
+ {
681
+ "name": "dcw_judge",
682
+ "label": "DCW Judge",
683
+ "description": "对你发起的优化记录(调控 step)落判定。keep=已验证经验(配方可标 lastGood);rollback=判定应回退(判定入册后必须再调 dcw_rollback 执行,判定不自动改 PLC);uncertain=证据不足保持观察。判定必须引用数采证据(daq_query 窗口数据),禁止无证据判定。",
684
+ "parameters": {
685
+ "type": "object",
686
+ "properties": {
687
+ "record_id": {
688
+ "type": "string",
689
+ "description": "优化记录 id(dcw_control 下发成功后返回)"
690
+ },
691
+ "verdict": {
692
+ "type": "string",
693
+ "description": "判定结论:keep / rollback / uncertain",
694
+ "enum": [
695
+ "keep",
696
+ "rollback",
697
+ "uncertain"
698
+ ]
699
+ },
700
+ "reason": {
701
+ "type": "string",
702
+ "description": "判定理由(必须引用具体数值/时间窗证据)"
703
+ }
704
+ },
705
+ "required": [
706
+ "record_id",
707
+ "verdict",
708
+ "reason"
709
+ ]
710
+ }
711
+ },
712
+ {
713
+ "name": "dcw_rollback",
714
+ "label": "DCW Rollback",
715
+ "description": "执行参数回退(经与下发相同的安全门控,回退本身入册可审计)。record_id=回退你自己发起的优化记录到其设定前值;node_id=单步撤销到最近稳定锚。回退后必须 daq_query 复测确认恢复。冷却期内同向重写/重复回退会被拒绝。",
716
+ "parameters": {
717
+ "type": "object",
718
+ "properties": {
719
+ "record_id": {
720
+ "type": "string",
721
+ "description": "要回退的优化记录 id(与 node_id 二选一)"
722
+ },
723
+ "node_id": {
724
+ "type": "string",
725
+ "description": "节点单步回退(撤销栈栈顶;与 record_id 二选一)"
726
+ },
727
+ "to": {
728
+ "type": "string",
729
+ "description": "可选:指定目标锚 id(dcw_journal 可查)"
730
+ }
731
+ }
732
+ }
733
+ },
734
+ {
735
+ "name": "dcw_journal",
736
+ "label": "DCW Journal",
737
+ "description": "查询参数变更史与优化记录(在册审计):谁/何时/从多少到多少/判定结论/假设声明。优化前先读史可避免重复试错;回退定位也在此查。",
738
+ "parameters": {
739
+ "type": "object",
740
+ "properties": {
741
+ "node_id": {
742
+ "type": "string",
743
+ "description": "限定数控节点 id(仅限自己绑定的节点)"
744
+ },
745
+ "recipe_id": {
746
+ "type": "string",
747
+ "description": "按配方过滤优化记录"
748
+ },
749
+ "limit": {
750
+ "type": "number",
751
+ "description": "返回条数上限(缺省 20,最大 100)"
752
+ }
753
+ }
754
+ }
755
+ },
756
+ {
757
+ "name": "send_cross_channel_message",
758
+ "label": "Cross-Channel Message",
759
+ "description": "[Leader only] Send a message to the LEADER of another channel, so the two teams can collaborate without being siloed. The message lands directly in the target channel leader mailbox; that leader will read your request and act on it (dispatch tasks in their channel, gather info, etc.) and can reply to you via the mailbox. Params: to_channel_id accepts the target channel id OR its exact name; message is your request to the other leader (state your need, deadline and what you expect back); require_reply=true to demand a response. Only channel leaders may call this tool - workers will be rejected. When replying to a cross-channel request you received, use this same tool addressed to the requester channel.",
760
+ "parameters": {
761
+ "type": "object",
762
+ "properties": {
763
+ "to_channel_id": {
764
+ "type": "string",
765
+ "description": "Target channel id or exact name (must be another channel, not your own)"
766
+ },
767
+ "message": {
768
+ "type": "string",
769
+ "description": "Request text for the target channel leader: what you need, why, and what to return"
770
+ },
771
+ "require_reply": {
772
+ "type": "boolean",
773
+ "description": "true = demand the target leader reply with their result/answer"
774
+ }
775
+ },
776
+ "required": [
777
+ "to_channel_id",
778
+ "message"
779
+ ]
780
+ }
781
+ },
782
+ {
783
+ "name": "list_other_teams",
784
+ "label": "List Other Teams",
785
+ "description": "[Leader only] Overview of the OTHER teams (channels) in this workspace: each team name, description, lead, its in-progress scenario tasks, recently completed tasks, and how many shared memories it has (shared_memories > 0 means searchable knowledge exists - use search_other_teams_memory with that team). Decision flow: found knowledge -> reuse it directly; relevant work in progress but no knowledge yet -> message their leader via send_cross_channel_message; nothing -> consider whether your request justifies starting collaboration. Workers cannot call this tool.",
786
+ "parameters": {
787
+ "type": "object",
788
+ "properties": {},
789
+ "required": []
790
+ }
791
+ },
792
+ {
793
+ "name": "search_other_teams_memory",
794
+ "label": "Search Other Teams Memory",
795
+ "description": "[All members] Read-only search across the SHARED memory of other teams (channels) in this workspace - what other teams have learned/concluded/done. Use it to reuse existing knowledge instead of asking for it: if you find relevant results, apply them directly; if nothing relevant exists but the other team is working on it, ask your leader to message that team leader via send_cross_channel_message. Results are attributed to their team.",
796
+ "parameters": {
797
+ "type": "object",
798
+ "properties": {
799
+ "query": {
800
+ "type": "string",
801
+ "description": "What to look for (keywords of the knowledge/conclusion)"
802
+ },
803
+ "limit": {
804
+ "type": "number",
805
+ "description": "Max results (default 5)"
806
+ }
807
+ },
808
+ "required": [
809
+ "query"
810
+ ]
811
+ }
812
+ },
813
+ {
814
+ "name": "daq_frames",
815
+ "label": "DAQ Frames",
816
+ "description": "Query multi-modal DAQ frames for your BOUND daq nodes: multi-point profiles (thickness scanners, profile scanners — returns point-count summary, a point preview and derived metrics) and camera image frames (CCD — returns resolution, object reference and derived metrics like brightness/contrast; pixels are NOT loaded into context, view them in the frontend gallery). Supports kind=vector|image filter and time windows. Use BEFORE judging surface quality or profile measurements.",
817
+ "parameters": {
818
+ "type": "object",
819
+ "properties": {
820
+ "node_id": {
821
+ "type": "string",
822
+ "description": "Limit to one bound daq node id (optional; default all your bound daq nodes)"
823
+ },
824
+ "line_id": {
825
+ "type": "string",
826
+ "description": "Filter by line id (can only narrow, never widen your access)"
827
+ },
828
+ "kind": {
829
+ "type": "string",
830
+ "enum": [
831
+ "vector",
832
+ "image"
833
+ ],
834
+ "description": "Frame kind filter (optional)"
835
+ },
836
+ "last_minutes": {
837
+ "type": "number",
838
+ "description": "Time window in minutes back from now (default 30)"
839
+ },
840
+ "from_ms": {
841
+ "type": "number",
842
+ "description": "Window start (epoch ms; overrides last_minutes)"
843
+ },
844
+ "to_ms": {
845
+ "type": "number",
846
+ "description": "Window end (epoch ms; default now)"
847
+ },
848
+ "limit": {
849
+ "type": "number",
850
+ "description": "Max frames per node (default 20, max 100)"
851
+ }
852
+ }
853
+ }
854
+ },
855
+ {
856
+ "name": "ops_log",
857
+ "label": "Ops Log",
858
+ "description": "查询你负责产线的运维日志(数控下发/优化判定/回退/配方下发/产线事件,新→旧)。来源区分 Agent/用户/系统:Agent 的操作者格式为「Channel名/成员名」。用于作业前后自查:你对节点做过哪些操作、他人或系统做过哪些干预。",
859
+ "parameters": {
860
+ "type": "object",
861
+ "properties": {
862
+ "line_id": {
863
+ "type": "string",
864
+ "description": "限定产线 id(须为你绑定节点所属产线;缺省=全部负责产线)"
865
+ },
866
+ "node_id": {
867
+ "type": "string",
868
+ "description": "限定数控/数采节点 id(须为你绑定的节点)"
869
+ },
870
+ "kind": {
871
+ "type": "string",
872
+ "description": "按分类过滤:write(下发)/recipe(配方)/rollback(回退)/daq(采集)/line(产线)"
873
+ },
874
+ "actor_kind": {
875
+ "type": "string",
876
+ "description": "按来源过滤:agent/user/system"
877
+ },
878
+ "minutes": {
879
+ "type": "number",
880
+ "description": "回看窗口(分钟,缺省 1440=24 小时)"
881
+ },
882
+ "limit": {
883
+ "type": "number",
884
+ "description": "返回条数上限(缺省 20,最大 100)"
885
+ },
886
+ "mine": {
887
+ "type": "boolean",
888
+ "description": "true=只看你自己发起的操作"
889
+ }
890
+ }
891
+ }
892
+ },
893
+ {
894
+ "name": "recipe_log",
895
+ "label": "Recipe Change Log",
896
+ "description": "查询你负责产线的 Recipe 变更史:配方一键下发(recipe.apply)、优化开窗、判定、回退执行(新→旧)。你据此知道配方层面对当前节点做过哪些下发变更、由谁执行、是否已回退。节点级参数值逐笔历史用 dcw_journal。",
897
+ "parameters": {
898
+ "type": "object",
899
+ "properties": {
900
+ "line_id": {
901
+ "type": "string",
902
+ "description": "限定产线 id(须为你绑定节点所属产线;缺省=全部负责产线)"
903
+ },
904
+ "recipe_id": {
905
+ "type": "string",
906
+ "description": "按配方 id 过滤"
907
+ },
908
+ "minutes": {
909
+ "type": "number",
910
+ "description": "回看窗口(分钟,缺省 1440=24 小时)"
911
+ },
912
+ "limit": {
913
+ "type": "number",
914
+ "description": "返回条数上限(缺省 20,最大 100)"
915
+ }
916
+ }
917
+ }
918
+ },
919
+ {
920
+ "name": "line_context",
921
+ "label": "Line Context",
922
+ "description": "查看你控制的产线/产品/配方全景:产线名与运行态、活动批次(产品、配方名/版本/逐参数目标 vs PLC 当前值)、你绑定的节点、已知良好批次。动手前必读,确认自己操控的是哪条产线、哪个产品、哪个配方。",
923
+ "parameters": {
924
+ "type": "object",
925
+ "properties": {
926
+ "line_id": {
927
+ "type": "string",
928
+ "description": "限定产线 id(须为你绑定节点所属产线;缺省=全部负责产线)"
929
+ }
930
+ }
931
+ }
932
+ },
933
+ {
934
+ "name": "recipe_versions",
935
+ "label": "Recipe Versions",
936
+ "description": "查看配方参数版本史(旧→新):每版的来源(user/agent/system)、操作者(用户名或 Channel名/成员名)、变更原因、参数 diff。回退定位与审计必查。",
937
+ "parameters": {
938
+ "type": "object",
939
+ "properties": {
940
+ "recipe_id": {
941
+ "type": "string",
942
+ "description": "配方 id(必填;line_context 可看到)"
943
+ },
944
+ "limit": {
945
+ "type": "number",
946
+ "description": "返回最近 N 条(缺省 20,最大 50)"
947
+ }
948
+ }
949
+ }
950
+ },
951
+ {
952
+ "name": "recipe_update",
953
+ "label": "Recipe Update",
954
+ "description": "把验证过的最佳工艺参数保存进配方(部分合并,生成新版本并记录你的名字与原因)。只改配方定义,下一批次生效;不改运行中 PLC 当前值(用 dcw_control)。必须提供 reason(数采证据/判定结论)。",
955
+ "parameters": {
956
+ "type": "object",
957
+ "properties": {
958
+ "recipe_id": {
959
+ "type": "string",
960
+ "description": "配方 id(必填)"
961
+ },
962
+ "params": {
963
+ "type": "array",
964
+ "description": "要更新的参数列表(部分合并,只列要改的节点)",
965
+ "items": {
966
+ "type": "object",
967
+ "properties": {
968
+ "node_id": {
969
+ "type": "string",
970
+ "description": "数控节点 id(须为你绑定 dcw 的节点)"
971
+ },
972
+ "value": {
973
+ "type": "number",
974
+ "description": "新的目标值"
975
+ },
976
+ "min": {
977
+ "type": "number",
978
+ "description": "可选:新配方窗口下限"
979
+ },
980
+ "max": {
981
+ "type": "number",
982
+ "description": "可选:新配方窗口上限"
983
+ }
984
+ }
985
+ }
986
+ },
987
+ "reason": {
988
+ "type": "string",
989
+ "description": "保存原因(必填;写明依据)"
990
+ },
991
+ "task_id": {
992
+ "type": "string",
993
+ "description": "关联任务 id(可选)"
994
+ }
995
+ }
996
+ }
997
+ },
998
+ {
999
+ "name": "recipe_rollback",
1000
+ "label": "Recipe Rollback",
1001
+ "description": "回退配方参数到稳定版本:指定历史版本(version)或已知良好批次冻结(to_last_good=true)。生成新版本(非破坏,历史保留);不改运行中 PLC。必须提供 reason。",
1002
+ "parameters": {
1003
+ "type": "object",
1004
+ "properties": {
1005
+ "recipe_id": {
1006
+ "type": "string",
1007
+ "description": "配方 id(必填)"
1008
+ },
1009
+ "version": {
1010
+ "type": "number",
1011
+ "description": "回退到该历史版本(version 与 to_last_good 二选一)"
1012
+ },
1013
+ "to_last_good": {
1014
+ "type": "boolean",
1015
+ "description": "true=回退到已知良好批次参数冻结"
1016
+ },
1017
+ "reason": {
1018
+ "type": "string",
1019
+ "description": "回退原因(必填)"
1020
+ }
1021
+ }
1022
+ }
1023
+ },
1024
+ {
1025
+ "name": "aml_node_catalog",
1026
+ "label": "AML Node Catalog",
1027
+ "description": "列出你可用的 AML 建模节点(全部 daq 绑定):节点 id/名称/物理语义/单位/量程/所属产线/近 24h 是否有批次打标数据。开始任何自动建模前先调用本工具选节点(control=可控输入/target=预测目标/feature=仅历史特征);无绑定会给出指引。",
1028
+ "parameters": {
1029
+ "type": "object",
1030
+ "properties": {}
1031
+ }
1032
+ },
1033
+ {
1034
+ "name": "aml_dataset_build",
1035
+ "label": "AML Dataset Build",
1036
+ "description": "构建 AML 训练数据集:按隔离三元组(产线/产品/配方,防配方串味)拉取批次打标数据,清洗(状态/量程/Hampel)后对齐到 beat_ms 网格,按批次滑窗切分 train/val/test。鉴权:每个 node_id 都必须有你的 daq 绑定且归属 line_id(绑定只缩不放)。返回 dataset_id、行数、窗口计数、逐节点清洗摘要、控制→目标滞后估计。",
1037
+ "parameters": {
1038
+ "type": "object",
1039
+ "properties": {
1040
+ "line_id": {
1041
+ "type": "string",
1042
+ "description": "产线 id(必填;line_context 可查)"
1043
+ },
1044
+ "product_id": {
1045
+ "type": "string",
1046
+ "description": "产品 id(必填)"
1047
+ },
1048
+ "recipe_id": {
1049
+ "type": "string",
1050
+ "description": "配方 id(必填)"
1051
+ },
1052
+ "nodes": {
1053
+ "type": "array",
1054
+ "description": "节点与角色列表(≥2 项,必须含 1 个 target)",
1055
+ "items": {
1056
+ "type": "object",
1057
+ "properties": {
1058
+ "node_id": {
1059
+ "type": "string",
1060
+ "description": "数采节点 id(须有你的 daq 绑定)"
1061
+ },
1062
+ "role": {
1063
+ "type": "string",
1064
+ "enum": [
1065
+ "control",
1066
+ "feature",
1067
+ "target"
1068
+ ],
1069
+ "description": "control=可控输入(未来轨迹已知)/ target=预测目标 / feature=仅历史特征"
1070
+ }
1071
+ },
1072
+ "required": [
1073
+ "node_id",
1074
+ "role"
1075
+ ]
1076
+ }
1077
+ },
1078
+ "beat_ms": {
1079
+ "type": "number",
1080
+ "description": "数据对齐节拍(ms,≥1000,常用 5000~15000)"
1081
+ },
1082
+ "history_steps": {
1083
+ "type": "number",
1084
+ "description": "历史窗口步数(1~2048;覆盖主要滞后即可)"
1085
+ },
1086
+ "horizon_steps": {
1087
+ "type": "number",
1088
+ "description": "预测步长(1~512;mpc_surrogate 建议覆盖调控响应期)"
1089
+ },
1090
+ "split_seed": {
1091
+ "type": "number",
1092
+ "description": "切分随机种子(缺省 42)"
1093
+ },
1094
+ "val_ratio": {
1095
+ "type": "number",
1096
+ "description": "验证集比例(缺省 0.15)"
1097
+ },
1098
+ "test_ratio": {
1099
+ "type": "number",
1100
+ "description": "测试集比例(缺省 0.15)"
1101
+ },
1102
+ "purpose": {
1103
+ "type": "string",
1104
+ "enum": [
1105
+ "mpc_surrogate",
1106
+ "quality_predict"
1107
+ ],
1108
+ "description": "建模目的:mpc_surrogate=代理模型(缺省)/ quality_predict=质量预测"
1109
+ },
1110
+ "note": {
1111
+ "type": "string",
1112
+ "description": "数据集备注(为什么建这个数据集)"
1113
+ },
1114
+ "run_ids": {
1115
+ "type": "array",
1116
+ "items": {
1117
+ "type": "string"
1118
+ },
1119
+ "description": "限定批次 id 列表(缺省 = 该配方全部已完结批次)"
1120
+ },
1121
+ "from_ms": {
1122
+ "type": "number",
1123
+ "description": "起始 epoch ms(可选)"
1124
+ },
1125
+ "to_ms": {
1126
+ "type": "number",
1127
+ "description": "结束 epoch ms(可选)"
1128
+ }
1129
+ },
1130
+ "required": [
1131
+ "line_id",
1132
+ "product_id",
1133
+ "recipe_id",
1134
+ "nodes",
1135
+ "beat_ms",
1136
+ "history_steps",
1137
+ "horizon_steps"
1138
+ ]
1139
+ }
1140
+ },
1141
+ {
1142
+ "name": "aml_dataset_stats",
1143
+ "label": "AML Dataset Stats",
1144
+ "description": "查看数据集完整统计报告:逐节点 mean/std/p05/p50/p95/缺失率/清洗率、控制→目标滞后估计、逐批次目标均值轮廓(漂移检测)、train/val/test 窗口计数。提交训练前用它确认数据质量。",
1145
+ "parameters": {
1146
+ "type": "object",
1147
+ "properties": {
1148
+ "dataset_id": {
1149
+ "type": "string",
1150
+ "description": "数据集 id(aml_dataset_build 返回)"
1151
+ }
1152
+ },
1153
+ "required": [
1154
+ "dataset_id"
1155
+ ]
1156
+ }
1157
+ },
1158
+ {
1159
+ "name": "aml_job_submit",
1160
+ "label": "AML Job Submit",
1161
+ "description": "提交训练作业(内联 train.py 全文,≤500KB)。代码契约:必须 import amlkit;amlkit.load_bundle(datasetPath) 加载数据集;amlkit.report_progress(pct, note) 上报进度(防停摆误杀);amlkit.export_torch_onnx(model, manifest) 导出模型到 artifacts/model.onnx(契约缺失=永久失败);模型接口=one-step:输入 [batch, history_steps, 全节点数](归一化)→ 输出 [batch, 目标数](归一化)。change_note 遵守单组件改动纪律:每次实验只改一个组件(网络/特征/超参之一)并写明。",
1162
+ "parameters": {
1163
+ "type": "object",
1164
+ "properties": {
1165
+ "dataset_id": {
1166
+ "type": "string",
1167
+ "description": "数据集 id(aml_dataset_build 返回)"
1168
+ },
1169
+ "code": {
1170
+ "type": "string",
1171
+ "description": "train.py 全文(≤500KB,须 import amlkit 并导出 artifacts/model.onnx)。job_kind=hybrid_residual 时可省略:平台自动使用内置参考训练器(物理参数校准→有界残差集成→UQ 校准)"
1172
+ },
1173
+ "change_note": {
1174
+ "type": "string",
1175
+ "description": "本次实验改动说明(必填;单组件改动纪律:只改一个组件,写明改了什么与预期)"
1176
+ },
1177
+ "params": {
1178
+ "type": "object",
1179
+ "description": "超参数字典(如 {\"epochs\": 50, \"lr\": 0.001};传入训练代码的 job.json.params)"
1180
+ },
1181
+ "seed": {
1182
+ "type": "number",
1183
+ "description": "随机种子(缺省 42)"
1184
+ },
1185
+ "purpose": {
1186
+ "type": "string",
1187
+ "enum": [
1188
+ "mpc_surrogate",
1189
+ "quality_predict"
1190
+ ],
1191
+ "description": "建模目的(缺省继承数据集 spec)"
1192
+ },
1193
+ "parent_experiment_id": {
1194
+ "type": "string",
1195
+ "description": "父实验 id(谱系对照:本次是在哪个实验基础上改的)"
1196
+ },
1197
+ "scene_id": {
1198
+ "type": "string",
1199
+ "description": "Hybrid Twin 场景 id(可选;写入作业谱系)"
1200
+ },
1201
+ "scene_version": {
1202
+ "type": "string",
1203
+ "description": "Hybrid Twin 场景版本"
1204
+ },
1205
+ "objective_id": {
1206
+ "type": "string",
1207
+ "description": "ObjectiveProfile id"
1208
+ },
1209
+ "job_kind": {
1210
+ "type": "string",
1211
+ "enum": [
1212
+ "supervised",
1213
+ "physics_calibration",
1214
+ "hybrid_residual",
1215
+ "uncertainty_calibration"
1216
+ ],
1217
+ "description": "训练阶段;legacy 留空"
1218
+ },
1219
+ "physics_spec": {
1220
+ "type": "object",
1221
+ "description": "已冻结 SceneContract 对应的声明式 PhysicsSpec;平台会在隔离 workspace 写入 physics_spec.json"
1222
+ },
1223
+ "physics_manifest": {
1224
+ "type": "object",
1225
+ "description": "物理模型 manifest 快照"
1226
+ },
1227
+ "twin_snapshot": {
1228
+ "type": "object",
1229
+ "description": "训练所依据的 TwinSnapshot"
1230
+ },
1231
+ "objective_profile": {
1232
+ "type": "object",
1233
+ "description": "优化目标契约"
1234
+ },
1235
+ "model_name": {
1236
+ "type": "string",
1237
+ "description": "模型人读标识(可选,≤80 字符):注册时作 label 前缀;平台会自动追加「产品/配方·优化目标」谱系尾,换配方或换目标的模型必须能从名字区分"
1238
+ },
1239
+ "model_description": {
1240
+ "type": "string",
1241
+ "description": "建模意图描述(可选,≤500 字符):写清本模型针对的场景/配方与优化目标;缺省由平台按谱系派生"
1242
+ }
1243
+ },
1244
+ "required": [
1245
+ "dataset_id",
1246
+ "code",
1247
+ "change_note"
1248
+ ]
1249
+ }
1250
+ },
1251
+ {
1252
+ "name": "aml_job_status",
1253
+ "label": "AML Job Status",
1254
+ "description": "查看训练作业状态:状态/阶段(provision→train→evaluate)/进度/平台门禁逐项(G1 单步/G2 滚动 NRMSE 等)/错误。不带 job_id 列出最近 10 个;带 job_id 看单作业详情。训练中建议 30~60 秒轮询一次。",
1255
+ "parameters": {
1256
+ "type": "object",
1257
+ "properties": {
1258
+ "job_id": {
1259
+ "type": "string",
1260
+ "description": "作业 id(缺省 = 列最近 10 个)"
1261
+ }
1262
+ }
1263
+ }
1264
+ },
1265
+ {
1266
+ "name": "aml_job_logs",
1267
+ "label": "AML Job Logs",
1268
+ "description": "查看训练作业日志尾(平台 ##AML 协议行 + 训练输出)。失败定位/进度细节用这个。",
1269
+ "parameters": {
1270
+ "type": "object",
1271
+ "properties": {
1272
+ "job_id": {
1273
+ "type": "string",
1274
+ "description": "作业 id"
1275
+ },
1276
+ "lines": {
1277
+ "type": "number",
1278
+ "description": "返回行数(缺省 80,上限 400)"
1279
+ }
1280
+ },
1281
+ "required": [
1282
+ "job_id"
1283
+ ]
1284
+ }
1285
+ },
1286
+ {
1287
+ "name": "aml_job_cancel",
1288
+ "label": "AML Job Cancel",
1289
+ "description": "取消排队/运行中的训练作业(运行中的会终止进程树;取消动作入册可审计)。数据集不受影响,可复用重训。",
1290
+ "parameters": {
1291
+ "type": "object",
1292
+ "properties": {
1293
+ "job_id": {
1294
+ "type": "string",
1295
+ "description": "作业 id"
1296
+ }
1297
+ },
1298
+ "required": [
1299
+ "job_id"
1300
+ ]
1301
+ }
1302
+ },
1303
+ {
1304
+ "name": "aml_leaderboard",
1305
+ "label": "AML Leaderboard",
1306
+ "description": "查看数据集的实验谱系表(新→旧):每条实验的 change_note/父实验/状态/G1 单步与 G2 滚动 NRMSE/门禁通过情况,并标注当前最优(门禁通过且 G1 最小);同时列出已登记模型(model_id,晋升对象)。优化前先读榜,避免重复试错。",
1307
+ "parameters": {
1308
+ "type": "object",
1309
+ "properties": {
1310
+ "dataset_id": {
1311
+ "type": "string",
1312
+ "description": "数据集 id"
1313
+ }
1314
+ },
1315
+ "required": [
1316
+ "dataset_id"
1317
+ ]
1318
+ }
1319
+ },
1320
+ {
1321
+ "name": "aml_model_find",
1322
+ "label": "AML Model Find",
1323
+ "description": "模型发现与选型:按产线/产品/配方/purpose/优化目标/阶段过滤模型注册表,每个模型给出「label(产线·配方·优化目标标识)/阶段/G1+G2 指标/描述」,生产模型置顶,并按当前情况给出 选型指引:复用已有生产模型(aml_model_reference)→ 晋升候选(aml_model_promote,lead 专属)→ 新建模型(aml_dataset_build → aml_job_submit)。开始优化任务前先查:模型按 (产品, 配方, purpose) 隔离,不同 recipe 的模型不可跨用。",
1324
+ "parameters": {
1325
+ "type": "object",
1326
+ "properties": {
1327
+ "line_id": {
1328
+ "type": "string",
1329
+ "description": "限定产线 id(须为你绑定节点所属产线;缺省 = 全部负责产线)"
1330
+ },
1331
+ "product_id": {
1332
+ "type": "string",
1333
+ "description": "限定产品 id"
1334
+ },
1335
+ "recipe_id": {
1336
+ "type": "string",
1337
+ "description": "限定配方 id(配方隔离:换配方必须换模型,选型前务必指定)"
1338
+ },
1339
+ "purpose": {
1340
+ "type": "string",
1341
+ "enum": [
1342
+ "mpc_surrogate",
1343
+ "quality_predict"
1344
+ ],
1345
+ "description": "限定建模目的"
1346
+ },
1347
+ "objective_id": {
1348
+ "type": "string",
1349
+ "description": "限定优化目标(ObjectiveProfile id;hybrid twin 模型携带)"
1350
+ },
1351
+ "stage": {
1352
+ "type": "string",
1353
+ "enum": [
1354
+ "candidate",
1355
+ "shadow",
1356
+ "production",
1357
+ "retired"
1358
+ ],
1359
+ "description": "限定阶段(缺省 = 全部,production 置顶)"
1360
+ }
1361
+ }
1362
+ }
1363
+ },
1364
+ {
1365
+ "name": "aml_model_promote",
1366
+ "label": "AML Model Promote",
1367
+ "description": "(Lead only) 晋升模型阶段:to_stage=shadow(影子观测)或 production(生产生效)。必须经人工审批(HITL 挂起,用户批准/拒绝/超时);批准晋升 production 时同组旧生产模型自动退役。worker 无此工具;模型 id 从 aml_leaderboard 查。",
1368
+ "parameters": {
1369
+ "type": "object",
1370
+ "properties": {
1371
+ "model_id": {
1372
+ "type": "string",
1373
+ "description": "模型 id(aml_leaderboard 的已登记模型段)"
1374
+ },
1375
+ "to_stage": {
1376
+ "type": "string",
1377
+ "enum": [
1378
+ "shadow",
1379
+ "production"
1380
+ ],
1381
+ "description": "目标阶段:shadow=影子观测 / production=生产生效"
1382
+ }
1383
+ },
1384
+ "required": [
1385
+ "model_id",
1386
+ "to_stage"
1387
+ ]
1388
+ }
1389
+ },
1390
+ {
1391
+ "name": "aml_model_reference",
1392
+ "label": "AML Model Reference",
1393
+ "description": "影子模型参考(调参前先问影子模型):拉取最近历史数据组装生产模型输入,按当前/指定控制轨迹预测未来每拍的目标值(物理量纲)。用于 dcw_control 下发前对比不同设定方案的目标响应;预测仅供参考,真实下发仍走安全联锁。product/recipe 缺省时取你绑定节点所属产线的唯一活动批次。",
1394
+ "parameters": {
1395
+ "type": "object",
1396
+ "properties": {
1397
+ "line_id": {
1398
+ "type": "string",
1399
+ "description": "限定产线 id(须为你绑定节点所属产线;多产线绑定且未给全 product/recipe 时必传以消歧)"
1400
+ },
1401
+ "product_id": {
1402
+ "type": "string",
1403
+ "description": "产品 id(缺省 = 活动批次)"
1404
+ },
1405
+ "recipe_id": {
1406
+ "type": "string",
1407
+ "description": "配方 id(缺省 = 活动批次)"
1408
+ },
1409
+ "purpose": {
1410
+ "type": "string",
1411
+ "enum": [
1412
+ "mpc_surrogate",
1413
+ "quality_predict"
1414
+ ],
1415
+ "description": "建模目的(缺省 mpc_surrogate)"
1416
+ },
1417
+ "controls": {
1418
+ "type": "object",
1419
+ "description": "控制节点设定值映射 {node_id: value}(候选方案;缺省 = 持最后观测)"
1420
+ },
1421
+ "steps": {
1422
+ "type": "number",
1423
+ "description": "滚动预测步数(≤ 模型 horizon;缺省 = 全 horizon)"
1424
+ }
1425
+ }
1426
+ }
1427
+ },
1428
+ {
1429
+ "name": "twin_provider_catalog",
1430
+ "label": "Twin Provider Catalog",
1431
+ "description": "读取当前已注册的场景 Provider、ScenePack、SolverAdapter 及 generation/health 元数据;只读,不执行控制。",
1432
+ "parameters": {
1433
+ "type": "object",
1434
+ "properties": {
1435
+ "scene_kind": {
1436
+ "type": "string",
1437
+ "description": "可选场景类型过滤"
1438
+ }
1439
+ }
1440
+ }
1441
+ },
1442
+ {
1443
+ "name": "twin_scene_discover",
1444
+ "label": "Twin Scene Discover",
1445
+ "description": "读取当前 Agent 已绑定的 DAQ/DCW 节点,推断 control/state/disturbance/target/guard 语义并返回证据与置信度;只读,不执行控制。",
1446
+ "parameters": {
1447
+ "type": "object",
1448
+ "properties": {
1449
+ "scene_kind": {
1450
+ "type": "string",
1451
+ "description": "可选场景类型"
1452
+ }
1453
+ }
1454
+ }
1455
+ },
1456
+ {
1457
+ "name": "twin_scene_compile",
1458
+ "label": "Twin Scene Compile",
1459
+ "description": "根据已绑定节点和场景提示词生成 SceneContract Draft;默认 draft,首次训练/上线前必须由用户确认后冻结。",
1460
+ "parameters": {
1461
+ "type": "object",
1462
+ "properties": {
1463
+ "scene_id": {
1464
+ "type": "string"
1465
+ },
1466
+ "scene_version": {
1467
+ "type": "string"
1468
+ },
1469
+ "line_id": {
1470
+ "type": "string"
1471
+ },
1472
+ "product_id": {
1473
+ "type": "string"
1474
+ },
1475
+ "recipe_id": {
1476
+ "type": "string"
1477
+ },
1478
+ "prompt": {
1479
+ "type": "string"
1480
+ },
1481
+ "physics_profile_id": {
1482
+ "type": "string"
1483
+ },
1484
+ "objective_profile_ids": {
1485
+ "type": "array",
1486
+ "items": {
1487
+ "type": "string"
1488
+ }
1489
+ },
1490
+ "node_ids": {
1491
+ "type": "array",
1492
+ "items": {
1493
+ "type": "string"
1494
+ }
1495
+ }
1496
+ },
1497
+ "required": [
1498
+ "scene_id",
1499
+ "line_id"
1500
+ ]
1501
+ }
1502
+ },
1503
+ {
1504
+ "name": "twin_scene_freeze",
1505
+ "label": "Twin Scene Freeze",
1506
+ "description": "在用户明确确认后冻结 SceneContract;冻结后同一 scene_id/version 的契约不可覆盖,变更必须新建版本。",
1507
+ "parameters": {
1508
+ "type": "object",
1509
+ "properties": {
1510
+ "scene_id": {
1511
+ "type": "string"
1512
+ },
1513
+ "scene_version": {
1514
+ "type": "string"
1515
+ },
1516
+ "expected_hash": {
1517
+ "type": "string"
1518
+ },
1519
+ "approved_by": {
1520
+ "type": "string"
1521
+ },
1522
+ "confirmation": {
1523
+ "type": "string",
1524
+ "description": "必须为 USER_CONFIRMED_SCENE_CONTRACT"
1525
+ }
1526
+ },
1527
+ "required": [
1528
+ "scene_id",
1529
+ "scene_version",
1530
+ "confirmation"
1531
+ ]
1532
+ }
1533
+ },
1534
+ {
1535
+ "name": "twin_physics_spec_draft",
1536
+ "label": "Twin PhysicsSpec Draft",
1537
+ "description": "从场景(SceneContract,须含 nodeId 映射)自动生成骨架 PhysicsSpec:每个状态变量=一阶惯性弛豫方程(τ/控制增益为带先验盒的可校准参数),观测=持久性恒等基线,约束继承场景。这是任意工况建模的起点:生成后按真实物理润色方程 → twin_physics_spec_validate → twin_physics_spec_compile → aml_job_submit(job_kind=hybrid_residual,训练 stage A 会自动按数据拟合 τ/增益)。传 dt_sec 指定与数据集 beat 一致的步长(缺省 1s)。",
1538
+ "parameters": {
1539
+ "type": "object",
1540
+ "properties": {
1541
+ "scene_json": {
1542
+ "type": "object",
1543
+ "description": "SceneContract 全文(hybrid Channel 已绑定冻结场景时可省略)"
1544
+ },
1545
+ "dt_sec": {
1546
+ "type": "number",
1547
+ "description": "求解步长(秒;应与训练数据集 beatMs/1000 一致,缺省 1)"
1548
+ }
1549
+ }
1550
+ }
1551
+ },
1552
+ {
1553
+ "name": "twin_physics_spec_validate",
1554
+ "label": "Twin PhysicsSpec Validate",
1555
+ "description": "校验声明式物理模型的白名单 AST、变量/参数引用、单位、边界、稳定性和单调性;禁止任意代码执行。",
1556
+ "parameters": {
1557
+ "type": "object",
1558
+ "properties": {
1559
+ "physics_spec": {
1560
+ "type": "object"
1561
+ },
1562
+ "spec_json": {
1563
+ "type": "string"
1564
+ }
1565
+ },
1566
+ "required": [
1567
+ "physics_spec"
1568
+ ]
1569
+ }
1570
+ },
1571
+ {
1572
+ "name": "twin_physics_spec_compile",
1573
+ "label": "Twin PhysicsSpec Compile",
1574
+ "description": "将已冻结场景的 PhysicsSpec 编译为隔离的 Generic Declarative Provider 候选并保存 artifact;不注册 production、不写 PLC。",
1575
+ "parameters": {
1576
+ "type": "object",
1577
+ "properties": {
1578
+ "physics_spec": {
1579
+ "type": "object"
1580
+ },
1581
+ "spec_json": {
1582
+ "type": "string"
1583
+ },
1584
+ "scene_json": {
1585
+ "type": "object"
1586
+ }
1587
+ },
1588
+ "required": [
1589
+ "physics_spec",
1590
+ "scene_json"
1591
+ ]
1592
+ }
1593
+ },
1594
+ {
1595
+ "name": "twin_scene_read",
1596
+ "label": "Twin Scene Read",
1597
+ "description": "读取绑定场景的机器可验证 SceneContract 与控制策略;仅返回场景/节点语义,不执行任何控制。",
1598
+ "parameters": {
1599
+ "type": "object",
1600
+ "properties": {
1601
+ "scene_id": {
1602
+ "type": "string",
1603
+ "description": "场景 id,缺省使用当前注塑 MVP 场景"
1604
+ }
1605
+ }
1606
+ }
1607
+ },
1608
+ {
1609
+ "name": "twin_snapshot_create",
1610
+ "label": "Twin Snapshot Create",
1611
+ "description": "根据服务端绑定的 DAQ 样本创建带 freshness/watermark/hash/binding epoch 的不可变 TwinSnapshot;Hybrid Twin 必须 auto_daq=true、冻结场景和 BindingSnapshot,禁止 Agent 伪造样本。",
1612
+ "parameters": {
1613
+ "type": "object",
1614
+ "properties": {
1615
+ "scene_json": {
1616
+ "type": "object",
1617
+ "description": "SceneContract JSON(可选)"
1618
+ },
1619
+ "channel_id": {
1620
+ "type": "string"
1621
+ },
1622
+ "phase": {
1623
+ "type": "string"
1624
+ },
1625
+ "controls": {
1626
+ "type": "object"
1627
+ },
1628
+ "states": {
1629
+ "type": "object"
1630
+ },
1631
+ "disturbances": {
1632
+ "type": "object"
1633
+ },
1634
+ "samples": {
1635
+ "type": "array",
1636
+ "description": "[{nodeId,at,value,sequence}]"
1637
+ },
1638
+ "now_ms": {
1639
+ "type": "number"
1640
+ }
1641
+ },
1642
+ "required": [
1643
+ "samples",
1644
+ "controls"
1645
+ ]
1646
+ }
1647
+ },
1648
+ {
1649
+ "name": "twin_trial_run",
1650
+ "label": "Twin Virtual Trial",
1651
+ "description": "在隔离模型副本中注入候选控制轨迹,输出全轨迹约束、UQ/OOD 与收益;candidateExecuted=false,不触碰 PLC/DCW。传 model_id 时 rollout 由该训练注册的 hybrid 模型驱动(校准后物理主干+有界残差集成,UQ coverage 来自训练工件),且模型谱系必须与场景 line/product/recipe 一致;不传则用场景物理 provider。",
1652
+ "parameters": {
1653
+ "type": "object",
1654
+ "properties": {
1655
+ "scene_json": {
1656
+ "type": "object"
1657
+ },
1658
+ "snapshot_json": {
1659
+ "type": "object"
1660
+ },
1661
+ "snapshot_id": {
1662
+ "type": "string",
1663
+ "description": "生产 VirtualTrial 使用已持久化 TwinSnapshot id;Hybrid Twin 必填"
1664
+ },
1665
+ "model_id": {
1666
+ "type": "string",
1667
+ "description": "驱动 rollout 的 AML 模型 id(须为 hybrid 模型且与场景同谱系;aml_model_find 可查);缺省=场景物理 provider"
1668
+ },
1669
+ "baseline_controls": {
1670
+ "type": "object"
1671
+ },
1672
+ "candidate_controls": {
1673
+ "type": "array"
1674
+ },
1675
+ "objective": {
1676
+ "type": "object"
1677
+ },
1678
+ "uncertainty": {
1679
+ "type": "object"
1680
+ }
1681
+ },
1682
+ "required": [
1683
+ "snapshot_json",
1684
+ "candidate_controls"
1685
+ ]
1686
+ }
1687
+ },
1688
+ {
1689
+ "name": "mpc_optimize",
1690
+ "label": "MPC Recommendation Only",
1691
+ "description": "先检查冻结 SceneContract、绑定快照、模型门禁;未通过时只生成 safe_small_step 小步参数试探,门禁通过后才允许更精确的候选搜索;始终 recommendation-only。传 model_id 时候选评估由该训练注册的 hybrid 模型 rollout(残差修正+集成 UQ);不传则用场景物理 provider。",
1692
+ "parameters": {
1693
+ "type": "object",
1694
+ "properties": {
1695
+ "scene_json": {
1696
+ "type": "object"
1697
+ },
1698
+ "snapshot_id": {
1699
+ "type": "string",
1700
+ "description": "生产 MPC 使用已持久化 TwinSnapshot id;Hybrid Twin 必填"
1701
+ },
1702
+ "baseline_controls": {
1703
+ "type": "object"
1704
+ },
1705
+ "model_ready": {
1706
+ "type": "boolean"
1707
+ },
1708
+ "horizon_steps": {
1709
+ "type": "number"
1710
+ }
1711
+ },
1712
+ "required": [
1713
+ "baseline_controls"
1714
+ ]
1715
+ }
1716
+ },
1717
+ {
1718
+ "name": "twin_gate_evaluate",
1719
+ "label": "Twin Gate Evaluate",
1720
+ "description": "评估 AML 数据门、物理门、UQ/OOD、VirtualTrial 候选数量和硬约束;零候选/零分母自动拒绝。",
1721
+ "parameters": {
1722
+ "type": "object",
1723
+ "properties": {
1724
+ "rows": {
1725
+ "type": "number"
1726
+ },
1727
+ "runs": {
1728
+ "type": "number"
1729
+ },
1730
+ "one_step_nrmse": {
1731
+ "type": "number"
1732
+ },
1733
+ "rollout_nrmse": {
1734
+ "type": "number"
1735
+ },
1736
+ "val_test_gap": {
1737
+ "type": "number"
1738
+ },
1739
+ "calibration_rows": {
1740
+ "type": "number"
1741
+ },
1742
+ "coverage": {
1743
+ "type": "number"
1744
+ },
1745
+ "physics_failure_rate": {
1746
+ "type": "number"
1747
+ },
1748
+ "candidate_trials": {
1749
+ "type": "array"
1750
+ }
1751
+ },
1752
+ "required": [
1753
+ "rows",
1754
+ "runs",
1755
+ "candidate_trials"
1756
+ ]
1757
+ }
1758
+ },
1759
+ {
1760
+ "name": "twin_calibration_request",
1761
+ "label": "Twin Calibration Request",
1762
+ "description": "按新 DAQ run/rows、漂移或误差阈值登记一次去重的自动校准候选;只进入 AgentTeam 校准队列,不覆盖 production,不写 DCW。",
1763
+ "parameters": {
1764
+ "type": "object",
1765
+ "properties": {
1766
+ "scene_id": {
1767
+ "type": "string"
1768
+ },
1769
+ "line_id": {
1770
+ "type": "string"
1771
+ },
1772
+ "recipe_id": {
1773
+ "type": "string"
1774
+ },
1775
+ "new_runs": {
1776
+ "type": "number"
1777
+ },
1778
+ "new_rows": {
1779
+ "type": "number"
1780
+ },
1781
+ "drift_score": {
1782
+ "type": "number"
1783
+ },
1784
+ "error_score": {
1785
+ "type": "number"
1786
+ },
1787
+ "reason": {
1788
+ "type": "string"
1789
+ }
1790
+ },
1791
+ "required": [
1792
+ "line_id",
1793
+ "new_runs",
1794
+ "new_rows"
1795
+ ]
1796
+ }
1797
+ },
1798
+ {
1799
+ "name": "optimization_explore",
1800
+ "label": "Optimization Explore Step",
1801
+ "description": "工艺优化探索步(探索模式核心):按 goal 与指定方向/步长生成激励值,经数控下发治理链(绑定鉴权/HITL/写限界)真实写入产线,等待工艺响应后读回目标量均值,并把【写入值↔响应值】配对落库为探索记录(训练数据回流的事实源)。步长缺省取绑定 tuning.step 或场景调试跨度;方向 up/down 由你依据节点物理意义判断。多轮迭代以积累「参数波动↔目标响应」数据,供 AML 修正训练与后续模型寻优。",
1802
+ "parameters": {
1803
+ "type": "object",
1804
+ "properties": {
1805
+ "control_node_id": {
1806
+ "type": "string",
1807
+ "description": "数控节点 id(缺省=第一个数控绑定)"
1808
+ },
1809
+ "target_node_id": {
1810
+ "type": "string",
1811
+ "description": "目标观测节点 id(缺省=第一个数采绑定)"
1812
+ },
1813
+ "direction": {
1814
+ "type": "string",
1815
+ "enum": [
1816
+ "up",
1817
+ "down"
1818
+ ],
1819
+ "description": "激励方向(依据节点物理意义与 goal 偏差判断)"
1820
+ },
1821
+ "step": {
1822
+ "type": "number",
1823
+ "description": "激励步长(缺省=绑定 tuning.step 或场景 maxStep)"
1824
+ },
1825
+ "settle_seconds": {
1826
+ "type": "number",
1827
+ "description": "写入后等待工艺响应的秒数(10~300,缺省 45)"
1828
+ },
1829
+ "hypothesis": {
1830
+ "type": "string",
1831
+ "description": "本次探索假设(入册追溯)"
1832
+ }
1833
+ }
1834
+ }
1835
+ },
1836
+ {
1837
+ "name": "twin_bayes_optimize",
1838
+ "label": "Twin Bayesian Optimize",
1839
+ "description": "AML 模式贝叶斯寻优(须已绑定通过门禁的 AML 模型):以绑定模型 rollout 为代理,围绕当前最优邻域多轮生成候选,UCB(μ-κ·σ)权衡利用与探索,产出收敛轨迹与最终受治理推荐(recommendation-only,写入须审批)。快照/绑定校验与 mpc_optimize 同源。",
1840
+ "parameters": {
1841
+ "type": "object",
1842
+ "properties": {
1843
+ "scene_json": {
1844
+ "type": "object"
1845
+ },
1846
+ "snapshot_id": {
1847
+ "type": "string",
1848
+ "description": "已持久化 TwinSnapshot id(必填,requireFresh)"
1849
+ },
1850
+ "baseline_controls": {
1851
+ "type": "object"
1852
+ },
1853
+ "objective": {
1854
+ "type": "object",
1855
+ "description": "ObjectiveProfile(缺省=Channel goal)"
1856
+ },
1857
+ "rounds": {
1858
+ "type": "number",
1859
+ "description": "搜索轮数(1~10,缺省 4)"
1860
+ },
1861
+ "candidates_per_round": {
1862
+ "type": "number",
1863
+ "description": "每轮候选数(2~20,缺省 6)"
1864
+ },
1865
+ "kappa": {
1866
+ "type": "number",
1867
+ "description": "UCB 探索系数(缺省 1.96)"
1868
+ },
1869
+ "horizon_steps": {
1870
+ "type": "number",
1871
+ "description": "rollout 步数(缺省 4)"
1872
+ }
1873
+ },
1874
+ "required": [
1875
+ "snapshot_id",
1876
+ "baseline_controls"
1877
+ ]
1878
+ }
1879
+ },
1880
+ {
1881
+ "name": "aml_training_plan_list",
1882
+ "label": "AML Training Plan List",
1883
+ "description": "建模任务清单(解耦编排面):列出全部建模任务的谱系绑定/策略(auto=新批次自动修正训练)/状态/最新模型与 spec 固化情况。",
1884
+ "parameters": {
1885
+ "type": "object",
1886
+ "properties": {}
1887
+ }
1888
+ },
1889
+ {
1890
+ "name": "aml_training_plan_create",
1891
+ "label": "AML Training Plan Create",
1892
+ "description": "创建建模任务(绑定产线/产品/配方三元组 + 数据集 IO 契约:control=DCW 输入,target=DAQ 输出 + 固化训练 spec)。auto 策略的任务在新批次(含工艺优化 Channel 的探索数据)到达时由平台自动修正训练;模型入册后可在 AML 界面绑定到工艺优化 Channel。",
1893
+ "parameters": {
1894
+ "type": "object",
1895
+ "properties": {
1896
+ "name": {
1897
+ "type": "string"
1898
+ },
1899
+ "line_id": {
1900
+ "type": "string"
1901
+ },
1902
+ "product_id": {
1903
+ "type": "string"
1904
+ },
1905
+ "recipe_id": {
1906
+ "type": "string"
1907
+ },
1908
+ "scene_id": {
1909
+ "type": "string"
1910
+ },
1911
+ "scene_version": {
1912
+ "type": "string"
1913
+ },
1914
+ "objective_id": {
1915
+ "type": "string"
1916
+ },
1917
+ "strategy": {
1918
+ "type": "string",
1919
+ "enum": [
1920
+ "auto",
1921
+ "manual"
1922
+ ]
1923
+ },
1924
+ "dataset_spec": {
1925
+ "type": "object",
1926
+ "description": "AmlDatasetSpec 完整契约"
1927
+ },
1928
+ "training_spec": {
1929
+ "type": "object",
1930
+ "description": "固化的 PhysicsSpec(含 modelId;来自 twin_physics_spec_draft/compile 流程)"
1931
+ },
1932
+ "model_name_prefix": {
1933
+ "type": "string"
1934
+ },
1935
+ "params": {
1936
+ "type": "object"
1937
+ },
1938
+ "seed": {
1939
+ "type": "number"
1940
+ },
1941
+ "min_interval_sec": {
1942
+ "type": "number"
1943
+ }
1944
+ },
1945
+ "required": [
1946
+ "line_id",
1947
+ "product_id",
1948
+ "recipe_id",
1949
+ "dataset_spec"
1950
+ ]
1951
+ }
1952
+ },
1953
+ {
1954
+ "name": "aml_training_plan_train",
1955
+ "label": "AML Training Plan Train",
1956
+ "description": "立即触发建模任务的修正训练:重建数据集(历史+新批次)→ 平台参考训练器 → 门禁 → 模型入册;plan 状态回写,AML 界面可渲染。",
1957
+ "parameters": {
1958
+ "type": "object",
1959
+ "properties": {
1960
+ "plan_id": {
1961
+ "type": "string",
1962
+ "description": "建模任务 id"
1963
+ }
1964
+ },
1965
+ "required": [
1966
+ "plan_id"
1967
+ ]
1968
+ }
1969
+ },
1970
+ {
1971
+ "name": "team_grant_nodes",
1972
+ "label": "Grant Nodes",
1973
+ "description": "(Lead only) Grant industrial node permissions (DAQ read / DCW control) to a worker in this channel. HARD RULE: every node must already be bound to YOU (the lead) — you cannot grant permissions beyond your own bindings. Grants are all-or-nothing: if any node is not in your binding surface, the whole request is rejected and nothing is granted. Use this before dispatching (so the worker can act immediately) or mid-execution when scope expands. The worker sees granted nodes via my_industrial_nodes. To grant together with a task, prefer dispatch_task(grant_node_ids=[...]).",
1974
+ "parameters": {
1975
+ "type": "object",
1976
+ "properties": {
1977
+ "agent_id": {
1978
+ "type": "string",
1979
+ "description": "Worker member instance id in this channel"
1980
+ },
1981
+ "node_ids": {
1982
+ "type": "array",
1983
+ "items": {
1984
+ "type": "string"
1985
+ },
1986
+ "description": "Node ids to grant (DAQ and/or DCW nodes; must all be bound to you, the lead)"
1987
+ },
1988
+ "mode": {
1989
+ "type": "string",
1990
+ "enum": [
1991
+ "auto",
1992
+ "manual"
1993
+ ],
1994
+ "description": "Optional binding mode for the granted nodes; default = the mode of YOUR own binding for that node (manual = every write needs user approval)"
1995
+ }
1996
+ },
1997
+ "required": [
1998
+ "agent_id",
1999
+ "node_ids"
2000
+ ]
2001
+ }
2002
+ },
2003
+ {
2004
+ "name": "team_revoke_nodes",
2005
+ "label": "Revoke Nodes",
2006
+ "description": "(Lead only) Take back node permissions previously granted to a worker in this channel. You can revoke bindings you granted, or bindings for nodes you hold yourself; other bindings are reported as not revoked. Use when a task closes or scope narrows.",
2007
+ "parameters": {
2008
+ "type": "object",
2009
+ "properties": {
2010
+ "agent_id": {
2011
+ "type": "string",
2012
+ "description": "Worker member instance id in this channel"
2013
+ },
2014
+ "node_ids": {
2015
+ "type": "array",
2016
+ "items": {
2017
+ "type": "string"
2018
+ },
2019
+ "description": "Node ids to revoke from this worker"
2020
+ }
2021
+ },
2022
+ "required": [
2023
+ "agent_id",
2024
+ "node_ids"
2025
+ ]
2026
+ }
2027
+ }
2028
+ ]