@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.
Files changed (49) hide show
  1. package/CHANGELOG.md +140 -226
  2. package/README.md +102 -98
  3. package/lib/client.js +303 -140
  4. package/lib/ponytail-config.d.ts +47 -21
  5. package/lib/ponytail-config.d.ts.map +1 -1
  6. package/lib/ponytail-config.js +42 -36
  7. package/lib/ponytail-config.js.map +1 -1
  8. package/lib/ponytail-instructions.d.ts.map +1 -1
  9. package/lib/ponytail-instructions.js +31 -31
  10. package/lib/ponytail-instructions.js.map +1 -1
  11. package/lib/ponytail-priority.d.ts +10 -8
  12. package/lib/ponytail-priority.d.ts.map +1 -1
  13. package/lib/ponytail-priority.js +12 -11
  14. package/lib/ponytail-priority.js.map +1 -1
  15. package/lib/ponytail-remote.d.ts +65 -0
  16. package/lib/ponytail-remote.d.ts.map +1 -0
  17. package/lib/ponytail-remote.js +141 -0
  18. package/lib/ponytail-remote.js.map +1 -0
  19. package/lib/ponytail-settings.d.ts +96 -0
  20. package/lib/ponytail-settings.d.ts.map +1 -0
  21. package/lib/ponytail-settings.js +165 -0
  22. package/lib/ponytail-settings.js.map +1 -0
  23. package/lib/ponytail-skills.d.ts +10 -0
  24. package/lib/ponytail-skills.d.ts.map +1 -1
  25. package/lib/ponytail-skills.js +23 -5
  26. package/lib/ponytail-skills.js.map +1 -1
  27. package/lib/ponytail-state.d.ts +8 -4
  28. package/lib/ponytail-state.d.ts.map +1 -1
  29. package/lib/ponytail-state.js +40 -39
  30. package/lib/ponytail-state.js.map +1 -1
  31. package/lib/ponytail.d.ts +28 -4
  32. package/lib/ponytail.d.ts.map +1 -1
  33. package/lib/ponytail.js +181 -83
  34. package/lib/ponytail.js.map +1 -1
  35. package/locale/en.json +37 -27
  36. package/locale/zh.json +37 -27
  37. package/package.json +3 -1
  38. package/skills/descriptions.en.json +8 -0
  39. package/skills/descriptions.zh.json +8 -0
  40. package/skills/ponytail/SKILL.md +89 -46
  41. package/skills/ponytail-audit/SKILL.md +27 -17
  42. package/skills/ponytail-debt/SKILL.md +27 -14
  43. package/skills/ponytail-gain/SKILL.md +32 -19
  44. package/skills/ponytail-help/SKILL.md +53 -32
  45. package/skills/ponytail-review/SKILL.md +36 -24
  46. package/lib/ponytail-http.d.ts +0 -45
  47. package/lib/ponytail-http.d.ts.map +0 -1
  48. package/lib/ponytail-http.js +0 -162
  49. package/lib/ponytail-http.js.map +0 -1
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * ponytail-config — 移植自 hooks/ponytail-config.js
3
3
  *
4
- * 三级默认解析:环境变量 > 配置文件 > full
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 覆盖、天然随 profile 隔离。
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
- * 迁移前的旧配置路径(4.10.0-dsh.4 及以前使用的宿主平台约定位置)。
44
+ * 全局共享的旧配置路径(ADR-0005 时代的位置,被所有实例共享)。
43
45
  *
44
- * 仅用于一次性兼容读取:老用户升级后,新位置尚未生成时回退读取旧配置,
45
- * 避免已自定义的等级/技能开关静默丢失。写入永远只写新位置,
46
- * 旧目录不删除也不改写,数据所有权保持清晰。
47
- * ponytail: 兼容读取保留至下一个大版本(5.x 首发)后移除,届时可整段删除。
46
+ * 只在迁移窗口内被读:实例在「全局文件存在且 profile 内尚未生成」时导入,
47
+ * 导入后把全局文件改名标记为已迁,使后续实例从干净状态启动。
48
+ * 正常读写一律经 getConfigDir(),此路径不参与优先级链。
48
49
  */
49
- export declare function getLegacyConfigDir(): string | null;
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>): FullConfigData | null;
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;;;;;;;;;;;;;;;GAeG;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,IAAI,MAAM,CAErC;AAED,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AAED;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,GAAG,IAAI,CAQlD;AAED,wBAAgB,mBAAmB,IAAI,MAAM,GAAG,IAAI,CAGnD;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,GAAG,IAAI,CAWlD;AAED,wBAAgB,cAAc,IAAI,WAAW,CAiB5C;AAGD,MAAM,WAAW,cAAc;IAC7B,WAAW,EAAE,WAAW,CAAA;IACxB,cAAc,EAAE,MAAM,EAAE,CAAA;CACzB;AA0BD,wBAAgB,cAAc,IAAI,cAAc,CAE/C;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,CAAC,cAAc,CAAC,GAAG,cAAc,GAAG,IAAI,CA8BrF;AAED,wBAAgB,eAAe,IAAI,cAAc,GAAG,IAAI,CAKvD;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI,CAMjE;AAED;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC7B,gBAAgB;IAChB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAA;IACzB,mCAAmC;IACnC,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,iCAAiC;IACjC,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,sBAAsB;IACtB,WAAW,CAAC,EAAE,KAAK,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAA;CAChD"}
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"}
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * ponytail-config — 移植自 hooks/ponytail-config.js
3
3
  *
4
- * 三级默认解析:环境变量 > 配置文件 > full
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 覆盖、天然随 profile 隔离。
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
- * 迁移前的旧配置路径(4.10.0-dsh.4 及以前使用的宿主平台约定位置)。
78
+ * 全局共享的旧配置路径(ADR-0005 时代的位置,被所有实例共享)。
77
79
  *
78
- * 仅用于一次性兼容读取:老用户升级后,新位置尚未生成时回退读取旧配置,
79
- * 避免已自定义的等级/技能开关静默丢失。写入永远只写新位置,
80
- * 旧目录不删除也不改写,数据所有权保持清晰。
81
- * ponytail: 兼容读取保留至下一个大版本(5.x 首发)后移除,届时可整段删除。
80
+ * 只在迁移窗口内被读:实例在「全局文件存在且 profile 内尚未生成」时导入,
81
+ * 导入后把全局文件改名标记为已迁,使后续实例从干净状态启动。
82
+ * 正常读写一律经 getConfigDir(),此路径不参与优先级链。
82
83
  */
83
- export function getLegacyConfigDir() {
84
- const legacyDir = process.env['XDG_CONFIG_HOME'] !== undefined
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(), getLegacyConfigPath()];
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":"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"}
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;AAGD,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"}
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
- // 中文化正文用「」与中文冒号,上游 ASCII 引号正则失配;兼容两种形态
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 已激活 \u2014 等级:' +
29
+ return ('PONYTAIL active - level: ' +
30
30
  m +
31
31
  '\n\n' +
32
- '你是一位懒惰的资深工程师,懒惰意味着高效,而不是马虎。最好的代码就是没写的代码。\n\n' +
33
- '## 持久化\n\n' +
34
- '每一次回复都生效,不会退化。仅在「stop ponytail / 正常模式」时关闭。\n\n' +
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
- '**,切换方式:`/ponytail lite|full|ultra`。\n\n' +
38
- '## 梯子\n\n' +
39
- '写代码前,先站在第一个站得住的横档上(先理解问题,再选解法):\n' +
40
- '1. 这东西真的需要存在吗?(YAGNI)\n' +
41
- '2. 代码库里已经有了吗?直接复用,不要重写。\n' +
42
- '3. 标准库能做吗?用标准库。\n' +
43
- '4. 平台原生能力能覆盖吗?用原生。\n' +
44
- '5. 已安装的依赖能解决吗?用它。\n' +
45
- '6. 能用一行写完吗?就写一行。\n' +
46
- '7. 只有到这里:再写能工作的最小代码。\n\n' +
47
- '修 Bug = 修根因:先 grep 要改函数的所有调用方,在共享函数里修一次,而不是在每个调用方各打一个补丁。\n\n' +
48
- '## 规则\n\n' +
49
- '不做未被要求的抽象,不引入可避免的依赖,不写没人要的样板。删除优于新增,无聊优于巧妙,文件数越少越好。' +
50
- '先给懒人版,并在同一条回复里追问复杂需求是否真的需要。两个等大的标准库方案选边界更正确的那个。' +
51
- '有意简化的已知天花板用 `ponytail:` 注释标出天花板和升级路径。\n\n' +
52
- '## 输出\n\n' +
53
- '先给代码,再用最多三行短句说明跳过了什么、何时再加。若解释比代码还长,删掉解释。用户明确要求的解释请完整给出。\n\n' +
54
- '## 何时不要偷懒\n\n' +
55
- '永远不要为偷懒而简化掉:对问题的完整理解、信任边界的输入校验、防止数据丢失的错误处理、安全、无障碍、硬件所需的校准、用户明确要求保留的内容。' +
56
- '非平凡逻辑留下一个可运行的最小校验(基于 assert 的自检或单个小测试文件),平凡的一行不需要测试。\n\n' +
57
- '## 边界\n\n' +
58
- 'Ponytail 管的是怎么构建,而不是怎么说话。「stop 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
- // 兼容旧路径解析:给定 skillDir 返回主技能路径
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 已激活 — 等级:' + mode + ',行为由 /ponytail-' + mode + ' 技能定义。';
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 已激活 — 等级:' + mode + '\n\n' + filterSkillBodyForMode(raw, mode);
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":"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"}
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' | 'config' | 'fallback';
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
- /** 恒为 4 项,按优先级从高到低 */
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
- * @param input.configMode - config.json 中的 defaultMode 原始值;undefined 表示缺失或不可读
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;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAA+B,KAAK,WAAW,EAAE,MAAM,sBAAsB,CAAA;AAEpF,+BAA+B;AAC/B,MAAM,MAAM,aAAa,GAAG,KAAK,GAAG,OAAO,GAAG,QAAQ,GAAG,UAAU,CAAA;AAEnE,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;AAmBD;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE;IACrC,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB,GAAG,cAAc,CA8BjB"}
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"}
@@ -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', 'config', 'fallback'];
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 是人工输入,config 是文件损坏 */
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
- * @param input.configMode - config.json 中的 defaultMode 原始值;undefined 表示缺失或不可读
37
- * @returns 诊断链(恒 4 项)与最终生效档
38
+ * @returns 诊断链(恒 3 项)与最终生效档
38
39
  */
39
40
  export function resolvePriority(input) {
40
- const raws = [input.envRaw, input.patchMode, input.configMode, DEFAULT_MODE];
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 ? 3 : winner].value)) ?? DEFAULT_MODE;
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;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,aAAa,EAAE,YAAY,EAAoB,MAAM,sBAAsB,CAAA;AA6BpF,MAAM,MAAM,GAA6B,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAA;AAE/E,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,MAAM,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,aAAa,EAAE;IACpD,QAAQ,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE;CAC9C,CAAA;AAED,8CAA8C;AAC9C,MAAM,QAAQ,GAAkC;IAC9C,GAAG,EAAE,SAAS;IACd,KAAK,EAAE,SAAS;IAChB,MAAM,EAAE,WAAW;IACnB,QAAQ,EAAE,EAAE;CACb,CAAA;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,eAAe,CAAC,KAI/B;IACC,MAAM,IAAI,GAA2B,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,UAAU,EAAE,YAAY,CAAC,CAAA;IAEpG,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,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,YAAY,CAAA;IAChG,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,CAAA;AAC7B,CAAC"}
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