@aalis/core 0.1.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 +21 -0
- package/dist/app.d.ts +166 -0
- package/dist/app.d.ts.map +1 -0
- package/dist/app.js +348 -0
- package/dist/app.js.map +1 -0
- package/dist/config.d.ts +174 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +377 -0
- package/dist/config.js.map +1 -0
- package/dist/constants.d.ts +31 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +36 -0
- package/dist/constants.js.map +1 -0
- package/dist/context.d.ts +328 -0
- package/dist/context.d.ts.map +1 -0
- package/dist/context.js +521 -0
- package/dist/context.js.map +1 -0
- package/dist/disposable-chain.d.ts +31 -0
- package/dist/disposable-chain.d.ts.map +1 -0
- package/dist/disposable-chain.js +66 -0
- package/dist/disposable-chain.js.map +1 -0
- package/dist/events.d.ts +64 -0
- package/dist/events.d.ts.map +1 -0
- package/dist/events.js +145 -0
- package/dist/events.js.map +1 -0
- package/dist/hooks.d.ts +49 -0
- package/dist/hooks.d.ts.map +1 -0
- package/dist/hooks.js +102 -0
- package/dist/hooks.js.map +1 -0
- package/dist/i18n.d.ts +6 -0
- package/dist/i18n.d.ts.map +1 -0
- package/dist/i18n.js +26 -0
- package/dist/i18n.js.map +1 -0
- package/dist/identity.d.ts +26 -0
- package/dist/identity.d.ts.map +1 -0
- package/dist/identity.js +36 -0
- package/dist/identity.js.map +1 -0
- package/dist/index.d.ts +17 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +29 -0
- package/dist/index.js.map +1 -0
- package/dist/init.d.ts +20 -0
- package/dist/init.d.ts.map +1 -0
- package/dist/init.js +455 -0
- package/dist/init.js.map +1 -0
- package/dist/llm-router.d.ts.map +1 -0
- package/dist/llm-router.js +123 -0
- package/dist/llm-router.js.map +1 -0
- package/dist/logger.d.ts +76 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +187 -0
- package/dist/logger.js.map +1 -0
- package/dist/marketplace-bootstrap.d.ts +54 -0
- package/dist/marketplace-bootstrap.d.ts.map +1 -0
- package/dist/marketplace-bootstrap.js +132 -0
- package/dist/marketplace-bootstrap.js.map +1 -0
- package/dist/mixin-registry.d.ts +34 -0
- package/dist/mixin-registry.d.ts.map +1 -0
- package/dist/mixin-registry.js +60 -0
- package/dist/mixin-registry.js.map +1 -0
- package/dist/model-ref.d.ts +22 -0
- package/dist/model-ref.d.ts.map +1 -0
- package/dist/model-ref.js +46 -0
- package/dist/model-ref.js.map +1 -0
- package/dist/pending-buffer.d.ts +46 -0
- package/dist/pending-buffer.d.ts.map +1 -0
- package/dist/pending-buffer.js +131 -0
- package/dist/pending-buffer.js.map +1 -0
- package/dist/platform-registry.d.ts +40 -0
- package/dist/platform-registry.d.ts.map +1 -0
- package/dist/platform-registry.js +64 -0
- package/dist/platform-registry.js.map +1 -0
- package/dist/plugin-activation.d.ts +43 -0
- package/dist/plugin-activation.d.ts.map +1 -0
- package/dist/plugin-activation.js +172 -0
- package/dist/plugin-activation.js.map +1 -0
- package/dist/plugin-topology.d.ts +40 -0
- package/dist/plugin-topology.d.ts.map +1 -0
- package/dist/plugin-topology.js +126 -0
- package/dist/plugin-topology.js.map +1 -0
- package/dist/plugin.d.ts +184 -0
- package/dist/plugin.d.ts.map +1 -0
- package/dist/plugin.js +549 -0
- package/dist/plugin.js.map +1 -0
- package/dist/providers.d.ts +85 -0
- package/dist/providers.d.ts.map +1 -0
- package/dist/providers.js +2 -0
- package/dist/providers.js.map +1 -0
- package/dist/semver-mini.d.ts +20 -0
- package/dist/semver-mini.d.ts.map +1 -0
- package/dist/semver-mini.js +94 -0
- package/dist/semver-mini.js.map +1 -0
- package/dist/service-helpers.d.ts +34 -0
- package/dist/service-helpers.d.ts.map +1 -0
- package/dist/service-helpers.js +68 -0
- package/dist/service-helpers.js.map +1 -0
- package/dist/service.d.ts +145 -0
- package/dist/service.d.ts.map +1 -0
- package/dist/service.js +279 -0
- package/dist/service.js.map +1 -0
- package/dist/types/agent.d.ts +51 -0
- package/dist/types/agent.d.ts.map +1 -0
- package/dist/types/agent.js +3 -0
- package/dist/types/agent.js.map +1 -0
- package/dist/types/app.d.ts +74 -0
- package/dist/types/app.d.ts.map +1 -0
- package/dist/types/app.js +3 -0
- package/dist/types/app.js.map +1 -0
- package/dist/types/archive.d.ts +59 -0
- package/dist/types/archive.d.ts.map +1 -0
- package/dist/types/archive.js +16 -0
- package/dist/types/archive.js.map +1 -0
- package/dist/types/authority.d.ts +63 -0
- package/dist/types/authority.d.ts.map +1 -0
- package/dist/types/authority.js +3 -0
- package/dist/types/authority.js.map +1 -0
- package/dist/types/capabilities.d.ts +53 -0
- package/dist/types/capabilities.d.ts.map +1 -0
- package/dist/types/capabilities.js +87 -0
- package/dist/types/capabilities.js.map +1 -0
- package/dist/types/cli.d.ts +14 -0
- package/dist/types/cli.d.ts.map +1 -0
- package/dist/types/cli.js +3 -0
- package/dist/types/cli.js.map +1 -0
- package/dist/types/commands.d.ts +98 -0
- package/dist/types/commands.d.ts.map +1 -0
- package/dist/types/commands.js +3 -0
- package/dist/types/commands.js.map +1 -0
- package/dist/types/core.d.ts +117 -0
- package/dist/types/core.d.ts.map +1 -0
- package/dist/types/core.js +6 -0
- package/dist/types/core.js.map +1 -0
- package/dist/types/disposable-service.d.ts +31 -0
- package/dist/types/disposable-service.d.ts.map +1 -0
- package/dist/types/disposable-service.js +3 -0
- package/dist/types/disposable-service.js.map +1 -0
- package/dist/types/embedding.d.ts +7 -0
- package/dist/types/embedding.d.ts.map +1 -0
- package/dist/types/embedding.js +3 -0
- package/dist/types/embedding.js.map +1 -0
- package/dist/types/flow-control.d.ts +51 -0
- package/dist/types/flow-control.d.ts.map +1 -0
- package/dist/types/flow-control.js +12 -0
- package/dist/types/flow-control.js.map +1 -0
- package/dist/types/gateway.d.ts +24 -0
- package/dist/types/gateway.d.ts.map +1 -0
- package/dist/types/gateway.js +15 -0
- package/dist/types/gateway.js.map +1 -0
- package/dist/types/hooks.d.ts +3 -0
- package/dist/types/hooks.d.ts.map +1 -0
- package/dist/types/hooks.js +18 -0
- package/dist/types/hooks.js.map +1 -0
- package/dist/types/image-recognition.d.ts +123 -0
- package/dist/types/image-recognition.d.ts.map +1 -0
- package/dist/types/image-recognition.js +31 -0
- package/dist/types/image-recognition.js.map +1 -0
- package/dist/types/index.d.ts +8 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +17 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/llm.d.ts +146 -0
- package/dist/types/llm.d.ts.map +1 -0
- package/dist/types/llm.js +27 -0
- package/dist/types/llm.js.map +1 -0
- package/dist/types/memory.d.ts +62 -0
- package/dist/types/memory.d.ts.map +1 -0
- package/dist/types/memory.js +22 -0
- package/dist/types/memory.js.map +1 -0
- package/dist/types/persona.d.ts +45 -0
- package/dist/types/persona.d.ts.map +1 -0
- package/dist/types/persona.js +3 -0
- package/dist/types/persona.js.map +1 -0
- package/dist/types/platform.d.ts +126 -0
- package/dist/types/platform.d.ts.map +1 -0
- package/dist/types/platform.js +5 -0
- package/dist/types/platform.js.map +1 -0
- package/dist/types/plugin.d.ts +84 -0
- package/dist/types/plugin.d.ts.map +1 -0
- package/dist/types/plugin.js +24 -0
- package/dist/types/plugin.js.map +1 -0
- package/dist/types/service.d.ts +43 -0
- package/dist/types/service.d.ts.map +1 -0
- package/dist/types/service.js +38 -0
- package/dist/types/service.js.map +1 -0
- package/dist/types/services.d.ts +17 -0
- package/dist/types/services.d.ts.map +1 -0
- package/dist/types/services.js +41 -0
- package/dist/types/services.js.map +1 -0
- package/dist/types/session.d.ts +153 -0
- package/dist/types/session.d.ts.map +1 -0
- package/dist/types/session.js +19 -0
- package/dist/types/session.js.map +1 -0
- package/dist/types/storage.d.ts +100 -0
- package/dist/types/storage.d.ts.map +1 -0
- package/dist/types/storage.js +29 -0
- package/dist/types/storage.js.map +1 -0
- package/dist/types/tools.d.ts +39 -0
- package/dist/types/tools.d.ts.map +1 -0
- package/dist/types/tools.js +3 -0
- package/dist/types/tools.js.map +1 -0
- package/dist/types/trigger-policy.d.ts +16 -0
- package/dist/types/trigger-policy.d.ts.map +1 -0
- package/dist/types/trigger-policy.js +6 -0
- package/dist/types/trigger-policy.js.map +1 -0
- package/dist/types/vectorstore.d.ts +23 -0
- package/dist/types/vectorstore.d.ts.map +1 -0
- package/dist/types/vectorstore.js +3 -0
- package/dist/types/vectorstore.js.map +1 -0
- package/dist/types/web-search.d.ts +88 -0
- package/dist/types/web-search.d.ts.map +1 -0
- package/dist/types/web-search.js +23 -0
- package/dist/types/web-search.js.map +1 -0
- package/dist/types/webui.d.ts +137 -0
- package/dist/types/webui.d.ts.map +1 -0
- package/dist/types/webui.js +3 -0
- package/dist/types/webui.js.map +1 -0
- package/package.json +22 -0
package/dist/config.d.ts
ADDED
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
import type { ConfigProvider } from './providers.js';
|
|
2
|
+
import type { ConfigSchema } from './types/index.js';
|
|
3
|
+
/**
|
|
4
|
+
* Aalis 应用配置(基础设施字段)
|
|
5
|
+
*
|
|
6
|
+
* 仅声明 core 自身管理的字段。业务字段(owners / agent / dangerousPolicy 等)
|
|
7
|
+
* 由对应 plugin 通过 declaration merging 注入:
|
|
8
|
+
*
|
|
9
|
+
* ```ts
|
|
10
|
+
* declare module '@aalis/core' {
|
|
11
|
+
* interface AalisConfig {
|
|
12
|
+
* owners?: Array<{ platform: string; userId: string }>;
|
|
13
|
+
* defaultAuthority?: number;
|
|
14
|
+
* }
|
|
15
|
+
* }
|
|
16
|
+
* ```
|
|
17
|
+
*
|
|
18
|
+
* `[key: string]: unknown` 兜底允许第三方插件即便不做 declaration merging
|
|
19
|
+
* 也能通过 `ctx.config.get('myField')` 读到 unknown,避免 core 知晓任何业务字段。
|
|
20
|
+
*/
|
|
21
|
+
export interface AalisConfig {
|
|
22
|
+
name: string;
|
|
23
|
+
logLevel: string;
|
|
24
|
+
plugins: Record<string, Record<string, unknown>>;
|
|
25
|
+
/** 被禁用的插件名列表 */
|
|
26
|
+
disabledPlugins?: string[];
|
|
27
|
+
/**
|
|
28
|
+
* 服务偏好:serviceName → preferred contextId。
|
|
29
|
+
* 详见 ServiceContainer.prefer / Context.preferService。语义:偏好 > 优先级 > 注册顺序。
|
|
30
|
+
*/
|
|
31
|
+
servicePreferences?: Record<string, string>;
|
|
32
|
+
[key: string]: unknown;
|
|
33
|
+
}
|
|
34
|
+
/** 核心配置的 Schema,与插件 configSchema 走同一套渲染路径 */
|
|
35
|
+
export declare const CORE_CONFIG_SCHEMA: ConfigSchema;
|
|
36
|
+
export interface ConfigManagerOptions {
|
|
37
|
+
/** 持久化与外部变更监听由 provider 提供;省略则进入纯内存模式(save() 静默) */
|
|
38
|
+
provider?: ConfigProvider;
|
|
39
|
+
/**
|
|
40
|
+
* 业务数据目录(plugin 用于解析相对路径,如 sqlite db、persona 文件等)。
|
|
41
|
+
* core 自己不读写它;语义由宿主与插件约定。默认 `'.'`。
|
|
42
|
+
*/
|
|
43
|
+
dataDir?: string;
|
|
44
|
+
/**
|
|
45
|
+
* `syncPluginDefaults` 是否按 configSchema 裁剪未知字段(默认 `true`)。
|
|
46
|
+
* 设为 `false` 时保留 schema 外的字段——适合宿主允许手写实验性配置、
|
|
47
|
+
* 或 schema 滞后于实现的场景。这是政策而非机制,故开放给宿主注入。
|
|
48
|
+
*/
|
|
49
|
+
trimUnknownFields?: boolean;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* 配置管理器:纯内存的配置中枢。
|
|
53
|
+
*
|
|
54
|
+
* 职责:
|
|
55
|
+
* - 持有当前配置快照(`AalisConfig`)
|
|
56
|
+
* - 提供 get/set/getPluginConfig 等访问器
|
|
57
|
+
* - 处理插件默认配置合并、schema 裁剪、服务偏好
|
|
58
|
+
*
|
|
59
|
+
* **不**做的事:
|
|
60
|
+
* - 不读写文件,不解析 yaml/json,不 watch 文件系统
|
|
61
|
+
* ——这些由 `ConfigProvider`(宿主注入)负责
|
|
62
|
+
*
|
|
63
|
+
* 这样 core 可以在浏览器、嵌入式宿主、单元测试里直接使用:
|
|
64
|
+
* 测试代码可以 `new App({ config: { name: 'X', logLevel: 'error', plugins: {} } })`
|
|
65
|
+
* 而无需创建临时目录写 yaml 文件。
|
|
66
|
+
*/
|
|
67
|
+
export declare class ConfigManager {
|
|
68
|
+
private config;
|
|
69
|
+
private readonly provider?;
|
|
70
|
+
private readonly dataDir;
|
|
71
|
+
/** syncPluginDefaults 的字段裁剪政策(公开只读:scope 继承、宿主可内省) */
|
|
72
|
+
readonly trimUnknownFields: boolean;
|
|
73
|
+
private unwatchFn;
|
|
74
|
+
private onChangeCallback;
|
|
75
|
+
constructor(initial: AalisConfig, options?: ConfigManagerOptions);
|
|
76
|
+
get<K extends keyof AalisConfig>(key: K): AalisConfig[K];
|
|
77
|
+
getPluginConfig<T extends Record<string, unknown> = Record<string, unknown>>(pluginName: string): T;
|
|
78
|
+
/**
|
|
79
|
+
* 业务数据目录——plugin 用于解析相对路径。
|
|
80
|
+
* 命名沿用历史接口(`getConfigDir`),语义上是"宿主指定的数据根目录"。
|
|
81
|
+
*/
|
|
82
|
+
getConfigDir(): string;
|
|
83
|
+
getAll(): Readonly<AalisConfig>;
|
|
84
|
+
set<K extends keyof AalisConfig>(key: K, value: AalisConfig[K]): void;
|
|
85
|
+
setPluginConfig(pluginName: string, config: Record<string, unknown>): void;
|
|
86
|
+
removePluginConfig(pluginName: string): void;
|
|
87
|
+
/**
|
|
88
|
+
* 将插件 defaultConfig 中缺失的字段合并到配置;同时按 configSchema
|
|
89
|
+
* 移除多余字段。返回发生变更的插件 instanceId 列表(调用方可决定要不要 log)。
|
|
90
|
+
*
|
|
91
|
+
* 副作用:内部对每个发生变化的条目调用 setPluginConfig;若有变化最终调用 save()。
|
|
92
|
+
*/
|
|
93
|
+
syncPluginDefaults(plugins: ReadonlyArray<{
|
|
94
|
+
instanceId: string;
|
|
95
|
+
defaultConfig?: Record<string, unknown>;
|
|
96
|
+
configSchema?: Record<string, unknown>;
|
|
97
|
+
}>): string[];
|
|
98
|
+
isPluginDisabled(pluginName: string): boolean;
|
|
99
|
+
setPluginEnabled(pluginName: string, enabled: boolean): void;
|
|
100
|
+
getServicePreferences(): Record<string, string>;
|
|
101
|
+
setServicePreference(name: string, contextId: string): void;
|
|
102
|
+
removeServicePreference(name: string): void;
|
|
103
|
+
/**
|
|
104
|
+
* 持久化当前配置。委托给 provider,无 provider 时静默忽略(内存模式)。
|
|
105
|
+
* 同步语义:若 provider 异步保存,调用方不会等待完成——这与原 fs sync 行为一致。
|
|
106
|
+
*/
|
|
107
|
+
save(): void;
|
|
108
|
+
/**
|
|
109
|
+
* 重新加载配置——把外部传入的快照写回内部状态。
|
|
110
|
+
*
|
|
111
|
+
* 历史上这是"从磁盘 re-read"的入口;现在交由 provider 决定何时
|
|
112
|
+
* 通过 `watch(onChange)` 把新快照推过来;本方法仅供 watch 回调使用。
|
|
113
|
+
*
|
|
114
|
+
* 注意:本方法(与 watch 回调)**不应用 trimUnknownFields 政策**——
|
|
115
|
+
* ConfigManager 不持有插件 schema,裁剪统一发生在 syncPluginDefaults
|
|
116
|
+
* (App.handleConfigFileChanged 热重载时会重新调用它对齐政策)。
|
|
117
|
+
*/
|
|
118
|
+
reloadFrom(next: AalisConfig): AalisConfig;
|
|
119
|
+
/**
|
|
120
|
+
* 订阅配置外部变更。委托给 provider;无 provider 时为 no-op。
|
|
121
|
+
*/
|
|
122
|
+
watch(onChange: () => void): void;
|
|
123
|
+
unwatch(): void;
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* 隔离作用域配置管理器(cleanup-7 新增)
|
|
127
|
+
*
|
|
128
|
+
* 与 {@link ScopedServiceContainer} 对称:fallback-read + override-write。
|
|
129
|
+
* - `get(key)` 优先返回 overlay 内的值,否则回退到父配置
|
|
130
|
+
* - `set(key, value)` 仅写入 overlay,不影响父配置
|
|
131
|
+
* - `getPluginConfig(name)` 返回 `{ ...parent, ...overlay }`(浅合并)
|
|
132
|
+
* - `setPluginConfig(name, conf)` 完整替换 overlay 中该插件条目
|
|
133
|
+
* - 不接触任何 provider:`save()` 为 no-op(与基类"无 provider 内存模式"
|
|
134
|
+
* 同语义——通用插件代码可以照常调 save() 而不被炸),`watch()` 为 no-op
|
|
135
|
+
*
|
|
136
|
+
* ⚠️ 实现约定:本类继承 ConfigManager 仅为名义类型兼容(Context.config 等
|
|
137
|
+
* 处声明为 ConfigManager),**基类内部状态从不读写**——所有公开方法都被
|
|
138
|
+
* 显式覆写为「overlay 优先,回退 parentConfig」的委托。给基类新增公开方法
|
|
139
|
+
* 时必须同步在此覆写,否则继承下来的实现会读写无效的基类快照(写穿透 /
|
|
140
|
+
* 读过期)。test/core/config.test.ts 有反射式防漂移用例兜底。
|
|
141
|
+
*/
|
|
142
|
+
export declare class ScopedConfigManager extends ConfigManager {
|
|
143
|
+
private overlay;
|
|
144
|
+
private parentConfig;
|
|
145
|
+
constructor(parent: ConfigManager);
|
|
146
|
+
get<K extends keyof AalisConfig>(key: K): AalisConfig[K];
|
|
147
|
+
getPluginConfig<T extends Record<string, unknown> = Record<string, unknown>>(pluginName: string): T;
|
|
148
|
+
isPluginDisabled(pluginName: string): boolean;
|
|
149
|
+
getServicePreferences(): Record<string, string>;
|
|
150
|
+
getAll(): Readonly<AalisConfig>;
|
|
151
|
+
getConfigDir(): string;
|
|
152
|
+
set<K extends keyof AalisConfig>(key: K, value: AalisConfig[K]): void;
|
|
153
|
+
setPluginConfig(pluginName: string, config: Record<string, unknown>): void;
|
|
154
|
+
removePluginConfig(pluginName: string): void;
|
|
155
|
+
setPluginEnabled(pluginName: string, enabled: boolean): void;
|
|
156
|
+
setServicePreference(name: string, contextId: string): void;
|
|
157
|
+
removeServicePreference(name: string): void;
|
|
158
|
+
syncPluginDefaults(plugins: ReadonlyArray<{
|
|
159
|
+
instanceId: string;
|
|
160
|
+
defaultConfig?: Record<string, unknown>;
|
|
161
|
+
configSchema?: Record<string, unknown>;
|
|
162
|
+
}>): string[];
|
|
163
|
+
/**
|
|
164
|
+
* no-op——与基类"无 provider 内存模式 save() 静默忽略"同语义。
|
|
165
|
+
* 通用插件代码(如 ensureServiceProvider 的 config.save())在 scope 内
|
|
166
|
+
* 运行时不应被炸;隔离性由"写只进 overlay"保证,而不是靠 save 抛错。
|
|
167
|
+
*/
|
|
168
|
+
save(): void;
|
|
169
|
+
/** scope 没有外部来源,快照重载没有意义;显式拒绝以暴露误用。 */
|
|
170
|
+
reloadFrom(): AalisConfig;
|
|
171
|
+
watch(): void;
|
|
172
|
+
unwatch(): void;
|
|
173
|
+
}
|
|
174
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
package/dist/config.js
ADDED
|
@@ -0,0 +1,377 @@
|
|
|
1
|
+
const DEFAULT_CONFIG = {
|
|
2
|
+
name: 'Aalis',
|
|
3
|
+
logLevel: 'info',
|
|
4
|
+
plugins: {},
|
|
5
|
+
disabledPlugins: [],
|
|
6
|
+
};
|
|
7
|
+
/** 核心配置的 Schema,与插件 configSchema 走同一套渲染路径 */
|
|
8
|
+
export const CORE_CONFIG_SCHEMA = {
|
|
9
|
+
name: { type: 'string', label: '应用名称', description: '应用显示名称,用于日志和界面展示', default: 'Aalis' },
|
|
10
|
+
logLevel: {
|
|
11
|
+
type: 'select',
|
|
12
|
+
label: '日志等级',
|
|
13
|
+
description: '日志输出等级',
|
|
14
|
+
default: 'info',
|
|
15
|
+
options: [
|
|
16
|
+
{ label: 'debug', value: 'debug' },
|
|
17
|
+
{ label: 'info', value: 'info' },
|
|
18
|
+
{ label: 'warn', value: 'warn' },
|
|
19
|
+
{ label: 'error', value: 'error' },
|
|
20
|
+
],
|
|
21
|
+
},
|
|
22
|
+
};
|
|
23
|
+
/**
|
|
24
|
+
* 配置管理器:纯内存的配置中枢。
|
|
25
|
+
*
|
|
26
|
+
* 职责:
|
|
27
|
+
* - 持有当前配置快照(`AalisConfig`)
|
|
28
|
+
* - 提供 get/set/getPluginConfig 等访问器
|
|
29
|
+
* - 处理插件默认配置合并、schema 裁剪、服务偏好
|
|
30
|
+
*
|
|
31
|
+
* **不**做的事:
|
|
32
|
+
* - 不读写文件,不解析 yaml/json,不 watch 文件系统
|
|
33
|
+
* ——这些由 `ConfigProvider`(宿主注入)负责
|
|
34
|
+
*
|
|
35
|
+
* 这样 core 可以在浏览器、嵌入式宿主、单元测试里直接使用:
|
|
36
|
+
* 测试代码可以 `new App({ config: { name: 'X', logLevel: 'error', plugins: {} } })`
|
|
37
|
+
* 而无需创建临时目录写 yaml 文件。
|
|
38
|
+
*/
|
|
39
|
+
export class ConfigManager {
|
|
40
|
+
config;
|
|
41
|
+
provider;
|
|
42
|
+
dataDir;
|
|
43
|
+
/** syncPluginDefaults 的字段裁剪政策(公开只读:scope 继承、宿主可内省) */
|
|
44
|
+
trimUnknownFields;
|
|
45
|
+
unwatchFn = null;
|
|
46
|
+
onChangeCallback = null;
|
|
47
|
+
constructor(initial, options) {
|
|
48
|
+
this.config = mergeDefaultsConfig(initial);
|
|
49
|
+
this.provider = options?.provider;
|
|
50
|
+
this.dataDir = options?.dataDir ?? '.';
|
|
51
|
+
this.trimUnknownFields = options?.trimUnknownFields ?? true;
|
|
52
|
+
}
|
|
53
|
+
get(key) {
|
|
54
|
+
return this.config[key];
|
|
55
|
+
}
|
|
56
|
+
getPluginConfig(pluginName) {
|
|
57
|
+
return (this.config.plugins[pluginName] ?? {});
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* 业务数据目录——plugin 用于解析相对路径。
|
|
61
|
+
* 命名沿用历史接口(`getConfigDir`),语义上是"宿主指定的数据根目录"。
|
|
62
|
+
*/
|
|
63
|
+
getConfigDir() {
|
|
64
|
+
return this.dataDir;
|
|
65
|
+
}
|
|
66
|
+
getAll() {
|
|
67
|
+
return this.config;
|
|
68
|
+
}
|
|
69
|
+
set(key, value) {
|
|
70
|
+
this.config[key] = value;
|
|
71
|
+
}
|
|
72
|
+
setPluginConfig(pluginName, config) {
|
|
73
|
+
this.config.plugins[pluginName] = config;
|
|
74
|
+
}
|
|
75
|
+
removePluginConfig(pluginName) {
|
|
76
|
+
delete this.config.plugins[pluginName];
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* 将插件 defaultConfig 中缺失的字段合并到配置;同时按 configSchema
|
|
80
|
+
* 移除多余字段。返回发生变更的插件 instanceId 列表(调用方可决定要不要 log)。
|
|
81
|
+
*
|
|
82
|
+
* 副作用:内部对每个发生变化的条目调用 setPluginConfig;若有变化最终调用 save()。
|
|
83
|
+
*/
|
|
84
|
+
syncPluginDefaults(plugins) {
|
|
85
|
+
const changed = [];
|
|
86
|
+
for (const plugin of plugins) {
|
|
87
|
+
const defaults = plugin.defaultConfig ?? {};
|
|
88
|
+
const schema = plugin.configSchema;
|
|
89
|
+
const fileConfig = this.getPluginConfig(plugin.instanceId);
|
|
90
|
+
let merged = deepMergeDefaults(defaults, fileConfig);
|
|
91
|
+
if (this.trimUnknownFields && schema && Object.keys(schema).length > 0) {
|
|
92
|
+
merged = removeExtraFields(merged, schema);
|
|
93
|
+
}
|
|
94
|
+
if (JSON.stringify(merged) !== JSON.stringify(fileConfig)) {
|
|
95
|
+
this.setPluginConfig(plugin.instanceId, merged);
|
|
96
|
+
changed.push(plugin.instanceId);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
if (changed.length > 0)
|
|
100
|
+
this.save();
|
|
101
|
+
return changed;
|
|
102
|
+
}
|
|
103
|
+
isPluginDisabled(pluginName) {
|
|
104
|
+
return (this.config.disabledPlugins ?? []).includes(pluginName);
|
|
105
|
+
}
|
|
106
|
+
setPluginEnabled(pluginName, enabled) {
|
|
107
|
+
if (!this.config.disabledPlugins) {
|
|
108
|
+
this.config.disabledPlugins = [];
|
|
109
|
+
}
|
|
110
|
+
const idx = this.config.disabledPlugins.indexOf(pluginName);
|
|
111
|
+
if (enabled && idx >= 0) {
|
|
112
|
+
this.config.disabledPlugins.splice(idx, 1);
|
|
113
|
+
}
|
|
114
|
+
else if (!enabled && idx < 0) {
|
|
115
|
+
this.config.disabledPlugins.push(pluginName);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
getServicePreferences() {
|
|
119
|
+
return (this.config.servicePreferences ?? {});
|
|
120
|
+
}
|
|
121
|
+
setServicePreference(name, contextId) {
|
|
122
|
+
if (!this.config.servicePreferences)
|
|
123
|
+
this.config.servicePreferences = {};
|
|
124
|
+
this.config.servicePreferences[name] = contextId;
|
|
125
|
+
}
|
|
126
|
+
removeServicePreference(name) {
|
|
127
|
+
if (!this.config.servicePreferences)
|
|
128
|
+
return;
|
|
129
|
+
delete this.config.servicePreferences[name];
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* 持久化当前配置。委托给 provider,无 provider 时静默忽略(内存模式)。
|
|
133
|
+
* 同步语义:若 provider 异步保存,调用方不会等待完成——这与原 fs sync 行为一致。
|
|
134
|
+
*/
|
|
135
|
+
save() {
|
|
136
|
+
if (!this.provider?.save)
|
|
137
|
+
return;
|
|
138
|
+
const result = this.provider.save(this.config);
|
|
139
|
+
if (result instanceof Promise) {
|
|
140
|
+
result.catch(() => {
|
|
141
|
+
/* provider 自身负责报错;core 不做处理 */
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* 重新加载配置——把外部传入的快照写回内部状态。
|
|
147
|
+
*
|
|
148
|
+
* 历史上这是"从磁盘 re-read"的入口;现在交由 provider 决定何时
|
|
149
|
+
* 通过 `watch(onChange)` 把新快照推过来;本方法仅供 watch 回调使用。
|
|
150
|
+
*
|
|
151
|
+
* 注意:本方法(与 watch 回调)**不应用 trimUnknownFields 政策**——
|
|
152
|
+
* ConfigManager 不持有插件 schema,裁剪统一发生在 syncPluginDefaults
|
|
153
|
+
* (App.handleConfigFileChanged 热重载时会重新调用它对齐政策)。
|
|
154
|
+
*/
|
|
155
|
+
reloadFrom(next) {
|
|
156
|
+
this.config = mergeDefaultsConfig(next);
|
|
157
|
+
return this.config;
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* 订阅配置外部变更。委托给 provider;无 provider 时为 no-op。
|
|
161
|
+
*/
|
|
162
|
+
watch(onChange) {
|
|
163
|
+
this.onChangeCallback = onChange;
|
|
164
|
+
if (!this.provider?.watch)
|
|
165
|
+
return;
|
|
166
|
+
if (this.unwatchFn)
|
|
167
|
+
return;
|
|
168
|
+
this.unwatchFn = this.provider.watch(next => {
|
|
169
|
+
this.config = mergeDefaultsConfig(next);
|
|
170
|
+
this.onChangeCallback?.();
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
unwatch() {
|
|
174
|
+
this.unwatchFn?.();
|
|
175
|
+
this.unwatchFn = null;
|
|
176
|
+
this.onChangeCallback = null;
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* 隔离作用域配置管理器(cleanup-7 新增)
|
|
181
|
+
*
|
|
182
|
+
* 与 {@link ScopedServiceContainer} 对称:fallback-read + override-write。
|
|
183
|
+
* - `get(key)` 优先返回 overlay 内的值,否则回退到父配置
|
|
184
|
+
* - `set(key, value)` 仅写入 overlay,不影响父配置
|
|
185
|
+
* - `getPluginConfig(name)` 返回 `{ ...parent, ...overlay }`(浅合并)
|
|
186
|
+
* - `setPluginConfig(name, conf)` 完整替换 overlay 中该插件条目
|
|
187
|
+
* - 不接触任何 provider:`save()` 为 no-op(与基类"无 provider 内存模式"
|
|
188
|
+
* 同语义——通用插件代码可以照常调 save() 而不被炸),`watch()` 为 no-op
|
|
189
|
+
*
|
|
190
|
+
* ⚠️ 实现约定:本类继承 ConfigManager 仅为名义类型兼容(Context.config 等
|
|
191
|
+
* 处声明为 ConfigManager),**基类内部状态从不读写**——所有公开方法都被
|
|
192
|
+
* 显式覆写为「overlay 优先,回退 parentConfig」的委托。给基类新增公开方法
|
|
193
|
+
* 时必须同步在此覆写,否则继承下来的实现会读写无效的基类快照(写穿透 /
|
|
194
|
+
* 读过期)。test/core/config.test.ts 有反射式防漂移用例兜底。
|
|
195
|
+
*/
|
|
196
|
+
export class ScopedConfigManager extends ConfigManager {
|
|
197
|
+
overlay = {};
|
|
198
|
+
parentConfig;
|
|
199
|
+
constructor(parent) {
|
|
200
|
+
// 基类要求一个 initial 快照——传入独立的空白对象占位。绝不可传
|
|
201
|
+
// parent.getAll():那会把 plugins/disabledPlugins 等容器按引用共享给
|
|
202
|
+
// 基类快照,一旦哪个方法漏覆写,继承实现的写入会穿透进父配置。
|
|
203
|
+
// 政策字段(trimUnknownFields)按值继承父配置——syncPluginDefaults 经
|
|
204
|
+
// 虚分派读 this.trimUnknownFields,scope 必须与父同政策。
|
|
205
|
+
super({ name: '', logLevel: '', plugins: {} }, { trimUnknownFields: parent.trimUnknownFields });
|
|
206
|
+
this.parentConfig = parent;
|
|
207
|
+
}
|
|
208
|
+
// ---- 读路径:overlay 优先,回退父配置 ----
|
|
209
|
+
get(key) {
|
|
210
|
+
if (this.overlay && key in this.overlay) {
|
|
211
|
+
return this.overlay[key];
|
|
212
|
+
}
|
|
213
|
+
return this.parentConfig.get(key);
|
|
214
|
+
}
|
|
215
|
+
getPluginConfig(pluginName) {
|
|
216
|
+
const parentConf = this.parentConfig.getPluginConfig(pluginName);
|
|
217
|
+
const ownConf = (this.overlay.plugins?.[pluginName] ?? {});
|
|
218
|
+
// 浅合并:scope 的覆盖只影响顶层 key;嵌套对象由调用方自行 deep-merge
|
|
219
|
+
return { ...parentConf, ...ownConf };
|
|
220
|
+
}
|
|
221
|
+
isPluginDisabled(pluginName) {
|
|
222
|
+
if (this.overlay.disabledPlugins !== undefined) {
|
|
223
|
+
return this.overlay.disabledPlugins.includes(pluginName);
|
|
224
|
+
}
|
|
225
|
+
return this.parentConfig.isPluginDisabled(pluginName);
|
|
226
|
+
}
|
|
227
|
+
getServicePreferences() {
|
|
228
|
+
return this.overlay.servicePreferences ?? this.parentConfig.getServicePreferences();
|
|
229
|
+
}
|
|
230
|
+
getAll() {
|
|
231
|
+
const parentAll = this.parentConfig.getAll();
|
|
232
|
+
const mergedPlugins = { ...parentAll.plugins };
|
|
233
|
+
if (this.overlay.plugins) {
|
|
234
|
+
for (const [name, conf] of Object.entries(this.overlay.plugins)) {
|
|
235
|
+
mergedPlugins[name] = { ...(parentAll.plugins[name] ?? {}), ...conf };
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
return {
|
|
239
|
+
...parentAll,
|
|
240
|
+
...this.overlay,
|
|
241
|
+
plugins: mergedPlugins,
|
|
242
|
+
};
|
|
243
|
+
}
|
|
244
|
+
getConfigDir() {
|
|
245
|
+
return this.parentConfig.getConfigDir();
|
|
246
|
+
}
|
|
247
|
+
// ---- 写路径:只进 overlay,绝不触碰父配置 ----
|
|
248
|
+
set(key, value) {
|
|
249
|
+
if (!this.overlay)
|
|
250
|
+
this.overlay = {};
|
|
251
|
+
this.overlay[key] = value;
|
|
252
|
+
}
|
|
253
|
+
setPluginConfig(pluginName, config) {
|
|
254
|
+
if (!this.overlay.plugins)
|
|
255
|
+
this.overlay.plugins = {};
|
|
256
|
+
this.overlay.plugins[pluginName] = config;
|
|
257
|
+
}
|
|
258
|
+
removePluginConfig(pluginName) {
|
|
259
|
+
if (this.overlay.plugins)
|
|
260
|
+
delete this.overlay.plugins[pluginName];
|
|
261
|
+
}
|
|
262
|
+
setPluginEnabled(pluginName, enabled) {
|
|
263
|
+
// copy-on-write:首写时把父级列表拷一份进 overlay,之后整列表 shadow 父级
|
|
264
|
+
if (this.overlay.disabledPlugins === undefined) {
|
|
265
|
+
this.overlay.disabledPlugins = [...(this.parentConfig.get('disabledPlugins') ?? [])];
|
|
266
|
+
}
|
|
267
|
+
const list = this.overlay.disabledPlugins;
|
|
268
|
+
const idx = list.indexOf(pluginName);
|
|
269
|
+
if (enabled && idx >= 0) {
|
|
270
|
+
list.splice(idx, 1);
|
|
271
|
+
}
|
|
272
|
+
else if (!enabled && idx < 0) {
|
|
273
|
+
list.push(pluginName);
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
setServicePreference(name, contextId) {
|
|
277
|
+
if (!this.overlay.servicePreferences) {
|
|
278
|
+
this.overlay.servicePreferences = { ...this.parentConfig.getServicePreferences() };
|
|
279
|
+
}
|
|
280
|
+
this.overlay.servicePreferences[name] = contextId;
|
|
281
|
+
}
|
|
282
|
+
removeServicePreference(name) {
|
|
283
|
+
if (!this.overlay.servicePreferences) {
|
|
284
|
+
this.overlay.servicePreferences = { ...this.parentConfig.getServicePreferences() };
|
|
285
|
+
}
|
|
286
|
+
delete this.overlay.servicePreferences[name];
|
|
287
|
+
}
|
|
288
|
+
syncPluginDefaults(plugins) {
|
|
289
|
+
// 基类算法走 this.getPluginConfig / this.setPluginConfig / this.save() 虚分派,
|
|
290
|
+
// 在本类上即为「合并进 overlay、不落盘」——语义正确,显式声明以防漂移。
|
|
291
|
+
return super.syncPluginDefaults(plugins);
|
|
292
|
+
}
|
|
293
|
+
// ---- provider 相关:scope 不持久化、不订阅 ----
|
|
294
|
+
/**
|
|
295
|
+
* no-op——与基类"无 provider 内存模式 save() 静默忽略"同语义。
|
|
296
|
+
* 通用插件代码(如 ensureServiceProvider 的 config.save())在 scope 内
|
|
297
|
+
* 运行时不应被炸;隔离性由"写只进 overlay"保证,而不是靠 save 抛错。
|
|
298
|
+
*/
|
|
299
|
+
save() {
|
|
300
|
+
/* scope 配置仅存活于内存 */
|
|
301
|
+
}
|
|
302
|
+
/** scope 没有外部来源,快照重载没有意义;显式拒绝以暴露误用。 */
|
|
303
|
+
reloadFrom() {
|
|
304
|
+
throw new Error('ScopedConfigManager.reloadFrom() 不可用:scope 配置没有外部来源。');
|
|
305
|
+
}
|
|
306
|
+
watch() {
|
|
307
|
+
/* scope 不订阅 provider */
|
|
308
|
+
}
|
|
309
|
+
unwatch() {
|
|
310
|
+
/* no-op */
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
// ---- helpers ----
|
|
314
|
+
function mergeDefaultsConfig(input) {
|
|
315
|
+
const merged = {
|
|
316
|
+
name: input.name ?? DEFAULT_CONFIG.name,
|
|
317
|
+
logLevel: input.logLevel ?? DEFAULT_CONFIG.logLevel,
|
|
318
|
+
plugins: input.plugins ?? {},
|
|
319
|
+
disabledPlugins: input.disabledPlugins ?? [],
|
|
320
|
+
};
|
|
321
|
+
for (const [key, value] of Object.entries(input)) {
|
|
322
|
+
if (key === 'name' || key === 'logLevel' || key === 'plugins' || key === 'disabledPlugins')
|
|
323
|
+
continue;
|
|
324
|
+
merged[key] = value;
|
|
325
|
+
}
|
|
326
|
+
return merged;
|
|
327
|
+
}
|
|
328
|
+
/**
|
|
329
|
+
* 深度合并默认值:只填充缺失的键,不覆盖已有值。
|
|
330
|
+
* 嵌套对象会递归合并;数组与基础类型按"已存在则保留"处理。
|
|
331
|
+
*/
|
|
332
|
+
function deepMergeDefaults(defaults, current) {
|
|
333
|
+
const result = { ...current };
|
|
334
|
+
for (const [key, defaultValue] of Object.entries(defaults)) {
|
|
335
|
+
if (!(key in result)) {
|
|
336
|
+
result[key] = defaultValue;
|
|
337
|
+
}
|
|
338
|
+
else if (defaultValue !== null &&
|
|
339
|
+
typeof defaultValue === 'object' &&
|
|
340
|
+
!Array.isArray(defaultValue) &&
|
|
341
|
+
result[key] !== null &&
|
|
342
|
+
typeof result[key] === 'object' &&
|
|
343
|
+
!Array.isArray(result[key])) {
|
|
344
|
+
result[key] = deepMergeDefaults(defaultValue, result[key]);
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
return result;
|
|
348
|
+
}
|
|
349
|
+
/**
|
|
350
|
+
* 根据 configSchema 移除多余字段。
|
|
351
|
+
* SchemaGroup(含 fields)对应嵌套对象,递归清理;
|
|
352
|
+
* SchemaArray(type=array)直接保留;
|
|
353
|
+
* SchemaField 对应普通字段。
|
|
354
|
+
*/
|
|
355
|
+
function removeExtraFields(config, schema) {
|
|
356
|
+
const result = {};
|
|
357
|
+
for (const [key, value] of Object.entries(config)) {
|
|
358
|
+
if (!(key in schema))
|
|
359
|
+
continue;
|
|
360
|
+
const schemaDef = schema[key];
|
|
361
|
+
if (schemaDef.type === 'array') {
|
|
362
|
+
result[key] = value;
|
|
363
|
+
}
|
|
364
|
+
else if (schemaDef.fields &&
|
|
365
|
+
typeof schemaDef.fields === 'object' &&
|
|
366
|
+
value !== null &&
|
|
367
|
+
typeof value === 'object' &&
|
|
368
|
+
!Array.isArray(value)) {
|
|
369
|
+
result[key] = removeExtraFields(value, schemaDef.fields);
|
|
370
|
+
}
|
|
371
|
+
else {
|
|
372
|
+
result[key] = value;
|
|
373
|
+
}
|
|
374
|
+
}
|
|
375
|
+
return result;
|
|
376
|
+
}
|
|
377
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAoCA,MAAM,cAAc,GAAgB;IAClC,IAAI,EAAE,OAAO;IACb,QAAQ,EAAE,MAAM;IAChB,OAAO,EAAE,EAAE;IACX,eAAe,EAAE,EAAE;CACpB,CAAC;AAEF,6CAA6C;AAC7C,MAAM,CAAC,MAAM,kBAAkB,GAAiB;IAC9C,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,kBAAkB,EAAE,OAAO,EAAE,OAAO,EAAE;IAC1F,QAAQ,EAAE;QACR,IAAI,EAAE,QAAQ;QACd,KAAK,EAAE,MAAM;QACb,WAAW,EAAE,QAAQ;QACrB,OAAO,EAAE,MAAM;QACf,OAAO,EAAE;YACP,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE;YAClC,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE;YAChC,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE;YAChC,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE;SACnC;KACF;CACF,CAAC;AAkBF;;;;;;;;;;;;;;;GAeG;AACH,MAAM,OAAO,aAAa;IAChB,MAAM,CAAc;IACX,QAAQ,CAAkB;IAC1B,OAAO,CAAS;IACjC,sDAAsD;IAC7C,iBAAiB,CAAU;IAC5B,SAAS,GAAwB,IAAI,CAAC;IACtC,gBAAgB,GAAwB,IAAI,CAAC;IAErD,YAAY,OAAoB,EAAE,OAA8B;QAC9D,IAAI,CAAC,MAAM,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAC;QAC3C,IAAI,CAAC,QAAQ,GAAG,OAAO,EAAE,QAAQ,CAAC;QAClC,IAAI,CAAC,OAAO,GAAG,OAAO,EAAE,OAAO,IAAI,GAAG,CAAC;QACvC,IAAI,CAAC,iBAAiB,GAAG,OAAO,EAAE,iBAAiB,IAAI,IAAI,CAAC;IAC9D,CAAC;IAED,GAAG,CAA8B,GAAM;QACrC,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAC1B,CAAC;IAED,eAAe,CAA8D,UAAkB;QAC7F,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,EAAE,CAAM,CAAC;IACtD,CAAC;IAED;;;OAGG;IACH,YAAY;QACV,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;IAED,MAAM;QACJ,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAED,GAAG,CAA8B,GAAM,EAAE,KAAqB;QAC5D,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;IAC3B,CAAC;IAED,eAAe,CAAC,UAAkB,EAAE,MAA+B;QACjE,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,MAAM,CAAC;IAC3C,CAAC;IAED,kBAAkB,CAAC,UAAkB;QACnC,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IACzC,CAAC;IAED;;;;;OAKG;IACH,kBAAkB,CAChB,OAIE;QAEF,MAAM,OAAO,GAAa,EAAE,CAAC;QAC7B,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,MAAM,QAAQ,GAAG,MAAM,CAAC,aAAa,IAAI,EAAE,CAAC;YAC5C,MAAM,MAAM,GAAG,MAAM,CAAC,YAAY,CAAC;YACnC,MAAM,UAAU,GAAG,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;YAE3D,IAAI,MAAM,GAAG,iBAAiB,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;YACrD,IAAI,IAAI,CAAC,iBAAiB,IAAI,MAAM,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACvE,MAAM,GAAG,iBAAiB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;YAC7C,CAAC;YAED,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE,CAAC;gBAC1D,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;gBAChD,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;YAClC,CAAC;QACH,CAAC;QACD,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC;YAAE,IAAI,CAAC,IAAI,EAAE,CAAC;QACpC,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,gBAAgB,CAAC,UAAkB;QACjC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,eAAe,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;IAClE,CAAC;IAED,gBAAgB,CAAC,UAAkB,EAAE,OAAgB;QACnD,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,eAAe,EAAE,CAAC;YACjC,IAAI,CAAC,MAAM,CAAC,eAAe,GAAG,EAAE,CAAC;QACnC,CAAC;QACD,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QAC5D,IAAI,OAAO,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC;YACxB,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QAC7C,CAAC;aAAM,IAAI,CAAC,OAAO,IAAI,GAAG,GAAG,CAAC,EAAE,CAAC;YAC/B,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC/C,CAAC;IACH,CAAC;IAED,qBAAqB;QACnB,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,kBAAkB,IAAI,EAAE,CAA2B,CAAC;IAC1E,CAAC;IAED,oBAAoB,CAAC,IAAY,EAAE,SAAiB;QAClD,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,kBAAkB;YAAE,IAAI,CAAC,MAAM,CAAC,kBAAkB,GAAG,EAAE,CAAC;QACxE,IAAI,CAAC,MAAM,CAAC,kBAA6C,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC;IAC/E,CAAC;IAED,uBAAuB,CAAC,IAAY;QAClC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,kBAAkB;YAAE,OAAO;QAC5C,OAAQ,IAAI,CAAC,MAAM,CAAC,kBAA6C,CAAC,IAAI,CAAC,CAAC;IAC1E,CAAC;IAED;;;OAGG;IACH,IAAI;QACF,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI;YAAE,OAAO;QACjC,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC/C,IAAI,MAAM,YAAY,OAAO,EAAE,CAAC;YAC9B,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE;gBAChB,+BAA+B;YACjC,CAAC,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED;;;;;;;;;OASG;IACH,UAAU,CAAC,IAAiB;QAC1B,IAAI,CAAC,MAAM,GAAG,mBAAmB,CAAC,IAAI,CAAC,CAAC;QACxC,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,QAAoB;QACxB,IAAI,CAAC,gBAAgB,GAAG,QAAQ,CAAC;QACjC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK;YAAE,OAAO;QAClC,IAAI,IAAI,CAAC,SAAS;YAAE,OAAO;QAC3B,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE;YAC1C,IAAI,CAAC,MAAM,GAAG,mBAAmB,CAAC,IAAI,CAAC,CAAC;YACxC,IAAI,CAAC,gBAAgB,EAAE,EAAE,CAAC;QAC5B,CAAC,CAAC,CAAC;IACL,CAAC;IAED,OAAO;QACL,IAAI,CAAC,SAAS,EAAE,EAAE,CAAC;QACnB,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QACtB,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC;IAC/B,CAAC;CACF;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,OAAO,mBAAoB,SAAQ,aAAa;IAC5C,OAAO,GAAyB,EAAE,CAAC;IACnC,YAAY,CAAgB;IAEpC,YAAY,MAAqB;QAC/B,sCAAsC;QACtC,wDAAwD;QACxD,iCAAiC;QACjC,uDAAuD;QACvD,6CAA6C;QAC7C,KAAK,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,EAAE,iBAAiB,EAAE,MAAM,CAAC,iBAAiB,EAAE,CAAC,CAAC;QAChG,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC;IAC7B,CAAC;IAED,iCAAiC;IAExB,GAAG,CAA8B,GAAM;QAC9C,IAAI,IAAI,CAAC,OAAO,IAAI,GAAG,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACxC,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAmB,CAAC;QAC7C,CAAC;QACD,OAAO,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACpC,CAAC;IAEQ,eAAe,CAA8D,UAAkB;QACtG,MAAM,UAAU,GAAG,IAAI,CAAC,YAAY,CAAC,eAAe,CAAI,UAAU,CAAC,CAAC;QACpE,MAAM,OAAO,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,UAAU,CAAC,IAAI,EAAE,CAAe,CAAC;QACzE,+CAA+C;QAC/C,OAAO,EAAE,GAAG,UAAU,EAAE,GAAG,OAAO,EAAO,CAAC;IAC5C,CAAC;IAEQ,gBAAgB,CAAC,UAAkB;QAC1C,IAAI,IAAI,CAAC,OAAO,CAAC,eAAe,KAAK,SAAS,EAAE,CAAC;YAC/C,OAAO,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;QAC3D,CAAC;QACD,OAAO,IAAI,CAAC,YAAY,CAAC,gBAAgB,CAAC,UAAU,CAAC,CAAC;IACxD,CAAC;IAEQ,qBAAqB;QAC5B,OAAQ,IAAI,CAAC,OAAO,CAAC,kBAA6C,IAAI,IAAI,CAAC,YAAY,CAAC,qBAAqB,EAAE,CAAC;IAClH,CAAC;IAEQ,MAAM;QACb,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC;QAC7C,MAAM,aAAa,GAA4C,EAAE,GAAG,SAAS,CAAC,OAAO,EAAE,CAAC;QACxF,IAAI,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;YACzB,KAAK,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;gBAChE,aAAa,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,GAAG,IAAI,EAAE,CAAC;YACxE,CAAC;QACH,CAAC;QACD,OAAO;YACL,GAAG,SAAS;YACZ,GAAG,IAAI,CAAC,OAAO;YACf,OAAO,EAAE,aAAa;SACvB,CAAC;IACJ,CAAC;IAEQ,YAAY;QACnB,OAAO,IAAI,CAAC,YAAY,CAAC,YAAY,EAAE,CAAC;IAC1C,CAAC;IAED,mCAAmC;IAE1B,GAAG,CAA8B,GAAM,EAAE,KAAqB;QACrE,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,IAAI,CAAC,OAAO,GAAG,EAAE,CAAC;QACrC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;IAC5B,CAAC;IAEQ,eAAe,CAAC,UAAkB,EAAE,MAA+B;QAC1E,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO;YAAE,IAAI,CAAC,OAAO,CAAC,OAAO,GAAG,EAAE,CAAC;QACrD,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,MAAM,CAAC;IAC5C,CAAC;IAEQ,kBAAkB,CAAC,UAAkB;QAC5C,IAAI,IAAI,CAAC,OAAO,CAAC,OAAO;YAAE,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IACpE,CAAC;IAEQ,gBAAgB,CAAC,UAAkB,EAAE,OAAgB;QAC5D,qDAAqD;QACrD,IAAI,IAAI,CAAC,OAAO,CAAC,eAAe,KAAK,SAAS,EAAE,CAAC;YAC/C,IAAI,CAAC,OAAO,CAAC,eAAe,GAAG,CAAC,GAAG,CAAE,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,iBAAiB,CAA0B,IAAI,EAAE,CAAC,CAAC,CAAC;QACjH,CAAC;QACD,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC;QAC1C,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QACrC,IAAI,OAAO,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC;YACxB,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QACtB,CAAC;aAAM,IAAI,CAAC,OAAO,IAAI,GAAG,GAAG,CAAC,EAAE,CAAC;YAC/B,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACxB,CAAC;IACH,CAAC;IAEQ,oBAAoB,CAAC,IAAY,EAAE,SAAiB;QAC3D,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,kBAAkB,EAAE,CAAC;YACrC,IAAI,CAAC,OAAO,CAAC,kBAAkB,GAAG,EAAE,GAAG,IAAI,CAAC,YAAY,CAAC,qBAAqB,EAAE,EAAE,CAAC;QACrF,CAAC;QACA,IAAI,CAAC,OAAO,CAAC,kBAA6C,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC;IAChF,CAAC;IAEQ,uBAAuB,CAAC,IAAY;QAC3C,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,kBAAkB,EAAE,CAAC;YACrC,IAAI,CAAC,OAAO,CAAC,kBAAkB,GAAG,EAAE,GAAG,IAAI,CAAC,YAAY,CAAC,qBAAqB,EAAE,EAAE,CAAC;QACrF,CAAC;QACD,OAAQ,IAAI,CAAC,OAAO,CAAC,kBAA6C,CAAC,IAAI,CAAC,CAAC;IAC3E,CAAC;IAEQ,kBAAkB,CACzB,OAIE;QAEF,uEAAuE;QACvE,0CAA0C;QAC1C,OAAO,KAAK,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC;IAC3C,CAAC;IAED,uCAAuC;IAEvC;;;;OAIG;IACM,IAAI;QACX,oBAAoB;IACtB,CAAC;IAED,uCAAuC;IAC9B,UAAU;QACjB,MAAM,IAAI,KAAK,CAAC,sDAAsD,CAAC,CAAC;IAC1E,CAAC;IAEQ,KAAK;QACZ,wBAAwB;IAC1B,CAAC;IAEQ,OAAO;QACd,WAAW;IACb,CAAC;CACF;AAED,oBAAoB;AAEpB,SAAS,mBAAmB,CAAC,KAAyC;IACpE,MAAM,MAAM,GAAgB;QAC1B,IAAI,EAAG,KAAK,CAAC,IAAe,IAAI,cAAc,CAAC,IAAI;QACnD,QAAQ,EAAG,KAAK,CAAC,QAAmB,IAAI,cAAc,CAAC,QAAQ;QAC/D,OAAO,EAAG,KAAK,CAAC,OAAmD,IAAI,EAAE;QACzE,eAAe,EAAG,KAAK,CAAC,eAA4B,IAAI,EAAE;KAC3D,CAAC;IACF,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACjD,IAAI,GAAG,KAAK,MAAM,IAAI,GAAG,KAAK,UAAU,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,iBAAiB;YAAE,SAAS;QACrG,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;IACtB,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;GAGG;AACH,SAAS,iBAAiB,CACxB,QAAiC,EACjC,OAAgC;IAEhC,MAAM,MAAM,GAAG,EAAE,GAAG,OAAO,EAAE,CAAC;IAC9B,KAAK,MAAM,CAAC,GAAG,EAAE,YAAY,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC3D,IAAI,CAAC,CAAC,GAAG,IAAI,MAAM,CAAC,EAAE,CAAC;YACrB,MAAM,CAAC,GAAG,CAAC,GAAG,YAAY,CAAC;QAC7B,CAAC;aAAM,IACL,YAAY,KAAK,IAAI;YACrB,OAAO,YAAY,KAAK,QAAQ;YAChC,CAAC,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC;YAC5B,MAAM,CAAC,GAAG,CAAC,KAAK,IAAI;YACpB,OAAO,MAAM,CAAC,GAAG,CAAC,KAAK,QAAQ;YAC/B,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,EAC3B,CAAC;YACD,MAAM,CAAC,GAAG,CAAC,GAAG,iBAAiB,CAAC,YAAuC,EAAE,MAAM,CAAC,GAAG,CAA4B,CAAC,CAAC;QACnH,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;;GAKG;AACH,SAAS,iBAAiB,CAAC,MAA+B,EAAE,MAA+B;IACzF,MAAM,MAAM,GAA4B,EAAE,CAAC;IAC3C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAClD,IAAI,CAAC,CAAC,GAAG,IAAI,MAAM,CAAC;YAAE,SAAS;QAC/B,MAAM,SAAS,GAAG,MAAM,CAAC,GAAG,CAA4B,CAAC;QACzD,IAAI,SAAS,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YAC/B,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QACtB,CAAC;aAAM,IACL,SAAS,CAAC,MAAM;YAChB,OAAO,SAAS,CAAC,MAAM,KAAK,QAAQ;YACpC,KAAK,KAAK,IAAI;YACd,OAAO,KAAK,KAAK,QAAQ;YACzB,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EACrB,CAAC;YACD,MAAM,CAAC,GAAG,CAAC,GAAG,iBAAiB,CAAC,KAAgC,EAAE,SAAS,CAAC,MAAiC,CAAC,CAAC;QACjH,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QACtB,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Aalis 核心常量
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Gateway 入站消息生命周期相位(按下面的顺序串行执行)。
|
|
6
|
+
*
|
|
7
|
+
* 每个相位是一个独立的命名钩子键,对应一个职责清晰的拦截点。
|
|
8
|
+
* 同一相位内部的多个 handler 按 **注册顺序** 执行洋葱模型 (next 语义),
|
|
9
|
+
* 跨相位则由 plugin-gateway 顺序调度,无需任何优先级数字。
|
|
10
|
+
*
|
|
11
|
+
* COMMAND → 指令解析与执行(由 plugin-commands 占据)
|
|
12
|
+
* FLOW → 流控前置闸门(禁言/冷却/限速;由 plugin-flow-control 占据)
|
|
13
|
+
* TRIGGER → 触发策略判定(mute 关键词/@/计数评分;由 plugin-trigger-policy 占据)
|
|
14
|
+
* DISPATCH → 默认派发到 agent.handleMessage(plugin-gateway 提供 default action)
|
|
15
|
+
*
|
|
16
|
+
* 任一相位的 handler 不调用 next() 即视为"我已处理",
|
|
17
|
+
* 整个入站管道立即停止(不再进入后续相位)。
|
|
18
|
+
*
|
|
19
|
+
* 第三方插件可以注册到任一相位以获得清晰的语义位置,
|
|
20
|
+
* 无需理解优先级数字、无需与其他插件协商占位。
|
|
21
|
+
*/
|
|
22
|
+
export declare const INBOUND_PHASE: {
|
|
23
|
+
readonly COMMAND: "inbound:command";
|
|
24
|
+
readonly FLOW: "inbound:flow";
|
|
25
|
+
readonly TRIGGER: "inbound:trigger";
|
|
26
|
+
readonly DISPATCH: "inbound:dispatch";
|
|
27
|
+
};
|
|
28
|
+
/** 默认相位执行顺序(gateway 内部调度使用)。 */
|
|
29
|
+
export declare const INBOUND_PHASE_ORDER: readonly ["inbound:command", "inbound:flow", "inbound:trigger", "inbound:dispatch"];
|
|
30
|
+
export type InboundPhase = typeof INBOUND_PHASE_ORDER[number];
|
|
31
|
+
//# sourceMappingURL=constants.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH;;;;;;;;;;;;;;;;;GAiBG;AACH,eAAO,MAAM,aAAa;;;;;CAKhB,CAAC;AAEX,gCAAgC;AAChC,eAAO,MAAM,mBAAmB,qFAKtB,CAAC;AAEX,MAAM,MAAM,YAAY,GAAG,OAAO,mBAAmB,CAAC,MAAM,CAAC,CAAC"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Aalis 核心常量
|
|
3
|
+
*/
|
|
4
|
+
// ----- Gateway 入站生命周期相位 -----
|
|
5
|
+
/**
|
|
6
|
+
* Gateway 入站消息生命周期相位(按下面的顺序串行执行)。
|
|
7
|
+
*
|
|
8
|
+
* 每个相位是一个独立的命名钩子键,对应一个职责清晰的拦截点。
|
|
9
|
+
* 同一相位内部的多个 handler 按 **注册顺序** 执行洋葱模型 (next 语义),
|
|
10
|
+
* 跨相位则由 plugin-gateway 顺序调度,无需任何优先级数字。
|
|
11
|
+
*
|
|
12
|
+
* COMMAND → 指令解析与执行(由 plugin-commands 占据)
|
|
13
|
+
* FLOW → 流控前置闸门(禁言/冷却/限速;由 plugin-flow-control 占据)
|
|
14
|
+
* TRIGGER → 触发策略判定(mute 关键词/@/计数评分;由 plugin-trigger-policy 占据)
|
|
15
|
+
* DISPATCH → 默认派发到 agent.handleMessage(plugin-gateway 提供 default action)
|
|
16
|
+
*
|
|
17
|
+
* 任一相位的 handler 不调用 next() 即视为"我已处理",
|
|
18
|
+
* 整个入站管道立即停止(不再进入后续相位)。
|
|
19
|
+
*
|
|
20
|
+
* 第三方插件可以注册到任一相位以获得清晰的语义位置,
|
|
21
|
+
* 无需理解优先级数字、无需与其他插件协商占位。
|
|
22
|
+
*/
|
|
23
|
+
export const INBOUND_PHASE = {
|
|
24
|
+
COMMAND: 'inbound:command',
|
|
25
|
+
FLOW: 'inbound:flow',
|
|
26
|
+
TRIGGER: 'inbound:trigger',
|
|
27
|
+
DISPATCH: 'inbound:dispatch',
|
|
28
|
+
};
|
|
29
|
+
/** 默认相位执行顺序(gateway 内部调度使用)。 */
|
|
30
|
+
export const INBOUND_PHASE_ORDER = [
|
|
31
|
+
INBOUND_PHASE.COMMAND,
|
|
32
|
+
INBOUND_PHASE.FLOW,
|
|
33
|
+
INBOUND_PHASE.TRIGGER,
|
|
34
|
+
INBOUND_PHASE.DISPATCH,
|
|
35
|
+
];
|
|
36
|
+
//# sourceMappingURL=constants.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,+BAA+B;AAE/B;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B,OAAO,EAAE,iBAAiB;IAC1B,IAAI,EAAE,cAAc;IACpB,OAAO,EAAE,iBAAiB;IAC1B,QAAQ,EAAE,kBAAkB;CACpB,CAAC;AAEX,gCAAgC;AAChC,MAAM,CAAC,MAAM,mBAAmB,GAAG;IACjC,aAAa,CAAC,OAAO;IACrB,aAAa,CAAC,IAAI;IAClB,aAAa,CAAC,OAAO;IACrB,aAAa,CAAC,QAAQ;CACd,CAAC"}
|