@aalis/plugin-webui-server 0.4.1 → 0.5.0
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/dist/auth.d.ts +6 -22
- package/dist/auth.d.ts.map +1 -1
- package/dist/auth.js +29 -140
- package/dist/auth.js.map +1 -1
- package/dist/client-discovery.d.ts +32 -0
- package/dist/client-discovery.d.ts.map +1 -0
- package/dist/client-discovery.js +67 -0
- package/dist/client-discovery.js.map +1 -0
- package/dist/client-switch-page.d.ts +3 -0
- package/dist/client-switch-page.d.ts.map +1 -0
- package/dist/client-switch-page.js +106 -0
- package/dist/client-switch-page.js.map +1 -0
- package/dist/gate.d.ts +9 -15
- package/dist/gate.d.ts.map +1 -1
- package/dist/gate.js +11 -29
- package/dist/gate.js.map +1 -1
- package/dist/index.d.ts +0 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +179 -228
- package/dist/index.js.map +1 -1
- package/dist/routes/files.js +5 -5
- package/dist/routes/files.js.map +1 -1
- package/dist/routes/marketplace.d.ts +45 -18
- package/dist/routes/marketplace.d.ts.map +1 -1
- package/dist/routes/marketplace.js +141 -84
- package/dist/routes/marketplace.js.map +1 -1
- package/dist/routes/plugins.d.ts.map +1 -1
- package/dist/routes/plugins.js +27 -48
- package/dist/routes/plugins.js.map +1 -1
- package/dist/routes/proxy.d.ts.map +1 -1
- package/dist/routes/proxy.js +8 -25
- package/dist/routes/proxy.js.map +1 -1
- package/dist/routes/uploaded-files.js +3 -3
- package/dist/routes/uploaded-files.js.map +1 -1
- package/package.json +29 -27
|
@@ -1,47 +1,29 @@
|
|
|
1
1
|
import { createRequire } from 'node:module';
|
|
2
2
|
import { resolve } from 'node:path';
|
|
3
3
|
import { pathToFileURL } from 'node:url';
|
|
4
|
-
// 纯 npm 路线:npm registry 的 keyword
|
|
5
|
-
//
|
|
4
|
+
// 纯 npm 路线:npm registry 的 keyword 检索即天然索引,无自建服务器、无静态索引。
|
|
5
|
+
// 分发走 package-manager 的 npm pack。
|
|
6
6
|
// 注:npm 的 search API 并非所有镜像都支持(淘宝等国内源不支持),故 registry
|
|
7
7
|
// 基址可配置(marketplaceRegistry),默认官方源;国内用户可配代理/支持 search 的镜像。
|
|
8
8
|
const DEFAULT_REGISTRY = 'https://registry.npmjs.org';
|
|
9
|
-
|
|
9
|
+
// 市场收录四类:功能插件 aalis-plugin / 工具库 aalis-util / 契约 aalis-api / 前端 aalis-interface。
|
|
10
|
+
// npm search 的 keywords: 逗号分隔 = 任一命中(核心/工具链不带任何类型词,自然不进市场)。
|
|
11
|
+
const AALIS_KEYWORDS = ['aalis-plugin', 'aalis-util', 'aalis-api', 'aalis-interface'];
|
|
10
12
|
const SEARCH_TIMEOUT_MS = 8000;
|
|
11
13
|
// 合法 npm 包名(可选 scope)+ 可选 @version 后缀(支持指定版本安装)
|
|
12
14
|
const PKG_NAME_RE = /^(@[a-z0-9\-_.]+\/)?[a-z0-9\-_.]+(@[a-z0-9.-]+)?$/i;
|
|
13
15
|
/**
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
* package-manager 是卸载引擎本身;core===true 是 manifest 标记的核心插件。纯函数,便于单测。
|
|
16
|
+
* 按**类型关键词**分类(npm search 直接返回 keywords,与加载约定的类型词 1:1,可靠)。
|
|
17
|
+
* 市场搜索已保证结果只含 aalis-plugin/util/api/interface 之一,无需再靠包名猜测。纯函数,便于单测。
|
|
17
18
|
*/
|
|
18
|
-
|
|
19
|
-
'
|
|
20
|
-
|
|
21
|
-
'
|
|
22
|
-
'@aalis/plugin-webui-client',
|
|
23
|
-
]);
|
|
24
|
-
export function isProtectedPackage(name, entry) {
|
|
25
|
-
if (PROTECTED_EXACT.has(name))
|
|
26
|
-
return true;
|
|
27
|
-
const short = name.replace(/^@[^/]+\//, '');
|
|
28
|
-
if (/-api$/.test(short))
|
|
29
|
-
return true; // 契约/类型包
|
|
30
|
-
return entry?.core === true;
|
|
31
|
-
}
|
|
32
|
-
/**
|
|
33
|
-
* 按**包名**分类(npm search 只返回 name,拿不到 package.json 的 aalis marker)。
|
|
34
|
-
* 注意 `*-client` 不可一刀切——`plugin-mcp-client` 是功能插件,只有 `webui-client*`
|
|
35
|
-
* 才是前端。第三方前端建议名含 `webui-client` 以被正确归类(否则归入功能插件,
|
|
36
|
-
* 仍能装/被 aalis.client marker 发现挂载,只是分类不准)。纯函数,便于单测。
|
|
37
|
-
*/
|
|
38
|
-
export function classifyPackage(name) {
|
|
39
|
-
const short = name.replace(/^@[^/]+\//, '');
|
|
40
|
-
if (/-api$/.test(short))
|
|
19
|
+
export function classifyPackage(keywords) {
|
|
20
|
+
if (keywords.includes('aalis-interface'))
|
|
21
|
+
return 'interface';
|
|
22
|
+
if (keywords.includes('aalis-api'))
|
|
41
23
|
return 'api';
|
|
42
|
-
if (
|
|
43
|
-
return '
|
|
44
|
-
return 'plugin';
|
|
24
|
+
if (keywords.includes('aalis-util'))
|
|
25
|
+
return 'util';
|
|
26
|
+
return 'plugin'; // 进了市场却非上述三类 → 必是功能插件(aalis-plugin)
|
|
45
27
|
}
|
|
46
28
|
/**
|
|
47
29
|
* 补全「已安装」判定。getStatus() 只含**已加载的运行时插件**——api 契约 / 前端 / 核心
|
|
@@ -80,6 +62,39 @@ export function findServiceDependents(targetName, status) {
|
|
|
80
62
|
}
|
|
81
63
|
return [...dependents];
|
|
82
64
|
}
|
|
65
|
+
/** 直接 import 依赖者:哪些本地包的依赖名单里含 target(不含自身)。排序输出。纯函数,便于单测。 */
|
|
66
|
+
export function findPackageDependents(target, depMap) {
|
|
67
|
+
const out = [];
|
|
68
|
+
for (const [name, deps] of depMap) {
|
|
69
|
+
if (name !== target && deps.includes(target))
|
|
70
|
+
out.push(name);
|
|
71
|
+
}
|
|
72
|
+
return out.sort();
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* 构建 target 的 import 依赖链路树(纯函数,只看 import 边,不碰服务)。
|
|
76
|
+
* direction='upstream':children=该节点的依赖(它需要谁);缺失依赖标 present=false 且停止下钻(中断)。
|
|
77
|
+
* direction='downstream':children=依赖该节点的包(谁需要它),复用 findPackageDependents;不因 target 自身未装而中断。
|
|
78
|
+
* isRelevant 滤掉无关第三方库(如 express),默认只跟 depMap 内的包;调用方可放宽到 @aalis scope。
|
|
79
|
+
* 环检测(路径内重复即停)+ 深度上限。
|
|
80
|
+
*/
|
|
81
|
+
export function buildDependencyChain(target, depMap, direction, opts = {}) {
|
|
82
|
+
const maxDepth = opts.maxDepth ?? 8;
|
|
83
|
+
const isRelevant = opts.isRelevant ?? ((n) => depMap.has(n));
|
|
84
|
+
const build = (name, depth, path) => {
|
|
85
|
+
const node = { name, present: depMap.has(name), children: [] };
|
|
86
|
+
if (depth >= maxDepth || path.has(name))
|
|
87
|
+
return node; // 深度 / 环 → 不下钻
|
|
88
|
+
if (direction === 'upstream' && !node.present)
|
|
89
|
+
return node; // upstream 缺失即中断(downstream 不受 target 自身存在影响)
|
|
90
|
+
const nextPath = new Set(path).add(name);
|
|
91
|
+
const edges = direction === 'upstream' ? (depMap.get(name) ?? []).filter(isRelevant) : findPackageDependents(name, depMap);
|
|
92
|
+
for (const child of edges)
|
|
93
|
+
node.children.push(build(child, depth + 1, nextPath));
|
|
94
|
+
return node;
|
|
95
|
+
};
|
|
96
|
+
return build(target, 0, new Set());
|
|
97
|
+
}
|
|
83
98
|
/** npm search 响应 → 市场卡片列表(标注已装 + 官方 + 富信息)。纯函数,便于单测。 */
|
|
84
99
|
export function toMarketplacePackages(data, installed) {
|
|
85
100
|
return (data.objects ?? []).map(o => ({
|
|
@@ -89,8 +104,8 @@ export function toMarketplacePackages(data, installed) {
|
|
|
89
104
|
author: o.package.publisher?.username,
|
|
90
105
|
installed: installed.has(o.package.name),
|
|
91
106
|
official: o.package.name.startsWith('@aalis/'),
|
|
92
|
-
category: classifyPackage(o.package.
|
|
93
|
-
keywords: (o.package.keywords ?? []).filter(k => k
|
|
107
|
+
category: classifyPackage(o.package.keywords ?? []),
|
|
108
|
+
keywords: (o.package.keywords ?? []).filter(k => !AALIS_KEYWORDS.includes(k)),
|
|
94
109
|
downloads: o.downloads?.monthly,
|
|
95
110
|
updated: o.updated ?? o.package.date,
|
|
96
111
|
score: o.score?.final,
|
|
@@ -99,32 +114,42 @@ export function toMarketplacePackages(data, installed) {
|
|
|
99
114
|
links: o.package.links,
|
|
100
115
|
}));
|
|
101
116
|
}
|
|
102
|
-
/** npm packument → 装前能力清单(读 latest 版本的 aalis.service
|
|
117
|
+
/** npm packument → 装前能力清单(读 latest 版本的 aalis.service + 依赖名)。纯函数,便于单测。 */
|
|
103
118
|
export function toManifest(packument) {
|
|
104
119
|
const latest = packument['dist-tags']?.latest;
|
|
105
120
|
if (!latest)
|
|
106
121
|
return null;
|
|
107
122
|
const v = packument.versions?.[latest];
|
|
108
|
-
|
|
123
|
+
const dependencies = [...new Set([...Object.keys(v?.dependencies ?? {}), ...Object.keys(v?.peerDependencies ?? {})])];
|
|
124
|
+
return { name: '', version: latest, description: v?.description, service: v?.aalis?.service, dependencies };
|
|
109
125
|
}
|
|
110
|
-
/**
|
|
111
|
-
|
|
112
|
-
|
|
126
|
+
/**
|
|
127
|
+
* 构造单个类型关键词的 npm registry 检索 URL。纯函数,便于单测。
|
|
128
|
+
* 注意:npm search 的 `keywords:a,b` 是 **AND**(须同时含),不是 OR——故四类关键词不能逗号合并成一条查询
|
|
129
|
+
* (会要求一个包同时是 plugin+util+api+interface → 0 结果)。改为每类发一条、调用方合并,见 registerMarketplaceRoutes。
|
|
130
|
+
*/
|
|
131
|
+
export function buildSearchUrl(q, keyword, registryBase = DEFAULT_REGISTRY) {
|
|
132
|
+
const text = q ? `keywords:${keyword} ${q}` : `keywords:${keyword}`;
|
|
113
133
|
const base = registryBase.replace(/\/+$/, '') || DEFAULT_REGISTRY;
|
|
114
134
|
return `${base}/-/v1/search?text=${encodeURIComponent(text)}&size=100`;
|
|
115
135
|
}
|
|
116
136
|
/** 注册插件市场 REST 路由 */
|
|
117
|
-
export function registerMarketplaceRoutes(expressApp, ctx, getPluginMgr, gate, registryBase = DEFAULT_REGISTRY
|
|
118
|
-
|
|
137
|
+
export function registerMarketplaceRoutes(expressApp, ctx, getPluginMgr, gate, registryBase = DEFAULT_REGISTRY,
|
|
138
|
+
/** 本地包扫描:`name → 依赖名[]`(含 monorepo 工作区包)。keys 补 require.resolve 在 pnpm 工作区的盲区;values 供依赖图。 */
|
|
139
|
+
getLocalPackages = () => new Map()) {
|
|
140
|
+
// 市场列表:npm registry keyword 检索 + 标注已装。网络失败降级为空列表 + warning,
|
|
119
141
|
// 不阻塞 WebUI(管理读档,与 /api/plugins 同级)。
|
|
120
|
-
expressApp.get('/api/marketplace', gate(
|
|
142
|
+
expressApp.get('/api/marketplace', gate(), async (req, res) => {
|
|
121
143
|
const q = typeof req.query.q === 'string' ? req.query.q.trim() : '';
|
|
122
144
|
const status = getPluginMgr()?.getStatus() ?? [];
|
|
123
|
-
|
|
124
|
-
//
|
|
125
|
-
//
|
|
145
|
+
// 已装判定独立于 getStatus(后者只含已加载运行时插件,漏掉带 marker 不加载的 api/前端/核心)。
|
|
146
|
+
// 两路补判:① 本地物理存在(含 monorepo packages/ 工作区包——require.resolve 从仓库根解析不到);
|
|
147
|
+
// ② 项目根能 resolve(独立部署的扁平 node_modules / 第三方根依赖)。
|
|
148
|
+
const localPkgs = getLocalPackages();
|
|
126
149
|
const projectRequire = createRequire(pathToFileURL(resolve(process.cwd(), 'package.json')));
|
|
127
|
-
const
|
|
150
|
+
const isPresent = (name) => {
|
|
151
|
+
if (localPkgs.has(name))
|
|
152
|
+
return true;
|
|
128
153
|
try {
|
|
129
154
|
projectRequire.resolve(`${name}/package.json`);
|
|
130
155
|
return true;
|
|
@@ -133,52 +158,88 @@ export function registerMarketplaceRoutes(expressApp, ctx, getPluginMgr, gate, r
|
|
|
133
158
|
return false;
|
|
134
159
|
}
|
|
135
160
|
};
|
|
136
|
-
|
|
137
|
-
|
|
161
|
+
// 四类关键词各发一条检索(npm 的 keywords 逗号是 AND 非 OR),并行后按包名合并去重 = OR。
|
|
162
|
+
const fetchKw = async (kw) => {
|
|
163
|
+
const r = await fetch(buildSearchUrl(q, kw, registryBase), { signal: AbortSignal.timeout(SEARCH_TIMEOUT_MS) });
|
|
138
164
|
if (!r.ok)
|
|
139
165
|
throw new Error(`npm registry 返回 ${r.status}`);
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
}
|
|
148
|
-
catch (err) {
|
|
149
|
-
const msg = err instanceof Error ? err.message : String(err);
|
|
166
|
+
return (await r.json());
|
|
167
|
+
};
|
|
168
|
+
const settled = await Promise.allSettled(AALIS_KEYWORDS.map(fetchKw));
|
|
169
|
+
const okResults = settled.filter((s) => s.status === 'fulfilled');
|
|
170
|
+
if (okResults.length === 0) {
|
|
171
|
+
const reason = settled.find(s => s.status === 'rejected');
|
|
172
|
+
const msg = reason?.reason instanceof Error ? reason.reason.message : String(reason?.reason ?? '未知错误');
|
|
150
173
|
ctx.logger.debug(`market: npm registry 检索失败: ${msg}`);
|
|
151
174
|
res.json({ packages: [], warning: `无法连接 npm 仓库(${msg}),暂时只能管理本地已装插件` });
|
|
175
|
+
return;
|
|
152
176
|
}
|
|
177
|
+
const byName = new Map();
|
|
178
|
+
for (const r of okResults)
|
|
179
|
+
for (const o of r.value.objects ?? [])
|
|
180
|
+
byName.set(o.package.name, o);
|
|
181
|
+
const merged = { objects: [...byName.values()] };
|
|
182
|
+
const installed = augmentInstalled([...byName.keys()], new Set(status.map(p => p.name)), isPresent);
|
|
183
|
+
res.json({ packages: toMarketplacePackages(merged, installed) });
|
|
153
184
|
});
|
|
154
|
-
//
|
|
155
|
-
//
|
|
156
|
-
|
|
185
|
+
// 依赖图:本地 import 依赖图(name→deps 扫描)+ 运行时服务图(getStatus)合成,供装/卸/装前展示。
|
|
186
|
+
// 两类边:import(链路树,可传递)+ service(每节点直接标注 + 根的提供者解析)。
|
|
187
|
+
// 装前(target 本地不存在):拉一次 packument 取其直接依赖作根种子,深层仍走本地图。
|
|
188
|
+
expressApp.get('/api/marketplace/depgraph', gate(), async (req, res) => {
|
|
157
189
|
const name = typeof req.query.name === 'string' ? req.query.name.trim() : '';
|
|
158
190
|
if (!name || !PKG_NAME_RE.test(name)) {
|
|
159
191
|
res.status(400).json({ error: 'name 必须是合法 npm 包名' });
|
|
160
192
|
return;
|
|
161
193
|
}
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
194
|
+
const depMap = getLocalPackages();
|
|
195
|
+
const status = getPluginMgr()?.getStatus() ?? [];
|
|
196
|
+
const svcOf = new Map(status.map(p => [p.name, { provides: p.provides ?? [], requires: p.requiredServices ?? [] }]));
|
|
197
|
+
// target 本地没有(装前浏览)→ 拉 packument 取直接依赖 + 服务,注入工作图当根种子。
|
|
198
|
+
let rootServices;
|
|
199
|
+
let upstreamMap = depMap;
|
|
200
|
+
if (!depMap.has(name)) {
|
|
201
|
+
try {
|
|
202
|
+
const base = registryBase.replace(/\/+$/, '') || DEFAULT_REGISTRY;
|
|
203
|
+
const r = await fetch(`${base}/${name.replace('/', '%2F')}`, {
|
|
204
|
+
signal: AbortSignal.timeout(SEARCH_TIMEOUT_MS),
|
|
205
|
+
});
|
|
206
|
+
if (r.ok) {
|
|
207
|
+
const m = toManifest((await r.json()));
|
|
208
|
+
if (m) {
|
|
209
|
+
upstreamMap = new Map(depMap).set(name, m.dependencies ?? []);
|
|
210
|
+
if (m.service)
|
|
211
|
+
rootServices = { provides: m.service.provides ?? [], requires: m.service.required ?? [] };
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
catch {
|
|
216
|
+
/* 拉不到就给空根,不阻断 */
|
|
171
217
|
}
|
|
172
|
-
res.json({ manifest: { ...manifest, name } });
|
|
173
|
-
}
|
|
174
|
-
catch (err) {
|
|
175
|
-
const msg = err instanceof Error ? err.message : String(err);
|
|
176
|
-
ctx.logger.debug(`market: 拉取 ${name} manifest 失败: ${msg}`);
|
|
177
|
-
res.json({ manifest: null, warning: `无法拉取插件清单(${msg})` });
|
|
178
218
|
}
|
|
219
|
+
// upstream 放宽 isRelevant 到 @aalis scope:看得见缺失的生态依赖(中断),又不带 express 这类库噪声。
|
|
220
|
+
const isRelevant = (n) => upstreamMap.has(n) || n.startsWith('@aalis/');
|
|
221
|
+
const annotate = (node) => ({
|
|
222
|
+
...node,
|
|
223
|
+
services: svcOf.get(node.name) ?? (node.name === name ? rootServices : undefined),
|
|
224
|
+
children: node.children.map(annotate),
|
|
225
|
+
});
|
|
226
|
+
const upstream = annotate(buildDependencyChain(name, upstreamMap, 'upstream', { isRelevant }));
|
|
227
|
+
const downstream = annotate(buildDependencyChain(name, depMap, 'downstream'));
|
|
228
|
+
// 根的服务需求 + 提供者解析(已装范围内;未装提供者无法解析——见 docs,留空)。
|
|
229
|
+
const required = (svcOf.get(name)?.requires ?? rootServices?.requires ?? []).map(svc => ({
|
|
230
|
+
service: svc,
|
|
231
|
+
providedBy: status.find(p => p.name !== name && (p.provides ?? []).includes(svc))?.name ?? null,
|
|
232
|
+
}));
|
|
233
|
+
res.json({
|
|
234
|
+
upstream,
|
|
235
|
+
downstream,
|
|
236
|
+
services: { required, provides: svcOf.get(name)?.provides ?? rootServices?.provides ?? [] },
|
|
237
|
+
// 卸载会断服务的依赖者(与卸载路由 409 同口径),供卸载弹窗装前预警。
|
|
238
|
+
serviceDependents: findServiceDependents(name, status),
|
|
239
|
+
});
|
|
179
240
|
});
|
|
180
241
|
// 安装:复用 package-manager 的 npm pack 流程;owner 级(安装第三方代码 = 高危)。
|
|
181
|
-
expressApp.post('/api/marketplace/install', gate(
|
|
242
|
+
expressApp.post('/api/marketplace/install', gate(), async (req, res) => {
|
|
182
243
|
const npmPkg = req.body?.name;
|
|
183
244
|
if (!npmPkg || typeof npmPkg !== 'string' || !PKG_NAME_RE.test(npmPkg)) {
|
|
184
245
|
res.status(400).json({ error: 'name 字段必须是合法 npm 包名' });
|
|
@@ -196,20 +257,16 @@ export function registerMarketplaceRoutes(expressApp, ctx, getPluginMgr, gate, r
|
|
|
196
257
|
res.status(500).json({ error: err instanceof Error ? err.message : String(err) });
|
|
197
258
|
}
|
|
198
259
|
});
|
|
199
|
-
// 卸载:owner
|
|
260
|
+
// 卸载:owner 级。唯一护栏——禁卸"删了会断别人服务依赖"的包(无替代提供者)。
|
|
261
|
+
// 不再保护核心/契约/WebUI 基础设施:用户要切就让其切(基础设施自删的后果自负)。
|
|
200
262
|
// 真正删目录 + 清残留配置由 package-manager.uninstall 负责。
|
|
201
|
-
expressApp.post('/api/marketplace/uninstall', gate(
|
|
263
|
+
expressApp.post('/api/marketplace/uninstall', gate(), async (req, res) => {
|
|
202
264
|
const name = req.body?.name;
|
|
203
265
|
if (!name || typeof name !== 'string' || !PKG_NAME_RE.test(name)) {
|
|
204
266
|
res.status(400).json({ error: 'name 字段必须是合法 npm 包名' });
|
|
205
267
|
return;
|
|
206
268
|
}
|
|
207
269
|
const status = getPluginMgr()?.getStatus() ?? [];
|
|
208
|
-
const entry = status.find(p => p.name === name);
|
|
209
|
-
if (isProtectedPackage(name, entry)) {
|
|
210
|
-
res.status(400).json({ error: `「${name}」是核心 / 契约 / WebUI 基础设施,禁止从市场卸载` });
|
|
211
|
-
return;
|
|
212
|
-
}
|
|
213
270
|
const dependents = findServiceDependents(name, status);
|
|
214
271
|
if (dependents.length > 0) {
|
|
215
272
|
res.status(409).json({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"marketplace.js","sourceRoot":"","sources":["../../src/routes/marketplace.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"marketplace.js","sourceRoot":"","sources":["../../src/routes/marketplace.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugins.d.ts","sourceRoot":"","sources":["../../src/routes/plugins.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAE7E,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"plugins.d.ts","sourceRoot":"","sources":["../../src/routes/plugins.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAE7E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAKhE,OAAO,KAAK,OAAO,MAAM,SAAS,CAAC;AACnC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C,8BAA8B;AAC9B,wBAAgB,oBAAoB,CAClC,UAAU,EAAE,OAAO,CAAC,OAAO,EAC3B,GAAG,EAAE,OAAO,EACZ,MAAM,EAAE,MAAM,UAAU,GAAG,SAAS,EACpC,YAAY,EAAE,MAAM,oBAAoB,GAAG,SAAS,EACpD,QAAQ,EAAE,CAAC,GAAG,EAAE;IAAE,OAAO,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,KAAK,YAAY,GAAG,SAAS,EAC7E,IAAI,EAAE,SAAS,GACd,IAAI,CA6XN"}
|
package/dist/routes/plugins.js
CHANGED
|
@@ -2,7 +2,7 @@ import { CORE_CONFIG_SCHEMA } from '@aalis/core';
|
|
|
2
2
|
/** 注册插件管理 + 全局配置相关 REST 路由 */
|
|
3
3
|
export function registerPluginRoutes(expressApp, ctx, getApp, getPluginMgr, identify, gate) {
|
|
4
4
|
// 获取插件列表及状态
|
|
5
|
-
expressApp.get('/api/plugins', gate(
|
|
5
|
+
expressApp.get('/api/plugins', gate(), (_req, res) => {
|
|
6
6
|
const app = getApp();
|
|
7
7
|
const pm = getPluginMgr();
|
|
8
8
|
if (!app || !pm) {
|
|
@@ -13,14 +13,11 @@ export function registerPluginRoutes(expressApp, ctx, getApp, getPluginMgr, iden
|
|
|
13
13
|
// 方便 UI 搜索框命中工具名/指令名时定位到注册插件;能力披露用聚合 capability。
|
|
14
14
|
const toolsByPlugin = new Map();
|
|
15
15
|
const capsByPlugin = new Map();
|
|
16
|
-
const addCaps = (plugin,
|
|
17
|
-
if (
|
|
16
|
+
const addCaps = (plugin, visibility) => {
|
|
17
|
+
if (visibility !== 'restricted')
|
|
18
18
|
return;
|
|
19
19
|
const set = capsByPlugin.get(plugin) ?? new Set();
|
|
20
|
-
|
|
21
|
-
set.add(p);
|
|
22
|
-
if (visibility === 'restricted')
|
|
23
|
-
set.add('visibility:restricted');
|
|
20
|
+
set.add('visibility:restricted');
|
|
24
21
|
capsByPlugin.set(plugin, set);
|
|
25
22
|
};
|
|
26
23
|
const tools = ctx.getService('tools')?.getAll() ?? [];
|
|
@@ -28,7 +25,7 @@ export function registerPluginRoutes(expressApp, ctx, getApp, getPluginMgr, iden
|
|
|
28
25
|
const list = toolsByPlugin.get(t.pluginName) ?? [];
|
|
29
26
|
list.push(t.name);
|
|
30
27
|
toolsByPlugin.set(t.pluginName, list);
|
|
31
|
-
addCaps(t.pluginName, t.
|
|
28
|
+
addCaps(t.pluginName, t.visibility);
|
|
32
29
|
}
|
|
33
30
|
const commandsByPlugin = new Map();
|
|
34
31
|
const cmds = ctx.getService('commands')?.getAll() ?? [];
|
|
@@ -37,7 +34,7 @@ export function registerPluginRoutes(expressApp, ctx, getApp, getPluginMgr, iden
|
|
|
37
34
|
const list = commandsByPlugin.get(owner) ?? [];
|
|
38
35
|
list.push(c.name);
|
|
39
36
|
commandsByPlugin.set(owner, list);
|
|
40
|
-
addCaps(owner, c.
|
|
37
|
+
addCaps(owner, c.visibility);
|
|
41
38
|
}
|
|
42
39
|
const plugins = pm.getStatus().map(p => ({
|
|
43
40
|
name: p.name,
|
|
@@ -45,8 +42,7 @@ export function registerPluginRoutes(expressApp, ctx, getApp, getPluginMgr, iden
|
|
|
45
42
|
displayName: p.displayName,
|
|
46
43
|
state: p.state,
|
|
47
44
|
provides: p.provides ?? [],
|
|
48
|
-
// 能力披露:该插件「要调用哪些子系统」(inject
|
|
49
|
-
// (工具/指令声明的 permissions + dangerous 标记),供安装后知情查看。
|
|
45
|
+
// 能力披露:该插件「要调用哪些子系统」(inject 依赖)+「是否含 restricted 工具/指令」,供安装后知情查看。
|
|
50
46
|
requiredServices: p.requiredServices ?? [],
|
|
51
47
|
optionalServices: p.optionalServices ?? [],
|
|
52
48
|
capabilities: [...(capsByPlugin.get(p.name) ?? [])],
|
|
@@ -65,7 +61,7 @@ export function registerPluginRoutes(expressApp, ctx, getApp, getPluginMgr, iden
|
|
|
65
61
|
res.json({ plugins });
|
|
66
62
|
});
|
|
67
63
|
// 获取可用的 WebUI 页面(由活跃插件通过 useWebuiService.registerPage 注册)
|
|
68
|
-
expressApp.get('/api/pages', gate(
|
|
64
|
+
expressApp.get('/api/pages', gate(), (_req, res) => {
|
|
69
65
|
const app = getApp();
|
|
70
66
|
const pm = getPluginMgr();
|
|
71
67
|
if (!app || !pm) {
|
|
@@ -111,30 +107,13 @@ export function registerPluginRoutes(expressApp, ctx, getApp, getPluginMgr, iden
|
|
|
111
107
|
res.status(500).json({ error: `插件 ${pluginName} 上下文不可用` });
|
|
112
108
|
return;
|
|
113
109
|
}
|
|
114
|
-
// =====
|
|
115
|
-
//
|
|
116
|
-
//
|
|
117
|
-
//
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
const authority = ctx.getService('authority');
|
|
122
|
-
const visibility = entry.module.actionsMeta?.[method]?.visibility ?? 'restricted';
|
|
123
|
-
if (authority) {
|
|
124
|
-
const denied = authority.authorize(caller, {
|
|
125
|
-
capability: `action:${pluginName}:${method}`,
|
|
126
|
-
visibility,
|
|
127
|
-
});
|
|
128
|
-
if (denied) {
|
|
129
|
-
res.status(403).json({ error: `操作 ${pluginName}/${method} 被拒: ${denied}` });
|
|
130
|
-
return;
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
else if (visibility === 'restricted') {
|
|
134
|
-
// fail-closed:authority 缺席(未配置/bounce 窗口期)无法裁决。
|
|
135
|
-
// 未声明 actionsMeta 的 action 默认 restricted,缺席时一律拒绝;只放行
|
|
136
|
-
// 显式声明了 public 的 action。避免敏感 action 在权限服务缺位时裸奔。
|
|
137
|
-
res.status(503).json({ error: `权限服务不可用,操作 ${pluginName}/${method} 暂时被拒绝` });
|
|
110
|
+
// ===== owner 闸 + 调用者身份(单 owner 终态)=====
|
|
111
|
+
// 单 token ⟺ webui:console ⟺ owner;auth.middleware 已校 token,这里复核身份并把
|
|
112
|
+
// caller 传给 action。各 action 自身对敏感操作再做 owner 自检(如 setUserTier)。
|
|
113
|
+
// 多账户的 action: 能力委托(per-user grant/deny / actionsMeta 可见性)已剥离。
|
|
114
|
+
const caller = identify(req);
|
|
115
|
+
if (!caller) {
|
|
116
|
+
res.status(403).json({ error: `操作 ${pluginName}/${method} 需要 owner 权限` });
|
|
138
117
|
return;
|
|
139
118
|
}
|
|
140
119
|
try {
|
|
@@ -147,12 +126,12 @@ export function registerPluginRoutes(expressApp, ctx, getApp, getPluginMgr, iden
|
|
|
147
126
|
}
|
|
148
127
|
});
|
|
149
128
|
// 获取当前全局配置
|
|
150
|
-
expressApp.get('/api/config', gate(
|
|
129
|
+
expressApp.get('/api/config', gate(), (_req, res) => {
|
|
151
130
|
const allConfig = ctx.config.getAll();
|
|
152
131
|
res.json({ ...allConfig, _schema: CORE_CONFIG_SCHEMA });
|
|
153
132
|
});
|
|
154
133
|
// 更新全局配置字段
|
|
155
|
-
expressApp.put('/api/config', gate(
|
|
134
|
+
expressApp.put('/api/config', gate(), (req, res) => {
|
|
156
135
|
const updates = req.body;
|
|
157
136
|
if (!updates || typeof updates !== 'object') {
|
|
158
137
|
res.status(400).json({ error: '请求体必须是对象' });
|
|
@@ -189,13 +168,13 @@ export function registerPluginRoutes(expressApp, ctx, getApp, getPluginMgr, iden
|
|
|
189
168
|
}
|
|
190
169
|
});
|
|
191
170
|
// 获取单个插件的原始配置(未脱敏,给编辑器用)
|
|
192
|
-
expressApp.get('/api/plugins/:name/config', gate(
|
|
171
|
+
expressApp.get('/api/plugins/:name/config', gate(), (req, res) => {
|
|
193
172
|
const pluginName = req.params.name;
|
|
194
173
|
const pluginConfig = ctx.config.getPluginConfig(pluginName);
|
|
195
174
|
res.json({ name: pluginName, config: pluginConfig });
|
|
196
175
|
});
|
|
197
176
|
// 更新插件配置
|
|
198
|
-
expressApp.put('/api/plugins/:name/config', gate(
|
|
177
|
+
expressApp.put('/api/plugins/:name/config', gate(), async (req, res) => {
|
|
199
178
|
const pluginName = req.params.name;
|
|
200
179
|
const newConfig = req.body?.config;
|
|
201
180
|
if (!newConfig || typeof newConfig !== 'object') {
|
|
@@ -218,7 +197,7 @@ export function registerPluginRoutes(expressApp, ctx, getApp, getPluginMgr, iden
|
|
|
218
197
|
}
|
|
219
198
|
});
|
|
220
199
|
// 启用插件
|
|
221
|
-
expressApp.post('/api/plugins/:name/enable', gate(
|
|
200
|
+
expressApp.post('/api/plugins/:name/enable', gate(), async (req, res) => {
|
|
222
201
|
const pluginName = req.params.name;
|
|
223
202
|
const app = getApp();
|
|
224
203
|
const pm = getPluginMgr();
|
|
@@ -236,7 +215,7 @@ export function registerPluginRoutes(expressApp, ctx, getApp, getPluginMgr, iden
|
|
|
236
215
|
}
|
|
237
216
|
});
|
|
238
217
|
// 禁用插件
|
|
239
|
-
expressApp.post('/api/plugins/:name/disable', gate(
|
|
218
|
+
expressApp.post('/api/plugins/:name/disable', gate(), async (req, res) => {
|
|
240
219
|
const pluginName = req.params.name;
|
|
241
220
|
const app = getApp();
|
|
242
221
|
const pm = getPluginMgr();
|
|
@@ -254,7 +233,7 @@ export function registerPluginRoutes(expressApp, ctx, getApp, getPluginMgr, iden
|
|
|
254
233
|
}
|
|
255
234
|
});
|
|
256
235
|
// 重新扫描 packages/ 并加载新插件
|
|
257
|
-
expressApp.post('/api/plugins/scan', gate(
|
|
236
|
+
expressApp.post('/api/plugins/scan', gate(), async (_req, res) => {
|
|
258
237
|
const app = getApp();
|
|
259
238
|
const pm = getPluginMgr();
|
|
260
239
|
if (!app || !pm) {
|
|
@@ -271,7 +250,7 @@ export function registerPluginRoutes(expressApp, ctx, getApp, getPluginMgr, iden
|
|
|
271
250
|
}
|
|
272
251
|
});
|
|
273
252
|
// 安装插件(从 npm 下载到 packages/ 并加载)
|
|
274
|
-
expressApp.post('/api/plugins/install', gate(
|
|
253
|
+
expressApp.post('/api/plugins/install', gate(), async (req, res) => {
|
|
275
254
|
const app = getApp();
|
|
276
255
|
const pm = getPluginMgr();
|
|
277
256
|
if (!app || !pm) {
|
|
@@ -302,7 +281,7 @@ export function registerPluginRoutes(expressApp, ctx, getApp, getPluginMgr, iden
|
|
|
302
281
|
}
|
|
303
282
|
});
|
|
304
283
|
// 卸载插件
|
|
305
|
-
expressApp.post('/api/plugins/:name/uninstall', gate(
|
|
284
|
+
expressApp.post('/api/plugins/:name/uninstall', gate(), async (req, res) => {
|
|
306
285
|
const app = getApp();
|
|
307
286
|
const pm = getPluginMgr();
|
|
308
287
|
if (!app || !pm) {
|
|
@@ -325,7 +304,7 @@ export function registerPluginRoutes(expressApp, ctx, getApp, getPluginMgr, iden
|
|
|
325
304
|
}
|
|
326
305
|
});
|
|
327
306
|
// 创建插件多实例
|
|
328
|
-
expressApp.post('/api/plugins/:name/instances', gate(
|
|
307
|
+
expressApp.post('/api/plugins/:name/instances', gate(), async (req, res) => {
|
|
329
308
|
const moduleName = req.params.name;
|
|
330
309
|
const suffix = req.body?.suffix;
|
|
331
310
|
const config = req.body?.config ?? {};
|
|
@@ -353,7 +332,7 @@ export function registerPluginRoutes(expressApp, ctx, getApp, getPluginMgr, iden
|
|
|
353
332
|
}
|
|
354
333
|
});
|
|
355
334
|
// 删除插件多实例
|
|
356
|
-
expressApp.delete('/api/plugins/:instanceId/instance', gate(
|
|
335
|
+
expressApp.delete('/api/plugins/:instanceId/instance', gate(), async (req, res) => {
|
|
357
336
|
const instanceId = req.params.instanceId;
|
|
358
337
|
const app = getApp();
|
|
359
338
|
const pm = getPluginMgr();
|
|
@@ -371,7 +350,7 @@ export function registerPluginRoutes(expressApp, ctx, getApp, getPluginMgr, iden
|
|
|
371
350
|
}
|
|
372
351
|
});
|
|
373
352
|
// 保存配置到磁盘
|
|
374
|
-
expressApp.post('/api/config/save', gate(
|
|
353
|
+
expressApp.post('/api/config/save', gate(), (_req, res) => {
|
|
375
354
|
const app = getApp();
|
|
376
355
|
const pm = getPluginMgr();
|
|
377
356
|
if (!app || !pm) {
|