dsh-calorie 0.2.7 → 0.3.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.
- package/dist/client.js +176 -55
- package/dist/client.js.map +1 -1
- package/dist/dsh-ctx.d.ts +46 -1
- package/dist/dsh-ctx.d.ts.map +1 -1
- package/dist/dsh-ctx.js +2 -1
- package/dist/dsh-ctx.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +21 -1
- package/dist/index.js.map +1 -1
- package/dist/settings.d.ts +11 -5
- package/dist/settings.d.ts.map +1 -1
- package/dist/settings.js +22 -18
- package/dist/settings.js.map +1 -1
- package/dist/skill-tool.d.ts +21 -0
- package/dist/skill-tool.d.ts.map +1 -0
- package/dist/skill-tool.js +109 -0
- package/dist/skill-tool.js.map +1 -0
- package/package.json +3 -3
package/dist/settings.js
CHANGED
|
@@ -12,7 +12,9 @@
|
|
|
12
12
|
* 的 `CALORIE_CONFIG_DEFAULTS`(本文件是它在页面上的投影,逐键对齐由
|
|
13
13
|
* `test/config-surface-676.test.mjs` 用源码文本锁死);
|
|
14
14
|
* · **空串=按默认落点**(老落点由技能各取用处算)。所以「空」不是「没配」,
|
|
15
|
-
*
|
|
15
|
+
* 而是「还走改造前那个位置」,老数据不会看起来丢了——行文案按这个语义写;
|
|
16
|
+
* · `db.dir` 那一行的落点由配置面回执的 `dataDir` 带回(解析好的绝对路径),页面上把它**预填**进
|
|
17
|
+
* 该行(`prefillFrom: 'dataDir'`),用户不必自己拼路径(#743)。
|
|
16
18
|
*/
|
|
17
19
|
export const SETTINGS_OWNER = 'dsh-calorie';
|
|
18
20
|
export const SETTINGS_SLOT = 'ilife:calorie';
|
|
@@ -24,36 +26,38 @@ const COMMON = [
|
|
|
24
26
|
key: 'db.dir',
|
|
25
27
|
title: '数据目录',
|
|
26
28
|
tier: 'common',
|
|
27
|
-
control: '
|
|
28
|
-
|
|
29
|
+
control: 'directory',
|
|
30
|
+
// 留空=技能按默认目录落文件;页面上把解析出来的绝对路径直接填进这一行(见 client.ts 的 toDraft)。
|
|
31
|
+
prefillFrom: 'dataDir',
|
|
32
|
+
hint: '库文件与各类产物的根目录。留空=用默认目录。',
|
|
29
33
|
},
|
|
30
34
|
{
|
|
31
35
|
key: 'db.name',
|
|
32
36
|
title: '库文件名',
|
|
33
37
|
tier: 'common',
|
|
34
38
|
control: 'text',
|
|
35
|
-
hint: '
|
|
39
|
+
hint: '数据目录下的数据库文件名。改名=换库,旧数据不会被读入。',
|
|
36
40
|
},
|
|
37
41
|
{
|
|
38
42
|
key: 'html.dir',
|
|
39
43
|
title: 'HTML 产物目录名',
|
|
40
44
|
tier: 'common',
|
|
41
45
|
control: 'text',
|
|
42
|
-
hint: '
|
|
46
|
+
hint: '数据目录下存放交付页面的子目录名。改名后新页面落新目录。',
|
|
43
47
|
},
|
|
44
48
|
{
|
|
45
49
|
key: 'photos.dir',
|
|
46
50
|
title: '照片目录',
|
|
47
51
|
tier: 'common',
|
|
48
|
-
control: '
|
|
49
|
-
hint: '
|
|
52
|
+
control: 'directory',
|
|
53
|
+
hint: '身材照的存放目录(绝对路径)。留空=未配置,生成 GIF 会被拦下。',
|
|
50
54
|
},
|
|
51
55
|
{
|
|
52
56
|
key: 'xunji.key',
|
|
53
57
|
title: '训记 KEY',
|
|
54
58
|
tier: 'common',
|
|
55
59
|
control: 'text',
|
|
56
|
-
hint: '
|
|
60
|
+
hint: '训记的凭据。留空=未配置,推送与回写会被拦下。',
|
|
57
61
|
},
|
|
58
62
|
];
|
|
59
63
|
/** 高级项:默认收起(13 项减常用 5 项=8 项)。改错了多半只是自己撞上麻烦,不确定就别动。 */
|
|
@@ -63,56 +67,56 @@ const ADVANCED = [
|
|
|
63
67
|
title: '照片 GIF 子目录',
|
|
64
68
|
tier: 'advanced',
|
|
65
69
|
control: 'text',
|
|
66
|
-
hint: '
|
|
70
|
+
hint: '照片目录下存放 GIF 的子目录名。',
|
|
67
71
|
},
|
|
68
72
|
{
|
|
69
73
|
key: 'xunji.stateDir',
|
|
70
74
|
title: '训记状态文件目录',
|
|
71
75
|
tier: 'advanced',
|
|
72
|
-
control: '
|
|
73
|
-
hint: '
|
|
76
|
+
control: 'directory',
|
|
77
|
+
hint: '训记的限频与同步游标存放目录。留空=家目录下的 .mavis。',
|
|
74
78
|
},
|
|
75
79
|
{
|
|
76
80
|
key: 'xunji.catalog',
|
|
77
81
|
title: '训记动作库路径',
|
|
78
82
|
tier: 'advanced',
|
|
79
83
|
control: 'text',
|
|
80
|
-
hint: '
|
|
84
|
+
hint: '动作名判定用的动作库。留空=用包内预置的那份。',
|
|
81
85
|
},
|
|
82
86
|
{
|
|
83
87
|
key: 'xunji.backfillDays',
|
|
84
88
|
title: '回写默认天数',
|
|
85
89
|
tier: 'advanced',
|
|
86
90
|
control: 'number',
|
|
87
|
-
hint: '
|
|
91
|
+
hint: '从训记拉实绩时默认回溯的天数(整数)。',
|
|
88
92
|
},
|
|
89
93
|
{
|
|
90
94
|
key: 'land.scheduleCli',
|
|
91
95
|
title: '跨技能出口 · 作息',
|
|
92
96
|
tier: 'advanced',
|
|
93
97
|
control: 'text',
|
|
94
|
-
hint: '
|
|
98
|
+
hint: '「落地训练」调作息技能的入口文件。留空=按包布局推断。',
|
|
95
99
|
},
|
|
96
100
|
{
|
|
97
101
|
key: 'land.memoCli',
|
|
98
102
|
title: '跨技能出口 · 备忘',
|
|
99
103
|
tier: 'advanced',
|
|
100
104
|
control: 'text',
|
|
101
|
-
hint: '
|
|
105
|
+
hint: '「落地训练」调备忘录技能的入口文件。留空=按包布局推断。',
|
|
102
106
|
},
|
|
103
107
|
{
|
|
104
108
|
key: 'land.xunjiSeconds',
|
|
105
109
|
title: '训记调用限时(秒)',
|
|
106
110
|
tier: 'advanced',
|
|
107
111
|
control: 'number',
|
|
108
|
-
hint: '
|
|
112
|
+
hint: '调用训记的超时秒数,超过即失败。',
|
|
109
113
|
},
|
|
110
114
|
{
|
|
111
115
|
key: 'land.landSeconds',
|
|
112
116
|
title: '落地调用限时(秒)',
|
|
113
117
|
tier: 'advanced',
|
|
114
118
|
control: 'number',
|
|
115
|
-
hint: '
|
|
119
|
+
hint: '落地训练各步骤的超时秒数。',
|
|
116
120
|
},
|
|
117
121
|
];
|
|
118
122
|
/** 设置页的行表,顺序即页面顺序。 */
|
|
@@ -121,7 +125,7 @@ export const CONFIG_ITEMS = [...COMMON, ...ADVANCED];
|
|
|
121
125
|
export const COMMON_ITEM_COUNT = COMMON.length;
|
|
122
126
|
/** 高级组标题与副文案。 */
|
|
123
127
|
export const ADVANCED_GROUP_TITLE = '高级';
|
|
124
|
-
export const ADVANCED_GROUP_NOTE = '
|
|
128
|
+
export const ADVANCED_GROUP_NOTE = '不常改。留空=用默认值。';
|
|
125
129
|
/** 按 `a.b` 路径从配置取值里读(缺层或类型不符一律回 undefined)。 */
|
|
126
130
|
export function readPath(values, key) {
|
|
127
131
|
const parts = key.split('.');
|
package/dist/settings.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"settings.js","sourceRoot":"","sources":["../src/settings.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"settings.js","sourceRoot":"","sources":["../src/settings.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { ToolDefinitionMirror } from './dsh-ctx.js';
|
|
2
|
+
/** 模型看到的工具名(DSH 工具名用下划线小写,照 `read_file` 同形)。 */
|
|
3
|
+
export declare const SKILL_TOOL_NAME: "run_calorie_command";
|
|
4
|
+
/** 纯函数:给技能包根目录,读它的 `package.json`,回 `bin` 声明的入口绝对路径。 */
|
|
5
|
+
export declare function resolveSkillEntry(packageDir: string, readFile?: (path: string) => string): string;
|
|
6
|
+
interface SpawnOutcome {
|
|
7
|
+
readonly status: number | null;
|
|
8
|
+
readonly stdout: string;
|
|
9
|
+
readonly stderr: string;
|
|
10
|
+
readonly error?: Error;
|
|
11
|
+
}
|
|
12
|
+
/** 可注入的三个边界(默认走真实现):入口解析、宿主运行时、spawn。 */
|
|
13
|
+
export interface SkillToolDeps {
|
|
14
|
+
readonly entry?: () => string;
|
|
15
|
+
readonly execPath?: () => string;
|
|
16
|
+
readonly run?: (bin: string, argv: readonly string[], env: Record<string, string | undefined>) => SpawnOutcome;
|
|
17
|
+
}
|
|
18
|
+
/** 造工具定义(宿主 `ctx.tools.register` 消费;形状与 `defineTool` 产物一致,见 dsh-ctx 出处)。 */
|
|
19
|
+
export declare function createSkillTool(deps?: SkillToolDeps): ToolDefinitionMirror;
|
|
20
|
+
export {};
|
|
21
|
+
//# sourceMappingURL=skill-tool.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skill-tool.d.ts","sourceRoot":"","sources":["../src/skill-tool.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAGzD,gDAAgD;AAChD,eAAO,MAAM,eAAe,EAAG,qBAA8B,CAAC;AAoB9D,wDAAwD;AACxD,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,GAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAuC,GAAG,MAAM,CAWjI;AAeD,UAAU,YAAY;IAAG,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,KAAK,CAAA;CAAE;AAEnI,yCAAyC;AACzC,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,MAAM,CAAC;IAC9B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,MAAM,CAAC;IACjC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,MAAM,EAAE,EAAE,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,KAAK,YAAY,CAAC;CAChH;AAOD,4EAA4E;AAC5E,wBAAgB,eAAe,CAAC,IAAI,GAAE,aAAkB,GAAG,oBAAoB,CAqC9E"}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
/** 卡路里技能的 agent 调用通道(#734 路线①):把「宿主进程里跑技能唯一出口」这点开给模型。
|
|
2
|
+
*
|
|
3
|
+
* 为什么需要(`docs/agents/技能调用契约.md` §二):DSH 会话 PATH 上只有宿主自己的
|
|
4
|
+
* `dsh`/`pnpm` 两条命令,纯 DSH 机器上会话里连 `node` 都没有 ⇒ 技能说明面里那句
|
|
5
|
+
* 「跑 calorie-cmd-read」在 DSH 里结构性不可解析。本工具**不经会话 shell、不读 PATH**:
|
|
6
|
+
* 在宿主进程里用宿主自带运行时(`resolveNodeBin`,Electron 宿主=该二进制加
|
|
7
|
+
* `ELECTRON_RUN_AS_NODE=1`)spawn 技能唯一出口,把 envelope 原样交给模型。
|
|
8
|
+
*
|
|
9
|
+
* 入口按技能包 `package.json` 的 `bin` 声明解析,不写字面路径(契约 §四):今天=
|
|
10
|
+
* `node_modules/skill-calorie/dist/cli/cmd_read.js`;目录若搬动,这里不用改。
|
|
11
|
+
*/
|
|
12
|
+
import { spawnSync } from 'node:child_process';
|
|
13
|
+
import { readFileSync } from 'node:fs';
|
|
14
|
+
import { dirname, join } from 'node:path';
|
|
15
|
+
import { createRequire } from 'node:module';
|
|
16
|
+
import { SKILL_PACKAGE, SPAWN_TIMEOUT_MS, SkillBridgeError, assertCliPresent, resolveNodeBin } from './bridge.js';
|
|
17
|
+
/** 模型看到的工具名(DSH 工具名用下划线小写,照 `read_file` 同形)。 */
|
|
18
|
+
export const SKILL_TOOL_NAME = 'run_calorie_command';
|
|
19
|
+
const TOOL_DESCRIPTION = '运行卡路里技能的唯一出口(argv+JSON+exit),返回 envelope JSON。'
|
|
20
|
+
+ '写完/看完卡路里数据的唯一途径;不经 shell、不依赖 PATH。'
|
|
21
|
+
+ 'key 例:calorie.help.center(卡路里HELP)、calorie.view.home(看今日主页)、calorie.diet.add(记一餐)。';
|
|
22
|
+
/** 技能包 `package.json` 的 `bin` 声明里,唯一出口那一条的名字后缀。 */
|
|
23
|
+
const EXIT_BIN_SUFFIX = '-cmd-read';
|
|
24
|
+
/** 从 `bin` 声明里挑唯一出口:优先名字以 `-cmd-read` 结尾那条,其次只有一条时用它。 */
|
|
25
|
+
function pickExitBin(bin) {
|
|
26
|
+
if (typeof bin === 'string')
|
|
27
|
+
return bin;
|
|
28
|
+
if (bin === null || typeof bin !== 'object')
|
|
29
|
+
return undefined;
|
|
30
|
+
const entries = Object.entries(bin).filter(([, v]) => typeof v === 'string');
|
|
31
|
+
const named = entries.find(([name]) => name.endsWith(EXIT_BIN_SUFFIX));
|
|
32
|
+
if (named)
|
|
33
|
+
return named[1];
|
|
34
|
+
return entries.length === 1 ? entries[0][1] : undefined;
|
|
35
|
+
}
|
|
36
|
+
/** 纯函数:给技能包根目录,读它的 `package.json`,回 `bin` 声明的入口绝对路径。 */
|
|
37
|
+
export function resolveSkillEntry(packageDir, readFile = (p) => readFileSync(p, 'utf8')) {
|
|
38
|
+
const manifestPath = join(packageDir, 'package.json');
|
|
39
|
+
let manifest;
|
|
40
|
+
try {
|
|
41
|
+
manifest = JSON.parse(readFile(manifestPath));
|
|
42
|
+
}
|
|
43
|
+
catch (cause) {
|
|
44
|
+
throw new SkillBridgeError('missing-cli', '技能包清单读不了:' + manifestPath + '(' + String(cause?.message ?? cause) + ')');
|
|
45
|
+
}
|
|
46
|
+
const entry = pickExitBin(manifest?.bin);
|
|
47
|
+
if (!entry)
|
|
48
|
+
throw new SkillBridgeError('missing-cli', '技能包清单没声明唯一出口(bin):' + manifestPath);
|
|
49
|
+
return join(packageDir, entry);
|
|
50
|
+
}
|
|
51
|
+
/** 默认入口解析:按包名定位已装的技能包(与桥同一处包名定义),再按 `bin` 取入口。 */
|
|
52
|
+
function entryFromInstalledPackage() {
|
|
53
|
+
let packageDir;
|
|
54
|
+
try {
|
|
55
|
+
packageDir = dirname(createRequire(import.meta.url).resolve(SKILL_PACKAGE + '/package.json'));
|
|
56
|
+
}
|
|
57
|
+
catch (cause) {
|
|
58
|
+
throw new SkillBridgeError('missing-cli', '技能包 ' + SKILL_PACKAGE + ' 没装进来:' + String(cause?.message ?? cause));
|
|
59
|
+
}
|
|
60
|
+
const entry = resolveSkillEntry(packageDir);
|
|
61
|
+
assertCliPresent(entry);
|
|
62
|
+
return entry;
|
|
63
|
+
}
|
|
64
|
+
function defaultRun(bin, argv, env) {
|
|
65
|
+
const r = spawnSync(bin, [...argv], { encoding: 'utf8', timeout: SPAWN_TIMEOUT_MS, env, windowsHide: true });
|
|
66
|
+
return { status: r.status, stdout: r.stdout ?? '', stderr: r.stderr ?? '', ...(r.error ? { error: r.error } : {}) };
|
|
67
|
+
}
|
|
68
|
+
/** 造工具定义(宿主 `ctx.tools.register` 消费;形状与 `defineTool` 产物一致,见 dsh-ctx 出处)。 */
|
|
69
|
+
export function createSkillTool(deps = {}) {
|
|
70
|
+
const entryOf = deps.entry ?? entryFromInstalledPackage;
|
|
71
|
+
const execPathOf = deps.execPath ?? (() => process.execPath);
|
|
72
|
+
const run = deps.run ?? defaultRun;
|
|
73
|
+
return {
|
|
74
|
+
name: SKILL_TOOL_NAME,
|
|
75
|
+
description: TOOL_DESCRIPTION,
|
|
76
|
+
parameters: {
|
|
77
|
+
type: 'object',
|
|
78
|
+
properties: {
|
|
79
|
+
key: { type: 'string', description: '命令(calorie.* 键),例如 calorie.help.center' },
|
|
80
|
+
params: { type: 'object', description: '可选参数对象,原样交技能出口(--params JSON)' },
|
|
81
|
+
},
|
|
82
|
+
required: ['key'],
|
|
83
|
+
},
|
|
84
|
+
output: {
|
|
85
|
+
schema: { type: 'string' },
|
|
86
|
+
render: (_args, value) => [{ type: 'text', text: value }],
|
|
87
|
+
},
|
|
88
|
+
async execute(args) {
|
|
89
|
+
const key = args?.key;
|
|
90
|
+
if (typeof key !== 'string' || key.trim().length === 0) {
|
|
91
|
+
throw new Error('缺 key:要跑哪条卡路里命令(例如 calorie.help.center)');
|
|
92
|
+
}
|
|
93
|
+
const entry = entryOf();
|
|
94
|
+
const { bin, extraEnv } = resolveNodeBin(execPathOf());
|
|
95
|
+
const outcome = run(bin, [entry, key, '--params', JSON.stringify(args?.params ?? {})], { ...process.env, ...extraEnv });
|
|
96
|
+
const stdout = outcome.stdout.trim();
|
|
97
|
+
if (outcome.error)
|
|
98
|
+
throw new Error('技能出口起不来:' + String(outcome.error.message) + '(' + entry + ')');
|
|
99
|
+
if (outcome.status !== 0) {
|
|
100
|
+
// 技能契约:非 0 走 stderr,stdout 只承载 envelope;两路都交回,模型据此改用别的命令或报给人看。
|
|
101
|
+
throw new Error('技能出口 exit=' + String(outcome.status) + ':' + (outcome.stderr.trim() || stdout || '(无输出)'));
|
|
102
|
+
}
|
|
103
|
+
if (stdout.length === 0)
|
|
104
|
+
throw new Error('技能出口没给 envelope(stdout 空):' + entry);
|
|
105
|
+
return stdout;
|
|
106
|
+
},
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
//# sourceMappingURL=skill-tool.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skill-tool.js","sourceRoot":"","sources":["../src/skill-tool.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "dsh-calorie",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.1",
|
|
4
4
|
"description": "爱生活单品插件 P10 脚手架:卡路里(ilife:calorie order 75),硬依赖总管 dsh-life-pack",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -25,8 +25,8 @@
|
|
|
25
25
|
"node": ">=22.13"
|
|
26
26
|
},
|
|
27
27
|
"dependencies": {
|
|
28
|
-
"dsh-life-pack": "^0.2
|
|
29
|
-
"skill-calorie": "0.
|
|
28
|
+
"dsh-life-pack": "^0.3.2",
|
|
29
|
+
"skill-calorie": "0.3.0"
|
|
30
30
|
},
|
|
31
31
|
"dsh": {
|
|
32
32
|
"bundle": {
|