@aalis/plugin-webui-server 0.9.0 → 0.10.1

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.
@@ -1,29 +1,40 @@
1
+ import { readFileSync } from 'node:fs';
1
2
  import { createRequire } from 'node:module';
2
3
  import { resolve } from 'node:path';
3
4
  import { pathToFileURL } from 'node:url';
5
+ import { classifyDepSpec, isRegistryDep, isUpgrade } from '@aalis/util-dep-spec';
4
6
  // 纯 npm 路线:npm registry 的 keyword 检索即天然索引,无自建服务器、无静态索引。
5
7
  // 分发走 package-manager 的 npm pack。
6
8
  // 注:npm 的 search API 并非所有镜像都支持(淘宝等国内源不支持),故 registry
7
9
  // 基址可配置(marketplaceRegistry),默认官方源;国内用户可配代理/支持 search 的镜像。
8
10
  const DEFAULT_REGISTRY = 'https://registry.npmjs.org';
9
- // 市场收录四类:功能插件 aalis-plugin / 工具库 aalis-util / 契约 aalis-api / 前端 aalis-interface。
11
+ // 市场收录五类:功能插件 aalis-plugin / 工具库 aalis-util / 契约 aalis-api / 数据规范 aalis-schema / 前端 aalis-interface。
10
12
  // npm search 的 keywords: 逗号分隔 = 任一命中(核心/工具链不带任何类型词,自然不进市场)。
11
- const AALIS_KEYWORDS = ['aalis-plugin', 'aalis-util', 'aalis-api', 'aalis-interface'];
13
+ const AALIS_KEYWORDS = ['aalis-plugin', 'aalis-util', 'aalis-api', 'aalis-schema', 'aalis-interface'];
12
14
  const SEARCH_TIMEOUT_MS = 8000;
13
- // 合法 npm 包名(可选 scope)+ 可选 @version 后缀(支持指定版本安装)
14
- const PKG_NAME_RE = /^(@[a-z0-9\-_.]+\/)?[a-z0-9\-_.]+(@[a-z0-9.-]+)?$/i;
15
+ // 依赖图端点专用:这里的 name 被拼进 **registry URL 的路径段**(`${base}/${name}`),
16
+ // 需要挡的是 `..` / 查询串注入,不是 npm 的 argv 面。
17
+ // 装/卸/更新三条路径的包名校验都在 package-manager 服务层(validatePackageSpec /
18
+ // buildUpdateSpecs)——那里是所有调用方的必经之路,路由不再自带第二份 argv 面校验。
19
+ //
20
+ // 这一份**不含版本段**,与服务层那份(`PKG_SPEC_RE`,允许 `name@version` 因为它要过 npm argv)
21
+ // 刻意不同:packument URL 是 `${base}/${name}`,带上 `@1.2.3` 必然 404,而 404 只会让
22
+ // `if (r.ok)` 静默跳过、前端拿到一张空图而不是 400。收成纯包名后这类输入直接被拒。
23
+ const PKG_NAME_RE = /^(@[a-z0-9][a-z0-9\-_.]*\/)?[a-z0-9][a-z0-9\-_.]*$/i;
15
24
  /**
16
25
  * 按**类型关键词**分类(npm search 直接返回 keywords,与加载约定的类型词 1:1,可靠)。
17
- * 市场搜索已保证结果只含 aalis-plugin/util/api/interface 之一,无需再靠包名猜测。纯函数,便于单测。
26
+ * 市场搜索已保证结果只含 aalis-plugin/util/api/schema/interface 之一,无需再靠包名猜测。纯函数,便于单测。
18
27
  */
19
28
  export function classifyPackage(keywords) {
20
29
  if (keywords.includes('aalis-interface'))
21
30
  return 'interface';
22
31
  if (keywords.includes('aalis-api'))
23
32
  return 'api';
33
+ if (keywords.includes('aalis-schema'))
34
+ return 'schema';
24
35
  if (keywords.includes('aalis-util'))
25
36
  return 'util';
26
- return 'plugin'; // 进了市场却非上述三类 → 必是功能插件(aalis-plugin)
37
+ return 'plugin'; // 进了市场却非上述四类 → 必是功能插件(aalis-plugin)
27
38
  }
28
39
  /**
29
40
  * 补全「已安装」判定。getStatus() 只含**已加载的运行时插件**——api 契约 / 前端 / 核心
@@ -95,24 +106,138 @@ export function buildDependencyChain(target, depMap, direction, opts = {}) {
95
106
  };
96
107
  return build(target, 0, new Set());
97
108
  }
109
+ /**
110
+ * 汇总三路信号判定本地实况。纯函数,便于单测——这处判断依赖部署形态,易错,必须能被测住。
111
+ *
112
+ * @param request 根 package.json 里该包的依赖声明;不在其中则 undefined
113
+ * @param meta 从项目根 resolve 到并读出的 package.json;resolve 不到则 undefined
114
+ * @param inScan 该包是否出现在本地目录扫描结果里(扫 monorepo packages/ 与 node_modules/@aalis)
115
+ */
116
+ export function resolveLocalInfo(request, meta, scanned) {
117
+ if (meta) {
118
+ return {
119
+ version: meta.version,
120
+ request,
121
+ origin: classifyDepSpec(request),
122
+ keywords: meta.keywords,
123
+ description: meta.description,
124
+ };
125
+ }
126
+ // resolve 不到(不在 node_modules)却被扫描扫出来 → 只能来自 monorepo 的 packages/ 源码目录。
127
+ // 此处不可沿用 classifyDepSpec(undefined)=transitive:那是「在 node_modules 里但非直接依赖」
128
+ // 的语义,而这里的包压根不在 node_modules。实测本仓库 @aalis/plugin-commands 等全走这条分支。
129
+ //
130
+ // 元数据取自扫描时读到的那份 package.json:pnpm 工作区下根 node_modules 只链根依赖
131
+ // (本仓库根 dependencies 仅 core 与 runtime),packages/ 下的包一律 resolve 不到,故这条
132
+ // 分支是工作区形态的**常态**而非边角。两处都不能省:
133
+ // - 不带 version,前端的 `resolved ?? version` 兜底就把 npm latest 当成已装版本显示
134
+ // (实测 93 张卡片里 91 张显示的是远端版本号);
135
+ // - 不带 keywords,**离线降级列表整批看不见工作区包**——toLocalPackages 按 keywords 筛
136
+ // aalis 组件,而国内多数镜像不支持 search API,降级是常态路径。
137
+ if (scanned) {
138
+ return {
139
+ version: scanned.version,
140
+ request,
141
+ origin: 'workspace',
142
+ keywords: scanned.keywords,
143
+ description: scanned.description,
144
+ };
145
+ }
146
+ return undefined;
147
+ }
148
+ /**
149
+ * 读根 package.json 的 dependencies —— 来源判据与系统组件名单的唯一真相源。
150
+ * **每次调用重读**:安装/卸载/更新都会改写它,缓存会让页面显示陈旧来源。
151
+ */
152
+ function readRootDependencies() {
153
+ try {
154
+ const root = JSON.parse(readFileSync(resolve(process.cwd(), 'package.json'), 'utf-8'));
155
+ return root.dependencies ?? {};
156
+ }
157
+ catch {
158
+ return {};
159
+ }
160
+ }
161
+ /**
162
+ * 按 keywords 判定系统组件分类;非系统组件返回 undefined。
163
+ *
164
+ * `aalis-core` / `aalis-runtime` **故意不进 `AALIS_KEYWORDS`**——那个常量是 npm 检索轴,
165
+ * 而关键词是开放命名空间:任何人都能发一个带 `aalis-core` 关键词的包,在市场里拿到一张
166
+ * 「内核」卡片。本函数的输入只来自**本地已装包**的 keywords(不可伪造),关键词在这里
167
+ * 只作分类标注;版本查询按精确包名而非关键词搜索,故不存在冒名空间。纯函数,便于单测。
168
+ */
169
+ export function classifySystemComponent(keywords) {
170
+ const kw = keywords ?? [];
171
+ if (kw.includes('aalis-core'))
172
+ return 'core';
173
+ if (kw.includes('aalis-runtime'))
174
+ return 'runtime';
175
+ if (kw.includes('aalis-api'))
176
+ return 'api';
177
+ if (kw.includes('aalis-schema'))
178
+ return 'schema';
179
+ if (kw.includes('aalis-util'))
180
+ return 'util';
181
+ return undefined;
182
+ }
183
+ /** 组件排序:内核与宿主置顶(更新它们必须全量重启),其余按类型再按名。 */
184
+ const SYSTEM_KIND_ORDER = { core: 0, runtime: 1, api: 2, schema: 3, util: 4 };
185
+ export function sortSystemComponents(list) {
186
+ return [...list].sort((a, b) => SYSTEM_KIND_ORDER[a.kind] - SYSTEM_KIND_ORDER[b.kind] || a.name.localeCompare(b.name));
187
+ }
98
188
  /** npm search 响应 → 市场卡片列表(标注已装 + 官方 + 富信息)。纯函数,便于单测。 */
99
- export function toMarketplacePackages(data, installed) {
100
- return (data.objects ?? []).map(o => ({
101
- name: o.package.name,
102
- version: o.package.version,
103
- description: o.package.description ?? '',
104
- author: o.package.publisher?.username,
105
- installed: installed.has(o.package.name),
106
- official: o.package.name.startsWith('@aalis/'),
107
- category: classifyPackage(o.package.keywords ?? []),
108
- keywords: (o.package.keywords ?? []).filter(k => !AALIS_KEYWORDS.includes(k)),
109
- downloads: o.downloads?.monthly,
110
- updated: o.updated ?? o.package.date,
111
- score: o.score?.final,
112
- insecure: o.flags?.insecure ? true : undefined,
113
- license: o.package.license,
114
- links: o.package.links,
115
- }));
189
+ export function toMarketplacePackages(data, installed,
190
+ /** 本地实况查询。缺省则卡片无 resolved,前端退化为「已安装但版本未知」。 */
191
+ localOf = () => undefined) {
192
+ return (data.objects ?? []).map(o => {
193
+ const local = localOf(o.package.name);
194
+ return {
195
+ name: o.package.name,
196
+ version: o.package.version,
197
+ resolved: local?.version,
198
+ request: local?.request,
199
+ origin: local?.origin,
200
+ // package-manager 的更新闸同一份实现(@aalis/util-dep-spec),定义上不可能分岔。
201
+ updatable: isRegistryDep(local?.request) && isUpgrade(local?.version, o.package.version),
202
+ description: o.package.description ?? '',
203
+ author: o.package.publisher?.username,
204
+ installed: installed.has(o.package.name),
205
+ official: o.package.name.startsWith('@aalis/'),
206
+ category: classifyPackage(o.package.keywords ?? []),
207
+ keywords: (o.package.keywords ?? []).filter(k => !AALIS_KEYWORDS.includes(k)),
208
+ downloads: o.downloads?.monthly,
209
+ updated: o.updated ?? o.package.date,
210
+ score: o.score?.final,
211
+ insecure: o.flags?.insecure ? true : undefined,
212
+ license: o.package.license,
213
+ links: o.package.links,
214
+ };
215
+ });
216
+ }
217
+ /**
218
+ * npm 检索不可达时的降级卡片:只用本地实况拼。
219
+ * 国内多数镜像不支持 search API,这是常态而非边角情形——降级必须仍能管理已装插件,
220
+ * 而不是给一句 warning 配一张空列表。分类走本地 keywords,与在线路径同一判据。纯函数,便于单测。
221
+ */
222
+ export function toLocalPackages(local) {
223
+ return [...local.entries()]
224
+ .filter(([, info]) => (info.keywords ?? []).some(k => AALIS_KEYWORDS.includes(k)))
225
+ .map(([name, info]) => ({
226
+ name,
227
+ // 离线拿不到 npm latest,用本地版本占位。
228
+ version: info.version ?? '',
229
+ resolved: info.version,
230
+ request: info.request,
231
+ origin: info.origin,
232
+ // 离线路径下没有「远端更新版」这个信息,一律不可更新——不是判据放宽,是事实缺失。
233
+ updatable: false,
234
+ description: info.description ?? '',
235
+ installed: true,
236
+ official: name.startsWith('@aalis/'),
237
+ category: classifyPackage(info.keywords ?? []),
238
+ keywords: (info.keywords ?? []).filter(k => !AALIS_KEYWORDS.includes(k)),
239
+ }))
240
+ .sort((a, b) => a.name.localeCompare(b.name));
116
241
  }
117
242
  /** npm packument → 装前能力清单(读 latest 版本的 aalis.service + 依赖名)。纯函数,便于单测。 */
118
243
  export function toManifest(packument) {
@@ -136,28 +261,46 @@ export function buildSearchUrl(q, keyword, registryBase = DEFAULT_REGISTRY) {
136
261
  /** 注册插件市场 REST 路由 */
137
262
  export function registerMarketplaceRoutes(expressApp, ctx, getPluginMgr, gate, registryBase = DEFAULT_REGISTRY,
138
263
  /** 本地包扫描:`name → 依赖名[]`(含 monorepo 工作区包)。keys 补 require.resolve 在 pnpm 工作区的盲区;values 供依赖图。 */
139
- getLocalPackages = () => new Map()) {
264
+ getLocalPackages = () => new Map(),
265
+ /**
266
+ * 装完一个包后重跑前端发现(幂等)。
267
+ *
268
+ * 必需而非锦上添花:`aalis-interface` 包**不是插件**,装完不会触发 rescanPlugins 那条
269
+ * 通路,于是它不会出现在服务页的下拉里、必须重启才看得见——而重启恰恰是市场承诺不需要
270
+ * 用户手动做的事。缺省为 no-op,便于单测。
271
+ */
272
+ rediscoverClients = () => 0) {
140
273
  // 市场列表:npm registry keyword 检索 + 标注已装。网络失败降级为空列表 + warning,
141
274
  // 不阻塞 WebUI(管理读档,与 /api/plugins 同级)。
142
275
  expressApp.get('/api/marketplace', gate(), async (req, res) => {
143
276
  const q = typeof req.query.q === 'string' ? req.query.q.trim() : '';
144
277
  const status = getPluginMgr()?.getStatus() ?? [];
145
278
  // 已装判定独立于 getStatus(后者只含已加载运行时插件,漏掉带 marker 不加载的 api/前端/核心)。
146
- // 两路补判:① 本地物理存在(含 monorepo packages/ 工作区包——require.resolve 从仓库根解析不到);
147
- // 项目根能 resolve(独立部署的扁平 node_modules / 第三方根依赖)。
279
+ // 同一次解析顺带取出本地版本:卡片上的 version npm latest,只有拿到本地 resolved
280
+ // 才能判「可更新」(版本序由服务端算进 updatable 下发,前端不自算)。
148
281
  const localPkgs = getLocalPackages();
149
282
  const projectRequire = createRequire(pathToFileURL(resolve(process.cwd(), 'package.json')));
150
- const isPresent = (name) => {
151
- if (localPkgs.has(name))
152
- return true;
283
+ const rootDeps = readRootDependencies();
284
+ /** 读本地 package.json。用 resolve+readFileSync 而非 require():require 有模块缓存,更新后会返回旧版本号。 */
285
+ const readPkgJson = (name) => {
153
286
  try {
154
- projectRequire.resolve(`${name}/package.json`);
155
- return true;
287
+ return JSON.parse(readFileSync(projectRequire.resolve(`${name}/package.json`), 'utf-8'));
156
288
  }
157
289
  catch {
158
- return false;
290
+ return undefined;
159
291
  }
160
292
  };
293
+ const readLocal = (name) => resolveLocalInfo(rootDeps[name], readPkgJson(name), localPkgs.get(name));
294
+ /** 每个包名只读一次盘,已装判定与版本展示共用。 */
295
+ const localCache = new Map();
296
+ const localOf = (name) => {
297
+ if (localCache.has(name))
298
+ return localCache.get(name);
299
+ const info = readLocal(name);
300
+ if (info)
301
+ localCache.set(name, info);
302
+ return info;
303
+ };
161
304
  // 四类关键词各发一条检索(npm 的 keywords 逗号是 AND 非 OR),并行后按包名合并去重 = OR。
162
305
  const fetchKw = async (kw) => {
163
306
  const r = await fetch(buildSearchUrl(q, kw, registryBase), { signal: AbortSignal.timeout(SEARCH_TIMEOUT_MS) });
@@ -171,7 +314,14 @@ getLocalPackages = () => new Map()) {
171
314
  const reason = settled.find(s => s.status === 'rejected');
172
315
  const msg = reason?.reason instanceof Error ? reason.reason.message : String(reason?.reason ?? '未知错误');
173
316
  ctx.logger.debug(`market: npm registry 检索失败: ${msg}`);
174
- res.json({ packages: [], warning: `无法连接 npm 仓库(${msg}),暂时只能管理本地已装插件` });
317
+ // 降级:只列本地已装。名单取自本地扫描 + 运行时已加载插件(后者覆盖扫描目录之外的部署)。
318
+ const names = new Set([...localPkgs.keys(), ...status.map(p => p.name)]);
319
+ for (const n of names)
320
+ localOf(n);
321
+ res.json({
322
+ packages: toLocalPackages(localCache),
323
+ warning: `无法连接 npm 仓库(${msg}),暂时只能管理本地已装插件`,
324
+ });
175
325
  return;
176
326
  }
177
327
  const byName = new Map();
@@ -179,8 +329,66 @@ getLocalPackages = () => new Map()) {
179
329
  for (const o of r.value.objects ?? [])
180
330
  byName.set(o.package.name, o);
181
331
  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) });
332
+ const installed = augmentInstalled([...byName.keys()], new Set(status.map(p => p.name)), n => localOf(n) !== undefined);
333
+ res.json({ packages: toMarketplacePackages(merged, installed, localOf) });
334
+ });
335
+ // 系统组件:内核 / 宿主 / 契约 / 规范 / 工具库。**列表只来自本地实况**(已装包 + 根依赖表),
336
+ // 不走 npm 关键词检索——关键词是开放命名空间,任何人都能发一个带 aalis-core 关键词的包,
337
+ // 在市场里拿到一张「内核」卡片。版本查询按精确包名,故不存在冒名空间。
338
+ // 这一页只提供更新,无安装无卸载:它们要么随脚手架就位,要么是插件的依赖被自动带入。
339
+ expressApp.get('/api/system-components', gate(), async (_req, res) => {
340
+ const localPkgs = getLocalPackages();
341
+ const projectRequire = createRequire(pathToFileURL(resolve(process.cwd(), 'package.json')));
342
+ const rootDeps = readRootDependencies();
343
+ /** 候选名单:本地扫描到的 + 根依赖里声明的。两路并集才覆盖两种部署形态。 */
344
+ const candidates = new Set([...localPkgs.keys(), ...Object.keys(rootDeps)]);
345
+ const components = [];
346
+ for (const name of candidates) {
347
+ let meta;
348
+ try {
349
+ // readFileSync 而非 require():require 有模块缓存,更新后会返回旧版本号。
350
+ meta = JSON.parse(readFileSync(projectRequire.resolve(`${name}/package.json`), 'utf-8'));
351
+ }
352
+ catch {
353
+ continue; // resolve 不到(工作区源码目录里的包)——无版本可比,不进本页
354
+ }
355
+ const kind = classifySystemComponent(meta?.keywords);
356
+ if (!kind)
357
+ continue;
358
+ components.push({
359
+ name,
360
+ version: meta?.version,
361
+ request: rootDeps[name],
362
+ origin: classifyDepSpec(rootDeps[name]),
363
+ description: meta?.description,
364
+ kind,
365
+ // 与市场页、与 package-manager 的闸同一份实现。latest 尚未查到,故版本序在下面补判。
366
+ updatable: isRegistryDep(rootDeps[name]),
367
+ });
368
+ }
369
+ // 按精确包名并发查 latest;任何一条失败只让该行缺 latest(显示"—"),不拖垮整页。
370
+ const base = registryBase.replace(/\/+$/, '') || DEFAULT_REGISTRY;
371
+ await Promise.all(components.map(async (c) => {
372
+ try {
373
+ const r = await fetch(`${base}/${c.name.replace('/', '%2F')}`, {
374
+ signal: AbortSignal.timeout(SEARCH_TIMEOUT_MS),
375
+ });
376
+ if (!r.ok)
377
+ return;
378
+ const p = (await r.json());
379
+ c.latest = p['dist-tags']?.latest;
380
+ }
381
+ catch {
382
+ /* 离线/镜像不支持:该行不显示可更新,不报错 */
383
+ }
384
+ finally {
385
+ // 版本序补判:来源合格还不够,latest 必须**严格新于**本地。dist-tags.latest 可以
386
+ // 低于本地已装版本(发布事故后回滚 tag,或用户装过预发布版),漏了这一判就会把
387
+ // 降级渲染成更新。查不到 latest 同样落 false。
388
+ c.updatable = c.updatable && isUpgrade(c.version, c.latest);
389
+ }
390
+ }));
391
+ res.json({ components: sortSystemComponents(components) });
184
392
  });
185
393
  // 依赖图:本地 import 依赖图(name→deps 扫描)+ 运行时服务图(getStatus)合成,供装/卸/装前展示。
186
394
  // 两类边:import(链路树,可传递)+ service(每节点直接标注 + 根的提供者解析)。
@@ -191,7 +399,8 @@ getLocalPackages = () => new Map()) {
191
399
  res.status(400).json({ error: 'name 必须是合法 npm 包名' });
192
400
  return;
193
401
  }
194
- const depMap = getLocalPackages();
402
+ // 图算法只认 name→依赖名[],不该知道版本;在此把扫描结果投影成它要的形状。
403
+ const depMap = new Map([...getLocalPackages()].map(([n, e]) => [n, e.deps]));
195
404
  const status = getPluginMgr()?.getStatus() ?? [];
196
405
  const svcOf = new Map(status.map(p => [p.name, { provides: p.provides ?? [], requires: p.requiredServices ?? [] }]));
197
406
  // target 本地没有(装前浏览)→ 拉 packument 取直接依赖 + 服务,注入工作图当根种子。
@@ -238,11 +447,13 @@ getLocalPackages = () => new Map()) {
238
447
  serviceDependents: findServiceDependents(name, status),
239
448
  });
240
449
  });
241
- // 安装:复用 package-manager 的 npm pack 流程;owner 级(安装第三方代码 = 高危)。
450
+ // 安装:owner 级(安装第三方代码 = 高危)。
451
+ // 形状校验只做「是不是字符串」;包名的安全校验在 package-manager 的 validatePackageSpec
452
+ // 里统一做——那里是所有调用方(含直接拿服务的插件)的必经之路,也只有那一份实现。
242
453
  expressApp.post('/api/marketplace/install', gate(), async (req, res) => {
243
454
  const npmPkg = req.body?.name;
244
- if (!npmPkg || typeof npmPkg !== 'string' || !PKG_NAME_RE.test(npmPkg)) {
245
- res.status(400).json({ error: 'name 字段必须是合法 npm 包名' });
455
+ if (typeof npmPkg !== 'string') {
456
+ res.status(400).json({ error: 'name 字段必须是字符串' });
246
457
  return;
247
458
  }
248
459
  const pkgMgr = ctx.getService('package-manager');
@@ -251,19 +462,24 @@ getLocalPackages = () => new Map()) {
251
462
  return;
252
463
  }
253
464
  try {
254
- res.json(await pkgMgr.install(npmPkg));
465
+ const result = await pkgMgr.install(npmPkg);
466
+ // 装成功就重跑前端发现:新装的 aalis-interface 包要立刻可选,不能等重启。
467
+ if (result.ok)
468
+ rediscoverClients();
469
+ res.json(result);
255
470
  }
256
471
  catch (err) {
257
472
  res.status(500).json({ error: err instanceof Error ? err.message : String(err) });
258
473
  }
259
474
  });
260
- // 卸载:owner 级。唯一护栏——禁卸"删了会断别人服务依赖"的包(无替代提供者)。
261
- // 不再保护核心/契约/WebUI 基础设施:用户要切就让其切(基础设施自删的后果自负)。
262
- // 真正删目录 + 清残留配置由 package-manager.uninstall 负责。
475
+ // 卸载:owner 级。这里只挡"删了会断别人服务依赖"的包(无替代提供者)——它需要运行时
476
+ // getStatus,只有路由这一层拿得到。**包类型与来源的两道闸在服务层**(见
477
+ // package-manager 的 uninstallOne):市场只卸插件与前端界面,内核/宿主/契约/规范/工具库
478
+ // 不在职权内;非 registry 来源(工作区源码、file:/git、传递依赖)同样拒绝。
263
479
  expressApp.post('/api/marketplace/uninstall', gate(), async (req, res) => {
264
480
  const name = req.body?.name;
265
- if (!name || typeof name !== 'string' || !PKG_NAME_RE.test(name)) {
266
- res.status(400).json({ error: 'name 字段必须是合法 npm 包名' });
481
+ if (typeof name !== 'string') {
482
+ res.status(400).json({ error: 'name 字段必须是字符串' });
267
483
  return;
268
484
  }
269
485
  const status = getPluginMgr()?.getStatus() ?? [];
@@ -280,7 +496,41 @@ getLocalPackages = () => new Map()) {
280
496
  return;
281
497
  }
282
498
  try {
283
- res.json(await pkgMgr.uninstall(name));
499
+ const result = await pkgMgr.uninstall(name);
500
+ // 卸成功也要重跑发现——与 install 那侧对称。卸载会真删 node_modules,不对账就会留下
501
+ // 指向已删目录的前端候选与它那条 webui-client provider,被解析到即整站 404。
502
+ if (result.ok)
503
+ rediscoverClients();
504
+ res.json(result);
505
+ }
506
+ catch (err) {
507
+ res.status(500).json({ error: err instanceof Error ? err.message : String(err) });
508
+ }
509
+ });
510
+ // 批量更新:owner 级。**整批提交**,不是每张卡片各调一次——
511
+ // peer 冲突只有对整张版本映射一次预检才能发现,且重启次数恒为 1(与改了多少包无关)。
512
+ expressApp.post('/api/marketplace/update', gate(), async (req, res) => {
513
+ const raw = req.body?.targets;
514
+ if (!Array.isArray(raw) || raw.length === 0) {
515
+ res.status(400).json({ error: 'targets 必须是非空数组' });
516
+ return;
517
+ }
518
+ // 形状校验只做「是不是两个字符串」;包名/版本/总量的校验都在 package-manager 的
519
+ // buildUpdateSpecs 里统一做——那里是所有调用方(含直接拿服务的插件)的必经之路,
520
+ // 而总量的真实约束是 argv 字节数(见该处 SPEC_ARGV_BUDGET),不是包个数。
521
+ const targets = raw.map((t) => ({
522
+ name: typeof t?.name === 'string' ? t.name : '',
523
+ version: typeof t?.version === 'string' ? t.version : '',
524
+ }));
525
+ const pkgMgr = ctx.getService('package-manager');
526
+ if (!pkgMgr) {
527
+ res.status(503).json({ error: 'package-manager 服务未启用,无法更新' });
528
+ return;
529
+ }
530
+ try {
531
+ const result = await pkgMgr.update(targets);
532
+ // 成功时进程即将重启:先把响应刷出去,否则客户端只会看到连接被切断。
533
+ res.json(result);
284
534
  }
285
535
  catch (err) {
286
536
  res.status(500).json({ error: err instanceof Error ? err.message : String(err) });
@@ -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":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAGzC,OAAO,EAAE,eAAe,EAAkB,aAAa,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAKjG,wDAAwD;AACxD,kCAAkC;AAClC,qDAAqD;AACrD,2DAA2D;AAC3D,MAAM,gBAAgB,GAAG,4BAA4B,CAAC;AACtD,qGAAqG;AACrG,4DAA4D;AAC5D,MAAM,cAAc,GAAG,CAAC,cAAc,EAAE,YAAY,EAAE,WAAW,EAAE,cAAc,EAAE,iBAAiB,CAAC,CAAC;AACtG,MAAM,iBAAiB,GAAG,IAAI,CAAC;AAC/B,iEAAiE;AACjE,sCAAsC;AACtC,8DAA8D;AAC9D,uDAAuD;AACvD,EAAE;AACF,sEAAsE;AACtE,sEAAsE;AACtE,mDAAmD;AACnD,MAAM,WAAW,GAAG,qDAAqD,CAAC;AAiF1E;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,QAAkB;IAChD,IAAI,QAAQ,CAAC,QAAQ,CAAC,iBAAiB,CAAC;QAAE,OAAO,WAAW,CAAC;IAC7D,IAAI,QAAQ,CAAC,QAAQ,CAAC,WAAW,CAAC;QAAE,OAAO,KAAK,CAAC;IACjD,IAAI,QAAQ,CAAC,QAAQ,CAAC,cAAc,CAAC;QAAE,OAAO,QAAQ,CAAC;IACvD,IAAI,QAAQ,CAAC,QAAQ,CAAC,YAAY,CAAC;QAAE,OAAO,MAAM,CAAC;IACnD,OAAO,QAAQ,CAAC,CAAC,oCAAoC;AACvD,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,gBAAgB,CAC9B,KAAe,EACf,IAAiB,EACjB,UAAqC;IAErC,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC;IAC1B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC;YAAE,SAAS;QAC5B,IAAI,UAAU,CAAC,IAAI,CAAC;YAAE,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACtC,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,qBAAqB,CACnC,UAAkB,EAClB,MAAwF;IAExF,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,UAAU,CAAC,CAAC;IACvD,MAAM,QAAQ,GAAG,MAAM,EAAE,QAAQ,IAAI,EAAE,CAAC;IACxC,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IACrC,MAAM,UAAU,GAAG,IAAI,GAAG,EAAU,CAAC;IACrC,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;QAC3B,MAAM,aAAa,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,UAAU,IAAI,CAAC,CAAC,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;QAClG,IAAI,aAAa;YAAE,SAAS,CAAC,gBAAgB;QAC7C,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;YACvB,IAAI,CAAC,CAAC,IAAI,KAAK,UAAU,IAAI,CAAC,CAAC,CAAC,gBAAgB,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC;gBAAE,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAChG,CAAC;IACH,CAAC;IACD,OAAO,CAAC,GAAG,UAAU,CAAC,CAAC;AACzB,CAAC;AAED,6DAA6D;AAC7D,MAAM,UAAU,qBAAqB,CAAC,MAAc,EAAE,MAAqC;IACzF,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,KAAK,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,MAAM,EAAE,CAAC;QAClC,IAAI,IAAI,KAAK,MAAM,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;YAAE,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC/D,CAAC;IACD,OAAO,GAAG,CAAC,IAAI,EAAE,CAAC;AACpB,CAAC;AAWD;;;;;;GAMG;AACH,MAAM,UAAU,oBAAoB,CAClC,MAAc,EACd,MAAqC,EACrC,SAAoC,EACpC,OAAsE,EAAE;IAExE,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,CAAC,CAAC;IACpC,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,IAAI,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACrE,MAAM,KAAK,GAAG,CAAC,IAAY,EAAE,KAAa,EAAE,IAAyB,EAAgB,EAAE;QACrF,MAAM,IAAI,GAAiB,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;QAC7E,IAAI,KAAK,IAAI,QAAQ,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;YAAE,OAAO,IAAI,CAAC,CAAC,eAAe;QACrE,IAAI,SAAS,KAAK,UAAU,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,OAAO,IAAI,CAAC,CAAC,8CAA8C;QAC1G,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACzC,MAAM,KAAK,GACT,SAAS,KAAK,UAAU,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,qBAAqB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAC/G,KAAK,MAAM,KAAK,IAAI,KAAK;YAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,GAAG,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC;QACjF,OAAO,IAAI,CAAC;IACd,CAAC,CAAC;IACF,OAAO,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,IAAI,GAAG,EAAE,CAAC,CAAC;AACrC,CAAC;AAuBD;;;;;;GAMG;AACH,MAAM,UAAU,gBAAgB,CAC9B,OAA2B,EAC3B,IAAiF,EACjF,OAAoF;IAEpF,IAAI,IAAI,EAAE,CAAC;QACT,OAAO;YACL,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,OAAO;YACP,MAAM,EAAE,eAAe,CAAC,OAAO,CAAC;YAChC,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,WAAW,EAAE,IAAI,CAAC,WAAW;SAC9B,CAAC;IACJ,CAAC;IACD,uEAAuE;IACvE,0EAA0E;IAC1E,mEAAmE;IACnE,EAAE;IACF,2DAA2D;IAC3D,sEAAsE;IACtE,8BAA8B;IAC9B,oEAAoE;IACpE,kCAAkC;IAClC,oEAAoE;IACpE,8CAA8C;IAC9C,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO;YACL,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,OAAO;YACP,MAAM,EAAE,WAAW;YACnB,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,WAAW,EAAE,OAAO,CAAC,WAAW;SACjC,CAAC;IACJ,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;GAGG;AACH,SAAS,oBAAoB;IAC3B,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,cAAc,CAAC,EAAE,OAAO,CAAC,CAEpF,CAAC;QACF,OAAO,IAAI,CAAC,YAAY,IAAI,EAAE,CAAC;IACjC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAgCD;;;;;;;GAOG;AACH,MAAM,UAAU,uBAAuB,CAAC,QAAuC;IAC7E,MAAM,EAAE,GAAG,QAAQ,IAAI,EAAE,CAAC;IAC1B,IAAI,EAAE,CAAC,QAAQ,CAAC,YAAY,CAAC;QAAE,OAAO,MAAM,CAAC;IAC7C,IAAI,EAAE,CAAC,QAAQ,CAAC,eAAe,CAAC;QAAE,OAAO,SAAS,CAAC;IACnD,IAAI,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC;QAAE,OAAO,KAAK,CAAC;IAC3C,IAAI,EAAE,CAAC,QAAQ,CAAC,cAAc,CAAC;QAAE,OAAO,QAAQ,CAAC;IACjD,IAAI,EAAE,CAAC,QAAQ,CAAC,YAAY,CAAC;QAAE,OAAO,MAAM,CAAC;IAC7C,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,yCAAyC;AACzC,MAAM,iBAAiB,GAA4C,EAAE,IAAI,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;AACvH,MAAM,UAAU,oBAAoB,CAAC,IAAuB;IAC1D,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC,IAAI,CACnB,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,iBAAiB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAChG,CAAC;AACJ,CAAC;AAED,wDAAwD;AACxD,MAAM,UAAU,qBAAqB,CACnC,IAAuB,EACvB,SAAsB;AACtB,8CAA8C;AAC9C,UAAsD,GAAG,EAAE,CAAC,SAAS;IAErE,OAAO,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE;QAClC,MAAM,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACtC,OAAO;YACL,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI;YACpB,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO;YAC1B,QAAQ,EAAE,KAAK,EAAE,OAAO;YACxB,OAAO,EAAE,KAAK,EAAE,OAAO;YACvB,MAAM,EAAE,KAAK,EAAE,MAAM;YACrB,8DAA8D;YAC9D,SAAS,EAAE,aAAa,CAAC,KAAK,EAAE,OAAO,CAAC,IAAI,SAAS,CAAC,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC;YACxF,WAAW,EAAE,CAAC,CAAC,OAAO,CAAC,WAAW,IAAI,EAAE;YACxC,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,SAAS,EAAE,QAAQ;YACrC,SAAS,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC;YACxC,QAAQ,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC;YAC9C,QAAQ,EAAE,eAAe,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,IAAI,EAAE,CAAC;YACnD,QAAQ,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;YAC7E,SAAS,EAAE,CAAC,CAAC,SAAS,EAAE,OAAO;YAC/B,OAAO,EAAE,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,OAAO,CAAC,IAAI;YACpC,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,KAAK;YACrB,QAAQ,EAAE,CAAC,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS;YAC9C,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO;YAC1B,KAAK,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK;SACvB,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAAC,KAAwC;IACtE,OAAO,CAAC,GAAG,KAAK,CAAC,OAAO,EAAE,CAAC;SACxB,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;SACjF,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;QACtB,IAAI;QACJ,4BAA4B;QAC5B,OAAO,EAAE,IAAI,CAAC,OAAO,IAAI,EAAE;QAC3B,QAAQ,EAAE,IAAI,CAAC,OAAO;QACtB,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,2CAA2C;QAC3C,SAAS,EAAE,KAAK;QAChB,WAAW,EAAE,IAAI,CAAC,WAAW,IAAI,EAAE;QACnC,SAAS,EAAE,IAAI;QACf,QAAQ,EAAE,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC;QACpC,QAAQ,EAAE,eAAe,CAAC,IAAI,CAAC,QAAQ,IAAI,EAAE,CAAC;QAC9C,QAAQ,EAAE,CAAC,IAAI,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;KACzE,CAAC,CAAC;SACF,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;AAClD,CAAC;AAED,yEAAyE;AACzE,MAAM,UAAU,UAAU,CAAC,SAW1B;IACC,MAAM,MAAM,GAAG,SAAS,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9C,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IACzB,MAAM,CAAC,GAAG,SAAS,CAAC,QAAQ,EAAE,CAAC,MAAM,CAAC,CAAC;IACvC,MAAM,YAAY,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,YAAY,IAAI,EAAE,CAAC,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,gBAAgB,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IACtH,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,CAAC;AAC9G,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAAC,CAAS,EAAE,OAAe,EAAE,eAAuB,gBAAgB;IAChG,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,YAAY,OAAO,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,YAAY,OAAO,EAAE,CAAC;IACpE,MAAM,IAAI,GAAG,YAAY,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,gBAAgB,CAAC;IAClE,OAAO,GAAG,IAAI,qBAAqB,kBAAkB,CAAC,IAAI,CAAC,WAAW,CAAC;AACzE,CAAC;AAED,qBAAqB;AACrB,MAAM,UAAU,yBAAyB,CACvC,UAA2B,EAC3B,GAAY,EACZ,YAAoD,EACpD,IAAe,EACf,eAAuB,gBAAgB;AACvC,8FAA8F;AAC9F,mBAAsD,GAAG,EAAE,CAAC,IAAI,GAAG,EAAE;AACrE;;;;;;GAMG;AACH,oBAAkC,GAAG,EAAE,CAAC,CAAC;IAEzC,4DAA4D;IAC5D,qCAAqC;IACrC,UAAU,CAAC,GAAG,CAAC,kBAAkB,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;QAC5D,MAAM,CAAC,GAAG,OAAO,GAAG,CAAC,KAAK,CAAC,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACpE,MAAM,MAAM,GAAG,YAAY,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;QACjD,6DAA6D;QAC7D,0DAA0D;QAC1D,0CAA0C;QAC1C,MAAM,SAAS,GAAG,gBAAgB,EAAE,CAAC;QACrC,MAAM,cAAc,GAAG,aAAa,CAAC,aAAa,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,cAAc,CAAC,CAAC,CAAC,CAAC;QAC5F,MAAM,QAAQ,GAAG,oBAAoB,EAAE,CAAC;QACxC,qFAAqF;QACrF,MAAM,WAAW,GAAG,CAAC,IAAY,EAAE,EAAE;YACnC,IAAI,CAAC;gBACH,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,cAAc,CAAC,OAAO,CAAC,GAAG,IAAI,eAAe,CAAC,EAAE,OAAO,CAAC,CAItF,CAAC;YACJ,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,SAAS,CAAC;YACnB,CAAC;QACH,CAAC,CAAC;QACF,MAAM,SAAS,GAAG,CAAC,IAAY,EAA4B,EAAE,CAC3D,gBAAgB,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,WAAW,CAAC,IAAI,CAAC,EAAE,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;QAC3E,6BAA6B;QAC7B,MAAM,UAAU,GAAG,IAAI,GAAG,EAAwB,CAAC;QACnD,MAAM,OAAO,GAAG,CAAC,IAAY,EAA4B,EAAE;YACzD,IAAI,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC;gBAAE,OAAO,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YACtD,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;YAC7B,IAAI,IAAI;gBAAE,UAAU,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;YACrC,OAAO,IAAI,CAAC;QACd,CAAC,CAAC;QACF,4DAA4D;QAC5D,MAAM,OAAO,GAAG,KAAK,EAAE,EAAU,EAA8B,EAAE;YAC/D,MAAM,CAAC,GAAG,MAAM,KAAK,CAAC,cAAc,CAAC,CAAC,EAAE,EAAE,EAAE,YAAY,CAAC,EAAE,EAAE,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,iBAAiB,CAAC,EAAE,CAAC,CAAC;YAC/G,IAAI,CAAC,CAAC,CAAC,EAAE;gBAAE,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;YAC1D,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAsB,CAAC;QAC/C,CAAC,CAAC;QACF,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC,cAAc,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;QACtE,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAkD,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,WAAW,CAAC,CAAC;QAClH,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC3B,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,UAAU,CAAsC,CAAC;YAC/F,MAAM,GAAG,GAAG,MAAM,EAAE,MAAM,YAAY,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,IAAI,MAAM,CAAC,CAAC;YACvG,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,8BAA8B,GAAG,EAAE,CAAC,CAAC;YACtD,gDAAgD;YAChD,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,SAAS,CAAC,IAAI,EAAE,EAAE,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACzE,KAAK,MAAM,CAAC,IAAI,KAAK;gBAAE,OAAO,CAAC,CAAC,CAAC,CAAC;YAClC,GAAG,CAAC,IAAI,CAAC;gBACP,QAAQ,EAAE,eAAe,CAAC,UAAU,CAAC;gBACrC,OAAO,EAAE,eAAe,GAAG,gBAAgB;aAC5C,CAAC,CAAC;YACH,OAAO;QACT,CAAC;QACD,MAAM,MAAM,GAAG,IAAI,GAAG,EAA6D,CAAC;QACpF,KAAK,MAAM,CAAC,IAAI,SAAS;YAAE,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,OAAO,IAAI,EAAE;gBAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QAChG,MAAM,MAAM,GAAsB,EAAE,OAAO,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC;QACpE,MAAM,SAAS,GAAG,gBAAgB,CAChC,CAAC,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,EAClB,IAAI,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,EAChC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,SAAS,CAC9B,CAAC;QACF,GAAG,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,qBAAqB,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC;IAC5E,CAAC,CAAC,CAAC;IAEH,0DAA0D;IAC1D,uDAAuD;IACvD,qCAAqC;IACrC,4CAA4C;IAC5C,UAAU,CAAC,GAAG,CAAC,wBAAwB,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE;QACnE,MAAM,SAAS,GAAG,gBAAgB,EAAE,CAAC;QACrC,MAAM,cAAc,GAAG,aAAa,CAAC,aAAa,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,cAAc,CAAC,CAAC,CAAC,CAAC;QAC5F,MAAM,QAAQ,GAAG,oBAAoB,EAAE,CAAC;QACxC,2CAA2C;QAC3C,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,SAAS,CAAC,IAAI,EAAE,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;QAE5E,MAAM,UAAU,GAAsB,EAAE,CAAC;QACzC,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;YAC9B,IAAI,IAAiF,CAAC;YACtF,IAAI,CAAC;gBACH,sDAAsD;gBACtD,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,cAAc,CAAC,OAAO,CAAC,GAAG,IAAI,eAAe,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;YAC3F,CAAC;YAAC,MAAM,CAAC;gBACP,SAAS,CAAC,qCAAqC;YACjD,CAAC;YACD,MAAM,IAAI,GAAG,uBAAuB,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;YACrD,IAAI,CAAC,IAAI;gBAAE,SAAS;YACpB,UAAU,CAAC,IAAI,CAAC;gBACd,IAAI;gBACJ,OAAO,EAAE,IAAI,EAAE,OAAO;gBACtB,OAAO,EAAE,QAAQ,CAAC,IAAI,CAAC;gBACvB,MAAM,EAAE,eAAe,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;gBACvC,WAAW,EAAE,IAAI,EAAE,WAAW;gBAC9B,IAAI;gBACJ,wDAAwD;gBACxD,SAAS,EAAE,aAAa,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;aACzC,CAAC,CAAC;QACL,CAAC;QAED,mDAAmD;QACnD,MAAM,IAAI,GAAG,YAAY,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,gBAAgB,CAAC;QAClE,MAAM,OAAO,CAAC,GAAG,CACf,UAAU,CAAC,GAAG,CAAC,KAAK,EAAC,CAAC,EAAC,EAAE;YACvB,IAAI,CAAC;gBACH,MAAM,CAAC,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,IAAI,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE;oBAC7D,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,iBAAiB,CAAC;iBAC/C,CAAC,CAAC;gBACH,IAAI,CAAC,CAAC,CAAC,EAAE;oBAAE,OAAO;gBAClB,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAA0C,CAAC;gBACpE,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;YACpC,CAAC;YAAC,MAAM,CAAC;gBACP,2BAA2B;YAC7B,CAAC;oBAAS,CAAC;gBACT,wDAAwD;gBACxD,2CAA2C;gBAC3C,gCAAgC;gBAChC,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,SAAS,IAAI,SAAS,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC;YAC9D,CAAC;QACH,CAAC,CAAC,CACH,CAAC;QACF,GAAG,CAAC,IAAI,CAAC,EAAE,UAAU,EAAE,oBAAoB,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;IAC7D,CAAC,CAAC,CAAC;IAEH,kEAAkE;IAClE,mDAAmD;IACnD,qDAAqD;IACrD,UAAU,CAAC,GAAG,CAAC,2BAA2B,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;QACrE,MAAM,IAAI,GAAG,OAAO,GAAG,CAAC,KAAK,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7E,IAAI,CAAC,IAAI,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YACrC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,mBAAmB,EAAE,CAAC,CAAC;YACrD,OAAO;QACT,CAAC;QACD,2CAA2C;QAC3C,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,gBAAgB,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAU,CAAC,CAAC,CAAC;QACtF,MAAM,MAAM,GAAG,YAAY,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;QACjD,MAAM,KAAK,GAAG,IAAI,GAAG,CACnB,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,IAAI,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC,gBAAgB,IAAI,EAAE,EAAE,CAAC,CAAC,CAC9F,CAAC;QACF,uDAAuD;QACvD,IAAI,YAAoE,CAAC;QACzE,IAAI,WAAW,GAAG,MAAM,CAAC;QACzB,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YACtB,IAAI,CAAC;gBACH,MAAM,IAAI,GAAG,YAAY,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,gBAAgB,CAAC;gBAClE,MAAM,CAAC,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE;oBAC3D,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,iBAAiB,CAAC;iBAC/C,CAAC,CAAC;gBACH,IAAI,CAAC,CAAC,EAAE,EAAE,CAAC;oBACT,MAAM,CAAC,GAAG,UAAU,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAqC,CAAC,CAAC;oBAC3E,IAAI,CAAC,EAAE,CAAC;wBACN,WAAW,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,YAAY,IAAI,EAAE,CAAC,CAAC;wBAC9D,IAAI,CAAC,CAAC,OAAO;4BAAE,YAAY,GAAG,EAAE,QAAQ,EAAE,CAAC,CAAC,OAAO,CAAC,QAAQ,IAAI,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC,OAAO,CAAC,QAAQ,IAAI,EAAE,EAAE,CAAC;oBAC3G,CAAC;gBACH,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,iBAAiB;YACnB,CAAC;QACH,CAAC;QACD,0EAA0E;QAC1E,MAAM,UAAU,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;QAChF,MAAM,QAAQ,GAAG,CAAC,IAAkB,EAAgB,EAAE,CAAC,CAAC;YACtD,GAAG,IAAI;YACP,QAAQ,EAAE,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC;YACjF,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC;SACtC,CAAC,CAAC;QACH,MAAM,QAAQ,GAAG,QAAQ,CAAC,oBAAoB,CAAC,IAAI,EAAE,WAAW,EAAE,UAAU,EAAE,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC;QAC/F,MAAM,UAAU,GAAG,QAAQ,CAAC,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC;QAC9E,8CAA8C;QAC9C,MAAM,QAAQ,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,QAAQ,IAAI,YAAY,EAAE,QAAQ,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACvF,OAAO,EAAE,GAAG;YACZ,UAAU,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,IAAI,IAAI;SAChG,CAAC,CAAC,CAAC;QACJ,GAAG,CAAC,IAAI,CAAC;YACP,QAAQ;YACR,UAAU;YACV,QAAQ,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,QAAQ,IAAI,YAAY,EAAE,QAAQ,IAAI,EAAE,EAAE;YAC3F,uCAAuC;YACvC,iBAAiB,EAAE,qBAAqB,CAAC,IAAI,EAAE,MAAM,CAAC;SACvD,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,4BAA4B;IAC5B,gEAAgE;IAChE,2CAA2C;IAC3C,UAAU,CAAC,IAAI,CAAC,0BAA0B,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;QACrE,MAAM,MAAM,GAAG,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC;QAC9B,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;YAC/B,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,eAAe,EAAE,CAAC,CAAC;YACjD,OAAO;QACT,CAAC;QACD,MAAM,MAAM,GAAG,GAAG,CAAC,UAAU,CAAwB,iBAAiB,CAAC,CAAC;QACxE,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,8BAA8B,EAAE,CAAC,CAAC;YAChE,OAAO;QACT,CAAC;QACD,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YAC5C,+CAA+C;YAC/C,IAAI,MAAM,CAAC,EAAE;gBAAE,iBAAiB,EAAE,CAAC;YACnC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACnB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACpF,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,gDAAgD;IAChD,4CAA4C;IAC5C,8DAA8D;IAC9D,iDAAiD;IACjD,UAAU,CAAC,IAAI,CAAC,4BAA4B,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;QACvE,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC;QAC5B,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC7B,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,eAAe,EAAE,CAAC,CAAC;YACjD,OAAO;QACT,CAAC;QACD,MAAM,MAAM,GAAG,YAAY,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;QACjD,MAAM,UAAU,GAAG,qBAAqB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACvD,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC1B,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;gBACnB,KAAK,EAAE,WAAW,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,oCAAoC;aAC3E,CAAC,CAAC;YACH,OAAO;QACT,CAAC;QACD,MAAM,MAAM,GAAG,GAAG,CAAC,UAAU,CAAwB,iBAAiB,CAAC,CAAC;QACxE,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,8BAA8B,EAAE,CAAC,CAAC;YAChE,OAAO;QACT,CAAC;QACD,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;YAC5C,uDAAuD;YACvD,qDAAqD;YACrD,IAAI,MAAM,CAAC,EAAE;gBAAE,iBAAiB,EAAE,CAAC;YACnC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACnB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACpF,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,qCAAqC;IACrC,gDAAgD;IAChD,UAAU,CAAC,IAAI,CAAC,yBAAyB,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;QACpE,MAAM,GAAG,GAAG,GAAG,CAAC,IAAI,EAAE,OAAO,CAAC;QAC9B,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC5C,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,iBAAiB,EAAE,CAAC,CAAC;YACnD,OAAO;QACT,CAAC;QACD,mDAAmD;QACnD,mDAAmD;QACnD,kDAAkD;QAClD,MAAM,OAAO,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,CAAU,EAAE,EAAE,CAAC,CAAC;YACvC,IAAI,EAAE,OAAQ,CAAwB,EAAE,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAE,CAAsB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE;YAC7F,OAAO,EAAE,OAAQ,CAA2B,EAAE,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAE,CAAyB,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;SAC7G,CAAC,CAAC,CAAC;QACJ,MAAM,MAAM,GAAG,GAAG,CAAC,UAAU,CAAwB,iBAAiB,CAAC,CAAC;QACxE,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,4BAA4B,EAAE,CAAC,CAAC;YAC9D,OAAO;QACT,CAAC;QACD,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YAC5C,oCAAoC;YACpC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACnB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACpF,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -1,5 +1,5 @@
1
+ import type { UserIdentity } from '@aalis/api-authority';
1
2
  import type { AppService, Context, PluginManagerService } from '@aalis/core';
2
- import type { UserIdentity } from '@aalis/plugin-authority-api';
3
3
  import type express from 'express';
4
4
  import type { RouteGate } from '../gate.js';
5
5
  /** 注册插件管理 + 全局配置相关 REST 路由 */
@@ -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,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAMhE,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,CAiZN"}
1
+ {"version":3,"file":"plugins.d.ts","sourceRoot":"","sources":["../../src/routes/plugins.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAIzD,OAAO,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAG7E,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,CA2VN"}
@@ -1,5 +1,5 @@
1
1
  import { parseInstanceId } from '@aalis/core';
2
- import { CORE_CONFIG_SCHEMA } from '@aalis/plugin-config-api';
2
+ import { CORE_CONFIG_SCHEMA } from '@aalis/schema-config';
3
3
  /** 注册插件管理 + 全局配置相关 REST 路由 */
4
4
  export function registerPluginRoutes(expressApp, ctx, getApp, getPluginMgr, identify, gate) {
5
5
  // 获取插件列表及状态
@@ -250,60 +250,6 @@ export function registerPluginRoutes(expressApp, ctx, getApp, getPluginMgr, iden
250
250
  res.status(500).json({ error: msg });
251
251
  }
252
252
  });
253
- // 安装插件(从 npm 下载到 packages/ 并加载)
254
- expressApp.post('/api/plugins/install', gate(), async (req, res) => {
255
- const app = getApp();
256
- const pm = getPluginMgr();
257
- if (!app || !pm) {
258
- res.status(500).json({ error: 'App 不可用' });
259
- return;
260
- }
261
- const npmPkg = req.body?.name;
262
- if (!npmPkg || typeof npmPkg !== 'string') {
263
- res.status(400).json({ error: 'name 字段必须是 npm 包名字符串' });
264
- return;
265
- }
266
- if (!/^(@[a-z0-9\-_.]+\/)?[a-z0-9\-_.]+$/i.test(npmPkg)) {
267
- res.status(400).json({ error: '非法包名' });
268
- return;
269
- }
270
- try {
271
- const pkgMgr = ctx.getService('package-manager');
272
- if (!pkgMgr) {
273
- res.status(503).json({ error: 'package-manager 服务未启用,无法安装插件' });
274
- return;
275
- }
276
- const result = await pkgMgr.install(npmPkg);
277
- res.json(result);
278
- }
279
- catch (err) {
280
- const msg = err instanceof Error ? err.message : String(err);
281
- res.status(500).json({ error: msg });
282
- }
283
- });
284
- // 卸载插件
285
- expressApp.post('/api/plugins/:name/uninstall', gate(), async (req, res) => {
286
- const app = getApp();
287
- const pm = getPluginMgr();
288
- if (!app || !pm) {
289
- res.status(500).json({ error: 'App 不可用' });
290
- return;
291
- }
292
- const pluginName = req.params.name;
293
- try {
294
- const pkgMgr = ctx.getService('package-manager');
295
- if (!pkgMgr) {
296
- res.status(503).json({ error: 'package-manager 服务未启用,无法卸载插件' });
297
- return;
298
- }
299
- const result = await pkgMgr.uninstall(pluginName);
300
- res.json(result);
301
- }
302
- catch (err) {
303
- const msg = err instanceof Error ? err.message : String(err);
304
- res.status(500).json({ error: msg });
305
- }
306
- });
307
253
  // 创建插件多实例
308
254
  expressApp.post('/api/plugins/:name/instances', gate(), async (req, res) => {
309
255
  const moduleName = req.params.name;