agentworkshop 0.7.52 → 0.7.53

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 (459) hide show
  1. package/.AgentWorkShop/prompts/host-tools.json +70 -1
  2. package/.output/.AgentWorkShop/prompts/host-tools.json +70 -1
  3. package/.output/.AgentWorkShop/schema.json +2 -0
  4. package/.output/nitro.json +1 -1
  5. package/.output/public/_nuxt/{D0ldVwl-.js → 77DRSnQv.js} +1 -1
  6. package/.output/public/_nuxt/8oRmGaAV.js +1 -0
  7. package/.output/public/_nuxt/{BPou3U7b.js → BLnLjzka.js} +1 -1
  8. package/.output/public/_nuxt/{CFQyYMEn2.js → BSdJTnk12.js} +1 -1
  9. package/.output/public/_nuxt/{C4lagVdN2.js → BUD1CNvB2.js} +1 -1
  10. package/.output/public/_nuxt/{CTvh8v4T.js → BXR3tgEk.js} +1 -1
  11. package/.output/public/_nuxt/{Cbeifv55.js → BhlRInVa.js} +1 -1
  12. package/.output/public/_nuxt/{mNnuUoSy.js → BkfA3BbD.js} +1 -1
  13. package/.output/public/_nuxt/{ChGuLxwW2.js → BpcQDwKM2.js} +1 -1
  14. package/.output/public/_nuxt/{DQMbdg4t.js → BwlGxRxA.js} +1 -1
  15. package/.output/public/_nuxt/{Bt2ZL5332.js → C4sQKuhk2.js} +1 -1
  16. package/.output/public/_nuxt/{CkPxL4UX2.js → CBUIODly2.js} +1 -1
  17. package/.output/public/_nuxt/CR-ILcRu2.js +1 -0
  18. package/.output/public/_nuxt/CZLnEnbE.js +14 -0
  19. package/.output/public/_nuxt/{qPsch_ny2.js → Chxx-DIE2.js} +1 -1
  20. package/.output/public/_nuxt/{BiUhxH3t2.js → CjwxhpwR2.js} +1 -1
  21. package/.output/public/_nuxt/{B9cGf8mg.js → CvGYm7w8.js} +1 -1
  22. package/.output/public/_nuxt/{B9BmiUil.js → DAGuPgXa.js} +1 -1
  23. package/.output/public/_nuxt/{DefDtlKK.js → DE6H1HdJ.js} +1 -1
  24. package/.output/public/_nuxt/{D_Ce9Fon2.js → DFhyhDGa2.js} +1 -1
  25. package/.output/public/_nuxt/{BXx9AxdF2.js → DSqMyLCV2.js} +1 -1
  26. package/.output/public/_nuxt/{B8zP7kaj2.js → DV5joWTn2.js} +1 -1
  27. package/.output/public/_nuxt/{Da90gveK.js → DVOR2pWg.js} +1 -1
  28. package/.output/public/_nuxt/DWsgRq2c.js +1 -0
  29. package/.output/public/_nuxt/{mgWHSRc8.js → DZDi8inD.js} +1 -1
  30. package/.output/public/_nuxt/{xQX5r6tW.js → Dep0Hc9w.js} +1 -1
  31. package/.output/public/_nuxt/{evt5VGDh.js → DffgG8vT.js} +1 -1
  32. package/.output/public/_nuxt/{B_opxrHJ.js → DlCktWDT.js} +1 -1
  33. package/.output/public/_nuxt/{BVzw5a_0.js → DmzmgYHb.js} +1 -1
  34. package/.output/public/_nuxt/PluginSlot.CGH0vb95.css +1 -0
  35. package/.output/public/_nuxt/{ty5W5QwO.js → WmMwIS4y.js} +1 -1
  36. package/.output/public/_nuxt/{_id_.DamiFT0Q.css → _id_.rdGx-UDx.css} +1 -1
  37. package/.output/public/_nuxt/{BgEDwFMf.js → _kUzq9VF.js} +1 -1
  38. package/.output/public/_nuxt/_wsId_.XjmieZaJ.css +1 -0
  39. package/.output/public/_nuxt/{C00Rd6Cg.js → aV6YPjg0.js} +1 -1
  40. package/.output/public/_nuxt/builds/latest.json +1 -1
  41. package/.output/public/_nuxt/builds/meta/5ccc21c2-aba0-4b63-9a13-410e0569e345.json +1 -0
  42. package/.output/public/_nuxt/{default.CXb_zoN6.css → default.CyLpQD1C.css} +1 -1
  43. package/.output/public/_nuxt/o9rJf00k.js +1 -0
  44. package/.output/public/_nuxt/sl1EEoCr2.js +21 -0
  45. package/.output/public/robots.txt +3 -0
  46. package/.output/server/chunks/_/binding-authz.mjs +1 -1
  47. package/.output/server/chunks/_/character-asset.repo.mjs +1 -1
  48. package/.output/server/chunks/_/entity.mjs +1 -1
  49. package/.output/server/chunks/_/host-bindings.mjs +1 -1
  50. package/.output/server/chunks/_/nitro.mjs +1945 -1420
  51. package/.output/server/chunks/_/nitro.mjs.map +1 -1
  52. package/.output/server/chunks/_/scene-layout.repo.mjs +1 -1
  53. package/.output/server/chunks/build/{PluginSlot-D2WUZgbp.mjs → PluginSlot-CT4YaNrB.mjs} +5 -5
  54. package/.output/server/chunks/build/{PluginSlot-D2WUZgbp.mjs.map → PluginSlot-CT4YaNrB.mjs.map} +1 -1
  55. package/.output/server/chunks/build/TownView-fP9BiALv.mjs +1 -1
  56. package/.output/server/chunks/build/{_id_-BUpQSlzo.mjs → _id_-CK-QFrDV.mjs} +55 -51
  57. package/.output/server/chunks/build/_id_-CK-QFrDV.mjs.map +1 -0
  58. package/.output/server/chunks/build/{_wsId_-C4L9fVHC.mjs → _wsId_-DdqXzycE.mjs} +320 -202
  59. package/.output/server/chunks/build/{_wsId_-C4L9fVHC.mjs.map → _wsId_-DdqXzycE.mjs.map} +1 -1
  60. package/.output/server/chunks/build/{agents-ydYu-Ol9.mjs → agents-DqICy4AL.mjs} +6 -6
  61. package/.output/server/chunks/build/{agents-ydYu-Ol9.mjs.map → agents-DqICy4AL.mjs.map} +1 -1
  62. package/.output/server/chunks/build/{channel-templates-DP1ndA5K.mjs → channel-templates-gdCLajKy.mjs} +2 -2
  63. package/.output/server/chunks/build/{channel-templates-DP1ndA5K.mjs.map → channel-templates-gdCLajKy.mjs.map} +1 -1
  64. package/.output/server/chunks/build/daq-N69AOtgw.mjs +1 -1
  65. package/.output/server/chunks/build/dcw-CN9d3Rs7.mjs +1 -1
  66. package/.output/server/chunks/build/{default-DCf9tn1i.mjs → default-CXUe4HL7.mjs} +65 -62
  67. package/.output/server/chunks/build/{default-DCf9tn1i.mjs.map → default-CXUe4HL7.mjs.map} +1 -1
  68. package/.output/server/chunks/build/{pages-BzmrmLL_.mjs → pages-CRMeXrxG.mjs} +3 -3
  69. package/.output/server/chunks/build/{pages-BzmrmLL_.mjs.map → pages-CRMeXrxG.mjs.map} +1 -1
  70. package/.output/server/chunks/build/{plugins-DSka7-vS.mjs → plugins-NAS9MQ5r.mjs} +2 -2
  71. package/.output/server/chunks/build/{plugins-DSka7-vS.mjs.map → plugins-NAS9MQ5r.mjs.map} +1 -1
  72. package/.output/server/chunks/build/{schedules-BYR-lA1k.mjs → schedules-D8vYHgQ5.mjs} +2 -2
  73. package/.output/server/chunks/build/{schedules-BYR-lA1k.mjs.map → schedules-D8vYHgQ5.mjs.map} +1 -1
  74. package/.output/server/chunks/build/{settings-UyZ78w2e.mjs → settings-B7HA-sdb.mjs} +3 -3
  75. package/.output/server/chunks/build/{settings-UyZ78w2e.mjs.map → settings-B7HA-sdb.mjs.map} +1 -1
  76. package/.output/server/chunks/build/{teams-D-Y5mzU7.mjs → teams-wM-MdLv9.mjs} +8 -8
  77. package/.output/server/chunks/build/{teams-D-Y5mzU7.mjs.map → teams-wM-MdLv9.mjs.map} +1 -1
  78. package/.output/server/chunks/build/types-D6J7slEa.mjs +1 -1
  79. package/.output/server/chunks/build/{useAgentHarnessOptions-CRyQYYY0.mjs → useAgentHarnessOptions-BnFCh23W.mjs} +2 -2
  80. package/.output/server/chunks/build/{useAgentHarnessOptions-CRyQYYY0.mjs.map → useAgentHarnessOptions-BnFCh23W.mjs.map} +1 -1
  81. package/.output/server/chunks/build/{useAgentTemplateActions-CaRsOBmB.mjs → useAgentTemplateActions-DsBRUQni.mjs} +2 -2
  82. package/.output/server/chunks/build/{useAgentTemplateActions-CaRsOBmB.mjs.map → useAgentTemplateActions-DsBRUQni.mjs.map} +1 -1
  83. package/.output/server/chunks/build/{useAgentTemplateForm-ChiIuPYr.mjs → useAgentTemplateForm-DzQ_t2Ue.mjs} +2 -2
  84. package/.output/server/chunks/build/{useAgentTemplateForm-ChiIuPYr.mjs.map → useAgentTemplateForm-DzQ_t2Ue.mjs.map} +1 -1
  85. package/.output/server/chunks/build/{useAgentTemplatesCatalog-Bf5hk6Jf.mjs → useAgentTemplatesCatalog-Q7LgG1Af.mjs} +2 -2
  86. package/.output/server/chunks/build/{useAgentTemplatesCatalog-Bf5hk6Jf.mjs.map → useAgentTemplatesCatalog-Q7LgG1Af.mjs.map} +1 -1
  87. package/.output/server/chunks/build/useDaqAddNode-kW7uTSMQ.mjs +1 -1
  88. package/.output/server/chunks/build/useDaqDetailNode-D_vhG0jF.mjs +1 -1
  89. package/.output/server/chunks/build/useDaqDetailParams-JfqHvTxr.mjs +1 -1
  90. package/.output/server/chunks/build/useDaqFilters-BUQtZ82a.mjs +1 -1
  91. package/.output/server/chunks/build/useDaqStream-wOxZcMDA.mjs +1 -1
  92. package/.output/server/chunks/build/useDaqTemplates-BqQRdrIm.mjs +1 -1
  93. package/.output/server/chunks/build/{useDashboardData-CNOY4Bi3.mjs → useDashboardData-DWJ6vHjm.mjs} +2 -2
  94. package/.output/server/chunks/build/{useDashboardData-CNOY4Bi3.mjs.map → useDashboardData-DWJ6vHjm.mjs.map} +1 -1
  95. package/.output/server/chunks/build/useDcwAddNode-C1HDP3yG.mjs +1 -1
  96. package/.output/server/chunks/build/useDcwStream-D04kCV3J.mjs +1 -1
  97. package/.output/server/chunks/build/{useTeamActions-C51ciLb0.mjs → useTeamActions-BOLQkYxg.mjs} +2 -2
  98. package/.output/server/chunks/build/{useTeamActions-C51ciLb0.mjs.map → useTeamActions-BOLQkYxg.mjs.map} +1 -1
  99. package/.output/server/chunks/build/{useTeamAddMemberDialog-DthpCMP8.mjs → useTeamAddMemberDialog-BCgrLPxI.mjs} +2 -2
  100. package/.output/server/chunks/build/{useTeamAddMemberDialog-DthpCMP8.mjs.map → useTeamAddMemberDialog-BCgrLPxI.mjs.map} +1 -1
  101. package/.output/server/chunks/build/{useTeamCreateDialog-Dc2KTwyg.mjs → useTeamCreateDialog-CJk40LqS.mjs} +2 -2
  102. package/.output/server/chunks/build/{useTeamCreateDialog-Dc2KTwyg.mjs.map → useTeamCreateDialog-CJk40LqS.mjs.map} +1 -1
  103. package/.output/server/chunks/build/{useTeamDeployDialog-CXpvPnJD.mjs → useTeamDeployDialog-49hdUXQP.mjs} +2 -2
  104. package/.output/server/chunks/build/{useTeamDeployDialog-CXpvPnJD.mjs.map → useTeamDeployDialog-49hdUXQP.mjs.map} +1 -1
  105. package/.output/server/chunks/build/{useTeamPluginDialog-DTs-7SSm.mjs → useTeamPluginDialog-Dh-QOoiU.mjs} +2 -2
  106. package/.output/server/chunks/build/{useTeamPluginDialog-DTs-7SSm.mjs.map → useTeamPluginDialog-Dh-QOoiU.mjs.map} +1 -1
  107. package/.output/server/chunks/build/{useTeamsCatalog-CcpetYyW.mjs → useTeamsCatalog-HBSyKt5P.mjs} +2 -2
  108. package/.output/server/chunks/build/{useTeamsCatalog-CcpetYyW.mjs.map → useTeamsCatalog-HBSyKt5P.mjs.map} +1 -1
  109. package/.output/server/chunks/build/{useWorkshopApi-CO3ophqt.mjs → useWorkshopApi-C9sTYu1F.mjs} +9 -1
  110. package/.output/server/chunks/build/useWorkshopApi-C9sTYu1F.mjs.map +1 -0
  111. package/.output/server/chunks/build/useWorkshopWs-Bm80bLn7.mjs.map +1 -1
  112. package/.output/server/chunks/routes/api/index.get.mjs +1 -1
  113. package/.output/server/chunks/routes/api/index.post.mjs +14 -3
  114. package/.output/server/chunks/routes/api/index.post.mjs.map +1 -1
  115. package/.output/server/chunks/routes/api/mcp/workshop.mjs +43 -14
  116. package/.output/server/chunks/routes/api/mcp/workshop.mjs.map +1 -1
  117. package/.output/server/chunks/routes/api/metrics.mjs +2 -0
  118. package/.output/server/chunks/routes/api/metrics.mjs.map +1 -1
  119. package/.output/server/chunks/routes/api/plugins/_name/_...path_.mjs +1 -1
  120. package/.output/server/chunks/routes/api/plugins/_name/_...path_.mjs.map +1 -1
  121. package/.output/server/chunks/routes/api/system/backup/list.get.mjs +47 -0
  122. package/.output/server/chunks/routes/api/system/backup/list.get.mjs.map +1 -0
  123. package/.output/server/chunks/routes/api/system/backup/run.post.mjs +35 -0
  124. package/.output/server/chunks/routes/api/system/backup/run.post.mjs.map +1 -0
  125. package/.output/server/chunks/routes/api/system/config-groups/_id_.delete.mjs +1 -1
  126. package/.output/server/chunks/routes/api/system/config-groups/_id_.patch.mjs +1 -1
  127. package/.output/server/chunks/routes/api/system/index.get.mjs +1 -1
  128. package/.output/server/chunks/routes/api/system/index.patch.mjs +15 -4
  129. package/.output/server/chunks/routes/api/system/index.patch.mjs.map +1 -1
  130. package/.output/server/chunks/routes/api/system/index.post.mjs +1 -1
  131. package/.output/server/chunks/routes/api/system/index2.get.mjs +1 -1
  132. package/.output/server/chunks/routes/api/system/monitor/terminal/ws.mjs +1 -1
  133. package/.output/server/chunks/routes/api/system/monitor/terminate.post.mjs +1 -1
  134. package/.output/server/chunks/routes/api/system/settings/events.get.mjs +1 -1
  135. package/.output/server/chunks/routes/api/system/settings/reset.post.mjs +15 -3
  136. package/.output/server/chunks/routes/api/system/settings/reset.post.mjs.map +1 -1
  137. package/.output/server/chunks/routes/api/system/timezone.get.mjs +1 -1
  138. package/.output/server/chunks/routes/api/users/_id_.delete.mjs +14 -3
  139. package/.output/server/chunks/routes/api/users/_id_.delete.mjs.map +1 -1
  140. package/.output/server/chunks/routes/api/users/_id_.get.mjs +1 -1
  141. package/.output/server/chunks/routes/api/users/_id_.put.mjs +14 -3
  142. package/.output/server/chunks/routes/api/users/_id_.put.mjs.map +1 -1
  143. package/.output/server/chunks/routes/api/users/index.get.mjs +1 -1
  144. package/.output/server/chunks/routes/api/users/index.post.mjs +1 -1
  145. package/.output/server/chunks/routes/api/users/login.post.mjs +3 -2
  146. package/.output/server/chunks/routes/api/users/login.post.mjs.map +1 -1
  147. package/.output/server/chunks/routes/api/users/logout.post.mjs +1 -1
  148. package/.output/server/chunks/routes/api/users/me.get.mjs +1 -1
  149. package/.output/server/chunks/routes/api/users/register.post.mjs +4 -1
  150. package/.output/server/chunks/routes/api/users/register.post.mjs.map +1 -1
  151. package/.output/server/chunks/routes/api/users/setup-status.get.mjs +1 -1
  152. package/.output/server/chunks/routes/api/users/tokens/_id/token.get.mjs +1 -1
  153. package/.output/server/chunks/routes/api/users/tokens/_id_.delete.mjs +1 -1
  154. package/.output/server/chunks/routes/api/users/tokens/_id_.patch.mjs +1 -1
  155. package/.output/server/chunks/routes/api/workshop/a2a/_agentId/index.get.mjs +1 -1
  156. package/.output/server/chunks/routes/api/workshop/a2a/_agentId/index.post.mjs +19 -15
  157. package/.output/server/chunks/routes/api/workshop/a2a/_agentId/index.post.mjs.map +1 -1
  158. package/.output/server/chunks/routes/api/workshop/a2a/send.post.mjs +1 -1
  159. package/.output/server/chunks/routes/api/workshop/agent-tools/approvals/_id/decide.post.mjs +1 -1
  160. package/.output/server/chunks/routes/api/workshop/agent-tools/bindings/_id_.delete.mjs +1 -1
  161. package/.output/server/chunks/routes/api/workshop/agent-tools/bindings/_id_.patch.mjs +1 -1
  162. package/.output/server/chunks/routes/api/workshop/agent-tools/bindings/grant.post.mjs +1 -1
  163. package/.output/server/chunks/routes/api/workshop/agent-tools/bindings/revoke.post.mjs +1 -1
  164. package/.output/server/chunks/routes/api/workshop/agent-tools/index.get.mjs +1 -1
  165. package/.output/server/chunks/routes/api/workshop/agent-tools/index.post.mjs +1 -1
  166. package/.output/server/chunks/routes/api/workshop/agent-tools/index2.get.mjs +1 -1
  167. package/.output/server/chunks/routes/api/workshop/agent-tools/invoke.post.mjs +1 -1
  168. package/.output/server/chunks/routes/api/workshop/agent-tools/list.get.mjs +1 -1
  169. package/.output/server/chunks/routes/api/workshop/agents/_id_.patch.mjs +1 -1
  170. package/.output/server/chunks/routes/api/workshop/agents/subscribe.post.mjs +1 -1
  171. package/.output/server/chunks/routes/api/workshop/aml/datasets/_id/preview.get.mjs +1 -1
  172. package/.output/server/chunks/routes/api/workshop/aml/datasets/_id_.delete.mjs +1 -1
  173. package/.output/server/chunks/routes/api/workshop/aml/datasets/_id_.get.mjs +1 -1
  174. package/.output/server/chunks/routes/api/workshop/aml/datasets/_id_.patch.mjs +1 -1
  175. package/.output/server/chunks/routes/api/workshop/aml/entities/prune.post.mjs +1 -1
  176. package/.output/server/chunks/routes/api/workshop/aml/env/recheck.post.mjs +1 -1
  177. package/.output/server/chunks/routes/api/workshop/aml/env/uv.post.mjs +1 -1
  178. package/.output/server/chunks/routes/api/workshop/aml/env/venv.post.mjs +1 -1
  179. package/.output/server/chunks/routes/api/workshop/aml/index.get.mjs +1 -1
  180. package/.output/server/chunks/routes/api/workshop/aml/index.post.mjs +1 -1
  181. package/.output/server/chunks/routes/api/workshop/aml/index2.post.mjs +1 -1
  182. package/.output/server/chunks/routes/api/workshop/aml/index3.get.mjs +1 -1
  183. package/.output/server/chunks/routes/api/workshop/aml/index3.post.mjs +1 -1
  184. package/.output/server/chunks/routes/api/workshop/aml/index4.get.mjs +1 -1
  185. package/.output/server/chunks/routes/api/workshop/aml/index5.get.mjs +1 -1
  186. package/.output/server/chunks/routes/api/workshop/aml/index6.get.mjs +1 -1
  187. package/.output/server/chunks/routes/api/workshop/aml/index7.get.mjs +1 -1
  188. package/.output/server/chunks/routes/api/workshop/aml/jobs/_id/cancel.post.mjs +1 -1
  189. package/.output/server/chunks/routes/api/workshop/aml/jobs/_id/logs.get.mjs +1 -1
  190. package/.output/server/chunks/routes/api/workshop/aml/jobs/_id/retry.post.mjs +1 -1
  191. package/.output/server/chunks/routes/api/workshop/aml/jobs/_id_.delete.mjs +1 -1
  192. package/.output/server/chunks/routes/api/workshop/aml/jobs/_id_.get.mjs +1 -1
  193. package/.output/server/chunks/routes/api/workshop/aml/models/_id/predict.post.mjs +1 -1
  194. package/.output/server/chunks/routes/api/workshop/aml/models/_id/promote.post.mjs +1 -1
  195. package/.output/server/chunks/routes/api/workshop/aml/models/_id_.delete.mjs +1 -1
  196. package/.output/server/chunks/routes/api/workshop/aml/models/_id_.patch.mjs +1 -1
  197. package/.output/server/chunks/routes/api/workshop/aml/training-plans/_id/train.post.mjs +1 -1
  198. package/.output/server/chunks/routes/api/workshop/aml/training-plans/_id_.delete.mjs +1 -1
  199. package/.output/server/chunks/routes/api/workshop/aml/training-plans/_id_.patch.mjs +1 -1
  200. package/.output/server/chunks/routes/api/workshop/aml/twin/providers.get.mjs +1 -1
  201. package/.output/server/chunks/routes/api/workshop/approvals/_id/decide.post.mjs +1 -1
  202. package/.output/server/chunks/routes/api/workshop/assets/index.get.mjs +1 -1
  203. package/.output/server/chunks/routes/api/workshop/assets/index.post.mjs +1 -1
  204. package/.output/server/chunks/routes/api/workshop/assets/index2.post.mjs +1 -1
  205. package/.output/server/chunks/routes/api/workshop/audit.get.mjs +1 -1
  206. package/.output/server/chunks/routes/api/workshop/caller.mjs +1 -1
  207. package/.output/server/chunks/routes/api/workshop/channel-templates/_id/instantiate.post.mjs +8 -3
  208. package/.output/server/chunks/routes/api/workshop/channel-templates/_id/instantiate.post.mjs.map +1 -1
  209. package/.output/server/chunks/routes/api/workshop/channel-templates/_id_.patch.mjs +1 -1
  210. package/.output/server/chunks/routes/api/workshop/channel-templates/from-channel.post.mjs +1 -1
  211. package/.output/server/chunks/routes/api/workshop/channels/_id/activate.post.mjs +1 -1
  212. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/index.post.mjs +1 -1
  213. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/memories/search.post.mjs +1 -1
  214. package/.output/server/chunks/routes/api/workshop/channels/_id/chat/index.get.mjs +1 -1
  215. package/.output/server/chunks/routes/api/workshop/channels/_id/chat/index.post.mjs +1 -1
  216. package/.output/server/chunks/routes/api/workshop/channels/_id/events.get.mjs +1 -1
  217. package/.output/server/chunks/routes/api/workshop/channels/_id/index.post.mjs +1 -1
  218. package/.output/server/chunks/routes/api/workshop/channels/_id/index.put.mjs +1 -1
  219. package/.output/server/chunks/routes/api/workshop/channels/_id/index2.post.mjs +1 -1
  220. package/.output/server/chunks/routes/api/workshop/channels/_id/index3.post.mjs +1 -1
  221. package/.output/server/chunks/routes/api/workshop/channels/_id/index4.get.mjs +1 -1
  222. package/.output/server/chunks/routes/api/workshop/channels/_id/index4.post.mjs +1 -1
  223. package/.output/server/chunks/routes/api/workshop/channels/_id/index5.get.mjs +1 -1
  224. package/.output/server/chunks/routes/api/workshop/channels/_id/line.put.mjs +37 -0
  225. package/.output/server/chunks/routes/api/workshop/channels/_id/line.put.mjs.map +1 -0
  226. package/.output/server/chunks/routes/api/workshop/channels/_id/terminals.get.mjs +1 -1
  227. package/.output/server/chunks/routes/api/workshop/channels/_id/twin-profile.get.mjs +1 -1
  228. package/.output/server/chunks/routes/api/workshop/channels/_id/twin-profile.patch.mjs +1 -1
  229. package/.output/server/chunks/routes/api/workshop/channels/index.get.mjs +1 -1
  230. package/.output/server/chunks/routes/api/workshop/channels/index.patch.mjs +1 -1
  231. package/.output/server/chunks/routes/api/workshop/channels.post.mjs +4 -4
  232. package/.output/server/chunks/routes/api/workshop/daq/_id/bind.post.mjs +1 -1
  233. package/.output/server/chunks/routes/api/workshop/daq/_id/bindings.put.mjs +1 -1
  234. package/.output/server/chunks/routes/api/workshop/daq/_id/frames/content.get.mjs +1 -1
  235. package/.output/server/chunks/routes/api/workshop/daq/_id/frames.get.mjs +1 -1
  236. package/.output/server/chunks/routes/api/workshop/daq/_id/samples.get.mjs +1 -1
  237. package/.output/server/chunks/routes/api/workshop/daq/_id/test.post.mjs +1 -1
  238. package/.output/server/chunks/routes/api/workshop/daq/_id_.delete.mjs +1 -1
  239. package/.output/server/chunks/routes/api/workshop/daq/_id_.patch.mjs +1 -1
  240. package/.output/server/chunks/routes/api/workshop/daq/alarms/_id/ack.post.mjs +1 -1
  241. package/.output/server/chunks/routes/api/workshop/daq/alarms.get.mjs +1 -1
  242. package/.output/server/chunks/routes/api/workshop/daq/controller.post.mjs +1 -1
  243. package/.output/server/chunks/routes/api/workshop/daq/index.post.mjs +1 -1
  244. package/.output/server/chunks/routes/api/workshop/daq/infra/reconnect.post.mjs +1 -1
  245. package/.output/server/chunks/routes/api/workshop/daq/infra.get.mjs +1 -1
  246. package/.output/server/chunks/routes/api/workshop/daq/templates/_key_.delete.mjs +1 -1
  247. package/.output/server/chunks/routes/api/workshop/daq/templates/_key_.patch.mjs +1 -1
  248. package/.output/server/chunks/routes/api/workshop/daq/test-driver.post.mjs +1 -1
  249. package/.output/server/chunks/routes/api/workshop/dcw/_id/bind.post.mjs +1 -1
  250. package/.output/server/chunks/routes/api/workshop/dcw/_id/bindings.put.mjs +1 -1
  251. package/.output/server/chunks/routes/api/workshop/dcw/_id/param-ledger.get.mjs +1 -1
  252. package/.output/server/chunks/routes/api/workshop/dcw/_id/read.post.mjs +1 -1
  253. package/.output/server/chunks/routes/api/workshop/dcw/_id/test.post.mjs +1 -1
  254. package/.output/server/chunks/routes/api/workshop/dcw/_id/write.post.mjs +1 -1
  255. package/.output/server/chunks/routes/api/workshop/dcw/_id_.delete.mjs +1 -1
  256. package/.output/server/chunks/routes/api/workshop/dcw/_id_.patch.mjs +1 -1
  257. package/.output/server/chunks/routes/api/workshop/dcw/controller.post.mjs +1 -1
  258. package/.output/server/chunks/routes/api/workshop/dcw/index.get.mjs +1 -1
  259. package/.output/server/chunks/routes/api/workshop/dcw/index.post.mjs +1 -1
  260. package/.output/server/chunks/routes/api/workshop/dcw/index2.get.mjs +1 -1
  261. package/.output/server/chunks/routes/api/workshop/dcw/index2.post.mjs +1 -1
  262. package/.output/server/chunks/routes/api/workshop/dcw/index3.get.mjs +1 -1
  263. package/.output/server/chunks/routes/api/workshop/dcw/index3.post.mjs +1 -1
  264. package/.output/server/chunks/routes/api/workshop/dcw/index4.get.mjs +1 -1
  265. package/.output/server/chunks/routes/api/workshop/dcw/index4.post.mjs +1 -1
  266. package/.output/server/chunks/routes/api/workshop/dcw/index5.get.mjs +1 -1
  267. package/.output/server/chunks/routes/api/workshop/dcw/index5.post.mjs +1 -1
  268. package/.output/server/chunks/routes/api/workshop/dcw/index6.get.mjs +1 -1
  269. package/.output/server/chunks/routes/api/workshop/dcw/journal/node/_nodeId/rollback.post.mjs +1 -1
  270. package/.output/server/chunks/routes/api/workshop/dcw/line/query.get.mjs +6 -1
  271. package/.output/server/chunks/routes/api/workshop/dcw/line/query.get.mjs.map +1 -1
  272. package/.output/server/chunks/routes/api/workshop/dcw/lines/_id/start.post.mjs +1 -1
  273. package/.output/server/chunks/routes/api/workshop/dcw/lines/_id/stop.post.mjs +1 -1
  274. package/.output/server/chunks/routes/api/workshop/dcw/lines/_id_.delete.mjs +1 -1
  275. package/.output/server/chunks/routes/api/workshop/dcw/lines/_id_.patch.mjs +1 -1
  276. package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id/judge.post.mjs +1 -1
  277. package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id/rollback.post.mjs +1 -1
  278. package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id/series.get.mjs +1 -1
  279. package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id_.get.mjs +1 -1
  280. package/.output/server/chunks/routes/api/workshop/dcw/params/_id/read.post.mjs +1 -1
  281. package/.output/server/chunks/routes/api/workshop/dcw/params/_id/write.post.mjs +1 -1
  282. package/.output/server/chunks/routes/api/workshop/dcw/params/_id_.delete.mjs +1 -1
  283. package/.output/server/chunks/routes/api/workshop/dcw/params/_id_.patch.mjs +1 -1
  284. package/.output/server/chunks/routes/api/workshop/dcw/products/_id_.delete.mjs +1 -1
  285. package/.output/server/chunks/routes/api/workshop/dcw/products/_id_.patch.mjs +1 -1
  286. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/apply.post.mjs +1 -1
  287. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/mark-good.post.mjs +1 -1
  288. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/revert.post.mjs +3 -3
  289. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/revert.post.mjs.map +1 -1
  290. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/rollback-good.post.mjs +1 -1
  291. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/versions.get.mjs +1 -1
  292. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id_.delete.mjs +1 -1
  293. package/.output/server/chunks/routes/api/workshop/dcw/recipes/index.patch.mjs +1 -1
  294. package/.output/server/chunks/routes/api/workshop/dcw/runs/_id/close.post.mjs +1 -1
  295. package/.output/server/chunks/routes/api/workshop/dcw/runs/_id/data.get.mjs +1 -1
  296. package/.output/server/chunks/routes/api/workshop/dcw/runs/_id/rollback.post.mjs +1 -1
  297. package/.output/server/chunks/routes/api/workshop/dcw/templates/_key_.delete.mjs +1 -1
  298. package/.output/server/chunks/routes/api/workshop/dcw/templates/_key_.patch.mjs +1 -1
  299. package/.output/server/chunks/routes/api/workshop/dcw/test-driver.post.mjs +1 -1
  300. package/.output/server/chunks/routes/api/workshop/device-twins/_id/control.post.mjs +1 -1
  301. package/.output/server/chunks/routes/api/workshop/device-twins/_id/telemetry.post.mjs +1 -1
  302. package/.output/server/chunks/routes/api/workshop/device-twins/_id_.delete.mjs +1 -1
  303. package/.output/server/chunks/routes/api/workshop/device-twins/_id_.patch.mjs +1 -1
  304. package/.output/server/chunks/routes/api/workshop/fs/dirs.get.mjs +14 -2
  305. package/.output/server/chunks/routes/api/workshop/fs/dirs.get.mjs.map +1 -1
  306. package/.output/server/chunks/routes/api/workshop/harnesses/_id/providers.get.mjs +1 -1
  307. package/.output/server/chunks/routes/api/workshop/harnesses.get.mjs +1 -1
  308. package/.output/server/chunks/routes/api/workshop/hitl/pending.get.mjs +1 -1
  309. package/.output/server/chunks/routes/api/workshop/hitl/respond.post.mjs +1 -1
  310. package/.output/server/chunks/routes/api/workshop/index.post.mjs +1 -1
  311. package/.output/server/chunks/routes/api/workshop/index.put.mjs +1 -1
  312. package/.output/server/chunks/routes/api/workshop/index10.get.mjs +1 -1
  313. package/.output/server/chunks/routes/api/workshop/index2.get.mjs +1 -1
  314. package/.output/server/chunks/routes/api/workshop/index2.post.mjs +1 -1
  315. package/.output/server/chunks/routes/api/workshop/index3.get.mjs +1 -1
  316. package/.output/server/chunks/routes/api/workshop/index3.post.mjs +1 -1
  317. package/.output/server/chunks/routes/api/workshop/index4.post.mjs +1 -1
  318. package/.output/server/chunks/routes/api/workshop/index5.get.mjs +1 -1
  319. package/.output/server/chunks/routes/api/workshop/index5.post.mjs +1 -1
  320. package/.output/server/chunks/routes/api/workshop/index6.get.mjs +1 -1
  321. package/.output/server/chunks/routes/api/workshop/index6.post.mjs +1 -1
  322. package/.output/server/chunks/routes/api/workshop/index7.get.mjs +1 -1
  323. package/.output/server/chunks/routes/api/workshop/index7.post.mjs +1 -1
  324. package/.output/server/chunks/routes/api/workshop/index8.get.mjs +1 -1
  325. package/.output/server/chunks/routes/api/workshop/index8.post.mjs +1 -1
  326. package/.output/server/chunks/routes/api/workshop/index9.get.mjs +3 -3
  327. package/.output/server/chunks/routes/api/workshop/index9.get.mjs.map +1 -1
  328. package/.output/server/chunks/routes/api/workshop/index9.post.mjs +1 -1
  329. package/.output/server/chunks/routes/api/workshop/notifications/read.post.mjs +1 -1
  330. package/.output/server/chunks/routes/api/workshop/plugins/_name/disable.post.mjs +1 -1
  331. package/.output/server/chunks/routes/api/workshop/plugins/_name/enable.post.mjs +1 -1
  332. package/.output/server/chunks/routes/api/workshop/scene/layouts/_channelId_.delete.mjs +1 -1
  333. package/.output/server/chunks/routes/api/workshop/scene/layouts/_channelId_.put.mjs +1 -1
  334. package/.output/server/chunks/routes/api/workshop/schedules/_id/runs.get.mjs +1 -1
  335. package/.output/server/chunks/routes/api/workshop/schedules/_id_.patch.mjs +1 -1
  336. package/.output/server/chunks/routes/api/workshop/tasks/_id/complete.post.mjs +1 -1
  337. package/.output/server/chunks/routes/api/workshop/tasks/_id/dispatch.post.mjs +1 -1
  338. package/.output/server/chunks/routes/api/workshop/tasks/_id/report.post.mjs +1 -1
  339. package/.output/server/chunks/routes/api/workshop/tasks/_id_.get.mjs +1 -1
  340. package/.output/server/chunks/routes/api/workshop/teams/_id/deploy.post.mjs +1 -1
  341. package/.output/server/chunks/routes/api/workshop/teams/_id/index.post.mjs +1 -1
  342. package/.output/server/chunks/routes/api/workshop/teams/_id/index.put.mjs +1 -1
  343. package/.output/server/chunks/routes/api/workshop/teams/_id/index2.get.mjs +1 -1
  344. package/.output/server/chunks/routes/api/workshop/teams/_id_.patch.mjs +1 -1
  345. package/.output/server/chunks/routes/api/workshop/users/register.post.mjs +4 -1
  346. package/.output/server/chunks/routes/api/workshop/users/register.post.mjs.map +1 -1
  347. package/.output/server/chunks/routes/api/workshop/workspaces/_id/channel-templates/_tplId_.post.mjs +2 -2
  348. package/.output/server/chunks/routes/renderer.mjs +2 -2
  349. package/.output/server/chunks/virtual/entry.mjs +340 -52
  350. package/.output/server/chunks/virtual/precomputed.mjs +1 -1
  351. package/.output/server/package.json +1 -1
  352. package/README-zh.md +7 -3
  353. package/README.md +11 -5
  354. package/app/components/app-header/HitlBell.vue +9 -9
  355. package/app/components/dcw/DcwAddNodeModal.vue +3 -3
  356. package/app/components/dcw/DcwNodesTable.vue +4 -4
  357. package/app/components/dcw/DcwRecipeEditModal.vue +2 -2
  358. package/app/components/workshop/ChatMemberPanel.vue +39 -38
  359. package/app/components/workshop/ChatTimeline.vue +33 -24
  360. package/app/components/workshop/Composer.vue +7 -7
  361. package/app/components/workshop/NotificationCenter.vue +22 -13
  362. package/app/components/workshop/PluginSlot.vue +1 -1
  363. package/app/components/workshop/TaskInspectorDrawer.vue +5 -5
  364. package/app/components/workshop/blocks/ClusterTool.vue +1 -1
  365. package/app/components/workshop/composer/ComposerToolbar.vue +2 -2
  366. package/app/components/workshop/composer/MentionMenu.vue +1 -1
  367. package/app/components/workshop/composer/ReplyChip.vue +2 -2
  368. package/app/components/workshop/composer/StatusChip.vue +7 -7
  369. package/app/components/workshop/console/LineOperationsPanel.vue +15 -14
  370. package/app/components/workshop/lanes/LaneHeader.vue +5 -3
  371. package/app/components/workshop/session-list/ChannelSettingsModal.vue +43 -1
  372. package/app/composables/useCodeCopy.ts +16 -2
  373. package/app/composables/workshop/useWorkshopApi.ts +7 -0
  374. package/app/stores/workshop/notifications.ts +43 -17
  375. package/docs/cli.en.md +1 -1
  376. package/i18n/dicts/_en.json +1551 -1557
  377. package/i18n/dicts/_en2.json +300 -300
  378. package/i18n/dicts/_en4.json +114 -115
  379. package/i18n/dicts/agentLanesView.json +61 -57
  380. package/i18n/dicts/appHeader.json +17 -7
  381. package/i18n/dicts/channelSessionList.json +51 -48
  382. package/i18n/dicts/chat.json +79 -0
  383. package/i18n/dicts/clusterTool.json +4 -3
  384. package/i18n/dicts/composer.json +38 -38
  385. package/i18n/dicts/dcwDetail.json +219 -209
  386. package/i18n/dicts/lineOps.json +14 -0
  387. package/i18n/dicts/multiChannelView.json +13 -13
  388. package/i18n/dicts/notifications.json +13 -0
  389. package/i18n/dicts/taskInspectorDrawer.json +25 -19
  390. package/i18n/locales/en.ts +152 -8
  391. package/i18n/locales/zh-CN.ts +152 -8
  392. package/package.json +1 -1
  393. package/public/robots.txt +3 -0
  394. package/server/api/mcp/workshop.ts +8 -1
  395. package/server/api/metrics.ts +4 -1
  396. package/server/api/plugins/[name]/[...path].ts +4 -3
  397. package/server/api/system/backup/list.get.ts +32 -0
  398. package/server/api/system/backup/run.post.ts +21 -0
  399. package/server/api/system/settings/index.patch.ts +12 -2
  400. package/server/api/system/settings/reset.post.ts +11 -2
  401. package/server/api/users/[id].delete.ts +9 -2
  402. package/server/api/users/[id].put.ts +9 -2
  403. package/server/api/users/index.post.ts +9 -2
  404. package/server/api/users/login.post.ts +3 -3
  405. package/server/api/users/register.post.ts +11 -1
  406. package/server/api/workshop/a2a/[agentId]/rpc/index.post.ts +23 -13
  407. package/server/api/workshop/channel-templates/[id]/instantiate.post.ts +6 -0
  408. package/server/api/workshop/channels/[id]/line.put.ts +30 -0
  409. package/server/api/workshop/dcw/line/query.get.ts +6 -0
  410. package/server/api/workshop/dcw/recipes/[id]/revert.post.ts +3 -2
  411. package/server/api/workshop/fs/dirs.get.ts +19 -1
  412. package/server/api/workshop/ops-logs/index.get.ts +3 -2
  413. package/server/api/workshop/users/register.post.ts +7 -0
  414. package/server/mcp/workshop-server.ts +36 -13
  415. package/server/middleware/00-security-headers.ts +38 -0
  416. package/server/middleware/01-rate-guard.ts +101 -0
  417. package/server/plugins/backup.ts +56 -1
  418. package/server/plugins-builtin/diag-bridge/host/plugin.mjs +18 -11
  419. package/server/repositories/user.repository.ts +10 -5
  420. package/server/services/user.service.ts +24 -1
  421. package/server/services/workshop/agents/host-tool-bridge/dispatch.ts +1 -1
  422. package/server/services/workshop/agents/host-tool-bridge/tools/industrial.ts +4 -2
  423. package/server/services/workshop/agents/industrial/index.ts +1 -1
  424. package/server/services/workshop/agents/industrial/ops-tools.ts +168 -26
  425. package/server/services/workshop/agents/tool-classes.ts +2 -0
  426. package/server/services/workshop/aml/dataset-builder.ts +4 -2
  427. package/server/services/workshop/aml/job-orchestrator/process.ts +1 -0
  428. package/server/services/workshop/aml/job-orchestrator/shared.ts +2 -0
  429. package/server/services/workshop/aml/job-orchestrator/start-job.ts +5 -2
  430. package/server/services/workshop/db/channel.repo.ts +11 -1
  431. package/server/services/workshop/db/database/migrations.ts +2 -0
  432. package/server/services/workshop/db/database/rows.ts +2 -0
  433. package/server/services/workshop/db/database/seed.ts +19 -9
  434. package/server/services/workshop/dcw/dcw-controller/recipes.ts +60 -4
  435. package/server/services/workshop/dcw/dcw-controller/write.ts +35 -6
  436. package/server/services/workshop/dcw/dcw-recipe.repo.ts +4 -3
  437. package/server/services/workshop/dcw/param-map.repo.ts +3 -0
  438. package/server/services/workshop/plugins/host/init.mjs +9 -1
  439. package/server/services/workshop/plugins/host/load.mjs +2 -2
  440. package/server/services/workshop/runtime/manager/admin-channel.ts +27 -1
  441. package/server/services/workshop/runtime/manager/channel-templates.ts +5 -4
  442. package/server/services/workshop/runtime/manager/runtime-wiring.ts +17 -1
  443. package/shared/config/schema.json +2 -0
  444. package/.output/public/_nuxt/4wrEQ3np2.js +0 -21
  445. package/.output/public/_nuxt/CGQvF-Gg.js +0 -14
  446. package/.output/public/_nuxt/CcGuXiOa.js +0 -1
  447. package/.output/public/_nuxt/D0SNhlnt.js +0 -1
  448. package/.output/public/_nuxt/DnH9SRMW2.js +0 -1
  449. package/.output/public/_nuxt/ON2x-t6n.js +0 -1
  450. package/.output/public/_nuxt/PluginSlot.DmjNbrcX.css +0 -1
  451. package/.output/public/_nuxt/_wsId_.DkrQkT6r.css +0 -1
  452. package/.output/public/_nuxt/builds/meta/c64014ca-3595-4b7a-a5ca-055687c83ba2.json +0 -1
  453. package/.output/server/chunks/build/_id_-BUpQSlzo.mjs.map +0 -1
  454. package/.output/server/chunks/build/useWorkshopApi-CO3ophqt.mjs.map +0 -1
  455. package/scripts/.chk-tok +0 -1
  456. package/scripts/.retrain-body.json +0 -1
  457. package/scripts/.retrain3-body.json +0 -1
  458. package/scripts/.rt-tok +0 -1
  459. package/scripts/.rt3-tok +0 -1
@@ -11,7 +11,7 @@ import type { DatabaseSync } from 'node:sqlite'
11
11
  import type { ChannelRow } from './database'
12
12
 
13
13
  /** 查询列(蛇形列名 → 驼峰行字段) */
14
- const COLS = 'id, name, description, scenario_prompt AS scenarioPrompt, llm_json AS llmJson, lead_agent_id AS leadAgentId, workspace, enabled, owner_user_id AS ownerUserId, visibility, join_policy AS joinPolicy, approval_policy AS approvalPolicy, chat_enabled AS chatEnabled, version, created_at AS createdAt, updated_at AS updatedAt'
14
+ const COLS = 'id, name, description, scenario_prompt AS scenarioPrompt, llm_json AS llmJson, lead_agent_id AS leadAgentId, workspace, enabled, owner_user_id AS ownerUserId, visibility, join_policy AS joinPolicy, approval_policy AS approvalPolicy, chat_enabled AS chatEnabled, version, line_id AS lineId, created_at AS createdAt, updated_at AS updatedAt'
15
15
 
16
16
  export interface ChannelCreateInput {
17
17
  name: string
@@ -99,6 +99,7 @@ export function createChannelRepo(db: DatabaseSync) {
99
99
  approvalPolicy: input.approvalPolicy ?? 'owner_only',
100
100
  chatEnabled: input.chatEnabled ?? 0,
101
101
  version: 1,
102
+ lineId: '',
102
103
  createdAt: now,
103
104
  updatedAt: now,
104
105
  }
@@ -189,5 +190,14 @@ export function createChannelRepo(db: DatabaseSync) {
189
190
  remove(id: string): void {
190
191
  removeStmt.run(id)
191
192
  },
193
+
194
+ /** v18:绑定/解绑产线(lineId=''=解绑)。只读扩权面:成员可读该线日志/配方/历史/状态;写仍走节点授权。 */
195
+ setLine(id: string, lineId: string): ChannelRow | undefined {
196
+ const current = selectById.get(id) as unknown as ChannelRow | undefined
197
+ if (!current) return undefined
198
+ db.prepare('UPDATE channels SET line_id = ?, updated_at = ? WHERE id = ?')
199
+ .run(lineId, new Date().toISOString(), id)
200
+ return { ...current, lineId, updatedAt: new Date().toISOString() }
201
+ },
192
202
  }
193
203
  }
@@ -10,6 +10,8 @@ export function migrateGroupChatV17(db: DatabaseSync): void {
10
10
  migrateAddColumn(db, 'channels', 'approval_policy', 'TEXT NOT NULL DEFAULT \'owner_only\'')
11
11
  migrateAddColumn(db, 'channels', 'chat_enabled', 'INTEGER NOT NULL DEFAULT 0')
12
12
  migrateAddColumn(db, 'channels', 'version', 'INTEGER NOT NULL DEFAULT 1')
13
+ // v18:Channel 绑定产线(空串=未绑定;只读扩权面,见 ops-tools agentOpsScope)
14
+ migrateAddColumn(db, 'channels', 'line_id', 'TEXT NOT NULL DEFAULT \'\'')
13
15
  // 规范化非法值(历史手改/测试数据):未知取值一律回落到最保守档,不放宽权限
14
16
  db.exec(`UPDATE channels SET visibility = 'private' WHERE visibility NOT IN ('private', 'public')`)
15
17
  db.exec(`UPDATE channels SET join_policy = 'owner_approve' WHERE join_policy NOT IN ('open', 'owner_approve')`)
@@ -27,6 +27,8 @@ export interface ChannelRow {
27
27
  chatEnabled: number
28
28
  /** v17 乐观锁版本(每次设置变更 +1) */
29
29
  version: number
30
+ /** v18 绑定产线(空串=未绑定;只读扩权:成员可读该线日志/配方/历史/状态,写仍走节点授权) */
31
+ lineId: string
30
32
  createdAt: string
31
33
  updatedAt: string
32
34
  }
@@ -121,21 +121,23 @@ export const DEFAULT_CHANNEL_TEMPLATES: Array<{
121
121
  {
122
122
  id: 'chtpl-generic-optimize-default',
123
123
  name: '通用闭环优化频道(标准)',
124
- description: '标准 goal 驱动闭环优化团队,适配任意已建模产线(注塑/污水/退火/流延/双拉等):lead 编排(可选知识库检索与经验沉淀,支持把 lead 已绑定节点授权给 worker),工艺工程师治理下发,数据分析师证据判读。实例化时可开知识库集成(enableKnowledgeBase)。',
124
+ description: '标准 goal 驱动闭环优化团队,适配任意已建模产线(注塑/污水/退火/流延/双拉等):lead 统一编排(知识检索/节点授权/回退决策),数据分析师持续读数判读,知识调优工程师把知识与数据转化为调优方案,工艺工程师治理下发。实例化时可开知识库集成(enableKnowledgeBase)。',
125
125
  scenarioPrompt: `## 通用闭环优化作业(标准流程)
126
- 你是产线闭环优化团队,围绕用户 goal 对**任意已接入产线**做「取证 → 寻优 → 治理下发 → 复测收口」的闭环优化。开工前先用 my_industrial_nodes 与 line_context 弄清本频道持有的节点授权、产线/产品/配方与安全量程,不假设场景。
126
+ 你是产线闭环优化团队,围绕用户 goal 对**任意已接入产线**做「取证 → 知识增强 → 寻优 → 治理下发 → 复测收口(劣化即回退)」的闭环优化。开工前先用 my_industrial_nodes 与 line_context 弄清本频道持有的节点授权、产线/产品/配方与安全量程,不假设场景。
127
127
 
128
128
  ## 团队分工
129
- - 生产主管(lead):把 goal 拆解为「数据分析」与「参数调整」子任务并派发(worker 缺节点权限时,用 team_grant_nodes 把 lead 已绑定的节点授予对应 worker,或在 dispatch_task 里带 grant_node_ids 随任务授予;只授予自己绑定的节点);复核成员结论(必须带数据证据)→ 汇总收口;对拿不准的现象先查知识库(若已启用)。
130
- - 工艺工程师(worker):持有数控节点授权 —— daq_query 取证 → 判定设定-响应关系 → 在「安全量程 ∩ 配方窗口 ∩ 单步限幅」内用 dcw_control/param_control 小步幅下发(单变量);manual 模式节点先说明理由等用户批准;调整后等工艺惯性响应再复测;把「调整↔响应」证据回报 lead。
131
- - 数据分析师(worker):持有数采节点授权 —— daq_query 时序取证(按批次/时间窗过滤),输出趋势/均值/越限统计与工况判读;异常第一时间通报 lead 与工艺工程师。
129
+ - 生产主管(lead):统一调配 —— 把 goal 拆解为「数据分析」「知识调优」「参数调整」子任务并派发(worker 缺节点权限时,用 team_grant_nodes 把 lead 已绑定的节点授予对应 worker,或在 dispatch_task 里带 grant_node_ids 随任务授予;只授予自己绑定的节点);复核成员结论(必须带数据证据);复测劣化时决策回退(指示工艺工程师 dcw_rollback / 配方回退);对拿不准的现象先查知识库(若已启用)。
130
+ - 数据分析师(worker):**持续读数** —— 按固定节拍(每批次或每 5 分钟)daq_query 拉取授权数采节点时窗数据,滑动窗口对比输出趋势/均值/越限统计与工况判读;异常第一时间通报 lead、工艺工程师与知识调优工程师。
131
+ - 知识调优工程师(worker):**知识↔数据 → 调优方案** —— 用 kb_agent(mode=sync) 检索知识库中本场景的机理知识与历史经验(检索词带产线/产品/关键物理量),结合数据分析师的判读结论,产出带知识依据的调优方案(参数/方向/步幅/预期响应,引用知识条目与数据);知识库未启用或检索为空时退化为纯数据驱动建议并说明。收口后用 kb_agent(mode=async) 沉淀「知识↔调整↔响应」经验入库。
132
+ - 工艺工程师(worker):持有数控节点授权 —— daq_query 取证 → 按调优方案在「安全量程 ∩ 配方窗口 ∩ 单步限幅」内用 dcw_control/param_control 小步幅下发(单变量);manual 模式节点先说明理由等用户批准;调整后等工艺惯性响应再复测;复测劣化立即 dcw_rollback 回退本次调整并通报 lead。
132
133
 
133
134
  ## 作业纪律
134
- 数据先行 → 窗口内小步幅(单次 ≤ 量程 2%)→ 单变量调整 → 复测闭环 → 结论必附带单位与时间窗的数据证据;不得操作未授权节点;治理审批与硬约束(步长限幅/写入间隔)被拒时按指引降步重试,不绕行。`,
135
+ 数据先行 → 知识增强(检索在动手前)→ **产线上下文先行**(频道已绑定产线时,开工先用 line_context 读取绑定产线全景:运行状态/活动批次/当前配方与参数窗口 —— 频道绑定=只读授权,日志/配方史全员可查,写操作仍需节点授权)→ **参数变更一律走配方链路**:多参数候选 → recipe_trial 整批试验(一次带上所有要改的参数,**不写配方版本**;同线节拍 ≥5 分钟)→ 等工艺惯性后复测判读 → 有进步/达标 **recipe_update 固化**(同一配方 id,版本+1,更新而非新建)→ 需要正式落地用 recipe_apply 整批下发;无进步/劣化 **recipe_rollback(dispatch=true) 统一回退**(定义回退+PLC 整批恢复)→ 复测闭环 → 结论必附带单位与时间窗的数据证据;优化闭环内禁用 dcw_control/param_control 逐参数直调(防单参数震荡;AML 探索模式的小步激励除外);知识闭环 = 检索 → 增强 → 试验 → 判读 → 固化/回退 → 沉淀;不得操作未授权节点;治理审批与硬约束被拒时按指引降步重试,不绕行。`,
135
136
  members: [
136
- { inline: { name: '生产主管', harness: 'omp', config: { rpcMode: 'rpc', role: 'lead', systemPromptPrefix: '你是通用闭环优化团队的生产主管(lead):把用户 goal 拆解为「数据分析」「参数调整」子任务并用 dispatch_task 派发(可带 grant_node_ids 随任务把你自己已绑定的节点授权给 worker,或用 team_grant_nodes 执行中授予;只能授予自己绑定的节点);复核成员结论(必须带数据证据)后 complete 收口;若知识库已启用,开工前先用 kb_agent(mode=sync) 检索场景相关数据分析与物理机理,收口后用 kb_agent(mode=async) 沉淀本次经验(标题/类别/问题/解决方案/关键数据)。' } }, role: 'lead' },
137
- { inline: { name: '工艺工程师', harness: 'omp', config: { rpcMode: 'rpc', systemPromptPrefix: '你是通用闭环优化团队的工艺工程师,按节点物理意义做治理参数下发:my_industrial_nodes 确认授权 → daq_query 取证 → dcw_control/param_control 在「安全量程 ∩ 配方窗口 ∩ 单步限幅」内小步幅下发(单变量)→ 等待工艺惯性后 daq_query 复测。你的节点授权可能由 lead 在派发时或执行中授予(权限变化以 my_industrial_nodes 实时查询为准)。manual 模式节点下发前说明理由等批准。结论一律引用带单位与时间窗的数据。' } }, role: 'worker' },
138
- { inline: { name: '数据分析师', harness: 'omp', config: { rpcMode: 'rpc', systemPromptPrefix: '你是通用闭环优化团队的数据分析师,擅长时序取证与工况判读:用 daq_query 获取授权数采节点数据(按批次/时间窗),输出趋势/均值/极值/越限统计,结合数控设定考虑设定-响应滞后;发现越限或异常趋势立即用 send_message_to_agent 通报 lead 与工艺工程师。结论一律引用具体数值。' } }, role: 'worker' },
137
+ { inline: { name: '生产主管', harness: 'omp', config: { rpcMode: 'rpc', role: 'lead', systemPromptPrefix: '你是通用闭环优化团队的生产主管(lead),统一调配三人(数据分析师/知识调优工程师/工艺工程师):把用户 goal 拆解为「数据分析」「知识调优」「参数调整」子任务并用 dispatch_task 派发(可带 grant_node_ids 随任务把你自己已绑定的节点授权给 worker,或用 team_grant_nodes 执行中授予;只能授予自己绑定的节点);复核成员结论(必须带数据证据);优化动作一律走配方链路(trial 试验 → 判读 → update 固化 / 统一回退),复测指标劣化时立即指示工艺工程师 recipe_rollback(dispatch=true) 统一回退后再调整方向;频道绑定的产线只优化其当前活动配方,不新建配方 id;若知识库已启用,开工前先用 kb_agent(mode=sync) 检索场景相关数据分析与物理机理,收口后用 kb_agent(mode=async) 沉淀本次经验(可交知识调优工程师执行)。' } }, role: 'lead' },
138
+ { inline: { name: '数据分析师', harness: 'omp', config: { rpcMode: 'rpc', systemPromptPrefix: '你是通用闭环优化团队的数据分析师,负责持续读数与工况判读:按固定节拍(每批次或每 5 分钟,以任务要求为准)用 daq_query 拉取授权数采节点数据(按批次/时间窗),做滑动窗口对比(当前窗 vs 基线窗),输出趋势/均值/极值/越限统计;结合数控设定考虑设定-响应滞后;发现越限或异常趋势立即用 send_message_to_agent 通报 lead、工艺工程师与知识调优工程师。结论一律引用具体数值与时间窗。' } }, role: 'worker' },
139
+ { inline: { name: '知识调优工程师', harness: 'omp', config: { rpcMode: 'rpc', systemPromptPrefix: '你是通用闭环优化团队的知识调优工程师,把「知识库经验」与「数据分析结论」转化为可执行调优方案:先用 kb_agent(mode=sync) 检索知识库中本场景的机理知识与历史经验(检索词带产线/产品/关键物理量);结合数据分析师的最新判读,产出带知识依据的调优方案(调哪个参数/方向/步幅/预期响应/依据哪条知识,引用知识条目与数据证据);知识库未启用或检索为空时退化为纯数据驱动建议并明确说明;方案交工艺工程师治理下发(或经 lead 授权后自行 param_control 小步验证);复测有效则用 kb_agent(mode=async) 把「知识↔调整↔响应」经验沉淀入库(异步提交后无需等待);复测劣化则立即建议回退并同步 lead。' } }, role: 'worker' },
140
+ { inline: { name: '工艺工程师', harness: 'omp', config: { rpcMode: 'rpc', systemPromptPrefix: '你是通用闭环优化团队的工艺工程师,按知识调优工程师的方案走配方链路执行:my_industrial_nodes 确认授权 → daq_query 取证 → 把方案转成 recipe_trial(多参数候选整批试验,一次带上所有要改的参数,带 hypothesis 声明依据;不写配方版本)→ 等待工艺惯性后 daq_query 复测 → 有进步/达标用 recipe_update 把候选值固化进配方(同 id 版本+1),需要正式落地用 recipe_apply 整批下发;无进步/劣化用 recipe_rollback(dispatch=true)统一回退(定义回退+PLC 整批恢复)。优化闭环内禁用 dcw_control/param_control 逐参数直调(防震荡)。你的节点授权可能由 lead 在派发时或执行中授予(权限变化以 my_industrial_nodes 实时查询为准)。manual 模式节点下发前说明理由等批准。结论一律引用带单位与时间窗的数据。' } }, role: 'worker' },
139
141
  ],
140
142
  },
141
143
  ]
@@ -182,6 +184,14 @@ export function seedDefaultWorkshopData(db: DatabaseSync): void {
182
184
  for (const tpl of DEFAULT_CHANNEL_TEMPLATES) {
183
185
  insertChannelTpl.run(tpl.id, tpl.name, tpl.description, tpl.scenarioPrompt, JSON.stringify(tpl.members), now, now)
184
186
  }
187
+ // 内置模板升级:INSERT OR IGNORE 对已种子库不可见 —— 本文件是内置模板的唯一权威定义,
188
+ // 定义变更后重启即同步(只触 owner_user_id IS NULL 的内置公共行;用户复制的模板是独立 id,不受影响)。
189
+ const upgradeTpl = db.prepare(
190
+ 'UPDATE channel_templates SET name = ?, description = ?, scenario_prompt = ?, members_json = ?, updated_at = ? WHERE id = ? AND owner_user_id IS NULL',
191
+ )
192
+ for (const tpl of DEFAULT_CHANNEL_TEMPLATES) {
193
+ upgradeTpl.run(tpl.name, tpl.description, tpl.scenarioPrompt, JSON.stringify(tpl.members), now, tpl.id)
194
+ }
185
195
  }
186
196
 
187
197
  /** channels 表行 */
@@ -86,6 +86,7 @@ export abstract class DcwControllerRecipes extends DcwControllerParams {
86
86
  * 逐参数写核心(apply 与产线开跑共用):**节点级寻址** —— 每个参数显式指向
87
87
  * 控制节点(节点才是真实控制 PLC 工艺参数的执行体)→ 逐参数写命令
88
88
  * (runId 入写历史)→ 结果快照。节点不存在 → 该参数记失败不阻塞其余。
89
+ * v19 trial:传入 merged params(候选覆盖集),批次与写命令按候选值落账。
89
90
  */
90
91
  protected async writeRecipeParams(recipe: RecipeView, run: RecipeRunView): Promise<void> {
91
92
  const results: RecipeRunView['results'] = []
@@ -117,15 +118,44 @@ export abstract class DcwControllerRecipes extends DcwControllerParams {
117
118
  getDcwRecipeRepo().updateRun(run)
118
119
  }
119
120
 
120
- /** Recipe 手动应用(一键下发工艺参数集;不激活产线窗口) */
121
- async applyRecipe(recipeId: string) {
121
+ /** v19 试验节拍:同产线两次 trial 的最小间隔(防连发震荡;env 可调)。 */
122
+ private static readonly TRIAL_INTERVAL_MS = Math.max(0, Number(process.env.AW_TRIAL_INTERVAL_MS) || 5 * 60_000)
123
+ private trialLastAt = new Map<string, number>()
124
+
125
+ private assertTrialCadence(lineId: string): void {
126
+ if (DcwControllerRecipes.TRIAL_INTERVAL_MS <= 0) return
127
+ const last = this.trialLastAt.get(lineId) ?? 0
128
+ const elapsed = Date.now() - last
129
+ if (elapsed < DcwControllerRecipes.TRIAL_INTERVAL_MS) {
130
+ throw new AppError(429, ErrorCodes.WRITE_FREQUENT, `本产线上一次配方试验距今仅 ${Math.floor(elapsed / 1000)}s,试验节拍为 ≥${Math.round(DcwControllerRecipes.TRIAL_INTERVAL_MS / 1000)}s(防连发震荡),请等待 ${Math.ceil((DcwControllerRecipes.TRIAL_INTERVAL_MS - elapsed) / 1000)}s 后再试`)
131
+ }
132
+ }
133
+
134
+ /**
135
+ * Recipe 手动应用 / Agent 试验(一键下发工艺参数集;不激活产线窗口)。
136
+ * v19 trial 语义:overrides = 候选覆盖集(仅覆盖列出节点的值,必须已是配方内节点)——
137
+ * 整批下发候选参数但**不写配方版本**(复测有进步才由 Agent recipe_update 固化);
138
+ * trial 受同线节拍卡控;四层限界在 write() 咽喉点照常拦截(量程∩参数∩产品)。
139
+ */
140
+ async applyRecipe(recipeId: string, opts: { overrides?: Array<{ nodeId: string, value: number }>, trial?: boolean } = {}) {
122
141
  this.ensureLoop()
123
142
  const repo = getDcwRecipeRepo()
124
143
  const recipe = repo.byId(recipeId)
125
144
  if (!recipe) throw new AppError(404, ErrorCodes.NOT_FOUND, `Recipe 不存在: ${recipeId}`)
126
145
  if (recipe.params.length === 0) throw new AppError(400, ErrorCodes.VALIDATION_ERROR, 'Recipe 无工艺参数,无可下发内容')
127
- const run = repo.createRun(recipe)
128
- await this.writeRecipeParams(recipe, run)
146
+ const overrides = opts.overrides ?? []
147
+ const unknown = overrides.filter(o => !recipe.params.some(p => p.nodeId === o.nodeId))
148
+ if (unknown.length) {
149
+ throw new AppError(400, ErrorCodes.VALIDATION_ERROR, `覆盖参数不在配方内: ${unknown.map(o => o.nodeId).join(', ')}(试验只能修改配方已有参数的值;新增参数请先 recipe_update)`)
150
+ }
151
+ if (opts.trial) this.assertTrialCadence(recipe.lineId)
152
+ const merged = recipe.params.map((p) => {
153
+ const ov = overrides.find(x => x.nodeId === p.nodeId)
154
+ return ov ? { ...p, value: ov.value } : p
155
+ })
156
+ const run = repo.createRun(recipe, merged)
157
+ await this.writeRecipeParams({ ...recipe, params: merged }, run)
158
+ if (opts.trial) this.trialLastAt.set(recipe.lineId, Date.now())
129
159
  return run
130
160
  }
131
161
 
@@ -133,5 +163,31 @@ export abstract class DcwControllerRecipes extends DcwControllerParams {
133
163
  return getDcwRecipeRepo().closeRun(id)
134
164
  }
135
165
 
166
+ /**
167
+ * v19 统一回退:定义回退到目标版本(非破坏,生成新版本)+ **该版本参数整批重下发到 PLC**
168
+ * (与 recipe_rollback 仅改定义的区别:本方法把恢复值真正写回产线,批次级恢复)。
169
+ * 下发走 write() 咽喉点,四层限界照常(回退值是历史已固化参数,量程/参数/产品层兜底)。
170
+ */
171
+ async rollbackRecipeAndDispatch(recipeId: string, opts: {
172
+ version?: number
173
+ toLastGood?: boolean
174
+ by?: 'user' | 'agent' | 'system'
175
+ actorName?: string
176
+ actor?: string
177
+ description?: string
178
+ }) {
179
+ const updated = this.revertRecipe(recipeId, {
180
+ version: opts.toLastGood ? undefined : opts.version,
181
+ toLastGood: opts.toLastGood === true,
182
+ }, {
183
+ by: opts.by ?? 'agent',
184
+ actorName: opts.actorName ?? 'Agent',
185
+ actor: opts.actor ?? 'system',
186
+ description: opts.description ?? '统一回退(定义回退+PLC 整批恢复)',
187
+ })
188
+ const run = await this.applyRecipe(recipeId)
189
+ return { recipe: updated, run }
190
+ }
191
+
136
192
  // ---------- 产线(实体 CRUD;节点/产品/配方挂载其下实现隔离) ----------
137
193
  }
@@ -9,6 +9,7 @@ import { assertWithinLimits, assertStepLimit } from '../param-limits'
9
9
  import { getRecipeRollBackManager } from '../recipe-rollback-manager'
10
10
  import { normalizeDcwDriverKind, resolveDcwDriver } from '../drivers'
11
11
  import { recordDcwWriteOps } from './write-audit'
12
+ import { recordOps } from '../../ops/ops'
12
13
 
13
14
  export abstract class DcwControllerWrite extends DcwControllerBindings {
14
15
  /** 手动设定:用户提交工程量,网关校验/换算/下发/回读校验。
@@ -30,7 +31,25 @@ export abstract class DcwControllerWrite extends DcwControllerBindings {
30
31
  throw new AppError(409, ErrorCodes.CONFLICT, `当前节点暂停:「${node.name}」控制已暂停,仅开启控制的节点可被设定`)
31
32
  }
32
33
  // 调控闭环护栏(F1/F8):Agent 互斥(open 记录他人持有)+ 回退冷却方向性
33
- getRecipeRollBackManager().beforeWrite(node, eng, meta)
34
+ // v18 拒绝留痕:治理咽喉点的每一次拒绝(量程/配方窗/步限/间隔/保持窗)入审计 ——
35
+ // 安全审计需要"谁在何时试图把参数写到哪、被哪条防线拦下";给调用方的反馈由错误消息承担。
36
+ const reject = (err: AppError): never => {
37
+ try {
38
+ recordOps({
39
+ actor: meta?.actor ?? 'system', actorName: meta?.actorName ?? '', actorKind: meta?.source === 'agent' ? 'agent' : (meta?.source === 'manual' ? 'user' : 'system'),
40
+ action: 'dcw.write.rejected', kind: 'write', targetKind: 'dcw', targetId: id, lineId: node.lineId,
41
+ summary: `设定 ${eng}${node.unit || ''} 被拒:${err.message}`,
42
+ })
43
+ }
44
+ catch { /* 审计失败不改变拒绝语义 */ }
45
+ throw err
46
+ }
47
+ try {
48
+ getRecipeRollBackManager().beforeWrite(node, eng, meta)
49
+ }
50
+ catch (err) {
51
+ reject(err instanceof AppError ? err : new AppError(409, ErrorCodes.CONFLICT, String(err instanceof Error ? err.message : err)))
52
+ }
34
53
  // 写入限界分层联锁(param-limits):节点安全量程(结构层,驱动内 validateEng 结构性兜底)
35
54
  // ∩ 工艺参数基准限界 ∩ 活动产品限界 ∩ 活动配方工艺窗口 —— 逐层收窄取交集,
36
55
  // 手动 REST / Agent 工具 / 配方下发 / 回退四路共用本咽喉点,越界一律拒绝。
@@ -40,7 +59,12 @@ export abstract class DcwControllerWrite extends DcwControllerBindings {
40
59
  const benchNoInterlock = process.env.AW_BENCH_MODE === '1' && (meta?.benchArm === 'no-interlock' || meta?.benchArm === 'ungated')
41
60
  // 配方下发路径(recipeRunId != null)跳过配方窗口层:下发值已在配方保存时对自身窗口校验,
42
61
  // 且中途应用新配方不应被旧批次配方窗口误伤;产品/参数基准层对配方下发照常约束。
43
- assertWithinLimits(node, eng, { includeSoft: !benchNoInterlock, skipRecipe: recipeRunId != null })
62
+ try {
63
+ assertWithinLimits(node, eng, { includeSoft: !benchNoInterlock, skipRecipe: recipeRunId != null })
64
+ }
65
+ catch (err) {
66
+ reject(err instanceof AppError ? err : new AppError(400, ErrorCodes.VALIDATION_ERROR, String(err instanceof Error ? err.message : err)))
67
+ }
44
68
  const srcForLock = meta?.source ?? (recipeRunId ? 'recipe' : 'manual')
45
69
  const benchBypass = process.env.AW_BENCH_MODE === '1'
46
70
  // 在线 Agent/人工控制都走安全小步与 60s 最小间隔:这是探索阶段的硬卡控,
@@ -50,12 +74,17 @@ export abstract class DcwControllerWrite extends DcwControllerBindings {
50
74
  const previous = typeof node.value === 'number'
51
75
  ? node.value
52
76
  : (typeof node.readValue === 'number' ? node.readValue : null)
53
- assertStepLimit(node, eng, { includeSoft: !benchNoInterlock, skipRecipe: false }, previous)
77
+ try {
78
+ assertStepLimit(node, eng, { includeSoft: !benchNoInterlock, skipRecipe: false }, previous)
79
+ }
80
+ catch (err) {
81
+ reject(err instanceof AppError ? err : new AppError(409, ErrorCodes.STEP_LIMIT_EXCEEDED, String(err instanceof Error ? err.message : err)))
82
+ }
54
83
  const previousAt = node.lastWriteAt ? Date.parse(node.lastWriteAt) : NaN
55
84
  if (Number.isFinite(previousAt)) {
56
85
  const elapsed = Date.now() - previousAt
57
86
  if (elapsed < 60_000) {
58
- throw new AppError(429, ErrorCodes.WRITE_INTERVAL_NOT_ELAPSED, `DCW 节点「${node.name}」两次在线写入间隔必须至少 60s,当前还需 ${Math.ceil((60_000 - elapsed) / 1000)}s`)
87
+ reject(new AppError(429, ErrorCodes.WRITE_INTERVAL_NOT_ELAPSED, `DCW 节点「${node.name}」两次在线写入间隔必须至少 60s,当前还需 ${Math.ceil((60_000 - elapsed) / 1000)}s`))
59
88
  }
60
89
  }
61
90
  }
@@ -78,11 +107,11 @@ export abstract class DcwControllerWrite extends DcwControllerBindings {
78
107
  }
79
108
  }
80
109
  if (now < until) {
81
- throw new AppError(
110
+ reject(new AppError(
82
111
  429,
83
112
  ErrorCodes.WRITE_FREQUENT,
84
113
  `当前写入频繁:「${node.name}」处于写入保持窗口(剩余 ${Math.ceil((until - now) / 1000)}s),请稍后再试`,
85
- )
114
+ ))
86
115
  }
87
116
  }
88
117
  // D8: no-readback / ungated 臂 → 容差置 MAX,回读差异不致败(假成功语义,供 I2 消融)
@@ -353,7 +353,7 @@ class DcwRecipeRepo {
353
353
  }
354
354
  }
355
355
 
356
- createRun(recipe: RecipeView): RecipeRunView {
356
+ createRun(recipe: RecipeView, paramsOverride?: RecipeView['params']): RecipeRunView {
357
357
  const run: RecipeRunView = {
358
358
  id: `rr-${randomUUID().slice(0, 8)}`,
359
359
  recipeId: recipe.id,
@@ -363,8 +363,9 @@ class DcwRecipeRepo {
363
363
  startedAt: new Date().toISOString(),
364
364
  endedAt: null,
365
365
  results: [],
366
- // 参数冻结(调控闭环):配方事后修改不影响本批次的审计与回放
367
- paramsSnapshot: recipe.params.map(p => ({ ...p })),
366
+ // 参数冻结(调控闭环):配方事后修改不影响本批次的审计与回放。
367
+ // v19 trial:候选覆盖集作为批次快照(批次实际按候选值生产,审计与回放以候选为准)。
368
+ paramsSnapshot: (paramsOverride ?? recipe.params).map(p => ({ ...p })),
368
369
  }
369
370
  this.runs.push(run)
370
371
  if (this.runs.length > RUNS_CAP) this.runs.splice(0, this.runs.length - RUNS_CAP)
@@ -237,6 +237,9 @@ class DcwParamRepo {
237
237
  }
238
238
 
239
239
  listViews(): DcwParamView[] {
240
+ // 惰性回填:ensureForNode 只在节点创建时触发,早于参数面功能问世的节点/复用产线
241
+ // 永远缺行(现场表现为 param_read 只见新线参数)。视图入口幂等补齐(已存在的直接返回)。
242
+ for (const n of getDcwNodeRepo().all()) this.ensureForNode(n)
240
243
  const nodeRepo = getDcwNodeRepo()
241
244
  const views = new Map(nodeRepo.all().map(n => [n.id, n.toView()]))
242
245
  return this.list
@@ -37,7 +37,15 @@ export async function initPluginHost({ cwd = process.cwd(), packageRoot } = {})
37
37
  let settingsPath = null
38
38
  let paths = { home: homeDir, configRoot: join(cwd, '.AgentWorkShop'), dataDir: join(cwd, '.AgentWorkShop', 'data') }
39
39
  try {
40
- const homeMod = await import(pathToUrl(join(cwd, 'shared', 'config', 'home.mjs')))
40
+ // home.mjs 探测根:cwd 优先;cwd 漂移(计划任务/服务方式启动,schtasks 默认 System32、
41
+ // 或 cwd=AW_HOME)时 shared/ 不在 cwd 下 → 回退 packageRoot(aw-plugins.ts 已按 chunk
42
+ // 逐级上溯算好)/ AW_PACKAGE_ROOT(启动器注入)。否则这里 throw 进 catch →
43
+ // config=null 且 paths 落到 join(cwd,'.AgentWorkShop') 嵌套错根,插件 ctx.config
44
+ // 终身为空(PATCH/重启都救不回,插件命名空间设置键全部不可见)。
45
+ const engineBases = [cwd, packageRoot, process.env.AW_PACKAGE_ROOT].filter(Boolean)
46
+ const base = engineBases.find(r => existsSync(join(r, 'shared', 'config', 'home.mjs')))
47
+ if (!base) throw new Error(`shared/config/home.mjs 不在任何候选根(${engineBases.join(' | ')})`)
48
+ const homeMod = await import(pathToUrl(join(base, 'shared', 'config', 'home.mjs')))
41
49
  const rm = homeMod.resolveRunMode({ cwd, packageRoot, env: process.env })
42
50
  const engineRoot = rm.mode === 'repo' ? rm.root : (packageRoot ?? rm.root)
43
51
  if (engineRoot && existsSync(join(engineRoot, 'shared', 'config', 'engine.mjs'))) {
@@ -56,7 +56,7 @@ export async function loadAllPlugins(host, { config, paths }) {
56
56
  name: def.name,
57
57
  version: String(def.version ?? '0.0.0'),
58
58
  description: String(def.description ?? ''),
59
- auth: String(def.auth ?? 'none'),
59
+ auth: String(def.auth ?? 'user'),
60
60
  scope,
61
61
  dir,
62
62
  entry,
@@ -82,7 +82,7 @@ export async function loadAllPlugins(host, { config, paths }) {
82
82
  name: def.name,
83
83
  version: String(def.version ?? '0.0.0'),
84
84
  description: String(def.description ?? ''),
85
- auth: String(def.auth ?? 'none'),
85
+ auth: String(def.auth ?? 'user'),
86
86
  scope,
87
87
  dir,
88
88
  entry,
@@ -6,7 +6,8 @@ import { ManagerNotifications } from './notifications'
6
6
  import type { ActingUser, AgentTemplateDetail } from './types'
7
7
  import type { AgentInfo } from '../../agents/agent-interface'
8
8
  import type { AgentRow, ChannelRow, WorkspaceRow } from '../../db/database'
9
- import { AppError } from '../../../../utils/errors'
9
+ import { AppError, ErrorCodes } from '../../../../utils/errors'
10
+ import { getDcwLineRepo } from '../../dcw/dcw-line.repo'
10
11
  import { assertHarnessUsable } from '../../agents/harness-availability'
11
12
  import { mkdirSync } from 'node:fs'
12
13
  import { parseJson } from '../../db/database'
@@ -144,6 +145,31 @@ export abstract class ManagerAdminChannel extends ManagerNotifications {
144
145
  return this.deps.repos.channels.findById(channelId)?.scenarioPrompt ?? ''
145
146
  }
146
147
 
148
+ /** v18:绑定/解绑产线(lineId 空 = 解绑)。绑定变更回收成员运行时,下次装配注入产线简报。 */
149
+ async bindChannelLine(channelId: string, lineId: string | null): Promise<ChannelRow> {
150
+ const channel = this.requireChannelRow(channelId)
151
+ const next = String(lineId ?? '').trim()
152
+ if (next && next !== channel.lineId) {
153
+ // 产线存在性校验:避免绑到已删除/拼错的线 id(工具面按线过滤,悬空绑定毫无价值)
154
+ const line = getDcwLineRepo().byId(next)
155
+ if (!line) throw new AppError(404, ErrorCodes.NOT_FOUND, `产线不存在: ${next}`)
156
+ }
157
+ if (next === channel.lineId) return channel
158
+ const updated = this.deps.repos.channels.setLine(channelId, next)!
159
+ // 与场景 prompt 变更同链路:回收成员运行时,下次装配注入新的产线简报
160
+ await this.unloadChannelAgents(channelId)
161
+ if (updated.leadAgentId) this.ensureChannelActive(channelId)
162
+ return updated
163
+ }
164
+
165
+ /** v18:Agent 实例 → 其频道绑定的产线 id(只读扩权依据;未绑/找不到 = null) */
166
+ channelLineBindingOf(agentId: string): string | null {
167
+ const m = this.deps.repos.channelAgents.findById(agentId)
168
+ if (!m) return null
169
+ const lineId = this.deps.repos.channels.findById(m.channelId)?.lineId ?? ''
170
+ return lineId || null
171
+ }
172
+
147
173
  /** AML 解耦:twin-profile 变更(模式/绑定模型)后回收成员,重新装配注入新工况提示词 */
148
174
  async recycleChannelForTwinProfile(channelId: string): Promise<void> {
149
175
  const channel = this.deps.repos.channels.findById(channelId)
@@ -16,14 +16,15 @@ import { getChannelPluginsRepo } from '../../db/channel-plugins.repo'
16
16
  /** 携带「知识库集成」选项的模板:实例化时可显式启停 rag-bridge(开 → 注入 KB 作业段提示词) */
17
17
  export const KNOWLEDGE_BASE_TEMPLATE_IDS = new Set(['chtpl-aml-optimization-default', 'chtpl-generic-optimize-default'])
18
18
 
19
- /** 知识库集成开启时追加到频道场景提示词的作业段(教 lead 先检索后沉淀) */
19
+ /** 知识库集成开启时追加到频道场景提示词的作业段(教全员:先检索、后行动、再沉淀;知识调优工程师为主消费者) */
20
20
  export const KNOWLEDGE_BASE_PROMPT_SECTION = `
21
21
 
22
22
  ## 知识库集成(已启用 rag-bridge)
23
23
  本频道接入了 rag-knowledge 知识库,优化作业遵循「先检索、后行动、再沉淀」:
24
- 1. 优化启动前,lead 先用 kb_agent(mode=sync) 检索知识库中与本场景相关的**数据分析结论**与**物理机理知识**(检索词带上产线/产品/关键物理量,如「注塑 保压 克重 波动」「烘箱温度 膜厚 滞后」);把检索所得的机理关系、历史阈值与经验教训作为探索方向、步长与安全边界的依据;
25
- 2. 优化过程中,若对某个现象拿不准,先查知识库再动手;worker 也可各自检索,但入库/沉淀由 lead 统一收口;
26
- 3. 优化闭环收口后(目标达标或 judge 判定 keep),lead 用 kb_agent(mode=async) 把本次经验沉淀入知识库:标题、类别(工艺经验/数据分析/故障案例)、问题、解决方案、关键数据(带单位的参数调整↔响应变化)。异步提交后无需等待,可继续汇报。`
24
+ 1. 优化启动前,lead 与知识调优工程师先用 kb_agent(mode=sync) 检索知识库中与本场景相关的**数据分析结论**与**物理机理知识**(检索词带上产线/产品/关键物理量,如「注塑 保压 克重 波动」「烘箱温度 膜厚 滞后」);把检索所得的机理关系、历史阈值与经验教训作为探索方向、步长与安全边界的依据;
25
+ 2. 知识调优工程师是知识库的主要消费者与沉淀者:调优方案必须注明依据哪条知识;优化过程中若对某个现象拿不准,先查知识库再动手;worker 也可各自检索,但入库/沉淀由 lead 统一收口(可交知识调优工程师执行);
26
+ 3. 优化闭环收口后(目标达标或 judge 判定 keep),用 kb_agent(mode=async) 把本次经验沉淀入知识库:标题、类别(工艺经验/数据分析/故障案例)、问题、解决方案、关键数据(带单位的参数调整↔响应变化)。异步提交后无需等待,可继续汇报;入库结果用 kb_agent_status 查询;
27
+ 4. 若本频道同时启用深度诊断(diag-bridge):数据判读拿不准或质量异常时,先用 diag_run 发起根因诊断(异步,提交即返 task_id),完成后按 diag_status 返回的指引把报告经验经 kb_agent 入库,再把结论用于调优决策。`
27
28
 
28
29
  export abstract class ManagerChannelTemplates extends ManagerTeams {
29
30
  /** 可见性感知 Channel 模板列表:普通用户 = 本人 + public(含内置);admin = 全量 */
@@ -12,6 +12,7 @@ import type { ChannelRuntime } from '../channel-runtime'
12
12
  import { Mailbox } from '../mailbox'
13
13
  import { SchedulerLoop } from '../scheduler-loop'
14
14
  import { buildMessage, instanceToAgentInfo, log, parseChannelLlm, rowToChannelMail, runtimeKey } from './helpers'
15
+ import { getDcwLineRepo } from '../../dcw/dcw-line.repo'
15
16
  import { harnessContinuityEnabled, workshopSettings } from '../../settings'
16
17
  import { composeChannelSystemPrompt } from '../../aml/twin/prompt-composer'
17
18
 
@@ -29,7 +30,22 @@ export abstract class ManagerRuntimeWiring extends ManagerBus {
29
30
  // 变更经 updateChannel 回收成员运行时,下次装配拿到新场景)
30
31
  const scenarioPrompt = this.deps.repos.channels.findById(m.channelId)?.scenarioPrompt ?? ''
31
32
  const configWithCtx: Record<string, unknown> = { ...agent.config }
32
- if (scenarioPrompt) configWithCtx.scenarioPrompt = scenarioPrompt
33
+ // v18 频道绑定产线:注入产线简报(只读上下文;全员可 line_context 看实时全景,写仍需节点授权)
34
+ try {
35
+ const boundLineId = this.deps.repos.channels.findById(m.channelId)?.lineId ?? ''
36
+ const line = boundLineId ? getDcwLineRepo().byId(boundLineId) : undefined
37
+ if (line) {
38
+ const brief = `\n\n## 绑定产线(只读上下文)\n本频道已绑定产线「${line.name}」(${line.id})${line.description ? ` — ${line.description}` : ''}。全员可用 line_context 查看该产线实时全景(运行状态/活动批次/当前配方与参数窗口),ops_log / recipe_log / recipe_versions 查运维日志与配方历史(频道绑定 = 只读授权);参数下发等写操作仍需节点授权(lead 可用 team_grant_nodes/grant_node_ids 授予)。`
39
+ configWithCtx.scenarioPrompt = (scenarioPrompt ? `${scenarioPrompt}\n` : '') + brief
40
+ }
41
+ else if (scenarioPrompt) {
42
+ configWithCtx.scenarioPrompt = scenarioPrompt
43
+ }
44
+ }
45
+ catch {
46
+ // 产线仓储未就绪等异常:退回纯场景 prompt,不阻断装配
47
+ if (scenarioPrompt) configWithCtx.scenarioPrompt = scenarioPrompt
48
+ }
33
49
  // AML 解耦:训练/工艺优化 Channel 的动态工况提示词(模式+goal+绑定节点调试元数据组装;
34
50
  // 模式/绑定变更经 twin-profile PATCH 回收成员运行时生效,与 scenarioPrompt 同链路)。
35
51
  try {
@@ -22,6 +22,8 @@
22
22
 
23
23
  { "key": "security.approvalGate", "type": "boolean", "group": "security", "label": "高危操作双人复核", "labelKey": "settings.runtime.security.approvalGate", "description": "R3:开启后写控/删除等高风险操作需另一位管理员批核", "applies": "live", "default": false },
24
24
  { "key": "security.hitl_timeout_ms", "type": "number", "group": "security", "label": "HITL 审批超时(ms)", "labelKey": "settings.runtime.security.hitlTimeoutMs", "description": "手动确认模式下发审批的等待超时(超时按拒绝收敛)", "applies": "restart", "default": 180000, "min": 1000, "max": 86400000, "aliases": ["HITL_TIMEOUT_MS"] },
25
+ { "key": "security.allowRegistration", "type": "boolean", "group": "security", "label": "开放自助注册", "labelKey": "settings.runtime.security.allowRegistration", "description": "公网部署闸门:关闭后(且首管理员已就位)两个注册端点均返回 403,仅管理员可建账号", "applies": "live", "default": true },
26
+ { "key": "security.hstsEnabled", "type": "boolean", "group": "security", "label": "下发 HSTS 头", "labelKey": "settings.runtime.security.hstsEnabled", "description": "仅在已全站 HTTPS(反代/隧道终结 TLS)时开启,开启后响应带 Strict-Transport-Security", "applies": "live", "default": false },
25
27
 
26
28
  { "key": "daq.startInfrastructure", "type": "select", "group": "daq", "label": "数采基础设施拉起策略", "labelKey": "settings.runtime.daq.startInfrastructure", "description": "auto=启动探测,不通且有 Docker 则自动拉起;always=仅 Docker 拉起;never=只直连", "applies": "live", "default": "auto", "options": ["auto", "always", "never"] },
27
29
  { "key": "daq.mqtt.host", "type": "string", "group": "daq", "label": "MQTT Broker 地址", "labelKey": "settings.runtime.daq.mqttHost", "description": "数采事件总线 MQTT 主机", "applies": "restart", "default": "127.0.0.1" },