@wenaixi/dsh-ponytail 5.0.0 → 5.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/CHANGELOG.md +140 -226
- package/README.md +102 -98
- package/lib/client.js +303 -140
- package/lib/ponytail-config.d.ts +47 -21
- package/lib/ponytail-config.d.ts.map +1 -1
- package/lib/ponytail-config.js +42 -36
- package/lib/ponytail-config.js.map +1 -1
- package/lib/ponytail-instructions.d.ts.map +1 -1
- package/lib/ponytail-instructions.js +31 -31
- package/lib/ponytail-instructions.js.map +1 -1
- package/lib/ponytail-priority.d.ts +10 -8
- package/lib/ponytail-priority.d.ts.map +1 -1
- package/lib/ponytail-priority.js +12 -11
- package/lib/ponytail-priority.js.map +1 -1
- package/lib/ponytail-remote.d.ts +65 -0
- package/lib/ponytail-remote.d.ts.map +1 -0
- package/lib/ponytail-remote.js +141 -0
- package/lib/ponytail-remote.js.map +1 -0
- package/lib/ponytail-settings.d.ts +96 -0
- package/lib/ponytail-settings.d.ts.map +1 -0
- package/lib/ponytail-settings.js +165 -0
- package/lib/ponytail-settings.js.map +1 -0
- package/lib/ponytail-skills.d.ts +10 -0
- package/lib/ponytail-skills.d.ts.map +1 -1
- package/lib/ponytail-skills.js +23 -5
- package/lib/ponytail-skills.js.map +1 -1
- package/lib/ponytail-state.d.ts +8 -4
- package/lib/ponytail-state.d.ts.map +1 -1
- package/lib/ponytail-state.js +40 -39
- package/lib/ponytail-state.js.map +1 -1
- package/lib/ponytail.d.ts +28 -4
- package/lib/ponytail.d.ts.map +1 -1
- package/lib/ponytail.js +181 -83
- package/lib/ponytail.js.map +1 -1
- package/locale/en.json +37 -27
- package/locale/zh.json +37 -27
- package/package.json +3 -1
- package/skills/descriptions.en.json +8 -0
- package/skills/descriptions.zh.json +8 -0
- package/skills/ponytail/SKILL.md +89 -46
- package/skills/ponytail-audit/SKILL.md +27 -17
- package/skills/ponytail-debt/SKILL.md +27 -14
- package/skills/ponytail-gain/SKILL.md +32 -19
- package/skills/ponytail-help/SKILL.md +53 -32
- package/skills/ponytail-review/SKILL.md +36 -24
- package/lib/ponytail-http.d.ts +0 -45
- package/lib/ponytail-http.d.ts.map +0 -1
- package/lib/ponytail-http.js +0 -162
- package/lib/ponytail-http.js.map +0 -1
package/lib/ponytail-config.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* ponytail-config — 移植自 hooks/ponytail-config.js
|
|
3
3
|
*
|
|
4
|
-
* 三级默认解析:环境变量 >
|
|
4
|
+
* 三级默认解析:环境变量 > Profile 补丁 > 内置兜底
|
|
5
5
|
* 保留已核对的上游行为边界,并按 DSH 运行时契约适配:
|
|
6
6
|
* - review 不可作默认 (#377)
|
|
7
7
|
* - isDeactivationCommand 全句匹配
|
|
@@ -11,7 +11,9 @@
|
|
|
11
11
|
* 数据根契约(见 docs/adr/0005):配置与 flag 一律落在 DSH 统一用户数据根
|
|
12
12
|
* $DSH_HOME/ponytail(默认 ~/.dsh/ponytail),与 cordis 内置包
|
|
13
13
|
* (.credentials.yaml / profiles/ / attachments/ 等)保持同一根,
|
|
14
|
-
* 从而跨平台一致、跟随 DSH_HOME
|
|
14
|
+
* 从而跨平台一致、跟随 DSH_HOME 覆盖。
|
|
15
|
+
* 注意 resolveDshHome() 结构上不含 profile 维度:该目录下的文件被同机所有实例共享,
|
|
16
|
+
* 配置与 flag 的 profile 隔离由 getConfigDir(profileDir) 单独承担(ADR-0009)。
|
|
15
17
|
* 不再使用 XDG / APPDATA 等宿主平台约定(旧位置仅作一次性兼容读取)。
|
|
16
18
|
*/
|
|
17
19
|
export declare const DEFAULT_MODE = "full";
|
|
@@ -36,49 +38,73 @@ export declare function resolveDshHome(configured?: string, env?: Record<string,
|
|
|
36
38
|
* 配置目录:DSH 数据根下的 ponytail 子目录。
|
|
37
39
|
* 平台无关——路径分隔符一律由 node:path 生成,不含任何平台判断。
|
|
38
40
|
*/
|
|
39
|
-
export declare function getConfigDir(): string;
|
|
40
|
-
export declare function getConfigPath(): string;
|
|
41
|
+
export declare function getConfigDir(profileDir?: string): string;
|
|
42
|
+
export declare function getConfigPath(profileDir?: string): string;
|
|
41
43
|
/**
|
|
42
|
-
*
|
|
44
|
+
* 全局共享的旧配置路径(ADR-0005 时代的位置,被所有实例共享)。
|
|
43
45
|
*
|
|
44
|
-
*
|
|
45
|
-
*
|
|
46
|
-
*
|
|
47
|
-
* ponytail: 兼容读取保留至下一个大版本(5.x 首发)后移除,届时可整段删除。
|
|
46
|
+
* 只在迁移窗口内被读:实例在「全局文件存在且 profile 内尚未生成」时导入,
|
|
47
|
+
* 导入后把全局文件改名标记为已迁,使后续实例从干净状态启动。
|
|
48
|
+
* 正常读写一律经 getConfigDir(),此路径不参与优先级链。
|
|
48
49
|
*/
|
|
49
|
-
export declare function
|
|
50
|
-
export declare function getLegacyConfigPath(): string | null;
|
|
50
|
+
export declare function getSharedConfigPath(): string;
|
|
51
51
|
/**
|
|
52
52
|
* 读取配置文件原文:新位置优先,缺失时一次性回退旧位置。
|
|
53
53
|
* 返回 null 表示两处都不存在或均不可读。
|
|
54
54
|
*/
|
|
55
|
-
export declare function readConfigFileText(): string | null;
|
|
56
|
-
export declare function getDefaultMode(): RuntimeMode;
|
|
55
|
+
export declare function readConfigFileText(profileDir?: string): string | null;
|
|
56
|
+
export declare function getDefaultMode(profileDir?: string): RuntimeMode;
|
|
57
57
|
export interface FullConfigData {
|
|
58
58
|
defaultMode: RuntimeMode;
|
|
59
59
|
disabledSkills: string[];
|
|
60
60
|
}
|
|
61
|
-
export declare function readFullConfig(): FullConfigData;
|
|
61
|
+
export declare function readFullConfig(profileDir?: string): FullConfigData;
|
|
62
62
|
/**
|
|
63
63
|
* 字段级 merge 写盘:保留 config.json 中用户手写的未知字段(不再重建为两键对象),
|
|
64
64
|
* defaultMode 经 normalizeMode 校验——非法值拒绝返回 null 不写盘(writeDefaultMode 语义统一)。
|
|
65
65
|
* 失败契约:写盘异常返回 null(与 resetFullConfig/writeDefaultMode 一致)。
|
|
66
66
|
*/
|
|
67
|
-
export declare function writeFullConfig(patch: Partial<FullConfigData
|
|
68
|
-
export declare function resetFullConfig(): FullConfigData | null;
|
|
69
|
-
export declare function writeDefaultMode(mode: string): RuntimeMode | null;
|
|
67
|
+
export declare function writeFullConfig(patch: Partial<FullConfigData>, profileDir?: string): FullConfigData | null;
|
|
68
|
+
export declare function resetFullConfig(profileDir?: string): FullConfigData | null;
|
|
69
|
+
export declare function writeDefaultMode(mode: string, profileDir?: string): RuntimeMode | null;
|
|
70
|
+
/**
|
|
71
|
+
* volatile 配置引用:宿主在 `.volatile()` 字段上放的活值容器(cosmokit/lib/index.js:102-108)。
|
|
72
|
+
* 写入经 settings 落到 profile 补丁;进程内由 loader 就地更新,无需重挂载插件。
|
|
73
|
+
*/
|
|
74
|
+
export interface VolatileRef<T> {
|
|
75
|
+
get(): T;
|
|
76
|
+
}
|
|
70
77
|
/**
|
|
71
78
|
* 插件配置(entry 与 skill provider 共享,避免 ponytail-skills 反向导入 entry 造成循环依赖)
|
|
72
79
|
* 默认值写 schema(Schemastery),review 不可作默认(#377)
|
|
80
|
+
*
|
|
81
|
+
* 迁移到官方配置组合后,两个可持久化字段声明为 volatile:解析结果是 VolatileRef 而非裸值,
|
|
82
|
+
* 读侧一律经 readVolatile()。未配置时引用内部是 undefined(不是缺字段),让位 resolvePriority。
|
|
73
83
|
*/
|
|
74
84
|
export interface PonytailConfig {
|
|
75
|
-
/**
|
|
76
|
-
disabledSkills?: string[]
|
|
85
|
+
/** 禁用的技能名称列表(volatile 引用) */
|
|
86
|
+
disabledSkills?: VolatileRef<string[]>;
|
|
77
87
|
/** 注册到 ctx.skills 的 provider 名称 */
|
|
78
88
|
providerName?: string;
|
|
79
89
|
/** skill 目录绝对路径,默认取包内 skills/ */
|
|
80
90
|
skillDir?: string;
|
|
81
|
-
/** 默认强度,off
|
|
82
|
-
defaultMode?: 'off' | 'lite' | 'full' | 'ultra'
|
|
91
|
+
/** 默认强度,off 则不自动激活(volatile 引用) */
|
|
92
|
+
defaultMode?: VolatileRef<'off' | 'lite' | 'full' | 'ultra'>;
|
|
93
|
+
/**
|
|
94
|
+
* 技能描述下发给模型目录与配置面板的语言(volatile 引用,默认 zh)。
|
|
95
|
+
*
|
|
96
|
+
* 与 defaultMode 不同:它不参与优先级链,默认值不会 shadow 任何显式配置,
|
|
97
|
+
* 因此可以带 Schema 默认值(面板要区分「显式选了 en」与「没配」)。
|
|
98
|
+
*/
|
|
99
|
+
skillDescriptionLang?: VolatileRef<'zh' | 'en'>;
|
|
83
100
|
}
|
|
101
|
+
/**
|
|
102
|
+
* 读一个可能是 volatile 引用、可能是裸值、也可能读到 undefined 的字段。
|
|
103
|
+
*
|
|
104
|
+
* 为什么必须容这三态:schemastery 对 `.volatile()` 字段无条件造出引用(其值取 schema 默认值,
|
|
105
|
+
* schemastery/lib/index.mjs:480),没有默认值时也是「引用包着 undefined」;
|
|
106
|
+
* 而直接构造 config 对象的测试路径拿到的是裸值。两者必须读出同一业务值,
|
|
107
|
+
* 否则同一字段在不同入口会给出不同结果。
|
|
108
|
+
*/
|
|
109
|
+
export declare function readVolatile<T>(field: VolatileRef<T> | T | undefined): T | undefined;
|
|
84
110
|
//# sourceMappingURL=ponytail-config.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ponytail-config.d.ts","sourceRoot":"","sources":["../src/ponytail-config.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"ponytail-config.d.ts","sourceRoot":"","sources":["../src/ponytail-config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAMH,eAAO,MAAM,YAAY,SAAS,CAAA;AAClC,eAAO,MAAM,aAAa,2CAA4C,CAAA;AAEtE,MAAM,MAAM,WAAW,GAAG,CAAC,OAAO,aAAa,CAAC,CAAC,MAAM,CAAC,CAAA;AAExD,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI,CAI9D;AAID,wBAAgB,WAAW,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAE9C;AAMD,mEAAmE;AACnE,eAAO,MAAM,YAAY,aAAa,CAAA;AAetC;;;;;;;;;GASG;AACH,wBAAgB,cAAc,CAAC,UAAU,CAAC,EAAE,MAAM,EAAE,GAAG,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAe,GAAG,MAAM,CAKjH;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,CAExD;AAED,wBAAgB,aAAa,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,CAEzD;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,CAE5C;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAWrE;AAED,wBAAgB,cAAc,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,WAAW,CAiB/D;AAGD,MAAM,WAAW,cAAc;IAC7B,WAAW,EAAE,WAAW,CAAA;IACxB,cAAc,EAAE,MAAM,EAAE,CAAA;CACzB;AA0BD,wBAAgB,cAAc,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,cAAc,CAElE;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,CAAC,cAAc,CAAC,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI,CA8B1G;AAED,wBAAgB,eAAe,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI,CAK1E;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI,CAMtF;AAED;;;GAGG;AACH,MAAM,WAAW,WAAW,CAAC,CAAC;IAC5B,GAAG,IAAI,CAAC,CAAA;CACT;AAED;;;;;;GAMG;AACH,MAAM,WAAW,cAAc;IAC7B,6BAA6B;IAC7B,cAAc,CAAC,EAAE,WAAW,CAAC,MAAM,EAAE,CAAC,CAAA;IACtC,mCAAmC;IACnC,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,iCAAiC;IACjC,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,mCAAmC;IACnC,WAAW,CAAC,EAAE,WAAW,CAAC,KAAK,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,CAAA;IAC5D;;;;;OAKG;IACH,oBAAoB,CAAC,EAAE,WAAW,CAAC,IAAI,GAAG,IAAI,CAAC,CAAA;CAChD;AAED;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAAC,CAAC,EAAE,KAAK,EAAE,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,SAAS,GAAG,CAAC,GAAG,SAAS,CAMpF"}
|
package/lib/ponytail-config.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* ponytail-config — 移植自 hooks/ponytail-config.js
|
|
3
3
|
*
|
|
4
|
-
* 三级默认解析:环境变量 >
|
|
4
|
+
* 三级默认解析:环境变量 > Profile 补丁 > 内置兜底
|
|
5
5
|
* 保留已核对的上游行为边界,并按 DSH 运行时契约适配:
|
|
6
6
|
* - review 不可作默认 (#377)
|
|
7
7
|
* - isDeactivationCommand 全句匹配
|
|
@@ -11,7 +11,9 @@
|
|
|
11
11
|
* 数据根契约(见 docs/adr/0005):配置与 flag 一律落在 DSH 统一用户数据根
|
|
12
12
|
* $DSH_HOME/ponytail(默认 ~/.dsh/ponytail),与 cordis 内置包
|
|
13
13
|
* (.credentials.yaml / profiles/ / attachments/ 等)保持同一根,
|
|
14
|
-
* 从而跨平台一致、跟随 DSH_HOME
|
|
14
|
+
* 从而跨平台一致、跟随 DSH_HOME 覆盖。
|
|
15
|
+
* 注意 resolveDshHome() 结构上不含 profile 维度:该目录下的文件被同机所有实例共享,
|
|
16
|
+
* 配置与 flag 的 profile 隔离由 getConfigDir(profileDir) 单独承担(ADR-0009)。
|
|
15
17
|
* 不再使用 XDG / APPDATA 等宿主平台约定(旧位置仅作一次性兼容读取)。
|
|
16
18
|
*/
|
|
17
19
|
import { readFileSync, writeFileSync, mkdirSync } from 'node:fs';
|
|
@@ -66,41 +68,29 @@ export function resolveDshHome(configured, env = process.env) {
|
|
|
66
68
|
* 配置目录:DSH 数据根下的 ponytail 子目录。
|
|
67
69
|
* 平台无关——路径分隔符一律由 node:path 生成,不含任何平台判断。
|
|
68
70
|
*/
|
|
69
|
-
export function getConfigDir() {
|
|
70
|
-
return join(resolveDshHome(), 'ponytail');
|
|
71
|
+
export function getConfigDir(profileDir) {
|
|
72
|
+
return profileDir === undefined || profileDir === '' ? join(resolveDshHome(), 'ponytail') : join(profileDir, 'ponytail');
|
|
71
73
|
}
|
|
72
|
-
export function getConfigPath() {
|
|
73
|
-
return join(getConfigDir(), 'config.json');
|
|
74
|
+
export function getConfigPath(profileDir) {
|
|
75
|
+
return join(getConfigDir(profileDir), 'config.json');
|
|
74
76
|
}
|
|
75
77
|
/**
|
|
76
|
-
*
|
|
78
|
+
* 全局共享的旧配置路径(ADR-0005 时代的位置,被所有实例共享)。
|
|
77
79
|
*
|
|
78
|
-
*
|
|
79
|
-
*
|
|
80
|
-
*
|
|
81
|
-
* ponytail: 兼容读取保留至下一个大版本(5.x 首发)后移除,届时可整段删除。
|
|
80
|
+
* 只在迁移窗口内被读:实例在「全局文件存在且 profile 内尚未生成」时导入,
|
|
81
|
+
* 导入后把全局文件改名标记为已迁,使后续实例从干净状态启动。
|
|
82
|
+
* 正常读写一律经 getConfigDir(),此路径不参与优先级链。
|
|
82
83
|
*/
|
|
83
|
-
export function
|
|
84
|
-
|
|
85
|
-
? join(process.env['XDG_CONFIG_HOME'], 'ponytail')
|
|
86
|
-
: process.platform === 'win32'
|
|
87
|
-
? join(process.env['APPDATA'] ?? join(homedir(), 'AppData', 'Roaming'), 'ponytail')
|
|
88
|
-
: join(homedir(), '.config', 'ponytail');
|
|
89
|
-
return legacyDir === getConfigDir() ? null : legacyDir;
|
|
90
|
-
}
|
|
91
|
-
export function getLegacyConfigPath() {
|
|
92
|
-
const dir = getLegacyConfigDir();
|
|
93
|
-
return dir ? join(dir, 'config.json') : null;
|
|
84
|
+
export function getSharedConfigPath() {
|
|
85
|
+
return join(resolveDshHome(), 'ponytail', 'config.json');
|
|
94
86
|
}
|
|
95
87
|
/**
|
|
96
88
|
* 读取配置文件原文:新位置优先,缺失时一次性回退旧位置。
|
|
97
89
|
* 返回 null 表示两处都不存在或均不可读。
|
|
98
90
|
*/
|
|
99
|
-
export function readConfigFileText() {
|
|
100
|
-
const candidates = [getConfigPath(),
|
|
91
|
+
export function readConfigFileText(profileDir) {
|
|
92
|
+
const candidates = [getConfigPath(profileDir), getSharedConfigPath()];
|
|
101
93
|
for (const p of candidates) {
|
|
102
|
-
if (!p)
|
|
103
|
-
continue;
|
|
104
94
|
try {
|
|
105
95
|
return readFileSync(p, 'utf8').replace(/^\uFEFF/, '');
|
|
106
96
|
}
|
|
@@ -110,13 +100,13 @@ export function readConfigFileText() {
|
|
|
110
100
|
}
|
|
111
101
|
return null;
|
|
112
102
|
}
|
|
113
|
-
export function getDefaultMode() {
|
|
103
|
+
export function getDefaultMode(profileDir) {
|
|
114
104
|
const envMode = process.env['PONYTAIL_DEFAULT_MODE'];
|
|
115
105
|
if (envMode && RUNTIME_MODES.includes(envMode.toLowerCase())) {
|
|
116
106
|
return envMode.toLowerCase();
|
|
117
107
|
}
|
|
118
108
|
try {
|
|
119
|
-
const raw = readConfigFileText();
|
|
109
|
+
const raw = readConfigFileText(profileDir);
|
|
120
110
|
if (raw === null)
|
|
121
111
|
return DEFAULT_MODE;
|
|
122
112
|
const config = JSON.parse(raw);
|
|
@@ -155,21 +145,21 @@ function parseConfigObject(raw) {
|
|
|
155
145
|
}
|
|
156
146
|
return { defaultMode: DEFAULT_MODE, disabledSkills: [] };
|
|
157
147
|
}
|
|
158
|
-
export function readFullConfig() {
|
|
159
|
-
return parseConfigObject(readConfigFileText());
|
|
148
|
+
export function readFullConfig(profileDir) {
|
|
149
|
+
return parseConfigObject(readConfigFileText(profileDir));
|
|
160
150
|
}
|
|
161
151
|
/**
|
|
162
152
|
* 字段级 merge 写盘:保留 config.json 中用户手写的未知字段(不再重建为两键对象),
|
|
163
153
|
* defaultMode 经 normalizeMode 校验——非法值拒绝返回 null 不写盘(writeDefaultMode 语义统一)。
|
|
164
154
|
* 失败契约:写盘异常返回 null(与 resetFullConfig/writeDefaultMode 一致)。
|
|
165
155
|
*/
|
|
166
|
-
export function writeFullConfig(patch) {
|
|
156
|
+
export function writeFullConfig(patch, profileDir) {
|
|
167
157
|
try {
|
|
168
|
-
const configPath = getConfigPath();
|
|
158
|
+
const configPath = getConfigPath(profileDir);
|
|
169
159
|
mkdirSync(dirname(configPath), { recursive: true });
|
|
170
160
|
let config = {};
|
|
171
161
|
try {
|
|
172
|
-
const raw = readConfigFileText();
|
|
162
|
+
const raw = readConfigFileText(profileDir);
|
|
173
163
|
const parsed = raw === null ? null : JSON.parse(raw);
|
|
174
164
|
if (parsed && typeof parsed === 'object' && !Array.isArray(parsed))
|
|
175
165
|
config = parsed;
|
|
@@ -198,19 +188,35 @@ export function writeFullConfig(patch) {
|
|
|
198
188
|
return null;
|
|
199
189
|
}
|
|
200
190
|
}
|
|
201
|
-
export function resetFullConfig() {
|
|
191
|
+
export function resetFullConfig(profileDir) {
|
|
202
192
|
return writeFullConfig({
|
|
203
193
|
defaultMode: DEFAULT_MODE,
|
|
204
194
|
disabledSkills: [],
|
|
205
195
|
});
|
|
206
196
|
}
|
|
207
|
-
export function writeDefaultMode(mode) {
|
|
197
|
+
export function writeDefaultMode(mode, profileDir) {
|
|
208
198
|
const normalized = normalizeMode(mode);
|
|
209
199
|
if (!normalized)
|
|
210
200
|
return null;
|
|
211
|
-
const written = writeFullConfig({ defaultMode: normalized });
|
|
201
|
+
const written = writeFullConfig({ defaultMode: normalized }, profileDir);
|
|
212
202
|
if (written === null)
|
|
213
203
|
return null;
|
|
214
204
|
return normalized;
|
|
215
205
|
}
|
|
206
|
+
/**
|
|
207
|
+
* 读一个可能是 volatile 引用、可能是裸值、也可能读到 undefined 的字段。
|
|
208
|
+
*
|
|
209
|
+
* 为什么必须容这三态:schemastery 对 `.volatile()` 字段无条件造出引用(其值取 schema 默认值,
|
|
210
|
+
* schemastery/lib/index.mjs:480),没有默认值时也是「引用包着 undefined」;
|
|
211
|
+
* 而直接构造 config 对象的测试路径拿到的是裸值。两者必须读出同一业务值,
|
|
212
|
+
* 否则同一字段在不同入口会给出不同结果。
|
|
213
|
+
*/
|
|
214
|
+
export function readVolatile(field) {
|
|
215
|
+
if (field === undefined || field === null)
|
|
216
|
+
return undefined;
|
|
217
|
+
if (typeof field === 'object' && typeof field.get === 'function') {
|
|
218
|
+
return field.get();
|
|
219
|
+
}
|
|
220
|
+
return field;
|
|
221
|
+
}
|
|
216
222
|
//# sourceMappingURL=ponytail-config.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ponytail-config.js","sourceRoot":"","sources":["../src/ponytail-config.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"ponytail-config.js","sourceRoot":"","sources":["../src/ponytail-config.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ponytail-instructions.d.ts","sourceRoot":"","sources":["../src/ponytail-instructions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AAKxD,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAoBzE;AAED,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAkC5D;
|
|
1
|
+
{"version":3,"file":"ponytail-instructions.d.ts","sourceRoot":"","sources":["../src/ponytail-instructions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AAKxD,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAoBzE;AAED,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAkC5D;AAID,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAEzD;AAKD;;;;;GAKG;AACH,wBAAgB,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAU7D;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,aAAa,GAAG,MAAM,CAKlF"}
|
|
@@ -13,7 +13,7 @@ export function filterSkillBodyForMode(body, mode) {
|
|
|
13
13
|
if (labelMode)
|
|
14
14
|
return labelMode === effectiveMode;
|
|
15
15
|
}
|
|
16
|
-
//
|
|
16
|
+
// 上游正文用 ASCII 引号,本仓历史中文版用「」与中文冒号;两种形态都要能识别
|
|
17
17
|
const exampleLabel = line.match(/^-\s*([^:]+)(?::|:)\s*["「]/);
|
|
18
18
|
if (exampleLabel) {
|
|
19
19
|
const labelMode = normalizeMode(exampleLabel[1].trim());
|
|
@@ -26,38 +26,38 @@ export function filterSkillBodyForMode(body, mode) {
|
|
|
26
26
|
}
|
|
27
27
|
export function getFallbackInstructions(mode) {
|
|
28
28
|
const m = mode;
|
|
29
|
-
return ('PONYTAIL
|
|
29
|
+
return ('PONYTAIL active - level: ' +
|
|
30
30
|
m +
|
|
31
31
|
'\n\n' +
|
|
32
|
-
'
|
|
33
|
-
'##
|
|
34
|
-
'
|
|
35
|
-
'
|
|
32
|
+
'You are a lazy senior developer. Lazy means efficient, not careless. The best code is the code never written.\n\n' +
|
|
33
|
+
'## Persistence\n\n' +
|
|
34
|
+
'ACTIVE EVERY RESPONSE. Off only: "stop ponytail" / "normal mode".\n\n' +
|
|
35
|
+
'Current level: **' +
|
|
36
36
|
m +
|
|
37
|
-
'
|
|
38
|
-
'##
|
|
39
|
-
'
|
|
40
|
-
'1.
|
|
41
|
-
'2.
|
|
42
|
-
'3.
|
|
43
|
-
'4.
|
|
44
|
-
'5.
|
|
45
|
-
'6.
|
|
46
|
-
'7.
|
|
47
|
-
'
|
|
48
|
-
'##
|
|
49
|
-
'
|
|
50
|
-
'
|
|
51
|
-
'
|
|
52
|
-
'##
|
|
53
|
-
'
|
|
54
|
-
'##
|
|
55
|
-
'
|
|
56
|
-
'
|
|
57
|
-
'##
|
|
58
|
-
'Ponytail
|
|
37
|
+
'**. Switch: `/ponytail lite|full|ultra`.\n\n' +
|
|
38
|
+
'## The ladder\n\n' +
|
|
39
|
+
'Stop at the first rung that holds (understand the problem first, then pick):\n' +
|
|
40
|
+
'1. Does this need to exist at all? (YAGNI)\n' +
|
|
41
|
+
'2. Already in this codebase? Reuse it, do not re-write.\n' +
|
|
42
|
+
'3. Stdlib does it? Use the stdlib.\n' +
|
|
43
|
+
'4. Native platform feature covers it? Use native.\n' +
|
|
44
|
+
'5. Already-installed dependency solves it? Use it.\n' +
|
|
45
|
+
'6. Can it be one line? One line.\n' +
|
|
46
|
+
'7. Only then: the minimum code that works.\n\n' +
|
|
47
|
+
'Bug fix = root cause: grep every caller of the function you are about to change, fix it once in the shared place instead of patching each caller.\n\n' +
|
|
48
|
+
'## Rules\n\n' +
|
|
49
|
+
'No unrequested abstractions, no avoidable dependencies, no boilerplate nobody asked for. Deletion over addition, boring over clever, fewest files possible. ' +
|
|
50
|
+
'Ship the lazy version and question complex requests in the same response. Between two same-size stdlib options, take the one that is correct on edge cases. ' +
|
|
51
|
+
'Mark deliberate simplifications with a known ceiling using a `ponytail:` comment naming the ceiling and upgrade path.\n\n' +
|
|
52
|
+
'## Output\n\n' +
|
|
53
|
+
'Code first, then at most three short lines: what was skipped, when to add it. If the explanation is longer than the code, delete it. Give in full any explanation the user explicitly asked for.\n\n' +
|
|
54
|
+
'## When NOT to be lazy\n\n' +
|
|
55
|
+
'Never simplify away: understanding the problem, input validation at trust boundaries, error handling that prevents data loss, security, accessibility, hardware calibration, anything explicitly requested. ' +
|
|
56
|
+
'Non-trivial logic leaves one runnable check (an assert-based self-check or one small test file); a trivial one-liner needs no test.\n\n' +
|
|
57
|
+
'## Boundaries\n\n' +
|
|
58
|
+
'Ponytail governs what you build, not how you talk. "stop ponytail" / "normal mode" reverts; the level persists until changed or session end.');
|
|
59
59
|
}
|
|
60
|
-
//
|
|
60
|
+
// 路径解析:给定 skillDir 返回主技能路径
|
|
61
61
|
export function getMainSkillPath(skillDir) {
|
|
62
62
|
return join(skillDir, 'ponytail', 'SKILL.md');
|
|
63
63
|
}
|
|
@@ -71,11 +71,11 @@ const INDEPENDENT_MODES = new Set(['review']);
|
|
|
71
71
|
*/
|
|
72
72
|
export function render(skillDir, mode) {
|
|
73
73
|
if (INDEPENDENT_MODES.has(mode)) {
|
|
74
|
-
return 'PONYTAIL
|
|
74
|
+
return 'PONYTAIL active - level: ' + mode + '. Behavior is defined by the /ponytail-' + mode + ' skill.';
|
|
75
75
|
}
|
|
76
76
|
try {
|
|
77
77
|
const raw = readFileSync(getMainSkillPath(skillDir), 'utf8');
|
|
78
|
-
return 'PONYTAIL
|
|
78
|
+
return 'PONYTAIL active - level: ' + mode + '\n\n' + filterSkillBodyForMode(raw, mode);
|
|
79
79
|
}
|
|
80
80
|
catch {
|
|
81
81
|
return getFallbackInstructions(mode);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ponytail-instructions.js","sourceRoot":"","sources":["../src/ponytail-instructions.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AACtC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AAElE,MAAM,UAAU,sBAAsB,CAAC,IAAY,EAAE,IAAY;IAC/D,MAAM,aAAa,GAAG,aAAa,CAAC,IAAI,CAAC,IAAK,YAAuB,CAAA;IACrE,MAAM,kBAAkB,GAAG,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,oBAAoB,EAAE,EAAE,CAAC,CAAA;IAC/E,OAAO,kBAAkB;SACtB,KAAK,CAAC,OAAO,CAAC;SACd,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE;QACf,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAA;QACzD,IAAI,UAAU,EAAE,CAAC;YACf,MAAM,SAAS,GAAG,aAAa,CAAC,UAAU,CAAC,CAAC,CAAE,CAAC,IAAI,EAAE,CAAC,CAAA;YACtD,IAAI,SAAS;gBAAE,OAAO,SAAS,KAAK,aAAa,CAAA;QACnD,CAAC;QACD,
|
|
1
|
+
{"version":3,"file":"ponytail-instructions.js","sourceRoot":"","sources":["../src/ponytail-instructions.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,18 +4,22 @@
|
|
|
4
4
|
* 回答一个用户反复踩的问题:「我在界面上点了等级,为什么没反应?」
|
|
5
5
|
* 根因永远是某一级更高优先级的配置把界面写入的值盖掉了。
|
|
6
6
|
* 本模块把「哪一级在说话」从 apply() 与 HTTP 路由里剥出来,
|
|
7
|
-
*
|
|
7
|
+
* 由宿主一次读齐三个来源的真值后传入,产出可直接渲染的诊断链。
|
|
8
8
|
*
|
|
9
9
|
* 设计约束:纯函数,不读文件、不读环境变量。
|
|
10
10
|
* 所有外部事实由调用方读好后传入,因此单测无需触碰磁盘与环境变量,
|
|
11
11
|
* 诊断链的正确性完全由这里的分支覆盖。
|
|
12
12
|
*
|
|
13
|
-
* 优先级链(高到低):环境变量 > Profile 补丁 >
|
|
13
|
+
* 优先级链(高到低):环境变量 > Profile 补丁 > 内置兜底。
|
|
14
|
+
*
|
|
15
|
+
* config.json 层已随 1A 迁移退役:可持久化配置迁入 profile 补丁后,config.json 只在
|
|
16
|
+
* 无 settings 服务的组合里作为回退读写目标,不再参与优先级链——留在链里就是一层永远不生效的
|
|
17
|
+
* 空壳,而「看着能改其实不生效」正是这套面板最初要解决的坑。
|
|
14
18
|
* 与 apply() 的 initialMode 判定顺序逐行一致,两处不得漂移。
|
|
15
19
|
*/
|
|
16
20
|
import { type RuntimeMode } from './ponytail-config.js';
|
|
17
21
|
/** 优先级级别标识,与 UI 渲染的四种状态一一对应 */
|
|
18
|
-
export type PriorityLevel = 'env' | 'patch' | '
|
|
22
|
+
export type PriorityLevel = 'env' | 'patch' | 'fallback';
|
|
19
23
|
export interface PrioritySource {
|
|
20
24
|
/** 级别标识 */
|
|
21
25
|
level: PriorityLevel;
|
|
@@ -33,22 +37,20 @@ export interface PrioritySource {
|
|
|
33
37
|
problem: string | null;
|
|
34
38
|
}
|
|
35
39
|
export interface PriorityReport {
|
|
36
|
-
/** 恒为
|
|
40
|
+
/** 恒为 3 项,按优先级从高到低 */
|
|
37
41
|
chain: PrioritySource[];
|
|
38
42
|
/** 最终生效档 */
|
|
39
43
|
effective: RuntimeMode;
|
|
40
44
|
}
|
|
41
45
|
/**
|
|
42
|
-
*
|
|
46
|
+
* 解析三级优先级链,得出最终生效档与每一级的命中/被覆盖/问题状态。
|
|
43
47
|
*
|
|
44
48
|
* @param input.envRaw - 环境变量 PONYTAIL_DEFAULT_MODE 的原始值;undefined 表示未设置
|
|
45
49
|
* @param input.patchMode - cordis.patch.yml 显式声明的 defaultMode;undefined 表示未声明
|
|
46
|
-
* @
|
|
47
|
-
* @returns 诊断链(恒 4 项)与最终生效档
|
|
50
|
+
* @returns 诊断链(恒 3 项)与最终生效档
|
|
48
51
|
*/
|
|
49
52
|
export declare function resolvePriority(input: {
|
|
50
53
|
envRaw?: string;
|
|
51
54
|
patchMode?: string;
|
|
52
|
-
configMode?: string;
|
|
53
55
|
}): PriorityReport;
|
|
54
56
|
//# sourceMappingURL=ponytail-priority.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ponytail-priority.d.ts","sourceRoot":"","sources":["../src/ponytail-priority.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"ponytail-priority.d.ts","sourceRoot":"","sources":["../src/ponytail-priority.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,EAA+B,KAAK,WAAW,EAAE,MAAM,sBAAsB,CAAA;AAEpF,+BAA+B;AAC/B,MAAM,MAAM,aAAa,GAAG,KAAK,GAAG,OAAO,GAAG,UAAU,CAAA;AAExD,MAAM,WAAW,cAAc;IAC7B,WAAW;IACX,KAAK,EAAE,aAAa,CAAA;IACpB,mBAAmB;IACnB,KAAK,EAAE,MAAM,CAAA;IACb,mCAAmC;IACnC,QAAQ,EAAE,MAAM,CAAA;IAChB,0BAA0B;IAC1B,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;IACpB,qBAAqB;IACrB,GAAG,EAAE,OAAO,CAAA;IACZ,4BAA4B;IAC5B,QAAQ,EAAE,OAAO,CAAA;IACjB,gCAAgC;IAChC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;CACvB;AAED,MAAM,WAAW,cAAc;IAC7B,sBAAsB;IACtB,KAAK,EAAE,cAAc,EAAE,CAAA;IACvB,YAAY;IACZ,SAAS,EAAE,WAAW,CAAA;CACvB;AAiBD;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE;IACrC,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB,GAAG,cAAc,CA8BjB"}
|
package/lib/ponytail-priority.js
CHANGED
|
@@ -4,40 +4,41 @@
|
|
|
4
4
|
* 回答一个用户反复踩的问题:「我在界面上点了等级,为什么没反应?」
|
|
5
5
|
* 根因永远是某一级更高优先级的配置把界面写入的值盖掉了。
|
|
6
6
|
* 本模块把「哪一级在说话」从 apply() 与 HTTP 路由里剥出来,
|
|
7
|
-
*
|
|
7
|
+
* 由宿主一次读齐三个来源的真值后传入,产出可直接渲染的诊断链。
|
|
8
8
|
*
|
|
9
9
|
* 设计约束:纯函数,不读文件、不读环境变量。
|
|
10
10
|
* 所有外部事实由调用方读好后传入,因此单测无需触碰磁盘与环境变量,
|
|
11
11
|
* 诊断链的正确性完全由这里的分支覆盖。
|
|
12
12
|
*
|
|
13
|
-
* 优先级链(高到低):环境变量 > Profile 补丁 >
|
|
13
|
+
* 优先级链(高到低):环境变量 > Profile 补丁 > 内置兜底。
|
|
14
|
+
*
|
|
15
|
+
* config.json 层已随 1A 迁移退役:可持久化配置迁入 profile 补丁后,config.json 只在
|
|
16
|
+
* 无 settings 服务的组合里作为回退读写目标,不再参与优先级链——留在链里就是一层永远不生效的
|
|
17
|
+
* 空壳,而「看着能改其实不生效」正是这套面板最初要解决的坑。
|
|
14
18
|
* 与 apply() 的 initialMode 判定顺序逐行一致,两处不得漂移。
|
|
15
19
|
*/
|
|
16
20
|
import { normalizeMode, DEFAULT_MODE } from './ponytail-config.js';
|
|
17
|
-
const LEVELS = ['env', 'patch', '
|
|
21
|
+
const LEVELS = ['env', 'patch', 'fallback'];
|
|
18
22
|
const LABELS = {
|
|
19
23
|
env: { label: '环境变量', location: 'PONYTAIL_DEFAULT_MODE' },
|
|
20
24
|
patch: { label: 'Profile 补丁', location: 'cordis.patch.yml' },
|
|
21
|
-
config: { label: '用户配置文件', location: 'config.json' },
|
|
22
25
|
fallback: { label: '内置兜底', location: '代码常量' },
|
|
23
26
|
};
|
|
24
|
-
/** 各级的非法值文案:env 与 patch
|
|
27
|
+
/** 各级的非法值文案:env 与 patch 都是人工输入,值无效即忽略 */
|
|
25
28
|
const PROBLEMS = {
|
|
26
29
|
env: '值无效,已忽略',
|
|
27
30
|
patch: '值无效,已忽略',
|
|
28
|
-
config: '文件损坏或字段缺失',
|
|
29
31
|
fallback: '',
|
|
30
32
|
};
|
|
31
33
|
/**
|
|
32
|
-
*
|
|
34
|
+
* 解析三级优先级链,得出最终生效档与每一级的命中/被覆盖/问题状态。
|
|
33
35
|
*
|
|
34
36
|
* @param input.envRaw - 环境变量 PONYTAIL_DEFAULT_MODE 的原始值;undefined 表示未设置
|
|
35
37
|
* @param input.patchMode - cordis.patch.yml 显式声明的 defaultMode;undefined 表示未声明
|
|
36
|
-
* @
|
|
37
|
-
* @returns 诊断链(恒 4 项)与最终生效档
|
|
38
|
+
* @returns 诊断链(恒 3 项)与最终生效档
|
|
38
39
|
*/
|
|
39
40
|
export function resolvePriority(input) {
|
|
40
|
-
const raws = [input.envRaw, input.patchMode,
|
|
41
|
+
const raws = [input.envRaw, input.patchMode, DEFAULT_MODE];
|
|
41
42
|
const chain = [];
|
|
42
43
|
let winner = -1;
|
|
43
44
|
for (let i = 0; i < LEVELS.length; i++) {
|
|
@@ -60,7 +61,7 @@ export function resolvePriority(input) {
|
|
|
60
61
|
});
|
|
61
62
|
}
|
|
62
63
|
// 兜底级恒有效,winner 不会停留在 -1;此处兜底分支仅防御未来增级
|
|
63
|
-
const effective = normalizeMode(String(chain[winner === -1 ?
|
|
64
|
+
const effective = normalizeMode(String(chain[winner === -1 ? LEVELS.length - 1 : winner].value)) ?? DEFAULT_MODE;
|
|
64
65
|
return { chain, effective };
|
|
65
66
|
}
|
|
66
67
|
//# sourceMappingURL=ponytail-priority.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ponytail-priority.js","sourceRoot":"","sources":["../src/ponytail-priority.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"ponytail-priority.js","sourceRoot":"","sources":["../src/ponytail-priority.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,EAAE,aAAa,EAAE,YAAY,EAAoB,MAAM,sBAAsB,CAAA;AA6BpF,MAAM,MAAM,GAA6B,CAAC,KAAK,EAAE,OAAO,EAAE,UAAU,CAAC,CAAA;AAErE,MAAM,MAAM,GAA+D;IACzE,GAAG,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,uBAAuB,EAAE;IACzD,KAAK,EAAE,EAAE,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,kBAAkB,EAAE;IAC5D,QAAQ,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE;CAC9C,CAAA;AAED,yCAAyC;AACzC,MAAM,QAAQ,GAAkC;IAC9C,GAAG,EAAE,SAAS;IACd,KAAK,EAAE,SAAS;IAChB,QAAQ,EAAE,EAAE;CACb,CAAA;AAED;;;;;;GAMG;AACH,MAAM,UAAU,eAAe,CAAC,KAG/B;IACC,MAAM,IAAI,GAA2B,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,SAAS,EAAE,YAAY,CAAC,CAAA;IAElF,MAAM,KAAK,GAAqB,EAAE,CAAA;IAClC,IAAI,MAAM,GAAG,CAAC,CAAC,CAAA;IAEf,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACvC,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,CAAA;QACvB,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAA;QACnB,MAAM,UAAU,GAAG,KAAK,KAAK,UAAU,CAAA;QACvC,sCAAsC;QACtC,MAAM,KAAK,GAAG,UAAU,IAAI,CAAC,OAAO,GAAG,KAAK,QAAQ,IAAI,aAAa,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,CAAA;QAEpF,wBAAwB;QACxB,IAAI,MAAM,KAAK,CAAC,CAAC,IAAI,KAAK;YAAE,MAAM,GAAG,CAAC,CAAA;QAEtC,KAAK,CAAC,IAAI,CAAC;YACT,KAAK;YACL,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK;YAC1B,QAAQ,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,QAAQ;YAChC,KAAK,EAAE,OAAO,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI;YAC3C,GAAG,EAAE,MAAM,KAAK,CAAC;YACjB,QAAQ,EAAE,MAAM,KAAK,CAAC,CAAC,IAAI,MAAM,GAAG,CAAC;YACrC,OAAO,EAAE,UAAU,IAAI,KAAK,IAAI,OAAO,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC;SACjF,CAAC,CAAA;IACJ,CAAC;IAED,uCAAuC;IACvC,MAAM,SAAS,GAAG,aAAa,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,YAAY,CAAA;IAChH,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,CAAA;AAC7B,CAAC"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ponytail-remote — 只读推导值的官方跨端通道
|
|
3
|
+
*
|
|
4
|
+
* 迁移到官方配置组合后,可持久化字段(defaultMode、disabledSkills、skillDescriptionLang)由
|
|
5
|
+
* Cordis Config 的 volatile 字段承载,官方表单负责读写;但「优先级诊断链」与「当前生效等级」
|
|
6
|
+
* 是**运行时推导值**,不是配置——它们由环境变量、profile 补丁与内置兜底三层按优先级合并得出,
|
|
7
|
+
* 写进配置层等于让缓存永久盖住真值(env 只有进程重启才变,落盘反而会遮蔽新值)。
|
|
8
|
+
*
|
|
9
|
+
* 因此这两个值走 DSH 官方的 Typert 通道下发,而不是自制 HTTP:
|
|
10
|
+
* - 宿主导出 `TypertRemoteService` 子类,命名空间 `ponytail`;
|
|
11
|
+
* - 网关按服务上的 `typertRemote` 绑定自动发现端点(dsh-api-gateway/lib/index.js:706-719),
|
|
12
|
+
* 无需在任何注册表里登记;
|
|
13
|
+
* - 浏览器侧以 `ctx.remote.ponytail.snapshot()` 调用,走已有的 RPC 载体。
|
|
14
|
+
*
|
|
15
|
+
* 技能描述的语言也在这个通道上:模型目录与配置面板消费的是同一个字符串,
|
|
16
|
+
* 由配置决定下哪一套,缓存的构建期常量会让切换停在旧语言。
|
|
17
|
+
*/
|
|
18
|
+
import { TypertRemoteService } from '@deepseek-ai/dsh-typert-protocol';
|
|
19
|
+
import type { Context } from '@deepseek-ai/cordis';
|
|
20
|
+
import type { PriorityReport } from './ponytail-priority.js';
|
|
21
|
+
/** 技能描述的语言。与 Config.skillDescriptionLang 同一取值域。 */
|
|
22
|
+
export type SkillLang = 'zh' | 'en';
|
|
23
|
+
export interface SkillMeta {
|
|
24
|
+
id: string;
|
|
25
|
+
name: string;
|
|
26
|
+
description: string;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* 从包内描述文件读取技能元数据;文件不可读或缺项时回退短描述。
|
|
30
|
+
*
|
|
31
|
+
* lang 缺省或非法一律按 zh 处理:调用方(面板、Provider)读的是配置值,
|
|
32
|
+
* 而配置可能来自手写的补丁,不保证取值域干净。
|
|
33
|
+
*/
|
|
34
|
+
export declare function readSkillMeta(lang?: SkillLang): SkillMeta[];
|
|
35
|
+
/** 读 skills/descriptions.<lang>.json;不可读返回 null 由调用方回退。 */
|
|
36
|
+
export declare function readSkillDescriptions(lang?: SkillLang): Record<string, string> | null;
|
|
37
|
+
/** 跨端下发的只读快照:形状必须是 lossless JSON(typert-protocol 的 isRemoteJsonValue) */
|
|
38
|
+
export interface PonytailRemoteSnapshot {
|
|
39
|
+
/** 当前会话生效的等级(null 表示关闭,序列化为字符串 'off') */
|
|
40
|
+
currentMode: string;
|
|
41
|
+
/** 三级优先级诊断链 */
|
|
42
|
+
priority: PriorityReport;
|
|
43
|
+
/** 技能描述语言(与配置同源,面板据此展示) */
|
|
44
|
+
skillLang: SkillLang;
|
|
45
|
+
/** 6 个技能元数据,描述已按 skillLang 取好 */
|
|
46
|
+
skills: SkillMeta[];
|
|
47
|
+
}
|
|
48
|
+
export interface PonytailRemoteDeps {
|
|
49
|
+
snapshot(): PonytailRemoteSnapshot;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* 远程服务:只暴露 snapshot 一个只读端点。
|
|
53
|
+
*
|
|
54
|
+
* 写操作一律不在这里——它们走 settings(官方配置通道),由宿主负责校验、
|
|
55
|
+
* revision 冲突检测与 loader 的 volatile 热提交。这里多开一个写端点等于绕过那套保护。
|
|
56
|
+
*
|
|
57
|
+
* `@Remote('snapshot')` 用字符串形式:仓库 tsconfig 的 experimentalDecorators 为 false
|
|
58
|
+
* (标准装饰器),零参 `@Remote()` 在该语义下拿不到 class context,TS 会报 TS2554/TS1241。
|
|
59
|
+
*/
|
|
60
|
+
export declare class PonytailRemote extends TypertRemoteService {
|
|
61
|
+
private readonly deps;
|
|
62
|
+
constructor(ctx: Context, deps: PonytailRemoteDeps);
|
|
63
|
+
snapshot(): PonytailRemoteSnapshot;
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=ponytail-remote.d.ts.map
|