dsh-life-pack 0.3.6 → 0.3.13

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.
@@ -0,0 +1,21 @@
1
+ /** 共用配置面板的公开门(**六家只 import 这一个子路径**:`dsh-life-pack/config-panel`)。
2
+ *
3
+ * 为什么需要它:卡片/行渲染/样式表/状态机分几份写(契约/取值与填值/视图/组件本体),
4
+ * 而 `package.json` 的 exports 一条子路径只能指一个文件。故设这一个门,把六家真要用的那几个名字
5
+ * 转出去;**不另开第二个出口**(没有第二消费方——将来真长出第二个用法再开)。
6
+ *
7
+ * 对外给的名字就是下面这几个,数得出来:
8
+ * ① `ConfigPanel`——面板组件本体(六家把它注册进爱生活页签槽);
9
+ * ② `Row`——一行怎么画(跨包锁要拿它当函数调);
10
+ * ③④ `ConfigControl`/`ConfigTier`——行表里两格的字面表;
11
+ * ⑤ `ConfigItem`——行表每一行的形状。
12
+ *
13
+ * **取值与填值的路径读写是内部实现**(`config-panel-value.ts`),不在这里出门:
14
+ * 它只经「取值/填值」两条被验,外面不需要自己拆一份配置取值。
15
+ *
16
+ * 本件不含实现、也不含判断,只做转出。
17
+ */
18
+ export { ConfigPanel } from './config-panel.js';
19
+ export { Row } from './config-panel-view.js';
20
+ export type { ConfigItem, ConfigControl, ConfigTier } from './config-panel-contract.js';
21
+ //# sourceMappingURL=config-panel-api.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-panel-api.d.ts","sourceRoot":"","sources":["../src/config-panel-api.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD,OAAO,EAAE,GAAG,EAAE,MAAM,wBAAwB,CAAC;AAE7C,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC"}
@@ -0,0 +1,20 @@
1
+ /** 共用配置面板的公开门(**六家只 import 这一个子路径**:`dsh-life-pack/config-panel`)。
2
+ *
3
+ * 为什么需要它:卡片/行渲染/样式表/状态机分几份写(契约/取值与填值/视图/组件本体),
4
+ * 而 `package.json` 的 exports 一条子路径只能指一个文件。故设这一个门,把六家真要用的那几个名字
5
+ * 转出去;**不另开第二个出口**(没有第二消费方——将来真长出第二个用法再开)。
6
+ *
7
+ * 对外给的名字就是下面这几个,数得出来:
8
+ * ① `ConfigPanel`——面板组件本体(六家把它注册进爱生活页签槽);
9
+ * ② `Row`——一行怎么画(跨包锁要拿它当函数调);
10
+ * ③④ `ConfigControl`/`ConfigTier`——行表里两格的字面表;
11
+ * ⑤ `ConfigItem`——行表每一行的形状。
12
+ *
13
+ * **取值与填值的路径读写是内部实现**(`config-panel-value.ts`),不在这里出门:
14
+ * 它只经「取值/填值」两条被验,外面不需要自己拆一份配置取值。
15
+ *
16
+ * 本件不含实现、也不含判断,只做转出。
17
+ */
18
+ export { ConfigPanel } from './config-panel.js';
19
+ export { Row } from './config-panel-view.js';
20
+ //# sourceMappingURL=config-panel-api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-panel-api.js","sourceRoot":"","sources":["../src/config-panel-api.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD,OAAO,EAAE,GAAG,EAAE,MAAM,wBAAwB,CAAC"}
@@ -0,0 +1,90 @@
1
+ /** 共用配置面板 · 契约:行表形状、配置面回执、几条两侧共用的常量。
2
+ *
3
+ * 为什么住这里:六个单品插件的设置页各有一份逐字相同的那套代码(卡片骨架/行渲染/样式表/
4
+ * 状态机/配置面三通电话约 3105 行)。本件是抽件之后的**唯一一处定义地**。
5
+ *
6
+ * 本件不认识任何一家能力:行表由调用方给,分支只能由行表数据与配置面回执决定,
7
+ * 里面不出现任何一个能力的名字(结构纪律「依赖方向」)。
8
+ *
9
+ * 对外只经 `config-panel-api.ts` 那一道门;本件自己不出门。
10
+ */
11
+ /** 分级:常用项直接画在页面上,其余进默认收起的「高级」组。 */
12
+ export type ConfigTier = 'common' | 'advanced';
13
+ /** 控件种类:只有这四种(目录是**字符串那一档的页面形态**——取值仍是串,只是多一个选目录的入口)。 */
14
+ export type ConfigControl = 'text' | 'number' | 'switch' | 'directory';
15
+ /** 设置页的一行:一个可配置项一行,写清它在配置文件里的键、页面上那一行的中文标题、分级、
16
+ * 控件种类、只读与否与人话指引。它是页面渲染的唯一依据(各家自己的那份住各自的 `settings.ts`)。 */
17
+ export interface ConfigItem {
18
+ /** 配置文件里的键路径,一层嵌套用 `.` 连接,例 `backup.dir`。 */
19
+ readonly key: string;
20
+ /** 页面上那一行的中文标题。 */
21
+ readonly title: string;
22
+ readonly tier: ConfigTier;
23
+ readonly control: ConfigControl;
24
+ /** 一行人话:这一项管什么、留空会怎样(一到两句,不写开发期口径)。 */
25
+ readonly hint: string;
26
+ /** **只读行**:页面上不给改,值只经技能侧解析后显示;改它要编辑配置文件。
27
+ * 只读行**不参与保存**(填值时跳过它,免得把显示用的绝对路径当成配置值写回去)。 */
28
+ readonly readonly?: boolean;
29
+ /** 只读行的**显示值来源**:回执 `resolved` 组里的哪一格。标了它 ⇒ 显示技能算好的绝对路径;
30
+ * 不标 ⇒ 显示配置文件里那个值本身(数字类只读项走这一档)。 */
31
+ readonly resolveFrom?: string;
32
+ /** 可改行的**落点来源**:这一行取值空着时,页面上拿回执里的哪一格当它显示的绝对路径。
33
+ * 取法先看回执 `resolved` 组同名格,再看回执顶层同名格(如 `dataDir`)——两种写法收成同一格。 */
34
+ readonly prefillFrom?: string;
35
+ }
36
+ /** 配置面整面回执:形状与各技能侧 `<技能>.config.read` 的 data 逐字段同形。
37
+ *
38
+ * 技能侧多带的格(各家自己的那几格)不写在这里:各家在附加块里自己认(回执形状的唯一定义地
39
+ * 在各家的 `contract.ts`)。本件只认下面这几格,因此里面不出现任何一个能力的名字。 */
40
+ export interface ConfigSurfaceReply {
41
+ /** 配置文件绝对路径。 */
42
+ readonly path: string;
43
+ /** 数据目录绝对路径。 */
44
+ readonly dataDir: string;
45
+ /** 本次是不是「文件不存在、按默认值落了一份」。 */
46
+ readonly created: boolean;
47
+ /** 当前取值(文件里的缺项按默认值补)。 */
48
+ readonly values: Record<string, unknown>;
49
+ /** 一组解析后的绝对路径,给只读行显示用;**可选**:装的是旧技能时这一格缺席。 */
50
+ readonly resolved?: Readonly<Record<string, string | undefined>>;
51
+ /** 按行键给的告警(#915 第二步):**只有技能侧真判出「这一格用不了」时才有这一格**;
52
+ * 缺席=这一行没问题,面板不亮任何东西。面板只原样画 `message`,不比较、不合成新句子。 */
53
+ readonly alerts?: Readonly<Record<string, ConfigRowAlert>> | undefined;
54
+ }
55
+ /** 技能侧报出的「这一格真用不了」:一句人话 + 故障码(面板只画 `message`,`code` 给判据与回执用)。 */
56
+ export interface ConfigRowAlert {
57
+ readonly code: string;
58
+ readonly message: string;
59
+ }
60
+ /** 面板对配置面的三通电话:读整面/保存一份取值/重置为默认。三个名字各家逐字相同,收在这里一处。 */
61
+ export declare const RPC_ENDPOINT_CONFIG_GET: "config.get";
62
+ export declare const RPC_ENDPOINT_CONFIG_SAVE: "config.save";
63
+ export declare const RPC_ENDPOINT_CONFIG_RESET: "config.reset";
64
+ /** 高级组标题与副文案(六家逐字相同,收在这里一处)。 */
65
+ export declare const ADVANCED_GROUP_TITLE: "\u9AD8\u7EA7";
66
+ export declare const ADVANCED_GROUP_NOTE: "\u4E0D\u5E38\u6539\u3002\u7559\u7A7A\uFF1D\u7528\u9ED8\u8BA4\u503C\u3002";
67
+ /** 请求超时毫秒:与宿主侧 SPAWN_TIMEOUT_MS 同级,界面永不无限转圈。 */
68
+ export declare const READ_TIMEOUT_MS: 20000;
69
+ /** 复制那一枚按钮就地变「已复制」之后,多久变回「复制」(定稿 v3 第三条:1.5 秒,不弹提示)。 */
70
+ export declare const COPY_FEEDBACK_MS: 1500;
71
+ /** 宿主给「这是哪一种目录选择能力」时用的那两格原语的名字(软依赖:按名字现取,缺席即没有入口)。 */
72
+ export declare const REMOTE_DIRECTORY_PICKER: "remote.directoryPicker";
73
+ /** 宿主在「这条路不给」时回的那个码(`directory-browser-state` 的 `openRowBrowser` 只照比不认名)。 */
74
+ export declare const DIRECTORY_PICKER_REFUSED: "directory-picker/unavailable";
75
+ /** 一次配置电话的失败格。 */
76
+ export interface RpcErrorFace {
77
+ readonly code?: string;
78
+ readonly message?: string;
79
+ }
80
+ /** 配置电话的信封(收或拒,永不抛)。 */
81
+ export type RpcReply = {
82
+ readonly ok: true;
83
+ readonly value: unknown;
84
+ } | {
85
+ readonly ok: false;
86
+ readonly error?: RpcErrorFace;
87
+ };
88
+ /** 信封守卫:拆包前校验(信封形状的定义地在这里)。 */
89
+ export declare function isRpcResult(raw: unknown): raw is RpcReply;
90
+ //# sourceMappingURL=config-panel-contract.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-panel-contract.d.ts","sourceRoot":"","sources":["../src/config-panel-contract.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,mCAAmC;AACnC,MAAM,MAAM,UAAU,GAAG,QAAQ,GAAG,UAAU,CAAC;AAE/C,yDAAyD;AACzD,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,QAAQ,GAAG,QAAQ,GAAG,WAAW,CAAC;AAEvE;6DAC6D;AAC7D,MAAM,WAAW,UAAU;IACzB,6CAA6C;IAC7C,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,mBAAmB;IACnB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAC1B,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC;IAChC,uCAAuC;IACvC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB;oDACgD;IAChD,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAC5B;yCACqC;IACrC,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B;oEACgE;IAChE,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;CAC/B;AAED;;;qDAGqD;AACrD,MAAM,WAAW,kBAAkB;IACjC,gBAAgB;IAChB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,gBAAgB;IAChB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,6BAA6B;IAC7B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,yBAAyB;IACzB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACzC,8CAA8C;IAC9C,QAAQ,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC;IACjE;0DACsD;IACtD,QAAQ,CAAC,MAAM,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC,GAAG,SAAS,CAAC;CACxE;AAED,iEAAiE;AACjE,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAED,sDAAsD;AACtD,eAAO,MAAM,uBAAuB,EAAG,YAAqB,CAAC;AAC7D,eAAO,MAAM,wBAAwB,EAAG,aAAsB,CAAC;AAC/D,eAAO,MAAM,yBAAyB,EAAG,cAAuB,CAAC;AAEjE,gCAAgC;AAChC,eAAO,MAAM,oBAAoB,EAAG,cAAa,CAAC;AAClD,eAAO,MAAM,mBAAmB,EAAG,0EAAuB,CAAC;AAE3D,gDAAgD;AAChD,eAAO,MAAM,eAAe,EAAG,KAAe,CAAC;AAE/C,wDAAwD;AACxD,eAAO,MAAM,gBAAgB,EAAG,IAAa,CAAC;AAE9C,sDAAsD;AACtD,eAAO,MAAM,uBAAuB,EAAG,wBAAiC,CAAC;AAEzE,6EAA6E;AAC7E,eAAO,MAAM,wBAAwB,EAAG,8BAAuC,CAAC;AAEhF,kBAAkB;AAClB,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,wBAAwB;AACxB,MAAM,MAAM,QAAQ,GAChB;IAAE,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAA;CAAE,GAC9C;IAAE,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,YAAY,CAAA;CAAE,CAAC;AAE1D,+BAA+B;AAC/B,wBAAgB,WAAW,CAAC,GAAG,EAAE,OAAO,GAAG,GAAG,IAAI,QAAQ,CAGzD"}
@@ -0,0 +1,32 @@
1
+ /** 共用配置面板 · 契约:行表形状、配置面回执、几条两侧共用的常量。
2
+ *
3
+ * 为什么住这里:六个单品插件的设置页各有一份逐字相同的那套代码(卡片骨架/行渲染/样式表/
4
+ * 状态机/配置面三通电话约 3105 行)。本件是抽件之后的**唯一一处定义地**。
5
+ *
6
+ * 本件不认识任何一家能力:行表由调用方给,分支只能由行表数据与配置面回执决定,
7
+ * 里面不出现任何一个能力的名字(结构纪律「依赖方向」)。
8
+ *
9
+ * 对外只经 `config-panel-api.ts` 那一道门;本件自己不出门。
10
+ */
11
+ /** 面板对配置面的三通电话:读整面/保存一份取值/重置为默认。三个名字各家逐字相同,收在这里一处。 */
12
+ export const RPC_ENDPOINT_CONFIG_GET = 'config.get';
13
+ export const RPC_ENDPOINT_CONFIG_SAVE = 'config.save';
14
+ export const RPC_ENDPOINT_CONFIG_RESET = 'config.reset';
15
+ /** 高级组标题与副文案(六家逐字相同,收在这里一处)。 */
16
+ export const ADVANCED_GROUP_TITLE = '高级';
17
+ export const ADVANCED_GROUP_NOTE = '不常改。留空=用默认值。';
18
+ /** 请求超时毫秒:与宿主侧 SPAWN_TIMEOUT_MS 同级,界面永不无限转圈。 */
19
+ export const READ_TIMEOUT_MS = 20_000;
20
+ /** 复制那一枚按钮就地变「已复制」之后,多久变回「复制」(定稿 v3 第三条:1.5 秒,不弹提示)。 */
21
+ export const COPY_FEEDBACK_MS = 1500;
22
+ /** 宿主给「这是哪一种目录选择能力」时用的那两格原语的名字(软依赖:按名字现取,缺席即没有入口)。 */
23
+ export const REMOTE_DIRECTORY_PICKER = 'remote.directoryPicker';
24
+ /** 宿主在「这条路不给」时回的那个码(`directory-browser-state` 的 `openRowBrowser` 只照比不认名)。 */
25
+ export const DIRECTORY_PICKER_REFUSED = 'directory-picker/unavailable';
26
+ /** 信封守卫:拆包前校验(信封形状的定义地在这里)。 */
27
+ export function isRpcResult(raw) {
28
+ if (typeof raw !== 'object' || raw === null)
29
+ return false;
30
+ return raw.ok === true || raw.ok === false;
31
+ }
32
+ //# sourceMappingURL=config-panel-contract.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-panel-contract.js","sourceRoot":"","sources":["../src/config-panel-contract.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAwDH,sDAAsD;AACtD,MAAM,CAAC,MAAM,uBAAuB,GAAG,YAAqB,CAAC;AAC7D,MAAM,CAAC,MAAM,wBAAwB,GAAG,aAAsB,CAAC;AAC/D,MAAM,CAAC,MAAM,yBAAyB,GAAG,cAAuB,CAAC;AAEjE,gCAAgC;AAChC,MAAM,CAAC,MAAM,oBAAoB,GAAG,IAAa,CAAC;AAClD,MAAM,CAAC,MAAM,mBAAmB,GAAG,cAAuB,CAAC;AAE3D,gDAAgD;AAChD,MAAM,CAAC,MAAM,eAAe,GAAG,MAAe,CAAC;AAE/C,wDAAwD;AACxD,MAAM,CAAC,MAAM,gBAAgB,GAAG,IAAa,CAAC;AAE9C,sDAAsD;AACtD,MAAM,CAAC,MAAM,uBAAuB,GAAG,wBAAiC,CAAC;AAEzE,6EAA6E;AAC7E,MAAM,CAAC,MAAM,wBAAwB,GAAG,8BAAuC,CAAC;AAahF,+BAA+B;AAC/B,MAAM,UAAU,WAAW,CAAC,GAAY;IACtC,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IAC1D,OAAQ,GAAwB,CAAC,EAAE,KAAK,IAAI,IAAK,GAAwB,CAAC,EAAE,KAAK,KAAK,CAAC;AACzF,CAAC"}
@@ -0,0 +1,68 @@
1
+ /** 共用配置面板 · 取值与填值半:一份配置取值 ↔ 一张表单态,外加脏基线、跟随键、人话报错与三通电话。
2
+ *
3
+ * 本件**不认识 React**,也不认识宿主:喂一份配置面回执与一张行表,它把「页面上每一行该显示什么」
4
+ * 算出来(取值),再把「表单态里哪几格真能改」还原成一份取值(填值)。因此它在 Node 里就能直测。
5
+ *
6
+ * 三条口径(照 #749 起的定稿):
7
+ * · **只读行显示技能算好的绝对值**(回执 `resolved` 组那一格):面板一个字都不算;回执缺那一格
8
+ * (旧技能)就显示空串,绝不编一条路径出来。
9
+ * · **可改行取值空着**时,直接把回执里那个落点绝对路径显示上去——用户不必自己拼路径。
10
+ * · **保存只提交真能改的行**:只读行显示的是绝对路径,把它当配置值写回去就是把「显示」当「配置」。
11
+ *
12
+ * 对外只经 `config-panel-api.ts` 那一道门;本件自己不出门。
13
+ */
14
+ import type { ConfigItem, ConfigSurfaceReply } from './config-panel-contract.js';
15
+ /** 取数口取用器:每次取数时现取(连接后到也不永久缺席)。 */
16
+ export type GetCall = () => unknown;
17
+ /** 取值要的那几格:配置取值本身,加上「落点来源」两处(回执顶层那一个与 `resolved` 组那一格)。 */
18
+ export interface DraftSource {
19
+ readonly values: Record<string, unknown>;
20
+ /** 回执顶层那个落点绝对路径(各家回执用 `dataDir` 这个名字)。 */
21
+ readonly dataDir?: string;
22
+ /** 回执 `resolved` 组:技能算好的一组绝对路径,按格名取。 */
23
+ readonly resolved?: Readonly<Record<string, string | undefined>>;
24
+ }
25
+ /** 按 `a.b` 路径从配置取值里读(缺层或类型不符一律回 undefined)。 */
26
+ export declare function readPath(values: Record<string, unknown>, key: string): unknown;
27
+ /** 按 `a.b` 路径把值写进配置取值(中间层缺就建一层空组;已存在非组即覆盖成组)。 */
28
+ export declare function writePath(values: Record<string, unknown>, key: string, value: unknown): void;
29
+ /** 把配置取值铺成「行键 → 控件里的文本」(页面表单态;值缺项即空串,不返空留白)。 */
30
+ export declare function toDraft(items: readonly ConfigItem[], values: Record<string, unknown>, source: DraftSource): Record<string, string>;
31
+ /** 表单态 → 配置取值(按控件种类还原类型;空串对文本项照收,语义由「按默认落点」承担)。
32
+ *
33
+ * **只读行不收**:它们显示的是技能算好的绝对路径,写回配置就是把「显示的路径」当成「配置值」——
34
+ * 保存只提交真能改的那些行,其余键由技能侧做组内合并保留现值。 */
35
+ export declare function fromDraft(items: readonly ConfigItem[], draft: Readonly<Record<string, string>>): Record<string, unknown>;
36
+ /** 可改行(脏基线只看这一档)。 */
37
+ export declare function editableItemsOf(items: readonly ConfigItem[]): readonly ConfigItem[];
38
+ /** 常用项与高级项按行表自己的分级切开(不再另要一个「常用几行」的数:那是同一件事的第二处定义)。 */
39
+ export declare function tiersOf(items: readonly ConfigItem[]): {
40
+ readonly common: readonly ConfigItem[];
41
+ readonly advanced: readonly ConfigItem[];
42
+ };
43
+ /** 脏键:表单态里与「刚读到的整面」不一致的**可改行**。
44
+ *
45
+ * 只读行不进来:它们显示的是技能算好的绝对路径,拿它当「改动」会让面板一打开就显示「未保存」。 */
46
+ export declare function dirtyKeysOf(items: readonly ConfigItem[], draft: Readonly<Record<string, string>>, baseline: Readonly<Record<string, string>>): readonly string[];
47
+ /** 跟随映射的缺省:没有映射就是「一行都不跟随」。 */
48
+ export declare function noFollowKeys(): readonly string[];
49
+ /** 配置面报错 → 人话指引。
50
+ *
51
+ * 报文由技能侧给出(`base-link-core` 的 `ConfigError` 已带行号与文件名,技能 `cli/config.ts`
52
+ * 原样交出,插件 bridge 原样带上),所以这里**不重写报文**,只按报错类补一句「接下来怎么办」。 */
53
+ export declare function humanizeConfigFailure(code: string, message: string): string;
54
+ /** 一次配置电话的结果(收整面/落字;永不抛)。 */
55
+ export type ConfigOutcome = {
56
+ readonly ok: true;
57
+ readonly surface: ConfigSurfaceReply;
58
+ } | {
59
+ readonly ok: false;
60
+ readonly message: string;
61
+ };
62
+ /** 读设置页整面。 */
63
+ export declare function fetchConfigSurface(call: unknown, channel: string): Promise<ConfigOutcome>;
64
+ /** 保存一份取值(回执只有 `{path, values}`,**不是**整面:写完要重新读一份整面)。 */
65
+ export declare function saveConfigSurface(call: unknown, channel: string, values: Record<string, unknown>): Promise<ConfigOutcome>;
66
+ /** 重置为默认(技能侧先落一份备份;回执同样不是整面,写完要重新读一份整面)。 */
67
+ export declare function resetConfigSurface(call: unknown, channel: string): Promise<ConfigOutcome>;
68
+ //# sourceMappingURL=config-panel-value.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-panel-value.d.ts","sourceRoot":"","sources":["../src/config-panel-value.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,190 @@
1
+ /** 共用配置面板 · 取值与填值半:一份配置取值 ↔ 一张表单态,外加脏基线、跟随键、人话报错与三通电话。
2
+ *
3
+ * 本件**不认识 React**,也不认识宿主:喂一份配置面回执与一张行表,它把「页面上每一行该显示什么」
4
+ * 算出来(取值),再把「表单态里哪几格真能改」还原成一份取值(填值)。因此它在 Node 里就能直测。
5
+ *
6
+ * 三条口径(照 #749 起的定稿):
7
+ * · **只读行显示技能算好的绝对值**(回执 `resolved` 组那一格):面板一个字都不算;回执缺那一格
8
+ * (旧技能)就显示空串,绝不编一条路径出来。
9
+ * · **可改行取值空着**时,直接把回执里那个落点绝对路径显示上去——用户不必自己拼路径。
10
+ * · **保存只提交真能改的行**:只读行显示的是绝对路径,把它当配置值写回去就是把「显示」当「配置」。
11
+ *
12
+ * 对外只经 `config-panel-api.ts` 那一道门;本件自己不出门。
13
+ */
14
+ import { RPC_ENDPOINT_CONFIG_GET, RPC_ENDPOINT_CONFIG_RESET, RPC_ENDPOINT_CONFIG_SAVE, READ_TIMEOUT_MS, isRpcResult, } from './config-panel-contract.js';
15
+ /** 按 `a.b` 路径从配置取值里读(缺层或类型不符一律回 undefined)。 */
16
+ export function readPath(values, key) {
17
+ const parts = key.split('.');
18
+ let cur = values;
19
+ for (const part of parts) {
20
+ if (typeof cur !== 'object' || cur === null || Array.isArray(cur))
21
+ return undefined;
22
+ cur = cur[part];
23
+ }
24
+ return cur;
25
+ }
26
+ /** 按 `a.b` 路径把值写进配置取值(中间层缺就建一层空组;已存在非组即覆盖成组)。 */
27
+ export function writePath(values, key, value) {
28
+ const parts = key.split('.');
29
+ let cur = values;
30
+ for (let i = 0; i < parts.length - 1; i++) {
31
+ const part = parts[i];
32
+ const next = cur[part];
33
+ if (typeof next !== 'object' || next === null || Array.isArray(next))
34
+ cur[part] = {};
35
+ cur = cur[part];
36
+ }
37
+ cur[parts[parts.length - 1]] = value;
38
+ }
39
+ /** 落点来源取一格:先看回执 `resolved` 组同名格,再看回执顶层同名格(两种写法收成同一格)。
40
+ *
41
+ * 顶层那一格为什么只认 `dataDir`:它是**技能算出来的生效数据目录**这个概念的格名,各家的回执
42
+ * 都叫它 `dataDir`;其余落点(照片目录、附件目录等)一律住在 `resolved` 组里。本件不猜别的名字。 */
43
+ function prefillValueOf(source, name) {
44
+ const fromResolved = source.resolved?.[name];
45
+ if (typeof fromResolved === 'string' && fromResolved !== '')
46
+ return fromResolved;
47
+ if (name === 'dataDir' && typeof source.dataDir === 'string' && source.dataDir !== '')
48
+ return source.dataDir;
49
+ return undefined;
50
+ }
51
+ /** 只读行显示什么:标了 `resolveFrom` ⇒ 回执 `resolved` 组那一格(技能算好的绝对路径);
52
+ * 没标 ⇒ 配置文件里那个值本身(数字类只读项走这一档:显示的是生效数字)。 */
53
+ function readonlyTextOf(item, raw, source) {
54
+ if (item.resolveFrom === undefined)
55
+ return raw;
56
+ const shown = source.resolved?.[item.resolveFrom];
57
+ return typeof shown === 'string' ? shown : '';
58
+ }
59
+ /** 把配置取值铺成「行键 → 控件里的文本」(页面表单态;值缺项即空串,不返空留白)。 */
60
+ export function toDraft(items, values, source) {
61
+ const draft = {};
62
+ for (const item of items) {
63
+ const v = readPath(values, item.key);
64
+ const raw = v === undefined || v === null ? '' : String(v);
65
+ if (item.readonly === true) {
66
+ draft[item.key] = readonlyTextOf(item, raw, source);
67
+ continue;
68
+ }
69
+ const fallback = item.prefillFrom === undefined ? undefined : prefillValueOf(source, item.prefillFrom);
70
+ draft[item.key] = raw === '' && fallback !== undefined ? fallback : raw;
71
+ }
72
+ return draft;
73
+ }
74
+ /** 表单态 → 配置取值(按控件种类还原类型;空串对文本项照收,语义由「按默认落点」承担)。
75
+ *
76
+ * **只读行不收**:它们显示的是技能算好的绝对路径,写回配置就是把「显示的路径」当成「配置值」——
77
+ * 保存只提交真能改的那些行,其余键由技能侧做组内合并保留现值。 */
78
+ export function fromDraft(items, draft) {
79
+ const values = {};
80
+ for (const item of items) {
81
+ if (item.readonly === true)
82
+ continue;
83
+ const raw = draft[item.key] ?? '';
84
+ if (item.control === 'number') {
85
+ const n = Number(raw);
86
+ writePath(values, item.key, Number.isFinite(n) ? n : 0);
87
+ }
88
+ else if (item.control === 'switch') {
89
+ writePath(values, item.key, raw === 'true');
90
+ }
91
+ else {
92
+ writePath(values, item.key, raw);
93
+ }
94
+ }
95
+ return values;
96
+ }
97
+ /** 可改行(脏基线只看这一档)。 */
98
+ export function editableItemsOf(items) {
99
+ return items.filter((item) => item.readonly !== true);
100
+ }
101
+ /** 常用项与高级项按行表自己的分级切开(不再另要一个「常用几行」的数:那是同一件事的第二处定义)。 */
102
+ export function tiersOf(items) {
103
+ return {
104
+ common: items.filter((item) => item.tier === 'common'),
105
+ advanced: items.filter((item) => item.tier === 'advanced'),
106
+ };
107
+ }
108
+ /** 脏键:表单态里与「刚读到的整面」不一致的**可改行**。
109
+ *
110
+ * 只读行不进来:它们显示的是技能算好的绝对路径,拿它当「改动」会让面板一打开就显示「未保存」。 */
111
+ export function dirtyKeysOf(items, draft, baseline) {
112
+ return editableItemsOf(items)
113
+ .filter((item) => (draft[item.key] ?? '') !== (baseline[item.key] ?? ''))
114
+ .map((item) => item.key);
115
+ }
116
+ /** 跟随映射的缺省:没有映射就是「一行都不跟随」。 */
117
+ export function noFollowKeys() {
118
+ return [];
119
+ }
120
+ /* 「写的值 ≠ 生效值」那支黄字已删(#915):面板手上只有「配置里写的」与「技能回执里的默认落点」
121
+ * 两个事实,凭这两个比字符串**判不出**值用不用得了——写的是相对路径、尾分隔符写法不同、大小写不同、
122
+ * 或者(本项目维护者自己的六份配置就是如此)写了一个完全正常、正在用的自定义目录,都会让两个字符串不等。
123
+ * 后果是那行黄字对合法值恒亮,还声称「现在生效的是 &lt;默认落点&gt;」——那是面板替技能侧下的判断,
124
+ * 而技能侧**有意不做隐式回落**(例 `packages/skill-bill/src/fetch/paths.ts:6`:「拒绝隐式写生产」)。
125
+ * 要恢复这一支,事实必须由技能侧给出(布尔 + 故障码 + 报文),面板只画、不比较。 */
126
+ /** 配置面报错 → 人话指引。
127
+ *
128
+ * 报文由技能侧给出(`base-link-core` 的 `ConfigError` 已带行号与文件名,技能 `cli/config.ts`
129
+ * 原样交出,插件 bridge 原样带上),所以这里**不重写报文**,只按报错类补一句「接下来怎么办」。 */
130
+ export function humanizeConfigFailure(code, message) {
131
+ const text = message.trim().length > 0 ? message.trim() : `(${code},宿主未给报文)`;
132
+ if (/解析|YAML|parse/i.test(text))
133
+ return `${text}\n改回「键: 值」的写法,或点「重置为默认」。`;
134
+ if (/不认识|未知键|UNKNOWN_KEY/i.test(text))
135
+ return `${text}\n删掉页面上没有的行,或点「重置为默认」。`;
136
+ if (/类型|TYPE_MISMATCH/i.test(text))
137
+ return `${text}\n按本页的控件形状填,或点「重置为默认」。`;
138
+ if (/缺席|missing-cli/i.test(text))
139
+ return `${text}\n技能出口没找到:先确认技能包已装好,再点「重新读取」。`;
140
+ return `${text}\n改不动就点「重置为默认」,或照上面那条路径手工改配置文件。`;
141
+ }
142
+ /** 有界等待:借平台 `AbortSignal.timeout` 的 abort 事件做**一次**超时拒绝。
143
+ *
144
+ * 为什么不自建定时器:本仓冻结边界是「无数据轮询」,而设置页等的是一次电话回执,不是轮询;
145
+ * 用平台自带的一次性超时既守住边界的本意,也把「不转圈」落到实处。同一个 signal 也交给传输,
146
+ * 双保险:它搭理 signal 就早收工,不理也有这一道兜底(桌面端自研传输会忽略 signal,见 #760)。 */
147
+ function withDeadline(promise, ms) {
148
+ const signal = AbortSignal.timeout(ms);
149
+ const limit = new Promise((_, reject) => {
150
+ signal.addEventListener('abort', () => {
151
+ const e = new Error(`配置请求超时(${Math.round(ms / 1000)}s):宿主未回`);
152
+ e.name = 'TimeoutError';
153
+ reject(e);
154
+ }, { once: true });
155
+ });
156
+ return Promise.race([promise, limit]);
157
+ }
158
+ /** 一次配置电话(走调用方给的那条通道,靠端点名分发;永不抛,失败落字)。 */
159
+ async function configRpc(call, channel, method, payload) {
160
+ if (typeof call !== 'function')
161
+ return { ok: false, message: '宿主连接缺席:connection.rpc.call 不可用' };
162
+ try {
163
+ const raw = await withDeadline(call('/api', channel.replace(/^\//, ''), { method, payload }, AbortSignal.timeout(READ_TIMEOUT_MS)), READ_TIMEOUT_MS);
164
+ if (!isRpcResult(raw))
165
+ return { ok: false, message: '回执信封异常(非 ok 信封)' };
166
+ if (!raw.ok) {
167
+ return { ok: false, message: humanizeConfigFailure(raw.error?.code ?? 'unknown', raw.error?.message ?? '') };
168
+ }
169
+ return { ok: true, surface: raw.value };
170
+ }
171
+ catch (e) {
172
+ if (e instanceof Error && (e.name === 'AbortError' || e.name === 'TimeoutError')) {
173
+ return { ok: false, message: `配置请求超时(${Math.round(READ_TIMEOUT_MS / 1000)}s):宿主未回` };
174
+ }
175
+ return { ok: false, message: `配置失败:${e instanceof Error ? e.message : String(e)}` };
176
+ }
177
+ }
178
+ /** 读设置页整面。 */
179
+ export function fetchConfigSurface(call, channel) {
180
+ return configRpc(call, channel, RPC_ENDPOINT_CONFIG_GET, {});
181
+ }
182
+ /** 保存一份取值(回执只有 `{path, values}`,**不是**整面:写完要重新读一份整面)。 */
183
+ export function saveConfigSurface(call, channel, values) {
184
+ return configRpc(call, channel, RPC_ENDPOINT_CONFIG_SAVE, { values });
185
+ }
186
+ /** 重置为默认(技能侧先落一份备份;回执同样不是整面,写完要重新读一份整面)。 */
187
+ export function resetConfigSurface(call, channel) {
188
+ return configRpc(call, channel, RPC_ENDPOINT_CONFIG_RESET, {});
189
+ }
190
+ //# sourceMappingURL=config-panel-value.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-panel-value.js","sourceRoot":"","sources":["../src/config-panel-value.ts"],"names":[],"mappings":"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"}