@aalis/schema-config 0.15.0 → 0.16.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 +30 -8
- package/dist/index.d.ts +140 -32
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +173 -83
- package/dist/index.js.map +1 -1
- package/dist/locales/en.d.ts +42 -0
- package/dist/locales/en.d.ts.map +1 -0
- package/dist/locales/en.js +42 -0
- package/dist/locales/en.js.map +1 -0
- package/dist/texts.d.ts +83 -0
- package/dist/texts.d.ts.map +1 -0
- package/dist/texts.js +45 -0
- package/dist/texts.js.map +1 -0
- package/package.json +6 -3
package/README.md
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
# @aalis/schema-config
|
|
2
2
|
|
|
3
|
-
配置表单 Schema 词汇契约包:`ConfigSchema` / `SchemaField` / `SchemaGroup` / `SchemaArray` 及 `SchemaFieldTypes` 扩展点;声明与读取插件配置的 `defineConfig` / `ConfigOf` / `parseConfig`;对这套词汇的中立解释函数 `defaultsFrom` / `deepMergeDefaults` / `validateConfig` / `removeExtraFields`,密钥引用的类型与工具 `SecretRef` / `isSecretRef` / `mapSecretFields` / `SecretPosition`,配置危险键闸与拷贝 `isUnsafeConfigKey` / `cloneConfigObject`,以及插件因配置问题无法激活时在 `apply` 里抛出的 `configError` / `missingConfigError`(后者用于缺必填项;name 为 `ConfigError`、不带 stack,激活失败日志只有一行,不像程序崩溃)。
|
|
3
|
+
配置表单 Schema 词汇契约包:`ConfigSchema` / `SchemaField` / `SchemaGroup` / `SchemaArray` 及 `SchemaFieldTypes` 扩展点;声明与读取插件配置的 `defineConfig` / `ConfigOf` / `parseConfig`;可按会话覆盖的字段 `SessionFieldSpec` / `SessionFieldsOf` / `isSessionField`,经 JSON 下发的 `WireSchemaField` / `WireConfigSchema`;对这套词汇的中立解释函数 `defaultsFrom` / `deepMergeDefaults` / `validateConfig` / `readFieldValue` / `removeExtraFields`,密钥引用的类型与工具 `SecretRef` / `isSecretRef` / `mapSecretFields` / `SecretPosition`,配置危险键闸与拷贝 `isUnsafeConfigKey` / `cloneConfigObject`,以及插件因配置问题无法激活时在 `apply` 里抛出的 `configError` / `missingConfigError`(后者用于缺必填项;name 为 `ConfigError`、不带 stack,激活失败日志只有一行,不像程序崩溃)。
|
|
4
4
|
|
|
5
5
|
`@aalis/core` 把插件的 `configSchema` 当作 opaque 数据透传、不解释任何字段;表单词汇(label / options / textarea …)属呈现层,统一住在本包。同一份 schema 既是表单描述,又是插件配置值类型的来源(`ConfigOf`)和运行时解析规则(`parseConfig`);渲染宿主(WebUI)与宿主政策(runtime 的配置同步)也用它消费 schema。
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
运行时只依赖同样零依赖的 `@aalis/schema-i18n`(给人看的文字是它的文字对象);对 `@aalis/core` 只有 type-only 锚点(以 peer 依赖声明)。字段类型可由其他 api 包经 declaration merging 扩展(如 `api-llm` 注入 `'llm-ref'`)。
|
|
8
8
|
|
|
9
9
|
## 声明与读取
|
|
10
10
|
|
|
@@ -38,9 +38,16 @@ export default definePlugin({
|
|
|
38
38
|
```
|
|
39
39
|
|
|
40
40
|
- **`defineConfig(schema)`**:运行时原样返回传入的对象(不冻结、不加任何属性,WebUI 读的就是这个活对象),类型层保留字面量,返回值可直接放进 `definePlugin({ configSchema })`。不要给变量标 `ConfigSchema` 类型注解,注解会把字面量拓宽掉,`ConfigOf` 只能推出宽类型。推出的类型里各属性只读、`options` 是字面量元组;需要在运行时改写 schema(如按已注册的服务补全选项)时,经 `ConfigSchema` 或 `SchemaField` 类型的引用改写。
|
|
41
|
-
- **`ConfigOf<S>`**:从 schema 推导配置值类型。字段取 `SchemaFieldTypes` 里登记的取值类型(见下表);select / multiselect 有静态 `options`、没有 `dynamicOptions` 且 `allowCustom` 不为 `true` 时收窄为选项值的字面量联合,数字选项对应数字字面量。有 `default` 或 `required: true`
|
|
41
|
+
- **`ConfigOf<S>`**:从 schema 推导配置值类型。字段取 `SchemaFieldTypes` 里登记的取值类型(见下表);select / multiselect 有静态 `options`、没有 `dynamicOptions` 且 `allowCustom` 不为 `true` 时收窄为选项值的字面量联合,数字选项对应数字字面量。有 `default` 或 `required: true` 的字段必定存在,其余为可选;分组推为嵌套对象,总是存在;数组推为元素类型的数组,元素按同一规则推导。带 `session` 的顶层字段不在其中(见下文「可按会话覆盖的字段」)。
|
|
42
42
|
- **`parseConfig(schema, raw, logger?)`**:按 schema 解析插件拿到的配置,返回 `ConfigOf` 类型的新对象,不改入参。之后的夹紧、跨字段约束等核对作用于返回值。
|
|
43
43
|
|
|
44
|
+
## 给人看的文字
|
|
45
|
+
|
|
46
|
+
- 字段、分组与数组的 `label`、`description` 和选项的 `label` 可以写字符串,也可以写 `@aalis/schema-i18n` 的文字对象(插件自己原文字典里的 `t('…')`),渲染宿主按读者语言渲染。`default` 是取值,不是文字。
|
|
47
|
+
- `validateConfig` 的每条问题带 `code`(`missing`、`type`、`not-option`、`pattern`、`format`、`integer`、`min`、`max`、`reserved-key`、`validate`)与原因的文字对象 `text`;`message` 是它的原文,日志用。
|
|
48
|
+
- `configError(message)` 收字符串或文字对象,收文字对象时挂上它(name 仍是 `ConfigError`),WebUI 按读者语言显示失败原因;`missingConfigError` 的说法本身是文字对象,`note` 同样可以是文字对象。
|
|
49
|
+
- 本包自己的字典(ns `@aalis/schema-config`)收核心配置表单(`CORE_CONFIG_SCHEMA`)、校验原因与配置错误的说法。
|
|
50
|
+
|
|
44
51
|
## 字段类型
|
|
45
52
|
|
|
46
53
|
本包内置的中立类型。「判定」一列是 `validateConfig` 与 `parseConfig` 共用的逐字段规则:
|
|
@@ -51,7 +58,7 @@ export default definePlugin({
|
|
|
51
58
|
| `number` | `number` | 有限数值;去掉首尾空白后非空、能完整解析为有限数的字符串按数字收;`min` / `max` / `integer` |
|
|
52
59
|
| `boolean` | `boolean` | 类型,不做转换 |
|
|
53
60
|
| `select` | 选项值的字面量联合,否则 `string` | 字符串或有限数字;有静态 `options`、没有 `dynamicOptions` 且 `allowCustom` 不为 `true` 时须是某个选项值 |
|
|
54
|
-
| `multiselect` | 选项值字面量联合的数组,否则 `string[]` | 数组;元素同 `select
|
|
61
|
+
| `multiselect` | 选项值字面量联合的数组,否则 `string[]` | 数组;元素同 `select`;按输入顺序保留。`ordered: true` 时先后有意义(如语言的先后):去掉重复项(按选项归位后的值比,不算问题),WebUI 给排序控件 |
|
|
55
62
|
| `list` | `string[]` | 数组,元素按字符串判定;有序,允许重复(如命令行参数) |
|
|
56
63
|
| `map` | `Record<string, string>` | 对象,每个值按字符串判定(如环境变量表) |
|
|
57
64
|
|
|
@@ -59,11 +66,26 @@ export default definePlugin({
|
|
|
59
66
|
- **`format`**:写宿主文件路径的 `string` / `textarea` 字段声明。`'absolute-path'` 只收绝对路径(`/…`、`C:\…` 或 `\\…`);`'executable'` 另收不含路径分隔符的命令名(按 PATH 查找),`C:foo` 这类带盘符的相对写法不算。判定忽略首尾空白,交给插件的值也去掉首尾空白;空串与只有空白都表示未填、不查(`required` 字段算缺失);只按写法判定、与宿主平台无关,Windows 形状的绝对路径在 POSIX 宿主上同样通过。配置里的相对路径没有可靠的基准(宿主进程的 cwd 不带语义),所以不收。
|
|
60
67
|
- **选项即取值范围**:选项按字符串比较,`parseConfig` 取选项声明的原值(WebUI 把数字选项存成字符串,读出时归位成数字)。
|
|
61
68
|
- **`dynamicOptions` / `allowCustom`**:两者影响取值判定,由本包声明。`dynamicOptions` 是动态选项来源的服务名(WebUI 经 webui-server 调该服务的 `listModels()` 或等价方法获取选项),声明后静态 `options` 不再是取值范围,只查取值是字符串或数字;`allowCustom` 表示接受选项之外的值,不查是否在选项内:WebUI 给 multiselect 提供手动输入;select 用它表示静态选项不全(例如由插件在运行时补全选项的字段)。
|
|
62
|
-
- **扩展字段类型**:api 包经 declaration merging 往 `SchemaFieldTypes` 登记类型名与取值类型(如 `'llm-ref': ModelRef`),`ConfigOf`
|
|
69
|
+
- **扩展字段类型**:api 包经 declaration merging 往 `SchemaFieldTypes` 登记类型名与取值类型(如 `'llm-ref': ModelRef`),`ConfigOf` 据此推导。本包不按类型校验外来类型的取值,只调字段自己的 `validate`(见下文):`validateConfig` 放行,`parseConfig` 除把 `''` 当作未配置外原样透传。
|
|
70
|
+
|
|
71
|
+
## 字段自己的校验与文字读写(`validate` / `fromText` / `toText`)
|
|
72
|
+
|
|
73
|
+
- **`validate(value)`**:合法返回 `undefined`,不合法返回原因(非空字符串或文字对象);抛错或返回别的值都按不合法,原因写「校验时出错」,不转述抛出的错。在类型与约束都过了之后调,拿换算后的取值(外来类型是原值)。`validateConfig` 报 `invalid`(`code` 为 `validate`),`parseConfig` 按无效处置(见下文),`readFieldValue` 给出原因。list、map、multiselect 有坏元素时,`validateConfig` 与 `readFieldValue` 只报元素、不调它,`parseConfig` 先丢坏元素、再拿剩下的值调它。外来类型的字段要核取值就写它。原因会原样进 `parseConfig` 的告警与拒绝激活的消息,不要在里面写取值(字段可能是密钥)。
|
|
74
|
+
- **`fromText(text)` / `toText(value)`**:文字与取值互换;内置类型不用写。
|
|
75
|
+
- 三者是进程内函数,schema 经 JSON 下发时没有;线上类型是 `WireSchemaField` / `WireConfigSchema`。
|
|
76
|
+
|
|
77
|
+
## 可按会话覆盖的字段(`session`)
|
|
78
|
+
|
|
79
|
+
顶层字段写了 `session`(声明 `SessionFieldSpec`,成员由 `@aalis/api-session-settings` 并入)即可按会话覆盖:插件经会话设置的读取器按会话读它,改了不重载插件。`isSessionField(entry)` 判一个顶层条目是不是这种字段(分组、数组上写了不算,分组与数组元素里的字段不按它判)。
|
|
80
|
+
|
|
81
|
+
- **`parseConfig`** 不交出这类字段、不补 `default`,配置里有这个键也不告警;`ConfigOf` 同样不含。
|
|
82
|
+
- **`SessionFieldsOf<S>`**:这类字段经读取器读到的值。取值类型同 `ConfigOf`,`onInvalid: 'error'` 的为 `unknown`(坏值原样交出,由插件核);有 `default` 的必定存在,没有的为可选。
|
|
83
|
+
- **`validateConfig`、`defaultsFrom`、`removeExtraFields`** 照常把它当 schema 字段:它的全局层就是配置文档里的值,作者默认照常写进文档。
|
|
84
|
+
- **`readFieldValue(field, value)`**:单个值的判定,与 `validateConfig` 同一套:合法给 `{ value }`(换算后的取值;没配置的给 `undefined`),不合法给 `{ invalid }`(集合里有坏元素也算)。不回落 `default`、不抛错、不拷贝。判的是取值,不是文档写法:密钥字段上的引用 `validateConfig` 放行,这里判为不合法。
|
|
63
85
|
|
|
64
86
|
## 密钥字段(`secret`)
|
|
65
87
|
|
|
66
|
-
`secret: true` 表示字段的值是凭据(API key、token、可能带账号密码的连接串),由本包声明,各宿主都按它处理:值不放在配置文档里,存进宿主的密钥存储(Node 宿主 `@aalis/runtime` 用家目录的 `secrets.yaml`),文档里只写引用 `{ $secret: '<键>' }`(类型 `SecretRef`),宿主把配置交给插件之前解析回原值,展示与回传都不给原值。标在 `map`、`list`
|
|
88
|
+
`secret: true` 表示字段的值是凭据(API key、token、可能带账号密码的连接串),由本包声明,各宿主都按它处理:值不放在配置文档里,存进宿主的密钥存储(Node 宿主 `@aalis/runtime` 用家目录的 `secrets.yaml`),文档里只写引用 `{ $secret: '<键>' }`(类型 `SecretRef`),宿主把配置交给插件之前解析回原值,展示与回传都不给原值。标在 `map`、`list` 等非标量字段上时整个值算一个密钥。本包只声明词汇,不读写密钥存储。
|
|
67
89
|
|
|
68
90
|
- **`isSecretRef(value)`**:是不是引用,即只有 `$secret` 一个自有键、值为非空字符串的纯对象。只在 `secret: true` 的字段上有这层含义。
|
|
69
91
|
- **`mapSecretFields(schema, config, fn)`**:逐个处理配置里密钥字段上的值(顶层、分组内、数组元素内;值为 `undefined` 的跳过),`fn` 收到值与位置 `SecretPosition`(`path` 是点号路径,数组元素里的不带下标;`inArray` 表示在数组元素里),`fn` 返回 `undefined` 时删掉这个键。不改入参:有改动时返回浅拷贝(没动到的部分与入参共享),没有改动时返回入参本身,调用方要改写结果请先复制。宿主拆出、解析密钥与给呈现方去掉密钥都用它。
|
|
@@ -74,8 +96,8 @@ export default definePlugin({
|
|
|
74
96
|
## parseConfig 的处置
|
|
75
97
|
|
|
76
98
|
- **缺失**:`undefined` 与 `null`(YAML 裸键);`required` 字段另把 `''` 当作缺失(WebUI 与脚手架用 `''` 表示未填;声明了 `format` 的只有空白也算),外来类型的 `''` 一律当作缺失(WebUI 给未选的 `llm-ref` 存 `''`)。有 `default` 用 `default` 的拷贝;无 `default` 且 `required` 不可恢复;否则省略该键。
|
|
77
|
-
-
|
|
78
|
-
- **list / map / multiselect
|
|
99
|
+
- **无效**(不符合上表的判定,或字段的 `validate` 判为不合法):未声明 `onInvalid` 时保持宽容处置:有 `default` 回落并告警;无 `default` 且 `required` 不可恢复;否则省略并告警。字段声明 `onInvalid: 'error'` 时,显式无效值即使有 `default` 也抛 `ConfigError`;它不改变 `required` 的缺省含义,`undefined` / `null` 仍走上述缺省规则。
|
|
100
|
+
- **list / map / multiselect**:默认坏元素、坏值逐个丢弃并告警,其余保留,剩下的值再过字段的 `validate`;稀疏数组的空位和 map 的保留键也属于坏成员。严格字段只要含一个坏成员就拒绝整个值,不返回部分结果。
|
|
79
101
|
- **分组**:值不是对象时默认告警,整组按空对象解析,子字段各取默认值。显式给非对象且分组含严格字段时拒绝;`undefined` / `null` 仍视为缺省。
|
|
80
102
|
- **数组**:值不是数组按无效处理,含严格元素字段时显式无效的数组值会被拒绝;元素不是对象、或元素内有不可恢复的字段时只丢这一条元素并告警,邻居元素照常解析;元素字段的默认值逐元素补齐(runtime 的配置同步不补数组元素的默认值)。
|
|
81
103
|
- **整体配置**:显式非对象且 schema 含严格字段时拒绝;`undefined` / `null` 仍视为缺省。严格错误说明字段路径与安全的类型或约束原因;集合的下标可定位,map 的键可能含密钥,因此错误只定位到 map 字段,不写用户值或键。
|
package/dist/index.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { type TextRef } from '@aalis/schema-i18n';
|
|
1
2
|
/**
|
|
2
3
|
* Schema 字段类型注册表 —— declaration merging 扩展点。
|
|
3
4
|
*
|
|
@@ -13,7 +14,8 @@
|
|
|
13
14
|
* }
|
|
14
15
|
* ```
|
|
15
16
|
*
|
|
16
|
-
*
|
|
17
|
+
* 外来类型的取值不经本包按类型校验,只过字段自己的 validate:parseConfig 除把 `''` 当作未配置外原样透传,
|
|
18
|
+
* value 只是类型层的声明。
|
|
17
19
|
*/
|
|
18
20
|
export interface SchemaFieldTypes {
|
|
19
21
|
string: string;
|
|
@@ -21,25 +23,33 @@ export interface SchemaFieldTypes {
|
|
|
21
23
|
boolean: boolean;
|
|
22
24
|
/** 有静态 options、没有 dynamicOptions 且 allowCustom 不为 true 时,ConfigOf 收窄为选项值的字面量联合 */
|
|
23
25
|
select: string;
|
|
24
|
-
/**
|
|
26
|
+
/**
|
|
27
|
+
* 选中的若干项,按输入顺序保留;声明了 ordered 的先后有意义且不重复。有静态 options、没有 dynamicOptions 且
|
|
28
|
+
* allowCustom 不为 true 时,ConfigOf 收窄为选项值字面量联合的数组
|
|
29
|
+
*/
|
|
25
30
|
multiselect: string[];
|
|
26
31
|
textarea: string;
|
|
27
|
-
/**
|
|
32
|
+
/** 有序字符串列表:保序、允许重复,不限可选项 */
|
|
28
33
|
list: string[];
|
|
29
34
|
/** 字符串映射,如环境变量表 */
|
|
30
35
|
map: Record<string, string>;
|
|
31
36
|
}
|
|
32
37
|
export type SchemaFieldType = keyof SchemaFieldTypes & string;
|
|
38
|
+
/** 可按会话覆盖的声明({@link SchemaField.session}):扩展点,成员由 @aalis/api-session-settings 经 declaration merging 并入 */
|
|
39
|
+
export interface SessionFieldSpec {
|
|
40
|
+
}
|
|
33
41
|
/**
|
|
34
42
|
* 单个配置字段。
|
|
35
43
|
*
|
|
36
44
|
* 声明各渲染宿主共需的字段、影响取值判定的属性(`dynamicOptions` / `allowCustom`)与各宿主都按它处理的
|
|
37
45
|
* `secret`;只影响单一宿主呈现的交互属性由消费它们的宿主 api 包通过 declaration merging 注入。
|
|
46
|
+
* 给人看的 label、description 与选项的 label 可以是字符串或文字对象(@aalis/schema-i18n),渲染宿主按读者语言渲染;
|
|
47
|
+
* default 是取值,不是文字。
|
|
38
48
|
*/
|
|
39
49
|
export interface SchemaField {
|
|
40
50
|
type: SchemaFieldType;
|
|
41
|
-
label: string;
|
|
42
|
-
description?: string;
|
|
51
|
+
label: string | TextRef;
|
|
52
|
+
description?: string | TextRef;
|
|
43
53
|
default?: unknown;
|
|
44
54
|
required?: boolean;
|
|
45
55
|
/** 显式配置的值无效时拒绝激活;缺省仍按 default / required 处理,省略时保持宽容回落 */
|
|
@@ -49,7 +59,7 @@ export interface SchemaField {
|
|
|
49
59
|
* 值按字符串与选项值比较,parseConfig 取选项声明的原值(数字选项存成字符串也能归位)
|
|
50
60
|
*/
|
|
51
61
|
options?: Array<{
|
|
52
|
-
label: string;
|
|
62
|
+
label: string | TextRef;
|
|
53
63
|
value: string | number;
|
|
54
64
|
}>;
|
|
55
65
|
/**
|
|
@@ -62,6 +72,11 @@ export interface SchemaField {
|
|
|
62
72
|
* WebUI 只给 multiselect 提供手动输入;select 用它表示静态选项不全(例如由插件在运行时补全选项的字段)
|
|
63
73
|
*/
|
|
64
74
|
allowCustom?: boolean;
|
|
75
|
+
/**
|
|
76
|
+
* multiselect:选中项的先后有意义(如语言的先后),呈现方据此给排序控件。为 true 时 validateConfig 与 parseConfig
|
|
77
|
+
* 去掉重复项(按选项归位后的值比),重复不算问题
|
|
78
|
+
*/
|
|
79
|
+
ordered?: boolean;
|
|
65
80
|
/** number:数值下限(含),validateConfig 与 parseConfig 强制。无 default 的 number 表单不预填(留空=走服务端默认),带 min 仍建议声明 default 以免长期处于缺失告警 */
|
|
66
81
|
min?: number;
|
|
67
82
|
/** number:数值上限(含),validateConfig 与 parseConfig 强制 */
|
|
@@ -86,9 +101,24 @@ export interface SchemaField {
|
|
|
86
101
|
* (Node 宿主是家目录的 `secrets.yaml`),文档里只写引用 {@link SecretRef},交给插件之前解析回原值;
|
|
87
102
|
* 展示与回传都不给原值。标在 map、list 上时整个值算一个密钥。插件照常经 parseConfig 读到原值;
|
|
88
103
|
* 引用没被宿主解析(键不在密钥存储里)时 parseConfig 拒绝激活,不回落默认值。
|
|
89
|
-
*
|
|
104
|
+
* `false` 与不写在运行时相同;仓内第一方的声明守卫要名字像凭据的字段写 `false` 表明判断过
|
|
90
105
|
*/
|
|
91
106
|
secret?: boolean;
|
|
107
|
+
/**
|
|
108
|
+
* 可按会话覆盖:宿主不交给插件的运行态配置,插件经会话设置的读取器读;改了不重载插件。只写在顶层字段上,
|
|
109
|
+
* 判定见 {@link isSessionField}
|
|
110
|
+
*/
|
|
111
|
+
session?: SessionFieldSpec;
|
|
112
|
+
/**
|
|
113
|
+
* 取值校验(进程内函数,经 JSON 下发时没有)。合法返回 undefined,不合法返回原因(非空字符串或文字对象);抛错或返回
|
|
114
|
+
* 别的值都按不合法,原因写「校验时出错」。在类型与约束键之后调,拿到的是换算后的取值(外来类型是原值);validateConfig、
|
|
115
|
+
* parseConfig 与 readFieldValue 都调它。原因会原样进告警与拒绝激活的消息,不要在里面写取值(字段可能是密钥)
|
|
116
|
+
*/
|
|
117
|
+
validate?(value: unknown): string | TextRef | undefined;
|
|
118
|
+
/** 文字读成取值;内置类型不用写 */
|
|
119
|
+
fromText?(text: string): unknown;
|
|
120
|
+
/** 取值写成文字;内置类型不用写 */
|
|
121
|
+
toText?(value: unknown): string;
|
|
92
122
|
}
|
|
93
123
|
/**
|
|
94
124
|
* 配置文档里密钥字段的值:指向宿主密钥存储里的一个键。几个字段可以指向同一个键。
|
|
@@ -113,15 +143,15 @@ export interface SecretPosition {
|
|
|
113
143
|
*/
|
|
114
144
|
export declare function mapSecretFields(schema: ConfigSchema | undefined, config: Record<string, unknown>, fn: (value: unknown, at: SecretPosition) => unknown): Record<string, unknown>;
|
|
115
145
|
export interface SchemaGroup {
|
|
116
|
-
label?: string;
|
|
117
|
-
description?: string;
|
|
146
|
+
label?: string | TextRef;
|
|
147
|
+
description?: string | TextRef;
|
|
118
148
|
fields: Record<string, SchemaField>;
|
|
119
149
|
}
|
|
120
150
|
/** 数组 Schema:对象数组,每个元素用 items 描述其字段结构 */
|
|
121
151
|
export interface SchemaArray {
|
|
122
152
|
type: 'array';
|
|
123
|
-
label: string;
|
|
124
|
-
description?: string;
|
|
153
|
+
label: string | TextRef;
|
|
154
|
+
description?: string | TextRef;
|
|
125
155
|
/** 数组每个元素的字段定义 */
|
|
126
156
|
items: Record<string, SchemaField>;
|
|
127
157
|
default?: unknown[];
|
|
@@ -130,6 +160,21 @@ export interface SchemaArray {
|
|
|
130
160
|
}
|
|
131
161
|
/** 配置 Schema:顶层 key 可以是字段、分组或数组 */
|
|
132
162
|
export type ConfigSchema = Record<string, SchemaField | SchemaGroup | SchemaArray>;
|
|
163
|
+
/** 经 JSON 下发的字段:去掉函数成员,session 原样保留 */
|
|
164
|
+
export type WireSchemaField = Omit<SchemaField, 'validate' | 'fromText' | 'toText'>;
|
|
165
|
+
/** 经 JSON 下发的 schema:同 {@link ConfigSchema},分组与数组元素里的字段也换成 {@link WireSchemaField} */
|
|
166
|
+
export type WireConfigSchema = Record<string, WireSchemaField | (Omit<SchemaGroup, 'fields'> & {
|
|
167
|
+
fields: Record<string, WireSchemaField>;
|
|
168
|
+
}) | (Omit<SchemaArray, 'items'> & {
|
|
169
|
+
items: Record<string, WireSchemaField>;
|
|
170
|
+
})>;
|
|
171
|
+
/**
|
|
172
|
+
* 顶层条目是不是可按会话覆盖的字段:是字段(不是分组、数组)且 session 不为 undefined。只对 configSchema 的顶层条目问,
|
|
173
|
+
* 分组与数组元素里的字段不按它判
|
|
174
|
+
*/
|
|
175
|
+
export declare function isSessionField(entry: unknown): entry is SchemaField & {
|
|
176
|
+
session: SessionFieldSpec;
|
|
177
|
+
};
|
|
133
178
|
/**
|
|
134
179
|
* 声明插件的配置 schema:运行时原样返回传入的对象(不冻结、不加任何属性),类型层保留字面量,
|
|
135
180
|
* 供 {@link ConfigOf} 推出配置值类型。返回值可直接放进 `definePlugin({ configSchema })`。
|
|
@@ -143,17 +188,24 @@ export declare function defineConfig<const S extends ConfigSchema>(schema: S): S
|
|
|
143
188
|
type Flatten<T> = {
|
|
144
189
|
[K in keyof T]: T[K];
|
|
145
190
|
} & {};
|
|
191
|
+
/** 条目声明了 K(不是 undefined) */
|
|
192
|
+
type Declares<E, K extends string> = E extends {
|
|
193
|
+
[P in K]: infer D;
|
|
194
|
+
} ? ([D] extends [undefined] ? false : true) : false;
|
|
146
195
|
/** parseConfig 成功后必定存在的条目:分组、required 字段、声明了 default 的字段与数组 */
|
|
147
196
|
type IsPresent<E> = E extends {
|
|
148
197
|
fields: unknown;
|
|
149
198
|
} ? true : E extends {
|
|
150
199
|
required: true;
|
|
151
|
-
} ? true : E
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
}
|
|
200
|
+
} ? true : Declares<E, 'default'>;
|
|
201
|
+
/** 带 session 的顶层字段的键({@link isSessionField} 的类型层):分组、数组上写了不算,写成 undefined 不算 */
|
|
202
|
+
type SessionKeys<S> = {
|
|
203
|
+
[K in keyof S]: S[K] extends {
|
|
204
|
+
fields: unknown;
|
|
205
|
+
} | {
|
|
206
|
+
type: 'array';
|
|
207
|
+
} ? never : Declares<S[K], 'session'> extends true ? K : never;
|
|
208
|
+
}[keyof S];
|
|
157
209
|
/** allowCustom 不是字面量 false 时按可能允许算:宽类型总是安全的 */
|
|
158
210
|
type AllowsCustom<E> = E extends {
|
|
159
211
|
allowCustom: infer A;
|
|
@@ -164,7 +216,7 @@ type StaticOptionValue<E> = E extends {
|
|
|
164
216
|
}>;
|
|
165
217
|
} ? V : never;
|
|
166
218
|
/** 有非空静态 options 且没有动态来源时收窄为选项值的字面量联合,否则取宽类型 */
|
|
167
|
-
type ChoiceValue<E> =
|
|
219
|
+
type ChoiceValue<E> = Declares<E, 'dynamicOptions'> extends true ? string : [StaticOptionValue<E>] extends [never] ? string : StaticOptionValue<E>;
|
|
168
220
|
type FieldValue<E> = E extends {
|
|
169
221
|
type: 'select';
|
|
170
222
|
} ? AllowsCustom<E> extends true ? string : ChoiceValue<E> : E extends {
|
|
@@ -174,21 +226,39 @@ type FieldValue<E> = E extends {
|
|
|
174
226
|
} ? SchemaFieldTypes[T] : unknown;
|
|
175
227
|
type EntryValue<E> = E extends {
|
|
176
228
|
fields: infer F extends ConfigSchema;
|
|
177
|
-
} ?
|
|
229
|
+
} ? EntriesOf<F> : E extends {
|
|
178
230
|
type: 'array';
|
|
179
231
|
items: infer I extends ConfigSchema;
|
|
180
|
-
} ?
|
|
232
|
+
} ? EntriesOf<I>[] : FieldValue<E>;
|
|
233
|
+
/** 各条目解析出的值:分组与数组元素也用它,带 session 的字段只在顶层由 ConfigOf 排除 */
|
|
234
|
+
type EntriesOf<S> = Flatten<{
|
|
235
|
+
-readonly [K in keyof S as IsPresent<S[K]> extends true ? K : never]: EntryValue<S[K]>;
|
|
236
|
+
} & {
|
|
237
|
+
-readonly [K in keyof S as IsPresent<S[K]> extends true ? never : K]?: EntryValue<S[K]>;
|
|
238
|
+
}>;
|
|
181
239
|
/**
|
|
182
240
|
* 从 schema 推导 {@link parseConfig} 返回的配置值类型(schema 须经 {@link defineConfig} 声明才保留字面量)。
|
|
183
241
|
*
|
|
184
242
|
* - 字段取 {@link SchemaFieldTypes} 里登记的取值类型;select / multiselect 见该注册表的说明
|
|
185
243
|
* - 有 default 或 `required: true` 的字段必定存在,其余为可选(parseConfig 省略未配置的键)
|
|
186
244
|
* - 分组推为嵌套对象,总是存在;数组推为元素类型的数组,元素按同一规则推导
|
|
245
|
+
* - 带 session 的顶层字段不在其中(parseConfig 不交出),见 {@link SessionFieldsOf}
|
|
187
246
|
*/
|
|
188
|
-
export type ConfigOf<S extends ConfigSchema> =
|
|
189
|
-
|
|
247
|
+
export type ConfigOf<S extends ConfigSchema> = EntriesOf<Omit<S, SessionKeys<S>>>;
|
|
248
|
+
/** 带 session 的字段经会话设置读到的值:严格字段的坏值原样交出、不往下回落,所以是 unknown */
|
|
249
|
+
type SessionValue<E> = E extends {
|
|
250
|
+
onInvalid: 'error';
|
|
251
|
+
} ? unknown : FieldValue<E>;
|
|
252
|
+
/**
|
|
253
|
+
* 从 schema 推导带 session 的顶层字段经会话设置的读取器读到的值(ConfigOf 不含的那部分)。
|
|
254
|
+
*
|
|
255
|
+
* - 取值类型同 ConfigOf;`onInvalid: 'error'` 的为 unknown,由插件自己核
|
|
256
|
+
* - 有 default 的必定存在,没有的为可选(哪层都没设时没有值)
|
|
257
|
+
*/
|
|
258
|
+
export type SessionFieldsOf<S extends ConfigSchema> = Flatten<{
|
|
259
|
+
[K in SessionKeys<S> as Declares<S[K], 'default'> extends true ? K : never]: SessionValue<S[K]>;
|
|
190
260
|
} & {
|
|
191
|
-
|
|
261
|
+
[K in SessionKeys<S> as Declares<S[K], 'default'> extends true ? never : K]?: SessionValue<S[K]>;
|
|
192
262
|
}>;
|
|
193
263
|
/**
|
|
194
264
|
* core 基础设施配置(name / logLevel / slowThresholdMs)的表单描述。
|
|
@@ -197,6 +267,11 @@ export type ConfigOf<S extends ConfigSchema> = Flatten<{
|
|
|
197
267
|
* 渲染宿主(webui-server 设置页)从这里取。
|
|
198
268
|
*/
|
|
199
269
|
export declare const CORE_CONFIG_SCHEMA: ConfigSchema;
|
|
270
|
+
/**
|
|
271
|
+
* 宿主配置里只在启动时读、改了要重启才生效的核心键:runtime 启动时读它们交给 core,WebUI 设置页据此标「重启后生效」。
|
|
272
|
+
* runtime 改了哪些键只在启动时读,同步改这一份。name 只是显示用的应用名称,保存即生效
|
|
273
|
+
*/
|
|
274
|
+
export declare const CORE_RESTART_KEYS: readonly string[];
|
|
200
275
|
/**
|
|
201
276
|
* 从 ConfigSchema 派生默认配置(密钥字段除外)。
|
|
202
277
|
*
|
|
@@ -218,28 +293,45 @@ export declare function defaultsFrom(schema: ConfigSchema | undefined): Record<s
|
|
|
218
293
|
* 宿主的配置同步与 WebUI 保存插件配置用同一个合并,两条路径写出的配置形状一致。
|
|
219
294
|
*/
|
|
220
295
|
export declare function deepMergeDefaults(defaults: Record<string, unknown>, current: Record<string, unknown>): Record<string, unknown>;
|
|
296
|
+
/**
|
|
297
|
+
* 校验问题的原因种类:
|
|
298
|
+
* - `missing`:必填却没配;
|
|
299
|
+
* - `type`:类型或形状不符(如期望字符串却是对象、期望数组却是字符串);
|
|
300
|
+
* - `not-option`:不是可选值;`pattern`:不匹配正则;`format`:路径的写法不符;
|
|
301
|
+
* - `integer`、`min`、`max`:数值约束;`reserved-key`:映射里用了保留键;
|
|
302
|
+
* - `validate`:字段自己的 validate 判为不合法(含它抛错)。
|
|
303
|
+
*/
|
|
304
|
+
export type SchemaIssueCode = 'missing' | 'type' | 'not-option' | 'pattern' | 'format' | 'integer' | 'min' | 'max' | 'reserved-key' | 'validate';
|
|
221
305
|
/**
|
|
222
306
|
* validateConfig 发现的单条问题。path 以点号/下标定位(如 `server.port`、`hosts[2]`)。
|
|
223
307
|
* kind 区分两类性质不同的问题,供调用方分级处置:
|
|
224
308
|
* - `missing`:必填字段未配置——"没配全",半成品配置的正常中间态;
|
|
225
309
|
* - `invalid`:值与声明的类型/形状不符——"配错了",任何时候都不该写入。
|
|
310
|
+
*
|
|
311
|
+
* 原因:code 给程序判断,text 是本包字典的文字对象(出口按读者语言渲染),message 是它的原文(日志用)。
|
|
226
312
|
*/
|
|
227
313
|
export interface SchemaIssue {
|
|
228
314
|
path: string;
|
|
229
315
|
message: string;
|
|
230
316
|
kind: 'missing' | 'invalid';
|
|
317
|
+
code: SchemaIssueCode;
|
|
318
|
+
text: TextRef;
|
|
231
319
|
}
|
|
232
|
-
/**
|
|
320
|
+
/**
|
|
321
|
+
* 字段类型是不是本包内置的:内置类型的取值经 validateConfig 与 parseConfig 按类型校验,外来类型(如 'llm-ref')的
|
|
322
|
+
* 只过字段的 validate
|
|
323
|
+
*/
|
|
233
324
|
export declare function isBuiltinFieldType(type: string): boolean;
|
|
234
325
|
/**
|
|
235
326
|
* 按 ConfigSchema 对配置做只读结构校验,返回问题清单(空数组 = 无问题)。
|
|
236
327
|
*
|
|
237
328
|
* 定位与边界:
|
|
238
329
|
* - **只读**:不转换、不回填、不裁剪——回填是 defaultsFrom,裁剪是 removeExtraFields,取值是 parseConfig。
|
|
239
|
-
* 逐字段判定与 parseConfig 共用同一份:这里报 invalid 的值,parseConfig
|
|
330
|
+
* 逐字段判定与 parseConfig 共用同一份:这里报 invalid 的值,parseConfig 会回落、忽略或拒绝(带 session 的顶层字段除外,
|
|
331
|
+
* parseConfig 不交出它)。
|
|
240
332
|
* 校验器出错的最大代价必须始终是"少一条警告",因此它对畸形 schema 不抛错。
|
|
241
|
-
* - **只解释本包的词汇**:type/required、约束键、影响取值的 dynamicOptions/allowCustom
|
|
242
|
-
* 宿主经 declaration merging
|
|
333
|
+
* - **只解释本包的词汇**:type/required、约束键、影响取值的 dynamicOptions/allowCustom、secret 与字段自己的 validate;
|
|
334
|
+
* 宿主经 declaration merging 注入的呈现属性一概不解读。带 session 的字段照常校验(它的全局层就在配置文档里)。
|
|
243
335
|
* - **校验的是文档**:`secret` 字段上的 {@link SecretRef} 算合法(值在宿主的密钥存储里),不查引用的键在不在。
|
|
244
336
|
* - **标量宽容**:期望字符串的位置(string/textarea、list 元素、map 值、选项比较)接受有限数字;
|
|
245
337
|
* 期望数字的位置接受去掉首尾空白后能完整解析为有限数的字符串。boolean 不做转换。
|
|
@@ -248,6 +340,8 @@ export declare function isBuiltinFieldType(type: string): boolean;
|
|
|
248
340
|
* - **约束键**:number 强制 min/max(含边界)与 integer,string/textarea 强制
|
|
249
341
|
* pattern(模式非法则跳过该检查)与 format(空串与只有空白不查);step 是纯 UI 提示不校验。约束只在类型
|
|
250
342
|
* 检查通过后评估——类型都不对时报类型错,不叠报约束错。
|
|
343
|
+
* - **validate**:类型与约束键都过了才调,拿换算后的取值;返回原因报 invalid(code 为 `validate`),抛错同样报,不外传。
|
|
344
|
+
* list、map、multiselect 有坏元素时只报元素、不调它:它拿到的会是剔掉坏元素的值,报的原因对不上文档里写的。
|
|
251
345
|
* - **list / map**:list 须为数组、map 须为对象,逐元素 / 逐值报错,路径形如 `args[1]`、`env.KEY`。
|
|
252
346
|
* - **宽容缺失**:undefined 与 null(YAML 裸键)视为"未配置",required 字段的 `''` 也算未配置(WebUI 与脚手架
|
|
253
347
|
* 用 `''` 表示未填,与 parseConfig 一致;声明了 format 的只有空白也算;空数组仍算已配置),仅在 required 且未声明 default 时报缺——顶层/分组的默认值在调用点已合并,数组元素的默认值
|
|
@@ -263,10 +357,12 @@ export declare function validateConfig(schema: ConfigSchema | undefined, config:
|
|
|
263
357
|
*
|
|
264
358
|
* - **缺失**:undefined 与 null;required 字段另把 `''` 当作缺失(WebUI 与脚手架用 `''` 表示未填;声明了 format 的
|
|
265
359
|
* 只有空白也算),外来类型的 `''` 一律当作缺失。有 default 用 default(拷贝),无 default 且 required 不可恢复,否则省略该键。
|
|
266
|
-
* - **无效**:逐字段判定与 validateConfig
|
|
360
|
+
* - **无效**:逐字段判定与 validateConfig 共用(标量宽容、选项即取值范围、约束键、字段的 validate)。
|
|
361
|
+
* list、map、multiselect 先丢坏元素,validate 判的是剩下的值。
|
|
267
362
|
* 默认有 default 回落并告警;无 default 且 required 不可恢复;否则省略并告警。
|
|
268
363
|
* `onInvalid: 'error'` 的字段遇到显式无效值或坏集合成员时,即使有 default 也不可恢复。
|
|
269
|
-
* - **外来类型**:除 `''`
|
|
364
|
+
* - **外来类型**:除 `''` 外原样透传,只过字段的 validate。
|
|
365
|
+
* - **带 session 的顶层字段**:不交出、不补 default,配置里有这个键也不告警(插件经会话设置的读取器读)。
|
|
270
366
|
* - **密钥字段**:宿主交给插件之前已把引用解析成原值;`secret` 字段上仍是 {@link SecretRef},说明引用的键不在
|
|
271
367
|
* 宿主的密钥存储里,一律不可恢复(不回落 default,数组元素里的也不只丢这一条),消息点名键名。owner 写了引用,
|
|
272
368
|
* 引用落空就是配置错误,回落默认值会悄悄连上别的东西(例如默认的本机数据库)。
|
|
@@ -277,11 +373,22 @@ export declare function validateConfig(schema: ConfigSchema | undefined, config:
|
|
|
277
373
|
* - **schema 外的键**:丢弃并告警。
|
|
278
374
|
* - **不可恢复**(顶层或分组内):缺失抛 {@link missingConfigError},无效抛 {@link configError},插件随之进 error 态。
|
|
279
375
|
*
|
|
280
|
-
*
|
|
376
|
+
* 告警只写路径、类型名与约束,不写原值(可能是密钥);默认值可以写。字段 validate 返回的原因原样写进去。
|
|
281
377
|
*/
|
|
282
378
|
export declare function parseConfig<S extends ConfigSchema>(schema: S, raw: unknown, logger?: {
|
|
283
379
|
warn(message: string): void;
|
|
284
380
|
}): ConfigOf<S>;
|
|
381
|
+
/**
|
|
382
|
+
* 单个字段对一个值的判定,与 validateConfig 同一套(类型、约束键、字段的 validate):合法给出换算后的取值,没配置的
|
|
383
|
+
* (undefined、null,外来类型与 required 字段的空串)给 `{ value: undefined }`;不合法给出原因,list、map、multiselect
|
|
384
|
+
* 里有元素不合法也算(取第一个)。不回落 default、不抛错,不拷贝(外来类型的值原样交出)。判的是取值本身:密钥字段上的
|
|
385
|
+
* 引用不像 validateConfig 那样按文档的写法放行
|
|
386
|
+
*/
|
|
387
|
+
export declare function readFieldValue(field: SchemaField, value: unknown): {
|
|
388
|
+
value: unknown;
|
|
389
|
+
} | {
|
|
390
|
+
invalid: TextRef;
|
|
391
|
+
};
|
|
285
392
|
/**
|
|
286
393
|
* 按 schema 键集裁掉未知字段。configSchema 是插件配置的**唯一声明来源**(默认值也从它派生),
|
|
287
394
|
* 所以它的键集就是完整的白名单:不在 schema 里的字段,要么是用户手写的错别字,
|
|
@@ -296,13 +403,14 @@ export declare function removeExtraFields(config: Record<string, unknown>, schem
|
|
|
296
403
|
*
|
|
297
404
|
* 实例照常转入 error 态,但这不是程序出错:core 的 DefaultLogger 对没有 stack 的错误只写「名称: 消息」,
|
|
298
405
|
* 激活失败日志因此只有一行,不像程序崩溃。缺必填项用 {@link missingConfigError}。
|
|
406
|
+
* 收文字对象时挂上它(schema-i18n 的 withText,name 不变),出口按读者语言显示,message 是它的原文。
|
|
299
407
|
*/
|
|
300
|
-
export declare function configError(message: string): Error;
|
|
408
|
+
export declare function configError(message: string | TextRef): Error;
|
|
301
409
|
/**
|
|
302
410
|
* 缺少必填配置时的 {@link configError}:消息点名缺的字段(`note` 是放在字段名后括号里的补充说明),并说明
|
|
303
411
|
* 填入后生效——WebUI 保存或配置文件热重载会重建实例、重试激活。
|
|
304
412
|
*/
|
|
305
|
-
export declare function missingConfigError(field: string, note?: string): Error;
|
|
413
|
+
export declare function missingConfigError(field: string, note?: string | TextRef): Error;
|
|
306
414
|
/** 配置层无合法含义、落到原型链的键(`__proto__` / `constructor` / `prototype`);宿主的配置文档按它拦 */
|
|
307
415
|
export declare function isUnsafeConfigKey(key: string): boolean;
|
|
308
416
|
export declare function cloneConfigObject(obj: Record<string, unknown>): Record<string, unknown>;
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|