dsh-calorie 0.2.5 → 0.2.7
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/dist/bridge.d.ts +32 -0
- package/dist/bridge.d.ts.map +1 -1
- package/dist/bridge.js +33 -0
- package/dist/bridge.js.map +1 -1
- package/dist/client.js +420 -37
- package/dist/client.js.map +1 -1
- package/dist/config-defaults.d.ts +16 -0
- package/dist/config-defaults.d.ts.map +1 -0
- package/dist/config-defaults.js +94 -0
- package/dist/config-defaults.js.map +1 -0
- package/dist/contract.d.ts +33 -0
- package/dist/contract.d.ts.map +1 -1
- package/dist/contract.js +20 -0
- package/dist/contract.js.map +1 -1
- package/dist/dsh-ctx.d.ts +2 -0
- package/dist/dsh-ctx.d.ts.map +1 -1
- package/dist/index.d.ts +5 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +32 -12
- package/dist/index.js.map +1 -1
- package/dist/settings.d.ts +38 -8
- package/dist/settings.d.ts.map +1 -1
- package/dist/settings.js +143 -7
- package/dist/settings.js.map +1 -1
- package/package.json +3 -3
package/dist/bridge.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { ConfigSurfaceReply } from './contract.js';
|
|
1
2
|
export declare const SKILL_PACKAGE: "skill-calorie";
|
|
2
3
|
export declare const SKILL_CLI: "packages/skill-calorie/dist/cli/cmd_read.js";
|
|
3
4
|
export declare const HOST_CALL_METHOD: "ilife.calorie.read";
|
|
@@ -55,4 +56,35 @@ export declare function resolveNodeBin(execPath?: string): {
|
|
|
55
56
|
};
|
|
56
57
|
/** 同步取数:spawn 技能 cmd_read,返回 envelope data(缺失阻断)。 */
|
|
57
58
|
export declare function readViaCli(key: string, params?: Record<string, unknown>): unknown;
|
|
59
|
+
/** 设置页的三个配置 key。
|
|
60
|
+
*
|
|
61
|
+
* **唯一定义地是技能侧** `packages/skill-calorie/src/cli/config.ts` 的 `CONFIG_KEYS`
|
|
62
|
+
* (那里写了「插件侧镜像同值」);本处只是镜像,值改一处要两处一起改,
|
|
63
|
+
* 对齐由 `test/config-surface-676.test.mjs` 的源码文本锁死。
|
|
64
|
+
*
|
|
65
|
+
* 为什么走 CLI 而不在插件里读盘:单品插件的冻结边界是「只读消费技能 dist/CLI,纯 CLI 单轨」
|
|
66
|
+
* (`test/plugin-p10-boundaries.test.mjs`:单品不 import `base-*`、不 import `skill-*`,
|
|
67
|
+
* 必须经 host.call 与 spawn 到 cmd_read)。配置文件的读写实现住技能的 `src/config.ts`,
|
|
68
|
+
* 插件只经这三个 key 取用——同一份实现不抄第二处。
|
|
69
|
+
*/
|
|
70
|
+
export declare const CONFIG_READ_KEY: "calorie.config.read";
|
|
71
|
+
export declare const CONFIG_WRITE_KEY: "calorie.config.write";
|
|
72
|
+
export declare const CONFIG_RESET_KEY: "calorie.config.reset";
|
|
73
|
+
/** #706 配置体检:只读一条,回一份报告(判据由技能侧出,本包只透传,不重写一个字)。 */
|
|
74
|
+
export declare const CONFIG_CHECK_KEY: "calorie.config.check";
|
|
75
|
+
/** 设置页整面:文件在哪、数据在哪、当前值、是不是这次新建的(取自技能 `calorie.config.read`)。 */
|
|
76
|
+
export declare function readConfigSurface(): ConfigSurfaceReply;
|
|
77
|
+
/** 保存一份配置(技能侧按键覆盖,组里没给的子项保留现值;写出去的是完整一份)。 */
|
|
78
|
+
export declare function writeConfigValues(values: Record<string, unknown>): {
|
|
79
|
+
path: string;
|
|
80
|
+
values: Record<string, unknown>;
|
|
81
|
+
};
|
|
82
|
+
/** 重置为默认(技能侧先另存 `<配置目录>/calorie.yaml.bak`)。 */
|
|
83
|
+
export declare function resetConfigToDefaults(): {
|
|
84
|
+
path: string;
|
|
85
|
+
backupPath: string | null;
|
|
86
|
+
};
|
|
87
|
+
/** 配置体检(#706):只读一份报告,面板侧**不校验也不重写**——形状的唯一真相在技能侧
|
|
88
|
+
* `packages/skill-calorie/src/health.ts`,认形状是面板的事(`packages/plugin-manager/src/health-contract.ts`)。 */
|
|
89
|
+
export declare function readConfigHealth(): unknown;
|
|
58
90
|
//# sourceMappingURL=bridge.d.ts.map
|
package/dist/bridge.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bridge.d.ts","sourceRoot":"","sources":["../src/bridge.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"bridge.d.ts","sourceRoot":"","sources":["../src/bridge.ts"],"names":[],"mappings":"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"}
|
package/dist/bridge.js
CHANGED
|
@@ -190,4 +190,37 @@ export function readViaCli(key, params = {}) {
|
|
|
190
190
|
throw new SkillBridgeError('fetch-failed', '缺失阻断取数,不返空:' + key);
|
|
191
191
|
return env.data;
|
|
192
192
|
}
|
|
193
|
+
/** 设置页的三个配置 key。
|
|
194
|
+
*
|
|
195
|
+
* **唯一定义地是技能侧** `packages/skill-calorie/src/cli/config.ts` 的 `CONFIG_KEYS`
|
|
196
|
+
* (那里写了「插件侧镜像同值」);本处只是镜像,值改一处要两处一起改,
|
|
197
|
+
* 对齐由 `test/config-surface-676.test.mjs` 的源码文本锁死。
|
|
198
|
+
*
|
|
199
|
+
* 为什么走 CLI 而不在插件里读盘:单品插件的冻结边界是「只读消费技能 dist/CLI,纯 CLI 单轨」
|
|
200
|
+
* (`test/plugin-p10-boundaries.test.mjs`:单品不 import `base-*`、不 import `skill-*`,
|
|
201
|
+
* 必须经 host.call 与 spawn 到 cmd_read)。配置文件的读写实现住技能的 `src/config.ts`,
|
|
202
|
+
* 插件只经这三个 key 取用——同一份实现不抄第二处。
|
|
203
|
+
*/
|
|
204
|
+
export const CONFIG_READ_KEY = 'calorie.config.read';
|
|
205
|
+
export const CONFIG_WRITE_KEY = 'calorie.config.write';
|
|
206
|
+
export const CONFIG_RESET_KEY = 'calorie.config.reset';
|
|
207
|
+
/** #706 配置体检:只读一条,回一份报告(判据由技能侧出,本包只透传,不重写一个字)。 */
|
|
208
|
+
export const CONFIG_CHECK_KEY = 'calorie.config.check';
|
|
209
|
+
/** 设置页整面:文件在哪、数据在哪、当前值、是不是这次新建的(取自技能 `calorie.config.read`)。 */
|
|
210
|
+
export function readConfigSurface() {
|
|
211
|
+
return readViaCli(CONFIG_READ_KEY, {});
|
|
212
|
+
}
|
|
213
|
+
/** 保存一份配置(技能侧按键覆盖,组里没给的子项保留现值;写出去的是完整一份)。 */
|
|
214
|
+
export function writeConfigValues(values) {
|
|
215
|
+
return readViaCli(CONFIG_WRITE_KEY, { values });
|
|
216
|
+
}
|
|
217
|
+
/** 重置为默认(技能侧先另存 `<配置目录>/calorie.yaml.bak`)。 */
|
|
218
|
+
export function resetConfigToDefaults() {
|
|
219
|
+
return readViaCli(CONFIG_RESET_KEY, {});
|
|
220
|
+
}
|
|
221
|
+
/** 配置体检(#706):只读一份报告,面板侧**不校验也不重写**——形状的唯一真相在技能侧
|
|
222
|
+
* `packages/skill-calorie/src/health.ts`,认形状是面板的事(`packages/plugin-manager/src/health-contract.ts`)。 */
|
|
223
|
+
export function readConfigHealth() {
|
|
224
|
+
return readViaCli(CONFIG_CHECK_KEY, {});
|
|
225
|
+
}
|
|
193
226
|
//# sourceMappingURL=bridge.js.map
|
package/dist/bridge.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bridge.js","sourceRoot":"","sources":["../src/bridge.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAC9D,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"bridge.js","sourceRoot":"","sources":["../src/bridge.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAC9D,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAGzC,MAAM,CAAC,MAAM,aAAa,GAAG,eAAwB,CAAC;AACtD,MAAM,CAAC,MAAM,SAAS,GAAG,6CAAsD,CAAC;AAChF,MAAM,CAAC,MAAM,gBAAgB,GAAG,oBAA6B,CAAC;AAC9D,MAAM,CAAC,MAAM,eAAe,GAAG,eAAwB,CAAC;AAExD,MAAM,CAAC,MAAM,oBAAoB,GAC/B,2DAA2D,CAAC;AAE9D;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,SAAkB,CAAC;AAClD,MAAM,CAAC,MAAM,gBAAgB,GAAG,qBAA8B,CAAC;AAO/D,yFAAyF;AACzF,MAAM,UAAU,qBAAqB;IACnC,OAAO,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,cAAc,CAAC,CAAC;AAC7E,CAAC;AAED,wDAAwD;AACxD,MAAM,UAAU,oBAAoB;IAClC,IAAI,CAAC;QACH,OAAO,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,aAAa,GAAG,eAAe,CAAC,CAAC;IACjF,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC,QAAQ,EAAE,EAAE,UAAU,EAAE,aAAa,EAAE,cAAc,CAAC,CAAC;IACrE,CAAC;AACH,CAAC;AAED,SAAS,cAAc,CAAC,IAAY;IAClC,IAAI,GAAW,CAAC;IAChB,IAAI,CAAC;QACH,GAAG,GAAG,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACnC,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,eAAe,GAAG,CAAC,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACnG,CAAC;IACD,IAAI,MAAe,CAAC;IACpB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAY,CAAC;IACtC,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,gBAAgB,GAAG,CAAC,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACpG,CAAC;IACD,MAAM,CAAC,GAAI,MAAmD,EAAE,OAAO,CAAC;IACxE,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,gCAAgC,EAAE,CAAC;IACvH,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;AAC3C,CAAC;AAED,gEAAgE;AAChE,MAAM,UAAU,qBAAqB,CAAC,IAIrC;IACC,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,IAAI,EAAE,UAAU,IAAI,qBAAqB,EAAE,CAAC;QAC/D,MAAM,SAAS,GAAG,IAAI,EAAE,SAAS,IAAI,oBAAoB,EAAE,CAAC;QAC5D,MAAM,IAAI,GACR,IAAI,EAAE,MAAM,IAAI,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,UAAU;YACpD,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC;YACpC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACjC,MAAM,CAAC,GAAG,cAAc,CAAC,UAAU,CAAC,CAAC;QACrC,MAAM,CAAC,GAAG,cAAc,CAAC,SAAS,CAAC,CAAC;QACpC,IAAI,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;YACf,IAAI,CAAC;gBACH,IAAI,CAAC,mDAAmD,GAAG,UAAU,GAAG,UAAU,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC;YACjG,CAAC;YAAC,MAAM,CAAC;gBACP,uBAAuB;YACzB,CAAC;QACH,CAAC;QACD,IAAI,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;YACf,IAAI,CAAC;gBACH,IAAI,CAAC,kDAAkD,GAAG,SAAS,GAAG,UAAU,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC;YAC/F,CAAC;YAAC,MAAM,CAAC;gBACP,cAAc;YAChB,CAAC;QACH,CAAC;QACD,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC,OAAO,IAAI,eAAe,EAAE,KAAK,EAAE,CAAC,CAAC,OAAO,IAAI,eAAe,EAAE,CAAC;IACvF,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,IAAI,CAAC;YACH,MAAM,IAAI,GACR,IAAI,EAAE,MAAM,IAAI,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,UAAU;gBACpD,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC;gBACpC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACjC,IAAI,CAAC,mDAAmD,GAAG,CAAC,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC3G,CAAC;QAAC,MAAM,CAAC;YACP,UAAU;QACZ,CAAC;QACD,OAAO,EAAE,MAAM,EAAE,eAAe,EAAE,KAAK,EAAE,eAAe,EAAE,CAAC;IAC7D,CAAC;AACH,CAAC;AAED,MAAM,OAAO,gBAAiB,SAAQ,KAAK;IAChC,IAAI,CAA+D;IAC5E,YAAY,IAA8B,EAAE,OAAe;QACzD,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,kBAAkB,CAAC;QAC/B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;CACF;AAED,SAAS,QAAQ;IACf,OAAO,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;AACzE,CAAC;AAED,4CAA4C;AAC5C,MAAM,CAAC,MAAM,aAAa,GAAG,sBAA+B,CAAC;AAE7D;;;6BAG6B;AAC7B,SAAS,eAAe;IACtB,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,aAAa,GAAG,eAAe,CAAC,CAAC;QACxF,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,aAAa,CAAC,CAAC;IAC/C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC,QAAQ,EAAE,EAAE,SAAS,CAAC,CAAC;IACrC,CAAC;AACH,CAAC;AAED,MAAM,UAAU,OAAO;IACrB,OAAO,eAAe,EAAE,CAAC;AAC3B,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,IAAa;IAC5C,MAAM,CAAC,GAAG,IAAI,IAAI,OAAO,EAAE,CAAC;IAC5B,IAAI,CAAC;QACH,UAAU,CAAC,CAAC,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC;IAChC,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,gBAAgB,CAAC,aAAa,EAAE,iBAAiB,GAAG,CAAC,CAAC,CAAC;IACnE,CAAC;AACH,CAAC;AAED,uDAAuD;AACvD,MAAM,UAAU,cAAc,CAAC,GAAW,EAAE,SAAkC,EAAE;IAC9E,OAAO,UAAU,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;AACjC,CAAC;AAED,oCAAoC;AACpC,MAAM,UAAU,cAAc,CAAC,IAA+D,EAAE,GAAW,EAAE,SAAkC,EAAE;IAC/I,OAAO,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC,CAAC;AACtD,CAAC;AAED;kFACkF;AAClF,MAAM,CAAC,MAAM,gBAAgB,GAAG,MAAe,CAAC;AAEhD;oFACoF;AACpF,MAAM,UAAU,cAAc,CAAC,WAAmB,OAAO,CAAC,QAAQ;IAChE,IAAI,yBAAyB,CAAC,IAAI,CAAC,QAAQ,CAAC;QAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;IACrF,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,oBAAoB,EAAE,GAAG,EAAE,EAAE,CAAC;AACpE,CAAC;AAED,qDAAqD;AACrD,MAAM,UAAU,UAAU,CAAC,GAAW,EAAE,SAAkC,EAAE;IAC1E,mEAAmE;IACnE,yDAAyD;IACzD,IAAI,GAAG,KAAK,gBAAgB;QAAE,OAAO,qBAAqB,EAAE,CAAC;IAC7D,MAAM,GAAG,GAAG,OAAO,EAAE,CAAC;IACtB,gBAAgB,CAAC,GAAG,CAAC,CAAC;IACtB,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,cAAc,EAAE,CAAC;IACjD,MAAM,CAAC,GAAG,SAAS,CAAC,IAAI,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,gBAAgB,EAAE,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,GAAG,QAAQ,EAAE,EAAE,CAAC,CAAC;IACjK,IAAI,CAAC,CAAC,KAAK,EAAE,CAAC;QACZ,IAAK,CAAC,CAAC,KAA+B,EAAE,IAAI,KAAK,WAAW,EAAE,CAAC;YAC7D,MAAM,IAAI,gBAAgB,CAAC,cAAc,EAAE,MAAM,GAAG,MAAM,CAAC,gBAAgB,GAAG,IAAI,CAAC,GAAG,sCAAsC,CAAC,CAAC;QAChI,CAAC;QACD,MAAM,IAAI,gBAAgB,CAAC,cAAc,EAAE,cAAc,GAAI,CAAC,CAAC,KAAe,CAAC,OAAO,CAAC,CAAC;IAC1F,CAAC;IACD,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACnB,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC;QACnE,MAAM,IAAI,gBAAgB,CAAC,cAAc,EAAE,QAAQ,GAAG,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC;IACxF,CAAC;IACD,IAAI,GAAsC,CAAC;IAC3C,IAAI,CAAC;QACH,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAsC,CAAC;IAC1E,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,gBAAgB,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;IACrD,CAAC;IACD,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,GAAG,KAAK,GAAG;QAAE,MAAM,IAAI,gBAAgB,CAAC,cAAc,EAAE,aAAa,CAAC,CAAC;IACvF,IAAI,GAAG,CAAC,IAAI,KAAK,IAAI,IAAI,GAAG,CAAC,IAAI,KAAK,SAAS;QAAE,MAAM,IAAI,gBAAgB,CAAC,cAAc,EAAE,aAAa,GAAG,GAAG,CAAC,CAAC;IACjH,OAAO,GAAG,CAAC,IAAI,CAAC;AAClB,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,qBAA8B,CAAC;AAC9D,MAAM,CAAC,MAAM,gBAAgB,GAAG,sBAA+B,CAAC;AAChE,MAAM,CAAC,MAAM,gBAAgB,GAAG,sBAA+B,CAAC;AAChE,kDAAkD;AAClD,MAAM,CAAC,MAAM,gBAAgB,GAAG,sBAA+B,CAAC;AAEhE,gEAAgE;AAChE,MAAM,UAAU,iBAAiB;IAC/B,OAAO,UAAU,CAAC,eAAe,EAAE,EAAE,CAAuB,CAAC;AAC/D,CAAC;AAED,6CAA6C;AAC7C,MAAM,UAAU,iBAAiB,CAAC,MAA+B;IAC/D,OAAO,UAAU,CAAC,gBAAgB,EAAE,EAAE,MAAM,EAAE,CAAsD,CAAC;AACvG,CAAC;AAED,+CAA+C;AAC/C,MAAM,UAAU,qBAAqB;IACnC,OAAO,UAAU,CAAC,gBAAgB,EAAE,EAAE,CAAgD,CAAC;AACzF,CAAC;AAED;yGACyG;AACzG,MAAM,UAAU,gBAAgB;IAC9B,OAAO,UAAU,CAAC,gBAAgB,EAAE,EAAE,CAAC,CAAC;AAC1C,CAAC"}
|
package/dist/client.js
CHANGED
|
@@ -37,6 +37,10 @@ window.__ModuleLoader__.load({
|
|
|
37
37
|
*/
|
|
38
38
|
const RPC_CHANNEL = "/ilife-calorie";
|
|
39
39
|
const RPC_ENDPOINT_READ = "read";
|
|
40
|
+
/** #676 配置端点:读设置页整面、保存一份取值、重置为默认。同走一条通道,靠端点名分发。 */
|
|
41
|
+
const RPC_ENDPOINT_CONFIG_GET = "config.get";
|
|
42
|
+
const RPC_ENDPOINT_CONFIG_SAVE = "config.save";
|
|
43
|
+
const RPC_ENDPOINT_CONFIG_RESET = "config.reset";
|
|
40
44
|
/** 面板默认读键(与 HITL 一致性对比同键)。 */
|
|
41
45
|
const DEFAULT_READ_KEY = "calorie.view.home";
|
|
42
46
|
/** 信封守卫:供 client 拆包前校验(port 拥有信封定义,守卫住 port)。 */
|
|
@@ -52,12 +56,132 @@ window.__ModuleLoader__.load({
|
|
|
52
56
|
const SKILL_PACKAGE = "skill-calorie";
|
|
53
57
|
//#endregion
|
|
54
58
|
//#region src/settings.ts
|
|
55
|
-
/**
|
|
56
|
-
const
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
59
|
+
/** 常用项:用户裁决三点的五项——改了就影响「库与产物落在哪、训记认不认你」,放页面上。 */
|
|
60
|
+
const COMMON = [
|
|
61
|
+
{
|
|
62
|
+
key: "db.dir",
|
|
63
|
+
title: "数据目录",
|
|
64
|
+
tier: "common",
|
|
65
|
+
control: "text",
|
|
66
|
+
hint: "库文件与各类产物的根目录。留空=按默认落点(配置目录下的 data/),也就是改造前那个位置。"
|
|
67
|
+
},
|
|
68
|
+
{
|
|
69
|
+
key: "db.name",
|
|
70
|
+
title: "库文件名",
|
|
71
|
+
tier: "common",
|
|
72
|
+
control: "text",
|
|
73
|
+
hint: "数据目录下的数据库文件名。改它等于换一个库,老数据留在旧文件里不会跟过来。"
|
|
74
|
+
},
|
|
75
|
+
{
|
|
76
|
+
key: "html.dir",
|
|
77
|
+
title: "HTML 产物目录名",
|
|
78
|
+
tier: "common",
|
|
79
|
+
control: "text",
|
|
80
|
+
hint: "数据目录下放交付页面的子目录名。改它之后新页面落新地方,旧页面留在原处。"
|
|
81
|
+
},
|
|
82
|
+
{
|
|
83
|
+
key: "photos.dir",
|
|
84
|
+
title: "照片目录",
|
|
85
|
+
tier: "common",
|
|
86
|
+
control: "text",
|
|
87
|
+
hint: "身材照的存放目录,绝对路径。留空=未配:读照片不报错,出 GIF 与写照片会被拦下。"
|
|
88
|
+
},
|
|
89
|
+
{
|
|
90
|
+
key: "xunji.key",
|
|
91
|
+
title: "训记 KEY",
|
|
92
|
+
tier: "common",
|
|
93
|
+
control: "text",
|
|
94
|
+
hint: "训记用的凭据。留空=没配,推送与回写会被拦下;它同时是敏感值,别贴给别人。"
|
|
95
|
+
}
|
|
96
|
+
];
|
|
97
|
+
/** 高级项:默认收起(13 项减常用 5 项=8 项)。改错了多半只是自己撞上麻烦,不确定就别动。 */
|
|
98
|
+
const ADVANCED = [
|
|
99
|
+
{
|
|
100
|
+
key: "photos.gifs",
|
|
101
|
+
title: "照片 GIF 子目录",
|
|
102
|
+
tier: "advanced",
|
|
103
|
+
control: "text",
|
|
104
|
+
hint: "照片目录下放 GIF 的子目录名。"
|
|
105
|
+
},
|
|
106
|
+
{
|
|
107
|
+
key: "xunji.stateDir",
|
|
108
|
+
title: "训记状态文件目录",
|
|
109
|
+
tier: "advanced",
|
|
110
|
+
control: "text",
|
|
111
|
+
hint: "限频记账点与同步游标放哪。留空=家目录下的 .mavis,也就是改造前那个位置。"
|
|
112
|
+
},
|
|
113
|
+
{
|
|
114
|
+
key: "xunji.catalog",
|
|
115
|
+
title: "训记动作库路径",
|
|
116
|
+
tier: "advanced",
|
|
117
|
+
control: "text",
|
|
118
|
+
hint: "动作名判定用哪份库。留空=用包内预置的那份,也就是改造前那个位置。"
|
|
119
|
+
},
|
|
120
|
+
{
|
|
121
|
+
key: "xunji.backfillDays",
|
|
122
|
+
title: "回写默认天数",
|
|
123
|
+
tier: "advanced",
|
|
124
|
+
control: "number",
|
|
125
|
+
hint: "从训记拉实绩时不带天数参数时的窗口,整数天。"
|
|
126
|
+
},
|
|
127
|
+
{
|
|
128
|
+
key: "land.scheduleCli",
|
|
129
|
+
title: "跨技能出口 · 作息",
|
|
130
|
+
tier: "advanced",
|
|
131
|
+
control: "text",
|
|
132
|
+
hint: "「落地训练」调作息那一步的入口文件。留空=按包布局算(改造前那个位置)。"
|
|
133
|
+
},
|
|
134
|
+
{
|
|
135
|
+
key: "land.memoCli",
|
|
136
|
+
title: "跨技能出口 · 备忘",
|
|
137
|
+
tier: "advanced",
|
|
138
|
+
control: "text",
|
|
139
|
+
hint: "「落地训练」调备忘那一步的入口文件,同上。"
|
|
140
|
+
},
|
|
141
|
+
{
|
|
142
|
+
key: "land.xunjiSeconds",
|
|
143
|
+
title: "训记调用限时(秒)",
|
|
144
|
+
tier: "advanced",
|
|
145
|
+
control: "number",
|
|
146
|
+
hint: "外部调训记超过这个秒数即 exit 4。机器慢就调大。"
|
|
147
|
+
},
|
|
148
|
+
{
|
|
149
|
+
key: "land.landSeconds",
|
|
150
|
+
title: "落地调用限时(秒)",
|
|
151
|
+
tier: "advanced",
|
|
152
|
+
control: "number",
|
|
153
|
+
hint: "落地训练那几步超过这个秒数即 exit 4,同上。"
|
|
154
|
+
}
|
|
155
|
+
];
|
|
156
|
+
/** 设置页的行表,顺序即页面顺序。 */
|
|
157
|
+
const CONFIG_ITEMS = [...COMMON, ...ADVANCED];
|
|
158
|
+
/** 常用项行数(页面上直接画出来的那些)。 */
|
|
159
|
+
const COMMON_ITEM_COUNT = COMMON.length;
|
|
160
|
+
/** 高级组标题与副文案。 */
|
|
161
|
+
const ADVANCED_GROUP_TITLE = "高级";
|
|
162
|
+
const ADVANCED_GROUP_NOTE = "不常改。留空=按默认落点(改造前那个位置),不确定就别动。";
|
|
163
|
+
/** 按 `a.b` 路径从配置取值里读(缺层或类型不符一律回 undefined)。 */
|
|
164
|
+
function readPath(values, key) {
|
|
165
|
+
const parts = key.split(".");
|
|
166
|
+
let cur = values;
|
|
167
|
+
for (const part of parts) {
|
|
168
|
+
if (typeof cur !== "object" || cur === null || Array.isArray(cur)) return void 0;
|
|
169
|
+
cur = cur[part];
|
|
170
|
+
}
|
|
171
|
+
return cur;
|
|
172
|
+
}
|
|
173
|
+
/** 按 `a.b` 路径把值写进配置取值(中间层缺就建一层空组;已存在非组即覆盖成组)。 */
|
|
174
|
+
function writePath(values, key, value) {
|
|
175
|
+
const parts = key.split(".");
|
|
176
|
+
let cur = values;
|
|
177
|
+
for (let i = 0; i < parts.length - 1; i++) {
|
|
178
|
+
const part = parts[i];
|
|
179
|
+
const next = cur[part];
|
|
180
|
+
if (typeof next !== "object" || next === null || Array.isArray(next)) cur[part] = {};
|
|
181
|
+
cur = cur[part];
|
|
182
|
+
}
|
|
183
|
+
cur[parts[parts.length - 1]] = value;
|
|
184
|
+
}
|
|
61
185
|
//#endregion
|
|
62
186
|
//#region src/client.ts
|
|
63
187
|
/** dsh-calorie client 适配器(六边形:port=contract+dsh-ctx 镜像,adapter=本文件)。
|
|
@@ -76,6 +200,12 @@ window.__ModuleLoader__.load({
|
|
|
76
200
|
* connection.rpc.call 经闭包现取、betterSidebar 经 ctx.get 运行时取);
|
|
77
201
|
* 取数只经 connection.rpc.call 进 host 通道;缺席/错误纯条件渲染,不返空冒充。
|
|
78
202
|
* 组件 React.createElement 手写,不引入 JSX。
|
|
203
|
+
*
|
|
204
|
+
* #676:技能设置页从「只读设置行 + 状态读数」换成**真配置页**——行表来自 settings.ts,
|
|
205
|
+
* 取值来自宿主侧配置件(`config.get`/`config.save`/`config.reset` 三个端点)。
|
|
206
|
+
* 本文件仍禁 node:不读盘、不算默认值,默认值由宿主一并送来。
|
|
207
|
+
* 照 CONTEXT.md,「技能设置页」只配置、不干活:本页没有任何取数/记一餐入口,
|
|
208
|
+
* 状态读数也已移出(读数属技能功能页)。
|
|
79
209
|
*/
|
|
80
210
|
const inject = ["slots", "connection"];
|
|
81
211
|
/** 面板视觉(内联 style;颜色走 DSH 主题别名,深浅主题自适应,写死值只做回退)。 */
|
|
@@ -107,6 +237,10 @@ window.__ModuleLoader__.load({
|
|
|
107
237
|
color: "var(--dsw-alias-state-error-primary, #ff6b6b)",
|
|
108
238
|
fontSize: 13
|
|
109
239
|
},
|
|
240
|
+
okText: {
|
|
241
|
+
color: "var(--dsw-alias-state-success-primary, #12805c)",
|
|
242
|
+
fontSize: 12.5
|
|
243
|
+
},
|
|
110
244
|
rows: {
|
|
111
245
|
marginTop: 8,
|
|
112
246
|
borderTop: "1px solid var(--dsw-alias-border, rgba(128,128,128,.25))",
|
|
@@ -118,6 +252,67 @@ window.__ModuleLoader__.load({
|
|
|
118
252
|
borderTop: "1px dashed var(--dsw-alias-border, rgba(128,128,128,.25))",
|
|
119
253
|
color: "var(--dsw-alias-label-tertiary, #8a8a8a)",
|
|
120
254
|
fontSize: 12
|
|
255
|
+
},
|
|
256
|
+
info: {
|
|
257
|
+
margin: "6px 0 0",
|
|
258
|
+
font: "12px/1.5 ui-monospace,Consolas,monospace",
|
|
259
|
+
color: "var(--dsw-alias-label-secondary, #9a9a9a)",
|
|
260
|
+
wordBreak: "break-all"
|
|
261
|
+
},
|
|
262
|
+
row: { marginTop: 10 },
|
|
263
|
+
label: {
|
|
264
|
+
fontSize: 12.5,
|
|
265
|
+
fontWeight: 600
|
|
266
|
+
},
|
|
267
|
+
hint: {
|
|
268
|
+
color: "var(--dsw-alias-label-tertiary, #8a8a8a)",
|
|
269
|
+
fontSize: 11.5,
|
|
270
|
+
margin: "1px 0 4px"
|
|
271
|
+
},
|
|
272
|
+
input: {
|
|
273
|
+
width: "100%",
|
|
274
|
+
boxSizing: "border-box",
|
|
275
|
+
padding: "4px 8px",
|
|
276
|
+
borderRadius: 6,
|
|
277
|
+
border: "1px solid var(--dsw-alias-border, rgba(128,128,128,.45))",
|
|
278
|
+
background: "var(--dsw-alias-bg-base, transparent)",
|
|
279
|
+
color: "var(--dsw-alias-label-primary, inherit)",
|
|
280
|
+
font: "12.5px/1.5 ui-monospace,Consolas,monospace"
|
|
281
|
+
},
|
|
282
|
+
bar: {
|
|
283
|
+
marginTop: 14,
|
|
284
|
+
display: "flex",
|
|
285
|
+
gap: 8,
|
|
286
|
+
alignItems: "center",
|
|
287
|
+
flexWrap: "wrap"
|
|
288
|
+
},
|
|
289
|
+
btn: {
|
|
290
|
+
padding: "5px 14px",
|
|
291
|
+
borderRadius: 7,
|
|
292
|
+
border: "1px solid var(--dsw-alias-border, rgba(128,128,128,.45))",
|
|
293
|
+
background: "var(--dsw-alias-bg-base, transparent)",
|
|
294
|
+
color: "var(--dsw-alias-label-primary, inherit)",
|
|
295
|
+
fontSize: 12.5,
|
|
296
|
+
cursor: "pointer"
|
|
297
|
+
},
|
|
298
|
+
btnPrimary: {
|
|
299
|
+
padding: "5px 14px",
|
|
300
|
+
borderRadius: 7,
|
|
301
|
+
border: "1px solid var(--dsw-alias-brand-primary, #2f6fed)",
|
|
302
|
+
background: "var(--dsw-alias-brand-primary, #2f6fed)",
|
|
303
|
+
color: "#fff",
|
|
304
|
+
fontSize: 12.5,
|
|
305
|
+
cursor: "pointer"
|
|
306
|
+
},
|
|
307
|
+
adv: {
|
|
308
|
+
marginTop: 12,
|
|
309
|
+
paddingTop: 8,
|
|
310
|
+
borderTop: "1px solid var(--dsw-alias-border, rgba(128,128,128,.25))"
|
|
311
|
+
},
|
|
312
|
+
advSummary: {
|
|
313
|
+
cursor: "pointer",
|
|
314
|
+
fontSize: 12.5,
|
|
315
|
+
fontWeight: 600
|
|
121
316
|
}
|
|
122
317
|
};
|
|
123
318
|
/** #130 版本通道(host 侧动态读取已安装版本,client 纯渲染+unknown 降级)。
|
|
@@ -333,46 +528,150 @@ window.__ModuleLoader__.load({
|
|
|
333
528
|
skillVersion: versions.skill
|
|
334
529
|
}));
|
|
335
530
|
}
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
531
|
+
/** 配置面报错 → 人话指引。
|
|
532
|
+
*
|
|
533
|
+
* 报文由技能侧给出:base-link-core 的 `ConfigError` 已经带行号与文件名,技能
|
|
534
|
+
* `cli/config.ts` 原样交出来,插件 bridge 原样带上(`fetch-failed:出口非 0(1):<那一句>`)。
|
|
535
|
+
* 所以这里**不重写报文**,只按报错类补一句「接下来怎么办」——免得两处各写一套人话。
|
|
536
|
+
*/
|
|
537
|
+
function humanizeConfigFailure(code, message) {
|
|
538
|
+
const text = message.trim().length > 0 ? message.trim() : `(${code},宿主未给报文)`;
|
|
539
|
+
if (/解析|YAML|parse/i.test(text)) return `${text}\n改回「键: 值」的写法,或点「重置为默认」重来一份(重置会先留一份 .bak)。`;
|
|
540
|
+
if (/不认识|未知键|UNKNOWN_KEY/i.test(text)) return `${text}\n本页只认表里这些项;多余的行删掉,或点「重置为默认」。`;
|
|
541
|
+
if (/类型|TYPE_MISMATCH/i.test(text)) return `${text}\n按本页给的形状填(文本填文本、数字填数字),或点「重置为默认」。`;
|
|
542
|
+
if (/缺席|missing-cli/.test(text)) return `${text}\n技能出口没找着:先确认技能包已构建(packages/skill-calorie/dist/cli/cmd_read.js)。`;
|
|
543
|
+
return `${text}\n改不动就点「重置为默认」(会先留一份 .bak),或照报文里的路径手工改配置文件。`;
|
|
544
|
+
}
|
|
545
|
+
/** 一次配置 RPC(与 fetchRead 同通道、同超时纪律;永不抛,失败落字)。 */
|
|
546
|
+
async function configRpc(call, method, payload) {
|
|
547
|
+
if (typeof call !== "function") return {
|
|
548
|
+
ok: false,
|
|
549
|
+
message: "宿主连接缺席:connection.rpc.call 不可用"
|
|
550
|
+
};
|
|
551
|
+
try {
|
|
552
|
+
const raw = await withTimeout(call("/api", RPC_CHANNEL.slice(1), {
|
|
553
|
+
method,
|
|
554
|
+
payload
|
|
555
|
+
}, AbortSignal.timeout(READ_TIMEOUT_MS)), READ_TIMEOUT_MS);
|
|
556
|
+
if (!isRpcResult(raw)) return {
|
|
557
|
+
ok: false,
|
|
558
|
+
message: "回执信封异常(非 ok 信封)"
|
|
559
|
+
};
|
|
560
|
+
if (!raw.ok) return {
|
|
561
|
+
ok: false,
|
|
562
|
+
message: humanizeConfigFailure(raw.error?.code ?? "unknown", raw.error?.message ?? "")
|
|
563
|
+
};
|
|
564
|
+
return {
|
|
565
|
+
ok: true,
|
|
566
|
+
surface: raw.value
|
|
567
|
+
};
|
|
568
|
+
} catch (e) {
|
|
569
|
+
if (e instanceof Error && e.name === "AbortError") return {
|
|
570
|
+
ok: false,
|
|
571
|
+
message: `配置读取超时(${Math.round(READ_TIMEOUT_MS / 1e3)}s):宿主未回`
|
|
572
|
+
};
|
|
573
|
+
if (e instanceof Error && e.name === "TimeoutError") return {
|
|
574
|
+
ok: false,
|
|
575
|
+
message: e.message
|
|
576
|
+
};
|
|
577
|
+
return {
|
|
578
|
+
ok: false,
|
|
579
|
+
message: `配置失败:${e instanceof Error ? e.message : String(e)}`
|
|
580
|
+
};
|
|
581
|
+
}
|
|
582
|
+
}
|
|
583
|
+
/** 读设置页整面。 */
|
|
584
|
+
function fetchConfigSurface(call) {
|
|
585
|
+
return configRpc(call, RPC_ENDPOINT_CONFIG_GET, {});
|
|
341
586
|
}
|
|
342
|
-
/**
|
|
587
|
+
/** 保存(回全表)。 */
|
|
588
|
+
function saveConfigSurface(call, values) {
|
|
589
|
+
return configRpc(call, RPC_ENDPOINT_CONFIG_SAVE, { values });
|
|
590
|
+
}
|
|
591
|
+
/** 重置为默认(配置件先落 .bak)。 */
|
|
592
|
+
function resetConfigSurface(call) {
|
|
593
|
+
return configRpc(call, RPC_ENDPOINT_CONFIG_RESET, {});
|
|
594
|
+
}
|
|
595
|
+
/** 把配置取值铺成「行键 → 输入框文本」(页面表单态;值缺项即空串,不返空留白)。 */
|
|
596
|
+
function toDraft(values) {
|
|
597
|
+
const draft = {};
|
|
598
|
+
for (const item of CONFIG_ITEMS) {
|
|
599
|
+
const v = readPath(values, item.key);
|
|
600
|
+
draft[item.key] = v === void 0 || v === null ? "" : String(v);
|
|
601
|
+
}
|
|
602
|
+
return draft;
|
|
603
|
+
}
|
|
604
|
+
/** 表单态 → 配置取值(按控件种类还原类型;空串对文本项照收,语义由「未配」承担)。 */
|
|
605
|
+
function fromDraft(draft) {
|
|
606
|
+
const values = {};
|
|
607
|
+
for (const item of CONFIG_ITEMS) {
|
|
608
|
+
const raw = draft[item.key] ?? "";
|
|
609
|
+
const value = item.control === "number" ? Number(raw) : item.control === "switch" ? raw === "true" : raw;
|
|
610
|
+
writePath(values, item.key, item.control === "number" && !Number.isFinite(value) ? 0 : value);
|
|
611
|
+
}
|
|
612
|
+
return values;
|
|
613
|
+
}
|
|
614
|
+
/** 一行输入(三种控件对齐受限 YAML 子集:文本/数字/布尔)。 */
|
|
615
|
+
function Row(props) {
|
|
616
|
+
const { item } = props;
|
|
617
|
+
const onChange = (e) => props.onChange(item.key, e.target.value);
|
|
618
|
+
const control = item.control === "switch" ? react.createElement("input", {
|
|
619
|
+
type: "checkbox",
|
|
620
|
+
checked: props.value === "true",
|
|
621
|
+
disabled: props.disabled,
|
|
622
|
+
onChange: (e) => props.onChange(item.key, e.target.checked ? "true" : "false")
|
|
623
|
+
}) : react.createElement("input", {
|
|
624
|
+
style: S.input,
|
|
625
|
+
type: item.control === "number" ? "number" : "text",
|
|
626
|
+
value: props.value,
|
|
627
|
+
disabled: props.disabled,
|
|
628
|
+
spellCheck: false,
|
|
629
|
+
onChange
|
|
630
|
+
});
|
|
631
|
+
return react.createElement("div", { style: S.row }, react.createElement("div", { style: S.label }, item.title), react.createElement("div", { style: S.hint }, item.hint), control);
|
|
632
|
+
}
|
|
633
|
+
/** 技能设置页:承载卡路里自己的全部可配置项(只配置,不干活)。
|
|
634
|
+
*
|
|
635
|
+
* 三态:loading(一次 RPC 内)/ready(真表单)/failed(人话报错 + 指引,不返空、不转圈)。
|
|
636
|
+
* 没有任何干活入口——查数、记一餐在技能功能页(sidebar槽)。 */
|
|
343
637
|
function CalorieConfig(props) {
|
|
344
638
|
const [state, setState] = react.useState({ kind: "loading" });
|
|
639
|
+
const [draft, setDraft] = react.useState({});
|
|
640
|
+
const [busy, setBusy] = react.useState(false);
|
|
641
|
+
const [notice, setNotice] = react.useState(null);
|
|
642
|
+
const [error, setError] = react.useState(null);
|
|
345
643
|
const [versions, setVersions] = react.useState({
|
|
346
644
|
plugin: VERSION_UNKNOWN,
|
|
347
645
|
skill: VERSION_UNKNOWN
|
|
348
646
|
});
|
|
647
|
+
const load = react.useCallback(async () => {
|
|
648
|
+
setNotice(null);
|
|
649
|
+
setError(null);
|
|
650
|
+
const r = await fetchConfigSurface(props.getCall());
|
|
651
|
+
if (r.ok) {
|
|
652
|
+
setState({
|
|
653
|
+
kind: "ready",
|
|
654
|
+
surface: r.surface
|
|
655
|
+
});
|
|
656
|
+
setDraft(toDraft(r.surface.values));
|
|
657
|
+
} else setState({
|
|
658
|
+
kind: "failed",
|
|
659
|
+
message: r.message
|
|
660
|
+
});
|
|
661
|
+
}, [props.getCall]);
|
|
349
662
|
react.useEffect(() => {
|
|
350
663
|
let alive = true;
|
|
351
|
-
const date = todayString();
|
|
352
664
|
(async () => {
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
} catch (e) {
|
|
357
|
-
if (!alive) return;
|
|
665
|
+
const r = await fetchConfigSurface(props.getCall());
|
|
666
|
+
if (!alive) return;
|
|
667
|
+
if (r.ok) {
|
|
358
668
|
setState({
|
|
359
|
-
kind: "
|
|
360
|
-
|
|
669
|
+
kind: "ready",
|
|
670
|
+
surface: r.surface
|
|
361
671
|
});
|
|
362
|
-
|
|
363
|
-
}
|
|
364
|
-
|
|
365
|
-
if (r.ok) setState({
|
|
366
|
-
kind: "data",
|
|
367
|
-
date,
|
|
368
|
-
total: r.text
|
|
369
|
-
});
|
|
370
|
-
else if (r.absent) setState({
|
|
371
|
-
kind: "absent",
|
|
372
|
-
message: r.message
|
|
373
|
-
});
|
|
374
|
-
else setState({
|
|
375
|
-
kind: "error",
|
|
672
|
+
setDraft(toDraft(r.surface.values));
|
|
673
|
+
} else setState({
|
|
674
|
+
kind: "failed",
|
|
376
675
|
message: r.message
|
|
377
676
|
});
|
|
378
677
|
})();
|
|
@@ -393,8 +692,85 @@ window.__ModuleLoader__.load({
|
|
|
393
692
|
alive = false;
|
|
394
693
|
};
|
|
395
694
|
}, [props.getCall]);
|
|
396
|
-
const
|
|
397
|
-
|
|
695
|
+
const onChange = react.useCallback((key, next) => {
|
|
696
|
+
setDraft((prev) => ({
|
|
697
|
+
...prev,
|
|
698
|
+
[key]: next
|
|
699
|
+
}));
|
|
700
|
+
setNotice(null);
|
|
701
|
+
setError(null);
|
|
702
|
+
}, []);
|
|
703
|
+
const surface = state.kind === "ready" ? state.surface : null;
|
|
704
|
+
const dirty = surface !== null && CONFIG_ITEMS.some((i) => (draft[i.key] ?? "") !== (toDraft(surface.values)[i.key] ?? ""));
|
|
705
|
+
const onSave = react.useCallback(async () => {
|
|
706
|
+
setBusy(true);
|
|
707
|
+
setNotice(null);
|
|
708
|
+
setError(null);
|
|
709
|
+
const r = await saveConfigSurface(props.getCall(), fromDraft(draft));
|
|
710
|
+
setBusy(false);
|
|
711
|
+
if (r.ok) {
|
|
712
|
+
setState({
|
|
713
|
+
kind: "ready",
|
|
714
|
+
surface: r.surface
|
|
715
|
+
});
|
|
716
|
+
setDraft(toDraft(r.surface.values));
|
|
717
|
+
setNotice("已保存,立即生效(不用重启宿主)");
|
|
718
|
+
} else setError(r.message);
|
|
719
|
+
}, [draft, props.getCall]);
|
|
720
|
+
const onReset = react.useCallback(async () => {
|
|
721
|
+
setBusy(true);
|
|
722
|
+
setNotice(null);
|
|
723
|
+
setError(null);
|
|
724
|
+
const r = await resetConfigSurface(props.getCall());
|
|
725
|
+
setBusy(false);
|
|
726
|
+
if (r.ok) {
|
|
727
|
+
setState({
|
|
728
|
+
kind: "ready",
|
|
729
|
+
surface: r.surface
|
|
730
|
+
});
|
|
731
|
+
setDraft(toDraft(r.surface.values));
|
|
732
|
+
setNotice("已重置为默认(原配置已另存一份 .bak)");
|
|
733
|
+
} else setError(r.message);
|
|
734
|
+
}, [props.getCall]);
|
|
735
|
+
const head = react.createElement("div", null, react.createElement("div", { style: S.title }, `${SLOT_TITLE} · 配置`), surface !== null ? react.createElement("div", null, react.createElement("div", { style: S.info }, `配置文件 ${surface.path}`), react.createElement("div", { style: S.info }, `数据目录 ${surface.dataDir}`), surface.created ? react.createElement("div", { style: S.muted }, "(这份配置是刚按默认值建出来的)") : null) : null);
|
|
736
|
+
if (state.kind === "loading") return react.createElement("div", { style: S.card }, head, react.createElement("div", { style: S.muted }, "配置读取中…"));
|
|
737
|
+
if (state.kind === "failed") return react.createElement("div", { style: S.card }, react.createElement("div", { style: S.title }, `${SLOT_TITLE} · 配置`), react.createElement("div", { style: S.error }, state.message), react.createElement("div", { style: S.bar }, react.createElement("button", {
|
|
738
|
+
style: S.btn,
|
|
739
|
+
type: "button",
|
|
740
|
+
onClick: () => void load()
|
|
741
|
+
}, "重试"), react.createElement("button", {
|
|
742
|
+
style: S.btn,
|
|
743
|
+
type: "button",
|
|
744
|
+
onClick: () => void onReset()
|
|
745
|
+
}, "重置为默认")), react.createElement(VersionLine, {
|
|
746
|
+
pluginVersion: versions.plugin,
|
|
747
|
+
skillVersion: versions.skill
|
|
748
|
+
}));
|
|
749
|
+
const common = CONFIG_ITEMS.slice(0, COMMON_ITEM_COUNT);
|
|
750
|
+
const advanced = CONFIG_ITEMS.slice(COMMON_ITEM_COUNT);
|
|
751
|
+
const renderRow = (item) => react.createElement(Row, {
|
|
752
|
+
key: item.key,
|
|
753
|
+
item,
|
|
754
|
+
value: draft[item.key] ?? "",
|
|
755
|
+
disabled: busy,
|
|
756
|
+
onChange
|
|
757
|
+
});
|
|
758
|
+
return react.createElement("div", { style: S.card }, head, react.createElement("div", { style: S.rows }, common.map(renderRow)), react.createElement("details", { style: S.adv }, react.createElement("summary", { style: S.advSummary }, ADVANCED_GROUP_TITLE), react.createElement("div", { style: S.muted }, ADVANCED_GROUP_NOTE), advanced.map(renderRow)), react.createElement("div", { style: S.bar }, react.createElement("button", {
|
|
759
|
+
style: dirty ? S.btnPrimary : S.btn,
|
|
760
|
+
type: "button",
|
|
761
|
+
disabled: busy || !dirty,
|
|
762
|
+
onClick: () => void onSave()
|
|
763
|
+
}, busy ? "处理中…" : "保存"), react.createElement("button", {
|
|
764
|
+
style: S.btn,
|
|
765
|
+
type: "button",
|
|
766
|
+
disabled: busy,
|
|
767
|
+
onClick: () => void onReset()
|
|
768
|
+
}, "重置为默认"), react.createElement("button", {
|
|
769
|
+
style: S.btn,
|
|
770
|
+
type: "button",
|
|
771
|
+
disabled: busy,
|
|
772
|
+
onClick: () => void load()
|
|
773
|
+
}, "重新读取")), notice !== null ? react.createElement("div", { style: S.okText }, notice) : null, error !== null ? react.createElement("div", { style: S.error }, error) : null, react.createElement(VersionLine, {
|
|
398
774
|
pluginVersion: versions.plugin,
|
|
399
775
|
skillVersion: versions.skill
|
|
400
776
|
}));
|
|
@@ -405,7 +781,8 @@ window.__ModuleLoader__.load({
|
|
|
405
781
|
name: "ilife.config-tab",
|
|
406
782
|
id: "dsh-calorie",
|
|
407
783
|
order: 75,
|
|
408
|
-
label: () => SLOT_TITLE
|
|
784
|
+
label: () => SLOT_TITLE,
|
|
785
|
+
channel: RPC_CHANNEL
|
|
409
786
|
}, () => react.createElement(CalorieConfig, { getCall })));
|
|
410
787
|
const ensureWorkTab = () => {
|
|
411
788
|
try {
|
|
@@ -445,10 +822,16 @@ window.__ModuleLoader__.load({
|
|
|
445
822
|
exports.VERSION_UNKNOWN = VERSION_UNKNOWN;
|
|
446
823
|
exports.VersionLine = VersionLine;
|
|
447
824
|
exports.apply = apply;
|
|
825
|
+
exports.fetchConfigSurface = fetchConfigSurface;
|
|
448
826
|
exports.fetchVersions = fetchVersions;
|
|
449
827
|
exports.formatVersionLine = formatVersionLine;
|
|
828
|
+
exports.fromDraft = fromDraft;
|
|
829
|
+
exports.humanizeConfigFailure = humanizeConfigFailure;
|
|
450
830
|
exports.inject = inject;
|
|
451
831
|
exports.normalizeVersion = normalizeVersion;
|
|
832
|
+
exports.resetConfigSurface = resetConfigSurface;
|
|
833
|
+
exports.saveConfigSurface = saveConfigSurface;
|
|
834
|
+
exports.toDraft = toDraft;
|
|
452
835
|
return module.exports;
|
|
453
836
|
}
|
|
454
837
|
});
|