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.
- package/.AgentWorkShop/prompts/host-tools.json +2028 -1955
- package/.output/.AgentWorkShop/prompts/host-tools.json +2028 -1955
- package/.output/nitro.json +1 -1
- package/.output/public/_nuxt/{CdIsmU5a2.js → 4wrEQ3np2.js} +1 -1
- package/.output/public/_nuxt/{asmJ99nX2.js → B8zP7kaj2.js} +1 -1
- package/.output/public/_nuxt/{D89BUtx6.js → B9cGf8mg.js} +1 -1
- package/.output/public/_nuxt/{CP0I2l-6.js → BVzw5a_0.js} +1 -1
- package/.output/public/_nuxt/{CFQSjB1h.js → B_opxrHJ.js} +1 -1
- package/.output/public/_nuxt/{BGAaKBeo2.js → BiUhxH3t2.js} +1 -1
- package/.output/public/_nuxt/{B7jlMWsz.js → C00Rd6Cg.js} +1 -1
- package/.output/public/_nuxt/{BOmDHp5L.js → CGQvF-Gg.js} +3 -3
- package/.output/public/_nuxt/CTvh8v4T.js +1 -0
- package/.output/public/_nuxt/{B9QzrmgE.js → Cbeifv55.js} +1 -1
- package/.output/public/_nuxt/{BWU1pvLL.js → CcGuXiOa.js} +1 -1
- package/.output/public/_nuxt/{zh-S_7rN2.js → CkPxL4UX2.js} +1 -1
- package/.output/public/_nuxt/{DzfVS8N72.js → D_Ce9Fon2.js} +1 -1
- package/.output/public/_nuxt/{DClNt1uS.js → Da90gveK.js} +1 -1
- package/.output/public/_nuxt/builds/latest.json +1 -1
- package/.output/public/_nuxt/builds/meta/c64014ca-3595-4b7a-a5ca-055687c83ba2.json +1 -0
- package/.output/public/_nuxt/channel-templates.DkNZg-lF.css +1 -0
- package/.output/public/_nuxt/{JAM4aNC_.js → evt5VGDh.js} +1 -1
- package/.output/public/_nuxt/{DhFv8S2Z.js → mNnuUoSy.js} +1 -1
- package/.output/public/_nuxt/{CU-mhG0-.js → mgWHSRc8.js} +1 -1
- package/.output/public/_nuxt/{jRTz0hjN2.js → qPsch_ny2.js} +1 -1
- package/.output/public/_nuxt/{lWYQbIR3.js → ty5W5QwO.js} +1 -1
- package/.output/public/_nuxt/{DMYYS5sK.js → xQX5r6tW.js} +1 -1
- package/.output/server/chunks/_/character-asset.repo.mjs +1 -1
- package/.output/server/chunks/_/entity.mjs +1 -1
- package/.output/server/chunks/_/host-bindings.mjs +1 -1
- package/.output/server/chunks/_/nitro.mjs +1209 -967
- package/.output/server/chunks/_/nitro.mjs.map +1 -1
- package/.output/server/chunks/_/scene-layout.repo.mjs +1 -1
- package/.output/server/chunks/build/TownView-fP9BiALv.mjs +1 -1
- package/.output/server/chunks/build/{_wsId_-DPy2BXRd.mjs → _wsId_-C4L9fVHC.mjs} +2 -2
- package/.output/server/chunks/build/{_wsId_-DPy2BXRd.mjs.map → _wsId_-C4L9fVHC.mjs.map} +1 -1
- package/.output/server/chunks/build/{agents-CDLcboCv.mjs → agents-ydYu-Ol9.mjs} +6 -6
- package/.output/server/chunks/build/{agents-CDLcboCv.mjs.map → agents-ydYu-Ol9.mjs.map} +1 -1
- package/.output/server/chunks/build/{channel-templates-DjEsj0_v.mjs → channel-templates-DP1ndA5K.mjs} +114 -25
- package/.output/server/chunks/build/channel-templates-DP1ndA5K.mjs.map +1 -0
- package/.output/server/chunks/build/daq-N69AOtgw.mjs +1 -1
- package/.output/server/chunks/build/dcw-CN9d3Rs7.mjs +1 -1
- package/.output/server/chunks/build/{pages-rZKH72eC.mjs → pages-BzmrmLL_.mjs} +3 -3
- package/.output/server/chunks/build/{pages-rZKH72eC.mjs.map → pages-BzmrmLL_.mjs.map} +1 -1
- package/.output/server/chunks/build/{schedules-lo4bfgVt.mjs → schedules-BYR-lA1k.mjs} +2 -2
- package/.output/server/chunks/build/{schedules-lo4bfgVt.mjs.map → schedules-BYR-lA1k.mjs.map} +1 -1
- package/.output/server/chunks/build/{settings-CAJWvul5.mjs → settings-UyZ78w2e.mjs} +2 -2
- package/.output/server/chunks/build/{settings-CAJWvul5.mjs.map → settings-UyZ78w2e.mjs.map} +1 -1
- package/.output/server/chunks/build/{teams-DBBvIToa.mjs → teams-D-Y5mzU7.mjs} +8 -8
- package/.output/server/chunks/build/{teams-DBBvIToa.mjs.map → teams-D-Y5mzU7.mjs.map} +1 -1
- package/.output/server/chunks/build/types-D6J7slEa.mjs +1 -1
- package/.output/server/chunks/build/{useAgentHarnessOptions-D6SJ_uUr.mjs → useAgentHarnessOptions-CRyQYYY0.mjs} +2 -2
- package/.output/server/chunks/build/{useAgentHarnessOptions-D6SJ_uUr.mjs.map → useAgentHarnessOptions-CRyQYYY0.mjs.map} +1 -1
- package/.output/server/chunks/build/{useAgentTemplateActions-CdG4g_PF.mjs → useAgentTemplateActions-CaRsOBmB.mjs} +2 -2
- package/.output/server/chunks/build/{useAgentTemplateActions-CdG4g_PF.mjs.map → useAgentTemplateActions-CaRsOBmB.mjs.map} +1 -1
- package/.output/server/chunks/build/{useAgentTemplateForm-a5y-N5sB.mjs → useAgentTemplateForm-ChiIuPYr.mjs} +2 -2
- package/.output/server/chunks/build/{useAgentTemplateForm-a5y-N5sB.mjs.map → useAgentTemplateForm-ChiIuPYr.mjs.map} +1 -1
- package/.output/server/chunks/build/{useAgentTemplatesCatalog-pBVcUuN3.mjs → useAgentTemplatesCatalog-Bf5hk6Jf.mjs} +2 -2
- package/.output/server/chunks/build/{useAgentTemplatesCatalog-pBVcUuN3.mjs.map → useAgentTemplatesCatalog-Bf5hk6Jf.mjs.map} +1 -1
- package/.output/server/chunks/build/useDaqAddNode-kW7uTSMQ.mjs +1 -1
- package/.output/server/chunks/build/useDaqDetailNode-D_vhG0jF.mjs +1 -1
- package/.output/server/chunks/build/useDaqDetailParams-JfqHvTxr.mjs +1 -1
- package/.output/server/chunks/build/useDaqFilters-BUQtZ82a.mjs +1 -1
- package/.output/server/chunks/build/useDaqStream-wOxZcMDA.mjs +1 -1
- package/.output/server/chunks/build/useDaqTemplates-BqQRdrIm.mjs +1 -1
- package/.output/server/chunks/build/{useDashboardData-Do_Vsepa.mjs → useDashboardData-CNOY4Bi3.mjs} +2 -2
- package/.output/server/chunks/build/{useDashboardData-Do_Vsepa.mjs.map → useDashboardData-CNOY4Bi3.mjs.map} +1 -1
- package/.output/server/chunks/build/useDcwAddNode-C1HDP3yG.mjs +1 -1
- package/.output/server/chunks/build/useDcwStream-D04kCV3J.mjs +1 -1
- package/.output/server/chunks/build/{useTeamActions-C4n-taBk.mjs → useTeamActions-C51ciLb0.mjs} +2 -2
- package/.output/server/chunks/build/{useTeamActions-C4n-taBk.mjs.map → useTeamActions-C51ciLb0.mjs.map} +1 -1
- package/.output/server/chunks/build/{useTeamAddMemberDialog-Cp_z3nMa.mjs → useTeamAddMemberDialog-DthpCMP8.mjs} +2 -2
- package/.output/server/chunks/build/{useTeamAddMemberDialog-Cp_z3nMa.mjs.map → useTeamAddMemberDialog-DthpCMP8.mjs.map} +1 -1
- package/.output/server/chunks/build/{useTeamCreateDialog-C8LKUoe2.mjs → useTeamCreateDialog-Dc2KTwyg.mjs} +2 -2
- package/.output/server/chunks/build/{useTeamCreateDialog-C8LKUoe2.mjs.map → useTeamCreateDialog-Dc2KTwyg.mjs.map} +1 -1
- package/.output/server/chunks/build/{useTeamDeployDialog-wdBVsNWY.mjs → useTeamDeployDialog-CXpvPnJD.mjs} +2 -2
- package/.output/server/chunks/build/{useTeamDeployDialog-wdBVsNWY.mjs.map → useTeamDeployDialog-CXpvPnJD.mjs.map} +1 -1
- package/.output/server/chunks/build/{useTeamPluginDialog-CIk8G8nI.mjs → useTeamPluginDialog-DTs-7SSm.mjs} +2 -2
- package/.output/server/chunks/build/{useTeamPluginDialog-CIk8G8nI.mjs.map → useTeamPluginDialog-DTs-7SSm.mjs.map} +1 -1
- package/.output/server/chunks/build/{useTeamsCatalog-D6TULzmS.mjs → useTeamsCatalog-CcpetYyW.mjs} +2 -2
- package/.output/server/chunks/build/{useTeamsCatalog-D6TULzmS.mjs.map → useTeamsCatalog-CcpetYyW.mjs.map} +1 -1
- package/.output/server/chunks/build/{useWorkshopApi-B1B9vd4m.mjs → useWorkshopApi-CO3ophqt.mjs} +5 -2
- package/.output/server/chunks/build/{useWorkshopApi-B1B9vd4m.mjs.map → useWorkshopApi-CO3ophqt.mjs.map} +1 -1
- package/.output/server/chunks/routes/api/mcp/workshop.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/agent-tools/bindings/grant.post.mjs +54 -0
- package/.output/server/chunks/routes/api/workshop/agent-tools/bindings/grant.post.mjs.map +1 -0
- package/.output/server/chunks/routes/api/workshop/agent-tools/bindings/revoke.post.mjs +51 -0
- package/.output/server/chunks/routes/api/workshop/agent-tools/bindings/revoke.post.mjs.map +1 -0
- package/.output/server/chunks/routes/api/workshop/agent-tools/index2.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/agent-tools/invoke.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/agent-tools/list.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/aml/datasets/_id/preview.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/aml/datasets/_id_.delete.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/aml/datasets/_id_.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/aml/datasets/_id_.patch.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/aml/entities/prune.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/aml/env/recheck.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/aml/env/uv.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/aml/env/venv.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/aml/index.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/aml/index.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/aml/index2.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/aml/index3.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/aml/index3.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/aml/index4.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/aml/index5.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/aml/index6.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/aml/index7.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/aml/jobs/_id/cancel.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/aml/jobs/_id/logs.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/aml/jobs/_id/retry.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/aml/jobs/_id_.delete.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/aml/jobs/_id_.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/aml/models/_id/predict.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/aml/models/_id/promote.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/aml/models/_id_.delete.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/aml/models/_id_.patch.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/aml/training-plans/_id/train.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/aml/training-plans/_id_.delete.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/aml/training-plans/_id_.patch.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/aml/twin/providers.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/assets/index.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/assets/index2.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/channel-templates/_id/instantiate.post.mjs +5 -4
- package/.output/server/chunks/routes/api/workshop/channel-templates/_id/instantiate.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/channels/_id/activate.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/channels/_id/chat/index.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/channels/_id/index.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/channels/_id/index.put.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/channels/_id/index3.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/channels/_id/index4.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/channels/_id/index5.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/channels/_id/terminals.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/channels/_id/twin-profile.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/channels/_id/twin-profile.patch.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/channels/index.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/channels.post.mjs +4 -4
- package/.output/server/chunks/routes/api/workshop/daq/_id/bind.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/daq/_id/bindings.put.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/daq/_id/frames/content.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/daq/_id/frames.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/daq/_id/samples.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/daq/_id/test.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/daq/_id_.delete.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/daq/_id_.patch.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/daq/alarms/_id/ack.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/daq/controller.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/daq/index.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/daq/infra/reconnect.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/daq/infra.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/daq/templates/_key_.delete.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/daq/templates/_key_.patch.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/daq/test-driver.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/_id/bind.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/_id/bindings.put.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/_id/param-ledger.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/_id/read.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/_id/test.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/_id/write.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/_id_.delete.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/_id_.patch.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/controller.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/index.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/index.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/index2.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/index2.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/index3.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/index3.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/index4.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/index4.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/index5.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/index5.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/index6.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/journal/node/_nodeId/rollback.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/line/query.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/lines/_id/start.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/lines/_id/stop.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/lines/_id_.delete.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id/judge.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id/rollback.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id/series.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id_.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/params/_id/read.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/params/_id/write.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/params/_id_.delete.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/params/_id_.patch.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/products/_id_.delete.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/products/_id_.patch.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/apply.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/mark-good.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/rollback-good.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id_.delete.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/runs/_id/close.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/runs/_id/data.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/runs/_id/rollback.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/templates/_key_.delete.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/templates/_key_.patch.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/test-driver.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/device-twins/_id/control.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/device-twins/_id/telemetry.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/device-twins/_id_.delete.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/device-twins/_id_.patch.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/harnesses/_id/providers.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/harnesses.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/hitl/pending.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/hitl/respond.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/index.put.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/index2.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/index3.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/index4.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/index5.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/index5.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/index6.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/index6.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/index7.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/plugins/_name/disable.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/plugins/_name/enable.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/scene/layouts/_channelId_.delete.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/scene/layouts/_channelId_.put.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/teams/_id/deploy.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/teams/_id/index.put.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/teams/_id/index2.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/workspaces/_id/channel-templates/_tplId_.post.mjs +2 -2
- package/.output/server/chunks/routes/renderer.mjs +2 -2
- package/.output/server/chunks/virtual/entry.mjs +29 -19
- package/.output/server/chunks/virtual/precomputed.mjs +1 -1
- package/.output/server/package.json +1 -1
- package/README-zh.md +2 -2
- package/README.md +2 -2
- package/app/composables/workshop/useWorkshopApi.ts +4 -2
- package/app/pages/workshop/channel-templates.vue +43 -4
- package/config.yml +1 -1
- package/docs/cli.en.md +2 -2
- package/docs/cli.md +2 -2
- package/docs/plugins.en.md +1 -1
- package/docs/plugins.md +1 -1
- package/docs/sdk.en.md +1 -1
- package/docs/sdk.md +1 -1
- package/i18n/dicts/ctpl.json +37 -32
- package/i18n/locales/en.ts +5 -0
- package/i18n/locales/zh-CN.ts +5 -0
- package/package.json +1 -1
- package/scripts/_audit/kb-team-mock-e2e.mjs +146 -0
- package/scripts/_audit/kb-team-omp-e2e.mjs +229 -0
- package/server/api/workshop/agent-tools/bindings/grant.post.ts +45 -0
- package/server/api/workshop/agent-tools/bindings/revoke.post.ts +42 -0
- package/server/api/workshop/channel-templates/[id]/instantiate.post.ts +2 -1
- package/server/services/workshop/agents/host-tool-bridge/dispatch.ts +6 -1
- package/server/services/workshop/agents/host-tool-bridge/tools/tasks.ts +15 -2
- package/server/services/workshop/agents/host-tool-bridge/tools/team-delegation.ts +104 -0
- package/server/services/workshop/agents/node-bindings.repo.ts +10 -1
- package/server/services/workshop/agents/node-delegation.ts +150 -0
- package/server/services/workshop/agents/tool-classes.ts +2 -0
- package/server/services/workshop/db/database/seed.ts +20 -0
- package/server/services/workshop/runtime/manager/channel-templates.ts +26 -2
- package/server/services/workshop/runtime/manager/types.ts +2 -0
- package/.output/public/_nuxt/8FXd9As6.js +0 -1
- package/.output/public/_nuxt/builds/meta/912eb5bb-670e-4cc8-b21d-7fc097723466.json +0 -1
- package/.output/public/_nuxt/channel-templates.DplM1pJ3.css +0 -1
- package/.output/server/chunks/build/channel-templates-DjEsj0_v.mjs.map +0 -1
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
|
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
|
|
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="
|
|
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
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.
|
|
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.
|
|
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.
|
|
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.
|
|
79
|
+
| 当前版本 | `0.7.52`(`package.json`) |
|
|
80
80
|
|
|
81
81
|
## 二、首次启动(Claude Code 式)
|
|
82
82
|
|
package/docs/plugins.en.md
CHANGED
|
@@ -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.
|
|
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
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.
|
|
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.
|
|
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)。
|
package/i18n/dicts/ctpl.json
CHANGED
|
@@ -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
|
+
}
|
package/i18n/locales/en.ts
CHANGED
|
@@ -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)',
|
package/i18n/locales/zh-CN.ts
CHANGED
|
@@ -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.
|
|
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
|
+
})
|