@aalis/runtime 0.18.0 → 0.20.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 +4 -4
- package/dist/config-store.d.ts +10 -2
- package/dist/config-store.d.ts.map +1 -1
- package/dist/config-store.js +76 -25
- package/dist/config-store.js.map +1 -1
- package/dist/config-sync.d.ts +9 -15
- package/dist/config-sync.d.ts.map +1 -1
- package/dist/config-sync.js +45 -50
- package/dist/config-sync.js.map +1 -1
- package/dist/console-sink.d.ts +1 -1
- package/dist/console-sink.d.ts.map +1 -1
- package/dist/console-sink.js +1 -5
- package/dist/console-sink.js.map +1 -1
- package/dist/data-dir.d.ts +60 -0
- package/dist/data-dir.d.ts.map +1 -0
- package/dist/data-dir.js +181 -0
- package/dist/data-dir.js.map +1 -0
- package/dist/file-logger.d.ts +2 -2
- package/dist/file-logger.d.ts.map +1 -1
- package/dist/file-logger.js +13 -10
- package/dist/file-logger.js.map +1 -1
- package/dist/host-logs.d.ts +1 -1
- package/dist/host-logs.js +1 -1
- package/dist/index.d.ts +2 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -5
- package/dist/index.js.map +1 -1
- package/dist/instance-lock.js +5 -5
- package/dist/instance-lock.js.map +1 -1
- package/dist/locales/en.d.ts +4 -0
- package/dist/locales/en.d.ts.map +1 -1
- package/dist/locales/en.js +4 -0
- package/dist/locales/en.js.map +1 -1
- package/dist/node-modules-loader.d.ts +4 -7
- package/dist/node-modules-loader.d.ts.map +1 -1
- package/dist/node-modules-loader.js +18 -25
- package/dist/node-modules-loader.js.map +1 -1
- package/dist/plugin-discovery.d.ts +10 -3
- package/dist/plugin-discovery.d.ts.map +1 -1
- package/dist/plugin-discovery.js +64 -30
- package/dist/plugin-discovery.js.map +1 -1
- package/dist/providers.d.ts +13 -13
- package/dist/providers.d.ts.map +1 -1
- package/dist/providers.js +22 -35
- package/dist/providers.js.map +1 -1
- package/dist/secrets.js +1 -1
- package/dist/secrets.js.map +1 -1
- package/dist/start.d.ts +7 -13
- package/dist/start.d.ts.map +1 -1
- package/dist/start.js +96 -75
- package/dist/start.js.map +1 -1
- package/dist/subcommand.d.ts +1 -1
- package/dist/subcommand.js +1 -1
- package/dist/texts.d.ts +8 -0
- package/dist/texts.d.ts.map +1 -1
- package/dist/texts.js +4 -0
- package/dist/texts.js.map +1 -1
- package/dist/yaml-file.d.ts +4 -2
- package/dist/yaml-file.d.ts.map +1 -1
- package/dist/yaml-file.js +9 -5
- package/dist/yaml-file.js.map +1 -1
- package/package.json +6 -6
- package/dist/bootstrap-buffer.d.ts +0 -34
- package/dist/bootstrap-buffer.d.ts.map +0 -1
- package/dist/bootstrap-buffer.js +0 -42
- package/dist/bootstrap-buffer.js.map +0 -1
- package/dist/home.d.ts +0 -64
- package/dist/home.d.ts.map +0 -1
- package/dist/home.js +0 -206
- package/dist/home.js.map +0 -1
- package/dist/terminal.d.ts +0 -16
- package/dist/terminal.d.ts.map +0 -1
- package/dist/terminal.js +0 -43
- package/dist/terminal.js.map +0 -1
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aalis/runtime",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.20.0",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -29,13 +29,13 @@
|
|
|
29
29
|
"dependencies": {
|
|
30
30
|
"chalk": "^5.4.0",
|
|
31
31
|
"yaml": "^2.7.0",
|
|
32
|
-
"@aalis/schema-config": ">=0.16.
|
|
32
|
+
"@aalis/schema-config": ">=0.16.2 <1.0.0",
|
|
33
33
|
"@aalis/schema-log": ">=0.2.0 <1.0.0",
|
|
34
34
|
"@aalis/api-doctor": ">=0.9.0 <1.0.0",
|
|
35
|
-
"@aalis/api-plugin-source": ">=0.
|
|
35
|
+
"@aalis/api-plugin-source": ">=0.3.0 <1.0.0",
|
|
36
36
|
"@aalis/api-host-config": ">=0.3.0 <1.0.0",
|
|
37
37
|
"@aalis/api-host-logs": ">=0.1.0 <1.0.0",
|
|
38
|
-
"@aalis/api-host-paths": ">=0.
|
|
38
|
+
"@aalis/api-host-paths": ">=0.3.0 <1.0.0",
|
|
39
39
|
"@aalis/schema-i18n": ">=0.1.0 <1.0.0"
|
|
40
40
|
},
|
|
41
41
|
"peerDependencies": {
|
|
@@ -44,8 +44,8 @@
|
|
|
44
44
|
"devDependencies": {
|
|
45
45
|
"typescript": "^5.7.0",
|
|
46
46
|
"@types/node": "^22.0.0",
|
|
47
|
-
"@aalis/
|
|
48
|
-
"@aalis/
|
|
47
|
+
"@aalis/api-commands": "0.9.0",
|
|
48
|
+
"@aalis/core": "0.21.1"
|
|
49
49
|
},
|
|
50
50
|
"scripts": {
|
|
51
51
|
"build": "tsc",
|
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
import { LogHub } from '@aalis/core';
|
|
2
|
-
import type { LogEntry } from '@aalis/schema-log';
|
|
3
|
-
/**
|
|
4
|
-
* 启动期 bootstrap buffer:在任何 sink(file/console)装好之前订阅 LogHub,
|
|
5
|
-
* 把启动期产生的所有 LogEntry 暂存。等所有 sink 装好后调用 `dispose()`
|
|
6
|
-
* 解除订阅并清空——之后所有日志直接通过 LogHub.onEntry 走 sink 实时落盘 / 渲染。
|
|
7
|
-
*
|
|
8
|
-
* 设计要点:
|
|
9
|
-
* - **进程级单例**:通过 module-level state 实现,由 `startAalis` 在最早时机
|
|
10
|
-
* 调用 `installBootstrapBuffer()` 一次(在 Logger 第一次被调用之前)。
|
|
11
|
-
* - **多 sink 共享**:每个 sink 装载时调用 `snapshot()` 拿到当前已捕获条目副本
|
|
12
|
-
* 并自行消费(写文件 / 渲染 stdout);snapshot 不改变状态,可任意次。
|
|
13
|
-
* - **显式 dispose**:所有 sink 装好后由 host 显式 `dispose()` —— 之后 buffer
|
|
14
|
-
* 不再接收新条目,但已订阅的 sink 通过 `LogHub.onEntry` 继续收实时事件。
|
|
15
|
-
* - **核心零状态**:LogHub 自身不再持有 buffer,bootstrap 这种"短暂状态"是
|
|
16
|
-
* runtime 关注点,不污染 core。
|
|
17
|
-
*/
|
|
18
|
-
interface BootstrapBuffer {
|
|
19
|
-
/** 当前已捕获 entries 的副本。可重复调用。 */
|
|
20
|
-
snapshot(): LogEntry[];
|
|
21
|
-
/** 解除订阅 + 清空。重复调用幂等。 */
|
|
22
|
-
dispose(): void;
|
|
23
|
-
}
|
|
24
|
-
/**
|
|
25
|
-
* 安装 bootstrap buffer。必须在所有日志产生之前调用(由 `startAalis` 最先调用)。
|
|
26
|
-
* 重复调用返回同一实例。
|
|
27
|
-
*/
|
|
28
|
-
export declare function installBootstrapBuffer(hub?: LogHub): BootstrapBuffer;
|
|
29
|
-
/** 获取已安装的 bootstrap buffer。未安装则返回空 stub(snapshot 永远空)。 */
|
|
30
|
-
export declare function getBootstrapBuffer(): BootstrapBuffer;
|
|
31
|
-
/** 测试钩子:重置 installed 状态。仅供单元测试使用。 */
|
|
32
|
-
export declare function __resetBootstrapBufferForTests(): void;
|
|
33
|
-
export {};
|
|
34
|
-
//# sourceMappingURL=bootstrap-buffer.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"bootstrap-buffer.d.ts","sourceRoot":"","sources":["../src/bootstrap-buffer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAElD;;;;;;;;;;;;;;GAcG;AACH,UAAU,eAAe;IACvB,+BAA+B;IAC/B,QAAQ,IAAI,QAAQ,EAAE,CAAC;IACvB,wBAAwB;IACxB,OAAO,IAAI,IAAI,CAAC;CACjB;AAID;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,GAAG,GAAE,MAAuB,GAAG,eAAe,CAuBpF;AAED,0DAA0D;AAC1D,wBAAgB,kBAAkB,IAAI,eAAe,CAGpD;AAED,qCAAqC;AACrC,wBAAgB,8BAA8B,IAAI,IAAI,CAGrD"}
|
package/dist/bootstrap-buffer.js
DELETED
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
import { LogHub } from '@aalis/core';
|
|
2
|
-
let installed = null;
|
|
3
|
-
/**
|
|
4
|
-
* 安装 bootstrap buffer。必须在所有日志产生之前调用(由 `startAalis` 最先调用)。
|
|
5
|
-
* 重复调用返回同一实例。
|
|
6
|
-
*/
|
|
7
|
-
export function installBootstrapBuffer(hub = LogHub.default) {
|
|
8
|
-
if (installed)
|
|
9
|
-
return installed;
|
|
10
|
-
let entries = [];
|
|
11
|
-
let disposed = false;
|
|
12
|
-
const off = hub.onEntry(entry => {
|
|
13
|
-
if (!disposed)
|
|
14
|
-
entries.push(entry);
|
|
15
|
-
});
|
|
16
|
-
const handle = {
|
|
17
|
-
snapshot() {
|
|
18
|
-
return entries.slice();
|
|
19
|
-
},
|
|
20
|
-
dispose() {
|
|
21
|
-
if (disposed)
|
|
22
|
-
return;
|
|
23
|
-
disposed = true;
|
|
24
|
-
entries = [];
|
|
25
|
-
off();
|
|
26
|
-
},
|
|
27
|
-
};
|
|
28
|
-
installed = handle;
|
|
29
|
-
return handle;
|
|
30
|
-
}
|
|
31
|
-
/** 获取已安装的 bootstrap buffer。未安装则返回空 stub(snapshot 永远空)。 */
|
|
32
|
-
export function getBootstrapBuffer() {
|
|
33
|
-
if (installed)
|
|
34
|
-
return installed;
|
|
35
|
-
return { snapshot: () => [], dispose: () => { } };
|
|
36
|
-
}
|
|
37
|
-
/** 测试钩子:重置 installed 状态。仅供单元测试使用。 */
|
|
38
|
-
export function __resetBootstrapBufferForTests() {
|
|
39
|
-
installed?.dispose();
|
|
40
|
-
installed = null;
|
|
41
|
-
}
|
|
42
|
-
//# sourceMappingURL=bootstrap-buffer.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"bootstrap-buffer.js","sourceRoot":"","sources":["../src/bootstrap-buffer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAyBrC,IAAI,SAAS,GAA2B,IAAI,CAAC;AAE7C;;;GAGG;AACH,MAAM,UAAU,sBAAsB,CAAC,MAAc,MAAM,CAAC,OAAO;IACjE,IAAI,SAAS;QAAE,OAAO,SAAS,CAAC;IAEhC,IAAI,OAAO,GAAe,EAAE,CAAC;IAC7B,IAAI,QAAQ,GAAG,KAAK,CAAC;IACrB,MAAM,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;QAC9B,IAAI,CAAC,QAAQ;YAAE,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,MAAM,MAAM,GAAoB;QAC9B,QAAQ;YACN,OAAO,OAAO,CAAC,KAAK,EAAE,CAAC;QACzB,CAAC;QACD,OAAO;YACL,IAAI,QAAQ;gBAAE,OAAO;YACrB,QAAQ,GAAG,IAAI,CAAC;YAChB,OAAO,GAAG,EAAE,CAAC;YACb,GAAG,EAAE,CAAC;QACR,CAAC;KACF,CAAC;IAEF,SAAS,GAAG,MAAM,CAAC;IACnB,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,0DAA0D;AAC1D,MAAM,UAAU,kBAAkB;IAChC,IAAI,SAAS;QAAE,OAAO,SAAS,CAAC;IAChC,OAAO,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,GAAE,CAAC,EAAE,CAAC;AACnD,CAAC;AAED,qCAAqC;AACrC,MAAM,UAAU,8BAA8B;IAC5C,SAAS,EAAE,OAAO,EAAE,CAAC;IACrB,SAAS,GAAG,IAAI,CAAC;AACnB,CAAC"}
|
package/dist/home.d.ts
DELETED
|
@@ -1,64 +0,0 @@
|
|
|
1
|
-
import type { HostPaths } from '@aalis/api-host-paths';
|
|
2
|
-
/** 宿主件的路径参数必须是绝对路径:相对路径会按调用那一刻的 cwd 解析,而 cwd 不带语义 */
|
|
3
|
-
export declare function assertAbsolute(what: string, p: string): void;
|
|
4
|
-
/**
|
|
5
|
-
* 绝对路径。Windows 上还要带盘符或 UNC 前缀:`\aalis` 这类按当前盘解析,仍然依赖 cwd。
|
|
6
|
-
*/
|
|
7
|
-
export declare function isFullyAbsolute(p: string, platform?: NodeJS.Platform): boolean;
|
|
8
|
-
/** 家目录相关的输入有误(参数缺值、profile 名不合法、来源冲突):宿主据此一行报错退出。 */
|
|
9
|
-
export declare class HomeArgsError extends Error {
|
|
10
|
-
name: string;
|
|
11
|
-
}
|
|
12
|
-
/** 出现在子命令之前的宿主参数。 */
|
|
13
|
-
export interface HostArgs {
|
|
14
|
-
home?: string;
|
|
15
|
-
profile?: string;
|
|
16
|
-
/** `--init`:初始化家目录后退出 */
|
|
17
|
-
init: boolean;
|
|
18
|
-
/** `--service`:由服务管理器拉起;实例锁被占时按正常退出,免得被反复拉起 */
|
|
19
|
-
service: boolean;
|
|
20
|
-
/** 余下的 argv:非空即子命令 */
|
|
21
|
-
rest: string[];
|
|
22
|
-
}
|
|
23
|
-
/**
|
|
24
|
-
* 只认开头的宿主参数(`--home <dir>`、`--home=<dir>`、`--profile`、`--init`、`--service`),遇到第一个别的参数即停:
|
|
25
|
-
* 之后的都属于子命令,子命令自己的参数里出现同名写法也不会被吃掉。
|
|
26
|
-
* 开头这一段里的 `--` 跳过:`pnpm dev -- --init` 会把 `--` 原样传进来。
|
|
27
|
-
*/
|
|
28
|
-
export declare function parseHostArgs(argv: readonly string[]): HostArgs;
|
|
29
|
-
export interface ResolveHomeInput {
|
|
30
|
-
args: Pick<HostArgs, 'home' | 'profile'>;
|
|
31
|
-
env: Readonly<Record<string, string | undefined>>;
|
|
32
|
-
/** 宿主代码给的兜底家目录,优先级最低,必须是绝对路径 */
|
|
33
|
-
defaultHome?: string;
|
|
34
|
-
/** 解析命令行与环境变量里相对路径的基准:启动时的 cwd。取不到(目录已被删除)时不给,只有遇到相对路径才需要它 */
|
|
35
|
-
cwd?: string;
|
|
36
|
-
/** 用户主目录 */
|
|
37
|
-
userHome?: string;
|
|
38
|
-
}
|
|
39
|
-
/**
|
|
40
|
-
* 家目录的覆盖顺序:`--home` → `AALIS_HOME` → `--profile` / `AALIS_PROFILE`(`~/.aalis-<p>`)→ 宿主的 defaultHome → `~/.aalis`。
|
|
41
|
-
* 指定了 profile、同时又有更高优先级的 `--home` 或 `AALIS_HOME` 时报错,不静默忽略 profile:
|
|
42
|
-
* 以为进了测试实例、实际写进主实例,是这类配置错误最坏的后果。
|
|
43
|
-
*/
|
|
44
|
-
export declare function resolveHome(input: ResolveHomeInput): {
|
|
45
|
-
home: string;
|
|
46
|
-
profile?: string;
|
|
47
|
-
};
|
|
48
|
-
/**
|
|
49
|
-
* 按真实路径补认 profile:家目录的真实路径就是 `~/.aalis-<p>` 的真实路径时为 p。补上按写法认不出的情形:
|
|
50
|
-
* 大小写写错、经指向它的符号链接选中、用户主目录本身是符号链接。`~/.aalis-<p>` 自己是指向别处的链接时,
|
|
51
|
-
* 经那个别处的路径选中仍认不出。用户主目录不存在时没有 profile。
|
|
52
|
-
*/
|
|
53
|
-
export declare function profileOfRealHome(realHome: string, userHome?: string): string | undefined;
|
|
54
|
-
/** 由家目录与安装集派生全部路径(家目录布局见计划书「家目录布局」)。 */
|
|
55
|
-
export declare function derivePaths(home: string, app: string, profile?: string): HostPaths;
|
|
56
|
-
/** 初始化的判据:主配置文件存在。 */
|
|
57
|
-
export declare function isHomeInitialized(paths: HostPaths): boolean;
|
|
58
|
-
/**
|
|
59
|
-
* 建家目录:目录 0700,写默认主配置与空的密钥文件(0600),建布局里的子目录。主配置只有名字、日志级别与空的插件段。
|
|
60
|
-
* 已初始化时拒绝,不覆盖任何文件。目录已存在时只接受空目录,或只有布局自己条目的目录(上次初始化中途失败),
|
|
61
|
-
* 沿用并收紧为 0700:`--home ~ --init` 这类笔误不能把用户主目录改成 0700、再往里铺一层布局。
|
|
62
|
-
*/
|
|
63
|
-
export declare function initHome(paths: HostPaths): void;
|
|
64
|
-
//# sourceMappingURL=home.d.ts.map
|
package/dist/home.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"home.d.ts","sourceRoot":"","sources":["../src/home.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAYvD,qDAAqD;AACrD,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI,CAE5D;AAqBD;;GAEG;AACH,wBAAgB,eAAe,CAAC,CAAC,EAAE,MAAM,EAAE,QAAQ,GAAE,MAAM,CAAC,QAA2B,GAAG,OAAO,CAEhG;AAED,qDAAqD;AACrD,qBAAa,aAAc,SAAQ,KAAK;IAC7B,IAAI,SAAmB;CACjC;AAED,qBAAqB;AACrB,MAAM,WAAW,QAAQ;IACvB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,yBAAyB;IACzB,IAAI,EAAE,OAAO,CAAC;IACd,+CAA+C;IAC/C,OAAO,EAAE,OAAO,CAAC;IACjB,sBAAsB;IACtB,IAAI,EAAE,MAAM,EAAE,CAAC;CAChB;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,QAAQ,CAmB/D;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;IACzC,GAAG,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC;IAClD,gCAAgC;IAChC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,8DAA8D;IAC9D,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,YAAY;IACZ,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,gBAAgB,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,CA0BvF;AAaD;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,GAAE,MAAkB,GAAG,MAAM,GAAG,SAAS,CAQpG;AAyBD,wCAAwC;AACxC,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAgBlF;AAED,sBAAsB;AACtB,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAE3D;AAED;;;;GAIG;AACH,wBAAgB,QAAQ,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI,CAyB/C"}
|
package/dist/home.js
DELETED
|
@@ -1,206 +0,0 @@
|
|
|
1
|
-
import { chmodSync, existsSync, mkdirSync, readdirSync, realpathSync, writeFileSync } from 'node:fs';
|
|
2
|
-
import { homedir } from 'node:os';
|
|
3
|
-
import { basename, isAbsolute, join, normalize, resolve } from 'node:path';
|
|
4
|
-
import { CORE_CONFIG_SCHEMA, defaultsFrom } from '@aalis/schema-config';
|
|
5
|
-
import { stringify as stringifyYaml } from 'yaml';
|
|
6
|
-
// ============================================================
|
|
7
|
-
// 家目录:解析、路径派生与初始化
|
|
8
|
-
// ============================================================
|
|
9
|
-
//
|
|
10
|
-
// 家目录装着一个实例的全部状态与密钥,只在这里解析,core 不参与。进程的 cwd 不带语义:
|
|
11
|
-
// 唯一的例外是命令行与环境变量里写的相对路径,它们按启动时的 cwd 解析一次(那是用户在 shell 里的意图),
|
|
12
|
-
// 之后全程只用绝对路径。
|
|
13
|
-
/** 宿主件的路径参数必须是绝对路径:相对路径会按调用那一刻的 cwd 解析,而 cwd 不带语义 */
|
|
14
|
-
export function assertAbsolute(what, p) {
|
|
15
|
-
if (!isFullyAbsolute(p))
|
|
16
|
-
throw new Error(`${what} must be an absolute path: ${p}`);
|
|
17
|
-
}
|
|
18
|
-
/** profile 名既拼进 `~/.aalis-<profile>`,也拼进数据库名:只许小写字母、数字与连字符,挡住 `../x` 这类跳出。 */
|
|
19
|
-
const PROFILE_PATTERN = /^[a-z0-9][a-z0-9-]{0,31}$/;
|
|
20
|
-
const CONFIG_FILE = 'aalis.config.yaml';
|
|
21
|
-
const SECRETS_FILE = 'secrets.yaml';
|
|
22
|
-
/** `--init` 只在空目录、或只有布局自己的条目(上次初始化中途失败留下的)的目录里做 */
|
|
23
|
-
const LAYOUT_ENTRIES = new Set([
|
|
24
|
-
'state',
|
|
25
|
-
'logs',
|
|
26
|
-
'cache',
|
|
27
|
-
'run',
|
|
28
|
-
'tmp',
|
|
29
|
-
'self',
|
|
30
|
-
'workspace',
|
|
31
|
-
SECRETS_FILE,
|
|
32
|
-
'.DS_Store',
|
|
33
|
-
]);
|
|
34
|
-
/**
|
|
35
|
-
* 绝对路径。Windows 上还要带盘符或 UNC 前缀:`\aalis` 这类按当前盘解析,仍然依赖 cwd。
|
|
36
|
-
*/
|
|
37
|
-
export function isFullyAbsolute(p, platform = process.platform) {
|
|
38
|
-
return platform === 'win32' ? /^(?:[A-Za-z]:[\\/]|\\\\)/.test(p) : isAbsolute(p);
|
|
39
|
-
}
|
|
40
|
-
/** 家目录相关的输入有误(参数缺值、profile 名不合法、来源冲突):宿主据此一行报错退出。 */
|
|
41
|
-
export class HomeArgsError extends Error {
|
|
42
|
-
name = 'HomeArgsError';
|
|
43
|
-
}
|
|
44
|
-
/**
|
|
45
|
-
* 只认开头的宿主参数(`--home <dir>`、`--home=<dir>`、`--profile`、`--init`、`--service`),遇到第一个别的参数即停:
|
|
46
|
-
* 之后的都属于子命令,子命令自己的参数里出现同名写法也不会被吃掉。
|
|
47
|
-
* 开头这一段里的 `--` 跳过:`pnpm dev -- --init` 会把 `--` 原样传进来。
|
|
48
|
-
*/
|
|
49
|
-
export function parseHostArgs(argv) {
|
|
50
|
-
const out = { init: false, service: false, rest: [] };
|
|
51
|
-
let i = 0;
|
|
52
|
-
for (; i < argv.length; i++) {
|
|
53
|
-
const arg = argv[i];
|
|
54
|
-
if (arg === '--')
|
|
55
|
-
continue;
|
|
56
|
-
if (arg === '--init' || arg === '--service') {
|
|
57
|
-
out[arg === '--init' ? 'init' : 'service'] = true;
|
|
58
|
-
continue;
|
|
59
|
-
}
|
|
60
|
-
const m = /^--(home|profile)(?:=(.*))?$/.exec(arg);
|
|
61
|
-
if (!m)
|
|
62
|
-
break;
|
|
63
|
-
const key = m[1];
|
|
64
|
-
const value = m[2] ?? argv[++i];
|
|
65
|
-
if (!value)
|
|
66
|
-
throw new HomeArgsError(`--${key} is missing a value`);
|
|
67
|
-
out[key] = value;
|
|
68
|
-
}
|
|
69
|
-
out.rest = argv.slice(i);
|
|
70
|
-
return out;
|
|
71
|
-
}
|
|
72
|
-
/**
|
|
73
|
-
* 家目录的覆盖顺序:`--home` → `AALIS_HOME` → `--profile` / `AALIS_PROFILE`(`~/.aalis-<p>`)→ 宿主的 defaultHome → `~/.aalis`。
|
|
74
|
-
* 指定了 profile、同时又有更高优先级的 `--home` 或 `AALIS_HOME` 时报错,不静默忽略 profile:
|
|
75
|
-
* 以为进了测试实例、实际写进主实例,是这类配置错误最坏的后果。
|
|
76
|
-
*/
|
|
77
|
-
export function resolveHome(input) {
|
|
78
|
-
const { args, env } = input;
|
|
79
|
-
const userHome = input.userHome ?? homedir();
|
|
80
|
-
// 环境变量设成空串(`AALIS_HOME=` 用来清掉它)视同没设
|
|
81
|
-
const explicit = args.home ?? nonEmpty(env.AALIS_HOME);
|
|
82
|
-
const profile = args.profile ?? nonEmpty(env.AALIS_PROFILE);
|
|
83
|
-
// defaultHome 是宿主代码写死的值:写错了不论这次谁胜出都报,免得换一台没设环境变量的机器才暴露
|
|
84
|
-
if (input.defaultHome !== undefined && !isFullyAbsolute(input.defaultHome)) {
|
|
85
|
-
throw new HomeArgsError(`defaultHome must be an absolute path: ${input.defaultHome}`);
|
|
86
|
-
}
|
|
87
|
-
if (explicit !== undefined && profile !== undefined) {
|
|
88
|
-
const homeSource = args.home !== undefined ? '--home' : 'AALIS_HOME';
|
|
89
|
-
const profileSource = args.profile !== undefined ? '--profile' : 'AALIS_PROFILE';
|
|
90
|
-
throw new HomeArgsError(`Both ${homeSource} and ${profileSource} are set; use only one of them`);
|
|
91
|
-
}
|
|
92
|
-
if (explicit !== undefined)
|
|
93
|
-
return withProfile(toAbsolute(explicit, userHome, input.cwd), userHome);
|
|
94
|
-
if (profile !== undefined) {
|
|
95
|
-
if (!PROFILE_PATTERN.test(profile)) {
|
|
96
|
-
throw new HomeArgsError(`Invalid profile name "${profile}": use only lowercase letters, digits and hyphens, start with a letter or digit, and keep it within 32 characters`);
|
|
97
|
-
}
|
|
98
|
-
return { home: join(userHome, `.aalis-${profile}`), profile };
|
|
99
|
-
}
|
|
100
|
-
if (input.defaultHome !== undefined)
|
|
101
|
-
return withProfile(normalize(input.defaultHome), userHome);
|
|
102
|
-
return { home: join(userHome, '.aalis') };
|
|
103
|
-
}
|
|
104
|
-
/**
|
|
105
|
-
* `~/.aalis-<p>` 就是 profile p 的家目录:经 `--home`、`AALIS_HOME` 或 defaultHome 选中它时同样带上 profile,
|
|
106
|
-
* 插件按 profile 派生的名字(如记忆库名)对同一个家目录才一样。这里按路径的写法认,认不出的写法由
|
|
107
|
-
* {@link profileOfRealHome} 按真实路径补认。
|
|
108
|
-
*/
|
|
109
|
-
function withProfile(home, userHome) {
|
|
110
|
-
const profile = /^\.aalis-(.+)$/.exec(basename(home))?.[1];
|
|
111
|
-
if (profile === undefined || !PROFILE_PATTERN.test(profile))
|
|
112
|
-
return { home };
|
|
113
|
-
return resolve(home) === resolve(userHome, `.aalis-${profile}`) ? { home, profile } : { home };
|
|
114
|
-
}
|
|
115
|
-
/**
|
|
116
|
-
* 按真实路径补认 profile:家目录的真实路径就是 `~/.aalis-<p>` 的真实路径时为 p。补上按写法认不出的情形:
|
|
117
|
-
* 大小写写错、经指向它的符号链接选中、用户主目录本身是符号链接。`~/.aalis-<p>` 自己是指向别处的链接时,
|
|
118
|
-
* 经那个别处的路径选中仍认不出。用户主目录不存在时没有 profile。
|
|
119
|
-
*/
|
|
120
|
-
export function profileOfRealHome(realHome, userHome = homedir()) {
|
|
121
|
-
let realUserHome;
|
|
122
|
-
try {
|
|
123
|
-
realUserHome = realpathSync.native(userHome);
|
|
124
|
-
}
|
|
125
|
-
catch {
|
|
126
|
-
return undefined;
|
|
127
|
-
}
|
|
128
|
-
return withProfile(realHome, realUserHome).profile;
|
|
129
|
-
}
|
|
130
|
-
function nonEmpty(value) {
|
|
131
|
-
return value === '' ? undefined : value;
|
|
132
|
-
}
|
|
133
|
-
/**
|
|
134
|
-
* 命令行与环境变量里的家目录写法转成绝对路径。开头的 `~` 展开成用户主目录:`--home=~/x` 不经 shell 展开,
|
|
135
|
-
* launchd、systemd 与容器的环境变量也不展开,不处理就会在 cwd 下建出一个名叫 `~` 的目录。
|
|
136
|
-
*/
|
|
137
|
-
function toAbsolute(value, userHome, cwd) {
|
|
138
|
-
if (value === '~')
|
|
139
|
-
return userHome;
|
|
140
|
-
if (/^~[\\/]/.test(value))
|
|
141
|
-
return join(userHome, value.slice(2));
|
|
142
|
-
if (value.startsWith('~')) {
|
|
143
|
-
throw new HomeArgsError(`"~user" paths are not supported; write an absolute path: ${value}`);
|
|
144
|
-
}
|
|
145
|
-
if (isFullyAbsolute(value))
|
|
146
|
-
return normalize(value);
|
|
147
|
-
if (cwd === undefined) {
|
|
148
|
-
throw new HomeArgsError(`The current directory no longer exists; write the home directory as an absolute path: ${value}`);
|
|
149
|
-
}
|
|
150
|
-
return resolve(cwd, value);
|
|
151
|
-
}
|
|
152
|
-
/** 由家目录与安装集派生全部路径(家目录布局见计划书「家目录布局」)。 */
|
|
153
|
-
export function derivePaths(home, app, profile) {
|
|
154
|
-
// 冻结:同一个对象交给每个插件,任何一处改了它(例如改 app)都会把别的插件的装卸目录一起带偏
|
|
155
|
-
return Object.freeze({
|
|
156
|
-
home,
|
|
157
|
-
...(profile !== undefined ? { profile } : {}),
|
|
158
|
-
app,
|
|
159
|
-
config: join(home, CONFIG_FILE),
|
|
160
|
-
secrets: join(home, SECRETS_FILE),
|
|
161
|
-
state: join(home, 'state'),
|
|
162
|
-
logs: join(home, 'logs'),
|
|
163
|
-
cache: join(home, 'cache'),
|
|
164
|
-
run: join(home, 'run'),
|
|
165
|
-
tmp: join(home, 'tmp'),
|
|
166
|
-
self: join(home, 'self'),
|
|
167
|
-
workspace: join(home, 'workspace'),
|
|
168
|
-
});
|
|
169
|
-
}
|
|
170
|
-
/** 初始化的判据:主配置文件存在。 */
|
|
171
|
-
export function isHomeInitialized(paths) {
|
|
172
|
-
return existsSync(paths.config);
|
|
173
|
-
}
|
|
174
|
-
/**
|
|
175
|
-
* 建家目录:目录 0700,写默认主配置与空的密钥文件(0600),建布局里的子目录。主配置只有名字、日志级别与空的插件段。
|
|
176
|
-
* 已初始化时拒绝,不覆盖任何文件。目录已存在时只接受空目录,或只有布局自己条目的目录(上次初始化中途失败),
|
|
177
|
-
* 沿用并收紧为 0700:`--home ~ --init` 这类笔误不能把用户主目录改成 0700、再往里铺一层布局。
|
|
178
|
-
*/
|
|
179
|
-
export function initHome(paths) {
|
|
180
|
-
if (isHomeInitialized(paths))
|
|
181
|
-
throw new HomeArgsError(`The home directory is already initialized: ${paths.home}`);
|
|
182
|
-
if (existsSync(paths.home)) {
|
|
183
|
-
const foreign = readdirSync(paths.home).filter(name => !LAYOUT_ENTRIES.has(name));
|
|
184
|
-
if (foreign.length > 0) {
|
|
185
|
-
const shown = foreign.slice(0, 3).join(', ') + (foreign.length > 3 ? ' and more' : '');
|
|
186
|
-
throw new HomeArgsError(`The directory is not empty (it contains ${shown}); cannot initialize a home directory here: ${paths.home}`);
|
|
187
|
-
}
|
|
188
|
-
}
|
|
189
|
-
mkdirSync(paths.home, { recursive: true, mode: 0o700 });
|
|
190
|
-
chmodSync(paths.home, 0o700);
|
|
191
|
-
for (const dir of [paths.state, paths.logs, paths.cache, paths.run, paths.self, paths.workspace]) {
|
|
192
|
-
mkdirSync(dir, { recursive: true });
|
|
193
|
-
}
|
|
194
|
-
mkdirSync(paths.tmp, { recursive: true, mode: 0o700 });
|
|
195
|
-
// 密钥文件先建:主配置是初始化的判据,最后写,中途失败时下次仍能重新初始化
|
|
196
|
-
if (existsSync(paths.secrets))
|
|
197
|
-
chmodSync(paths.secrets, 0o600);
|
|
198
|
-
else
|
|
199
|
-
writeFileSync(paths.secrets, '', { mode: 0o600, flag: 'wx' });
|
|
200
|
-
const { name, logLevel } = defaultsFrom(CORE_CONFIG_SCHEMA);
|
|
201
|
-
writeFileSync(paths.config, stringifyYaml({ name, logLevel, plugins: {} }), {
|
|
202
|
-
mode: 0o600,
|
|
203
|
-
flag: 'wx',
|
|
204
|
-
});
|
|
205
|
-
}
|
|
206
|
-
//# sourceMappingURL=home.js.map
|
package/dist/home.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"home.js","sourceRoot":"","sources":["../src/home.ts"],"names":[],"mappings":"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"}
|
package/dist/terminal.d.ts
DELETED
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
export declare function restoreTerminalState(): void;
|
|
2
|
-
export declare function installTerminalStateRestorer(): void;
|
|
3
|
-
/**
|
|
4
|
-
* 摘掉退出复原钩子。
|
|
5
|
-
*
|
|
6
|
-
* 用于「本进程把终端交给了别人」的场合——目前只有 respawn 的成功分支:父进程等到子进程
|
|
7
|
-
* 回报 ready 才退出,而子进程的 ready 发生在 `await app.start()` **之后**(start 里串行
|
|
8
|
-
* await 完 `app:started`,plugin-cli 正是在那里 `\x1b[?1049h` 进备用屏)。于是父进程的
|
|
9
|
-
* exit 钩子写出的 `\x1b[?1049l` 落在子进程已接管终端之后,把新实例的 TUI 当场踢出备用屏。
|
|
10
|
-
*
|
|
11
|
-
* 摘掉是安全的:父进程停机时 plugin-cli 自己的 `stop()` 已经复原过一次
|
|
12
|
-
* (经 `lifecycle.onDispose`),这个钩子在该路径上本就是第二次复原。
|
|
13
|
-
* 失败分支(子进程夭折)不得摘——那条路没有别人接管终端。
|
|
14
|
-
*/
|
|
15
|
-
export declare function disarmTerminalStateRestorer(): void;
|
|
16
|
-
//# sourceMappingURL=terminal.d.ts.map
|
package/dist/terminal.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"terminal.d.ts","sourceRoot":"","sources":["../src/terminal.ts"],"names":[],"mappings":"AAIA,wBAAgB,oBAAoB,IAAI,IAAI,CAW3C;AAED,wBAAgB,4BAA4B,IAAI,IAAI,CAInD;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,2BAA2B,IAAI,IAAI,CAIlD"}
|
package/dist/terminal.js
DELETED
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
const TERMINAL_RESTORE_SEQUENCE = '\x1b[?1006l\x1b[?1000l\x1b[?1007l\x1b[?25h\x1b[?1049l';
|
|
2
|
-
let installed = false;
|
|
3
|
-
export function restoreTerminalState() {
|
|
4
|
-
try {
|
|
5
|
-
if (process.stdin.isTTY)
|
|
6
|
-
process.stdin.setRawMode(false);
|
|
7
|
-
}
|
|
8
|
-
catch {
|
|
9
|
-
/* ignore */
|
|
10
|
-
}
|
|
11
|
-
try {
|
|
12
|
-
if (process.stdout.isTTY)
|
|
13
|
-
process.stdout.write(TERMINAL_RESTORE_SEQUENCE);
|
|
14
|
-
}
|
|
15
|
-
catch {
|
|
16
|
-
/* ignore */
|
|
17
|
-
}
|
|
18
|
-
}
|
|
19
|
-
export function installTerminalStateRestorer() {
|
|
20
|
-
if (installed)
|
|
21
|
-
return;
|
|
22
|
-
installed = true;
|
|
23
|
-
process.once('exit', restoreTerminalState);
|
|
24
|
-
}
|
|
25
|
-
/**
|
|
26
|
-
* 摘掉退出复原钩子。
|
|
27
|
-
*
|
|
28
|
-
* 用于「本进程把终端交给了别人」的场合——目前只有 respawn 的成功分支:父进程等到子进程
|
|
29
|
-
* 回报 ready 才退出,而子进程的 ready 发生在 `await app.start()` **之后**(start 里串行
|
|
30
|
-
* await 完 `app:started`,plugin-cli 正是在那里 `\x1b[?1049h` 进备用屏)。于是父进程的
|
|
31
|
-
* exit 钩子写出的 `\x1b[?1049l` 落在子进程已接管终端之后,把新实例的 TUI 当场踢出备用屏。
|
|
32
|
-
*
|
|
33
|
-
* 摘掉是安全的:父进程停机时 plugin-cli 自己的 `stop()` 已经复原过一次
|
|
34
|
-
* (经 `lifecycle.onDispose`),这个钩子在该路径上本就是第二次复原。
|
|
35
|
-
* 失败分支(子进程夭折)不得摘——那条路没有别人接管终端。
|
|
36
|
-
*/
|
|
37
|
-
export function disarmTerminalStateRestorer() {
|
|
38
|
-
if (!installed)
|
|
39
|
-
return;
|
|
40
|
-
installed = false;
|
|
41
|
-
process.off('exit', restoreTerminalState);
|
|
42
|
-
}
|
|
43
|
-
//# sourceMappingURL=terminal.js.map
|
package/dist/terminal.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"terminal.js","sourceRoot":"","sources":["../src/terminal.ts"],"names":[],"mappings":"AAAA,MAAM,yBAAyB,GAAG,uDAAuD,CAAC;AAE1F,IAAI,SAAS,GAAG,KAAK,CAAC;AAEtB,MAAM,UAAU,oBAAoB;IAClC,IAAI,CAAC;QACH,IAAI,OAAO,CAAC,KAAK,CAAC,KAAK;YAAE,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;IAC3D,CAAC;IAAC,MAAM,CAAC;QACP,YAAY;IACd,CAAC;IACD,IAAI,CAAC;QACH,IAAI,OAAO,CAAC,MAAM,CAAC,KAAK;YAAE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,yBAAyB,CAAC,CAAC;IAC5E,CAAC;IAAC,MAAM,CAAC;QACP,YAAY;IACd,CAAC;AACH,CAAC;AAED,MAAM,UAAU,4BAA4B;IAC1C,IAAI,SAAS;QAAE,OAAO;IACtB,SAAS,GAAG,IAAI,CAAC;IACjB,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,oBAAoB,CAAC,CAAC;AAC7C,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,2BAA2B;IACzC,IAAI,CAAC,SAAS;QAAE,OAAO;IACvB,SAAS,GAAG,KAAK,CAAC;IAClB,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,oBAAoB,CAAC,CAAC;AAC5C,CAAC"}
|