@zhin.js/core 1.0.42 → 1.0.43
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/CHANGELOG.md +11 -0
- package/lib/built/config.d.ts +5 -0
- package/lib/built/config.d.ts.map +1 -1
- package/lib/built/config.js +34 -1
- package/lib/built/config.js.map +1 -1
- package/lib/built/schema-feature.d.ts +78 -0
- package/lib/built/schema-feature.d.ts.map +1 -0
- package/lib/built/schema-feature.js +132 -0
- package/lib/built/schema-feature.js.map +1 -0
- package/lib/index.d.ts +1 -0
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +2 -0
- package/lib/index.js.map +1 -1
- package/package.json +6 -6
- package/src/built/config.ts +34 -1
- package/src/built/schema-feature.ts +190 -0
- package/src/index.ts +2 -0
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,16 @@
|
|
|
1
1
|
# @zhin.js/core
|
|
2
2
|
|
|
3
|
+
## 1.0.43
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- 72ec4ba: fix: 新增插件,控制台调优
|
|
8
|
+
- @zhin.js/database@1.0.30
|
|
9
|
+
- @zhin.js/logger@0.1.27
|
|
10
|
+
- @zhin.js/schema@1.0.27
|
|
11
|
+
- @zhin.js/ai@1.0.4
|
|
12
|
+
- @zhin.js/kernel@0.0.4
|
|
13
|
+
|
|
3
14
|
## 1.0.42
|
|
4
15
|
|
|
5
16
|
### Patch Changes
|
package/lib/built/config.d.ts
CHANGED
|
@@ -11,6 +11,11 @@ export declare class ConfigLoader<T extends object> {
|
|
|
11
11
|
constructor(filename: string, initial: T, schema?: Schema<T> | undefined);
|
|
12
12
|
load(): void;
|
|
13
13
|
save(fullPath: string): void;
|
|
14
|
+
/**
|
|
15
|
+
* 精准修改单个顶层 key 并写回文件
|
|
16
|
+
* 保留注释、格式和未修改字段(如 ${VAR} 环境变量引用)
|
|
17
|
+
*/
|
|
18
|
+
patchKey(key: string, value: any): void;
|
|
14
19
|
}
|
|
15
20
|
export declare namespace ConfigLoader {
|
|
16
21
|
const supportedExtensions: string[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/built/config.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAOrD,qBAAa,YAAY,CAAC,CAAC,SAAS,MAAM;;IAWrB,QAAQ,EAAE,MAAM;IAAS,OAAO,EAAE,CAAC;IAAS,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;IATjF,IAAI,IAAI,IAAI,CAAC,CAEZ;IACD,IAAI,GAAG,IAAI,CAAC,CAEX;IACD,IAAI,SAAS,WAEZ;gBACkB,QAAQ,EAAE,MAAM,EAAS,OAAO,EAAE,CAAC,EAAS,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,YAAA;IA2DjF,IAAI;IAyBJ,IAAI,CAAC,QAAQ,EAAE,MAAM;
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/built/config.ts"],"names":[],"mappings":"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"}
|
package/lib/built/config.js
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
*/
|
|
6
6
|
import path from "node:path";
|
|
7
7
|
import fs from "node:fs";
|
|
8
|
-
import { stringify as stringifyYaml, parse as parseYaml } from "yaml";
|
|
8
|
+
import { stringify as stringifyYaml, parse as parseYaml, parseDocument } from "yaml";
|
|
9
9
|
import { parse as parseToml, stringify as stringifyToml } from "smol-toml";
|
|
10
10
|
import { Feature } from "../feature.js";
|
|
11
11
|
import { getPlugin } from "../plugin.js";
|
|
@@ -127,6 +127,39 @@ export class ConfigLoader {
|
|
|
127
127
|
break;
|
|
128
128
|
}
|
|
129
129
|
}
|
|
130
|
+
/**
|
|
131
|
+
* 精准修改单个顶层 key 并写回文件
|
|
132
|
+
* 保留注释、格式和未修改字段(如 ${VAR} 环境变量引用)
|
|
133
|
+
*/
|
|
134
|
+
patchKey(key, value) {
|
|
135
|
+
const fullPath = path.resolve(process.cwd(), this.filename);
|
|
136
|
+
switch (this.extension) {
|
|
137
|
+
case ".yaml":
|
|
138
|
+
case ".yml": {
|
|
139
|
+
const content = fs.readFileSync(fullPath, 'utf-8');
|
|
140
|
+
const doc = parseDocument(content);
|
|
141
|
+
doc.set(key, value);
|
|
142
|
+
fs.writeFileSync(fullPath, doc.toString());
|
|
143
|
+
break;
|
|
144
|
+
}
|
|
145
|
+
case ".json": {
|
|
146
|
+
const content = fs.readFileSync(fullPath, 'utf-8');
|
|
147
|
+
const obj = JSON.parse(content);
|
|
148
|
+
obj[key] = value;
|
|
149
|
+
fs.writeFileSync(fullPath, JSON.stringify(obj, null, 2));
|
|
150
|
+
break;
|
|
151
|
+
}
|
|
152
|
+
case ".toml": {
|
|
153
|
+
const content = fs.readFileSync(fullPath, 'utf-8');
|
|
154
|
+
const obj = parseToml(content);
|
|
155
|
+
obj[key] = value;
|
|
156
|
+
fs.writeFileSync(fullPath, stringifyToml(obj));
|
|
157
|
+
break;
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
// 同步更新内存
|
|
161
|
+
this.#data[key] = value;
|
|
162
|
+
}
|
|
130
163
|
}
|
|
131
164
|
(function (ConfigLoader) {
|
|
132
165
|
ConfigLoader.supportedExtensions = [".json", ".yaml", ".yml", ".toml"];
|
package/lib/built/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/built/config.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,SAAS,IAAI,aAAa,EAAE,KAAK,IAAI,SAAS,EAAE,MAAM,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/built/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SchemaFeature — 插件配置 Schema 注册表
|
|
3
|
+
*
|
|
4
|
+
* 插件通过 declareConfig(key, schema) 声明配置项及其 Schema,
|
|
5
|
+
* SchemaFeature 全局收集后供 Web 控制台渲染配置编辑表单。
|
|
6
|
+
*
|
|
7
|
+
* 与 ConfigFeature 协作:
|
|
8
|
+
* - declareConfig 内部调用 addConfig(key, defaults) 写入默认值
|
|
9
|
+
* - Schema.toJSON() 传给前端驱动 PluginConfigForm
|
|
10
|
+
* - reloadable 标记决定保存后是否自动重载插件
|
|
11
|
+
*/
|
|
12
|
+
import { Feature, FeatureJSON } from '../feature.js';
|
|
13
|
+
import { Schema } from '@zhin.js/schema';
|
|
14
|
+
export interface SchemaRecord {
|
|
15
|
+
/** 配置 key(对应 zhin.config.yml 中的顶级字段) */
|
|
16
|
+
key: string;
|
|
17
|
+
/** Schema 实例 */
|
|
18
|
+
schema: Schema;
|
|
19
|
+
/** 保存后是否支持热重载(http/database 等底层服务应为 false) */
|
|
20
|
+
reloadable: boolean;
|
|
21
|
+
}
|
|
22
|
+
export interface SchemaContextExtensions {
|
|
23
|
+
/**
|
|
24
|
+
* 声明插件配置 Schema
|
|
25
|
+
* @param key 配置 key,如 "rss"
|
|
26
|
+
* @param schema Schema.object({...}) 定义
|
|
27
|
+
* @param options.reloadable 保存后是否自动重载,默认 true
|
|
28
|
+
* @returns 当前配置值(已合并默认值)
|
|
29
|
+
*/
|
|
30
|
+
declareConfig<T extends Record<string, any>>(key: string, schema: Schema<T>, options?: {
|
|
31
|
+
reloadable?: boolean;
|
|
32
|
+
}): Required<T>;
|
|
33
|
+
}
|
|
34
|
+
declare module '../plugin.js' {
|
|
35
|
+
namespace Plugin {
|
|
36
|
+
interface Extensions extends SchemaContextExtensions {
|
|
37
|
+
}
|
|
38
|
+
interface Contexts {
|
|
39
|
+
schema: SchemaFeature;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
export declare class SchemaFeature extends Feature<SchemaRecord> {
|
|
44
|
+
readonly name: "schema";
|
|
45
|
+
readonly icon = "FileCode";
|
|
46
|
+
readonly desc = "\u914D\u7F6E\u6A21\u578B";
|
|
47
|
+
/**
|
|
48
|
+
* 按配置 key 查找 Schema
|
|
49
|
+
*/
|
|
50
|
+
getByKey(key: string): SchemaRecord | null;
|
|
51
|
+
/**
|
|
52
|
+
* 获取指定插件名注册的 Schema
|
|
53
|
+
*/
|
|
54
|
+
getByPluginName(pluginName: string): SchemaRecord | null;
|
|
55
|
+
/**
|
|
56
|
+
* 获取某个 key 的 Schema 实例(WebSocket handler 使用)
|
|
57
|
+
*/
|
|
58
|
+
get(keyOrPlugin: string): Schema | null;
|
|
59
|
+
/**
|
|
60
|
+
* 判断某个 key 对应的插件是否支持热重载
|
|
61
|
+
*/
|
|
62
|
+
isReloadable(keyOrPlugin: string): boolean;
|
|
63
|
+
/**
|
|
64
|
+
* 通过 pluginName 获取对应的 config key
|
|
65
|
+
*/
|
|
66
|
+
resolveConfigKey(pluginName: string): string | null;
|
|
67
|
+
/**
|
|
68
|
+
* 返回 pluginName → configKey 的映射
|
|
69
|
+
*/
|
|
70
|
+
getPluginKeyMap(): Map<string, string>;
|
|
71
|
+
toJSON(pluginName?: string): FeatureJSON;
|
|
72
|
+
get extensions(): {
|
|
73
|
+
declareConfig<T extends Record<string, any>>(key: string, schema: Schema<T>, options?: {
|
|
74
|
+
reloadable?: boolean;
|
|
75
|
+
}): Required<T>;
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=schema-feature.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema-feature.d.ts","sourceRoot":"","sources":["../../src/built/schema-feature.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAOzC,MAAM,WAAW,YAAY;IAC3B,wCAAwC;IACxC,GAAG,EAAE,MAAM,CAAC;IACZ,gBAAgB;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,8CAA8C;IAC9C,UAAU,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,uBAAuB;IACtC;;;;;;OAMG;IACH,aAAa,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACzC,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,EACjB,OAAO,CAAC,EAAE;QAAE,UAAU,CAAC,EAAE,OAAO,CAAA;KAAE,GACjC,QAAQ,CAAC,CAAC,CAAC,CAAC;CAChB;AAED,OAAO,QAAQ,cAAc,CAAC;IAC5B,UAAU,MAAM,CAAC;QACf,UAAU,UAAW,SAAQ,uBAAuB;SAAG;QACvD,UAAU,QAAQ;YAChB,MAAM,EAAE,aAAa,CAAC;SACvB;KACF;CACF;AAMD,qBAAa,aAAc,SAAQ,OAAO,CAAC,YAAY,CAAC;IACtD,QAAQ,CAAC,IAAI,EAAG,QAAQ,CAAU;IAClC,QAAQ,CAAC,IAAI,cAAc;IAC3B,QAAQ,CAAC,IAAI,8BAAU;IAEvB;;OAEG;IACH,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI;IAI1C;;OAEG;IACH,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI;IAKxD;;OAEG;IACH,GAAG,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAOvC;;OAEG;IACH,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO;IAO1C;;OAEG;IACH,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAOnD;;OAEG;IACH,eAAe,IAAI,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC;IAUtC,MAAM,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,WAAW;IAexC,IAAI,UAAU;sBAGI,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,OACpC,MAAM,UACH,MAAM,CAAC,CAAC,CAAC,YACP;YAAE,UAAU,CAAC,EAAE,OAAO,CAAA;SAAE,GACjC,QAAQ,CAAC,CAAC,CAAC;MA2BjB;CACF"}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SchemaFeature — 插件配置 Schema 注册表
|
|
3
|
+
*
|
|
4
|
+
* 插件通过 declareConfig(key, schema) 声明配置项及其 Schema,
|
|
5
|
+
* SchemaFeature 全局收集后供 Web 控制台渲染配置编辑表单。
|
|
6
|
+
*
|
|
7
|
+
* 与 ConfigFeature 协作:
|
|
8
|
+
* - declareConfig 内部调用 addConfig(key, defaults) 写入默认值
|
|
9
|
+
* - Schema.toJSON() 传给前端驱动 PluginConfigForm
|
|
10
|
+
* - reloadable 标记决定保存后是否自动重载插件
|
|
11
|
+
*/
|
|
12
|
+
import { Feature } from '../feature.js';
|
|
13
|
+
import { getPlugin } from '../plugin.js';
|
|
14
|
+
// ============================================================================
|
|
15
|
+
// SchemaFeature
|
|
16
|
+
// ============================================================================
|
|
17
|
+
export class SchemaFeature extends Feature {
|
|
18
|
+
name = 'schema';
|
|
19
|
+
icon = 'FileCode';
|
|
20
|
+
desc = '配置模型';
|
|
21
|
+
/**
|
|
22
|
+
* 按配置 key 查找 Schema
|
|
23
|
+
*/
|
|
24
|
+
getByKey(key) {
|
|
25
|
+
return this.items.find(r => r.key === key) ?? null;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* 获取指定插件名注册的 Schema
|
|
29
|
+
*/
|
|
30
|
+
getByPluginName(pluginName) {
|
|
31
|
+
const list = this.getByPlugin(pluginName);
|
|
32
|
+
return list.length > 0 ? list[0] : null;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* 获取某个 key 的 Schema 实例(WebSocket handler 使用)
|
|
36
|
+
*/
|
|
37
|
+
get(keyOrPlugin) {
|
|
38
|
+
const byKey = this.getByKey(keyOrPlugin);
|
|
39
|
+
if (byKey)
|
|
40
|
+
return byKey.schema;
|
|
41
|
+
const byPlugin = this.getByPluginName(keyOrPlugin);
|
|
42
|
+
return byPlugin?.schema ?? null;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* 判断某个 key 对应的插件是否支持热重载
|
|
46
|
+
*/
|
|
47
|
+
isReloadable(keyOrPlugin) {
|
|
48
|
+
const byKey = this.getByKey(keyOrPlugin);
|
|
49
|
+
if (byKey)
|
|
50
|
+
return byKey.reloadable;
|
|
51
|
+
const byPlugin = this.getByPluginName(keyOrPlugin);
|
|
52
|
+
return byPlugin?.reloadable ?? true;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* 通过 pluginName 获取对应的 config key
|
|
56
|
+
*/
|
|
57
|
+
resolveConfigKey(pluginName) {
|
|
58
|
+
const byKey = this.getByKey(pluginName);
|
|
59
|
+
if (byKey)
|
|
60
|
+
return byKey.key;
|
|
61
|
+
const byPlugin = this.getByPluginName(pluginName);
|
|
62
|
+
return byPlugin?.key ?? null;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* 返回 pluginName → configKey 的映射
|
|
66
|
+
*/
|
|
67
|
+
getPluginKeyMap() {
|
|
68
|
+
const map = new Map();
|
|
69
|
+
for (const [pluginName, records] of this.pluginItems) {
|
|
70
|
+
if (records.length > 0) {
|
|
71
|
+
map.set(pluginName, records[0].key);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
return map;
|
|
75
|
+
}
|
|
76
|
+
toJSON(pluginName) {
|
|
77
|
+
const list = pluginName ? this.getByPlugin(pluginName) : this.items;
|
|
78
|
+
return {
|
|
79
|
+
name: this.name,
|
|
80
|
+
icon: this.icon,
|
|
81
|
+
desc: this.desc,
|
|
82
|
+
count: list.length,
|
|
83
|
+
items: list.map(r => ({
|
|
84
|
+
name: r.key,
|
|
85
|
+
reloadable: r.reloadable,
|
|
86
|
+
schema: r.schema.toJSON(),
|
|
87
|
+
})),
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
get extensions() {
|
|
91
|
+
const feature = this;
|
|
92
|
+
return {
|
|
93
|
+
declareConfig(key, schema, options) {
|
|
94
|
+
const plugin = getPlugin();
|
|
95
|
+
const reloadable = options?.reloadable ?? true;
|
|
96
|
+
// 从 Schema 提取默认值
|
|
97
|
+
const defaults = extractDefaults(schema);
|
|
98
|
+
// 注册到 ConfigFeature(写入 config.yml 的默认值)
|
|
99
|
+
if (typeof plugin.addConfig === 'function') {
|
|
100
|
+
plugin.addConfig(key, defaults);
|
|
101
|
+
}
|
|
102
|
+
// 注册到 SchemaFeature
|
|
103
|
+
const record = { key, schema, reloadable };
|
|
104
|
+
const dispose = feature.add(record, plugin.name);
|
|
105
|
+
plugin.recordFeatureContribution(feature.name, key);
|
|
106
|
+
plugin.onDispose(dispose);
|
|
107
|
+
// 读取当前配置并与默认值合并
|
|
108
|
+
const root = plugin.root ?? plugin;
|
|
109
|
+
const configService = root.inject('config');
|
|
110
|
+
const appConfig = configService?.get?.('zhin.config.yml') ?? {};
|
|
111
|
+
const current = appConfig[key] ?? {};
|
|
112
|
+
return { ...defaults, ...current };
|
|
113
|
+
},
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
// ============================================================================
|
|
118
|
+
// 辅助:从 Schema 提取默认值
|
|
119
|
+
// ============================================================================
|
|
120
|
+
function extractDefaults(schema) {
|
|
121
|
+
const json = schema.toJSON();
|
|
122
|
+
const result = {};
|
|
123
|
+
const fields = json.object || json.properties || json.dict || {};
|
|
124
|
+
for (const [fieldKey, fieldSchema] of Object.entries(fields)) {
|
|
125
|
+
const field = fieldSchema;
|
|
126
|
+
if (field.default !== undefined) {
|
|
127
|
+
result[fieldKey] = field.default;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
return result;
|
|
131
|
+
}
|
|
132
|
+
//# sourceMappingURL=schema-feature.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema-feature.js","sourceRoot":"","sources":["../../src/built/schema-feature.ts"],"names":[],"mappings":"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"}
|
package/lib/index.d.ts
CHANGED
|
@@ -19,6 +19,7 @@ export * from './built/tool.js';
|
|
|
19
19
|
export * from './built/ai-trigger.js';
|
|
20
20
|
export * from './built/dispatcher.js';
|
|
21
21
|
export * from './built/skill.js';
|
|
22
|
+
export * from './built/schema-feature.js';
|
|
22
23
|
export * from './built/common-adapter-tools.js';
|
|
23
24
|
export * from './ai/index.js';
|
|
24
25
|
export * from './types.js';
|
package/lib/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,cAAc,cAAc,CAAA;AAC5B,cAAc,UAAU,CAAA;AACxB,cAAc,aAAa,CAAA;AAC3B,cAAc,cAAc,CAAA;AAC5B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,cAAc,CAAA;AAC5B,cAAc,cAAc,CAAA;AAC5B,cAAc,aAAa,CAAA;AAE3B,cAAc,wBAAwB,CAAA;AACtC,cAAc,kBAAkB,CAAA;AAEhC,cAAc,mBAAmB,CAAA;AACjC,cAAc,oBAAoB,CAAA;AAClC,cAAc,iBAAiB,CAAA;AAC/B,cAAc,uBAAuB,CAAA;AACrC,cAAc,4BAA4B,CAAA;AAC1C,cAAc,sBAAsB,CAAA;AACpC,cAAc,qBAAqB,CAAA;AAEnC,cAAc,iBAAiB,CAAA;AAE/B,cAAc,uBAAuB,CAAA;AAErC,cAAc,uBAAuB,CAAA;AAErC,cAAc,kBAAkB,CAAA;AAEhC,cAAc,iCAAiC,CAAA;AAE/C,cAAc,eAAe,CAAA;AAE7B,cAAc,YAAY,CAAA;AAC1B,cAAc,YAAY,CAAA;AAC1B,cAAc,aAAa,CAAA;AAC3B,cAAc,WAAW,CAAA;AACzB,cAAc,sBAAsB,CAAA;AACpC,cAAc,mBAAmB,CAAA;AACjC,cAAc,iBAAiB,CAAA;AAE/B,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAA;AAExC,YAAY,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,cAAc,cAAc,CAAA;AAC5B,cAAc,UAAU,CAAA;AACxB,cAAc,aAAa,CAAA;AAC3B,cAAc,cAAc,CAAA;AAC5B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,cAAc,CAAA;AAC5B,cAAc,cAAc,CAAA;AAC5B,cAAc,aAAa,CAAA;AAE3B,cAAc,wBAAwB,CAAA;AACtC,cAAc,kBAAkB,CAAA;AAEhC,cAAc,mBAAmB,CAAA;AACjC,cAAc,oBAAoB,CAAA;AAClC,cAAc,iBAAiB,CAAA;AAC/B,cAAc,uBAAuB,CAAA;AACrC,cAAc,4BAA4B,CAAA;AAC1C,cAAc,sBAAsB,CAAA;AACpC,cAAc,qBAAqB,CAAA;AAEnC,cAAc,iBAAiB,CAAA;AAE/B,cAAc,uBAAuB,CAAA;AAErC,cAAc,uBAAuB,CAAA;AAErC,cAAc,kBAAkB,CAAA;AAEhC,cAAc,2BAA2B,CAAA;AAEzC,cAAc,iCAAiC,CAAA;AAE/C,cAAc,eAAe,CAAA;AAE7B,cAAc,YAAY,CAAA;AAC1B,cAAc,YAAY,CAAA;AAC1B,cAAc,aAAa,CAAA;AAC3B,cAAc,WAAW,CAAA;AACzB,cAAc,sBAAsB,CAAA;AACpC,cAAc,mBAAmB,CAAA;AACjC,cAAc,iBAAiB,CAAA;AAE/B,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAA;AAExC,YAAY,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA"}
|
package/lib/index.js
CHANGED
|
@@ -26,6 +26,8 @@ export * from './built/ai-trigger.js';
|
|
|
26
26
|
export * from './built/dispatcher.js';
|
|
27
27
|
// Skill 系统 (AI 能力描述)
|
|
28
28
|
export * from './built/skill.js';
|
|
29
|
+
// Schema 注册表 (插件配置声明)
|
|
30
|
+
export * from './built/schema-feature.js';
|
|
29
31
|
// Common adapter tool factories (shared across adapters)
|
|
30
32
|
export * from './built/common-adapter-tools.js';
|
|
31
33
|
// AI 模块 (原 @zhin.js/ai,已合并至 core)
|
package/lib/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,eAAe;AACf,cAAc,cAAc,CAAA;AAC5B,cAAc,UAAU,CAAA;AACxB,cAAc,aAAa,CAAA;AAC3B,cAAc,cAAc,CAAA;AAC5B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,cAAc,CAAA;AAC5B,cAAc,cAAc,CAAA;AAC5B,cAAc,aAAa,CAAA;AAC3B,SAAS;AACT,cAAc,wBAAwB,CAAA;AACtC,cAAc,kBAAkB,CAAA;AAChC,oBAAoB;AACpB,cAAc,mBAAmB,CAAA;AACjC,cAAc,oBAAoB,CAAA;AAClC,cAAc,iBAAiB,CAAA;AAC/B,cAAc,uBAAuB,CAAA;AACrC,cAAc,4BAA4B,CAAA;AAC1C,cAAc,sBAAsB,CAAA;AACpC,cAAc,qBAAqB,CAAA;AACnC,0BAA0B;AAC1B,cAAc,iBAAiB,CAAA;AAC/B,gCAAgC;AAChC,cAAc,uBAAuB,CAAA;AACrC,4BAA4B;AAC5B,cAAc,uBAAuB,CAAA;AACrC,qBAAqB;AACrB,cAAc,kBAAkB,CAAA;AAChC,yDAAyD;AACzD,cAAc,iCAAiC,CAAA;AAC/C,kCAAkC;AAClC,cAAc,eAAe,CAAA;AAE7B,cAAc,YAAY,CAAA;AAC1B,cAAc,YAAY,CAAA;AAC1B,cAAc,aAAa,CAAA,CAAE,WAAW;AACxC,cAAc,WAAW,CAAA;AACzB,cAAc,sBAAsB,CAAA;AACpC,cAAc,mBAAmB,CAAA;AACjC,cAAc,iBAAiB,CAAA;AAC/B,yCAAyC;AACzC,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,eAAe;AACf,cAAc,cAAc,CAAA;AAC5B,cAAc,UAAU,CAAA;AACxB,cAAc,aAAa,CAAA;AAC3B,cAAc,cAAc,CAAA;AAC5B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,cAAc,CAAA;AAC5B,cAAc,cAAc,CAAA;AAC5B,cAAc,aAAa,CAAA;AAC3B,SAAS;AACT,cAAc,wBAAwB,CAAA;AACtC,cAAc,kBAAkB,CAAA;AAChC,oBAAoB;AACpB,cAAc,mBAAmB,CAAA;AACjC,cAAc,oBAAoB,CAAA;AAClC,cAAc,iBAAiB,CAAA;AAC/B,cAAc,uBAAuB,CAAA;AACrC,cAAc,4BAA4B,CAAA;AAC1C,cAAc,sBAAsB,CAAA;AACpC,cAAc,qBAAqB,CAAA;AACnC,0BAA0B;AAC1B,cAAc,iBAAiB,CAAA;AAC/B,gCAAgC;AAChC,cAAc,uBAAuB,CAAA;AACrC,4BAA4B;AAC5B,cAAc,uBAAuB,CAAA;AACrC,qBAAqB;AACrB,cAAc,kBAAkB,CAAA;AAChC,sBAAsB;AACtB,cAAc,2BAA2B,CAAA;AACzC,yDAAyD;AACzD,cAAc,iCAAiC,CAAA;AAC/C,kCAAkC;AAClC,cAAc,eAAe,CAAA;AAE7B,cAAc,YAAY,CAAA;AAC1B,cAAc,YAAY,CAAA;AAC1B,cAAc,aAAa,CAAA,CAAE,WAAW;AACxC,cAAc,WAAW,CAAA;AACzB,cAAc,sBAAsB,CAAA;AACpC,cAAc,mBAAmB,CAAA;AACjC,cAAc,iBAAiB,CAAA;AAC/B,yCAAyC;AACzC,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAA"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@zhin.js/core",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.43",
|
|
4
4
|
"description": "Zhin机器人核心框架",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./lib/index.js",
|
|
@@ -37,11 +37,11 @@
|
|
|
37
37
|
"segment-matcher": "^1.0.5",
|
|
38
38
|
"smol-toml": "^1.6.0",
|
|
39
39
|
"yaml": "^2.3.4",
|
|
40
|
-
"@zhin.js/ai": "1.0.
|
|
41
|
-
"@zhin.js/database": "1.0.
|
|
42
|
-
"@zhin.js/kernel": "0.0.
|
|
43
|
-
"@zhin.js/logger": "0.1.
|
|
44
|
-
"@zhin.js/schema": "1.0.
|
|
40
|
+
"@zhin.js/ai": "1.0.4",
|
|
41
|
+
"@zhin.js/database": "1.0.30",
|
|
42
|
+
"@zhin.js/kernel": "0.0.4",
|
|
43
|
+
"@zhin.js/logger": "0.1.27",
|
|
44
|
+
"@zhin.js/schema": "1.0.27"
|
|
45
45
|
},
|
|
46
46
|
"devDependencies": {
|
|
47
47
|
"@types/node": "^24.3.0",
|
package/src/built/config.ts
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
*/
|
|
6
6
|
import path from "node:path";
|
|
7
7
|
import fs from "node:fs";
|
|
8
|
-
import { stringify as stringifyYaml, parse as parseYaml } from "yaml";
|
|
8
|
+
import { stringify as stringifyYaml, parse as parseYaml, parseDocument } from "yaml";
|
|
9
9
|
import { parse as parseToml, stringify as stringifyToml } from "smol-toml";
|
|
10
10
|
import { Schema } from "@zhin.js/schema";
|
|
11
11
|
import { Feature, FeatureJSON } from "../feature.js";
|
|
@@ -124,6 +124,39 @@ export class ConfigLoader<T extends object> {
|
|
|
124
124
|
break;
|
|
125
125
|
}
|
|
126
126
|
}
|
|
127
|
+
/**
|
|
128
|
+
* 精准修改单个顶层 key 并写回文件
|
|
129
|
+
* 保留注释、格式和未修改字段(如 ${VAR} 环境变量引用)
|
|
130
|
+
*/
|
|
131
|
+
patchKey(key: string, value: any) {
|
|
132
|
+
const fullPath = path.resolve(process.cwd(), this.filename);
|
|
133
|
+
switch (this.extension) {
|
|
134
|
+
case ".yaml":
|
|
135
|
+
case ".yml": {
|
|
136
|
+
const content = fs.readFileSync(fullPath, 'utf-8');
|
|
137
|
+
const doc = parseDocument(content);
|
|
138
|
+
doc.set(key, value);
|
|
139
|
+
fs.writeFileSync(fullPath, doc.toString());
|
|
140
|
+
break;
|
|
141
|
+
}
|
|
142
|
+
case ".json": {
|
|
143
|
+
const content = fs.readFileSync(fullPath, 'utf-8');
|
|
144
|
+
const obj = JSON.parse(content);
|
|
145
|
+
obj[key] = value;
|
|
146
|
+
fs.writeFileSync(fullPath, JSON.stringify(obj, null, 2));
|
|
147
|
+
break;
|
|
148
|
+
}
|
|
149
|
+
case ".toml": {
|
|
150
|
+
const content = fs.readFileSync(fullPath, 'utf-8');
|
|
151
|
+
const obj = parseToml(content);
|
|
152
|
+
(obj as Record<string, any>)[key] = value;
|
|
153
|
+
fs.writeFileSync(fullPath, stringifyToml(obj));
|
|
154
|
+
break;
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
// 同步更新内存
|
|
158
|
+
(this.#data as Record<string, any>)[key] = value;
|
|
159
|
+
}
|
|
127
160
|
}
|
|
128
161
|
|
|
129
162
|
export namespace ConfigLoader {
|
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SchemaFeature — 插件配置 Schema 注册表
|
|
3
|
+
*
|
|
4
|
+
* 插件通过 declareConfig(key, schema) 声明配置项及其 Schema,
|
|
5
|
+
* SchemaFeature 全局收集后供 Web 控制台渲染配置编辑表单。
|
|
6
|
+
*
|
|
7
|
+
* 与 ConfigFeature 协作:
|
|
8
|
+
* - declareConfig 内部调用 addConfig(key, defaults) 写入默认值
|
|
9
|
+
* - Schema.toJSON() 传给前端驱动 PluginConfigForm
|
|
10
|
+
* - reloadable 标记决定保存后是否自动重载插件
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
import { Feature, FeatureJSON } from '../feature.js';
|
|
14
|
+
import { Schema } from '@zhin.js/schema';
|
|
15
|
+
import { Plugin, getPlugin } from '../plugin.js';
|
|
16
|
+
|
|
17
|
+
// ============================================================================
|
|
18
|
+
// 类型
|
|
19
|
+
// ============================================================================
|
|
20
|
+
|
|
21
|
+
export interface SchemaRecord {
|
|
22
|
+
/** 配置 key(对应 zhin.config.yml 中的顶级字段) */
|
|
23
|
+
key: string;
|
|
24
|
+
/** Schema 实例 */
|
|
25
|
+
schema: Schema;
|
|
26
|
+
/** 保存后是否支持热重载(http/database 等底层服务应为 false) */
|
|
27
|
+
reloadable: boolean;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export interface SchemaContextExtensions {
|
|
31
|
+
/**
|
|
32
|
+
* 声明插件配置 Schema
|
|
33
|
+
* @param key 配置 key,如 "rss"
|
|
34
|
+
* @param schema Schema.object({...}) 定义
|
|
35
|
+
* @param options.reloadable 保存后是否自动重载,默认 true
|
|
36
|
+
* @returns 当前配置值(已合并默认值)
|
|
37
|
+
*/
|
|
38
|
+
declareConfig<T extends Record<string, any>>(
|
|
39
|
+
key: string,
|
|
40
|
+
schema: Schema<T>,
|
|
41
|
+
options?: { reloadable?: boolean },
|
|
42
|
+
): Required<T>;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
declare module '../plugin.js' {
|
|
46
|
+
namespace Plugin {
|
|
47
|
+
interface Extensions extends SchemaContextExtensions {}
|
|
48
|
+
interface Contexts {
|
|
49
|
+
schema: SchemaFeature;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
// ============================================================================
|
|
55
|
+
// SchemaFeature
|
|
56
|
+
// ============================================================================
|
|
57
|
+
|
|
58
|
+
export class SchemaFeature extends Feature<SchemaRecord> {
|
|
59
|
+
readonly name = 'schema' as const;
|
|
60
|
+
readonly icon = 'FileCode';
|
|
61
|
+
readonly desc = '配置模型';
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* 按配置 key 查找 Schema
|
|
65
|
+
*/
|
|
66
|
+
getByKey(key: string): SchemaRecord | null {
|
|
67
|
+
return this.items.find(r => r.key === key) ?? null;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* 获取指定插件名注册的 Schema
|
|
72
|
+
*/
|
|
73
|
+
getByPluginName(pluginName: string): SchemaRecord | null {
|
|
74
|
+
const list = this.getByPlugin(pluginName);
|
|
75
|
+
return list.length > 0 ? list[0] : null;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* 获取某个 key 的 Schema 实例(WebSocket handler 使用)
|
|
80
|
+
*/
|
|
81
|
+
get(keyOrPlugin: string): Schema | null {
|
|
82
|
+
const byKey = this.getByKey(keyOrPlugin);
|
|
83
|
+
if (byKey) return byKey.schema;
|
|
84
|
+
const byPlugin = this.getByPluginName(keyOrPlugin);
|
|
85
|
+
return byPlugin?.schema ?? null;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* 判断某个 key 对应的插件是否支持热重载
|
|
90
|
+
*/
|
|
91
|
+
isReloadable(keyOrPlugin: string): boolean {
|
|
92
|
+
const byKey = this.getByKey(keyOrPlugin);
|
|
93
|
+
if (byKey) return byKey.reloadable;
|
|
94
|
+
const byPlugin = this.getByPluginName(keyOrPlugin);
|
|
95
|
+
return byPlugin?.reloadable ?? true;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* 通过 pluginName 获取对应的 config key
|
|
100
|
+
*/
|
|
101
|
+
resolveConfigKey(pluginName: string): string | null {
|
|
102
|
+
const byKey = this.getByKey(pluginName);
|
|
103
|
+
if (byKey) return byKey.key;
|
|
104
|
+
const byPlugin = this.getByPluginName(pluginName);
|
|
105
|
+
return byPlugin?.key ?? null;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
/**
|
|
109
|
+
* 返回 pluginName → configKey 的映射
|
|
110
|
+
*/
|
|
111
|
+
getPluginKeyMap(): Map<string, string> {
|
|
112
|
+
const map = new Map<string, string>();
|
|
113
|
+
for (const [pluginName, records] of this.pluginItems) {
|
|
114
|
+
if (records.length > 0) {
|
|
115
|
+
map.set(pluginName, records[0].key);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
return map;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
toJSON(pluginName?: string): FeatureJSON {
|
|
122
|
+
const list = pluginName ? this.getByPlugin(pluginName) : this.items;
|
|
123
|
+
return {
|
|
124
|
+
name: this.name,
|
|
125
|
+
icon: this.icon,
|
|
126
|
+
desc: this.desc,
|
|
127
|
+
count: list.length,
|
|
128
|
+
items: list.map(r => ({
|
|
129
|
+
name: r.key,
|
|
130
|
+
reloadable: r.reloadable,
|
|
131
|
+
schema: r.schema.toJSON(),
|
|
132
|
+
})),
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
get extensions() {
|
|
137
|
+
const feature = this;
|
|
138
|
+
return {
|
|
139
|
+
declareConfig<T extends Record<string, any>>(
|
|
140
|
+
key: string,
|
|
141
|
+
schema: Schema<T>,
|
|
142
|
+
options?: { reloadable?: boolean },
|
|
143
|
+
): Required<T> {
|
|
144
|
+
const plugin = getPlugin() as Plugin;
|
|
145
|
+
const reloadable = options?.reloadable ?? true;
|
|
146
|
+
|
|
147
|
+
// 从 Schema 提取默认值
|
|
148
|
+
const defaults = extractDefaults(schema);
|
|
149
|
+
|
|
150
|
+
// 注册到 ConfigFeature(写入 config.yml 的默认值)
|
|
151
|
+
if (typeof plugin.addConfig === 'function') {
|
|
152
|
+
plugin.addConfig(key, defaults);
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
// 注册到 SchemaFeature
|
|
156
|
+
const record: SchemaRecord = { key, schema, reloadable };
|
|
157
|
+
const dispose = feature.add(record, plugin.name);
|
|
158
|
+
plugin.recordFeatureContribution(feature.name, key);
|
|
159
|
+
plugin.onDispose(dispose);
|
|
160
|
+
|
|
161
|
+
// 读取当前配置并与默认值合并
|
|
162
|
+
const root = plugin.root ?? plugin;
|
|
163
|
+
const configService = root.inject('config') as any;
|
|
164
|
+
const appConfig = configService?.get?.('zhin.config.yml') ?? {};
|
|
165
|
+
const current = appConfig[key] ?? {};
|
|
166
|
+
|
|
167
|
+
return { ...defaults, ...current } as Required<T>;
|
|
168
|
+
},
|
|
169
|
+
};
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
// ============================================================================
|
|
174
|
+
// 辅助:从 Schema 提取默认值
|
|
175
|
+
// ============================================================================
|
|
176
|
+
|
|
177
|
+
function extractDefaults(schema: Schema): Record<string, any> {
|
|
178
|
+
const json = schema.toJSON();
|
|
179
|
+
const result: Record<string, any> = {};
|
|
180
|
+
|
|
181
|
+
const fields = json.object || json.properties || json.dict || {};
|
|
182
|
+
for (const [fieldKey, fieldSchema] of Object.entries(fields)) {
|
|
183
|
+
const field = fieldSchema as Record<string, any>;
|
|
184
|
+
if (field.default !== undefined) {
|
|
185
|
+
result[fieldKey] = field.default;
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
return result;
|
|
190
|
+
}
|
package/src/index.ts
CHANGED
|
@@ -26,6 +26,8 @@ export * from './built/ai-trigger.js'
|
|
|
26
26
|
export * from './built/dispatcher.js'
|
|
27
27
|
// Skill 系统 (AI 能力描述)
|
|
28
28
|
export * from './built/skill.js'
|
|
29
|
+
// Schema 注册表 (插件配置声明)
|
|
30
|
+
export * from './built/schema-feature.js'
|
|
29
31
|
// Common adapter tool factories (shared across adapters)
|
|
30
32
|
export * from './built/common-adapter-tools.js'
|
|
31
33
|
// AI 模块 (原 @zhin.js/ai,已合并至 core)
|