@aalis/runtime 0.12.5 → 0.14.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 +25 -0
- package/dist/bootstrap-buffer.d.ts +5 -4
- package/dist/bootstrap-buffer.d.ts.map +1 -1
- package/dist/bootstrap-buffer.js +1 -1
- package/dist/bootstrap-buffer.js.map +1 -1
- package/dist/config-store.d.ts +38 -0
- package/dist/config-store.d.ts.map +1 -0
- package/dist/config-store.js +171 -0
- package/dist/config-store.js.map +1 -0
- package/dist/config-sync.d.ts +28 -9
- package/dist/config-sync.d.ts.map +1 -1
- package/dist/config-sync.js +125 -82
- package/dist/config-sync.js.map +1 -1
- package/dist/console-sink.d.ts +8 -3
- package/dist/console-sink.d.ts.map +1 -1
- package/dist/console-sink.js +15 -3
- package/dist/console-sink.js.map +1 -1
- package/dist/file-logger.d.ts.map +1 -1
- package/dist/file-logger.js +2 -1
- package/dist/file-logger.js.map +1 -1
- package/dist/index.d.ts +3 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -1
- package/dist/index.js.map +1 -1
- package/dist/node-modules-loader.d.ts +20 -8
- package/dist/node-modules-loader.d.ts.map +1 -1
- package/dist/node-modules-loader.js +84 -44
- package/dist/node-modules-loader.js.map +1 -1
- package/dist/plugin-discovery.d.ts +42 -0
- package/dist/plugin-discovery.d.ts.map +1 -0
- package/dist/plugin-discovery.js +100 -0
- package/dist/plugin-discovery.js.map +1 -0
- package/dist/providers.d.ts +10 -9
- package/dist/providers.d.ts.map +1 -1
- package/dist/providers.js +77 -44
- package/dist/providers.js.map +1 -1
- package/dist/start.d.ts +14 -2
- package/dist/start.d.ts.map +1 -1
- package/dist/start.js +75 -39
- package/dist/start.js.map +1 -1
- package/dist/subcommand.d.ts +3 -3
- package/dist/subcommand.d.ts.map +1 -1
- package/dist/subcommand.js +3 -3
- package/dist/subcommand.js.map +1 -1
- package/dist/terminal.d.ts +1 -1
- package/dist/terminal.js +1 -1
- package/package.json +8 -8
package/dist/start.js
CHANGED
|
@@ -1,24 +1,19 @@
|
|
|
1
1
|
import { createRequire } from 'node:module';
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
2
|
+
import { pluginSource } from '@aalis/api-plugin-source';
|
|
3
|
+
import { App, events, provide, services } from '@aalis/core';
|
|
4
4
|
import { installBootstrapBuffer } from './bootstrap-buffer.js';
|
|
5
|
-
import {
|
|
5
|
+
import { createConfigStore, installHostConfig } from './config-store.js';
|
|
6
|
+
import { installConfigHotReload, withPluginConfigSync } from './config-sync.js';
|
|
6
7
|
import { installConsoleSink } from './console-sink.js';
|
|
7
8
|
import { appendCrashLog, DEFAULT_LOG_FILE, setupFileLogger } from './file-logger.js';
|
|
8
9
|
import { createNodeModulesPluginLoader } from './node-modules-loader.js';
|
|
10
|
+
import { createPluginDiscovery } from './plugin-discovery.js';
|
|
9
11
|
import { createFsYamlConfigProvider, createProcessRespawnStrategy, READY_MESSAGE } from './providers.js';
|
|
10
12
|
import { tryDispatchSubcommand } from './subcommand.js';
|
|
11
13
|
import { installTerminalStateRestorer } from './terminal.js';
|
|
12
|
-
/**
|
|
13
|
-
* 启动一个 Aalis 实例:YAML 配置 + 插件加载 + 进程级重启 + 日志/终端/子命令宿主件。
|
|
14
|
-
* 返回已启动的 App(便于测试或进一步操作)。
|
|
15
|
-
*
|
|
16
|
-
* 生命周期不变量:① `consoleHandle.bindEvents` 必须在 `new App` 之后(之前无 ctx);
|
|
17
|
-
* ② 子命令短路必须在 `app.start` 之前。
|
|
18
|
-
*/
|
|
19
14
|
/**
|
|
20
15
|
* 读取 @aalis/core 的实际安装版本,供 App 启动 banner 展示。
|
|
21
|
-
* core
|
|
16
|
+
* core 的 `exports` 开放了 `./package.json` 子路径,可 require;解析失败则返回 undefined,
|
|
22
17
|
* banner 自动省略版本段(不因版本读取失败而影响启动)。
|
|
23
18
|
*/
|
|
24
19
|
function readCoreVersion() {
|
|
@@ -29,20 +24,27 @@ function readCoreVersion() {
|
|
|
29
24
|
return undefined;
|
|
30
25
|
}
|
|
31
26
|
}
|
|
27
|
+
/**
|
|
28
|
+
* 启动一个 Aalis 实例:YAML 配置 + 插件加载 + 进程级重启 + 日志/终端/子命令宿主件。
|
|
29
|
+
* 返回已启动的 App(便于测试或进一步操作)。
|
|
30
|
+
*
|
|
31
|
+
* 生命周期不变量:① `consoleHandle.bindEvents` 必须在 `new App` 之后(之前没有事件总线);
|
|
32
|
+
* ② 子命令短路必须在 `app.start` 之前。
|
|
33
|
+
*/
|
|
32
34
|
export async function startAalis(opts = {}) {
|
|
33
35
|
const { consoleSink = true, fileLog = true, terminalRestore = true } = opts;
|
|
34
|
-
|
|
35
|
-
const subcommands = Array.isArray(opts.subcommands) ? opts.subcommands : process.argv.slice(2);
|
|
36
|
+
const subcommands = opts.subcommands ?? process.argv.slice(2);
|
|
36
37
|
// ── 最早期:任何日志之前先装 bootstrap buffer,再装 terminal / console sink ──
|
|
37
38
|
const bootstrap = installBootstrapBuffer();
|
|
38
39
|
if (terminalRestore)
|
|
39
40
|
installTerminalStateRestorer();
|
|
40
41
|
const subcommandMode = subcommands.length > 0;
|
|
41
|
-
// console sink 在 App
|
|
42
|
+
// console sink 在 App 之前装:此时尚无事件总线(根绑定),sink 处于「无条件写」状态以打印早期启动日志,
|
|
42
43
|
// 待 App 起来再 bindEvents 接管 terminal:claimed/released。子命令模式日志走 stderr,stdout 只留命令结果。
|
|
44
|
+
// consoleSink: false 仍装 stderr + minLevel warn:加载器拒载「另一份 @aalis/core」的插件记 error,不能只剩下游「commands 服务不可用」。
|
|
43
45
|
const consoleHandle = consoleSink
|
|
44
46
|
? installConsoleSink(subcommandMode ? { target: 'stderr' } : {})
|
|
45
|
-
:
|
|
47
|
+
: installConsoleSink({ target: 'stderr', minLevel: 'warn' });
|
|
46
48
|
// 子命令进程不写文件日志:setupFileLogger 会截断 latest.log,而守护进程可能正在写它(webui 历史日志
|
|
47
49
|
// 以该文件为单一数据源)。
|
|
48
50
|
const fileLogTarget = fileLog === false || subcommandMode ? undefined : typeof fileLog === 'string' ? fileLog : DEFAULT_LOG_FILE;
|
|
@@ -71,15 +73,18 @@ export async function startAalis(opts = {}) {
|
|
|
71
73
|
fileLogger = await setupFileLogger(fileLogTarget);
|
|
72
74
|
// sink 全部装好;bootstrap buffer 完成使命,解除订阅并释放内存。
|
|
73
75
|
bootstrap.dispose();
|
|
74
|
-
// ── 组装 App
|
|
75
|
-
const { config, provider
|
|
76
|
+
// ── 组装 App:YAML 配置文档、按 loader 发现插件、用 spawn 重启 ──
|
|
77
|
+
const { config, provider } = createFsYamlConfigProvider(opts.configPath);
|
|
78
|
+
const store = createConfigStore(config, provider);
|
|
79
|
+
// core 的慢操作阈值:缺省(含 YAML 空键解出的 null)交给 core 默认;不是非负有限数的写法告警后同样交给默认
|
|
80
|
+
// (启动时读取,改了要重启)
|
|
81
|
+
const slowThresholdMs = store.get('slowThresholdMs') ?? undefined;
|
|
82
|
+
const slowThresholdValid = slowThresholdMs === undefined ||
|
|
83
|
+
(typeof slowThresholdMs === 'number' && Number.isFinite(slowThresholdMs) && slowThresholdMs >= 0);
|
|
76
84
|
const app = new App({
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
pluginLoader: opts.pluginLoader ?? createNodeModulesPluginLoader(opts.projectDir),
|
|
81
|
-
// 默认值从 configSchema 派生(唯一声明来源);core 不认识配置词汇,只调这个函数。
|
|
82
|
-
pluginDefaults: m => defaultsFrom(m.configSchema),
|
|
85
|
+
name: store.get('name'),
|
|
86
|
+
logLevel: store.get('logLevel'),
|
|
87
|
+
slowThresholdMs: slowThresholdValid ? slowThresholdMs : undefined,
|
|
83
88
|
// 子命令进程没有重启能力,不注入策略:`app.restart()` 按 core 语义抛「不可用」,指令层折成失败文案。
|
|
84
89
|
// 注入的话,`restart` 子命令在 app.stop 超过策略 500ms 等待时会 spawn 一个 argv 仍带 restart 的
|
|
85
90
|
// detached 子进程,新进程再命中 restart……无限连环(实测 5 代,Ctrl+C 打不到)。
|
|
@@ -91,21 +96,35 @@ export async function startAalis(opts = {}) {
|
|
|
91
96
|
// 宿主读取 @aalis/core 的实际版本注入启动 banner——core 环境无关、不自读 package.json。
|
|
92
97
|
version: readCoreVersion(),
|
|
93
98
|
});
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
99
|
+
if (!slowThresholdValid) {
|
|
100
|
+
// 数字照原样显示:JSON.stringify 会把 Infinity / NaN 显示成 null
|
|
101
|
+
const received = typeof slowThresholdMs === 'number' ? String(slowThresholdMs) : JSON.stringify(slowThresholdMs);
|
|
102
|
+
app.logger.warn(`配置项 slowThresholdMs 应为不小于 0 的有限数字(毫秒),收到 ${received},按默认值处理`);
|
|
103
|
+
}
|
|
104
|
+
// 配置文档先于任何插件接上:文档里的服务偏好要在全部提供者上线前生效
|
|
105
|
+
installHostConfig(app, store, opts.configSync);
|
|
106
|
+
// 默认值从 configSchema 派生(唯一声明来源),导入定义后、登记前深合并进文档;登记时原样交给 core
|
|
107
|
+
const configLoader = withPluginConfigSync(opts.pluginLoader ?? createNodeModulesPluginLoader(opts.projectDir), app, store, opts.configSync);
|
|
108
|
+
// 宿主的根绑定:事件订阅、服务查询与宿主服务登记都经它,随 App 停止撤回
|
|
109
|
+
const host = app.bind({ events, provide, services });
|
|
110
|
+
const discovery = createPluginDiscovery(app, configLoader.loader, store);
|
|
111
|
+
host.provide(pluginSource, { rescan: () => discovery.rescan() }, { exclusive: true });
|
|
112
|
+
// 不变量①:App 构造完成后再让 sink 监听终端归属事件——此前没有事件总线可订阅。
|
|
113
|
+
consoleHandle.bindEvents(host.events);
|
|
114
|
+
try {
|
|
115
|
+
// 每个定义交给 Core 前已经规范化;首次 apply 与配置快照用同一份字段。
|
|
116
|
+
await discovery.loadAll();
|
|
117
|
+
}
|
|
118
|
+
finally {
|
|
119
|
+
// 即使后续加载失败,也保存本批已完成的规范化;不启动第二轮 bounce。
|
|
120
|
+
configLoader.finishInitialLoad();
|
|
121
|
+
}
|
|
103
122
|
// ── 不变量②:子命令短路在 app.start 之前 ──
|
|
104
123
|
// `aalis <name> [args...]` 等价于聊天里 `/<name> args...`:命中则执行返回串,未命中则报错,
|
|
105
124
|
// 两种情况都干净退出、**绝不进守护进程**——打错的命令名若照常起守护,就是与运行中实例并存的
|
|
106
125
|
// 第二个实例(同时连 onebot、每条消息回两遍)。与具体命令解耦——各插件自行注册命令。
|
|
107
126
|
if (subcommandMode) {
|
|
108
|
-
const exitCode = await tryDispatchSubcommand(
|
|
127
|
+
const exitCode = await tryDispatchSubcommand(host.services, subcommands);
|
|
109
128
|
await app.stop();
|
|
110
129
|
await new Promise(r => setImmediate(r));
|
|
111
130
|
process.exit(exitCode);
|
|
@@ -116,13 +135,30 @@ export async function startAalis(opts = {}) {
|
|
|
116
135
|
// 典型链条:A 缺 apiKey 激活失败(有 ERROR)→ 依赖 A 所提供服务的 B 静默挂起,
|
|
117
136
|
// 用户只看到 A 的报错,会以为「只是 A 不可用」,不知道 B 也一并废了
|
|
118
137
|
// (实例:embedding-openai 缺 key → memory-vector 永远不激活,向量记忆整个不工作)。
|
|
119
|
-
|
|
138
|
+
// 没有提供者的服务若由仍在激活中(含已转入后台)的插件声明提供,报「等待 <实例> 激活完成」而非缺少:
|
|
139
|
+
// 它的服务在激活完成前不对外。判据同 plugin-doctor 的 plugins.pending。
|
|
140
|
+
const status = app.plugins.getStatus();
|
|
141
|
+
const activating = status.filter(s => s.state === 'activating');
|
|
142
|
+
for (const p of status) {
|
|
120
143
|
if (p.state !== 'pending')
|
|
121
144
|
continue;
|
|
122
|
-
const
|
|
123
|
-
|
|
124
|
-
|
|
145
|
+
const missing = [];
|
|
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);
|
|
125
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(';')})`);
|
|
126
162
|
}
|
|
127
163
|
// 向重启我们的父进程回报「起来了」。父进程据此决定放手退出,还是判定本次
|
|
128
164
|
// 更新失败并回滚(见 providers.ts 的 createProcessRespawnStrategy)。
|
|
@@ -139,8 +175,8 @@ export async function startAalis(opts = {}) {
|
|
|
139
175
|
process.send?.({ type: READY_MESSAGE }, undefined, undefined, () => { });
|
|
140
176
|
// 握手完成后解除 IPC 对事件循环的持有——否则父进程退出前本进程无法自然结束。
|
|
141
177
|
process.channel?.unref();
|
|
142
|
-
// 配置外部变更热重载(provider 不支持 watch 时为 no-op
|
|
143
|
-
installConfigHotReload(app, opts.configSync);
|
|
178
|
+
// 配置外部变更热重载(provider 不支持 watch 时为 no-op);文件里新增的后缀实例经发现驱动登记。
|
|
179
|
+
installConfigHotReload(app, store, discovery, opts.configSync);
|
|
144
180
|
let stopping = false;
|
|
145
181
|
const shutdown = async () => {
|
|
146
182
|
if (stopping)
|
package/dist/start.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"start.js","sourceRoot":"","sources":["../src/start.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"start.js","sourceRoot":"","sources":["../src/start.ts"],"names":[],"mappings":"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"}
|
package/dist/subcommand.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { Services } from '@aalis/core';
|
|
2
2
|
/**
|
|
3
3
|
* 把 argv 当作命令调用:`aalis <name> [args...]` ↔ chat 中的 `/<name> args`。
|
|
4
4
|
*
|
|
@@ -8,7 +8,7 @@ import type { App } from '@aalis/core';
|
|
|
8
8
|
*
|
|
9
9
|
* 不直接绑定任何具体命令;所有命令由插件向 commands 服务注册。
|
|
10
10
|
*
|
|
11
|
-
*
|
|
11
|
+
* 抽离到独立模块以便单测。
|
|
12
12
|
*/
|
|
13
|
-
export declare function tryDispatchSubcommand(
|
|
13
|
+
export declare function tryDispatchSubcommand(services: Services, argv: string[], out?: (msg: string) => void, err?: (msg: string) => void): Promise<number>;
|
|
14
14
|
//# sourceMappingURL=subcommand.d.ts.map
|
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,
|
|
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,CAuBjB"}
|
package/dist/subcommand.js
CHANGED
|
@@ -7,11 +7,11 @@
|
|
|
7
7
|
*
|
|
8
8
|
* 不直接绑定任何具体命令;所有命令由插件向 commands 服务注册。
|
|
9
9
|
*
|
|
10
|
-
*
|
|
10
|
+
* 抽离到独立模块以便单测。
|
|
11
11
|
*/
|
|
12
|
-
export async function tryDispatchSubcommand(
|
|
12
|
+
export async function tryDispatchSubcommand(services, argv, out = msg => console.log(msg), err = msg => console.error(msg)) {
|
|
13
13
|
const [cmdName = '', ...rest] = argv;
|
|
14
|
-
const commands =
|
|
14
|
+
const commands = services.get('commands');
|
|
15
15
|
if (!commands) {
|
|
16
16
|
err(`无法执行子命令「${cmdName}」:commands 服务不可用(未安装 @aalis/plugin-commands?)`);
|
|
17
17
|
return 2;
|
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,
|
|
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,CAAC,WAAW,OAAO,+CAA+C,CAAC,CAAC;QACvE,OAAO,CAAC,CAAC;IACX,CAAC;IACD,IAAI,CAAC,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;QACvC,GAAG,CAAC,SAAS,OAAO,iBAAiB,OAAO,gBAAgB,CAAC,CAAC;QAC9D,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"}
|
package/dist/terminal.d.ts
CHANGED
|
@@ -9,7 +9,7 @@ export declare function installTerminalStateRestorer(): void;
|
|
|
9
9
|
* exit 钩子写出的 `\x1b[?1049l` 落在子进程已接管终端之后,把新实例的 TUI 当场踢出备用屏。
|
|
10
10
|
*
|
|
11
11
|
* 摘掉是安全的:父进程停机时 plugin-cli 自己的 `stop()` 已经复原过一次
|
|
12
|
-
* (经 `
|
|
12
|
+
* (经 `lifecycle.onDispose`),这个钩子在该路径上本就是第二次复原。
|
|
13
13
|
* 失败分支(子进程夭折)不得摘——那条路没有别人接管终端。
|
|
14
14
|
*/
|
|
15
15
|
export declare function disarmTerminalStateRestorer(): void;
|
package/dist/terminal.js
CHANGED
|
@@ -31,7 +31,7 @@ export function installTerminalStateRestorer() {
|
|
|
31
31
|
* exit 钩子写出的 `\x1b[?1049l` 落在子进程已接管终端之后,把新实例的 TUI 当场踢出备用屏。
|
|
32
32
|
*
|
|
33
33
|
* 摘掉是安全的:父进程停机时 plugin-cli 自己的 `stop()` 已经复原过一次
|
|
34
|
-
* (经 `
|
|
34
|
+
* (经 `lifecycle.onDispose`),这个钩子在该路径上本就是第二次复原。
|
|
35
35
|
* 失败分支(子进程夭折)不得摘——那条路没有别人接管终端。
|
|
36
36
|
*/
|
|
37
37
|
export function disarmTerminalStateRestorer() {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aalis/runtime",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.14.0",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -26,19 +26,19 @@
|
|
|
26
26
|
"dependencies": {
|
|
27
27
|
"chalk": "^5.4.0",
|
|
28
28
|
"yaml": "^2.7.0",
|
|
29
|
-
"@aalis/schema-config": ">=0.
|
|
29
|
+
"@aalis/schema-config": ">=0.13.0 <1.0.0",
|
|
30
|
+
"@aalis/schema-log": ">=0.2.0 <1.0.0",
|
|
31
|
+
"@aalis/api-plugin-source": ">=0.1.0 <1.0.0",
|
|
32
|
+
"@aalis/api-host-config": ">=0.1.0 <1.0.0"
|
|
30
33
|
},
|
|
31
34
|
"peerDependencies": {
|
|
32
|
-
"@aalis/core": ">=0.
|
|
35
|
+
"@aalis/core": ">=0.18.0 <1.0.0"
|
|
33
36
|
},
|
|
34
37
|
"devDependencies": {
|
|
35
38
|
"typescript": "^5.7.0",
|
|
36
39
|
"@types/node": "^22.0.0",
|
|
37
|
-
"@aalis/api-commands": "0.
|
|
38
|
-
"@aalis/core": "0.
|
|
39
|
-
},
|
|
40
|
-
"aalis": {
|
|
41
|
-
"tooling": true
|
|
40
|
+
"@aalis/api-commands": "0.7.0",
|
|
41
|
+
"@aalis/core": "0.18.0"
|
|
42
42
|
},
|
|
43
43
|
"scripts": {
|
|
44
44
|
"build": "tsc",
|