agentworkshop 0.7.24 → 0.7.27
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/.output/nitro.json +1 -1
- package/.output/public/_nuxt/2jaJHWIJ.js +1 -0
- package/.output/public/_nuxt/B7gZokg82.js +209 -0
- package/.output/public/_nuxt/{Dfe8vXdG.js → B8kt898d.js} +1 -1
- package/.output/public/_nuxt/{BvNJUu3s.js → BFGpEo8S.js} +1 -1
- package/.output/public/_nuxt/{BAfp6tmu.js → BG4zduPf.js} +5 -5
- package/.output/public/_nuxt/{BMb80_tm.js → BGhOrgle.js} +1 -1
- package/.output/public/_nuxt/{Bc-_IsBP.js → BHcpzI2n.js} +1 -1
- package/.output/public/_nuxt/{Djir5rSD.js → BTLEvDxM.js} +1 -1
- package/.output/public/_nuxt/{b50gYVZl.js → BWyR3awA.js} +1 -1
- package/.output/public/_nuxt/Bc89zKq2.js +1 -0
- package/.output/public/_nuxt/{CxY6LfeN.js → BetmGSO4.js} +1 -1
- package/.output/public/_nuxt/{DAR70Lf52.js → BgCrZKv_2.js} +1 -1
- package/.output/public/_nuxt/{DUToq-k_.js → BowTbasd.js} +1 -1
- package/.output/public/_nuxt/{D6HDb-vN2.js → BvtknqSC2.js} +1 -1
- package/.output/public/_nuxt/{CLZWFhZC.js → CTfqWGdy.js} +1 -1
- package/.output/public/_nuxt/Chc5pfAA.js +1 -0
- package/.output/public/_nuxt/CobSUzQv.js +2 -0
- package/.output/public/_nuxt/{kZV5TQvh2.js → CucID8qg2.js} +1 -1
- package/.output/public/_nuxt/{CAGL7TNK.js → DHbTyoAV.js} +1 -1
- package/.output/public/_nuxt/{DSa2O56y.js → DfLUN8kY.js} +1 -1
- package/.output/public/_nuxt/{Coik560n.js → DjU9Dx5Y.js} +1 -1
- package/.output/public/_nuxt/DnziMlcX.js +1 -0
- package/.output/public/_nuxt/{Ct68Z0232.js → DosOJEmZ2.js} +1 -1
- package/.output/public/_nuxt/{CDLv-n51.js → Q_SJDSgx.js} +1 -1
- package/.output/public/_nuxt/{TownView.zu2rU5nS.css → TownView.CtskuMXS.css} +1 -1
- package/.output/public/_nuxt/{CuVGPuP1.js → XY2z78rj.js} +1 -1
- package/.output/public/_nuxt/_id_.DdbYeLqn.css +1 -0
- package/.output/public/_nuxt/{C1CSiSBN.js → bFnZa2yd.js} +1 -1
- package/.output/public/_nuxt/builds/latest.json +1 -1
- package/.output/public/_nuxt/builds/meta/f7a8e33d-5422-45ac-895d-27168f97e3ad.json +1 -0
- package/.output/public/_nuxt/daq.DGV9QS8d.css +1 -0
- package/.output/public/_nuxt/{entry.AZM1Culo.css → entry.BN02X8iR.css} +1 -1
- package/.output/public/_nuxt/{X6IraCTB.js → rkVgzg62.js} +1 -1
- package/.output/public/_nuxt/settings.W6qrYAui.css +1 -0
- package/.output/public/_nuxt/teams.BBXVkyKq.css +1 -0
- package/.output/public/assets/game/character/yangyang-walk.glb +0 -0
- package/.output/server/chunks/_/host-bindings.mjs +1 -1
- package/.output/server/chunks/_/nitro.mjs +1013 -844
- package/.output/server/chunks/_/nitro.mjs.map +1 -1
- package/.output/server/chunks/build/{TownView-DxeQe1Bl.mjs → TownView-ftIylqiD.mjs} +178 -151
- package/.output/server/chunks/build/{TownView-DxeQe1Bl.mjs.map → TownView-ftIylqiD.mjs.map} +1 -1
- package/.output/server/chunks/build/{_id_-DQDqj-cZ.mjs → _id_-3Axz2-gV.mjs} +35 -35
- package/.output/server/chunks/build/{_id_-DQDqj-cZ.mjs.map → _id_-3Axz2-gV.mjs.map} +1 -1
- package/.output/server/chunks/build/{_id_-DY6v6sqB.mjs → _id_-CahfkmEt.mjs} +5 -5
- package/.output/server/chunks/build/{_id_-DY6v6sqB.mjs.map → _id_-CahfkmEt.mjs.map} +1 -1
- package/.output/server/chunks/build/{_wsId_-D38Vx6Ky.mjs → _wsId_-BymlQhzS.mjs} +7 -7
- package/.output/server/chunks/build/{_wsId_-D38Vx6Ky.mjs.map → _wsId_-BymlQhzS.mjs.map} +1 -1
- package/.output/server/chunks/build/{agents-GnmUGZir.mjs → agents-DuMiSWKp.mjs} +4 -4
- package/.output/server/chunks/build/{agents-GnmUGZir.mjs.map → agents-DuMiSWKp.mjs.map} +1 -1
- package/.output/server/chunks/build/{channel-templates-B4z6v8Z5.mjs → channel-templates-BStqJ-of.mjs} +2 -2
- package/.output/server/chunks/build/{channel-templates-B4z6v8Z5.mjs.map → channel-templates-BStqJ-of.mjs.map} +1 -1
- package/.output/server/chunks/build/{checkbox-dzcpU_Cd.mjs → checkbox-C1gABOca.mjs} +4 -4
- package/.output/server/chunks/build/{checkbox-dzcpU_Cd.mjs.map → checkbox-C1gABOca.mjs.map} +1 -1
- package/.output/server/chunks/build/{daq-B-3xCp_2.mjs → daq-ChYCABz1.mjs} +312 -426
- package/.output/server/chunks/build/daq-ChYCABz1.mjs.map +1 -0
- package/.output/server/chunks/build/{dcw-BL2dhuz7.mjs → dcw-CcQNGggh.mjs} +3 -3
- package/.output/server/chunks/build/{dcw-BL2dhuz7.mjs.map → dcw-CcQNGggh.mjs.map} +1 -1
- package/.output/server/chunks/build/{default-CLf5m0NE.mjs → default-95-zOTPt.mjs} +2 -2
- package/.output/server/chunks/build/{default-CLf5m0NE.mjs.map → default-95-zOTPt.mjs.map} +1 -1
- package/.output/server/chunks/build/{logs-Dto_umFY.mjs → logs-D-2UyGtE.mjs} +3 -3
- package/.output/server/chunks/build/{logs-Dto_umFY.mjs.map → logs-D-2UyGtE.mjs.map} +1 -1
- package/.output/server/chunks/build/{monitor-Cp4V-H2n.mjs → monitor-mfG5jBtz.mjs} +3 -3
- package/.output/server/chunks/build/{monitor-Cp4V-H2n.mjs.map → monitor-mfG5jBtz.mjs.map} +1 -1
- package/.output/server/chunks/build/{pages-Dc2H1QFu.mjs → pages-Dfosfchr.mjs} +4 -4
- package/.output/server/chunks/build/{pages-Dc2H1QFu.mjs.map → pages-Dfosfchr.mjs.map} +1 -1
- package/.output/server/chunks/build/{permissions-BTRW2CVd.mjs → permissions-B-hhZuzm.mjs} +3 -3
- package/.output/server/chunks/build/{permissions-BTRW2CVd.mjs.map → permissions-B-hhZuzm.mjs.map} +1 -1
- package/.output/server/chunks/build/{settings-UfGyDgM7.mjs → settings-BajN9TQW.mjs} +249 -20
- package/.output/server/chunks/build/settings-BajN9TQW.mjs.map +1 -0
- package/.output/server/chunks/build/{table-Cswq-l2r.mjs → table-Bf1r2JjE.mjs} +2 -2
- package/.output/server/chunks/build/{table-Cswq-l2r.mjs.map → table-Bf1r2JjE.mjs.map} +1 -1
- package/.output/server/chunks/build/{teams-Cbg27MWW.mjs → teams-t2SkRlJP.mjs} +346 -46
- package/.output/server/chunks/build/teams-t2SkRlJP.mjs.map +1 -0
- package/.output/server/chunks/build/{tokens-Bmm6rDfj.mjs → tokens-DiCojbN8.mjs} +3 -3
- package/.output/server/chunks/build/{tokens-Bmm6rDfj.mjs.map → tokens-DiCojbN8.mjs.map} +1 -1
- package/.output/server/chunks/build/{town-Dsh0jlwZ.mjs → town-C7QM8DYK.mjs} +5 -5
- package/.output/server/chunks/build/{town-Dsh0jlwZ.mjs.map → town-C7QM8DYK.mjs.map} +1 -1
- package/.output/server/chunks/build/{useDaqStream-DkRL3tEW.mjs → useDaqStream-BeA2X8KR.mjs} +26 -11
- package/.output/server/chunks/build/useDaqStream-BeA2X8KR.mjs.map +1 -0
- package/.output/server/chunks/build/{useDcwStream-DyB2ufQI.mjs → useDcwStream-BJW_MitY.mjs} +14 -6
- package/.output/server/chunks/build/useDcwStream-BJW_MitY.mjs.map +1 -0
- package/.output/server/chunks/build/{useDeviceTwins-ZbT86L9O.mjs → useDeviceTwins-Dwz_EY_i.mjs} +2 -2
- package/.output/server/chunks/build/{useDeviceTwins-ZbT86L9O.mjs.map → useDeviceTwins-Dwz_EY_i.mjs.map} +1 -1
- package/.output/server/chunks/build/{useOpsLog-8HCYFb6n.mjs → useOpsLog-Dm8QEb1I.mjs} +2 -2
- package/.output/server/chunks/build/{useOpsLog-8HCYFb6n.mjs.map → useOpsLog-Dm8QEb1I.mjs.map} +1 -1
- package/.output/server/chunks/build/{useWorkshopApi-D2gq06N2.mjs → useWorkshopApi-B-L3MmIX.mjs} +9 -2
- package/.output/server/chunks/build/{useWorkshopApi-D2gq06N2.mjs.map → useWorkshopApi-B-L3MmIX.mjs.map} +1 -1
- package/.output/server/chunks/build/{users-B50HHrfi.mjs → users-B9SAdEtH.mjs} +3 -3
- package/.output/server/chunks/build/{users-B50HHrfi.mjs.map → users-B9SAdEtH.mjs.map} +1 -1
- package/.output/server/chunks/routes/api/plugins/_name/_...path_.mjs +14 -2
- package/.output/server/chunks/routes/api/plugins/_name/_...path_.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/channel-templates/_id/instantiate.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/channels/_id/index.put.mjs +40 -0
- package/.output/server/chunks/routes/api/workshop/channels/_id/index.put.mjs.map +1 -0
- package/.output/server/chunks/routes/api/workshop/channels/_id/index4.get.mjs +21 -9
- package/.output/server/chunks/routes/api/workshop/channels/_id/index4.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/channels/_id/index5.get.mjs +33 -0
- package/.output/server/chunks/routes/api/workshop/channels/_id/index5.get.mjs.map +1 -0
- package/.output/server/chunks/routes/api/workshop/channels/_id/terminals.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/channels.post.mjs +15 -1
- package/.output/server/chunks/routes/api/workshop/channels.post.mjs.map +1 -1
- 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/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/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_.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/index3.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/index4.get.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.post.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/workspaces/_id/channel-templates/_tplId_.post.mjs +1 -1
- package/.output/server/chunks/routes/renderer.mjs +2 -2
- package/.output/server/chunks/virtual/entry.mjs +352 -433
- package/.output/server/chunks/virtual/precomputed.mjs +1 -1
- package/.output/server/package.json +1 -1
- package/app/components/workshop/DaqNodeRow.vue +398 -0
- package/app/components/workshop/town/ModelPreview3D.vue +26 -4
- package/app/components/workshop/town/TownScene3D.ts +60 -12
- package/app/components/workshop/town/TownView.vue +4 -3
- package/app/composables/workshop/useCharacterAssets.ts +1 -0
- package/app/composables/workshop/useDaqStream.ts +24 -5
- package/app/composables/workshop/useDcwStream.ts +13 -4
- package/app/composables/workshop/useWorkshopApi.ts +294 -259
- package/app/pages/daq/[id].vue +27 -3
- package/app/pages/daq/index.vue +8 -355
- package/app/pages/settings.vue +253 -2
- package/app/pages/workshop/teams.vue +212 -2
- package/i18n/dicts/_en.json +361 -1
- package/i18n/dicts/plugins.json +10 -0
- package/i18n/dicts/settings.json +1 -0
- package/i18n/dicts/teamPlugins.json +10 -0
- package/i18n/locales/en.ts +1860 -1900
- package/i18n/locales/zh-CN.ts +1788 -1829
- package/package.json +149 -148
- package/public/assets/game/character/yangyang-walk.glb +0 -0
- package/scripts/_dbg-cpu-profile.mjs +53 -0
- package/scripts/_dbg-render-perf.mjs +142 -0
- package/scripts/_dbg-render-regression.mjs +130 -0
- package/scripts/i18n-merge.mjs +152 -30
- package/scripts/production-closed-loop-e2e.mjs +254 -0
- package/scripts/team-plugins-api-smoke.mjs +149 -0
- package/scripts/three-system-e2e.mjs +448 -0
- package/server/api/plugins/[name]/[...path].ts +46 -31
- package/server/api/workshop/channels/[id]/plugins/index.get.ts +35 -0
- package/server/api/workshop/channels/[id]/plugins/index.put.ts +39 -0
- package/server/api/workshop/channels.post.ts +17 -0
- package/server/data/dcw-lines.json +7 -0
- package/server/data/dcw-products.json +7 -0
- package/server/data/dcw-recipes.json +1 -1
- package/server/data/dcw-rollback.json +523 -11
- package/server/data/dcw-writes.json +72 -0
- package/server/data/dcws.json +368 -368
- package/server/data/scene-layouts.json +66 -0
- package/server/plugins/aw-plugins.ts +35 -27
- package/server/plugins-builtin/diag-bridge/index.mjs +556 -0
- package/server/plugins-builtin/rag-bridge/index.mjs +364 -0
- package/server/services/workshop/agents/host-tool-bridge.ts +659 -642
- package/server/services/workshop/agents/omp-agent.ts +1178 -1178
- package/server/services/workshop/agents/plugin-tools.ts +10 -1
- package/server/services/workshop/db/channel-plugins.repo.ts +65 -0
- package/server/services/workshop/plugins/host.mjs +52 -4
- package/server/services/workshop/runtime/manager.ts +2976 -2968
- package/shared/config/schema.json +4 -0
- package/.output/public/_nuxt/BUcmySDa2.js +0 -209
- package/.output/public/_nuxt/CYzpZzB_.js +0 -1
- package/.output/public/_nuxt/CjXIpPMR.js +0 -1
- package/.output/public/_nuxt/DKHcFE1i.js +0 -1
- package/.output/public/_nuxt/DjtE7AYt.js +0 -1
- package/.output/public/_nuxt/JOwsShod.js +0 -2
- package/.output/public/_nuxt/_id_.C-YXjn8Q.css +0 -1
- package/.output/public/_nuxt/builds/meta/024de5f7-6a10-4f53-82ab-bc65f3ec9e35.json +0 -1
- package/.output/public/_nuxt/daq.3OKj58HH.css +0 -1
- package/.output/public/_nuxt/settings.BqMF2nfj.css +0 -1
- package/.output/public/_nuxt/teams.DN0pAGGu.css +0 -1
- package/.output/server/chunks/build/daq-B-3xCp_2.mjs.map +0 -1
- package/.output/server/chunks/build/settings-UfGyDgM7.mjs.map +0 -1
- package/.output/server/chunks/build/teams-Cbg27MWW.mjs.map +0 -1
- package/.output/server/chunks/build/useDaqStream-DkRL3tEW.mjs.map +0 -1
- package/.output/server/chunks/build/useDcwStream-DyB2ufQI.mjs.map +0 -1
|
@@ -96,6 +96,14 @@ export function listPluginTools(): Map<string, OmpPluginTool> {
|
|
|
96
96
|
return state().byName
|
|
97
97
|
}
|
|
98
98
|
|
|
99
|
+
/** 工具名 → 注册方插件名(团队级插件开关过滤用;非插件工具返回 null) */
|
|
100
|
+
export function pluginOfTool(name: string): string | null {
|
|
101
|
+
for (const [k, tool] of state().byPlugin.entries()) {
|
|
102
|
+
if (tool.name === name) return k.slice(0, k.lastIndexOf(':')) || null
|
|
103
|
+
}
|
|
104
|
+
return null
|
|
105
|
+
}
|
|
106
|
+
|
|
99
107
|
/** 注册表变更订阅(omp-agent 模块加载时接管 pending 并订阅热注入) */
|
|
100
108
|
export function onPluginToolsChange(fn: () => void): () => void {
|
|
101
109
|
const st = state()
|
|
@@ -103,7 +111,8 @@ export function onPluginToolsChange(fn: () => void): () => void {
|
|
|
103
111
|
return () => st.listeners.delete(fn)
|
|
104
112
|
}
|
|
105
113
|
|
|
106
|
-
|
|
114
|
+
/** 变更通知(团队级插件开关切换后调用,在跑 agent 热刷新工具清单) */
|
|
115
|
+
export function notifyToolChange(): void {
|
|
107
116
|
for (const fn of state().listeners) {
|
|
108
117
|
try {
|
|
109
118
|
fn()
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ChannelPlugins 仓储:channel_plugins 表(channel × 插件启停,团队级独立开关)。
|
|
3
|
+
*
|
|
4
|
+
* 语义:无显式行 = 未配置 → 全部启用插件对团队可见(向后兼容,存量 channel 不受影响);
|
|
5
|
+
* 显式行(建队勾选/团队设置切换)写入后按行过滤 —— 关闭的插件其工具不注入该团队
|
|
6
|
+
* Agent,dispatch 同源拒绝,防止不需要插件的 channel 上下文被污染。
|
|
7
|
+
* 自持连接(user.repository.ts 同模式):workshop.sqlite 单文件 WAL。
|
|
8
|
+
*/
|
|
9
|
+
import { DatabaseSync } from 'node:sqlite'
|
|
10
|
+
import { join } from 'node:path'
|
|
11
|
+
import { ensureDataDir } from '@/shared/config/home.mjs'
|
|
12
|
+
|
|
13
|
+
const DB_PATH = join(ensureDataDir(), 'workshop.sqlite')
|
|
14
|
+
|
|
15
|
+
let db: DatabaseSync | null = null
|
|
16
|
+
function getDb(): DatabaseSync {
|
|
17
|
+
if (!db) {
|
|
18
|
+
db = new DatabaseSync(DB_PATH)
|
|
19
|
+
db.exec('PRAGMA busy_timeout=4000')
|
|
20
|
+
db.exec(`CREATE TABLE IF NOT EXISTS channel_plugins (
|
|
21
|
+
channel_id TEXT NOT NULL REFERENCES channels(id) ON DELETE CASCADE,
|
|
22
|
+
plugin TEXT NOT NULL,
|
|
23
|
+
enabled INTEGER NOT NULL DEFAULT 1,
|
|
24
|
+
updated_at TEXT NOT NULL,
|
|
25
|
+
PRIMARY KEY (channel_id, plugin)
|
|
26
|
+
)`)
|
|
27
|
+
}
|
|
28
|
+
return db
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export interface ChannelPluginToggle {
|
|
32
|
+
name: string
|
|
33
|
+
enabled: boolean
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export class ChannelPluginsRepo {
|
|
37
|
+
/** 该团队的显式插件开关;无行 → null(未配置,默认全启用) */
|
|
38
|
+
explicitFor(channelId: string): Map<string, boolean> | null {
|
|
39
|
+
const rows = getDb()
|
|
40
|
+
.prepare('SELECT plugin, enabled FROM channel_plugins WHERE channel_id = ?')
|
|
41
|
+
.all(channelId) as Array<{ plugin: string, enabled: number }>
|
|
42
|
+
if (!rows.length) return null
|
|
43
|
+
return new Map(rows.map(r => [r.plugin, r.enabled === 1]))
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/** 写入/更新显式开关(未知插件名由调用方过滤) */
|
|
47
|
+
setMany(channelId: string, entries: ChannelPluginToggle[]): void {
|
|
48
|
+
const d = getDb()
|
|
49
|
+
const up = d.prepare('INSERT OR REPLACE INTO channel_plugins (channel_id, plugin, enabled, updated_at) VALUES (?, ?, ?, ?)')
|
|
50
|
+
for (const e of entries) {
|
|
51
|
+
if (!e?.name) continue
|
|
52
|
+
up.run(channelId, String(e.name), e.enabled === false ? 0 : 1, new Date().toISOString())
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
removeForChannel(channelId: string): void {
|
|
57
|
+
getDb().prepare('DELETE FROM channel_plugins WHERE channel_id = ?').run(channelId)
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
let repo: ChannelPluginsRepo | null = null
|
|
62
|
+
export function getChannelPluginsRepo(): ChannelPluginsRepo {
|
|
63
|
+
repo ??= new ChannelPluginsRepo()
|
|
64
|
+
return repo
|
|
65
|
+
}
|
|
@@ -55,7 +55,11 @@ function defaultHome() {
|
|
|
55
55
|
/** 运行模式路径(cwd 为检出根时启用 project 作用域) */
|
|
56
56
|
function modePaths(cwd) {
|
|
57
57
|
const isRepo = existsSync(join(cwd, 'config.yml')) && existsSync(join(cwd, 'nuxt.config.ts'))
|
|
58
|
+
// packageRoot:宿主运行时取 initPluginHost 注入值;冒烟/单测(cwd 在包根)回退 cwd
|
|
59
|
+
const packageRoot = g.__awPluginHost?.packageRoot ?? (isRepo ? cwd : null)
|
|
60
|
+
const builtinDir = packageRoot ? join(packageRoot, 'server', 'plugins-builtin') : null
|
|
58
61
|
return {
|
|
62
|
+
builtinDir: builtinDir && existsSync(builtinDir) ? builtinDir : null,
|
|
59
63
|
projectDir: isRepo ? join(cwd, '.AgentWorkShop', 'plugins') : null,
|
|
60
64
|
userDir: join(process.env.AW_HOME && String(process.env.AW_HOME).trim() ? String(process.env.AW_HOME).trim() : defaultHome(), 'plugins'),
|
|
61
65
|
homeDir: process.env.AW_HOME && String(process.env.AW_HOME).trim() ? String(process.env.AW_HOME).trim() : defaultHome(),
|
|
@@ -89,12 +93,12 @@ export function writeDisabledSet(homeDir, disabled) {
|
|
|
89
93
|
renameSync(tmp, p)
|
|
90
94
|
}
|
|
91
95
|
|
|
92
|
-
/**
|
|
96
|
+
/** 发现插件入口,三作用域(builtin 同名被 project 覆盖,project 同名被 user 覆盖) */
|
|
93
97
|
export function discoverPluginDirs(cwd = process.cwd()) {
|
|
94
|
-
const { projectDir, userDir } = modePaths(cwd)
|
|
98
|
+
const { builtinDir, projectDir, userDir } = modePaths(cwd)
|
|
95
99
|
const out = []
|
|
96
100
|
const seen = new Set()
|
|
97
|
-
for (const [dir, scope] of [[projectDir, 'project'], [userDir, 'user']]) {
|
|
101
|
+
for (const [dir, scope] of [[builtinDir, 'builtin'], [projectDir, 'project'], [userDir, 'user']]) {
|
|
98
102
|
if (!dir || !existsSync(dir)) continue
|
|
99
103
|
for (const name of readdirSync(dir)) {
|
|
100
104
|
const sub = join(dir, name)
|
|
@@ -150,6 +154,20 @@ export async function initPluginHost({ cwd = process.cwd(), packageRoot } = {})
|
|
|
150
154
|
catch (err) {
|
|
151
155
|
host.logger.warn('配置引擎加载降级(插件 ctx.config 将为空):', err?.message)
|
|
152
156
|
}
|
|
157
|
+
// 配置热更新:system-config 变化(设置页 PATCH / runtime-settings 文件监听)即刷新
|
|
158
|
+
// effective —— 插件 ctx.config.get 每次调用实时读到新值(插件 API 地址等改配置即生效,无需重启)
|
|
159
|
+
try {
|
|
160
|
+
const { getSystemConfigService } = await import('@/server/services/system-config')
|
|
161
|
+
getSystemConfigService().subscribe((tail) => {
|
|
162
|
+
try {
|
|
163
|
+
if (config?.effective && tail?.effective) Object.assign(config.effective, tail.effective)
|
|
164
|
+
}
|
|
165
|
+
catch { /* 刷新失败保留旧值 */ }
|
|
166
|
+
})
|
|
167
|
+
}
|
|
168
|
+
catch (err) {
|
|
169
|
+
host.logger.warn('配置热更新订阅失败(插件 ctx.config 为装载时快照):', err?.message)
|
|
170
|
+
}
|
|
153
171
|
host.config = config
|
|
154
172
|
|
|
155
173
|
// 自环 origin:PORT env(prod:start.mjs 注入 / dev:dev-guard 注入 CLI 显式值)权威;
|
|
@@ -201,6 +219,7 @@ async function loadAllPlugins(host, { config, paths }) {
|
|
|
201
219
|
name: def.name,
|
|
202
220
|
version: String(def.version ?? '0.0.0'),
|
|
203
221
|
description: String(def.description ?? ''),
|
|
222
|
+
auth: String(def.auth ?? 'none'),
|
|
204
223
|
scope,
|
|
205
224
|
dir,
|
|
206
225
|
entry,
|
|
@@ -217,6 +236,7 @@ async function loadAllPlugins(host, { config, paths }) {
|
|
|
217
236
|
name: def.name,
|
|
218
237
|
version: String(def.version ?? '0.0.0'),
|
|
219
238
|
description: String(def.description ?? ''),
|
|
239
|
+
auth: String(def.auth ?? 'none'),
|
|
220
240
|
scope,
|
|
221
241
|
dir,
|
|
222
242
|
entry,
|
|
@@ -320,6 +340,16 @@ async function loadAllPlugins(host, { config, paths }) {
|
|
|
320
340
|
/** 帧消费便捷别名(= hooks.on('daq:frame') / hooks.on('daq:sample')) */
|
|
321
341
|
onFrame: fn => scopedHooks.on('daq:frame', fn),
|
|
322
342
|
onSample: fn => scopedHooks.on('daq:sample', fn),
|
|
343
|
+
/** 时序查询直通(queryTagged):插件免鉴权拉取产线/节点窗口样本(bucket/raw),诊断取数用 */
|
|
344
|
+
query: async (q) => {
|
|
345
|
+
const m = await import('@/server/services/workshop/daq/storage/index')
|
|
346
|
+
return m.getTsdb().queryTagged(q)
|
|
347
|
+
},
|
|
348
|
+
/** 数采节点元数据快照(含产线归属,插件定位某产线的全部节点) */
|
|
349
|
+
nodes: async () => {
|
|
350
|
+
const m = await import('@/server/services/workshop/daq/daq-node.repo')
|
|
351
|
+
return m.getDaqNodeRepo().snapshot()
|
|
352
|
+
},
|
|
323
353
|
}
|
|
324
354
|
// OMP 工具扩展面:插件注册自定义 host 工具 → omp 会话运行时热注入
|
|
325
355
|
const ompExt = (globalThis.__ompPluginToolsBridge ??= {
|
|
@@ -396,10 +426,28 @@ async function doReload(host) {
|
|
|
396
426
|
catch { /* 解绑失败忽略 */ }
|
|
397
427
|
}
|
|
398
428
|
}
|
|
429
|
+
const prevNames = [...host.plugins.keys()]
|
|
430
|
+
// 卸载即注销其注册的全部 agent 工具(否则停用插件后工具仍残留在注册表、可被继续调用)
|
|
431
|
+
const ompTools = await import('@/server/services/workshop/agents/plugin-tools').catch(() => null)
|
|
432
|
+
for (const prev of prevNames) {
|
|
433
|
+
try {
|
|
434
|
+
ompTools?.unregisterPluginTools(prev)
|
|
435
|
+
}
|
|
436
|
+
catch { /* 注销失败不阻断重载 */ }
|
|
437
|
+
}
|
|
399
438
|
host.plugins.clear()
|
|
400
439
|
host.routes = createRouteTable()
|
|
401
440
|
host.failures = []
|
|
402
441
|
await loadAllPlugins(host, { config: host.config, settingsPath: null, paths: { home: modePaths(host.cwd).homeDir, configRoot: join(host.cwd, '.AgentWorkShop'), dataDir: join(host.cwd, '.AgentWorkShop', 'data') } })
|
|
442
|
+
// 装载中途失败(setup 抛错)的插件可能留下半注册工具,兜底再清一次
|
|
443
|
+
for (const prev of prevNames) {
|
|
444
|
+
if (!host.plugins.has(prev)) {
|
|
445
|
+
try {
|
|
446
|
+
ompTools?.unregisterPluginTools(prev)
|
|
447
|
+
}
|
|
448
|
+
catch { /* 忽略 */ }
|
|
449
|
+
}
|
|
450
|
+
}
|
|
403
451
|
await host.bus.emit('plugins:reloaded', { plugins: pluginManifest() })
|
|
404
452
|
try {
|
|
405
453
|
const m = await import('@/server/services/workshop/scene-events')
|
|
@@ -491,7 +539,7 @@ export function pluginManifest() {
|
|
|
491
539
|
version: r.version,
|
|
492
540
|
description: r.description,
|
|
493
541
|
scope: r.scope,
|
|
494
|
-
builtin: r.scope === 'project',
|
|
542
|
+
builtin: r.scope === 'project' || r.scope === 'builtin',
|
|
495
543
|
enabled: r.enabled !== false,
|
|
496
544
|
hasClient: Boolean(r.clientPath),
|
|
497
545
|
routes: host.routes.byPlugin(r.name),
|