@aalis/runtime 0.15.1 → 0.17.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/README.md +11 -2
- package/dist/config-store.d.ts +47 -12
- package/dist/config-store.d.ts.map +1 -1
- package/dist/config-store.js +446 -60
- package/dist/config-store.js.map +1 -1
- package/dist/config-sync.d.ts +22 -8
- package/dist/config-sync.d.ts.map +1 -1
- package/dist/config-sync.js +86 -33
- package/dist/config-sync.js.map +1 -1
- package/dist/console-sink.d.ts +1 -1
- package/dist/file-logger.d.ts +4 -4
- package/dist/file-logger.d.ts.map +1 -1
- package/dist/file-logger.js +6 -5
- package/dist/file-logger.js.map +1 -1
- package/dist/home.d.ts +64 -0
- package/dist/home.d.ts.map +1 -0
- package/dist/home.js +236 -0
- package/dist/home.js.map +1 -0
- package/dist/host-logs.d.ts +9 -0
- package/dist/host-logs.d.ts.map +1 -0
- package/dist/host-logs.js +104 -0
- package/dist/host-logs.js.map +1 -0
- package/dist/index.d.ts +5 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -4
- package/dist/index.js.map +1 -1
- package/dist/instance-lock.d.ts +56 -0
- package/dist/instance-lock.d.ts.map +1 -0
- package/dist/instance-lock.js +282 -0
- package/dist/instance-lock.js.map +1 -0
- package/dist/locales/en.d.ts +16 -0
- package/dist/locales/en.d.ts.map +1 -0
- package/dist/locales/en.js +16 -0
- package/dist/locales/en.js.map +1 -0
- package/dist/node-modules-loader.d.ts +2 -2
- package/dist/node-modules-loader.d.ts.map +1 -1
- package/dist/node-modules-loader.js +8 -4
- package/dist/node-modules-loader.js.map +1 -1
- package/dist/plugin-discovery.d.ts +9 -4
- package/dist/plugin-discovery.d.ts.map +1 -1
- package/dist/plugin-discovery.js +28 -16
- package/dist/plugin-discovery.js.map +1 -1
- package/dist/providers.d.ts +38 -13
- package/dist/providers.d.ts.map +1 -1
- package/dist/providers.js +107 -232
- package/dist/providers.js.map +1 -1
- package/dist/secrets.d.ts +47 -0
- package/dist/secrets.d.ts.map +1 -0
- package/dist/secrets.js +108 -0
- package/dist/secrets.js.map +1 -0
- package/dist/start.d.ts +19 -12
- package/dist/start.d.ts.map +1 -1
- package/dist/start.js +174 -48
- package/dist/start.js.map +1 -1
- package/dist/subcommand.d.ts.map +1 -1
- package/dist/subcommand.js +2 -2
- package/dist/subcommand.js.map +1 -1
- package/dist/texts.d.ts +31 -0
- package/dist/texts.d.ts.map +1 -0
- package/dist/texts.js +21 -0
- package/dist/texts.js.map +1 -0
- package/dist/yaml-file.d.ts +36 -0
- package/dist/yaml-file.d.ts.map +1 -0
- package/dist/yaml-file.js +220 -0
- package/dist/yaml-file.js.map +1 -0
- package/package.json +14 -7
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { type ConfigSchema } from '@aalis/schema-config';
|
|
2
|
+
import type { TextRef } from '@aalis/schema-i18n';
|
|
3
|
+
/** 密钥字段上算「有值」的明文:非空。`''`、null、空 map、空 list 是没填,不进密钥存储 */
|
|
4
|
+
export declare function isSecretValue(value: unknown): boolean;
|
|
5
|
+
/** 值里出现的全部引用的键。不看 schema:用来判断一个键还有没有人用,宁可多算 */
|
|
6
|
+
export declare function referencedKeys(value: unknown, into?: Set<string>): Set<string>;
|
|
7
|
+
/** 密钥字段上的非空明文所在的路径(只收文档形态的写入口据此拒绝) */
|
|
8
|
+
export declare function plainSecretPaths(schema: ConfigSchema | undefined, config: Record<string, unknown>): string[];
|
|
9
|
+
export interface SplitSecrets {
|
|
10
|
+
/** 文档形态:密钥字段上只剩引用或没填的空值 */
|
|
11
|
+
doc: Record<string, unknown>;
|
|
12
|
+
/** 要写进密钥存储的键值,由调用方在生效后提交 */
|
|
13
|
+
writes: Map<string, unknown>;
|
|
14
|
+
/** 新值落到的位置与键(日志用,不带值) */
|
|
15
|
+
placed: Array<{
|
|
16
|
+
path: string;
|
|
17
|
+
key: string;
|
|
18
|
+
}>;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* 提交的配置拆成文档形态:密钥字段上的非空明文换成引用,值放进 writes。
|
|
22
|
+
* - 顶层与分组里的字段:写进 `base`(该实例改动前的文档)在同一位置引用的键,键被别处共用时一并改到它们;
|
|
23
|
+
* 那里没有引用就取新键。
|
|
24
|
+
* - 数组元素里的字段:一律取新键。元素可能被重排、增删,按下标找到的可能是别的元素的键。
|
|
25
|
+
* 新键是 `<实例 id>.<字段路径>`(数组元素的路径不带下标),`taken` 认为被占用时依次加 `-2`、`-3`。
|
|
26
|
+
*/
|
|
27
|
+
export declare function splitSecrets(schema: ConfigSchema | undefined, instanceId: string, submitted: Record<string, unknown>, base: Record<string, unknown>, taken: (key: string) => boolean): SplitSecrets;
|
|
28
|
+
export interface ResolvedSecrets {
|
|
29
|
+
config: Record<string, unknown>;
|
|
30
|
+
/** 引用的键不在密钥存储里:引用原样留在 config 里,插件的 parseConfig 会拒绝激活 */
|
|
31
|
+
dangling: Array<{
|
|
32
|
+
path: string;
|
|
33
|
+
key: string;
|
|
34
|
+
}>;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* 文档形态解析成运行态:密钥字段上的引用换成密钥存储里的值。键不在存储里时不回落任何东西,引用原样留着,
|
|
38
|
+
* 让插件激活失败、点名键名(回落默认值会悄悄连上别的东西,例如默认的本机数据库)。
|
|
39
|
+
*/
|
|
40
|
+
export declare function resolveSecrets(schema: ConfigSchema | undefined, doc: Record<string, unknown>, lookup: (key: string) => {
|
|
41
|
+
value: unknown;
|
|
42
|
+
} | undefined): ResolvedSecrets;
|
|
43
|
+
/** 悬空引用的说明:点名实例、字段与键,不涉及值。诊断项 config.secrets 显示它,日志取原文 */
|
|
44
|
+
export declare function describeDangling(instanceId: string, dangling: ResolvedSecrets['dangling']): TextRef;
|
|
45
|
+
/** 引用所在的字段与键,一处一项:悬空引用的说明与拒收提交的报错共用 */
|
|
46
|
+
export declare function secretPlaces(places: ResolvedSecrets['dangling']): TextRef[];
|
|
47
|
+
//# sourceMappingURL=secrets.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"secrets.d.ts","sourceRoot":"","sources":["../src/secrets.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,KAAK,YAAY,EAAgC,MAAM,sBAAsB,CAAC;AACvF,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAGlD,yDAAyD;AACzD,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAMrD;AAED,+CAA+C;AAC/C,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,cAAoB,GAAG,GAAG,CAAC,MAAM,CAAC,CAKpF;AAED,sCAAsC;AACtC,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,YAAY,GAAG,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,EAAE,CAO5G;AAED,MAAM,WAAW,YAAY;IAC3B,2BAA2B;IAC3B,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC7B,4BAA4B;IAC5B,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC7B,yBAAyB;IACzB,MAAM,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC9C;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CAC1B,MAAM,EAAE,YAAY,GAAG,SAAS,EAChC,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAClC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,KAAK,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,GAC9B,YAAY,CAad;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,wDAAwD;IACxD,QAAQ,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAChD;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAC5B,MAAM,EAAE,YAAY,GAAG,SAAS,EAChC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC5B,MAAM,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK;IAAE,KAAK,EAAE,OAAO,CAAA;CAAE,GAAG,SAAS,GACtD,eAAe,CAUjB;AAED,0DAA0D;AAC1D,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,eAAe,CAAC,UAAU,CAAC,GAAG,OAAO,CAEnG;AAED,uCAAuC;AACvC,wBAAgB,YAAY,CAAC,MAAM,EAAE,eAAe,CAAC,UAAU,CAAC,GAAG,OAAO,EAAE,CAE3E"}
|
package/dist/secrets.js
ADDED
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
// ============================================================
|
|
2
|
+
// secrets —— 配置文档与运行态之间的密钥换算(纯函数,不碰文件)
|
|
3
|
+
//
|
|
4
|
+
// schema 里 `secret: true` 的字段在文档里是引用 `{ $secret: '<键>' }`,值在宿主的密钥存储(家目录的 secrets.yaml);
|
|
5
|
+
// 交给 core(也就是插件)之前解析回原值。字段的位置只认 schema-config 的 mapSecretFields。
|
|
6
|
+
// ============================================================
|
|
7
|
+
import { isSecretRef, mapSecretFields } from '@aalis/schema-config';
|
|
8
|
+
import { t } from './texts.js';
|
|
9
|
+
/** 密钥字段上算「有值」的明文:非空。`''`、null、空 map、空 list 是没填,不进密钥存储 */
|
|
10
|
+
export function isSecretValue(value) {
|
|
11
|
+
if (value === undefined || value === null || value === '')
|
|
12
|
+
return false;
|
|
13
|
+
if (isSecretRef(value))
|
|
14
|
+
return false;
|
|
15
|
+
if (Array.isArray(value))
|
|
16
|
+
return value.length > 0;
|
|
17
|
+
if (typeof value === 'object')
|
|
18
|
+
return Object.keys(value).length > 0;
|
|
19
|
+
return true;
|
|
20
|
+
}
|
|
21
|
+
/** 值里出现的全部引用的键。不看 schema:用来判断一个键还有没有人用,宁可多算 */
|
|
22
|
+
export function referencedKeys(value, into = new Set()) {
|
|
23
|
+
if (isSecretRef(value))
|
|
24
|
+
into.add(value.$secret);
|
|
25
|
+
else if (Array.isArray(value))
|
|
26
|
+
for (const item of value)
|
|
27
|
+
referencedKeys(item, into);
|
|
28
|
+
else if (value !== null && typeof value === 'object')
|
|
29
|
+
for (const v of Object.values(value))
|
|
30
|
+
referencedKeys(v, into);
|
|
31
|
+
return into;
|
|
32
|
+
}
|
|
33
|
+
/** 密钥字段上的非空明文所在的路径(只收文档形态的写入口据此拒绝) */
|
|
34
|
+
export function plainSecretPaths(schema, config) {
|
|
35
|
+
const paths = [];
|
|
36
|
+
mapSecretFields(schema, config, (value, at) => {
|
|
37
|
+
if (isSecretValue(value))
|
|
38
|
+
paths.push(at.path);
|
|
39
|
+
return value;
|
|
40
|
+
});
|
|
41
|
+
return [...new Set(paths)];
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* 提交的配置拆成文档形态:密钥字段上的非空明文换成引用,值放进 writes。
|
|
45
|
+
* - 顶层与分组里的字段:写进 `base`(该实例改动前的文档)在同一位置引用的键,键被别处共用时一并改到它们;
|
|
46
|
+
* 那里没有引用就取新键。
|
|
47
|
+
* - 数组元素里的字段:一律取新键。元素可能被重排、增删,按下标找到的可能是别的元素的键。
|
|
48
|
+
* 新键是 `<实例 id>.<字段路径>`(数组元素的路径不带下标),`taken` 认为被占用时依次加 `-2`、`-3`。
|
|
49
|
+
*/
|
|
50
|
+
export function splitSecrets(schema, instanceId, submitted, base, taken) {
|
|
51
|
+
const writes = new Map();
|
|
52
|
+
const placed = [];
|
|
53
|
+
const doc = mapSecretFields(schema, submitted, (value, at) => {
|
|
54
|
+
if (!isSecretValue(value))
|
|
55
|
+
return value;
|
|
56
|
+
const key = (at.inArray ? undefined : refAt(base, at.path)) ??
|
|
57
|
+
freshKey(`${instanceId}.${at.path}`, k => taken(k) || writes.has(k));
|
|
58
|
+
writes.set(key, value);
|
|
59
|
+
placed.push({ path: at.path, key });
|
|
60
|
+
return { $secret: key };
|
|
61
|
+
});
|
|
62
|
+
return { doc, writes, placed };
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* 文档形态解析成运行态:密钥字段上的引用换成密钥存储里的值。键不在存储里时不回落任何东西,引用原样留着,
|
|
66
|
+
* 让插件激活失败、点名键名(回落默认值会悄悄连上别的东西,例如默认的本机数据库)。
|
|
67
|
+
*/
|
|
68
|
+
export function resolveSecrets(schema, doc, lookup) {
|
|
69
|
+
const dangling = [];
|
|
70
|
+
const config = mapSecretFields(schema, doc, (value, at) => {
|
|
71
|
+
if (!isSecretRef(value))
|
|
72
|
+
return value;
|
|
73
|
+
const hit = lookup(value.$secret);
|
|
74
|
+
if (hit)
|
|
75
|
+
return hit.value;
|
|
76
|
+
dangling.push({ path: at.path, key: value.$secret });
|
|
77
|
+
return value;
|
|
78
|
+
});
|
|
79
|
+
return { config, dangling };
|
|
80
|
+
}
|
|
81
|
+
/** 悬空引用的说明:点名实例、字段与键,不涉及值。诊断项 config.secrets 显示它,日志取原文 */
|
|
82
|
+
export function describeDangling(instanceId, dangling) {
|
|
83
|
+
return t('dangling', { instance: instanceId, items: secretPlaces(dangling) });
|
|
84
|
+
}
|
|
85
|
+
/** 引用所在的字段与键,一处一项:悬空引用的说明与拒收提交的报错共用 */
|
|
86
|
+
export function secretPlaces(places) {
|
|
87
|
+
return places.map(({ path, key }) => t('secretAt', { path, key }));
|
|
88
|
+
}
|
|
89
|
+
/** 按点号路径取顶层或分组里那个位置上的引用键 */
|
|
90
|
+
function refAt(config, path) {
|
|
91
|
+
let value = config;
|
|
92
|
+
for (const part of path.split('.')) {
|
|
93
|
+
if (value === null || typeof value !== 'object' || Array.isArray(value))
|
|
94
|
+
return undefined;
|
|
95
|
+
value = Object.hasOwn(value, part) ? value[part] : undefined;
|
|
96
|
+
}
|
|
97
|
+
return isSecretRef(value) ? value.$secret : undefined;
|
|
98
|
+
}
|
|
99
|
+
function freshKey(base, taken) {
|
|
100
|
+
if (!taken(base))
|
|
101
|
+
return base;
|
|
102
|
+
for (let n = 2;; n++) {
|
|
103
|
+
const key = `${base}-${n}`;
|
|
104
|
+
if (!taken(key))
|
|
105
|
+
return key;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
//# sourceMappingURL=secrets.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"secrets.js","sourceRoot":"","sources":["../src/secrets.ts"],"names":[],"mappings":"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"}
|
package/dist/start.d.ts
CHANGED
|
@@ -2,11 +2,17 @@ import { App } from '@aalis/core';
|
|
|
2
2
|
import { type ConfigSyncOptions } from './config-sync.js';
|
|
3
3
|
import { type PluginLoader } from './plugin-discovery.js';
|
|
4
4
|
export interface StartAalisOptions {
|
|
5
|
-
/**
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
5
|
+
/**
|
|
6
|
+
* 安装集目录(package.json 与 node_modules 所在,源码形态另有 packages/),必须是绝对路径。
|
|
7
|
+
* 源码形态的入口传仓库根,脚手架生成的入口传项目目录。
|
|
8
|
+
*/
|
|
9
|
+
appDir: string;
|
|
10
|
+
/**
|
|
11
|
+
* 宿主代码给的兜底家目录,必须是绝对路径。优先级最低:`--home`、`AALIS_HOME`、`--profile` / `AALIS_PROFILE`
|
|
12
|
+
* 都没给时才用它,再没有就是 `~/.aalis`。
|
|
13
|
+
*/
|
|
14
|
+
defaultHome?: string;
|
|
15
|
+
/** 插件加载器,默认 createNodeModulesPluginLoader(安装集);monorepo 传 createFsPluginLoader(<仓库>/packages) */
|
|
10
16
|
pluginLoader?: PluginLoader;
|
|
11
17
|
/**
|
|
12
18
|
* 彩色控制台日志,默认 true(独立部署即有全量级别)。webui-only/嵌入式/测试夹具可传 false:
|
|
@@ -15,18 +21,19 @@ export interface StartAalisOptions {
|
|
|
15
21
|
*/
|
|
16
22
|
consoleSink?: boolean;
|
|
17
23
|
/**
|
|
18
|
-
*
|
|
24
|
+
* 文件日志写到家目录的 `logs/latest.log`,默认开(WebUI 与 CLI 的日志页尾读这个文件)。
|
|
19
25
|
* 启动时先把上一轮的日志改名保留(编号插在扩展名前:latest.1.log),更早的依次后移,保留 5 份。
|
|
20
|
-
*
|
|
26
|
+
* 子命令模式一律不写文件日志。
|
|
21
27
|
*/
|
|
22
|
-
fileLog?: boolean
|
|
28
|
+
fileLog?: boolean;
|
|
23
29
|
/** 退出时复原终端 raw-mode/alt-screen,默认 true */
|
|
24
30
|
terminalRestore?: boolean;
|
|
25
31
|
/**
|
|
26
|
-
*
|
|
27
|
-
*
|
|
32
|
+
* 命令行参数,默认 `process.argv.slice(2)`。开头的宿主参数先取走:`--home <目录>`、`--profile <名>`、
|
|
33
|
+
* `--init`(初始化家目录后退出)、`--service`(由服务管理器拉起:实例锁被占时以 0 退出,重启交给服务管理器)。余下的非空即子命令模式:命中执行后退出,未命中报错退出(exit 2),不进守护进程。
|
|
34
|
+
* 宿主自管命令行时传显式数组(`[]` 即守护进程)。
|
|
28
35
|
*/
|
|
29
|
-
|
|
36
|
+
argv?: string[];
|
|
30
37
|
/** 覆盖 dev/prod 判定,默认按 NODE_ENV !== 'production' */
|
|
31
38
|
devMode?: boolean;
|
|
32
39
|
/**
|
|
@@ -42,5 +49,5 @@ export interface StartAalisOptions {
|
|
|
42
49
|
* 生命周期不变量:① `consoleHandle.bindEvents` 必须在 `new App` 之后(之前没有事件总线);
|
|
43
50
|
* ② 子命令短路必须在 `app.start` 之前。
|
|
44
51
|
*/
|
|
45
|
-
export declare function startAalis(opts
|
|
52
|
+
export declare function startAalis(opts: StartAalisOptions): Promise<App>;
|
|
46
53
|
//# sourceMappingURL=start.d.ts.map
|
package/dist/start.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"start.d.ts","sourceRoot":"","sources":["../src/start.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"start.d.ts","sourceRoot":"","sources":["../src/start.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,GAAG,EAAoD,MAAM,aAAa,CAAC;AAGpF,OAAO,EAAE,KAAK,iBAAiB,EAAgD,MAAM,kBAAkB,CAAC;AAgBxG,OAAO,EAAyB,KAAK,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAmCjF,MAAM,WAAW,iBAAiB;IAChC;;;OAGG;IACH,MAAM,EAAE,MAAM,CAAC;IACf;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,iGAAiG;IACjG,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B;;;;OAIG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB;;;;OAIG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,0CAA0C;IAC1C,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B;;;;OAIG;IACH,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,mDAAmD;IACnD,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;;OAGG;IACH,UAAU,CAAC,EAAE,iBAAiB,CAAC;CAChC;AAkBD;;;;;;GAMG;AACH,wBAAsB,UAAU,CAAC,IAAI,EAAE,iBAAiB,GAAG,OAAO,CAAC,GAAG,CAAC,CA8QtE"}
|
package/dist/start.js
CHANGED
|
@@ -1,16 +1,48 @@
|
|
|
1
|
+
import { existsSync, realpathSync } from 'node:fs';
|
|
1
2
|
import { createRequire } from 'node:module';
|
|
3
|
+
import { join, normalize } from 'node:path';
|
|
4
|
+
import { describeUnmet, unmetDependencies } from '@aalis/api-doctor';
|
|
5
|
+
import { hostLogs } from '@aalis/api-host-logs';
|
|
6
|
+
import { hostPaths } from '@aalis/api-host-paths';
|
|
2
7
|
import { pluginSource } from '@aalis/api-plugin-source';
|
|
3
|
-
import { App, events, provide, services } from '@aalis/core';
|
|
8
|
+
import { App, events, LogHub, provide, services } from '@aalis/core';
|
|
4
9
|
import { installBootstrapBuffer } from './bootstrap-buffer.js';
|
|
5
10
|
import { createConfigStore, installHostConfig } from './config-store.js';
|
|
6
11
|
import { installConfigHotReload, withPluginConfigSync } from './config-sync.js';
|
|
7
12
|
import { installConsoleSink } from './console-sink.js';
|
|
8
|
-
import { appendCrashLog,
|
|
13
|
+
import { appendCrashLog, setupFileLogger } from './file-logger.js';
|
|
14
|
+
import { derivePaths, HomeArgsError, initHome, isFullyAbsolute, isHomeInitialized, parseHostArgs, profileOfRealHome, resolveHome, } from './home.js';
|
|
15
|
+
import { createHostLogs } from './host-logs.js';
|
|
16
|
+
import { acquireInstanceLock } from './instance-lock.js';
|
|
9
17
|
import { createNodeModulesPluginLoader } from './node-modules-loader.js';
|
|
10
18
|
import { createPluginDiscovery } from './plugin-discovery.js';
|
|
11
|
-
import { createFsYamlConfigProvider, createProcessRespawnStrategy, READY_MESSAGE } from './providers.js';
|
|
19
|
+
import { createFsSecretsProvider, createFsYamlConfigProvider, createProcessRespawnStrategy, createServiceRestartStrategy, READY_MESSAGE, } from './providers.js';
|
|
12
20
|
import { tryDispatchSubcommand } from './subcommand.js';
|
|
13
21
|
import { installTerminalStateRestorer } from './terminal.js';
|
|
22
|
+
// ============================================================
|
|
23
|
+
// startAalis —— Node 宿主一行启动(独立部署与 monorepo 自托管共用)
|
|
24
|
+
// ============================================================
|
|
25
|
+
//
|
|
26
|
+
// 独立部署(scaffold 生成的 index.mjs):
|
|
27
|
+
// import { startAalis } from '@aalis/runtime';
|
|
28
|
+
// startAalis({ appDir: here, defaultHome: join(here, 'home') }); // 从 node_modules 加载插件 + 默认开控制台/文件日志
|
|
29
|
+
//
|
|
30
|
+
// monorepo 自托管(src/index.ts)传仓库根与 monorepo 风味的加载器:
|
|
31
|
+
// startAalis({ appDir, pluginLoader: createFsPluginLoader(join(appDir, 'packages')) });
|
|
32
|
+
//
|
|
33
|
+
// 命令行开头的宿主参数(`--home`、`--profile`、`--init`、`--service`)先取走,用来定家目录与运行形态;余下的 argv 非空即子命令
|
|
34
|
+
// 模式——`node index.mjs <name> [args]` ≡ 聊天里的 `/<name> args`,命中即执行并退出,未命中报错退出
|
|
35
|
+
// (exit 2),**两种情况都不进守护进程**。宿主自己解析命令行时传 `argv: []` 或显式数组。
|
|
36
|
+
//
|
|
37
|
+
// 家目录没初始化就拒绝启动,只提示怎样初始化:绝不在找不到家目录时静默起一个空的家。
|
|
38
|
+
//
|
|
39
|
+
// 子命令进程是与守护进程零通信的一次性实例,因此不装文件日志(会把守护进程正在写的 latest.log 轮转走)、
|
|
40
|
+
// 不注入重启策略(`restart` 会 spawn 出 argv 仍带 restart 的 detached 子进程,无限连环——实测)。
|
|
41
|
+
//
|
|
42
|
+
// 宿主的「I/O 那一层」(日志 sink / 终端复原 / 子命令分发)全在本包,core 只产生 LogEntry。
|
|
43
|
+
const APP_DIR_EXAMPLE = 'startAalis({ appDir: dirname(fileURLToPath(import.meta.url)) })';
|
|
44
|
+
/** respawn 时把实例锁的交接令牌交给新进程的环境变量 */
|
|
45
|
+
const HANDOFF_ENV = 'AALIS_LOCK_HANDOFF';
|
|
14
46
|
/**
|
|
15
47
|
* 读取 @aalis/core 的实际安装版本,供 App 启动 banner 展示。
|
|
16
48
|
* core 的 `exports` 开放了 `./package.json` 子路径,可 require;解析失败则返回 undefined,
|
|
@@ -31,9 +63,98 @@ function readCoreVersion() {
|
|
|
31
63
|
* 生命周期不变量:① `consoleHandle.bindEvents` 必须在 `new App` 之后(之前没有事件总线);
|
|
32
64
|
* ② 子命令短路必须在 `app.start` 之前。
|
|
33
65
|
*/
|
|
34
|
-
export async function startAalis(opts
|
|
66
|
+
export async function startAalis(opts) {
|
|
67
|
+
// JS 入口可能一个参数都不传:在动家目录之前停下,不落到缺省的家目录
|
|
68
|
+
if (typeof opts?.appDir !== 'string') {
|
|
69
|
+
console.error(`[aalis] startAalis is missing appDir: pass the directory of the entry file as appDir, for example ${APP_DIR_EXAMPLE}.`);
|
|
70
|
+
process.exit(2);
|
|
71
|
+
}
|
|
35
72
|
const { consoleSink = true, fileLog = true, terminalRestore = true } = opts;
|
|
36
|
-
|
|
73
|
+
// ── 家目录:在任何日志与文件写入之前定下来 ──
|
|
74
|
+
// 命令行与环境变量里写的相对路径按启动时的 cwd 解析一次:那是用户在 shell 里的意图。
|
|
75
|
+
// 启动目录可能已被删除,这时 process.cwd() 会抛错;只有遇到相对路径才需要它。
|
|
76
|
+
let startCwd;
|
|
77
|
+
try {
|
|
78
|
+
startCwd = process.cwd();
|
|
79
|
+
}
|
|
80
|
+
catch {
|
|
81
|
+
startCwd = undefined;
|
|
82
|
+
}
|
|
83
|
+
let hostArgs;
|
|
84
|
+
let home;
|
|
85
|
+
try {
|
|
86
|
+
hostArgs = parseHostArgs(opts.argv ?? process.argv.slice(2));
|
|
87
|
+
home = resolveHome({ args: hostArgs, env: process.env, defaultHome: opts.defaultHome, cwd: startCwd });
|
|
88
|
+
if (!isFullyAbsolute(opts.appDir)) {
|
|
89
|
+
throw new HomeArgsError(`appDir must be an absolute path: ${opts.appDir}`);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
catch (err) {
|
|
93
|
+
if (!(err instanceof HomeArgsError))
|
|
94
|
+
throw err;
|
|
95
|
+
console.error(`[aalis] ${err.message}`);
|
|
96
|
+
process.exit(2);
|
|
97
|
+
}
|
|
98
|
+
const appDir = normalize(opts.appDir);
|
|
99
|
+
const declared = derivePaths(home.home, appDir, home.profile);
|
|
100
|
+
if (hostArgs.init) {
|
|
101
|
+
try {
|
|
102
|
+
initHome(declared);
|
|
103
|
+
}
|
|
104
|
+
catch (err) {
|
|
105
|
+
console.error(`[aalis] ${err instanceof Error ? err.message : String(err)}`);
|
|
106
|
+
process.exit(1);
|
|
107
|
+
}
|
|
108
|
+
console.log(`[aalis] Initialized the home directory: ${declared.home}`);
|
|
109
|
+
process.exit(0);
|
|
110
|
+
}
|
|
111
|
+
if (!isHomeInitialized(declared)) {
|
|
112
|
+
console.error(`[aalis] The home directory is not initialized: ${declared.home}\n` +
|
|
113
|
+
'[aalis] Run the start command once with --init (before any subcommand) to initialize it.');
|
|
114
|
+
process.exit(1);
|
|
115
|
+
}
|
|
116
|
+
// 交给插件的家目录是真实路径:符号链接、大小写与末尾分隔符不同的写法指向同一个目录时,插件拿到的是同一个路径
|
|
117
|
+
// (记忆库按它记归属)。profile 按写法认不出时按真实路径再认一次,派生的库名才跟着同一个目录走
|
|
118
|
+
const realHome = realpathSync.native(declared.home);
|
|
119
|
+
const paths = derivePaths(realHome, appDir, home.profile ?? profileOfRealHome(realHome));
|
|
120
|
+
// 默认加载器从安装集的 package.json 找插件:缺了它会一个插件都不加载、照样起来,只留一行「发现 0 个插件」
|
|
121
|
+
if (!opts.pluginLoader && !existsSync(join(paths.app, 'package.json'))) {
|
|
122
|
+
console.error(`[aalis] The install directory ${paths.app} has no package.json, so there are no plugins to load.\n` +
|
|
123
|
+
`[aalis] appDir must point to the directory of the entry file, which holds package.json, for example ${APP_DIR_EXAMPLE}.`);
|
|
124
|
+
process.exit(1);
|
|
125
|
+
}
|
|
126
|
+
const subcommands = hostArgs.rest;
|
|
127
|
+
// ── 实例锁:同一家目录只许一个守护进程。要在写日志之前取到,否则第二个实例一起来就把正在写的 latest.log 轮转走 ──
|
|
128
|
+
// 交接令牌读到就从环境里删掉,不让插件起的子进程与侧车继承它。子命令进程不取锁(它们以后经 socket 连实例)。
|
|
129
|
+
const handoffToken = process.env[HANDOFF_ENV];
|
|
130
|
+
delete process.env[HANDOFF_ENV];
|
|
131
|
+
let instanceLock;
|
|
132
|
+
if (subcommands.length === 0) {
|
|
133
|
+
let acquired;
|
|
134
|
+
try {
|
|
135
|
+
acquired = acquireInstanceLock(paths.run, { handoffToken });
|
|
136
|
+
}
|
|
137
|
+
catch (err) {
|
|
138
|
+
console.error(`[aalis] Cannot acquire the instance lock in ${paths.run}: ${err instanceof Error ? err.message : String(err)}`);
|
|
139
|
+
process.exit(1);
|
|
140
|
+
}
|
|
141
|
+
if (!acquired.ok) {
|
|
142
|
+
const { holder, file } = acquired;
|
|
143
|
+
const occupied = `[aalis] An instance is already running in the home directory ${paths.home}: pid ${holder.pid} (lock file ${file}).\n` +
|
|
144
|
+
'[aalis] If you are sure no instance is running (for example, the process was killed and this machine cannot look up ' +
|
|
145
|
+
'process start times, or a container was killed and restarted within the same boot), delete this lock file and start again.';
|
|
146
|
+
if (hostArgs.service) {
|
|
147
|
+
// 服务形态按正常退出:配合 KeepAlive={SuccessfulExit=false},不会被服务管理器反复拉起再抢锁
|
|
148
|
+
console.error(`${occupied}\n[aalis] Started as a service, so this counts as a normal exit.`);
|
|
149
|
+
process.exit(0);
|
|
150
|
+
}
|
|
151
|
+
console.error(occupied);
|
|
152
|
+
process.exit(1);
|
|
153
|
+
}
|
|
154
|
+
instanceLock = acquired.lock;
|
|
155
|
+
const lock = acquired.lock;
|
|
156
|
+
process.on('exit', () => lock.release());
|
|
157
|
+
}
|
|
37
158
|
// ── 最早期:任何日志之前先装 bootstrap buffer,再装 terminal / console sink ──
|
|
38
159
|
const bootstrap = installBootstrapBuffer();
|
|
39
160
|
if (terminalRestore)
|
|
@@ -41,13 +162,13 @@ export async function startAalis(opts = {}) {
|
|
|
41
162
|
const subcommandMode = subcommands.length > 0;
|
|
42
163
|
// console sink 在 App 之前装:此时尚无事件总线(根绑定),sink 处于「无条件写」状态以打印早期启动日志,
|
|
43
164
|
// 待 App 起来再 bindEvents 接管 terminal:claimed/released。子命令模式日志走 stderr,stdout 只留命令结果。
|
|
44
|
-
// consoleSink: false 仍装 stderr + minLevel warn:加载器拒载「另一份 @aalis/core」的插件记 error
|
|
165
|
+
// consoleSink: false 仍装 stderr + minLevel warn:加载器拒载「另一份 @aalis/core」的插件记 error,不能只剩下游的指令服务不可用报错。
|
|
45
166
|
const consoleHandle = consoleSink
|
|
46
167
|
? installConsoleSink(subcommandMode ? { target: 'stderr' } : {})
|
|
47
168
|
: installConsoleSink({ target: 'stderr', minLevel: 'warn' });
|
|
48
169
|
// 子命令进程不写文件日志:setupFileLogger 会把 latest.log 轮转走,而守护进程可能正在写它(webui 历史日志
|
|
49
170
|
// 以该文件为单一数据源)。
|
|
50
|
-
const fileLogTarget = fileLog
|
|
171
|
+
const fileLogTarget = fileLog && !subcommandMode ? join(paths.logs, 'latest.log') : undefined;
|
|
51
172
|
// ── fatal handler(覆盖整个 async 启动过程)──
|
|
52
173
|
let fileLogger;
|
|
53
174
|
let handlingFatal = false;
|
|
@@ -66,18 +187,30 @@ export async function startAalis(opts = {}) {
|
|
|
66
187
|
}
|
|
67
188
|
process.exit(1);
|
|
68
189
|
};
|
|
69
|
-
process.on('uncaughtException', err => void exitWithFatalLog('
|
|
70
|
-
process.on('unhandledRejection', reason => void exitWithFatalLog('
|
|
190
|
+
process.on('uncaughtException', err => void exitWithFatalLog('Uncaught exception', err));
|
|
191
|
+
process.on('unhandledRejection', reason => void exitWithFatalLog('Unhandled promise rejection', reason));
|
|
71
192
|
// ── file logger(async)+ 释放 bootstrap buffer ──
|
|
72
193
|
if (fileLogTarget)
|
|
73
194
|
fileLogger = await setupFileLogger(fileLogTarget);
|
|
74
195
|
// sink 全部装好;bootstrap buffer 完成使命,解除订阅并释放内存。
|
|
75
196
|
bootstrap.dispose();
|
|
76
|
-
// ── 组装 App:YAML
|
|
77
|
-
|
|
78
|
-
const
|
|
79
|
-
|
|
80
|
-
|
|
197
|
+
// ── 组装 App:YAML 配置文档与密钥文件、按 loader 发现插件、用 spawn 重启 ──
|
|
198
|
+
// 配置或密钥文件读不进来(写坏了、读不了)是环境问题:一行报错退出,不带调用栈(消息不含文件内容)
|
|
199
|
+
const loadOrExit = (load) => {
|
|
200
|
+
try {
|
|
201
|
+
return load();
|
|
202
|
+
}
|
|
203
|
+
catch (err) {
|
|
204
|
+
console.error(`[aalis] ${err instanceof Error ? err.message : String(err)}`);
|
|
205
|
+
process.exit(1);
|
|
206
|
+
}
|
|
207
|
+
};
|
|
208
|
+
const { config, provider } = loadOrExit(() => createFsYamlConfigProvider(paths.config));
|
|
209
|
+
const secrets = loadOrExit(() => createFsSecretsProvider(paths.secrets));
|
|
210
|
+
const store = createConfigStore(config, provider, secrets);
|
|
211
|
+
// core 的慢操作阈值:缺省(含 YAML 空键解出的 null)交给 core 默认;不是非负有限数的写法告警后同样交给默认。
|
|
212
|
+
// 它与 logLevel 只在这里读一次,改了要重启:哪些核心键只在启动时读以 schema-config 的 CORE_RESTART_KEYS 为准,
|
|
213
|
+
// 改成热生效或新加启动时才读的键,同步改那一份
|
|
81
214
|
const slowThresholdMs = store.get('slowThresholdMs') ?? undefined;
|
|
82
215
|
const slowThresholdValid = slowThresholdMs === undefined ||
|
|
83
216
|
(typeof slowThresholdMs === 'number' && Number.isFinite(slowThresholdMs) && slowThresholdMs >= 0);
|
|
@@ -88,11 +221,17 @@ export async function startAalis(opts = {}) {
|
|
|
88
221
|
// 子命令进程没有重启能力,不注入策略:`app.restart()` 按 core 语义抛「不可用」,指令层折成失败文案。
|
|
89
222
|
// 注入的话,`restart` 子命令在 app.stop 超过策略 500ms 等待时会 spawn 一个 argv 仍带 restart 的
|
|
90
223
|
// detached 子进程,新进程再命中 restart……无限连环(实测 5 代,Ctrl+C 打不到)。
|
|
91
|
-
restartStrategy: subcommandMode
|
|
224
|
+
restartStrategy: subcommandMode
|
|
225
|
+
? undefined
|
|
226
|
+
: hostArgs.service
|
|
227
|
+
? createServiceRestartStrategy()
|
|
228
|
+
: createProcessRespawnStrategy({
|
|
229
|
+
appDir: paths.app,
|
|
230
|
+
cwd: startCwd ?? paths.home,
|
|
231
|
+
...(instanceLock ? { env: { [HANDOFF_ENV]: instanceLock.handoffToken } } : {}),
|
|
232
|
+
}),
|
|
92
233
|
// 宿主层决定 dev/prod;core 不读 process.env
|
|
93
234
|
devMode: opts.devMode ?? process.env.NODE_ENV !== 'production',
|
|
94
|
-
// 宿主注入时钟:日志时间戳的权威时间来源在此层,core 逻辑不主动取墙上时间。
|
|
95
|
-
now: () => new Date(),
|
|
96
235
|
// 宿主读取 @aalis/core 的实际版本注入启动 banner——core 环境无关、不自读 package.json。
|
|
97
236
|
version: readCoreVersion(),
|
|
98
237
|
});
|
|
@@ -101,16 +240,19 @@ export async function startAalis(opts = {}) {
|
|
|
101
240
|
const received = typeof slowThresholdMs === 'number' ? String(slowThresholdMs) : JSON.stringify(slowThresholdMs);
|
|
102
241
|
app.logger.warn(`配置项 slowThresholdMs 应为不小于 0 的有限数字(毫秒),收到 ${received},按默认值处理`);
|
|
103
242
|
}
|
|
104
|
-
// 配置文档先于任何插件接上:文档里的服务偏好要在全部提供者上线前生效
|
|
105
|
-
installHostConfig(app, store, opts.configSync);
|
|
106
|
-
// 默认值从 configSchema 派生(唯一声明来源),导入定义后、登记前深合并进文档;登记时原样交给 core
|
|
107
|
-
const configLoader = withPluginConfigSync(opts.pluginLoader ?? createNodeModulesPluginLoader(opts.projectDir), app, store, opts.configSync);
|
|
108
243
|
// 宿主的根绑定:事件订阅、服务查询与宿主服务登记都经它,随 App 停止撤回
|
|
109
244
|
const host = app.bind({ events, provide, services });
|
|
245
|
+
// 宿主路径、日志与配置文档先于任何插件接上:插件激活时就要用到,文档里的服务偏好要在全部提供者上线前生效。
|
|
246
|
+
// 日志接 App 写的那个中枢(runtime 不注入,即默认中枢),历史读本轮的文件日志
|
|
247
|
+
host.provide.use(hostPaths, paths, { exclusive: true });
|
|
248
|
+
host.provide.use(hostLogs, createHostLogs(LogHub.default, fileLogger, app.logger), { exclusive: true });
|
|
249
|
+
installHostConfig(app, store, opts.configSync);
|
|
250
|
+
// 默认值从 configSchema 派生(唯一声明来源),导入定义后、登记前深合并进文档;登记时原样交给 core
|
|
251
|
+
const configLoader = withPluginConfigSync(opts.pluginLoader ?? createNodeModulesPluginLoader(paths.app), app, store, opts.configSync);
|
|
110
252
|
const discovery = createPluginDiscovery(app, configLoader.loader, store);
|
|
111
|
-
host.provide(pluginSource, { rescan: () => discovery.rescan() }, { exclusive: true });
|
|
253
|
+
host.provide.use(pluginSource, { rescan: () => discovery.rescan() }, { exclusive: true });
|
|
112
254
|
// 不变量①:App 构造完成后再让 sink 监听终端归属事件——此前没有事件总线可订阅。
|
|
113
|
-
consoleHandle.bindEvents(host.events);
|
|
255
|
+
consoleHandle.bindEvents(host.events.use);
|
|
114
256
|
try {
|
|
115
257
|
// 每个定义交给 Core 前已经规范化;首次 apply 与配置快照用同一份字段。
|
|
116
258
|
await discovery.loadAll();
|
|
@@ -124,7 +266,7 @@ export async function startAalis(opts = {}) {
|
|
|
124
266
|
// 两种情况都干净退出、**绝不进守护进程**——打错的命令名若照常起守护,就是与运行中实例并存的
|
|
125
267
|
// 第二个实例(同时连 onebot、每条消息回两遍)。与具体命令解耦——各插件自行注册命令。
|
|
126
268
|
if (subcommandMode) {
|
|
127
|
-
const exitCode = await tryDispatchSubcommand(host.services, subcommands);
|
|
269
|
+
const exitCode = await tryDispatchSubcommand(host.services.use, subcommands);
|
|
128
270
|
await app.stop();
|
|
129
271
|
await new Promise(r => setImmediate(r));
|
|
130
272
|
process.exit(exitCode);
|
|
@@ -135,30 +277,14 @@ export async function startAalis(opts = {}) {
|
|
|
135
277
|
// 典型链条:A 缺 apiKey 激活失败(有 ERROR)→ 依赖 A 所提供服务的 B 静默挂起,
|
|
136
278
|
// 用户只看到 A 的报错,会以为「只是 A 不可用」,不知道 B 也一并废了
|
|
137
279
|
// (实例:embedding-openai 缺 key → memory-vector 永远不激活,向量记忆整个不工作)。
|
|
138
|
-
//
|
|
139
|
-
//
|
|
140
|
-
const
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
const waiting = new Set();
|
|
147
|
-
for (const svc of p.requiredServices ?? []) {
|
|
148
|
-
if (host.services.inspect(svc).length > 0)
|
|
149
|
-
continue;
|
|
150
|
-
const provider = activating.find(s => s.provides?.includes(svc));
|
|
151
|
-
if (provider)
|
|
152
|
-
waiting.add(provider.instanceId);
|
|
153
|
-
else
|
|
154
|
-
missing.push(svc);
|
|
155
|
-
}
|
|
156
|
-
const reasons = [
|
|
157
|
-
...(missing.length > 0 ? [`缺少服务: ${missing.join('、')}`] : []),
|
|
158
|
-
...[...waiting].map(id => `等待 ${id} 激活完成`),
|
|
159
|
-
];
|
|
160
|
-
if (reasons.length > 0)
|
|
161
|
-
app.logger.warn(`插件 "${p.instanceId}" 依赖未满足,未激活(${reasons.join(';')})`);
|
|
280
|
+
// 缺的沿依赖链追到根(失败、停用、没有提供者、成环)报 warn;只是在等提供者启动(含转入后台的慢激活)的报 info。
|
|
281
|
+
// 判据与写法同 plugin-doctor、WebUI 与终端界面(api-doctor 的 unmetDependencies);日志取说法的原文
|
|
282
|
+
for (const [instance, unmet] of unmetDependencies(app.plugins.getStatus(), host.services.use.names())) {
|
|
283
|
+
const why = describeUnmet(unmet).source;
|
|
284
|
+
if (unmet.lacking.length > 0)
|
|
285
|
+
app.logger.warn(`插件 "${instance}" 依赖未满足,未激活:${why}`);
|
|
286
|
+
else if (unmet.waiting.length > 0)
|
|
287
|
+
app.logger.info(`插件 "${instance}" 在等依赖启动:${why}`);
|
|
162
288
|
}
|
|
163
289
|
// 向重启我们的父进程回报「起来了」。父进程据此决定放手退出,还是判定本次
|
|
164
290
|
// 更新失败并回滚(见 providers.ts 的 createProcessRespawnStrategy)。
|
package/dist/start.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"start.js","sourceRoot":"","sources":["../src/start.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"start.js","sourceRoot":"","sources":["../src/start.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACrE,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAiB,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACpF,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAC/D,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACzE,OAAO,EAA0B,sBAAsB,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AACxG,OAAO,EAA0B,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAC/E,OAAO,EAAE,cAAc,EAAyB,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAC1F,OAAO,EACL,WAAW,EACX,aAAa,EACb,QAAQ,EACR,eAAe,EACf,iBAAiB,EACjB,aAAa,EACb,iBAAiB,EACjB,WAAW,GACZ,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,EAAE,mBAAmB,EAAqB,MAAM,oBAAoB,CAAC;AAC5E,OAAO,EAAE,6BAA6B,EAAE,MAAM,0BAA0B,CAAC;AACzE,OAAO,EAAE,qBAAqB,EAAqB,MAAM,uBAAuB,CAAC;AACjF,OAAO,EACL,uBAAuB,EACvB,0BAA0B,EAC1B,4BAA4B,EAC5B,4BAA4B,EAC5B,aAAa,GACd,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AACxD,OAAO,EAAE,4BAA4B,EAAE,MAAM,eAAe,CAAC;AAE7D,+DAA+D;AAC/D,kDAAkD;AAClD,+DAA+D;AAC/D,EAAE;AACF,gCAAgC;AAChC,iDAAiD;AACjD,0GAA0G;AAC1G,EAAE;AACF,mDAAmD;AACnD,0FAA0F;AAC1F,EAAE;AACF,uFAAuF;AACvF,4EAA4E;AAC5E,yDAAyD;AACzD,EAAE;AACF,4CAA4C;AAC5C,EAAE;AACF,4DAA4D;AAC5D,wEAAwE;AACxE,EAAE;AACF,8DAA8D;AAE9D,MAAM,eAAe,GAAG,iEAAiE,CAAC;AA4C1F,mCAAmC;AACnC,MAAM,WAAW,GAAG,oBAAoB,CAAC;AAEzC;;;;GAIG;AACH,SAAS,eAAe;IACtB,IAAI,CAAC;QACH,OAAQ,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,0BAA0B,CAA0B,CAAC,OAAO,CAAC;IACtG,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,IAAuB;IACtD,qCAAqC;IACrC,IAAI,OAAO,IAAI,EAAE,MAAM,KAAK,QAAQ,EAAE,CAAC;QACrC,OAAO,CAAC,KAAK,CACX,qGAAqG,eAAe,GAAG,CACxH,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,MAAM,EAAE,WAAW,GAAG,IAAI,EAAE,OAAO,GAAG,IAAI,EAAE,eAAe,GAAG,IAAI,EAAE,GAAG,IAAI,CAAC;IAE5E,4BAA4B;IAC5B,kDAAkD;IAClD,gDAAgD;IAChD,IAAI,QAA4B,CAAC;IACjC,IAAI,CAAC;QACH,QAAQ,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAC3B,CAAC;IAAC,MAAM,CAAC;QACP,QAAQ,GAAG,SAAS,CAAC;IACvB,CAAC;IACD,IAAI,QAA0C,CAAC;IAC/C,IAAI,IAAoC,CAAC;IACzC,IAAI,CAAC;QACH,QAAQ,GAAG,aAAa,CAAC,IAAI,CAAC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7D,IAAI,GAAG,WAAW,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,WAAW,EAAE,IAAI,CAAC,WAAW,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC,CAAC;QACvG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;YAClC,MAAM,IAAI,aAAa,CAAC,oCAAoC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;QAC7E,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,CAAC,GAAG,YAAY,aAAa,CAAC;YAAE,MAAM,GAAG,CAAC;QAC/C,OAAO,CAAC,KAAK,CAAC,WAAW,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;QACxC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,MAAM,MAAM,GAAG,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACtC,MAAM,QAAQ,GAAG,WAAW,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;IAC9D,IAAI,QAAQ,CAAC,IAAI,EAAE,CAAC;QAClB,IAAI,CAAC;YACH,QAAQ,CAAC,QAAQ,CAAC,CAAC;QACrB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,WAAW,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAC7E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,2CAA2C,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;QACxE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,EAAE,CAAC;QACjC,OAAO,CAAC,KAAK,CACX,kDAAkD,QAAQ,CAAC,IAAI,IAAI;YACjE,0FAA0F,CAC7F,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,wDAAwD;IACxD,qDAAqD;IACrD,MAAM,QAAQ,GAAG,YAAY,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IACpD,MAAM,KAAK,GAAG,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,OAAO,IAAI,iBAAiB,CAAC,QAAQ,CAAC,CAAC,CAAC;IACzF,+DAA+D;IAC/D,IAAI,CAAC,IAAI,CAAC,YAAY,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC,EAAE,CAAC;QACvE,OAAO,CAAC,KAAK,CACX,iCAAiC,KAAK,CAAC,GAAG,0DAA0D;YAClG,uGAAuG,eAAe,GAAG,CAC5H,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,MAAM,WAAW,GAAG,QAAQ,CAAC,IAAI,CAAC;IAElC,oEAAoE;IACpE,4DAA4D;IAC5D,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IAC9C,OAAO,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IAChC,IAAI,YAAsC,CAAC;IAC3C,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC7B,IAAI,QAAgD,CAAC;QACrD,IAAI,CAAC;YACH,QAAQ,GAAG,mBAAmB,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,YAAY,EAAE,CAAC,CAAC;QAC9D,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CACX,+CAA+C,KAAK,CAAC,GAAG,KAAK,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAChH,CAAC;YACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,QAAQ,CAAC;YAClC,MAAM,QAAQ,GACZ,gEAAgE,KAAK,CAAC,IAAI,SAAS,MAAM,CAAC,GAAG,eAAe,IAAI,MAAM;gBACtH,sHAAsH;gBACtH,4HAA4H,CAAC;YAC/H,IAAI,QAAQ,CAAC,OAAO,EAAE,CAAC;gBACrB,gEAAgE;gBAChE,OAAO,CAAC,KAAK,CAAC,GAAG,QAAQ,kEAAkE,CAAC,CAAC;gBAC7F,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YACD,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;YACxB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,YAAY,GAAG,QAAQ,CAAC,IAAI,CAAC;QAC7B,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC;QAC3B,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;IAC3C,CAAC;IAED,iEAAiE;IACjE,MAAM,SAAS,GAAG,sBAAsB,EAAE,CAAC;IAC3C,IAAI,eAAe;QAAE,4BAA4B,EAAE,CAAC;IACpD,MAAM,cAAc,GAAG,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC;IAC9C,iEAAiE;IACjE,mFAAmF;IACnF,kGAAkG;IAClG,MAAM,aAAa,GAAsB,WAAW;QAClD,CAAC,CAAC,kBAAkB,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAChE,CAAC,CAAC,kBAAkB,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC;IAE/D,uEAAuE;IACvE,eAAe;IACf,MAAM,aAAa,GAAG,OAAO,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAE9F,sCAAsC;IACtC,IAAI,UAAwC,CAAC;IAC7C,IAAI,aAAa,GAAG,KAAK,CAAC;IAC1B,MAAM,gBAAgB,GAAG,KAAK,EAAE,KAAa,EAAE,GAAY,EAAkB,EAAE;QAC7E,IAAI,aAAa;YAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACnC,aAAa,GAAG,IAAI,CAAC;QACrB,OAAO,CAAC,KAAK,CAAC,GAAG,KAAK,GAAG,EAAE,GAAG,CAAC,CAAC;QAChC,IAAI,CAAC;YACH,MAAM,UAAU,EAAE,KAAK,EAAE,CAAC;YAC1B,IAAI,aAAa;gBAAE,MAAM,cAAc,CAAC,KAAK,EAAE,GAAG,EAAE,aAAa,CAAC,CAAC;QACrE,CAAC;QAAC,MAAM,CAAC;YACP,YAAY;QACd,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC;IACF,OAAO,CAAC,EAAE,CAAC,mBAAmB,EAAE,GAAG,CAAC,EAAE,CAAC,KAAK,gBAAgB,CAAC,oBAAoB,EAAE,GAAG,CAAC,CAAC,CAAC;IACzF,OAAO,CAAC,EAAE,CAAC,oBAAoB,EAAE,MAAM,CAAC,EAAE,CAAC,KAAK,gBAAgB,CAAC,6BAA6B,EAAE,MAAM,CAAC,CAAC,CAAC;IAEzG,gDAAgD;IAChD,IAAI,aAAa;QAAE,UAAU,GAAG,MAAM,eAAe,CAAC,aAAa,CAAC,CAAC;IACrE,6CAA6C;IAC7C,SAAS,CAAC,OAAO,EAAE,CAAC;IAEpB,uDAAuD;IACvD,mDAAmD;IACnD,MAAM,UAAU,GAAG,CAAI,IAAa,EAAK,EAAE;QACzC,IAAI,CAAC;YACH,OAAO,IAAI,EAAE,CAAC;QAChB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,WAAW,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAC7E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC;IACF,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,0BAA0B,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;IACxF,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,uBAAuB,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;IACzE,MAAM,KAAK,GAAG,iBAAiB,CAAC,MAAM,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;IAC3D,mEAAmE;IACnE,+EAA+E;IAC/E,yBAAyB;IACzB,MAAM,eAAe,GAAG,KAAK,CAAC,GAAG,CAAC,iBAAiB,CAAC,IAAI,SAAS,CAAC;IAClE,MAAM,kBAAkB,GACtB,eAAe,KAAK,SAAS;QAC7B,CAAC,OAAO,eAAe,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,eAAe,CAAC,IAAI,eAAe,IAAI,CAAC,CAAC,CAAC;IACpG,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC;QAClB,IAAI,EAAE,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC;QACvB,QAAQ,EAAE,KAAK,CAAC,GAAG,CAAC,UAAU,CAAa;QAC3C,eAAe,EAAE,kBAAkB,CAAC,CAAC,CAAE,eAAsC,CAAC,CAAC,CAAC,SAAS;QACzF,+DAA+D;QAC/D,0EAA0E;QAC1E,wDAAwD;QACxD,eAAe,EAAE,cAAc;YAC7B,CAAC,CAAC,SAAS;YACX,CAAC,CAAC,QAAQ,CAAC,OAAO;gBAChB,CAAC,CAAC,4BAA4B,EAAE;gBAChC,CAAC,CAAC,4BAA4B,CAAC;oBAC3B,MAAM,EAAE,KAAK,CAAC,GAAG;oBACjB,GAAG,EAAE,QAAQ,IAAI,KAAK,CAAC,IAAI;oBAC3B,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE,CAAC,WAAW,CAAC,EAAE,YAAY,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;iBAC/E,CAAC;QACR,qCAAqC;QACrC,OAAO,EAAE,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,YAAY;QAC9D,iEAAiE;QACjE,OAAO,EAAE,eAAe,EAAE;KAC3B,CAAC,CAAC;IAEH,IAAI,CAAC,kBAAkB,EAAE,CAAC;QACxB,oDAAoD;QACpD,MAAM,QAAQ,GAAG,OAAO,eAAe,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC;QACjH,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,4CAA4C,QAAQ,SAAS,CAAC,CAAC;IACjF,CAAC;IAED,wCAAwC;IACxC,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC;IACrD,uDAAuD;IACvD,+CAA+C;IAC/C,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,KAAK,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACxD,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,cAAc,CAAC,MAAM,CAAC,OAAO,EAAE,UAAU,EAAE,GAAG,CAAC,MAAM,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACxG,iBAAiB,CAAC,GAAG,EAAE,KAAK,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;IAC/C,4DAA4D;IAC5D,MAAM,YAAY,GAAG,oBAAoB,CACvC,IAAI,CAAC,YAAY,IAAI,6BAA6B,CAAC,KAAK,CAAC,GAAG,CAAC,EAC7D,GAAG,EACH,KAAK,EACL,IAAI,CAAC,UAAU,CAChB,CAAC;IACF,MAAM,SAAS,GAAG,qBAAqB,CAAC,GAAG,EAAE,YAAY,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IACzE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1F,+CAA+C;IAC/C,aAAa,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAE1C,IAAI,CAAC;QACH,2CAA2C;QAC3C,MAAM,SAAS,CAAC,OAAO,EAAE,CAAC;IAC5B,CAAC;YAAS,CAAC;QACT,uCAAuC;QACvC,YAAY,CAAC,iBAAiB,EAAE,CAAC;IACnC,CAAC;IAED,iCAAiC;IACjC,qEAAqE;IACrE,kDAAkD;IAClD,gDAAgD;IAChD,IAAI,cAAc,EAAE,CAAC;QACnB,MAAM,QAAQ,GAAG,MAAM,qBAAqB,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;QAC7E,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;QACjB,MAAM,IAAI,OAAO,CAAO,CAAC,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC;QAC9C,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACzB,CAAC;IAED,yBAAyB;IACzB,MAAM,GAAG,CAAC,KAAK,EAAE,CAAC;IAElB,uDAAuD;IACvD,qDAAqD;IACrD,wCAAwC;IACxC,+DAA+D;IAC/D,+DAA+D;IAC/D,4EAA4E;IAC5E,KAAK,MAAM,CAAC,QAAQ,EAAE,KAAK,CAAC,IAAI,iBAAiB,CAAC,GAAG,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC;QACtG,MAAM,GAAG,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC;QACxC,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC;YAAE,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,QAAQ,eAAe,GAAG,EAAE,CAAC,CAAC;aAC9E,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC;YAAE,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,QAAQ,YAAY,GAAG,EAAE,CAAC,CAAC;IACvF,CAAC;IAED,sCAAsC;IACtC,0DAA0D;IAC1D,EAAE;IACF,8BAA8B;IAC9B,sEAAsE;IACtE,4DAA4D;IAC5D,mCAAmC;IACnC,0DAA0D;IAC1D,2DAA2D;IAC3D,0EAA0E;IAC1E,uCAAuC;IACvC,IAAI,OAAO,CAAC,SAAS;QAAE,OAAO,CAAC,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IAC/F,2CAA2C;IAC3C,OAAO,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC;IAEzB,4DAA4D;IAC5D,sBAAsB,CAAC,GAAG,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;IAC/D,IAAI,QAAQ,GAAG,KAAK,CAAC;IACrB,MAAM,QAAQ,GAAG,KAAK,IAAI,EAAE;QAC1B,IAAI,QAAQ;YAAE,OAAO;QACrB,QAAQ,GAAG,IAAI,CAAC;QAChB,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;QACjB,8DAA8D;QAC9D,mCAAmC;QACnC,MAAM,IAAI,OAAO,CAAO,CAAC,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC;QAC9C,MAAM,UAAU,EAAE,OAAO,EAAE,CAAC;QAC5B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC;IACF,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAC/B,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IAEhC,OAAO,GAAG,CAAC;AACb,CAAC"}
|
package/dist/subcommand.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"subcommand.d.ts","sourceRoot":"","sources":["../src/subcommand.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAE5C;;;;;;;;;;GAUG;AACH,wBAAsB,qBAAqB,CACzC,QAAQ,EAAE,QAAQ,EAClB,IAAI,EAAE,MAAM,EAAE,EACd,GAAG,GAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAA8B,EACpD,GAAG,GAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAgC,GACrD,OAAO,CAAC,MAAM,CAAC,
|
|
1
|
+
{"version":3,"file":"subcommand.d.ts","sourceRoot":"","sources":["../src/subcommand.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAE5C;;;;;;;;;;GAUG;AACH,wBAAsB,qBAAqB,CACzC,QAAQ,EAAE,QAAQ,EAClB,IAAI,EAAE,MAAM,EAAE,EACd,GAAG,GAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAA8B,EACpD,GAAG,GAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAgC,GACrD,OAAO,CAAC,MAAM,CAAC,CA2BjB"}
|
package/dist/subcommand.js
CHANGED
|
@@ -13,11 +13,11 @@ export async function tryDispatchSubcommand(services, argv, out = msg => console
|
|
|
13
13
|
const [cmdName = '', ...rest] = argv;
|
|
14
14
|
const commands = services.get('commands');
|
|
15
15
|
if (!commands) {
|
|
16
|
-
err(
|
|
16
|
+
err(`Cannot run subcommand "${cmdName}": the commands service is unavailable (is @aalis/plugin-commands installed?)`);
|
|
17
17
|
return 2;
|
|
18
18
|
}
|
|
19
19
|
if (!cmdName || !commands.has(cmdName)) {
|
|
20
|
-
err(
|
|
20
|
+
err(`Unknown subcommand "${cmdName}". A subcommand runs like /${cmdName} in chat; start without arguments to run the daemon.`);
|
|
21
21
|
return 2;
|
|
22
22
|
}
|
|
23
23
|
const result = await commands.execute(cmdName, {
|
package/dist/subcommand.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"subcommand.js","sourceRoot":"","sources":["../src/subcommand.ts"],"names":[],"mappings":"AAGA;;;;;;;;;;GAUG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,QAAkB,EAClB,IAAc,EACd,MAA6B,GAAG,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,EACpD,MAA6B,GAAG,CAAC,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC;IAEtD,MAAM,CAAC,OAAO,GAAG,EAAE,EAAE,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC;IACrC,MAAM,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,UAAU,CAA+B,CAAC;IACxE,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,GAAG,
|
|
1
|
+
{"version":3,"file":"subcommand.js","sourceRoot":"","sources":["../src/subcommand.ts"],"names":[],"mappings":"AAGA;;;;;;;;;;GAUG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,QAAkB,EAClB,IAAc,EACd,MAA6B,GAAG,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,EACpD,MAA6B,GAAG,CAAC,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC;IAEtD,MAAM,CAAC,OAAO,GAAG,EAAE,EAAE,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC;IACrC,MAAM,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,UAAU,CAA+B,CAAC;IACxE,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,GAAG,CACD,0BAA0B,OAAO,+EAA+E,CACjH,CAAC;QACF,OAAO,CAAC,CAAC;IACX,CAAC;IACD,IAAI,CAAC,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;QACvC,GAAG,CACD,uBAAuB,OAAO,8BAA8B,OAAO,sDAAsD,CAC1H,CAAC;QACF,OAAO,CAAC,CAAC;IACX,CAAC;IACD,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC,OAAO,EAAE;QAC7C,SAAS,EAAE,KAAK;QAChB,QAAQ,EAAE,KAAK;QACf,uEAAuE;QACvE,4DAA4D;QAC5D,MAAM,EAAE,SAAS;QACjB,IAAI,EAAE,IAAI;QACV,GAAG,EAAE,IAAI,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE;QAC5D,WAAW,EAAE,IAAI;KAClB,CAAC,CAAC;IACH,IAAI,MAAM;QAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACxB,OAAO,CAAC,CAAC;AACX,CAAC"}
|