dsh-chef 0.2.0 → 0.2.1

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,56 @@
1
+ /** dsh-chef 端口(port):DSH 世界与私家大厨六边形之间的契约。
2
+ *
3
+ * browser 安全:零 node 导入。host 适配器(注册 RPC 通道)与 client 适配器(调用 RPC)
4
+ * 共用同一份定义。通道命名遵守宿主约束:单段且不等于 /api(见 cookbook「RPC 通道」)。
5
+ *
6
+ * 照 #56 卡路里/#677 记账样板同形:大厨插件原先**没有任何 RPC 通道**,本件是它第一份端口定义
7
+ * (#696:设置页要读改配置,走的就是这条通道)。
8
+ */
9
+ export declare const RPC_CHANNEL: "/ilife-chef";
10
+ /** #696 配置端点:读设置页整面、保存一份取值、重置为默认。同走一条通道,靠端点名分发。 */
11
+ export declare const RPC_ENDPOINT_CONFIG_GET: "config.get";
12
+ export declare const RPC_ENDPOINT_CONFIG_SAVE: "config.save";
13
+ export declare const RPC_ENDPOINT_CONFIG_RESET: "config.reset";
14
+ /** #706 配置体检端点:只读一次,回一份报告(判据由技能侧出,本包只透传,不重写一个字)。
15
+ *
16
+ * 端点名与技能侧那条只读命令同名(`chef.config.check`);报告形状的唯一真相在技能侧
17
+ * `packages/skill-chef/src/health.ts`,面板侧镜像在 `packages/plugin-manager/src/health-contract.ts`。 */
18
+ export declare const RPC_ENDPOINT_CONFIG_CHECK: "config.check";
19
+ /** 保存载荷:一份键值(键路径 → 值)。缺项由技能侧按默认值补齐,故只收用户真改的那些。 */
20
+ export interface SavePayload {
21
+ readonly values: Record<string, unknown>;
22
+ }
23
+ /** 保存载荷校验:形状不对返回 null,由调用方按 bad-request 回绝(不抛)。 */
24
+ export declare function parseSavePayload(raw: unknown): SavePayload | null;
25
+ /** 配置面回执:形状与技能侧 `chef.config.read` 的 data 逐字段同形(唯一定义地在那边的 cli/config.ts)。
26
+ *
27
+ * 这里不带默认值表——页面不猜默认值,「留空=按默认落点」由行文案说清,
28
+ * 「重置为默认」由技能侧 `chef.config.reset` 执行。
29
+ */
30
+ export interface ConfigSurfaceReply {
31
+ /** 配置文件绝对路径。 */
32
+ readonly path: string;
33
+ /** 数据目录绝对路径。 */
34
+ readonly dataDir: string;
35
+ /** 本次是不是「文件不存在、按默认值落了一份」。 */
36
+ readonly created: boolean;
37
+ /** 当前取值(文件里的缺项按默认值补)。 */
38
+ readonly values: Record<string, unknown>;
39
+ }
40
+ export interface RpcError {
41
+ readonly code: string;
42
+ readonly message: string;
43
+ readonly details: Record<string, unknown>;
44
+ }
45
+ export type RpcResult = {
46
+ readonly ok: true;
47
+ readonly value: unknown;
48
+ } | {
49
+ readonly ok: false;
50
+ readonly error: RpcError;
51
+ };
52
+ export declare function ok(value: unknown): RpcResult;
53
+ export declare function fail(code: string, message: string): RpcResult;
54
+ /** 信封守卫:供 client 拆包前校验(port 拥有信封定义,守卫住 port)。 */
55
+ export declare function isRpcResult(raw: unknown): raw is RpcResult;
56
+ //# sourceMappingURL=contract.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contract.d.ts","sourceRoot":"","sources":["../src/contract.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,eAAO,MAAM,WAAW,EAAG,aAAsB,CAAC;AAElD,mDAAmD;AACnD,eAAO,MAAM,uBAAuB,EAAG,YAAqB,CAAC;AAC7D,eAAO,MAAM,wBAAwB,EAAG,aAAsB,CAAC;AAC/D,eAAO,MAAM,yBAAyB,EAAG,cAAuB,CAAC;AACjE;;;kGAGkG;AAClG,eAAO,MAAM,yBAAyB,EAAG,cAAuB,CAAC;AAEjE,kDAAkD;AAClD,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC1C;AAED,mDAAmD;AACnD,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,OAAO,GAAG,WAAW,GAAG,IAAI,CAKjE;AAED;;;;GAIG;AACH,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;CAC1C;AAED,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC3C;AAED,MAAM,MAAM,SAAS,GACjB;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,EAAE,QAAQ,CAAA;CAAE,CAAC;AAErD,wBAAgB,EAAE,CAAC,KAAK,EAAE,OAAO,GAAG,SAAS,CAE5C;AAED,wBAAgB,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,SAAS,CAE7D;AAED,iDAAiD;AACjD,wBAAgB,WAAW,CAAC,GAAG,EAAE,OAAO,GAAG,GAAG,IAAI,SAAS,CAI1D"}
@@ -0,0 +1,41 @@
1
+ /** dsh-chef 端口(port):DSH 世界与私家大厨六边形之间的契约。
2
+ *
3
+ * browser 安全:零 node 导入。host 适配器(注册 RPC 通道)与 client 适配器(调用 RPC)
4
+ * 共用同一份定义。通道命名遵守宿主约束:单段且不等于 /api(见 cookbook「RPC 通道」)。
5
+ *
6
+ * 照 #56 卡路里/#677 记账样板同形:大厨插件原先**没有任何 RPC 通道**,本件是它第一份端口定义
7
+ * (#696:设置页要读改配置,走的就是这条通道)。
8
+ */
9
+ export const RPC_CHANNEL = '/ilife-chef';
10
+ /** #696 配置端点:读设置页整面、保存一份取值、重置为默认。同走一条通道,靠端点名分发。 */
11
+ export const RPC_ENDPOINT_CONFIG_GET = 'config.get';
12
+ export const RPC_ENDPOINT_CONFIG_SAVE = 'config.save';
13
+ export const RPC_ENDPOINT_CONFIG_RESET = 'config.reset';
14
+ /** #706 配置体检端点:只读一次,回一份报告(判据由技能侧出,本包只透传,不重写一个字)。
15
+ *
16
+ * 端点名与技能侧那条只读命令同名(`chef.config.check`);报告形状的唯一真相在技能侧
17
+ * `packages/skill-chef/src/health.ts`,面板侧镜像在 `packages/plugin-manager/src/health-contract.ts`。 */
18
+ export const RPC_ENDPOINT_CONFIG_CHECK = 'config.check';
19
+ /** 保存载荷校验:形状不对返回 null,由调用方按 bad-request 回绝(不抛)。 */
20
+ export function parseSavePayload(raw) {
21
+ if (typeof raw !== 'object' || raw === null || Array.isArray(raw))
22
+ return null;
23
+ const { values } = raw;
24
+ if (typeof values !== 'object' || values === null || Array.isArray(values))
25
+ return null;
26
+ return { values: values };
27
+ }
28
+ export function ok(value) {
29
+ return { ok: true, value };
30
+ }
31
+ export function fail(code, message) {
32
+ return { ok: false, error: { code, message, details: {} } };
33
+ }
34
+ /** 信封守卫:供 client 拆包前校验(port 拥有信封定义,守卫住 port)。 */
35
+ export function isRpcResult(raw) {
36
+ if (typeof raw !== 'object' || raw === null)
37
+ return false;
38
+ const okFlag = raw.ok;
39
+ return okFlag === true || okFlag === false;
40
+ }
41
+ //# sourceMappingURL=contract.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contract.js","sourceRoot":"","sources":["../src/contract.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,aAAsB,CAAC;AAElD,mDAAmD;AACnD,MAAM,CAAC,MAAM,uBAAuB,GAAG,YAAqB,CAAC;AAC7D,MAAM,CAAC,MAAM,wBAAwB,GAAG,aAAsB,CAAC;AAC/D,MAAM,CAAC,MAAM,yBAAyB,GAAG,cAAuB,CAAC;AACjE;;;kGAGkG;AAClG,MAAM,CAAC,MAAM,yBAAyB,GAAG,cAAuB,CAAC;AAOjE,mDAAmD;AACnD,MAAM,UAAU,gBAAgB,CAAC,GAAY;IAC3C,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IAC/E,MAAM,EAAE,MAAM,EAAE,GAAG,GAA2B,CAAC;IAC/C,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;QAAE,OAAO,IAAI,CAAC;IACxF,OAAO,EAAE,MAAM,EAAE,MAAiC,EAAE,CAAC;AACvD,CAAC;AA4BD,MAAM,UAAU,EAAE,CAAC,KAAc;IAC/B,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;AAC7B,CAAC;AAED,MAAM,UAAU,IAAI,CAAC,IAAY,EAAE,OAAe;IAChD,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,CAAC;AAC9D,CAAC;AAED,iDAAiD;AACjD,MAAM,UAAU,WAAW,CAAC,GAAY;IACtC,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IAC1D,MAAM,MAAM,GAAI,GAAwB,CAAC,EAAE,CAAC;IAC5C,OAAO,MAAM,KAAK,IAAI,IAAI,MAAM,KAAK,KAAK,CAAC;AAC7C,CAAC"}
package/dist/dsh-ctx.d.ts CHANGED
@@ -1,12 +1,62 @@
1
1
  /** DSH ctx 最小镜像(只含本仓实际使用的面;type-only,构建期擦除,零运行时)。
2
2
  *
3
- * skills 面出处见 `docs/agents/dsh-client-contract.md` §12(#56 卡路里样板,#150 记账同形,#218 大厨同形):
4
- * `ctx.skills.registerProvider(create)`(`dsh-skill/lib/index.js:147`);
3
+ * 每条成员的用法出处见 `docs/agents/dsh-client-contract.md`(附源码路径 + 行)。
4
+ * skills 面出处:`ctx.skills.registerProvider(create)`(`dsh-skill/lib/index.js:147`);
5
5
  * candidate 校验红线见 `validateCandidate`(同文件 `:452`);`get` 回定义须与候选同名(同文件 `:259`)。
6
+ * slots 面出处:`inject(key, cb)` 等声明同步跑否则等待(`dsh-client-ui-renderer/lib/client.js:1015`);
7
+ * `register` list 必 `{id}`(`dsh-client-ui-slots/lib/index.js:72`);
8
+ * 爱生活页签槽注册形见 cookbook §11(`{name:'ilife.config-tab', id, order, label}`)。
9
+ * connection 面出处:宿主注册走 `connection.fetch.register(route)`、面板调用走
10
+ * `connection.rpc.call(channel, endpoint, payload, signal)`(#80 迁移到公开 `/api` 载体,样式见
11
+ * `@xmanrui/dsh-im` 的 `plugin-src/management-rpc.mjs`)。
6
12
  * 禁止加镜外成员:要用新能力,先在 cookbook 落出处,再加镜像。用 `import type` 引用本文件。
7
13
  *
8
- * 本插件当前只用到 skills 这一面(面板取数走自家 `bridge.ts`,不经宿主 RPC 面),故只镜像到够用为止。
14
+ * #696:本文件原先是「最小静态注册,不取数,故无 connection」。设置页要读改配置,
15
+ * 按 #56 卡路里/#677 记账先例补上 connection 两侧(host 注册 + client 调用),其余面不动。
9
16
  */
17
+ /** 爱生活页签槽注册项(cookbook §11 options 全形子集,只取本次用到的面)。 */
18
+ export interface SlotsRegisterOptions {
19
+ readonly name: string;
20
+ readonly id?: string;
21
+ readonly order?: number;
22
+ readonly label?: string | (() => string);
23
+ readonly locale?: string;
24
+ /** 本包自己那条 RPC 通道(单段,例 `/ilife-chef`):注册方写进来,读方(总管)据此**通用地**
25
+ * 调它,不必在源码里写死任何一家的通道名(#706 配置体检要走它;格与出处照
26
+ * `packages/plugin-manager/src/dsh-ctx.ts:19-21`)。 */
27
+ readonly channel?: string;
28
+ readonly inject?: () => Record<string, unknown>;
29
+ }
30
+ /** 总管声明的爱生活页签槽面(client 侧只用 inject+register)。 */
31
+ export interface SlotsFace {
32
+ inject(key: string, callback: () => (() => void) | Iterable<() => void>): () => void;
33
+ register(options: SlotsRegisterOptions, component: unknown): () => void;
34
+ }
35
+ /** rpc.call 的回执信封(本包只读 ok/value/error 三处)。 */
36
+ export interface RpcCallResult {
37
+ readonly ok: boolean;
38
+ readonly value?: unknown;
39
+ readonly error?: {
40
+ readonly code?: string;
41
+ readonly message?: string;
42
+ };
43
+ }
44
+ /** 面板侧调用口(每次取数时现取:connection 后到也不永久缺席)。 */
45
+ export type RpcCallFace = (path: string, channel: string, body: unknown, signal?: AbortSignal) => Promise<unknown>;
46
+ /** 本插件用到的 client 侧宿主面。 */
47
+ export interface ClientCtx {
48
+ readonly slots: SlotsFace;
49
+ /** 宿主连接面:客户端经它把请求送进宿主注册的 /api 路由。缺席即由组件判「宿主连接缺席」。 */
50
+ readonly connection?: {
51
+ readonly rpc?: {
52
+ readonly call?: RpcCallFace;
53
+ };
54
+ };
55
+ /** 服务取用(本包暂不用,保留面以对齐兄弟件镜像)。 */
56
+ get?(name: string): unknown;
57
+ /** 卸载清理登记。 */
58
+ effect?(callback: () => void, label?: string): void;
59
+ }
10
60
  /** 技能的调用策略(模型可调/用户可调)。 */
11
61
  export interface SkillInvocationPolicy {
12
62
  readonly modelInvocable: boolean;
@@ -50,9 +100,21 @@ export interface SkillsFace {
50
100
  invalidate(): void;
51
101
  }) => SkillProvider): () => void;
52
102
  }
103
+ /** RPC 处理函数:端点 + 载荷 → 信封回执(照 #56 卡路里样板同形)。 */
104
+ export type RpcHandler = (endpoint: string, payload: unknown) => Promise<unknown>;
105
+ /** 宿主 fetch 路由注册面(`ctx.connection.fetch.register`)。 */
106
+ export interface HostConnectionFace {
107
+ readonly fetch: {
108
+ register(options: Record<string, unknown>): () => void;
109
+ };
110
+ }
53
111
  /** 本插件用到的宿主面(apply 入参)。 */
54
112
  export interface SkillHostCtx {
55
113
  readonly skills: SkillsFace;
114
+ /** 宿主连接面:设置页的三个配置端点注册在这上面(#696 起用)。 */
115
+ readonly connection?: HostConnectionFace;
116
+ /** 卸载清理登记。 */
117
+ effect?(callback: () => void, label?: string): void;
56
118
  readonly logger?: unknown;
57
119
  }
58
120
  //# sourceMappingURL=dsh-ctx.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"dsh-ctx.d.ts","sourceRoot":"","sources":["../src/dsh-ctx.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,0BAA0B;AAC1B,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,cAAc,EAAE,OAAO,CAAC;IACjC,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAC;CACjC;AAED,sDAAsD;AACtD,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,UAAU,EAAE,qBAAqB,CAAC;IAC3C,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,YAAY,CAAC,EAAE;QAAE,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;QAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;CAC/E;AAED,uDAAuD;AACvD,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,UAAU,EAAE,qBAAqB,CAAC;IAC3C,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,YAAY,CAAC,EAAE;QAAE,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;QAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IAC9E,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,IAAI,CAAC,OAAO,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,SAAS,cAAc,EAAE,CAAC,CAAC;IAC5D,GAAG,CAAC,SAAS,EAAE,cAAc,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,eAAe,GAAG,SAAS,CAAC,CAAC;CACzF;AAED,MAAM,WAAW,UAAU;IACzB,gBAAgB,CACd,MAAM,EAAE,CAAC,OAAO,EAAE;QAAE,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;QAAC,UAAU,IAAI,IAAI,CAAA;KAAE,KAAK,aAAa,GACvF,MAAM,IAAI,CAAC;CACf;AAED,2BAA2B;AAC3B,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAC;IAC5B,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC;CAC3B"}
1
+ {"version":3,"file":"dsh-ctx.d.ts","sourceRoot":"","sources":["../src/dsh-ctx.ts"],"names":[],"mappings":"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"}
package/dist/dsh-ctx.js CHANGED
@@ -1,11 +1,18 @@
1
1
  /** DSH ctx 最小镜像(只含本仓实际使用的面;type-only,构建期擦除,零运行时)。
2
2
  *
3
- * skills 面出处见 `docs/agents/dsh-client-contract.md` §12(#56 卡路里样板,#150 记账同形,#218 大厨同形):
4
- * `ctx.skills.registerProvider(create)`(`dsh-skill/lib/index.js:147`);
3
+ * 每条成员的用法出处见 `docs/agents/dsh-client-contract.md`(附源码路径 + 行)。
4
+ * skills 面出处:`ctx.skills.registerProvider(create)`(`dsh-skill/lib/index.js:147`);
5
5
  * candidate 校验红线见 `validateCandidate`(同文件 `:452`);`get` 回定义须与候选同名(同文件 `:259`)。
6
+ * slots 面出处:`inject(key, cb)` 等声明同步跑否则等待(`dsh-client-ui-renderer/lib/client.js:1015`);
7
+ * `register` list 必 `{id}`(`dsh-client-ui-slots/lib/index.js:72`);
8
+ * 爱生活页签槽注册形见 cookbook §11(`{name:'ilife.config-tab', id, order, label}`)。
9
+ * connection 面出处:宿主注册走 `connection.fetch.register(route)`、面板调用走
10
+ * `connection.rpc.call(channel, endpoint, payload, signal)`(#80 迁移到公开 `/api` 载体,样式见
11
+ * `@xmanrui/dsh-im` 的 `plugin-src/management-rpc.mjs`)。
6
12
  * 禁止加镜外成员:要用新能力,先在 cookbook 落出处,再加镜像。用 `import type` 引用本文件。
7
13
  *
8
- * 本插件当前只用到 skills 这一面(面板取数走自家 `bridge.ts`,不经宿主 RPC 面),故只镜像到够用为止。
14
+ * #696:本文件原先是「最小静态注册,不取数,故无 connection」。设置页要读改配置,
15
+ * 按 #56 卡路里/#677 记账先例补上 connection 两侧(host 注册 + client 调用),其余面不动。
9
16
  */
10
17
  export {};
11
18
  //# sourceMappingURL=dsh-ctx.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"dsh-ctx.js","sourceRoot":"","sources":["../src/dsh-ctx.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG"}
1
+ {"version":3,"file":"dsh-ctx.js","sourceRoot":"","sources":["../src/dsh-ctx.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG"}
package/dist/index.d.ts CHANGED
@@ -4,9 +4,11 @@ export declare const inject: readonly string[];
4
4
  export declare function apply(ctx: SkillHostCtx): void;
5
5
  export { SKILL, SLOT_ID, SLOT_ORDER, SLOT_TITLE, PLUGIN, MANAGER_PLUGIN, slotDescriptor, TAB_COMPONENT, registerSingle, openSingle } from './slot.js';
6
6
  export type { SlotDescriptor, TabsPort } from './slot.js';
7
- export { SETTINGS_OWNER, SETTINGS_SLOT, SETTING_ROWS } from './settings.js';
8
- export type { SettingRow } from './settings.js';
9
- export { SKILL_PACKAGE, SKILL_CLI, SKILL_CLI_REL, HOST_CALL_METHOD, MANAGER_MISSING_HINT, SkillBridgeError, cliPath, assertCliPresent, handleHostCall, requestViaHost, readViaCli } from './bridge.js';
7
+ export { SETTINGS_OWNER, SETTINGS_SLOT, CONFIG_STEM, CONFIG_ITEMS, COMMON_ITEM_COUNT, ADVANCED_GROUP_TITLE, ADVANCED_GROUP_NOTE, readPath, writePath } from './settings.js';
8
+ export type { ConfigItem, ConfigTier, ConfigControl } from './settings.js';
9
+ export { SKILL_PACKAGE, SKILL_CLI, SKILL_CLI_REL, HOST_CALL_METHOD, MANAGER_MISSING_HINT, SkillBridgeError, cliPath, assertCliPresent, handleHostCall, requestViaHost, readViaCli, resolveNodeBin, SPAWN_TIMEOUT_MS, readConfigSurface, writeConfigValues, resetConfigToDefaults, readConfigHealth, CONFIG_READ_KEY, CONFIG_WRITE_KEY, CONFIG_RESET_KEY, CONFIG_CHECK_KEY } from './bridge.js';
10
+ export { RPC_CHANNEL, RPC_ENDPOINT_CONFIG_GET, RPC_ENDPOINT_CONFIG_SAVE, RPC_ENDPOINT_CONFIG_RESET, RPC_ENDPOINT_CONFIG_CHECK, ok, fail, parseSavePayload, isRpcResult } from './contract.js';
11
+ export type { SavePayload, ConfigSurfaceReply, RpcError, RpcResult } from './contract.js';
10
12
  export { PROVIDER_NAME, SKILL_NAME, BUNDLED_SKILL_RANK, SKILL_FILE, skillDir, parseSkillText, provider as skillProvider } from './skill-provider.js';
11
- export type { SkillCandidate, SkillDefinition, SkillProvider, SkillInvocationPolicy, SkillsFace, SkillHostCtx } from './dsh-ctx.js';
13
+ export type { SkillCandidate, SkillDefinition, SkillProvider, SkillInvocationPolicy, SkillsFace, SkillHostCtx, ClientCtx, RpcCallFace } from './dsh-ctx.js';
12
14
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAEjD,eAAO,MAAM,IAAI,aAAa,CAAC;AAC/B,eAAO,MAAM,MAAM,EAAE,SAAS,MAAM,EAAe,CAAC;AAQpD,wBAAgB,KAAK,CAAC,GAAG,EAAE,YAAY,GAAG,IAAI,CAa7C;AAED,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,EAAE,cAAc,EAAE,cAAc,EAAE,aAAa,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AACtJ,YAAY,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC5E,YAAY,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,aAAa,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAYvM,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,kBAAkB,EAAE,UAAU,EAAE,QAAQ,EAAE,cAAc,EAAE,QAAQ,IAAI,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACrJ,YAAY,EAAE,cAAc,EAAE,eAAe,EAAE,aAAa,EAAE,qBAAqB,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAc,YAAY,EAAE,MAAM,cAAc,CAAC;AAG7D,eAAO,MAAM,IAAI,aAAa,CAAC;AAC/B,eAAO,MAAM,MAAM,EAAE,SAAS,MAAM,EAA0C,CAAC;AAiC/E,wBAAgB,KAAK,CAAC,GAAG,EAAE,YAAY,GAAG,IAAI,CAkD7C;AAED,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,EAAE,cAAc,EAAE,cAAc,EAAE,aAAa,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AACtJ,YAAY,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,WAAW,EAAE,YAAY,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC5K,YAAY,EAAE,UAAU,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC3E,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,aAAa,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,cAAc,EAAE,UAAU,EAAE,cAAc,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,eAAe,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/X,OAAO,EAAE,WAAW,EAAE,uBAAuB,EAAE,wBAAwB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,EAAE,EAAE,IAAI,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC9L,YAAY,EAAE,WAAW,EAAE,kBAAkB,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAM1F,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,kBAAkB,EAAE,UAAU,EAAE,QAAQ,EAAE,cAAc,EAAE,QAAQ,IAAI,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACrJ,YAAY,EAAE,cAAc,EAAE,eAAe,EAAE,aAAa,EAAE,qBAAqB,EAAE,UAAU,EAAE,YAAY,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC"}
package/dist/index.js CHANGED
@@ -6,10 +6,46 @@
6
6
  * #218:`inject` 加 `skills`,`apply` 注册**打包技能提供方**(见 skill-provider.ts)——
7
7
  * DSH 里的 agent 由此知道有 `skill-chef` 这个技能(名+介绍,可按需读全文调 CLI)。
8
8
  * 提供方是宿主按名去重的单例:重装配时退让(照 #56 卡路里/#150 记账样板),他错重抛。
9
+ *
10
+ * #696:本包原先**没有任何 RPC 通道**。设置页要读改配置,这里按卡路里/记账那套补齐:
11
+ * `inject` 加 `connection`/`webServer`,`apply` 注册 `/api/ilife-chef` 路由,端点分发到 bridge 的
12
+ * 三个配置口。client 侧禁 node,只经这条通道取用。
9
13
  */
14
+ import { RPC_CHANNEL, RPC_ENDPOINT_CONFIG_GET, RPC_ENDPOINT_CONFIG_SAVE, RPC_ENDPOINT_CONFIG_RESET, RPC_ENDPOINT_CONFIG_CHECK, ok, fail, parseSavePayload } from './contract.js';
15
+ import { SkillBridgeError, readConfigSurface, writeConfigValues, resetConfigToDefaults, readConfigHealth } from './bridge.js';
10
16
  import { PROVIDER_NAME, provider as skillProvider } from './skill-provider.js';
11
17
  export const name = 'dsh-chef';
12
- export const inject = ['skills'];
18
+ export const inject = ['skills', 'connection', 'webServer'];
19
+ /** RPC 处理函数:endpoint 分发 → 载荷校验 → bridge 配置口 → 信封包装(#56 卡路里样板同形)。
20
+ *
21
+ * #696 起只有三个配置端点(`config.get`/`config.save`/`config.reset`):设置页只经它们
22
+ * 读改自家配置,不 spawn 技能进程,也不直读磁盘(client 侧禁 node)。 */
23
+ const handleChefRpc = async (endpoint, payload) => {
24
+ try {
25
+ if (endpoint === RPC_ENDPOINT_CONFIG_GET)
26
+ return ok(readConfigSurface());
27
+ if (endpoint === RPC_ENDPOINT_CONFIG_SAVE) {
28
+ const parsed = parseSavePayload(payload ?? {});
29
+ if (!parsed)
30
+ return fail('bad-request', '载荷须为 {values: object}');
31
+ return ok(writeConfigValues(parsed.values));
32
+ }
33
+ if (endpoint === RPC_ENDPOINT_CONFIG_RESET)
34
+ return ok(resetConfigToDefaults());
35
+ // #706 配置体检:只读一次,把技能侧那份报告原样交回面板(本包不校验、不重写)。
36
+ if (endpoint === RPC_ENDPOINT_CONFIG_CHECK)
37
+ return ok(readConfigHealth());
38
+ return fail('bad-request', `未知端点:${String(endpoint)}`);
39
+ }
40
+ catch (e) {
41
+ // 配置面的报错也走这条:技能侧 cli/config.ts 把 base-link-core 的
42
+ // ConfigError 报文原样交出来(已带行号与文件名),readViaCli 把它带在
43
+ // fetch-failed 的报文里,页面照原样给用户看。
44
+ if (e instanceof SkillBridgeError)
45
+ return fail(e.code, e.message);
46
+ return fail('internal', e instanceof Error ? e.message : String(e));
47
+ }
48
+ };
13
49
  export function apply(ctx) {
14
50
  const loggerSource = ctx?.logger;
15
51
  const logger = (typeof loggerSource === 'function'
@@ -24,20 +60,62 @@ export function apply(ctx) {
24
60
  throw error;
25
61
  logger.warn?.('[dsh-chef] skill provider ' + PROVIDER_NAME + ' already registered by another instance; yielding');
26
62
  }
63
+ const conn = ctx.connection;
64
+ if (conn === undefined || typeof conn.fetch?.register !== 'function') {
65
+ // 宿主没给连接面(老宿主/单测直调 apply):退让并留痕,不抛——提供方那半照常生效。
66
+ logger.warn?.('[dsh-chef] connection.fetch 缺席:设置页的配置端点未注册');
67
+ return;
68
+ }
69
+ const reply = (rpcId, result) => Response.json({ type: 'server-response', rpcId, result });
70
+ try {
71
+ const dispose = conn.fetch.register({
72
+ path: '/api' + RPC_CHANNEL,
73
+ methods: ['POST'],
74
+ requestBody: 'buffered',
75
+ async fetch(request) {
76
+ if (request.method !== 'POST')
77
+ return new Response('method not allowed', { status: 405 });
78
+ let message;
79
+ try {
80
+ message = await request.json();
81
+ }
82
+ catch {
83
+ return new Response('body is not JSON', { status: 400 });
84
+ }
85
+ const rpcId = typeof message?.rpcId === 'string' ? message.rpcId : 'invalid-request';
86
+ const call = message?.payload;
87
+ if (message?.type !== 'client-request' || typeof message.rpcId !== 'string'
88
+ || message.method !== RPC_CHANNEL.slice(1) || !call || typeof call.method !== 'string'
89
+ || !Object.hasOwn(call, 'payload')) {
90
+ return reply(rpcId, { ok: false, error: { code: 'gateway/bad-request', message: 'Invalid chef request.', details: {} } });
91
+ }
92
+ try {
93
+ return reply(rpcId, await handleChefRpc(call.method, call.payload));
94
+ }
95
+ catch {
96
+ return new Response('chef handler failed', { status: 500 });
97
+ }
98
+ },
99
+ });
100
+ ctx.effect?.(() => () => dispose(), 'dsh-chef: fetch route cleanup');
101
+ }
102
+ catch (error) {
103
+ // 通道是宿主共享单例:重装配时上一实例可能已注册,此时退让(照抄 companion),他错重抛。
104
+ if (/(duplicate prefix route|already registered)/.test(String(error?.message ?? error))) {
105
+ logger.warn?.('[dsh-chef] rpc channel ' + RPC_CHANNEL + ' already registered by another instance; yielding');
106
+ return;
107
+ }
108
+ throw error;
109
+ }
27
110
  }
28
111
  export { SKILL, SLOT_ID, SLOT_ORDER, SLOT_TITLE, PLUGIN, MANAGER_PLUGIN, slotDescriptor, TAB_COMPONENT, registerSingle, openSingle } from './slot.js';
29
- export { SETTINGS_OWNER, SETTINGS_SLOT, SETTING_ROWS } from './settings.js';
30
- export { SKILL_PACKAGE, SKILL_CLI, SKILL_CLI_REL, HOST_CALL_METHOD, MANAGER_MISSING_HINT, SkillBridgeError, cliPath, assertCliPresent, handleHostCall, requestViaHost, readViaCli } from './bridge.js';
31
- // 宿主**不**导出 `./client.js` 的值(#150 现场实测):客户端产物是 **loader 工厂包**
112
+ export { SETTINGS_OWNER, SETTINGS_SLOT, CONFIG_STEM, CONFIG_ITEMS, COMMON_ITEM_COUNT, ADVANCED_GROUP_TITLE, ADVANCED_GROUP_NOTE, readPath, writePath } from './settings.js';
113
+ export { SKILL_PACKAGE, SKILL_CLI, SKILL_CLI_REL, HOST_CALL_METHOD, MANAGER_MISSING_HINT, SkillBridgeError, cliPath, assertCliPresent, handleHostCall, requestViaHost, readViaCli, resolveNodeBin, SPAWN_TIMEOUT_MS, readConfigSurface, writeConfigValues, resetConfigToDefaults, readConfigHealth, CONFIG_READ_KEY, CONFIG_WRITE_KEY, CONFIG_RESET_KEY, CONFIG_CHECK_KEY } from './bridge.js';
114
+ export { RPC_CHANNEL, RPC_ENDPOINT_CONFIG_GET, RPC_ENDPOINT_CONFIG_SAVE, RPC_ENDPOINT_CONFIG_RESET, RPC_ENDPOINT_CONFIG_CHECK, ok, fail, parseSavePayload, isRpcResult } from './contract.js';
115
+ // 宿主**不**导出 `./client.js` 的值也不引用它的类型(#218 拆雷):客户端产物是 **loader 工厂包**
32
116
  // (`window.__ModuleLoader__.load({id, factory})` 的 CJS,由 tsdown 打),不是 ESM 模块——
33
- // 宿主 `export … from './client.js'` 会让插件树在启动期报
34
- // 「The requested module './client.js' does not provide an export named 'CLIENT_COMPONENT'」而整棵树起不来。
35
- // 样板 plugin-bill-ilife/plugin-calorie 同样只在浏览器侧消费 client.ts,宿主不碰。
36
- //
37
- // #218 拆雷:宿主连 client.ts 的**类型**也不再引用(原 `export type { HostCaller } from './client.js'` 删除)。
38
- // 类型引用虽被擦除,却会把 client.ts 拉进宿主 `tsc -b` 的**编译程序**,于是单跑 `tsc -b`
39
- // 会把 tsdown 产出的 loader 工厂包覆写成 tsc 直出的裸 ESM(=#150 事故原样重演);
40
- // 只加 `exclude` 不成:composite 要求列出全部程序文件,会同时报 TS6307 且**照样**覆写。
41
- // HostCaller 现只住 client.ts(浏览器侧);宿主侧同形结构由 bridge.ts 的 requestViaHost 参数就地声明。
117
+ // 值导出会让插件树在启动期报「The requested module './client.js' does not provide an export named …」
118
+ // 而整棵树起不来;连 type-only 引用也会把 client.ts 拉进宿主 `tsc -b` 的编译程序,
119
+ // 把 loader 工厂包覆写成 tsc 直出的裸 ESM(#150 事故)。
42
120
  export { PROVIDER_NAME, SKILL_NAME, BUNDLED_SKILL_RANK, SKILL_FILE, skillDir, parseSkillText, provider as skillProvider } from './skill-provider.js';
43
121
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,EAAE,aAAa,EAAE,QAAQ,IAAI,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAG/E,MAAM,CAAC,MAAM,IAAI,GAAG,UAAU,CAAC;AAC/B,MAAM,CAAC,MAAM,MAAM,GAAsB,CAAC,QAAQ,CAAC,CAAC;AAQpD,MAAM,UAAU,KAAK,CAAC,GAAiB;IACrC,MAAM,YAAY,GAAY,GAAG,EAAE,MAAM,CAAC;IAC1C,MAAM,MAAM,GACV,CAAC,OAAO,YAAY,KAAK,UAAU;QACjC,CAAC,CAAE,YAA8C,CAAC,IAAI,CAAC;QACvD,CAAC,CAAE,YAA8C,CAAC,IAAI,OAAO,CAAC;IAClE,IAAI,CAAC;QACH,GAAG,CAAC,MAAM,CAAC,gBAAgB,CAAC,GAAG,EAAE,CAAC,aAAa,CAAC,CAAC;IACnD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,yCAAyC;QACzC,IAAI,CAAC,MAAM,CAAE,KAAe,EAAE,OAAO,IAAI,KAAK,CAAC,CAAC,QAAQ,CAAC,oBAAoB,CAAC;YAAE,MAAM,KAAK,CAAC;QAC5F,MAAM,CAAC,IAAI,EAAE,CAAC,4BAA4B,GAAG,aAAa,GAAG,mDAAmD,CAAC,CAAC;IACpH,CAAC;AACH,CAAC;AAED,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,EAAE,cAAc,EAAE,cAAc,EAAE,aAAa,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAEtJ,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAE5E,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,aAAa,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACvM,8DAA8D;AAC9D,+EAA+E;AAC/E,8CAA8C;AAC9C,mGAAmG;AACnG,iEAAiE;AACjE,EAAE;AACF,4FAA4F;AAC5F,+DAA+D;AAC/D,0DAA0D;AAC1D,8DAA8D;AAC9D,6EAA6E;AAC7E,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,kBAAkB,EAAE,UAAU,EAAE,QAAQ,EAAE,cAAc,EAAE,QAAQ,IAAI,aAAa,EAAE,MAAM,qBAAqB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,EAAE,WAAW,EAAE,uBAAuB,EAAE,wBAAwB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,EAAE,EAAE,IAAI,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAEjL,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAE9H,OAAO,EAAE,aAAa,EAAE,QAAQ,IAAI,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAE/E,MAAM,CAAC,MAAM,IAAI,GAAG,UAAU,CAAC;AAC/B,MAAM,CAAC,MAAM,MAAM,GAAsB,CAAC,QAAQ,EAAE,YAAY,EAAE,WAAW,CAAC,CAAC;AAQ/E;;;iDAGiD;AACjD,MAAM,aAAa,GAAe,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAsB,EAAE;IAChF,IAAI,CAAC;QACH,IAAI,QAAQ,KAAK,uBAAuB;YAAE,OAAO,EAAE,CAAC,iBAAiB,EAAE,CAAC,CAAC;QACzE,IAAI,QAAQ,KAAK,wBAAwB,EAAE,CAAC;YAC1C,MAAM,MAAM,GAAG,gBAAgB,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;YAC/C,IAAI,CAAC,MAAM;gBAAE,OAAO,IAAI,CAAC,aAAa,EAAE,uBAAuB,CAAC,CAAC;YACjE,OAAO,EAAE,CAAC,iBAAiB,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;QAC9C,CAAC;QACD,IAAI,QAAQ,KAAK,yBAAyB;YAAE,OAAO,EAAE,CAAC,qBAAqB,EAAE,CAAC,CAAC;QAC/E,4CAA4C;QAC5C,IAAI,QAAQ,KAAK,yBAAyB;YAAE,OAAO,EAAE,CAAC,gBAAgB,EAAE,CAAC,CAAC;QAC1E,OAAO,IAAI,CAAC,aAAa,EAAE,QAAQ,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IACzD,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,kDAAkD;QAClD,gDAAgD;QAChD,+BAA+B;QAC/B,IAAI,CAAC,YAAY,gBAAgB;YAAE,OAAO,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC;QAClE,OAAO,IAAI,CAAC,UAAU,EAAE,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IACtE,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,UAAU,KAAK,CAAC,GAAiB;IACrC,MAAM,YAAY,GAAY,GAAG,EAAE,MAAM,CAAC;IAC1C,MAAM,MAAM,GACV,CAAC,OAAO,YAAY,KAAK,UAAU;QACjC,CAAC,CAAE,YAA8C,CAAC,IAAI,CAAC;QACvD,CAAC,CAAE,YAA8C,CAAC,IAAI,OAAO,CAAC;IAClE,IAAI,CAAC;QACH,GAAG,CAAC,MAAM,CAAC,gBAAgB,CAAC,GAAG,EAAE,CAAC,aAAa,CAAC,CAAC;IACnD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,yCAAyC;QACzC,IAAI,CAAC,MAAM,CAAE,KAAe,EAAE,OAAO,IAAI,KAAK,CAAC,CAAC,QAAQ,CAAC,oBAAoB,CAAC;YAAE,MAAM,KAAK,CAAC;QAC5F,MAAM,CAAC,IAAI,EAAE,CAAC,4BAA4B,GAAG,aAAa,GAAG,mDAAmD,CAAC,CAAC;IACpH,CAAC;IAED,MAAM,IAAI,GAAG,GAAG,CAAC,UAAU,CAAC;IAC5B,IAAI,IAAI,KAAK,SAAS,IAAI,OAAO,IAAI,CAAC,KAAK,EAAE,QAAQ,KAAK,UAAU,EAAE,CAAC;QACrE,+CAA+C;QAC/C,MAAM,CAAC,IAAI,EAAE,CAAC,4CAA4C,CAAC,CAAC;QAC5D,OAAO;IACT,CAAC;IACD,MAAM,KAAK,GAAG,CAAC,KAAa,EAAE,MAAe,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;IAC5G,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC;YAClC,IAAI,EAAE,MAAM,GAAG,WAAW;YAC1B,OAAO,EAAE,CAAC,MAAM,CAAC;YACjB,WAAW,EAAE,UAAU;YACvB,KAAK,CAAC,KAAK,CAAC,OAAY;gBACtB,IAAI,OAAO,CAAC,MAAM,KAAK,MAAM;oBAAE,OAAO,IAAI,QAAQ,CAAC,oBAAoB,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;gBAC1F,IAAI,OAAY,CAAC;gBACjB,IAAI,CAAC;oBAAC,OAAO,GAAG,MAAM,OAAO,CAAC,IAAI,EAAE,CAAC;gBAAC,CAAC;gBAAC,MAAM,CAAC;oBAAC,OAAO,IAAI,QAAQ,CAAC,kBAAkB,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;gBAAC,CAAC;gBAC3G,MAAM,KAAK,GAAG,OAAO,OAAO,EAAE,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,iBAAiB,CAAC;gBACrF,MAAM,IAAI,GAAG,OAAO,EAAE,OAAO,CAAC;gBAC9B,IAAI,OAAO,EAAE,IAAI,KAAK,gBAAgB,IAAI,OAAO,OAAO,CAAC,KAAK,KAAK,QAAQ;uBACtE,OAAO,CAAC,MAAM,KAAK,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,CAAC,MAAM,KAAK,QAAQ;uBACnF,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,SAAS,CAAC,EAAE,CAAC;oBACrC,OAAO,KAAK,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,qBAAqB,EAAE,OAAO,EAAE,uBAAuB,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;gBAC5H,CAAC;gBACD,IAAI,CAAC;oBAAC,OAAO,KAAK,CAAC,KAAK,EAAE,MAAM,aAAa,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;gBAAC,CAAC;gBAC5E,MAAM,CAAC;oBAAC,OAAO,IAAI,QAAQ,CAAC,qBAAqB,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;gBAAC,CAAC;YACxE,CAAC;SACF,CAAC,CAAC;QACH,GAAG,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE,EAAE,+BAA+B,CAAC,CAAC;IACvE,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,mDAAmD;QACnD,IAAI,6CAA6C,CAAC,IAAI,CAAC,MAAM,CAAE,KAAe,EAAE,OAAO,IAAI,KAAK,CAAC,CAAC,EAAE,CAAC;YACnG,MAAM,CAAC,IAAI,EAAE,CAAC,yBAAyB,GAAG,WAAW,GAAG,mDAAmD,CAAC,CAAC;YAC7G,OAAO;QACT,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,EAAE,cAAc,EAAE,cAAc,EAAE,aAAa,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAEtJ,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,WAAW,EAAE,YAAY,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAE5K,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,aAAa,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,cAAc,EAAE,UAAU,EAAE,cAAc,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,eAAe,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/X,OAAO,EAAE,WAAW,EAAE,uBAAuB,EAAE,wBAAwB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,EAAE,EAAE,IAAI,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE9L,oEAAoE;AACpE,+EAA+E;AAC/E,uFAAuF;AACvF,2DAA2D;AAC3D,yCAAyC;AACzC,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,kBAAkB,EAAE,UAAU,EAAE,QAAQ,EAAE,cAAc,EAAE,QAAQ,IAAI,aAAa,EAAE,MAAM,qBAAqB,CAAC"}
@@ -1,16 +1,49 @@
1
- /** dsh-chef 设置页(P10 脚手架:设置页住单品包)。
1
+ /** dsh-chef 设置页元数据(#696:从只读脚手架换成真配置页)。
2
2
  *
3
- * 一次 registerTab,两处呈现:边栏 + 号菜单多一项,DSH 设置页侧边卡片
4
- * 分区自动多一张小卡片(注册表驱动、无硬编码,开关缺省启用)。
5
- * 本文件只声明本单品自己的设置行;总管不声明设置(见 boundaries 断言)。
3
+ * 本文件是**设置页的行表**:一个可配置项一行,写清它在配置文件里的键、中文标题、
4
+ * 分级(常用 / 高级)、控件种类与人话指引。它是页面渲染的唯一依据。
5
+ *
6
+ * **本文件必须零 node 依赖**:`tsconfig.client.json` 把它收进 client 侧编译,
7
+ * 浏览器产物不许带 node 内建。默认值不住这里,也不从技能包 import——
8
+ * 取值一律由宿主经技能 CLI 的 `chef.config.read` 端点现取(见 bridge.ts)。
9
+ *
10
+ * 口径:
11
+ * · 配置表形状(键与默认值)的**唯一定义地**是技能侧 `packages/skill-chef/src/config.ts`
12
+ * 的 `CHEF_CONFIG_DEFAULTS`(本文件是它在页面上的投影,逐键对齐由
13
+ * `test/config-surface-696.test.mjs` 锁死);
14
+ * · **空串=按默认落点**(老落点由技能各取用处算),所以「空」不是「没配」,
15
+ * 而是「还走改造前那个位置」,老数据不会看起来丢了——行文案按这个语义写。
16
+ *
17
+ * 清单出处:「六家技能的路径类配置全量调查」大厨 5 项去掉 1 项包内固定(包内页面模板目录)
18
+ * =**上设置页候选 4 项**;其中「产物文件名主体」在源码里是两个值(HELP/速查表),故行数为 5。
6
19
  */
7
20
  export declare const SETTINGS_OWNER: "dsh-chef";
8
21
  export declare const SETTINGS_SLOT: "ilife:chef";
9
- export interface SettingRow {
22
+ /** 配置文件主体名:落点 `~/.ilife/chef.yaml`(`ILIFE_CONFIG_DIR` 可整体接管)。 */
23
+ export declare const CONFIG_STEM: "chef";
24
+ /** 分级:常用项直接画在页面上,其余进默认收起的「高级」组(#675 冻结口径)。 */
25
+ export type ConfigTier = 'common' | 'advanced';
26
+ /** 控件种类:只有这三种(与受限 YAML 子集的字符串/数字/布尔一一对应,没有数组)。 */
27
+ export type ConfigControl = 'text' | 'number' | 'switch';
28
+ export interface ConfigItem {
29
+ /** 配置文件里的键路径,一层嵌套用 `.` 连接,例 `files.help`。 */
10
30
  readonly key: string;
31
+ /** 页面上那一行的中文标题。 */
11
32
  readonly title: string;
12
- readonly control: 'switch' | 'text' | 'number';
33
+ readonly tier: ConfigTier;
34
+ readonly control: ConfigControl;
35
+ /** 一行人话:这一项管什么、留空会怎样。 */
36
+ readonly hint: string;
13
37
  }
14
- /** 脚手架期唯一设置行:总开关(缺省启用,与官方关闭语义对齐)。 */
15
- export declare const SETTING_ROWS: readonly SettingRow[];
38
+ /** 设置页的行表,顺序即页面顺序。 */
39
+ export declare const CONFIG_ITEMS: readonly ConfigItem[];
40
+ /** 常用项行数(页面上直接画出来的那些)。 */
41
+ export declare const COMMON_ITEM_COUNT: number;
42
+ /** 高级组标题与副文案。 */
43
+ export declare const ADVANCED_GROUP_TITLE: "\u9AD8\u7EA7";
44
+ export declare const ADVANCED_GROUP_NOTE: "\u4E0D\u5E38\u6539\u3002\u7559\u7A7A\uFF1D\u6309\u9ED8\u8BA4\u843D\u70B9\uFF08\u6539\u9020\u524D\u90A3\u4E2A\u4F4D\u7F6E\uFF09\uFF0C\u4E0D\u786E\u5B9A\u5C31\u522B\u52A8\u3002";
45
+ /** 按 `a.b` 路径从配置取值里读(缺层或类型不符一律回 undefined)。 */
46
+ export declare function readPath(values: Record<string, unknown>, key: string): unknown;
47
+ /** 按 `a.b` 路径把值写进配置取值(中间层缺就建一层空组;已存在非组即覆盖成组)。 */
48
+ export declare function writePath(values: Record<string, unknown>, key: string, value: unknown): void;
16
49
  //# sourceMappingURL=settings.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"settings.d.ts","sourceRoot":"","sources":["../src/settings.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,eAAO,MAAM,cAAc,EAAG,UAAmB,CAAC;AAClD,eAAO,MAAM,aAAa,EAAG,YAAqB,CAAC;AAEnD,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,OAAO,EAAE,QAAQ,GAAG,MAAM,GAAG,QAAQ,CAAC;CAChD;AAED,qCAAqC;AACrC,eAAO,MAAM,YAAY,EAAE,SAAS,UAAU,EAE7C,CAAC"}
1
+ {"version":3,"file":"settings.d.ts","sourceRoot":"","sources":["../src/settings.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AACH,eAAO,MAAM,cAAc,EAAG,UAAmB,CAAC;AAClD,eAAO,MAAM,aAAa,EAAG,YAAqB,CAAC;AAEnD,iEAAiE;AACjE,eAAO,MAAM,WAAW,EAAG,MAAe,CAAC;AAE3C,8CAA8C;AAC9C,MAAM,MAAM,UAAU,GAAG,QAAQ,GAAG,UAAU,CAAC;AAE/C,kDAAkD;AAClD,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAEzD,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,yBAAyB;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AA6CD,sBAAsB;AACtB,eAAO,MAAM,YAAY,EAAE,SAAS,UAAU,EAA6B,CAAC;AAE5E,0BAA0B;AAC1B,eAAO,MAAM,iBAAiB,QAAgB,CAAC;AAE/C,iBAAiB;AACjB,eAAO,MAAM,oBAAoB,EAAG,cAAa,CAAC;AAClD,eAAO,MAAM,mBAAmB,EAAG,gLAAwC,CAAC;AAE5E,+CAA+C;AAC/C,wBAAgB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAQ9E;AAED,iDAAiD;AACjD,wBAAgB,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI,CAU5F"}
package/dist/settings.js CHANGED
@@ -1,13 +1,96 @@
1
- /** dsh-chef 设置页(P10 脚手架:设置页住单品包)。
1
+ /** dsh-chef 设置页元数据(#696:从只读脚手架换成真配置页)。
2
2
  *
3
- * 一次 registerTab,两处呈现:边栏 + 号菜单多一项,DSH 设置页侧边卡片
4
- * 分区自动多一张小卡片(注册表驱动、无硬编码,开关缺省启用)。
5
- * 本文件只声明本单品自己的设置行;总管不声明设置(见 boundaries 断言)。
3
+ * 本文件是**设置页的行表**:一个可配置项一行,写清它在配置文件里的键、中文标题、
4
+ * 分级(常用 / 高级)、控件种类与人话指引。它是页面渲染的唯一依据。
5
+ *
6
+ * **本文件必须零 node 依赖**:`tsconfig.client.json` 把它收进 client 侧编译,
7
+ * 浏览器产物不许带 node 内建。默认值不住这里,也不从技能包 import——
8
+ * 取值一律由宿主经技能 CLI 的 `chef.config.read` 端点现取(见 bridge.ts)。
9
+ *
10
+ * 口径:
11
+ * · 配置表形状(键与默认值)的**唯一定义地**是技能侧 `packages/skill-chef/src/config.ts`
12
+ * 的 `CHEF_CONFIG_DEFAULTS`(本文件是它在页面上的投影,逐键对齐由
13
+ * `test/config-surface-696.test.mjs` 锁死);
14
+ * · **空串=按默认落点**(老落点由技能各取用处算),所以「空」不是「没配」,
15
+ * 而是「还走改造前那个位置」,老数据不会看起来丢了——行文案按这个语义写。
16
+ *
17
+ * 清单出处:「六家技能的路径类配置全量调查」大厨 5 项去掉 1 项包内固定(包内页面模板目录)
18
+ * =**上设置页候选 4 项**;其中「产物文件名主体」在源码里是两个值(HELP/速查表),故行数为 5。
6
19
  */
7
20
  export const SETTINGS_OWNER = 'dsh-chef';
8
21
  export const SETTINGS_SLOT = 'ilife:chef';
9
- /** 脚手架期唯一设置行:总开关(缺省启用,与官方关闭语义对齐)。 */
10
- export const SETTING_ROWS = [
11
- { key: 'enabled', title: '大厨面板启用', control: 'switch' },
22
+ /** 配置文件主体名:落点 `~/.ilife/chef.yaml`(`ILIFE_CONFIG_DIR` 可整体接管)。 */
23
+ export const CONFIG_STEM = 'chef';
24
+ /** 常用项:改了就影响「库与产物落在哪」,放页面上。 */
25
+ const COMMON = [
26
+ {
27
+ key: 'db.dir',
28
+ title: '数据目录',
29
+ tier: 'common',
30
+ control: 'text',
31
+ hint: '库文件与产物的根目录。留空=按默认落点(配置目录下的 data/),也就是改造前那个位置。',
32
+ },
33
+ {
34
+ key: 'db.name',
35
+ title: '库文件名',
36
+ tier: 'common',
37
+ control: 'text',
38
+ hint: '数据目录下的数据库文件名。改它等于换一个菜谱库,老菜谱留在旧文件里不会跟过来。',
39
+ },
40
+ {
41
+ key: 'html.dir',
42
+ title: 'HTML 产物目录名',
43
+ tier: 'common',
44
+ control: 'text',
45
+ hint: '数据目录下放交付页面的子目录名,可带一层:默认两段 cook_html/help。改它之后新页面落新地方。',
46
+ },
47
+ ];
48
+ /** 高级项:默认收起。改错了多半只是自己撞上麻烦,不确定就别动。 */
49
+ const ADVANCED = [
50
+ {
51
+ key: 'files.help',
52
+ title: '产物文件名主体 · HELP',
53
+ tier: 'advanced',
54
+ control: 'text',
55
+ hint: 'HELP 文件的文件名前缀,后面自动跟时间戳。改它之后旧的 HELP 产物不再被复用。',
56
+ },
57
+ {
58
+ key: 'files.lookup',
59
+ title: '产物文件名主体 · 速查表',
60
+ tier: 'advanced',
61
+ control: 'text',
62
+ hint: '速查表文件的文件名前缀。改它之后新产物落新名字,旧的留在原处。',
63
+ },
12
64
  ];
65
+ /** 设置页的行表,顺序即页面顺序。 */
66
+ export const CONFIG_ITEMS = [...COMMON, ...ADVANCED];
67
+ /** 常用项行数(页面上直接画出来的那些)。 */
68
+ export const COMMON_ITEM_COUNT = COMMON.length;
69
+ /** 高级组标题与副文案。 */
70
+ export const ADVANCED_GROUP_TITLE = '高级';
71
+ export const ADVANCED_GROUP_NOTE = '不常改。留空=按默认落点(改造前那个位置),不确定就别动。';
72
+ /** 按 `a.b` 路径从配置取值里读(缺层或类型不符一律回 undefined)。 */
73
+ export function readPath(values, key) {
74
+ const parts = key.split('.');
75
+ let cur = values;
76
+ for (const part of parts) {
77
+ if (typeof cur !== 'object' || cur === null || Array.isArray(cur))
78
+ return undefined;
79
+ cur = cur[part];
80
+ }
81
+ return cur;
82
+ }
83
+ /** 按 `a.b` 路径把值写进配置取值(中间层缺就建一层空组;已存在非组即覆盖成组)。 */
84
+ export function writePath(values, key, value) {
85
+ const parts = key.split('.');
86
+ let cur = values;
87
+ for (let i = 0; i < parts.length - 1; i++) {
88
+ const part = parts[i];
89
+ const next = cur[part];
90
+ if (typeof next !== 'object' || next === null || Array.isArray(next))
91
+ cur[part] = {};
92
+ cur = cur[part];
93
+ }
94
+ cur[parts[parts.length - 1]] = value;
95
+ }
13
96
  //# sourceMappingURL=settings.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"settings.js","sourceRoot":"","sources":["../src/settings.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,CAAC,MAAM,cAAc,GAAG,UAAmB,CAAC;AAClD,MAAM,CAAC,MAAM,aAAa,GAAG,YAAqB,CAAC;AAQnD,qCAAqC;AACrC,MAAM,CAAC,MAAM,YAAY,GAA0B;IACjD,EAAE,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE;CACvD,CAAC"}
1
+ {"version":3,"file":"settings.js","sourceRoot":"","sources":["../src/settings.ts"],"names":[],"mappings":"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"}