dsh-chef 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bridge.d.ts +2 -0
- package/dist/bridge.d.ts.map +1 -1
- package/dist/bridge.js +17 -1
- package/dist/bridge.js.map +1 -1
- package/dist/client.d.ts +10 -0
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +88 -19
- package/dist/client.js.map +1 -1
- package/dist/dsh-ctx.d.ts +58 -0
- package/dist/dsh-ctx.d.ts.map +1 -0
- package/dist/dsh-ctx.js +11 -0
- package/dist/dsh-ctx.js.map +1 -0
- package/dist/index.d.ts +5 -9
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +33 -5
- package/dist/index.js.map +1 -1
- package/dist/skill-provider.d.ts +22 -0
- package/dist/skill-provider.d.ts.map +1 -0
- package/dist/skill-provider.js +120 -0
- package/dist/skill-provider.js.map +1 -0
- package/package.json +10 -3
package/dist/bridge.d.ts
CHANGED
|
@@ -7,6 +7,8 @@ export declare class SkillBridgeError extends Error {
|
|
|
7
7
|
readonly code: 'missing-cli' | 'fetch-failed' | 'bad-json' | 'key-mismatch';
|
|
8
8
|
constructor(code: SkillBridgeError['code'], message: string);
|
|
9
9
|
}
|
|
10
|
+
/** 包内 CLI 相对路径(相对技能包根,与 SKILL_CLI 尾段一致)。 */
|
|
11
|
+
export declare const SKILL_CLI_REL: "dist/cli/cmd_read.js";
|
|
10
12
|
export declare function cliPath(): string;
|
|
11
13
|
export declare function assertCliPresent(path?: string): void;
|
|
12
14
|
/** host.call 侧处理函数:由 host 注册到 connection RPC,供面板调用。 */
|
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":"AAcA,eAAO,MAAM,aAAa,EAAG,YAAqB,CAAC;AACnD,eAAO,MAAM,SAAS,EAAG,0CAAmD,CAAC;AAC7E,eAAO,MAAM,gBAAgB,EAAG,iBAA0B,CAAC;AAC3D,eAAO,MAAM,eAAe,EAAG,eAAwB,CAAC;AAExD,eAAO,MAAM,oBAAoB,gJACyB,CAAC;AAE3D,qBAAa,gBAAiB,SAAQ,KAAK;IACzC,QAAQ,CAAC,IAAI,EAAE,aAAa,GAAG,cAAc,GAAG,UAAU,GAAG,cAAc,CAAC;gBAChE,IAAI,EAAE,gBAAgB,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,MAAM;CAK5D;AAMD,4CAA4C;AAC5C,eAAO,MAAM,aAAa,EAAG,sBAA+B,CAAC;AAe7D,wBAAgB,OAAO,IAAI,MAAM,CAEhC;AAED,wBAAgB,gBAAgB,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAOpD;AAED,uDAAuD;AACvD,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GAAG,OAAO,CAEzF;AAED,oCAAoC;AACpC,wBAAgB,cAAc,CAAC,IAAI,EAAE;IAAE,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;CAAE,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAEnK;AAED,qDAAqD;AACrD,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GAAG,OAAO,CAmBrF"}
|
package/dist/bridge.js
CHANGED
|
@@ -8,6 +8,7 @@
|
|
|
8
8
|
*/
|
|
9
9
|
import { spawnSync } from 'node:child_process';
|
|
10
10
|
import { accessSync, constants } from 'node:fs';
|
|
11
|
+
import { createRequire } from 'node:module';
|
|
11
12
|
import { join, dirname } from 'node:path';
|
|
12
13
|
import { fileURLToPath } from 'node:url';
|
|
13
14
|
export const SKILL_PACKAGE = 'skill-chef';
|
|
@@ -26,8 +27,23 @@ export class SkillBridgeError extends Error {
|
|
|
26
27
|
function repoRoot() {
|
|
27
28
|
return join(dirname(fileURLToPath(import.meta.url)), '..', '..', '..');
|
|
28
29
|
}
|
|
30
|
+
/** 包内 CLI 相对路径(相对技能包根,与 SKILL_CLI 尾段一致)。 */
|
|
31
|
+
export const SKILL_CLI_REL = 'dist/cli/cmd_read.js';
|
|
32
|
+
/** 按包名解析技能出口(#50 修法①之二,照抄 #48 卡路里样板):createRequire 定位技能包(SKILL_PACKAGE)
|
|
33
|
+
* 的 package.json,再拼包内 dist/cli/cmd_read.js。只读消费其 dist/CLI(spawn),
|
|
34
|
+
* 绝不 import 技能实现。包名解析失败回退单仓相对路径;两者皆无由 assertCliPresent
|
|
35
|
+
* 抛 missing-cli(缺失阻断不返空)。 */
|
|
36
|
+
function resolveSkillCli() {
|
|
37
|
+
try {
|
|
38
|
+
const pkgJson = createRequire(import.meta.url).resolve(SKILL_PACKAGE + '/package.json');
|
|
39
|
+
return join(dirname(pkgJson), SKILL_CLI_REL);
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
return join(repoRoot(), SKILL_CLI);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
29
45
|
export function cliPath() {
|
|
30
|
-
return
|
|
46
|
+
return resolveSkillCli();
|
|
31
47
|
}
|
|
32
48
|
export function assertCliPresent(path) {
|
|
33
49
|
const p = path ?? cliPath();
|
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,MAAM,SAAS,CAAC;AAChD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,MAAM,CAAC,MAAM,aAAa,GAAG,YAAqB,CAAC;AACnD,MAAM,CAAC,MAAM,SAAS,GAAG,0CAAmD,CAAC;AAC7E,MAAM,CAAC,MAAM,gBAAgB,GAAG,iBAA0B,CAAC;AAC3D,MAAM,CAAC,MAAM,eAAe,GAAG,eAAwB,CAAC;AAExD,MAAM,CAAC,MAAM,oBAAoB,GAC/B,wDAAwD,CAAC;AAE3D,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,MAAM,
|
|
1
|
+
{"version":3,"file":"bridge.js","sourceRoot":"","sources":["../src/bridge.ts"],"names":[],"mappings":"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"}
|
package/dist/client.d.ts
CHANGED
|
@@ -13,6 +13,16 @@ export declare const CLIENT_COMPONENT: {
|
|
|
13
13
|
readonly name: "ChefPanel";
|
|
14
14
|
};
|
|
15
15
|
export declare const CLIENT_METHOD: "ilife.chef.read";
|
|
16
|
+
/** 客户端插件声明的 ctx 服务短名(loader 契约之一)。占位实现不读任何服务,故为空数组;
|
|
17
|
+
* `package.json` 的 `dsh.client.inject` 与本数组同为空;真面板接线见 #57。 */
|
|
18
|
+
export declare const inject: readonly string[];
|
|
19
|
+
/** 客户端插件入口(loader 契约之二):DSH 客户端 runner 只把「有 `apply` 函数」的对象当插件
|
|
20
|
+
* (`dsh-cordis-client-runner` 里 `typeof value === 'object' && typeof value.apply === 'function'`)。
|
|
21
|
+
*
|
|
22
|
+
* **这是占位**:真面板接线(槽位注册/软依赖有界重试/AbortSignal 超时/三态渲染)属 #57 那条线。
|
|
23
|
+
* 做成空实现只为让客户端产物在 loader 里是**合法插件**、不阻碍 web profile 启动——
|
|
24
|
+
* 不是把面板「做完」。 */
|
|
25
|
+
export declare function apply(): void;
|
|
16
26
|
export declare function mountSingleClient(port: TabsPort): (() => void) | null;
|
|
17
27
|
export declare function openSingleClient(port: TabsPort, sessionId?: string): void;
|
|
18
28
|
export declare function requestReadViaHost(host: HostCaller, key: string, params?: Record<string, unknown>): Promise<unknown>;
|
package/dist/client.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAG1C,MAAM,WAAW,UAAU;IACzB,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CACvD;AAED,eAAO,MAAM,gBAAgB;;;CAAgB,CAAC;AAC9C,eAAO,MAAM,aAAa,mBAAmB,CAAC;AAE9C,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,QAAQ,GAAG,CAAC,MAAM,IAAI,CAAC,GAAG,IAAI,CAErE;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,QAAQ,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAEzE;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAExH"}
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAG1C,MAAM,WAAW,UAAU;IACzB,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CACvD;AAED,eAAO,MAAM,gBAAgB;;;CAAgB,CAAC;AAC9C,eAAO,MAAM,aAAa,mBAAmB,CAAC;AAE9C;+DAC+D;AAC/D,eAAO,MAAM,MAAM,EAAE,SAAS,MAAM,EAAO,CAAC;AAE5C;;;;;iBAKiB;AACjB,wBAAgB,KAAK,IAAI,IAAI,CAE5B;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,QAAQ,GAAG,CAAC,MAAM,IAAI,CAAC,GAAG,IAAI,CAErE;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,QAAQ,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAEzE;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAExH"}
|
package/dist/client.js
CHANGED
|
@@ -1,20 +1,89 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
1
|
+
window.__ModuleLoader__.load({
|
|
2
|
+
id: "dsh-chef",
|
|
3
|
+
factory: (require) => {
|
|
4
|
+
var module = { exports: {} };
|
|
5
|
+
var exports = module.exports;
|
|
6
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
7
|
+
//#region src/slot.ts
|
|
8
|
+
const SLOT_ID = "ilife:chef";
|
|
9
|
+
const SLOT_TITLE = "大厨";
|
|
10
|
+
/** 写死原生组件描述(纯数据,无按需加载,无外嵌页)。 */
|
|
11
|
+
const TAB_COMPONENT = {
|
|
12
|
+
kind: "native",
|
|
13
|
+
name: "ChefPanel"
|
|
14
|
+
};
|
|
15
|
+
/** 自注册:幂等(调用方持 disposer),失败返回 false 由调用方决定重试。 */
|
|
16
|
+
function registerSingle(port) {
|
|
17
|
+
if (!port.hasTabs()) return null;
|
|
18
|
+
return port.registerTab({
|
|
19
|
+
id: SLOT_ID,
|
|
20
|
+
title: SLOT_TITLE,
|
|
21
|
+
order: 90,
|
|
22
|
+
single: true,
|
|
23
|
+
component: TAB_COMPONENT
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
/** 内容型打开:path seed,折叠面板自动展开。 */
|
|
27
|
+
function openSingle(port, sessionId) {
|
|
28
|
+
if (!port.hasTabs()) return;
|
|
29
|
+
port.openTab({
|
|
30
|
+
type: SLOT_ID,
|
|
31
|
+
path: SLOT_ID
|
|
32
|
+
}, sessionId ? { sessionId } : void 0);
|
|
33
|
+
}
|
|
34
|
+
//#endregion
|
|
35
|
+
//#region src/bridge.ts
|
|
36
|
+
/** dsh-chef 取数桥(P10 脚手架:纯 CLI 单轨)。
|
|
37
|
+
*
|
|
38
|
+
* 面板与跨技能只经 host.call 触发本桥,本桥只经 spawn 调技能包唯一出口
|
|
39
|
+
* packages/skill-chef/dist/cli/cmd_read.js(argv+JSON+exit,stdout 纯 envelope JSON 一行)。
|
|
40
|
+
* 本文件不 import 任何技能实现(只读消费其 dist/CLI);缺失阻断不返空:
|
|
41
|
+
* CLI 缺席/非 0/非 JSON/回执 key 不符一律抛错,绝不返回空数组冒充正常。
|
|
42
|
+
* 技能包不动(只读);combos.yaml 不动。
|
|
43
|
+
*/
|
|
44
|
+
const HOST_CALL_METHOD = "ilife.chef.read";
|
|
45
|
+
//#endregion
|
|
46
|
+
//#region src/client.ts
|
|
47
|
+
/** dsh-chef 客户端存根(P10 脚手架)。
|
|
48
|
+
*
|
|
49
|
+
* 写死槽位原生组件,不做动态按需加载,不做外嵌页。
|
|
50
|
+
* 面板取数只经 host.call 进 host 桥(见 bridge.ts),不 import 技能实现。
|
|
51
|
+
* 缺席纯条件渲染,无轮询(本文件无任何定时器)。
|
|
52
|
+
*/
|
|
53
|
+
const CLIENT_COMPONENT = TAB_COMPONENT;
|
|
54
|
+
const CLIENT_METHOD = HOST_CALL_METHOD;
|
|
55
|
+
/** 客户端插件声明的 ctx 服务短名(loader 契约之一)。占位实现不读任何服务,故为空数组;
|
|
56
|
+
* `package.json` 的 `dsh.client.inject` 与本数组同为空;真面板接线见 #57。 */
|
|
57
|
+
const inject = [];
|
|
58
|
+
/** 客户端插件入口(loader 契约之二):DSH 客户端 runner 只把「有 `apply` 函数」的对象当插件
|
|
59
|
+
* (`dsh-cordis-client-runner` 里 `typeof value === 'object' && typeof value.apply === 'function'`)。
|
|
60
|
+
*
|
|
61
|
+
* **这是占位**:真面板接线(槽位注册/软依赖有界重试/AbortSignal 超时/三态渲染)属 #57 那条线。
|
|
62
|
+
* 做成空实现只为让客户端产物在 loader 里是**合法插件**、不阻碍 web profile 启动——
|
|
63
|
+
* 不是把面板「做完」。 */
|
|
64
|
+
function apply() {}
|
|
65
|
+
function mountSingleClient(port) {
|
|
66
|
+
return registerSingle(port);
|
|
67
|
+
}
|
|
68
|
+
function openSingleClient(port, sessionId) {
|
|
69
|
+
openSingle(port, sessionId);
|
|
70
|
+
}
|
|
71
|
+
function requestReadViaHost(host, key, params = {}) {
|
|
72
|
+
return host.call(HOST_CALL_METHOD, {
|
|
73
|
+
key,
|
|
74
|
+
params
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
//#endregion
|
|
78
|
+
exports.CLIENT_COMPONENT = CLIENT_COMPONENT;
|
|
79
|
+
exports.CLIENT_METHOD = CLIENT_METHOD;
|
|
80
|
+
exports.apply = apply;
|
|
81
|
+
exports.inject = inject;
|
|
82
|
+
exports.mountSingleClient = mountSingleClient;
|
|
83
|
+
exports.openSingleClient = openSingleClient;
|
|
84
|
+
exports.requestReadViaHost = requestReadViaHost;
|
|
85
|
+
return module.exports;
|
|
86
|
+
}
|
|
87
|
+
});
|
|
88
|
+
|
|
20
89
|
//# sourceMappingURL=client.js.map
|
package/dist/client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","
|
|
1
|
+
{"version":3,"file":"client.js","names":[],"sources":["../src/slot.ts","../src/bridge.ts","../src/client.ts"],"sourcesContent":["/** dsh-chef 槽位描述(P10 脚手架,P3 #4 定案)。\n *\n * 写死槽位原生组件:id 命名空间 ilife:chef,order 90。\n * 注册与打开只走 registerTab/openTab 的路径导航;子页后缀(如 ilife:chef:*)\n * 只在主面板内导航,不占栏。缺席纯条件渲染,不轮询(本文件无定时器;\n * 有界重试归一由 base-render 拥有,单品不自建)。\n */\n\nexport const SKILL = 'chef' as const;\nexport const SLOT_ID = 'ilife:chef' as const;\nexport const SLOT_ORDER = 90 as const;\nexport const SLOT_TITLE = '大厨' as const;\nexport const PLUGIN = 'dsh-chef' as const;\nexport const MANAGER_PLUGIN = 'dsh-life-pack' as const;\n\nexport interface SlotDescriptor {\n readonly skill: string;\n readonly slotId: string;\n readonly order: number;\n readonly title: string;\n readonly kind: 'page';\n}\n\nexport function slotDescriptor(): SlotDescriptor {\n return { skill: SKILL, slotId: SLOT_ID, order: SLOT_ORDER, title: SLOT_TITLE, kind: 'page' };\n}\n\n/** 写死原生组件描述(纯数据,无按需加载,无外嵌页)。 */\nexport const TAB_COMPONENT = { kind: 'native', name: 'ChefPanel' } as const;\n\nexport interface TabsPort {\n hasTabs(): boolean;\n registerTab(entry: { readonly id: string; readonly title: string; readonly order: number; readonly single: boolean; readonly component: unknown }): () => void;\n openTab(seed: { readonly type: string; readonly path: string }, scope?: { readonly sessionId?: string }): void;\n}\n\n/** 自注册:幂等(调用方持 disposer),失败返回 false 由调用方决定重试。 */\nexport function registerSingle(port: TabsPort): (() => void) | null {\n if (!port.hasTabs()) return null;\n return port.registerTab({ id: SLOT_ID, title: SLOT_TITLE, order: SLOT_ORDER, single: true, component: TAB_COMPONENT });\n}\n\n/** 内容型打开:path seed,折叠面板自动展开。 */\nexport function openSingle(port: TabsPort, sessionId?: string): void {\n if (!port.hasTabs()) return;\n port.openTab({ type: SLOT_ID, path: SLOT_ID }, sessionId ? { sessionId } : undefined);\n}\n","/** dsh-chef 取数桥(P10 脚手架:纯 CLI 单轨)。\n *\n * 面板与跨技能只经 host.call 触发本桥,本桥只经 spawn 调技能包唯一出口\n * packages/skill-chef/dist/cli/cmd_read.js(argv+JSON+exit,stdout 纯 envelope JSON 一行)。\n * 本文件不 import 任何技能实现(只读消费其 dist/CLI);缺失阻断不返空:\n * CLI 缺席/非 0/非 JSON/回执 key 不符一律抛错,绝不返回空数组冒充正常。\n * 技能包不动(只读);combos.yaml 不动。\n */\nimport { spawnSync } from 'node:child_process';\nimport { accessSync, constants } from 'node:fs';\nimport { createRequire } from 'node:module';\nimport { join, dirname } from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nexport const SKILL_PACKAGE = 'skill-chef' as const;\nexport const SKILL_CLI = 'packages/skill-chef/dist/cli/cmd_read.js' as const;\nexport const HOST_CALL_METHOD = 'ilife.chef.read' as const;\nexport const MANAGER_PACKAGE = 'dsh-life-pack' as const;\n\nexport const MANAGER_MISSING_HINT =\n '总管缺席,请补装:dsh plugin add dsh-life-pack dsh-chef(不许单卸总管)';\n\nexport class SkillBridgeError extends Error {\n readonly code: 'missing-cli' | 'fetch-failed' | 'bad-json' | 'key-mismatch';\n constructor(code: SkillBridgeError['code'], message: string) {\n super(message);\n this.name = 'SkillBridgeError';\n this.code = code;\n }\n}\n\nfunction repoRoot(): string {\n return join(dirname(fileURLToPath(import.meta.url)), '..', '..', '..');\n}\n\n/** 包内 CLI 相对路径(相对技能包根,与 SKILL_CLI 尾段一致)。 */\nexport const SKILL_CLI_REL = 'dist/cli/cmd_read.js' as const;\n\n/** 按包名解析技能出口(#50 修法①之二,照抄 #48 卡路里样板):createRequire 定位技能包(SKILL_PACKAGE)\n * 的 package.json,再拼包内 dist/cli/cmd_read.js。只读消费其 dist/CLI(spawn),\n * 绝不 import 技能实现。包名解析失败回退单仓相对路径;两者皆无由 assertCliPresent\n * 抛 missing-cli(缺失阻断不返空)。 */\nfunction resolveSkillCli(): string {\n try {\n const pkgJson = createRequire(import.meta.url).resolve(SKILL_PACKAGE + '/package.json');\n return join(dirname(pkgJson), SKILL_CLI_REL);\n } catch {\n return join(repoRoot(), SKILL_CLI);\n }\n}\n\nexport function cliPath(): string {\n return resolveSkillCli();\n}\n\nexport function assertCliPresent(path?: string): void {\n const p = path ?? cliPath();\n try {\n accessSync(p, constants.R_OK);\n } catch {\n throw new SkillBridgeError('missing-cli', '技能出口缺失(先构建对应包):' + p);\n }\n}\n\n/** host.call 侧处理函数:由 host 注册到 connection RPC,供面板调用。 */\nexport function handleHostCall(key: string, params: Record<string, unknown> = {}): unknown {\n return readViaCli(key, params);\n}\n\n/** 面板侧请求函数:只经 host.call,不直调技能实现。 */\nexport function requestViaHost(host: { call(method: string, args: unknown): Promise<unknown> }, key: string, params: Record<string, unknown> = {}): Promise<unknown> {\n return host.call(HOST_CALL_METHOD, { key, params });\n}\n\n/** 同步取数:spawn 技能 cmd_read,返回 envelope data(缺失阻断)。 */\nexport function readViaCli(key: string, params: Record<string, unknown> = {}): unknown {\n const bin = cliPath();\n assertCliPresent(bin);\n const node = process.execPath;\n const r = spawnSync(node, [bin, key, '--params', JSON.stringify(params)], { encoding: 'utf8' });\n if (r.error) throw new SkillBridgeError('fetch-failed', '出口 spawn 失败:' + (r.error as Error).message);\n if (r.status !== 0) {\n const tail = String(r.stderr ?? '').trim().split('\\n').pop() ?? '';\n throw new SkillBridgeError('fetch-failed', '出口非 0(' + String(r.status) + '):' + tail);\n }\n let env: { key?: unknown; data?: unknown };\n try {\n env = JSON.parse(String(r.stdout)) as { key?: unknown; data?: unknown };\n } catch {\n throw new SkillBridgeError('bad-json', '出口非 JSON');\n }\n if (!env || env.key !== key) throw new SkillBridgeError('key-mismatch', '出口回执 key 不符');\n if (env.data === null || env.data === undefined) throw new SkillBridgeError('fetch-failed', '缺失阻断取数,不返空:' + key);\n return env.data;\n}\n","/** dsh-chef 客户端存根(P10 脚手架)。\n *\n * 写死槽位原生组件,不做动态按需加载,不做外嵌页。\n * 面板取数只经 host.call 进 host 桥(见 bridge.ts),不 import 技能实现。\n * 缺席纯条件渲染,无轮询(本文件无任何定时器)。\n */\n\nimport { TAB_COMPONENT, registerSingle, openSingle } from './slot.js';\nimport type { TabsPort } from './slot.js';\nimport { HOST_CALL_METHOD } from './bridge.js';\n\nexport interface HostCaller {\n call(method: string, args: unknown): Promise<unknown>;\n}\n\nexport const CLIENT_COMPONENT = TAB_COMPONENT;\nexport const CLIENT_METHOD = HOST_CALL_METHOD;\n\n/** 客户端插件声明的 ctx 服务短名(loader 契约之一)。占位实现不读任何服务,故为空数组;\n * `package.json` 的 `dsh.client.inject` 与本数组同为空;真面板接线见 #57。 */\nexport const inject: readonly string[] = [];\n\n/** 客户端插件入口(loader 契约之二):DSH 客户端 runner 只把「有 `apply` 函数」的对象当插件\n * (`dsh-cordis-client-runner` 里 `typeof value === 'object' && typeof value.apply === 'function'`)。\n *\n * **这是占位**:真面板接线(槽位注册/软依赖有界重试/AbortSignal 超时/三态渲染)属 #57 那条线。\n * 做成空实现只为让客户端产物在 loader 里是**合法插件**、不阻碍 web profile 启动——\n * 不是把面板「做完」。 */\nexport function apply(): void {\n // 面板接线见 #57。\n}\n\nexport function mountSingleClient(port: TabsPort): (() => void) | null {\n return registerSingle(port);\n}\n\nexport function openSingleClient(port: TabsPort, sessionId?: string): void {\n openSingle(port, sessionId);\n}\n\nexport function requestReadViaHost(host: HostCaller, key: string, params: Record<string, unknown> = {}): Promise<unknown> {\n return host.call(HOST_CALL_METHOD, { key, params });\n}\n"],"mappings":";;;;;;;EASA,MAAa,UAAU;EAEvB,MAAa,aAAa;;EAiB1B,MAAa,gBAAgB;GAAE,MAAM;GAAU,MAAM;EAAY;;EASjE,SAAgB,eAAe,MAAqC;GAClE,IAAI,CAAC,KAAK,QAAQ,GAAG,OAAO;GAC5B,OAAO,KAAK,YAAY;IAAE,IAAI;IAAS,OAAO;IAAY,OAAA;IAAmB,QAAQ;IAAM,WAAW;GAAc,CAAC;EACvH;;EAGA,SAAgB,WAAW,MAAgB,WAA0B;GACnE,IAAI,CAAC,KAAK,QAAQ,GAAG;GACrB,KAAK,QAAQ;IAAE,MAAM;IAAS,MAAM;GAAQ,GAAG,YAAY,EAAE,UAAU,IAAI,KAAA,CAAS;EACtF;;;;;;;;;;;EC9BA,MAAa,mBAAmB;;;;;;;;;ECDhC,MAAa,mBAAmB;EAChC,MAAa,gBAAgB;;;EAI7B,MAAa,SAA4B,CAAC;;;;;;;EAQ1C,SAAgB,QAAc,CAE9B;EAEA,SAAgB,kBAAkB,MAAqC;GACrE,OAAO,eAAe,IAAI;EAC5B;EAEA,SAAgB,iBAAiB,MAAgB,WAA0B;GACzE,WAAW,MAAM,SAAS;EAC5B;EAEA,SAAgB,mBAAmB,MAAkB,KAAa,SAAkC,CAAC,GAAqB;GACxH,OAAO,KAAK,KAAK,kBAAkB;IAAE;IAAK;GAAO,CAAC;EACpD"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/** DSH ctx 最小镜像(只含本仓实际使用的面;type-only,构建期擦除,零运行时)。
|
|
2
|
+
*
|
|
3
|
+
* skills 面出处见 `docs/agents/dsh-client-contract.md` §12(#56 卡路里样板,#150 记账同形,#218 大厨同形):
|
|
4
|
+
* `ctx.skills.registerProvider(create)`(`dsh-skill/lib/index.js:147`);
|
|
5
|
+
* candidate 校验红线见 `validateCandidate`(同文件 `:452`);`get` 回定义须与候选同名(同文件 `:259`)。
|
|
6
|
+
* 禁止加镜外成员:要用新能力,先在 cookbook 落出处,再加镜像。用 `import type` 引用本文件。
|
|
7
|
+
*
|
|
8
|
+
* 本插件当前只用到 skills 这一面(面板取数走自家 `bridge.ts`,不经宿主 RPC 面),故只镜像到够用为止。
|
|
9
|
+
*/
|
|
10
|
+
/** 技能的调用策略(模型可调/用户可调)。 */
|
|
11
|
+
export interface SkillInvocationPolicy {
|
|
12
|
+
readonly modelInvocable: boolean;
|
|
13
|
+
readonly userInvocable: boolean;
|
|
14
|
+
}
|
|
15
|
+
/** 候选摘要(宿主 `list` 的返回项;`provider` 须等于注册名,否则宿主校验抛)。 */
|
|
16
|
+
export interface SkillCandidate {
|
|
17
|
+
readonly name: string;
|
|
18
|
+
readonly description: string;
|
|
19
|
+
readonly invocation: SkillInvocationPolicy;
|
|
20
|
+
readonly provider: string;
|
|
21
|
+
readonly source: string;
|
|
22
|
+
readonly rank: number;
|
|
23
|
+
readonly locator: unknown;
|
|
24
|
+
readonly resourceBase?: {
|
|
25
|
+
readonly kind: 'directory';
|
|
26
|
+
readonly path: string;
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
/** 技能全文(宿主 `get` 的返回项;`content` 为 frontmatter 后正文)。 */
|
|
30
|
+
export interface SkillDefinition {
|
|
31
|
+
readonly name: string;
|
|
32
|
+
readonly description: string;
|
|
33
|
+
readonly invocation: SkillInvocationPolicy;
|
|
34
|
+
readonly provider: string;
|
|
35
|
+
readonly source: string;
|
|
36
|
+
readonly resourceBase?: {
|
|
37
|
+
readonly kind: 'directory';
|
|
38
|
+
readonly path: string;
|
|
39
|
+
};
|
|
40
|
+
readonly content: string;
|
|
41
|
+
}
|
|
42
|
+
export interface SkillProvider {
|
|
43
|
+
readonly name: string;
|
|
44
|
+
list(options?: unknown): Promise<readonly SkillCandidate[]>;
|
|
45
|
+
get(candidate: SkillCandidate, options?: unknown): Promise<SkillDefinition | undefined>;
|
|
46
|
+
}
|
|
47
|
+
export interface SkillsFace {
|
|
48
|
+
registerProvider(create: (control: {
|
|
49
|
+
readonly signal: AbortSignal;
|
|
50
|
+
invalidate(): void;
|
|
51
|
+
}) => SkillProvider): () => void;
|
|
52
|
+
}
|
|
53
|
+
/** 本插件用到的宿主面(apply 入参)。 */
|
|
54
|
+
export interface SkillHostCtx {
|
|
55
|
+
readonly skills: SkillsFace;
|
|
56
|
+
readonly logger?: unknown;
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=dsh-ctx.d.ts.map
|
|
@@ -0,0 +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"}
|
package/dist/dsh-ctx.js
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/** DSH ctx 最小镜像(只含本仓实际使用的面;type-only,构建期擦除,零运行时)。
|
|
2
|
+
*
|
|
3
|
+
* skills 面出处见 `docs/agents/dsh-client-contract.md` §12(#56 卡路里样板,#150 记账同形,#218 大厨同形):
|
|
4
|
+
* `ctx.skills.registerProvider(create)`(`dsh-skill/lib/index.js:147`);
|
|
5
|
+
* candidate 校验红线见 `validateCandidate`(同文件 `:452`);`get` 回定义须与候选同名(同文件 `:259`)。
|
|
6
|
+
* 禁止加镜外成员:要用新能力,先在 cookbook 落出处,再加镜像。用 `import type` 引用本文件。
|
|
7
|
+
*
|
|
8
|
+
* 本插件当前只用到 skills 这一面(面板取数走自家 `bridge.ts`,不经宿主 RPC 面),故只镜像到够用为止。
|
|
9
|
+
*/
|
|
10
|
+
export {};
|
|
11
|
+
//# sourceMappingURL=dsh-ctx.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dsh-ctx.js","sourceRoot":"","sources":["../src/dsh-ctx.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,16 +1,12 @@
|
|
|
1
|
-
|
|
2
|
-
*
|
|
3
|
-
* 形态:cordis 插件(name/inject/apply)+ dsh.bundle.patch 装配行。
|
|
4
|
-
* 单品硬依赖总管(dependencies,非 peer,见 package.json);设置页住本包。
|
|
5
|
-
*/
|
|
1
|
+
import type { SkillHostCtx } from './dsh-ctx.js';
|
|
6
2
|
export declare const name = "dsh-chef";
|
|
7
3
|
export declare const inject: readonly string[];
|
|
8
|
-
export declare function apply(
|
|
4
|
+
export declare function apply(ctx: SkillHostCtx): void;
|
|
9
5
|
export { SKILL, SLOT_ID, SLOT_ORDER, SLOT_TITLE, PLUGIN, MANAGER_PLUGIN, slotDescriptor, TAB_COMPONENT, registerSingle, openSingle } from './slot.js';
|
|
10
6
|
export type { SlotDescriptor, TabsPort } from './slot.js';
|
|
11
7
|
export { SETTINGS_OWNER, SETTINGS_SLOT, SETTING_ROWS } from './settings.js';
|
|
12
8
|
export type { SettingRow } from './settings.js';
|
|
13
|
-
export { SKILL_PACKAGE, SKILL_CLI, HOST_CALL_METHOD, MANAGER_MISSING_HINT, SkillBridgeError, cliPath, assertCliPresent, handleHostCall, requestViaHost, readViaCli } from './bridge.js';
|
|
14
|
-
export {
|
|
15
|
-
export type {
|
|
9
|
+
export { SKILL_PACKAGE, SKILL_CLI, SKILL_CLI_REL, HOST_CALL_METHOD, MANAGER_MISSING_HINT, SkillBridgeError, cliPath, assertCliPresent, handleHostCall, requestViaHost, readViaCli } from './bridge.js';
|
|
10
|
+
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';
|
|
16
12
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -2,14 +2,42 @@
|
|
|
2
2
|
*
|
|
3
3
|
* 形态:cordis 插件(name/inject/apply)+ dsh.bundle.patch 装配行。
|
|
4
4
|
* 单品硬依赖总管(dependencies,非 peer,见 package.json);设置页住本包。
|
|
5
|
+
*
|
|
6
|
+
* #218:`inject` 加 `skills`,`apply` 注册**打包技能提供方**(见 skill-provider.ts)——
|
|
7
|
+
* DSH 里的 agent 由此知道有 `skill-chef` 这个技能(名+介绍,可按需读全文调 CLI)。
|
|
8
|
+
* 提供方是宿主按名去重的单例:重装配时退让(照 #56 卡路里/#150 记账样板),他错重抛。
|
|
5
9
|
*/
|
|
10
|
+
import { PROVIDER_NAME, provider as skillProvider } from './skill-provider.js';
|
|
6
11
|
export const name = 'dsh-chef';
|
|
7
|
-
export const inject = [];
|
|
8
|
-
export function apply(
|
|
9
|
-
|
|
12
|
+
export const inject = ['skills'];
|
|
13
|
+
export function apply(ctx) {
|
|
14
|
+
const loggerSource = ctx?.logger;
|
|
15
|
+
const logger = (typeof loggerSource === 'function'
|
|
16
|
+
? loggerSource(name)
|
|
17
|
+
: loggerSource) ?? console;
|
|
18
|
+
try {
|
|
19
|
+
ctx.skills.registerProvider(() => skillProvider);
|
|
20
|
+
}
|
|
21
|
+
catch (error) {
|
|
22
|
+
// 提供方是宿主按名去重的单例:重装配时上一实例可能已注册,此时退让;他错重抛。
|
|
23
|
+
if (!String(error?.message ?? error).includes('already registered'))
|
|
24
|
+
throw error;
|
|
25
|
+
logger.warn?.('[dsh-chef] skill provider ' + PROVIDER_NAME + ' already registered by another instance; yielding');
|
|
26
|
+
}
|
|
10
27
|
}
|
|
11
28
|
export { SKILL, SLOT_ID, SLOT_ORDER, SLOT_TITLE, PLUGIN, MANAGER_PLUGIN, slotDescriptor, TAB_COMPONENT, registerSingle, openSingle } from './slot.js';
|
|
12
29
|
export { SETTINGS_OWNER, SETTINGS_SLOT, SETTING_ROWS } from './settings.js';
|
|
13
|
-
export { SKILL_PACKAGE, SKILL_CLI, HOST_CALL_METHOD, MANAGER_MISSING_HINT, SkillBridgeError, cliPath, assertCliPresent, handleHostCall, requestViaHost, readViaCli } from './bridge.js';
|
|
14
|
-
|
|
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 工厂包**
|
|
32
|
+
// (`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 参数就地声明。
|
|
42
|
+
export { PROVIDER_NAME, SKILL_NAME, BUNDLED_SKILL_RANK, SKILL_FILE, skillDir, parseSkillText, provider as skillProvider } from './skill-provider.js';
|
|
15
43
|
//# 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
|
|
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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { SkillProvider } from './dsh-ctx.js';
|
|
2
|
+
/** 注册表内的提供方名(bundling 插件;candidate.provider 须与此一致,否则校验抛)。 */
|
|
3
|
+
export declare const PROVIDER_NAME: "dsh-chef";
|
|
4
|
+
/** 技能名(与 `packages/skill-chef/SKILL.md` frontmatter `name` 同值,由 test 逐字锁)。 */
|
|
5
|
+
export declare const SKILL_NAME: "skill-chef";
|
|
6
|
+
/** 打包技能标准优先级(与宿主 `BUNDLED_SKILL_RANK` 同值,内联,零依赖)。 */
|
|
7
|
+
export declare const BUNDLED_SKILL_RANK: 600;
|
|
8
|
+
export declare const SKILL_FILE: "SKILL.md";
|
|
9
|
+
/** 按包名定位技能包根目录(安装态 `node_modules/skill-chef`,单仓 dev 态 workspace 链接)。 */
|
|
10
|
+
export declare function skillDir(): string;
|
|
11
|
+
interface ParsedSkill {
|
|
12
|
+
readonly name: string;
|
|
13
|
+
readonly description: string;
|
|
14
|
+
readonly body: string;
|
|
15
|
+
}
|
|
16
|
+
/** 最小 frontmatter 解析(宿主零依赖,不引 yaml;缺头/缺字段返回 null,由调用方按缺席记)。
|
|
17
|
+
* name 正则放行连字符(`skill-chef`)。 */
|
|
18
|
+
export declare function parseSkillText(text: string): ParsedSkill | null;
|
|
19
|
+
/** badge 同形 provider(`list` 给摘要,`get` 给全文;`get` 只认名,忽略 locator 外的候选字段)。 */
|
|
20
|
+
export declare const provider: SkillProvider;
|
|
21
|
+
export {};
|
|
22
|
+
//# sourceMappingURL=skill-provider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skill-provider.d.ts","sourceRoot":"","sources":["../src/skill-provider.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAmC,aAAa,EAAE,MAAM,cAAc,CAAC;AAGnF,6DAA6D;AAC7D,eAAO,MAAM,aAAa,EAAG,UAAmB,CAAC;AAEjD,8EAA8E;AAC9E,eAAO,MAAM,UAAU,EAAG,YAAqB,CAAC;AAEhD,qDAAqD;AACrD,eAAO,MAAM,kBAAkB,EAAG,GAAY,CAAC;AAE/C,eAAO,MAAM,UAAU,EAAG,UAAmB,CAAC;AAE9C,wEAAwE;AACxE,wBAAgB,QAAQ,IAAI,MAAM,CAGjC;AAED,UAAU,WAAW;IACnB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AAED;kCACkC;AAClC,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI,CAqB/D;AAqDD,2EAA2E;AAC3E,eAAO,MAAM,QAAQ,EAAE,aAItB,CAAC"}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
/** dsh-chef 打包技能提供方(#218 大厨线,照 #56 卡路里样板/#150 记账同形)。
|
|
2
|
+
*
|
|
3
|
+
* 形态对照 `dsh-skill-badge`(出处见 `docs/agents/dsh-client-contract.md` §12):
|
|
4
|
+
* cordis 侧 `inject` 加 `skills`(见 index.ts),本文件只提供 provider 对象,
|
|
5
|
+
* 由 `apply` 经 `ctx.skills.registerProvider(() => provider)` 注册。
|
|
6
|
+
*
|
|
7
|
+
* 单份 SKILL.md 按包名解析(`createRequire.resolve('skill-chef/package.json')`
|
|
8
|
+
* 再拼 `SKILL.md`,**不复制**,避免双份腐化;不走 `exports` 子路径,免补 `./SKILL.md` 导出);
|
|
9
|
+
* `name` 用 `skill-chef`(与 SKILL.md frontmatter 同值,描述取文件实测值,不在插件内硬编码第二份);
|
|
10
|
+
* `rank` 内联 600(宿主 `BUNDLED_SKILL_RANK` 同值,不从宿主 import,保持零依赖);
|
|
11
|
+
* `source` 为 `bundled`;`content` 取 frontmatter 后正文(filesystem `parseSkillFile` 同形)。
|
|
12
|
+
*
|
|
13
|
+
* 本文件只读消费技能包的 SKILL.md(文本),从不 import 任何技能实现。
|
|
14
|
+
*/
|
|
15
|
+
import { readFile } from 'node:fs/promises';
|
|
16
|
+
import { createRequire } from 'node:module';
|
|
17
|
+
import { dirname, join } from 'node:path';
|
|
18
|
+
import { SKILL_PACKAGE } from './bridge.js';
|
|
19
|
+
/** 注册表内的提供方名(bundling 插件;candidate.provider 须与此一致,否则校验抛)。 */
|
|
20
|
+
export const PROVIDER_NAME = 'dsh-chef';
|
|
21
|
+
/** 技能名(与 `packages/skill-chef/SKILL.md` frontmatter `name` 同值,由 test 逐字锁)。 */
|
|
22
|
+
export const SKILL_NAME = 'skill-chef';
|
|
23
|
+
/** 打包技能标准优先级(与宿主 `BUNDLED_SKILL_RANK` 同值,内联,零依赖)。 */
|
|
24
|
+
export const BUNDLED_SKILL_RANK = 600;
|
|
25
|
+
export const SKILL_FILE = 'SKILL.md';
|
|
26
|
+
/** 按包名定位技能包根目录(安装态 `node_modules/skill-chef`,单仓 dev 态 workspace 链接)。 */
|
|
27
|
+
export function skillDir() {
|
|
28
|
+
const pkgJson = createRequire(import.meta.url).resolve(SKILL_PACKAGE + '/package.json');
|
|
29
|
+
return dirname(pkgJson);
|
|
30
|
+
}
|
|
31
|
+
/** 最小 frontmatter 解析(宿主零依赖,不引 yaml;缺头/缺字段返回 null,由调用方按缺席记)。
|
|
32
|
+
* name 正则放行连字符(`skill-chef`)。 */
|
|
33
|
+
export function parseSkillText(text) {
|
|
34
|
+
const normalized = text.replace(/\r\n/g, '\n');
|
|
35
|
+
if (!normalized.startsWith('---\n'))
|
|
36
|
+
return null;
|
|
37
|
+
const lines = normalized.split('\n');
|
|
38
|
+
const end = lines.indexOf('---', 1);
|
|
39
|
+
if (end < 2)
|
|
40
|
+
return null;
|
|
41
|
+
const data = {};
|
|
42
|
+
for (const ln of lines.slice(1, end)) {
|
|
43
|
+
const m = /^([A-Za-z0-9_-]+):\s*(.*)$/.exec(ln);
|
|
44
|
+
if (!m)
|
|
45
|
+
return null;
|
|
46
|
+
let v = (m[2] ?? '').trim();
|
|
47
|
+
if (v.length >= 2 && ((v.startsWith('"') && v.endsWith('"')) || (v.startsWith("'") && v.endsWith("'")))) {
|
|
48
|
+
v = v.slice(1, -1);
|
|
49
|
+
}
|
|
50
|
+
data[m[1]] = v;
|
|
51
|
+
}
|
|
52
|
+
const name = data['name'];
|
|
53
|
+
const description = data['description'];
|
|
54
|
+
if (!name || !description)
|
|
55
|
+
return null;
|
|
56
|
+
if (!/^[\p{L}0-9]+(?:-[\p{L}0-9]+)*$/u.test(name))
|
|
57
|
+
return null;
|
|
58
|
+
return { name, description, body: lines.slice(end + 1).join('\n').trim() };
|
|
59
|
+
}
|
|
60
|
+
async function loadSkill() {
|
|
61
|
+
let dir;
|
|
62
|
+
try {
|
|
63
|
+
dir = skillDir();
|
|
64
|
+
}
|
|
65
|
+
catch {
|
|
66
|
+
return null;
|
|
67
|
+
}
|
|
68
|
+
let raw;
|
|
69
|
+
try {
|
|
70
|
+
raw = await readFile(join(dir, SKILL_FILE), 'utf8');
|
|
71
|
+
}
|
|
72
|
+
catch {
|
|
73
|
+
return null;
|
|
74
|
+
}
|
|
75
|
+
const parsed = parseSkillText(raw);
|
|
76
|
+
if (!parsed)
|
|
77
|
+
return null;
|
|
78
|
+
return { dir, parsed };
|
|
79
|
+
}
|
|
80
|
+
async function listSkills() {
|
|
81
|
+
const loaded = await loadSkill();
|
|
82
|
+
if (!loaded)
|
|
83
|
+
return [];
|
|
84
|
+
return [
|
|
85
|
+
{
|
|
86
|
+
name: loaded.parsed.name,
|
|
87
|
+
description: loaded.parsed.description,
|
|
88
|
+
invocation: { modelInvocable: true, userInvocable: true },
|
|
89
|
+
provider: PROVIDER_NAME,
|
|
90
|
+
source: 'bundled',
|
|
91
|
+
resourceBase: { kind: 'directory', path: loaded.dir },
|
|
92
|
+
rank: BUNDLED_SKILL_RANK,
|
|
93
|
+
locator: { path: join(loaded.dir, SKILL_FILE) },
|
|
94
|
+
},
|
|
95
|
+
];
|
|
96
|
+
}
|
|
97
|
+
async function getSkill(candidate) {
|
|
98
|
+
const loaded = await loadSkill();
|
|
99
|
+
if (!loaded)
|
|
100
|
+
return undefined;
|
|
101
|
+
// 候选过期(注册后 SKILL.md 改名)按宿主契约失效,不抛。
|
|
102
|
+
if (!candidate || candidate.name !== loaded.parsed.name)
|
|
103
|
+
return undefined;
|
|
104
|
+
return {
|
|
105
|
+
name: loaded.parsed.name,
|
|
106
|
+
description: loaded.parsed.description,
|
|
107
|
+
invocation: { modelInvocable: true, userInvocable: true },
|
|
108
|
+
provider: PROVIDER_NAME,
|
|
109
|
+
source: 'bundled',
|
|
110
|
+
resourceBase: { kind: 'directory', path: loaded.dir },
|
|
111
|
+
content: loaded.parsed.body,
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
/** badge 同形 provider(`list` 给摘要,`get` 给全文;`get` 只认名,忽略 locator 外的候选字段)。 */
|
|
115
|
+
export const provider = {
|
|
116
|
+
name: PROVIDER_NAME,
|
|
117
|
+
list: () => listSkills(),
|
|
118
|
+
get: (candidate) => getSkill(candidate),
|
|
119
|
+
};
|
|
120
|
+
//# sourceMappingURL=skill-provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skill-provider.js","sourceRoot":"","sources":["../src/skill-provider.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "dsh-chef",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.0",
|
|
4
4
|
"description": "爱生活单品插件 P10 脚手架:大厨(ilife:chef order 90),硬依赖总管 dsh-life-pack",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -25,7 +25,8 @@
|
|
|
25
25
|
"node": ">=22.13"
|
|
26
26
|
},
|
|
27
27
|
"dependencies": {
|
|
28
|
-
"dsh-life-pack": "
|
|
28
|
+
"dsh-life-pack": "^0.2.0",
|
|
29
|
+
"skill-chef": "0.2.0"
|
|
29
30
|
},
|
|
30
31
|
"dsh": {
|
|
31
32
|
"bundle": {
|
|
@@ -37,7 +38,13 @@
|
|
|
37
38
|
}
|
|
38
39
|
},
|
|
39
40
|
"scripts": {
|
|
40
|
-
"build": "
|
|
41
|
+
"build": "npm run build:host && npm run build:client",
|
|
42
|
+
"build:host": "tsc -b",
|
|
43
|
+
"build:client": "tsdown",
|
|
44
|
+
"typecheck": "tsc -p tsconfig.client.json",
|
|
41
45
|
"test": "node --test test/smoke.test.mjs"
|
|
46
|
+
},
|
|
47
|
+
"devDependencies": {
|
|
48
|
+
"tsdown": "0.22.14"
|
|
42
49
|
}
|
|
43
50
|
}
|