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,6 +1,6 @@
1
1
  {
2
2
  "name": "agentworkshop-prod",
3
- "version": "0.7.51",
3
+ "version": "0.7.52",
4
4
  "type": "module",
5
5
  "private": true,
6
6
  "dependencies": {
package/README-zh.md CHANGED
@@ -28,7 +28,7 @@
28
28
 
29
29
  **[English](./README.md)** · **[在线文档](https://kingdol666.github.io/AgentWorkShop)** · **[版本发布](https://github.com/kingdol666/AgentWorkShop/releases)** · **[更新日志](./changelog.md)** · **[插件 API](./docs/plugins.md)** · **[SDK](./docs/sdk.md)**
30
30
 
31
- <sub><b>v0.7.51</b> · 14 个执行引擎 · 6 种现场协议(5 内置 + 串口插件) · 113 个运行时设置项 · 双语文档(简体中文 / English)</sub>
31
+ <sub><b>v0.7.52</b> · 14 个执行引擎 · 6 种现场协议(5 内置 + 串口插件) · 113 个运行时设置项 · 双语文档(简体中文 / English)</sub>
32
32
 
33
33
  <br />
34
34
 
@@ -386,7 +386,7 @@ aw update --check # 只报告,不安装
386
386
  npm install -g agentworkshop@latest # 手动等效
387
387
  ```
388
388
 
389
- 版本遵循 semver。每次 `aw start` 都会校验配置根,并把 `home` 之前的旧版 `data/` 布局迁移进来(以最新文件为准),因此数据可以跨版本存活。SQLite schema 迁移在服务端启动时执行。当前版本:**v0.7.51**——见[版本发布](https://github.com/kingdol666/AgentWorkShop/releases)。
389
+ 版本遵循 semver。每次 `aw start` 都会校验配置根,并把 `home` 之前的旧版 `data/` 布局迁移进来(以最新文件为准),因此数据可以跨版本存活。SQLite schema 迁移在服务端启动时执行。当前版本:**v0.7.52**——见[版本发布](https://github.com/kingdol666/AgentWorkShop/releases)。
390
390
 
391
391
  ### 第一次「Agent × 产线」会话(约 2 分钟)
392
392
 
package/README.md CHANGED
@@ -28,7 +28,7 @@
28
28
 
29
29
  **[简体中文](./README-zh.md)** · **[Documentation](https://kingdol666.github.io/AgentWorkShop)** · **[Releases](https://github.com/kingdol666/AgentWorkShop/releases)** · **[Changelog](./changelog.md)** · **[Plugin API](./docs/plugins.md)** · **[SDK](./docs/sdk.md)**
30
30
 
31
- <sub><b>v0.7.51</b> · 14 engines · 6 field protocols (5 built-in + serial plugin) · 113 runtime settings · bilingual docs (简体中文 / English)</sub>
31
+ <sub><b>v0.7.52</b> · 14 engines · 6 field protocols (5 built-in + serial plugin) · 113 runtime settings · bilingual docs (简体中文 / English)</sub>
32
32
 
33
33
  <br />
34
34
 
@@ -377,7 +377,7 @@ aw update --check # only report; nothing is installed
377
377
  npm install -g agentworkshop@latest # manual equivalent
378
378
  ```
379
379
 
380
- Releases follow semver. `aw start` verifies the config root on every launch and migrates the legacy pre-`home` `data/` layout into it (newest file wins), so data survives upgrades. SQLite schema migrations run server-side at boot. Current version: **v0.7.51** — see [Releases](https://github.com/kingdol666/AgentWorkShop/releases).
380
+ Releases follow semver. `aw start` verifies the config root on every launch and migrates the legacy pre-`home` `data/` layout into it (newest file wins), so data survives upgrades. SQLite schema migrations run server-side at boot. Current version: **v0.7.52** — see [Releases](https://github.com/kingdol666/AgentWorkShop/releases).
381
381
 
382
382
  ### Your first agent × line session (~2 minutes)
383
383
 
@@ -213,8 +213,8 @@ export function useWorkshopApi() {
213
213
  updateChannelTemplate: (id: string, body: { name?: string, description?: string, scenarioPrompt?: string, workspace?: string, visibility?: 'private' | 'public' }) =>
214
214
  http.request<{ data: ChannelTemplateDto }>({ method: 'PATCH', url: `/workshop/channel-templates/${id}`, data: body }),
215
215
  deleteChannelTemplate: (id: string) => http.delete<{ data: unknown }>(`/workshop/channel-templates/${id}`),
216
- instantiateChannelTemplate: (id: string, name?: string) =>
217
- http.post<{ data: { channelId: string, workspace: string, agentCount: number, leadAgentId?: string } }>(`/workshop/channel-templates/${id}/instantiate`, { name }),
216
+ instantiateChannelTemplate: (id: string, name?: string, options?: { enableKnowledgeBase?: boolean }) =>
217
+ http.post<{ data: { channelId: string, workspace: string, agentCount: number, leadAgentId?: string } }>(`/workshop/channel-templates/${id}/instantiate`, { name, ...options }),
218
218
  /** 从 Channel 模板实例化并挂载到 workspace(替代"挂载已有 Channel") */
219
219
  mountChannelTemplate: (wsId: string, tplId: string, name?: string) =>
220
220
  http.post<{ data: { channelId: string, workspace: string, agentCount: number, leadAgentId?: string } }>(`/workshop/workspaces/${wsId}/channel-templates/${tplId}`, { name }),
@@ -329,6 +329,8 @@ export interface ChannelTemplateDto {
329
329
  isBuiltin: boolean
330
330
  ownerUserId: string | null
331
331
  ownerName?: string | null
332
+ /** 模板支持「知识库集成」选项(实例化时可启停 rag-bridge 插件) */
333
+ knowledgeBaseCapable?: boolean
332
334
  createdAt: string
333
335
  updatedAt: string
334
336
  }
@@ -128,12 +128,28 @@ const toggleVisibility = async (t: ChannelTemplateDto, pub: boolean): Promise<vo
128
128
  }
129
129
  }
130
130
 
131
- /** 实例化(不挂载;工作区内挂载走会话栏) */
131
+ /** 实例化(不挂载;工作区内挂载走会话栏):KB-capable 模板先弹确认,可启停知识库集成 */
132
132
  const instantiating = ref<string | null>(null)
133
- const instantiate = async (t: ChannelTemplateDto): Promise<void> => {
133
+ const instOpen = ref(false)
134
+ const instTarget = ref<ChannelTemplateDto | null>(null)
135
+ const instKb = ref(true)
136
+ const openInstantiate = (t: ChannelTemplateDto): void => {
137
+ instTarget.value = t
138
+ instKb.value = true
139
+ if (!t.knowledgeBaseCapable) {
140
+ void confirmInstantiate()
141
+ return
142
+ }
143
+ instOpen.value = true
144
+ }
145
+ const confirmInstantiate = async (): Promise<void> => {
146
+ const t = instTarget.value
147
+ if (!t) return
134
148
  instantiating.value = t.id
149
+ instOpen.value = false
135
150
  try {
136
- const res = await api.instantiateChannelTemplate(t.id)
151
+ const options = t.knowledgeBaseCapable ? { enableKnowledgeBase: instKb.value } : undefined
152
+ const res = await api.instantiateChannelTemplate(t.id, undefined, options)
137
153
  const data = (res as unknown as { data?: { channelId: string, agentCount: number } })?.data
138
154
  message.success(tt('ctpl.kefkfnl030', { p0: t.name, p1: data?.agentCount ?? 0 }))
139
155
  }
@@ -277,7 +293,7 @@ useHead({ title: () => tt('titles.ctpl') })
277
293
  ghost
278
294
  :loading="instantiating === t.id"
279
295
  :title="$t('ctpl.knjomku002')"
280
- @click="instantiate(t)"
296
+ @click="openInstantiate(t)"
281
297
  >
282
298
  {{ $t('ctpl.k3mr1fo017') }}
283
299
  </a-button>
@@ -348,11 +364,34 @@ useHead({ title: () => tt('titles.ctpl') })
348
364
  </a-form-item>
349
365
  </a-form>
350
366
  </a-modal>
367
+
368
+ <a-modal
369
+ v-model:open="instOpen"
370
+ :title="tt('ctpl.kbInstTitle', { p0: instTarget?.name ?? '' })"
371
+ :ok-text="$t('ctpl.k3mr1fo017')"
372
+ :cancel-text="$t('common.cancel')"
373
+ :confirm-loading="instantiating === instTarget?.id"
374
+ @ok="confirmInstantiate"
375
+ >
376
+ <a-form layout="vertical">
377
+ <a-form-item :label="$t('ctpl.kbOption')">
378
+ <a-switch
379
+ v-model:checked="instKb"
380
+ :checked-children="$t('ctpl.kbOn')"
381
+ :un-checked-children="$t('ctpl.kbOff')"
382
+ />
383
+ </a-form-item>
384
+ <p class="kb-hint">
385
+ {{ $t('ctpl.kbHint') }}
386
+ </p>
387
+ </a-form>
388
+ </a-modal>
351
389
  </div>
352
390
  </template>
353
391
 
354
392
  <style scoped>
355
393
  .page { padding: 4px; }
394
+ .kb-hint { margin: 0; font-size: 12px; opacity: 0.6; line-height: 1.6; }
356
395
  .head {
357
396
  display: flex;
358
397
  align-items: center;
package/config.yml CHANGED
@@ -12,7 +12,7 @@
12
12
  app:
13
13
  name: AgentWorkShop
14
14
  title: AgentWorkShop
15
- version: 0.7.51
15
+ version: 0.7.52
16
16
  description: 基于 Nuxt 4 的配置驱动运行范式
17
17
 
18
18
  # 运行模式(dev/prod 实际由启动命令决定,此处仅作运行时展示)
package/docs/cli.en.md CHANGED
@@ -62,7 +62,7 @@ pnpm tui # the terminal workbench
62
62
  ### 3. Quick use via npx (no global install)
63
63
 
64
64
  ```bash
65
- npx agentworkshop start # fetch and start (pin a version with: npx agentworkshop@0.7.51 start)
65
+ npx agentworkshop start # fetch and start (pin a version with: npx agentworkshop@0.7.52 start)
66
66
  npx agentworkshop doctor # subcommands work as usual
67
67
  npx -p agentworkshop aw doctor # use -p when you want the name aw
68
68
  ```
@@ -79,7 +79,7 @@ npx -p agentworkshop aw doctor # use -p when you want the name aw
79
79
  | Package manager | `pnpm@11.9.0` (`packageManager`, needed only for source development) |
80
80
  | Module format | ESM (`type: module`) |
81
81
  | License | `PolyForm-Noncommercial-1.0.0` |
82
- | Current version | `0.7.51` (`package.json`) |
82
+ | Current version | `0.7.52` (`package.json`) |
83
83
 
84
84
  ## 2. First start (the Claude Code experience)
85
85
 
package/docs/cli.md CHANGED
@@ -60,7 +60,7 @@ pnpm tui # 终端工作台
60
60
  ### 3. npx 快速使用(免全局安装)
61
61
 
62
62
  ```bash
63
- npx agentworkshop start # 拉取并启动(可锁定版本: npx agentworkshop@0.7.51 start)
63
+ npx agentworkshop start # 拉取并启动(可锁定版本: npx agentworkshop@0.7.52 start)
64
64
  npx agentworkshop doctor # 子命令照常可用
65
65
  npx -p agentworkshop aw doctor # 需要 aw 这个名字时用 -p 指定包
66
66
  ```
@@ -76,7 +76,7 @@ npx -p agentworkshop aw doctor # 需要 aw 这个名字时用 -p 指定包
76
76
  | 包管理器 | `pnpm@11.9.0`(`packageManager`,仅源码开发需要) |
77
77
  | 模块形态 | ESM(`type: module`) |
78
78
  | 许可证 | `PolyForm-Noncommercial-1.0.0` |
79
- | 当前版本 | `0.7.51`(`package.json`) |
79
+ | 当前版本 | `0.7.52`(`package.json`) |
80
80
 
81
81
  ## 二、首次启动(Claude Code 式)
82
82
 
@@ -9,7 +9,7 @@
9
9
  >
10
10
  > Applies to: plugin system v2 has been available since **v0.7.29** (frontend component
11
11
  > injection / plugin settings / plugin i18n / runtime services surface); this document
12
- > describes **v0.7.51**. `ctx.sdkVersion` is currently `0.3.0`.
12
+ > describes **v0.7.52**. `ctx.sdkVersion` is currently `0.3.0`.
13
13
 
14
14
  ## 1. Folder layout & quick start
15
15
 
package/docs/plugins.md CHANGED
@@ -6,7 +6,7 @@
6
6
  > 本文是唯一权威参考;`docs/site/plugins/` 的分页文档与本文同源。
7
7
  >
8
8
  > 适用版本:插件系统 v2 自 **v0.7.29** 起可用(前端组件注入 / 插件设置 / 插件 i18n /
9
- > 运行时服务面);本文档对应当前版本 **v0.7.51**。`ctx.sdkVersion` 当前为 `0.3.0`。
9
+ > 运行时服务面);本文档对应当前版本 **v0.7.52**。`ctx.sdkVersion` 当前为 `0.3.0`。
10
10
 
11
11
  ## 一、目录结构与快速开始
12
12
 
package/docs/sdk.en.md CHANGED
@@ -7,7 +7,7 @@
7
7
 
8
8
  **SDK version constants**: server-side `SDK_VERSION = '0.3.0'`, browser-side `CLIENT_SDK_VERSION = '0.3.0'`.
9
9
  These two constants are the **interface version of the SDK itself** and evolve **independently**
10
- from the npm package version (the `version` field in `package.json`, currently 0.7.51) —
10
+ from the npm package version (the `version` field in `package.json`, currently 0.7.52) —
11
11
  them being out of sync is expected. Never use `SDK_VERSION` to infer the package version, or the reverse.
12
12
  **Module format**: ESM only (only `import` / `export`; there is no CJS entry).
13
13
  **Types**: `sdk/index.d.mts` and `sdk/client.d.mts` ship with the package, so TypeScript projects
package/docs/sdk.md CHANGED
@@ -5,7 +5,7 @@
5
5
  > 零第三方运行时依赖,Node ≥ 23.4 与现代浏览器双端可用。
6
6
 
7
7
  **SDK 版本常量**:服务端 `SDK_VERSION = '0.3.0'`,浏览器端 `CLIENT_SDK_VERSION = '0.3.0'`。
8
- 这两个常量是 **SDK 自身接口的版本号**,与 npm 包版本(`package.json` 的 `version`,当前 0.7.51)
8
+ 这两个常量是 **SDK 自身接口的版本号**,与 npm 包版本(`package.json` 的 `version`,当前 0.7.52)
9
9
  **各自独立演进** —— 常数不同步是预期行为,不要拿 `SDK_VERSION` 去推断包版本,反之亦然。
10
10
  **模块形态**:ESM only(只有 `import` / `export`,没有 CJS 入口)。
11
11
  **类型**:`sdk/index.d.mts`、`sdk/client.d.mts` 随包发布,TS 项目零配置获得提示(覆盖范围见 §7)。
@@ -1,32 +1,37 @@
1
- {
2
- "k117jag9001": "删除模板?(已实例化的 Channel 不受影响)",
3
- "knjomku002": "按模板新建 Channel(成员自动装配)",
4
- "k1f55q76003": "模板名称",
5
- "k40gkk004": "描述",
6
- "k1ju32o7005": "选择 lead 模板(可空)",
7
- "k5uq1js006": "Worker 成员模板(实例化时逐个克隆)",
8
- "kqmdkc9007": "选择成员模板(可空)",
9
- "k1q87yho008": "作业场景 Prompt(注入全部成员)",
10
- "kk4u5cr009": "工作目录(留空 = 实例化时默认)",
11
- "k3lrqn0010": "可见性",
12
- "k18gglgp011": "场景 + 工作目录 + 团队的组合模板;一键实例化为 Channel(成员自动装配)。模板按用户隔离,公开后全员可用。",
13
- "krpx6qa012": "返回工作区",
14
- "k1efixrj013": "新建模板",
15
- "ka1gpdj014": "admin 视图:可见全部用户的模板与创建者",
16
- "k3rx4ps015": "空团队",
17
- "k3xakp016": "删除",
18
- "k3mr1fo017": "实例化",
19
- "k19fglby018": "新建第一个 Channel 模板",
20
- "k17jfge3019": "私有(仅本人可见)",
21
- "k191u0u5020": "公开(全员可实例化,仅本人可修改)",
22
- "k3x23c021": "内置",
23
- "k3wv1t022": "公开",
24
- "k447jj023": "私有",
25
- "k1i0ji0y024": "模板名必填",
26
- "kyppebc025": "模板已创建;可在工作区左侧会话栏一键实例化挂载",
27
- "kkziya3026": "已公开:全员可实例化",
28
- "k1xxabaf027": "已转为私有",
29
- "k1oxfuqj028": "已删除模板",
30
- "k1f54iqd029": "模板中心",
31
- "kefkfnl030": "已实例化:{p0}(成员 {p1} 个),到工作区挂载使用"
32
- }
1
+ {
2
+ "k117jag9001": "删除模板?(已实例化的 Channel 不受影响)",
3
+ "knjomku002": "按模板新建 Channel(成员自动装配)",
4
+ "k1f55q76003": "模板名称",
5
+ "k40gkk004": "描述",
6
+ "k1ju32o7005": "选择 lead 模板(可空)",
7
+ "k5uq1js006": "Worker 成员模板(实例化时逐个克隆)",
8
+ "kqmdkc9007": "选择成员模板(可空)",
9
+ "k1q87yho008": "作业场景 Prompt(注入全部成员)",
10
+ "kk4u5cr009": "工作目录(留空 = 实例化时默认)",
11
+ "k3lrqn0010": "可见性",
12
+ "k18gglgp011": "场景 + 工作目录 + 团队的组合模板;一键实例化为 Channel(成员自动装配)。模板按用户隔离,公开后全员可用。",
13
+ "krpx6qa012": "返回工作区",
14
+ "k1efixrj013": "新建模板",
15
+ "ka1gpdj014": "admin 视图:可见全部用户的模板与创建者",
16
+ "k3rx4ps015": "空团队",
17
+ "k3xakp016": "删除",
18
+ "k3mr1fo017": "实例化",
19
+ "k19fglby018": "新建第一个 Channel 模板",
20
+ "k17jfge3019": "私有(仅本人可见)",
21
+ "k191u0u5020": "公开(全员可实例化,仅本人可修改)",
22
+ "k3x23c021": "内置",
23
+ "k3wv1t022": "公开",
24
+ "k447jj023": "私有",
25
+ "k1i0ji0y024": "模板名必填",
26
+ "kyppebc025": "模板已创建;可在工作区左侧会话栏一键实例化挂载",
27
+ "kkziya3026": "已公开:全员可实例化",
28
+ "k1xxabaf027": "已转为私有",
29
+ "k1oxfuqj028": "已删除模板",
30
+ "k1f54iqd029": "模板中心",
31
+ "kefkfnl030": "已实例化:{p0}(成员 {p1} 个),到工作区挂载使用",
32
+ "kbInstTitle": "实例化 {p0}",
33
+ "kbOption": "知识库集成(rag-bridge)",
34
+ "kbHint": "开启后本频道加载知识库插件:优化前先检索场景数据分析与物理机理,收口后由 lead 把经验沉淀入知识库;lead 还可用 team_grant_nodes 把自己绑定的节点授权给 worker。",
35
+ "kbOn": "开启",
36
+ "kbOff": "关闭"
37
+ }
@@ -471,6 +471,11 @@ export default {
471
471
  newTplTitle: 'New channel template',
472
472
  leadTplLabel: 'Lead template (cloned as the channel lead when instantiated)',
473
473
  kefkfnl030: 'Instantiated: {p0} ({p1} members); mount it from the workspace',
474
+ kbInstTitle: 'Instantiate {p0}',
475
+ kbOption: 'Knowledge base integration (rag-bridge)',
476
+ kbHint: 'When on, this channel loads the KB plugin: search scene data-analysis & physics knowledge before optimizing, and the lead sinks experience back after the loop closes; the lead can also grant its own bound nodes to workers via team_grant_nodes.',
477
+ kbOn: 'On',
478
+ kbOff: 'Off',
474
479
  k1f54iqd029: 'Template Hub',
475
480
  k117jag9001: 'Delete template? (Instantiated Channels are not affected)',
476
481
  knjomku002: 'Create Channel from template (members auto-assembled)',
@@ -471,6 +471,11 @@ export default {
471
471
  newTplTitle: '新建 Channel 模板',
472
472
  leadTplLabel: 'Lead 模板(实例化时克隆为 channel lead)',
473
473
  kefkfnl030: '已实例化:{p0}(成员 {p1} 个),到工作区挂载使用',
474
+ kbInstTitle: '实例化 {p0}',
475
+ kbOption: '知识库集成(rag-bridge)',
476
+ kbHint: '开启后本频道加载知识库插件:优化前先检索场景数据分析与物理机理,收口后由 lead 把经验沉淀入知识库;lead 还可用 team_grant_nodes 把自己绑定的节点授权给 worker。',
477
+ kbOn: '开启',
478
+ kbOff: '关闭',
474
479
  k1f54iqd029: '模板中心',
475
480
  k117jag9001: '删除模板?(已实例化的 Channel 不受影响)',
476
481
  knjomku002: '按模板新建 Channel(成员自动装配)',
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "agentworkshop",
3
- "version": "0.7.51",
3
+ "version": "0.7.52",
4
4
  "type": "module",
5
5
  "description": "AgentWorkShop \u8f6f\u4ef6\u5f00\u53d1\u7cfb\u7edf - \u57fa\u4e8e Nuxt 4 \u7684\u914d\u7f6e\u9a71\u52a8\u8fd0\u884c\u8303\u5f0f",
6
6
  "license": "PolyForm-Noncommercial-1.0.0",
@@ -0,0 +1,146 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * scripts/_audit/kb-team-mock-e2e.mjs —— 知识库集成 Channel + lead→worker 节点委派(mock 阶段验收)。
4
+ *
5
+ * 覆盖(无 LLM 依赖):
6
+ * 1) 模板知识库能力面:chtpl-generic-optimize-default / chtpl-aml-optimization-default 标记 knowledgeBaseCapable;
7
+ * 2) 实例化 enableKnowledgeBase=true → 频道插件开关含 rag-bridge=on,场景提示词含 KB 作业段;
8
+ * 3) 实例化 enableKnowledgeBase=false → rag-bridge=off;缺省 → 无显式行(平台默认);
9
+ * 4) 委派 REST:lead 绑定面内节点授予 worker(grantedByAgentId 溯源);
10
+ * 5) fail-closed:越面授予 403 / 授予 lead 自己 400;
11
+ * 6) 执行中授予:worker 有在飞任务时仍可被授予新节点;
12
+ * 7) 撤销:收回授予的节点;非 lead 授予且 lead 不持有的绑定不被误撤。
13
+ *
14
+ * 用法:AW_BASE=http://127.0.0.1:3456 node scripts/_audit/kb-team-mock-e2e.mjs
15
+ * 前置:全新实例(首注册即 admin)。脚本自行注册 admin 账号并搭一条 mock 产线。
16
+ */
17
+ const BASE = process.env.AW_BASE ?? 'http://127.0.0.1:3456'
18
+ const ADMIN = { email: process.env.AW_ADMIN_EMAIL ?? 'admin@awshop.local', password: process.env.AW_ADMIN_PASSWORD ?? 'Awshop@123!' }
19
+
20
+ let pass = 0
21
+ const fails = []
22
+ const ok = (name, cond, detail = '') => {
23
+ if (cond) { pass++; console.log(` PASS ${name}${detail ? ` — ${detail}` : ''}`) }
24
+ else { fails.push(name); console.log(` FAIL ${name}${detail ? ` — ${detail}` : ''}`) }
25
+ }
26
+ const section = t => console.log(`\n━━━ ${t} ━━━`)
27
+ const sleep = ms => new Promise(r => setTimeout(r, ms))
28
+
29
+ async function api(method, path, { body, token } = {}) {
30
+ const res = await fetch(BASE + path, {
31
+ method,
32
+ headers: { 'content-type': 'application/json', ...(token ? { authorization: `Bearer ${token}` } : {}) },
33
+ body: body != null ? JSON.stringify(body) : undefined,
34
+ signal: AbortSignal.timeout(30000),
35
+ })
36
+ const json = await res.json().catch(() => null)
37
+ return { status: res.status, json }
38
+ }
39
+
40
+ const TAG = `kbmock-${new Date().toISOString().slice(5, 16).replace(/[-T:]/g, '')}`
41
+
42
+ async function main() {
43
+ section('S0 管理员就绪(全新实例首注册即 admin)')
44
+ const reg = await api('POST', '/api/users/register', { body: { ...ADMIN, name: 'kb-mock-admin' } })
45
+ const token = reg.json?.data?.token ?? (await api('POST', '/api/users/login', { body: { email: ADMIN.email, password: ADMIN.password } })).json?.data?.token
46
+ ok('管理员 token 可用', Boolean(token))
47
+ const auth = { token }
48
+
49
+ section('S1 模板知识库能力面')
50
+ const tplList = (await api('GET', '/api/workshop/channel-templates', auth)).json?.data ?? []
51
+ const generic = tplList.find(t => t.id === 'chtpl-generic-optimize-default')
52
+ const optTpl = tplList.find(t => t.id === 'chtpl-aml-optimization-default')
53
+ ok('内置模板存在「通用闭环优化频道(标准)」', Boolean(generic), generic?.name)
54
+ ok('通用模板标记 knowledgeBaseCapable', generic?.knowledgeBaseCapable === true)
55
+ ok('工艺优化通道标记 knowledgeBaseCapable', optTpl?.knowledgeBaseCapable === true)
56
+ ok('其他模板不带该标记', tplList.find(t => t.id === 'chtpl-default-fullstack')?.knowledgeBaseCapable !== true)
57
+
58
+ section('S2 实例化:enableKnowledgeBase=true → rag-bridge 开 + KB 作业段')
59
+ const inst1 = (await api('POST', '/api/workshop/channel-templates/chtpl-generic-optimize-default/instantiate', { body: { name: `${TAG}-kb-on`, enableKnowledgeBase: true }, ...auth })).json?.data
60
+ ok('通用频道实例化成功', Boolean(inst1?.channelId), `agents=${inst1?.agentCount}`)
61
+ const ch1 = (await api('GET', `/api/workshop/channels/${inst1.channelId}`, auth)).json?.data
62
+ ok('场景提示词含知识库作业段', String(ch1?.scenarioPrompt ?? '').includes('知识库集成') && String(ch1?.scenarioPrompt ?? '').includes('kb_agent'))
63
+ const plug1 = (await api('GET', `/api/workshop/channels/${inst1.channelId}/plugins`, auth)).json?.data
64
+ const rb1 = (Array.isArray(plug1?.plugins) ? plug1.plugins : plug1 ?? []).find?.(p => p?.name === 'rag-bridge')
65
+ ?? (Array.isArray(plug1) ? plug1 : []).find(p => p?.name === 'rag-bridge')
66
+ ok('频道插件开关含 rag-bridge=on', Boolean(rb1 && rb1.enabled !== false), JSON.stringify(rb1 ?? plug1 ?? {}).slice(0, 120))
67
+ const members1 = (await api('GET', `/api/workshop/channels/${inst1.channelId}/agents`, auth)).json?.data ?? []
68
+ ok('频道含 lead + worker', members1.some(m => m.role === 'lead') && members1.filter(m => m.role === 'worker').length >= 2, `members=${members1.length}`)
69
+
70
+ section('S3 实例化:enableKnowledgeBase=false 与缺省行为')
71
+ const inst2 = (await api('POST', '/api/workshop/channel-templates/chtpl-aml-optimization-default/instantiate', { body: { name: `${TAG}-kb-off`, enableKnowledgeBase: false }, ...auth })).json?.data
72
+ const plug2 = (await api('GET', `/api/workshop/channels/${inst2.channelId}/plugins`, auth)).json?.data
73
+ const flat2 = Array.isArray(plug2?.plugins) ? plug2.plugins : (Array.isArray(plug2) ? plug2 : [])
74
+ ok('显式 false → rag-bridge=off', flat2.some(p => p?.name === 'rag-bridge' && p.enabled === false), JSON.stringify(flat2).slice(0, 120))
75
+ const inst3 = (await api('POST', '/api/workshop/channel-templates/chtpl-aml-optimization-default/instantiate', { body: { name: `${TAG}-kb-default` }, ...auth })).json?.data
76
+ const plug3 = (await api('GET', `/api/workshop/channels/${inst3.channelId}/plugins`, auth)).json?.data
77
+ const flat3 = Array.isArray(plug3?.plugins) ? plug3.plugins : (Array.isArray(plug3) ? plug3 : [])
78
+ const rb3 = flat3.find(p => p?.name === 'rag-bridge')
79
+ ok('缺省 → rag-bridge 保持平台默认(未被显式停用)', !rb3 || rb3.enabled !== false, JSON.stringify(flat3).slice(0, 120))
80
+
81
+ section('S4 搭 mock 产线(建线 + 模板 + 数采/数控节点)')
82
+ const line = (await api('POST', '/api/workshop/dcw/lines', { body: { name: `KBMock线-${TAG}`, description: 'kb-team mock e2e' }, ...auth })).json?.data
83
+ const lineId = line?.line?.id ?? line?.id
84
+ ok('建线成功', Boolean(lineId), lineId)
85
+ const dcwTpl = (await api('POST', '/api/workshop/dcw/templates', { body: { name: `kbmock-sp-tpl-${TAG}`, ch: '温度设定', unit: '℃', min: 150, max: 220, decimals: 1 }, ...auth })).json?.data
86
+ const daqTpl = (await api('POST', '/api/workshop/daq/templates', { body: { name: `kbmock-temp-tpl-${TAG}`, ch: '温度', unit: '℃', min: 0, max: 300, decimals: 1 }, ...auth })).json?.data
87
+ const dcwTplRef = dcwTpl?.template?.key ?? dcwTpl?.key
88
+ const daqTplRef = daqTpl?.template?.key ?? daqTpl?.key
89
+ ok('节点模板创建成功', Boolean(dcwTplRef) && Boolean(daqTplRef), `dcw=${dcwTplRef} daq=${daqTplRef}`)
90
+ const dcw = (await api('POST', '/api/workshop/dcw', { body: { name: `kbmock-sp-${TAG}`, templateRef: dcwTplRef, driver: 'mock', unit: '℃', min: 150, max: 220, stepLimit: 5, lineId }, ...auth })).json
91
+ const daq = (await api('POST', '/api/workshop/daq', { body: { name: `kbmock-temp-${TAG}`, templateRef: daqTplRef, driver: 'mock', intervalMs: 1000, publishIntervalMs: 0, lineId }, ...auth })).json
92
+ const dcwId = dcw?.data?.node?.id
93
+ const daqId = daq?.data?.node?.id
94
+ ok('数采/数控节点创建成功', Boolean(daqId) && Boolean(dcwId), `daq=${daqId} dcw=${dcwId}`)
95
+
96
+ section('S5 lead 绑定 + 委派核心面')
97
+ const lead = members1.find(m => m.role === 'lead')
98
+ const worker = members1.find(m => m.role === 'worker')
99
+ const b1 = await api('POST', '/api/workshop/agent-tools/bindings', { body: { agentId: lead.id, nodeId: dcwId, kind: 'dcw', mode: 'manual' }, ...auth })
100
+ const b2 = await api('POST', '/api/workshop/agent-tools/bindings', { body: { agentId: lead.id, nodeId: daqId, kind: 'daq', mode: 'auto' }, ...auth })
101
+ ok('lead 绑定 dcw+daq 成功', b1.status === 200 && b2.status === 200, `dcw=${b1.status} daq=${b2.status}`)
102
+
103
+ const grant = await api('POST', '/api/workshop/agent-tools/bindings/grant', { body: { channelId: inst1.channelId, agentId: worker.id, nodeIds: [dcwId, daqId] }, ...auth })
104
+ ok('委派授予成功(整单)', grant.status === 200, JSON.stringify(grant.json?.data ?? grant.json).slice(0, 120))
105
+ const granted = grant.json?.data?.granted ?? []
106
+ ok('授予绑定带 lead 溯源', granted.length === 2 && granted.every(g => g.grantedByAgentId === lead.id), `n=${granted.length}`)
107
+ ok('dcw 委派缺省随 lead 的 manual 模式', granted.find(g => g.kind === 'dcw')?.mode === 'manual')
108
+ const workerBindings = (await api('GET', `/api/workshop/agent-tools/bindings?agentId=${worker.id}`, auth)).json?.data
109
+ const wbFlat = Array.isArray(workerBindings) ? workerBindings : (workerBindings?.bindings ?? [])
110
+ ok('worker 绑定面已含委派节点', wbFlat.some(b => b.nodeId === dcwId) && wbFlat.some(b => b.nodeId === daqId), `n=${wbFlat.length}`)
111
+
112
+ section('S6 fail-closed:越面授予 / 授予 lead 自己')
113
+ const bad = await api('POST', '/api/workshop/agent-tools/bindings/grant', { body: { channelId: inst1.channelId, agentId: worker.id, nodeIds: [`ghost-${TAG}`] }, ...auth })
114
+ const badCode = bad.json?.code ?? bad.json?.data?.code
115
+ ok('越面授予被拒(403 DELEGATION_NOT_OWNED)', bad.status === 403 && badCode === 'DELEGATION_NOT_OWNED', `status=${bad.status} code=${badCode}`)
116
+ const self = await api('POST', '/api/workshop/agent-tools/bindings/grant', { body: { channelId: inst1.channelId, agentId: lead.id, nodeIds: [dcwId] }, ...auth })
117
+ ok('授予 lead 自己被拒(400)', self.status === 400, `status=${self.status}`)
118
+
119
+ section('S7 执行中授予(worker 有在飞任务时仍可授权)')
120
+ const task = (await api('POST', `/api/workshop/channels/${inst1.channelId}/tasks`, { body: { title: `巡检-${TAG}`, description: '读取授权节点并汇报(委派执行中授予验证)', assigneeId: worker.id }, ...auth })).json?.data
121
+ ok('worker 根任务已创建', Boolean(task?.id), task?.id)
122
+ await sleep(500)
123
+ const midGrant = await api('POST', '/api/workshop/agent-tools/bindings/grant', { body: { channelId: inst1.channelId, agentId: worker.id, nodeIds: [dcwId], mode: 'auto' }, ...auth })
124
+ ok('执行中授予成功(模式覆盖 auto)', midGrant.status === 200, JSON.stringify(midGrant.json?.data ?? {}).slice(0, 100))
125
+ await api('POST', `/api/workshop/channels/${inst1.channelId}/tasks/${task.id}/cancel`, { ...auth }).catch(() => {})
126
+
127
+ section('S8 撤销')
128
+ const revoke = await api('POST', '/api/workshop/agent-tools/bindings/revoke', { body: { channelId: inst1.channelId, agentId: worker.id, nodeIds: [daqId] }, ...auth })
129
+ const results = revoke.json?.data?.results ?? []
130
+ ok('撤销 daq 委派成功', revoke.status === 200 && results.every(r => r.revoked), JSON.stringify(results).slice(0, 100))
131
+ const afterRevoke = (await api('GET', `/api/workshop/agent-tools/bindings?agentId=${worker.id}`, auth)).json?.data
132
+ const arFlat = Array.isArray(afterRevoke) ? afterRevoke : (afterRevoke?.bindings ?? [])
133
+ ok('撤销后 worker 不再持有该节点', !arFlat.some(b => b.nodeId === daqId), `剩余=${arFlat.length}`)
134
+
135
+ console.log(`\n════ 结果: ${pass} PASS / ${fails.length} FAIL ════`)
136
+ if (fails.length) {
137
+ console.log('失败项:')
138
+ for (const f of fails) console.log(` - ${f}`)
139
+ process.exit(1)
140
+ }
141
+ }
142
+
143
+ main().catch((err) => {
144
+ console.error('E2E 致命异常:', err)
145
+ process.exit(1)
146
+ })