@wenaixi/dsh-ponytail 5.0.0 → 5.1.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 +28 -3
- package/README.md +19 -10
- package/lib/client.js +258 -137
- package/lib/ponytail-config.d.ts +36 -19
- package/lib/ponytail-config.d.ts.map +1 -1
- package/lib/ponytail-config.js +38 -34
- package/lib/ponytail-config.js.map +1 -1
- package/lib/ponytail-priority.d.ts +8 -6
- package/lib/ponytail-priority.d.ts.map +1 -1
- package/lib/ponytail-priority.js +10 -9
- package/lib/ponytail-priority.js.map +1 -1
- package/lib/ponytail-remote.d.ts +56 -0
- package/lib/ponytail-remote.d.ts.map +1 -0
- package/lib/ponytail-remote.js +138 -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-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 +24 -4
- package/lib/ponytail.d.ts.map +1 -1
- package/lib/ponytail.js +152 -79
- package/lib/ponytail.js.map +1 -1
- package/locale/en.json +31 -27
- package/locale/zh.json +31 -27
- package/package.json +3 -1
- 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.js
CHANGED
|
@@ -66,41 +66,29 @@ export function resolveDshHome(configured, env = process.env) {
|
|
|
66
66
|
* 配置目录:DSH 数据根下的 ponytail 子目录。
|
|
67
67
|
* 平台无关——路径分隔符一律由 node:path 生成,不含任何平台判断。
|
|
68
68
|
*/
|
|
69
|
-
export function getConfigDir() {
|
|
70
|
-
return join(resolveDshHome(), 'ponytail');
|
|
69
|
+
export function getConfigDir(profileDir) {
|
|
70
|
+
return profileDir === undefined || profileDir === '' ? join(resolveDshHome(), 'ponytail') : join(profileDir, 'ponytail');
|
|
71
71
|
}
|
|
72
|
-
export function getConfigPath() {
|
|
73
|
-
return join(getConfigDir(), 'config.json');
|
|
72
|
+
export function getConfigPath(profileDir) {
|
|
73
|
+
return join(getConfigDir(profileDir), 'config.json');
|
|
74
74
|
}
|
|
75
75
|
/**
|
|
76
|
-
*
|
|
76
|
+
* 全局共享的旧配置路径(ADR-0005 时代的位置,被所有实例共享)。
|
|
77
77
|
*
|
|
78
|
-
*
|
|
79
|
-
*
|
|
80
|
-
*
|
|
81
|
-
* ponytail: 兼容读取保留至下一个大版本(5.x 首发)后移除,届时可整段删除。
|
|
78
|
+
* 只在迁移窗口内被读:实例在「全局文件存在且 profile 内尚未生成」时导入,
|
|
79
|
+
* 导入后把全局文件改名标记为已迁,使后续实例从干净状态启动。
|
|
80
|
+
* 正常读写一律经 getConfigDir(),此路径不参与优先级链。
|
|
82
81
|
*/
|
|
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;
|
|
82
|
+
export function getSharedConfigPath() {
|
|
83
|
+
return join(resolveDshHome(), 'ponytail', 'config.json');
|
|
94
84
|
}
|
|
95
85
|
/**
|
|
96
86
|
* 读取配置文件原文:新位置优先,缺失时一次性回退旧位置。
|
|
97
87
|
* 返回 null 表示两处都不存在或均不可读。
|
|
98
88
|
*/
|
|
99
|
-
export function readConfigFileText() {
|
|
100
|
-
const candidates = [getConfigPath(),
|
|
89
|
+
export function readConfigFileText(profileDir) {
|
|
90
|
+
const candidates = [getConfigPath(profileDir), getSharedConfigPath()];
|
|
101
91
|
for (const p of candidates) {
|
|
102
|
-
if (!p)
|
|
103
|
-
continue;
|
|
104
92
|
try {
|
|
105
93
|
return readFileSync(p, 'utf8').replace(/^\uFEFF/, '');
|
|
106
94
|
}
|
|
@@ -110,13 +98,13 @@ export function readConfigFileText() {
|
|
|
110
98
|
}
|
|
111
99
|
return null;
|
|
112
100
|
}
|
|
113
|
-
export function getDefaultMode() {
|
|
101
|
+
export function getDefaultMode(profileDir) {
|
|
114
102
|
const envMode = process.env['PONYTAIL_DEFAULT_MODE'];
|
|
115
103
|
if (envMode && RUNTIME_MODES.includes(envMode.toLowerCase())) {
|
|
116
104
|
return envMode.toLowerCase();
|
|
117
105
|
}
|
|
118
106
|
try {
|
|
119
|
-
const raw = readConfigFileText();
|
|
107
|
+
const raw = readConfigFileText(profileDir);
|
|
120
108
|
if (raw === null)
|
|
121
109
|
return DEFAULT_MODE;
|
|
122
110
|
const config = JSON.parse(raw);
|
|
@@ -155,21 +143,21 @@ function parseConfigObject(raw) {
|
|
|
155
143
|
}
|
|
156
144
|
return { defaultMode: DEFAULT_MODE, disabledSkills: [] };
|
|
157
145
|
}
|
|
158
|
-
export function readFullConfig() {
|
|
159
|
-
return parseConfigObject(readConfigFileText());
|
|
146
|
+
export function readFullConfig(profileDir) {
|
|
147
|
+
return parseConfigObject(readConfigFileText(profileDir));
|
|
160
148
|
}
|
|
161
149
|
/**
|
|
162
150
|
* 字段级 merge 写盘:保留 config.json 中用户手写的未知字段(不再重建为两键对象),
|
|
163
151
|
* defaultMode 经 normalizeMode 校验——非法值拒绝返回 null 不写盘(writeDefaultMode 语义统一)。
|
|
164
152
|
* 失败契约:写盘异常返回 null(与 resetFullConfig/writeDefaultMode 一致)。
|
|
165
153
|
*/
|
|
166
|
-
export function writeFullConfig(patch) {
|
|
154
|
+
export function writeFullConfig(patch, profileDir) {
|
|
167
155
|
try {
|
|
168
|
-
const configPath = getConfigPath();
|
|
156
|
+
const configPath = getConfigPath(profileDir);
|
|
169
157
|
mkdirSync(dirname(configPath), { recursive: true });
|
|
170
158
|
let config = {};
|
|
171
159
|
try {
|
|
172
|
-
const raw = readConfigFileText();
|
|
160
|
+
const raw = readConfigFileText(profileDir);
|
|
173
161
|
const parsed = raw === null ? null : JSON.parse(raw);
|
|
174
162
|
if (parsed && typeof parsed === 'object' && !Array.isArray(parsed))
|
|
175
163
|
config = parsed;
|
|
@@ -198,19 +186,35 @@ export function writeFullConfig(patch) {
|
|
|
198
186
|
return null;
|
|
199
187
|
}
|
|
200
188
|
}
|
|
201
|
-
export function resetFullConfig() {
|
|
189
|
+
export function resetFullConfig(profileDir) {
|
|
202
190
|
return writeFullConfig({
|
|
203
191
|
defaultMode: DEFAULT_MODE,
|
|
204
192
|
disabledSkills: [],
|
|
205
193
|
});
|
|
206
194
|
}
|
|
207
|
-
export function writeDefaultMode(mode) {
|
|
195
|
+
export function writeDefaultMode(mode, profileDir) {
|
|
208
196
|
const normalized = normalizeMode(mode);
|
|
209
197
|
if (!normalized)
|
|
210
198
|
return null;
|
|
211
|
-
const written = writeFullConfig({ defaultMode: normalized });
|
|
199
|
+
const written = writeFullConfig({ defaultMode: normalized }, profileDir);
|
|
212
200
|
if (written === null)
|
|
213
201
|
return null;
|
|
214
202
|
return normalized;
|
|
215
203
|
}
|
|
204
|
+
/**
|
|
205
|
+
* 读一个可能是 volatile 引用、可能是裸值、也可能读到 undefined 的字段。
|
|
206
|
+
*
|
|
207
|
+
* 为什么必须容这三态:schemastery 对 `.volatile()` 字段无条件造出引用(其值取 schema 默认值,
|
|
208
|
+
* schemastery/lib/index.mjs:480),没有默认值时也是「引用包着 undefined」;
|
|
209
|
+
* 而直接构造 config 对象的测试路径拿到的是裸值。两者必须读出同一业务值,
|
|
210
|
+
* 否则同一字段在不同入口会给出不同结果。
|
|
211
|
+
*/
|
|
212
|
+
export function readVolatile(field) {
|
|
213
|
+
if (field === undefined || field === null)
|
|
214
|
+
return undefined;
|
|
215
|
+
if (typeof field === 'object' && typeof field.get === 'function') {
|
|
216
|
+
return field.get();
|
|
217
|
+
}
|
|
218
|
+
return field;
|
|
219
|
+
}
|
|
216
220
|
//# sourceMappingURL=ponytail-config.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ponytail-config.js","sourceRoot":"","sources":["../src/ponytail-config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,SAAS,CAAA;AAChE,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AACjC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAElD,MAAM,CAAC,MAAM,YAAY,GAAG,MAAM,CAAA;AAClC,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAU,CAAA;AAItE,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,IAAI,OAAO,IAAI,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAA;IACzC,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAA;IACnC,OAAQ,aAAmC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAE,CAAiB,CAAC,CAAC,CAAC,IAAI,CAAA;AACrF,CAAC;AAGD,0BAA0B;AAC1B,MAAM,UAAU,WAAW,CAAC,CAAS;IACnC,OAAO,OAAO,CAAC,KAAK,QAAQ,IAAI,0BAA0B,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;AACpE,CAAC;AAED,8EAA8E;AAC9E,cAAc;AACd,8EAA8E;AAE9E,mEAAmE;AACnE,MAAM,CAAC,MAAM,YAAY,GAAG,UAAU,CAAA;AAEtC,0EAA0E;AAC1E,MAAM,iBAAiB,GAAG,MAAM,CAAA;AAEhC;;;GAGG;AACH,SAAS,cAAc,CAAC,CAAS;IAC/B,IAAI,CAAC,KAAK,GAAG;QAAE,OAAO,OAAO,EAAE,CAAA;IAC/B,IAAI,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;IACjF,OAAO,CAAC,CAAA;AACV,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,cAAc,CAAC,UAAmB,EAAE,MAA0C,OAAO,CAAC,GAAG;IACvG,MAAM,OAAO,GAAG,GAAG,CAAC,YAAY,CAAC,CAAA;IACjC,MAAM,IAAI,GACR,UAAU,IAAI,CAAC,OAAO,KAAK,SAAS,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,iBAAiB,CAAC,CAAC,CAAA;IACnH,OAAO,OAAO,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAA;AACtC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,YAAY
|
|
1
|
+
{"version":3,"file":"ponytail-config.js","sourceRoot":"","sources":["../src/ponytail-config.ts"],"names":[],"mappings":"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"}
|
|
@@ -10,12 +10,16 @@
|
|
|
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,7 +37,7 @@ 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;
|
|
@@ -43,12 +47,10 @@ export interface PriorityReport {
|
|
|
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
|
@@ -10,22 +10,24 @@
|
|
|
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
|
/**
|
|
@@ -33,11 +35,10 @@ const PROBLEMS = {
|
|
|
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,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ponytail-remote — 只读推导值的官方跨端通道
|
|
3
|
+
*
|
|
4
|
+
* 迁移到官方配置组合后,可持久化字段(defaultMode、disabledSkills)由 Cordis Config 的
|
|
5
|
+
* 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
|
+
* 本模块同时承载技能元数据读取(SKILL.md frontmatter 为唯一真源),
|
|
16
|
+
* 原先它挂在 HTTP 端点上,删除 HTTP 后由这里继续提供。
|
|
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
|
+
export interface SkillMeta {
|
|
22
|
+
id: string;
|
|
23
|
+
name: string;
|
|
24
|
+
description: string;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* 从 skills/ 目录读取全部技能元数据(SKILL.md frontmatter 为唯一真源)。
|
|
28
|
+
* 不按禁用状态过滤——面板需要展示全部 6 项(enabled 由 state.isSkillEnabled 标记)。
|
|
29
|
+
* 目录/文件不可读时回退 FALLBACK_SKILL_META(不抛错)。
|
|
30
|
+
*/
|
|
31
|
+
export declare function readSkillMeta(skillDirPath: string): SkillMeta[];
|
|
32
|
+
/** 跨端下发的只读快照:形状必须是 lossless JSON(typert-protocol 的 isRemoteJsonValue) */
|
|
33
|
+
export interface PonytailRemoteSnapshot {
|
|
34
|
+
/** 当前会话生效的等级(null 表示关闭,序列化为字符串 'off') */
|
|
35
|
+
currentMode: string;
|
|
36
|
+
/** 四级优先级诊断链 */
|
|
37
|
+
priority: PriorityReport;
|
|
38
|
+
}
|
|
39
|
+
export interface PonytailRemoteDeps {
|
|
40
|
+
snapshot(): PonytailRemoteSnapshot;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* 远程服务:只暴露 snapshot 一个只读端点。
|
|
44
|
+
*
|
|
45
|
+
* 写操作一律不在这里——它们走 settings(官方配置通道),由宿主负责校验、
|
|
46
|
+
* revision 冲突检测与 loader 的 volatile 热提交。这里多开一个写端点等于绕过那套保护。
|
|
47
|
+
*
|
|
48
|
+
* `@Remote('snapshot')` 用字符串形式:仓库 tsconfig 的 experimentalDecorators 为 false
|
|
49
|
+
* (标准装饰器),零参 `@Remote()` 在该语义下拿不到 class context,TS 会报 TS2554/TS1241。
|
|
50
|
+
*/
|
|
51
|
+
export declare class PonytailRemote extends TypertRemoteService {
|
|
52
|
+
private readonly deps;
|
|
53
|
+
constructor(ctx: Context, deps: PonytailRemoteDeps);
|
|
54
|
+
snapshot(): PonytailRemoteSnapshot;
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=ponytail-remote.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ponytail-remote.d.ts","sourceRoot":"","sources":["../src/ponytail-remote.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAKH,OAAO,EAAU,mBAAmB,EAAE,MAAM,kCAAkC,CAAA;AAC9E,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAClD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAA;AAiB5D,MAAM,WAAW,SAAS;IAAG,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE;AAiB5E;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,YAAY,EAAE,MAAM,GAAG,SAAS,EAAE,CAgB/D;AAED,yEAAyE;AACzE,MAAM,WAAW,sBAAsB;IACrC,yCAAyC;IACzC,WAAW,EAAE,MAAM,CAAA;IACnB,eAAe;IACf,QAAQ,EAAE,cAAc,CAAA;CACzB;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,IAAI,sBAAsB,CAAA;CACnC;AAED;;;;;;;;GAQG;AACH,qBAAa,cAAe,SAAQ,mBAAmB;IACrD,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAoB;gBAE7B,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,kBAAkB;IAMlD,QAAQ,IAAI,sBAAsB;CAGnC"}
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ponytail-remote — 只读推导值的官方跨端通道
|
|
3
|
+
*
|
|
4
|
+
* 迁移到官方配置组合后,可持久化字段(defaultMode、disabledSkills)由 Cordis Config 的
|
|
5
|
+
* 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
|
+
* 本模块同时承载技能元数据读取(SKILL.md frontmatter 为唯一真源),
|
|
16
|
+
* 原先它挂在 HTTP 端点上,删除 HTTP 后由这里继续提供。
|
|
17
|
+
*/
|
|
18
|
+
var __runInitializers = (this && this.__runInitializers) || function (thisArg, initializers, value) {
|
|
19
|
+
var useValue = arguments.length > 2;
|
|
20
|
+
for (var i = 0; i < initializers.length; i++) {
|
|
21
|
+
value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);
|
|
22
|
+
}
|
|
23
|
+
return useValue ? value : void 0;
|
|
24
|
+
};
|
|
25
|
+
var __esDecorate = (this && this.__esDecorate) || function (ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {
|
|
26
|
+
function accept(f) { if (f !== void 0 && typeof f !== "function") throw new TypeError("Function expected"); return f; }
|
|
27
|
+
var kind = contextIn.kind, key = kind === "getter" ? "get" : kind === "setter" ? "set" : "value";
|
|
28
|
+
var target = !descriptorIn && ctor ? contextIn["static"] ? ctor : ctor.prototype : null;
|
|
29
|
+
var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});
|
|
30
|
+
var _, done = false;
|
|
31
|
+
for (var i = decorators.length - 1; i >= 0; i--) {
|
|
32
|
+
var context = {};
|
|
33
|
+
for (var p in contextIn) context[p] = p === "access" ? {} : contextIn[p];
|
|
34
|
+
for (var p in contextIn.access) context.access[p] = contextIn.access[p];
|
|
35
|
+
context.addInitializer = function (f) { if (done) throw new TypeError("Cannot add initializers after decoration has completed"); extraInitializers.push(accept(f || null)); };
|
|
36
|
+
var result = (0, decorators[i])(kind === "accessor" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);
|
|
37
|
+
if (kind === "accessor") {
|
|
38
|
+
if (result === void 0) continue;
|
|
39
|
+
if (result === null || typeof result !== "object") throw new TypeError("Object expected");
|
|
40
|
+
if (_ = accept(result.get)) descriptor.get = _;
|
|
41
|
+
if (_ = accept(result.set)) descriptor.set = _;
|
|
42
|
+
if (_ = accept(result.init)) initializers.unshift(_);
|
|
43
|
+
}
|
|
44
|
+
else if (_ = accept(result)) {
|
|
45
|
+
if (kind === "field") initializers.unshift(_);
|
|
46
|
+
else descriptor[key] = _;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
if (target) Object.defineProperty(target, contextIn.name, descriptor);
|
|
50
|
+
done = true;
|
|
51
|
+
};
|
|
52
|
+
import { readFileSync, readdirSync } from 'node:fs';
|
|
53
|
+
import { join } from 'node:path';
|
|
54
|
+
import { parse as parseYaml } from 'yaml';
|
|
55
|
+
import { Remote, TypertRemoteService } from '@deepseek-ai/dsh-typert-protocol';
|
|
56
|
+
// 兜底元数据:仅当 frontmatter 目录不可读时使用(正常路径以 SKILL.md 为唯一真源,
|
|
57
|
+
// 见 readSkillMeta)。与客户端构建期快照同源,防目录不可读时面板空白。
|
|
58
|
+
const FALLBACK_SKILL_META = [
|
|
59
|
+
{ id: 'ponytail', name: 'ponytail', description: '懒人模式本体:3 档强度,梯子七阶注入' },
|
|
60
|
+
{ id: 'ponytail-review', name: 'ponytail-review', description: '过度设计评审:只挑能删的代码,一行一条' },
|
|
61
|
+
{ id: 'ponytail-audit', name: 'ponytail-audit', description: '全仓过度设计审计:按可删行数降序猎取臃肿' },
|
|
62
|
+
{ id: 'ponytail-debt', name: 'ponytail-debt', description: '债务台账收割:收割所有 ponytail: 注释,建立债务台账' },
|
|
63
|
+
{ id: 'ponytail-gain', name: 'ponytail-gain', description: '收益看板:展示 benchmark 中位数收益' },
|
|
64
|
+
{ id: 'ponytail-help', name: 'ponytail-help', description: '速查卡:模式、技能、命令与配置速查' },
|
|
65
|
+
];
|
|
66
|
+
function parseSkillFrontmatter(filePath) {
|
|
67
|
+
try {
|
|
68
|
+
const raw = readFileSync(filePath, 'utf8').replace(/^\uFEFF/, '').replace(/\r\n/g, '\n');
|
|
69
|
+
if (!raw.startsWith('---\n'))
|
|
70
|
+
return null;
|
|
71
|
+
const end = raw.indexOf('\n---\n');
|
|
72
|
+
if (end < 0)
|
|
73
|
+
return null;
|
|
74
|
+
const fm = parseYaml(raw.slice(4, end));
|
|
75
|
+
if (typeof fm !== 'object' || fm === null || Array.isArray(fm))
|
|
76
|
+
return null;
|
|
77
|
+
const desc = fm['description'];
|
|
78
|
+
return { description: typeof desc === 'string' ? desc : undefined };
|
|
79
|
+
}
|
|
80
|
+
catch {
|
|
81
|
+
return null;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* 从 skills/ 目录读取全部技能元数据(SKILL.md frontmatter 为唯一真源)。
|
|
86
|
+
* 不按禁用状态过滤——面板需要展示全部 6 项(enabled 由 state.isSkillEnabled 标记)。
|
|
87
|
+
* 目录/文件不可读时回退 FALLBACK_SKILL_META(不抛错)。
|
|
88
|
+
*/
|
|
89
|
+
export function readSkillMeta(skillDirPath) {
|
|
90
|
+
let names = [];
|
|
91
|
+
try {
|
|
92
|
+
names = readdirSync(skillDirPath, { withFileTypes: true })
|
|
93
|
+
.filter((d) => d.isDirectory() && !d.name.startsWith('.'))
|
|
94
|
+
.map((d) => d.name)
|
|
95
|
+
.sort();
|
|
96
|
+
}
|
|
97
|
+
catch {
|
|
98
|
+
return FALLBACK_SKILL_META.map((m) => ({ ...m }));
|
|
99
|
+
}
|
|
100
|
+
const metas = [];
|
|
101
|
+
for (const name of names) {
|
|
102
|
+
const fm = parseSkillFrontmatter(join(skillDirPath, name, 'SKILL.md'));
|
|
103
|
+
metas.push({ id: name, name, description: fm?.description ?? name });
|
|
104
|
+
}
|
|
105
|
+
return metas.length > 0 ? metas : FALLBACK_SKILL_META.map((m) => ({ ...m }));
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* 远程服务:只暴露 snapshot 一个只读端点。
|
|
109
|
+
*
|
|
110
|
+
* 写操作一律不在这里——它们走 settings(官方配置通道),由宿主负责校验、
|
|
111
|
+
* revision 冲突检测与 loader 的 volatile 热提交。这里多开一个写端点等于绕过那套保护。
|
|
112
|
+
*
|
|
113
|
+
* `@Remote('snapshot')` 用字符串形式:仓库 tsconfig 的 experimentalDecorators 为 false
|
|
114
|
+
* (标准装饰器),零参 `@Remote()` 在该语义下拿不到 class context,TS 会报 TS2554/TS1241。
|
|
115
|
+
*/
|
|
116
|
+
let PonytailRemote = (() => {
|
|
117
|
+
let _classSuper = TypertRemoteService;
|
|
118
|
+
let _instanceExtraInitializers = [];
|
|
119
|
+
let _snapshot_decorators;
|
|
120
|
+
return class PonytailRemote extends _classSuper {
|
|
121
|
+
static {
|
|
122
|
+
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
|
|
123
|
+
_snapshot_decorators = [Remote('snapshot')];
|
|
124
|
+
__esDecorate(this, null, _snapshot_decorators, { kind: "method", name: "snapshot", static: false, private: false, access: { has: obj => "snapshot" in obj, get: obj => obj.snapshot }, metadata: _metadata }, null, _instanceExtraInitializers);
|
|
125
|
+
if (_metadata) Object.defineProperty(this, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
|
|
126
|
+
}
|
|
127
|
+
deps = __runInitializers(this, _instanceExtraInitializers);
|
|
128
|
+
constructor(ctx, deps) {
|
|
129
|
+
super(ctx, 'ponytailRemote', { namespace: 'ponytail' });
|
|
130
|
+
this.deps = deps;
|
|
131
|
+
}
|
|
132
|
+
snapshot() {
|
|
133
|
+
return this.deps.snapshot();
|
|
134
|
+
}
|
|
135
|
+
};
|
|
136
|
+
})();
|
|
137
|
+
export { PonytailRemote };
|
|
138
|
+
//# sourceMappingURL=ponytail-remote.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ponytail-remote.js","sourceRoot":"","sources":["../src/ponytail-remote.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ponytail-settings — 可持久化配置的读写通道(方案 B 深模块)
|
|
3
|
+
*
|
|
4
|
+
* 迁移到 DSH 官方插件配置组合后,本插件的可持久化字段(defaultMode、disabledSkills)
|
|
5
|
+
* 声明为 Cordis Config 的 `.volatile()` 字段,由宿主的 settings 服务投影成官方表单,
|
|
6
|
+
* 写入落到 profile 补丁(`profiles/<name>/cordis.patch.yml`)。
|
|
7
|
+
* 通道本身有两个实现:
|
|
8
|
+
*
|
|
9
|
+
* - `createSettingsSink`:官方路径,经 `ctx.settings.mutate(ns, ops, revision)` 写入。
|
|
10
|
+
* 宿主负责 schema 校验、revision 冲突检测与 loader 的 volatile 热提交。
|
|
11
|
+
* - `createFileSink`:回退路径,直读直写 profile 内的 `ponytail/config.json`(无 profileContext 时退回 DSH 数据根)。
|
|
12
|
+
* 存在于无 profileContext 的组合(headless、CLI)——dsh-base 的 settings 行
|
|
13
|
+
* `disabled: !!js "!ctx.get('profileContext')"`,那些组合装配不上 settings 服务,
|
|
14
|
+
* 此时必须仍能改配置,不能因迁移而静默失效。
|
|
15
|
+
*
|
|
16
|
+
* 优先级链不在本模块:resolvePriority 仍是 env > profile 补丁 > full 的唯一真源。
|
|
17
|
+
*/
|
|
18
|
+
import type { RuntimeMode } from './ponytail-config.js';
|
|
19
|
+
/** 写入操作:与官方 settings.mutate 的 ops 形状一致(dsh-api-settings-controller:432)。 */
|
|
20
|
+
export interface ConfigWriteOp {
|
|
21
|
+
op: 'set' | 'unset';
|
|
22
|
+
path: string[];
|
|
23
|
+
value?: unknown;
|
|
24
|
+
}
|
|
25
|
+
/** settings 服务的最小表面;只声明本模块真正用到的三个方法。 */
|
|
26
|
+
export interface SettingsLike {
|
|
27
|
+
mutate(ns: string, ops: ConfigWriteOp[], expectedRevision?: number): Promise<unknown>;
|
|
28
|
+
describe(options?: {
|
|
29
|
+
redactSecrets?: boolean;
|
|
30
|
+
}): {
|
|
31
|
+
namespaces?: {
|
|
32
|
+
ns: string;
|
|
33
|
+
value?: unknown;
|
|
34
|
+
}[];
|
|
35
|
+
} | unknown[];
|
|
36
|
+
update?(ns: string, patch: Record<string, unknown>, expectedRevision?: number): Promise<unknown>;
|
|
37
|
+
}
|
|
38
|
+
export interface PonytailConfigSink {
|
|
39
|
+
/** 当前默认档;未配置时回落到内置兜底 */
|
|
40
|
+
readDefaultMode(): RuntimeMode;
|
|
41
|
+
/** 写入默认档;非法档返回 null 且不写入 */
|
|
42
|
+
writeDefaultMode(mode: string): RuntimeMode | null;
|
|
43
|
+
/** 当前禁用的技能名列表 */
|
|
44
|
+
readDisabled(): string[];
|
|
45
|
+
/** 覆盖式写入禁用列表 */
|
|
46
|
+
writeDisabled(skills: string[]): void;
|
|
47
|
+
/** 清空两项配置(unset 而非写默认值,避免在补丁里留下冗余值) */
|
|
48
|
+
reset(): Promise<void> | void;
|
|
49
|
+
}
|
|
50
|
+
export interface SettingsSinkOptions {
|
|
51
|
+
logger?: {
|
|
52
|
+
warn(msg: string): void;
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
export declare function createSettingsSink(ctx: {
|
|
56
|
+
settings?: SettingsLike | null;
|
|
57
|
+
}, namespace?: string, options?: SettingsSinkOptions): PonytailConfigSink;
|
|
58
|
+
/**
|
|
59
|
+
* 文件回退通道:无 settings 服务的组合(headless / CLI)直接读写 profile 内 config.json。
|
|
60
|
+
* 与 settings 通道共享同一组语义:非法档不写、reset 清空两项。
|
|
61
|
+
*/
|
|
62
|
+
export declare function createFileSink(profileDir?: string): PonytailConfigSink;
|
|
63
|
+
export interface LegacyMigrationDeps {
|
|
64
|
+
/** 官方 settings 服务:用 describe 判断是否已设,用 update 写入 */
|
|
65
|
+
settings: {
|
|
66
|
+
describe(options?: {
|
|
67
|
+
redactSecrets?: boolean;
|
|
68
|
+
}): {
|
|
69
|
+
namespaces?: {
|
|
70
|
+
ns: string;
|
|
71
|
+
value?: unknown;
|
|
72
|
+
}[];
|
|
73
|
+
} | unknown[];
|
|
74
|
+
update(ns: string, patch: Record<string, unknown>, expectedRevision?: number): Promise<unknown>;
|
|
75
|
+
};
|
|
76
|
+
namespace: string;
|
|
77
|
+
/** 读取旧配置文件内容(由调用方提供,便于测试隔离) */
|
|
78
|
+
readLegacy: () => {
|
|
79
|
+
defaultMode: RuntimeMode;
|
|
80
|
+
disabledSkills: string[];
|
|
81
|
+
};
|
|
82
|
+
/** 把旧配置改名以标记已导入(对齐 dsh-settings 的 settings.yaml.imported 做法) */
|
|
83
|
+
renameLegacy: () => Promise<void>;
|
|
84
|
+
logger: {
|
|
85
|
+
info(msg: string): void;
|
|
86
|
+
warn(msg: string): void;
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* 一次性把 config.json 的两个字段导入 profile 补丁,并改名旧文件使其幂等。
|
|
91
|
+
*
|
|
92
|
+
* 判据:旧配置「有内容」且 profile 侧该命名空间「还没设过」。两者同时成立才导入。
|
|
93
|
+
* 导入失败只 warn,不阻断启动——老用户配置丢了可以手动再填,但插件不该起不来。
|
|
94
|
+
*/
|
|
95
|
+
export declare function migrateLegacyConfig(deps: LegacyMigrationDeps): Promise<boolean>;
|
|
96
|
+
//# sourceMappingURL=ponytail-settings.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ponytail-settings.d.ts","sourceRoot":"","sources":["../src/ponytail-settings.ts"],"names":[],"mappings":"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"}
|