@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.js
CHANGED
|
@@ -7,29 +7,42 @@
|
|
|
7
7
|
* - 对应 DSH 生命周期接线:activate / mode-tracker / subagent / config / instructions / runtime
|
|
8
8
|
* - 不注册任何 tool,全部能力经 Skill 暴露
|
|
9
9
|
*/
|
|
10
|
+
import { rename } from 'node:fs/promises';
|
|
10
11
|
import { resolve } from 'node:path';
|
|
11
12
|
import { fileURLToPath } from 'node:url';
|
|
12
13
|
import Schema from '@deepseek-ai/schemastery';
|
|
13
|
-
import { isShellSafe, normalizeMode,
|
|
14
|
+
import { getSharedConfigPath, isShellSafe, normalizeMode, readFullConfig, readVolatile, } from './ponytail-config.js';
|
|
15
|
+
import { createFileSink, createSettingsSink, migrateLegacyConfig, } from './ponytail-settings.js';
|
|
14
16
|
import { resolvePriority } from './ponytail-priority.js';
|
|
15
|
-
import { createConfigHttpEndpoint } from './ponytail-http.js';
|
|
16
17
|
import { createCommandDispatcher } from './ponytail-commands.js';
|
|
17
18
|
import { renderPromptSection } from './ponytail-instructions.js';
|
|
18
|
-
import { createPonytailState } from './ponytail-state.js';
|
|
19
|
+
import { createDiskStorage, createPonytailState } from './ponytail-state.js';
|
|
19
20
|
import { PonytailProvider } from './ponytail-skills.js';
|
|
21
|
+
import { PonytailRemote } from './ponytail-remote.js';
|
|
22
|
+
// Config 的类型标注交给 schemastery 推断:PonytailConfig 里两个可持久化字段已是
|
|
23
|
+
// VolatileRef 形状,手动标注反而会让 TS 在 meta.default 上做无意义的交叉比对。
|
|
20
24
|
export const Config = Schema.object({
|
|
21
25
|
providerName: Schema.string().default('ponytail'),
|
|
22
26
|
skillDir: Schema.string(),
|
|
23
27
|
// 注意:不给 defaultMode 设 Schema 默认值——Cordis 校验会把缺省 fill 成显式配置,
|
|
24
28
|
// 从而 shadow 掉 config.json 的 defaultMode 档;缺省时由 apply 走
|
|
25
29
|
// resolvePriority()(env > patch > config 文件 > full,见 ponytail-priority.ts)
|
|
26
|
-
|
|
30
|
+
//
|
|
31
|
+
// volatile 声明的含义是「改了不必重挂载」:宿主 loader 收到新值后就地提交到本进程的引用
|
|
32
|
+
// 并派发 loader/volatile-update(cordis-plugin-loader/lib/index.js:393-425),
|
|
33
|
+
// 写入经 settings 落到 profile 补丁,重启后由 Cordis 解析回同一组 volatile 引用。
|
|
34
|
+
// union 自身可以 volatile:schemastery 只禁止「volatile 字段嵌在 union 分支 / 数组元素 / dict 内」
|
|
35
|
+
// (schemastery/lib/index.mjs:241-252),顶层固定对象路径上的 union 是允许的。
|
|
36
|
+
defaultMode: Schema.union(['off', 'lite', 'full', 'ultra']).volatile(),
|
|
37
|
+
// 技能禁用列表此前只存在 config.json(HTTP 端点专属)。迁入 Config 后由官方表单承载,
|
|
38
|
+
// 获得 revision 冲突保护与跨页面同步;旧值由 ponytail-settings 的 migrateLegacyConfig 一次性导入。
|
|
39
|
+
disabledSkills: Schema.array(Schema.string()).volatile(),
|
|
27
40
|
});
|
|
28
41
|
// ---------------------------------------------------------------------------
|
|
29
42
|
// 插件元信息
|
|
30
43
|
// ---------------------------------------------------------------------------
|
|
31
44
|
export const name = 'ponytail';
|
|
32
|
-
export const inject = ['skills', 'systemPrompt'
|
|
45
|
+
export const inject = ['skills', 'systemPrompt'];
|
|
33
46
|
// ---------------------------------------------------------------------------
|
|
34
47
|
// 工具函数(与 superpowers 同款健壮版)
|
|
35
48
|
// ---------------------------------------------------------------------------
|
|
@@ -43,6 +56,41 @@ function resolveDefaultSkillDir(configSkillDir) {
|
|
|
43
56
|
return resolve('skills');
|
|
44
57
|
}
|
|
45
58
|
}
|
|
59
|
+
/**
|
|
60
|
+
* 读一个可能不存在、且未在 inject 里声明的服务。
|
|
61
|
+
*
|
|
62
|
+
* 为什么不能用属性读:cordis 的 ctx 是 Proxy,读未 inject 的属性会抛
|
|
63
|
+
* cannot get property settings without inject(cordis/lib/index.js:676),而不是返回 undefined。
|
|
64
|
+
* 所以服务在不在只能靠 try/catch 判断——这也正是无 profileContext 的组合
|
|
65
|
+
* (headless / CLI,dsh-base 的 settings 行被 disabled 表达式关掉)需要文件回退通道的原因。
|
|
66
|
+
*
|
|
67
|
+
* 为什么不用 ctx.inject([settings], …):inject 让 fiber 等这个服务,
|
|
68
|
+
* 而 headless 组合里它永不出现,插件将永远不挂载(连提示词与技能都没有了)。
|
|
69
|
+
*/
|
|
70
|
+
function readService(ctx, name) {
|
|
71
|
+
try {
|
|
72
|
+
return ctx[name];
|
|
73
|
+
}
|
|
74
|
+
catch {
|
|
75
|
+
return undefined;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* 建立可持久化配置的读写通道。
|
|
80
|
+
*
|
|
81
|
+
* 有 settings 服务时走官方路径:写入落到 profile 补丁(profiles/<name>/cordis.patch.yml),
|
|
82
|
+
* 由宿主的 configForms 承载表单与 revision 冲突保护。
|
|
83
|
+
* 没有时(headless / CLI —— dsh-base 的 settings 行在无 profileContext 时禁用)
|
|
84
|
+
* 回退 config.json 文件通道,那些组合仍然可以改配置。
|
|
85
|
+
*/
|
|
86
|
+
function createSinkFor(ctx, profileDir) {
|
|
87
|
+
try {
|
|
88
|
+
return createSettingsSink({ settings: readService(ctx, 'settings') }, 'ponytail', { logger: { warn: (msg) => ctx.logger.warn(msg) } });
|
|
89
|
+
}
|
|
90
|
+
catch {
|
|
91
|
+
return createFileSink(profileDir);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
46
94
|
// ---------------------------------------------------------------------------
|
|
47
95
|
// 插件入口
|
|
48
96
|
// ---------------------------------------------------------------------------
|
|
@@ -52,62 +100,74 @@ export function apply(ctx, config = {}) {
|
|
|
52
100
|
const resolved = {
|
|
53
101
|
providerName: rawConfig['providerName'] ?? 'ponytail',
|
|
54
102
|
...(rawConfig['skillDir'] !== undefined ? { skillDir: rawConfig['skillDir'] } : {}),
|
|
103
|
+
// 两个 volatile 字段原样透传:真实运行时它们是引用,读侧经 readVolatile 取值;
|
|
104
|
+
// 测试与 mock 宿主可能传裸值,readVolatile 两种都认。
|
|
105
|
+
...(rawConfig['defaultMode'] !== undefined
|
|
106
|
+
? { defaultMode: rawConfig['defaultMode'] }
|
|
107
|
+
: {}),
|
|
108
|
+
...(rawConfig['disabledSkills'] !== undefined
|
|
109
|
+
? { disabledSkills: rawConfig['disabledSkills'] }
|
|
110
|
+
: {}),
|
|
55
111
|
};
|
|
112
|
+
// 配置通道:有 settings 服务走官方路径(写入落 profile 补丁,由官方表单承载);
|
|
113
|
+
// 无 settings 服务的组合(headless / CLI —— dsh-base 的 settings 行在无 profileContext 时禁用)
|
|
114
|
+
// 静默回退 config.json 文件通道,不能因迁移而让这些组合失去配置能力。
|
|
115
|
+
const settingsService = readService(ctx, 'settings');
|
|
116
|
+
// profile 目录来自宿主的 profileContext 服务(runProfile 在整棵插件树挂载前 provide,
|
|
117
|
+
// 见 dsh/lib/profile-boot 的 hostCtx.provide('profileContext', ...))。
|
|
118
|
+
// 它把配置与 flag 的作用域收回单个实例:resolveDshHome() 结构上不含 profile 维度,
|
|
119
|
+
// 落在 $DSH_HOME/ponytail 下的文件被所有实例共享,多实例并存时互相覆盖。
|
|
120
|
+
// 读不到时(mock 宿主 / 裁剪宿主)退回全局路径,行为与旧版一致。
|
|
121
|
+
const profileContext = readService(ctx, 'profileContext');
|
|
122
|
+
const profileDir = typeof profileContext?.dir === 'string' ? profileContext.dir : undefined;
|
|
123
|
+
const configSink = createSinkFor(ctx, profileDir);
|
|
56
124
|
// 优先级唯一真源(ADR-0006):apply 启动判定与 UI 诊断链共用 resolvePriority,
|
|
57
|
-
// env > patch(cordis 显式声明)>
|
|
125
|
+
// env > patch(cordis 显式声明)> full,逐级 normalizeMode 归一。
|
|
58
126
|
// 旧判定把未归一的 patch 值直接 state.set()(大小写/非法值注入垃圾态),此处一并修复。
|
|
59
127
|
const envRaw = process.env['PONYTAIL_DEFAULT_MODE'];
|
|
60
128
|
if (envRaw && !normalizeMode(envRaw)) {
|
|
61
129
|
// ponytail: env 非法值静默回退与上游一致,此处 warn 为 DSH 差分(不改变回退语义),便于定位配置错误
|
|
62
130
|
ctx.logger.warn(`[ponytail] PONYTAIL_DEFAULT_MODE 值无效(回退后续来源):${envRaw}`);
|
|
63
131
|
}
|
|
64
|
-
|
|
65
|
-
//
|
|
66
|
-
//
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
return undefined;
|
|
72
|
-
const parsed = JSON.parse(raw);
|
|
73
|
-
const dm = parsed['defaultMode'];
|
|
74
|
-
return typeof dm === 'string' ? dm : undefined;
|
|
75
|
-
}
|
|
76
|
-
catch {
|
|
77
|
-
return undefined;
|
|
78
|
-
}
|
|
132
|
+
// profile 补丁里的 defaultMode 是 volatile 引用:启动时读一次,之后每次求值都重读,
|
|
133
|
+
// 因此官方表单改动后立刻反映到优先级链,无需重启。命令层写入的乐观值暂存 patchOverride,
|
|
134
|
+
// 收到 loader/volatile-update 的 defaultMode 后清掉。
|
|
135
|
+
let patchOverride;
|
|
136
|
+
const readPatchMode = () => {
|
|
137
|
+
const fromConfig = readVolatile(resolved.defaultMode);
|
|
138
|
+
return patchOverride ?? fromConfig;
|
|
79
139
|
};
|
|
80
140
|
const initialMode = resolvePriority({
|
|
81
141
|
envRaw,
|
|
82
|
-
patchMode,
|
|
83
|
-
configMode: readRawConfigMode(),
|
|
142
|
+
patchMode: readPatchMode(),
|
|
84
143
|
}).effective;
|
|
85
144
|
const skillDir = resolveDefaultSkillDir(resolved.skillDir);
|
|
86
|
-
//
|
|
87
|
-
//
|
|
88
|
-
//
|
|
89
|
-
if (
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
// ponytail: 仅启动时对齐一次,无实时订阅;需要即时生效时改挂 settings 的变更回调
|
|
98
|
-
if (typeof service.get === 'function') {
|
|
99
|
-
const stored = service.get('ponytail');
|
|
100
|
-
const mode = stored?.defaultMode ? normalizeMode(stored.defaultMode) : null;
|
|
101
|
-
if (mode && mode !== readRawConfigMode()) {
|
|
102
|
-
writeDefaultMode(mode);
|
|
103
|
-
ctx.logger.info(`[ponytail] 设置命名空间的默认档已对齐到 config.json:${mode}`);
|
|
145
|
+
// 一次性把 config.json 的两个字段导入 profile 补丁,然后改名旧文件使其幂等。
|
|
146
|
+
// 官方做法同款:dsh-settings 导入退役的 settings.yaml 时先改名再逐 section 写入
|
|
147
|
+
// (dsh-settings/lib/index.js:346-363)。导入失败只 warn,不阻断启动。
|
|
148
|
+
if (settingsService !== undefined && settingsService !== null) {
|
|
149
|
+
void migrateLegacyConfig({
|
|
150
|
+
settings: settingsService,
|
|
151
|
+
namespace: 'ponytail',
|
|
152
|
+
readLegacy: () => readFullConfig(profileDir),
|
|
153
|
+
renameLegacy: async () => {
|
|
154
|
+
try {
|
|
155
|
+
await rename(getSharedConfigPath(), `${getSharedConfigPath()}.imported`);
|
|
104
156
|
}
|
|
105
|
-
|
|
106
|
-
|
|
157
|
+
catch {
|
|
158
|
+
// 旧文件不存在或改名失败:数据仍在 profile 侧,下个版本移除兼容读取时无需处理
|
|
159
|
+
}
|
|
160
|
+
},
|
|
161
|
+
logger: {
|
|
162
|
+
info: (msg) => ctx.logger.info(msg),
|
|
163
|
+
warn: (msg) => ctx.logger.warn(msg),
|
|
164
|
+
},
|
|
165
|
+
}).catch((err) => {
|
|
166
|
+
ctx.logger.warn(`[ponytail] 旧配置迁移失败(不影响启动):${String(err)}`);
|
|
107
167
|
});
|
|
108
168
|
}
|
|
109
169
|
// 等级状态唯一归属:get()/set()/syncFromFile() 三方法,闭包态随 HMR 重建
|
|
110
|
-
const state = createPonytailState();
|
|
170
|
+
const state = createPonytailState({ sink: configSink, storage: createDiskStorage(profileDir) });
|
|
111
171
|
// 会话启动对齐(对齐上游 ponytail-activate.js SessionStart 语义):
|
|
112
172
|
// 每次会话启动都按 resolvePriority()(env > patch > config 文件 > full)重写 flag,
|
|
113
173
|
// 因此 /ponytail <档> 只在本会话生效,跨会话持久化必须用 /ponytail default <档>。
|
|
@@ -143,6 +203,51 @@ export function apply(ctx, config = {}) {
|
|
|
143
203
|
anyCtx.on('skills/change', (..._args) => {
|
|
144
204
|
ctx.logger.debug('[ponytail] 技能目录已变更');
|
|
145
205
|
});
|
|
206
|
+
// 官方 volatile 提交的通知:宿主 loader 把 profile 补丁里的新值就地写进本进程引用后
|
|
207
|
+
// 派发本事件(cordis-plugin-loader/lib/index.js:420,事件只在插件自己的 fiber 上广播)。
|
|
208
|
+
// 两件事必须在这里收敛,否则都是静默失效:
|
|
209
|
+
// - disabledSkills 变了但技能目录不失效 → 模型侧目录仍列着已禁用的技能;
|
|
210
|
+
// - 命令层的乐观默认值不清理 → 面板写的新值被陈旧缓存压住,永远不生效。
|
|
211
|
+
anyCtx.on('loader/volatile-update', (...args) => {
|
|
212
|
+
const [paths] = args;
|
|
213
|
+
if (!Array.isArray(paths))
|
|
214
|
+
return;
|
|
215
|
+
const touched = new Set(paths.map((segment) => String(segment)));
|
|
216
|
+
if (touched.has('disabledSkills')) {
|
|
217
|
+
state.reloadDisabledSkills();
|
|
218
|
+
try {
|
|
219
|
+
providerInstance?.invalidate();
|
|
220
|
+
}
|
|
221
|
+
catch {
|
|
222
|
+
// 失效失败不阻断:宿主会保留旧缓存到下次自然失效,用户看得见 UI 与模型侧不一致
|
|
223
|
+
}
|
|
224
|
+
ctx.logger.debug('[ponytail] 技能启用状态已变更,技能目录已失效');
|
|
225
|
+
}
|
|
226
|
+
if (touched.has('defaultMode')) {
|
|
227
|
+
patchOverride = undefined;
|
|
228
|
+
ctx.logger.debug('[ponytail] 默认档已由 profile 补丁提交,乐观缓存已清除');
|
|
229
|
+
}
|
|
230
|
+
});
|
|
231
|
+
// 只读推导值走官方 Typert 通道(命名空间 ponytail):优先级诊断链与当前生效等级
|
|
232
|
+
// 不是配置——它们由 env / profile 补丁 / 兜底三层合并得出,写进配置层
|
|
233
|
+
// 会让落盘值永久盖住真值。浏览器侧经 ctx.remote.ponytail.snapshot() 读取。
|
|
234
|
+
// 直接挂载:服务随插件 fiber 失效自动注销,不需要额外 disposer。
|
|
235
|
+
// 守卫与 settings 同款:精简宿主或 mock 上 ctx.plugin 可能不存在,
|
|
236
|
+
// 缺失时快照通道不可用(客户端降级为不显示优先级段),但不得掀翻其余能力。
|
|
237
|
+
if (typeof ctx.plugin === 'function') {
|
|
238
|
+
ctx.plugin(PonytailRemote, {
|
|
239
|
+
snapshot: () => ({
|
|
240
|
+
currentMode: state.get() ?? 'off',
|
|
241
|
+
priority: resolvePriority({
|
|
242
|
+
envRaw: process.env['PONYTAIL_DEFAULT_MODE'],
|
|
243
|
+
patchMode: readPatchMode(),
|
|
244
|
+
}),
|
|
245
|
+
}),
|
|
246
|
+
});
|
|
247
|
+
}
|
|
248
|
+
else {
|
|
249
|
+
ctx.logger.debug('[ponytail] 宿主无 ctx.plugin,远程快照通道未挂载(优先级面板将降级)');
|
|
250
|
+
}
|
|
146
251
|
// Always-on 注入:systemPrompt section,order 50 位于 persona(0) 之后
|
|
147
252
|
const systemPrompt = ctx.systemPrompt;
|
|
148
253
|
systemPrompt.section({
|
|
@@ -170,15 +275,14 @@ export function apply(ctx, config = {}) {
|
|
|
170
275
|
// 必须传实时闭包而非快照:/ponytail default <档> 写盘后,下一次命令解析要读到新值。
|
|
171
276
|
getDefaultMode: () => resolvePriority({
|
|
172
277
|
envRaw,
|
|
173
|
-
patchMode,
|
|
174
|
-
configMode: readRawConfigMode(),
|
|
278
|
+
patchMode: readPatchMode(),
|
|
175
279
|
}).effective,
|
|
176
280
|
// /ponytail default <档> 写盘后更新 patchMode:用户最新意图覆盖宿主声明,
|
|
177
281
|
// UI 快照与命令兜底同刻读新值(修复评审发现的静默 ignore)
|
|
178
282
|
updateDefaultMode: (mode) => {
|
|
179
|
-
|
|
283
|
+
patchOverride = mode;
|
|
180
284
|
},
|
|
181
|
-
writeDefaultMode,
|
|
285
|
+
writeDefaultMode: (mode) => configSink.writeDefaultMode(mode),
|
|
182
286
|
});
|
|
183
287
|
// 监听 agent/pre-step waterfall:模型请求前的最后拦截点(对齐上游 UserPromptSubmit)
|
|
184
288
|
// 必须 return next(),否则短路下游
|
|
@@ -237,37 +341,6 @@ export function apply(ctx, config = {}) {
|
|
|
237
341
|
ctx.logger.warn(`[ponytail] agent/created 处理失败:${String(err)}`);
|
|
238
342
|
}
|
|
239
343
|
});
|
|
240
|
-
// ---------------------------------------------------------------------------
|
|
241
|
-
// ---------------------------------------------------------------------------
|
|
242
|
-
// Web 配置端点:独立深工厂(src/ponytail-http.ts),apply 只保留接线
|
|
243
|
-
// invalidateSkills 依赖 providerInstance(上方注册时已捕获实例,C1 修复)
|
|
244
|
-
if (ctx.webServer) {
|
|
245
|
-
ctx.effect(() => {
|
|
246
|
-
ctx.logger.info('[ponytail] Web 配置端点已就绪: /api/plugins/ponytail/config');
|
|
247
|
-
return ctx.webServer.register({
|
|
248
|
-
kind: 'exact',
|
|
249
|
-
path: '/api/plugins/ponytail/config',
|
|
250
|
-
handler: createConfigHttpEndpoint({
|
|
251
|
-
state,
|
|
252
|
-
readRawConfigMode,
|
|
253
|
-
invalidateSkills: () => {
|
|
254
|
-
if (providerInstance) {
|
|
255
|
-
try {
|
|
256
|
-
providerInstance.invalidate();
|
|
257
|
-
}
|
|
258
|
-
catch {
|
|
259
|
-
// 忽略异常
|
|
260
|
-
}
|
|
261
|
-
}
|
|
262
|
-
},
|
|
263
|
-
readPatchMode: () => patchMode,
|
|
264
|
-
logger: ctx.logger,
|
|
265
|
-
readEnvRaw: () => process.env['PONYTAIL_DEFAULT_MODE'],
|
|
266
|
-
skillDir,
|
|
267
|
-
}),
|
|
268
|
-
});
|
|
269
|
-
}, 'ponytail: web route');
|
|
270
|
-
}
|
|
271
344
|
// 清理:HMR 卸载时自动通过 ctx 逆序清理所有注册;额外标记
|
|
272
345
|
ctx.effect(() => {
|
|
273
346
|
return () => {
|
package/lib/ponytail.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ponytail.js","sourceRoot":"","sources":["../src/ponytail.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAW,OAAO,EAAE,MAAM,WAAW,CAAA;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AAMxC,OAAO,MAAM,MAAM,0BAA0B,CAAA;AAE7C,OAAO,EACL,WAAW,EACX,aAAa,EACb,
|
|
1
|
+
{"version":3,"file":"ponytail.js","sourceRoot":"","sources":["../src/ponytail.ts"],"names":[],"mappings":"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"}
|
package/locale/en.json
CHANGED
|
@@ -1,38 +1,42 @@
|
|
|
1
1
|
{
|
|
2
|
-
"
|
|
3
|
-
"meta.description": "A full DSH port of DietrichGebert/ponytail: the always-on lazy senior developer mode and its seven-rung ladder (YAGNI down to the minimum implementation), with six native Chinese skills (core, review, audit, debt, gain, help) and zero tool registrations.",
|
|
4
|
-
"panel.title": "Ponytail Config",
|
|
5
|
-
"mode.title": "Intensity Level",
|
|
6
|
-
"mode.hint": "Controls how strongly the ladder prompt is injected. Changes apply immediately and are written to the config file for all sessions.",
|
|
7
|
-
"mode.lockedHint": "A higher-priority configuration is in effect; changes here will not affect the actual runtime level.",
|
|
8
|
-
"mode.off": "Off",
|
|
9
|
-
"mode.lite": "Lite",
|
|
10
|
-
"mode.full": "Standard",
|
|
11
|
-
"mode.ultra": "Ultra",
|
|
12
|
-
"skills.title": "Native Skills",
|
|
13
|
-
"skills.hint": "Disabled skills disappear from the slash menu and are not loaded by the model.",
|
|
14
|
-
"skills.toggleOn": "Enable {name}",
|
|
15
|
-
"skills.enabledToast": "Skill {name} enabled",
|
|
16
|
-
"skills.hiddenToast": "Skill {name} hidden",
|
|
2
|
+
"button.reset": "Restore defaults",
|
|
17
3
|
"chain.hit": "In effect",
|
|
18
4
|
"chain.shadowed": "Shadowed",
|
|
19
5
|
"chain.unset": "Unset",
|
|
20
6
|
"chain.valueUnset": "(unset)",
|
|
21
|
-
"priority.title": "Config Priority",
|
|
22
|
-
"priority.unavailable": "Diagnostics unavailable. Please confirm the host version ships the priority diagnostics endpoint.",
|
|
23
|
-
"priority.intro": "The runtime level takes the first valid value in the following order; items shadowed by a higher-priority source cannot be changed from the UI. Current: ",
|
|
24
|
-
"state.loading": "Loading…",
|
|
25
|
-
"state.saved": "Config is stored in ponytail/config.json under the DSH data directory",
|
|
26
|
-
"error.operation": "Operation failed: ",
|
|
27
7
|
"confirm.reset": "Restore default config? Level returns to Standard (full) and all 6 skills are re-enabled.",
|
|
28
|
-
"
|
|
29
|
-
"
|
|
30
|
-
"toast.resetDone": "Defaults restored",
|
|
8
|
+
"error.operation": "Operation failed: ",
|
|
9
|
+
"error.rejected": "This deployment did not accept the change; your value was kept for you to review.",
|
|
31
10
|
"level.env": "Environment variable",
|
|
32
|
-
"level.patch": "Profile patch",
|
|
33
|
-
"level.config": "User config file",
|
|
34
11
|
"level.fallback": "Built-in fallback",
|
|
12
|
+
"level.patch": "Profile patch",
|
|
13
|
+
"meta": {
|
|
14
|
+
"title": "Lazy Senior Dev Mode",
|
|
15
|
+
"description": "Persistent lazy senior developer mode with a seven-rung ladder (YAGNI down to the smallest implementation), six native skills, and zero tool registration."
|
|
16
|
+
},
|
|
17
|
+
"meta.description": "A full DSH port of DietrichGebert/ponytail: the always-on lazy senior developer mode and its seven-rung ladder (YAGNI down to the minimum implementation), with six native Chinese skills (core, review, audit, debt, gain, help) and zero tool registrations.",
|
|
18
|
+
"meta.title": "Ponytail (lazy senior mode)",
|
|
19
|
+
"mode.full": "Standard",
|
|
20
|
+
"mode.hint": "Controls how strongly the ladder prompt is injected. Changes apply immediately and are written to the config file for all sessions.",
|
|
21
|
+
"mode.lite": "Lite",
|
|
22
|
+
"mode.lockedHint": "A higher-priority configuration is in effect; changes here will not affect the actual runtime level.",
|
|
23
|
+
"mode.off": "Off",
|
|
24
|
+
"mode.title": "Intensity Level",
|
|
25
|
+
"mode.ultra": "Ultra",
|
|
26
|
+
"panel.title": "Lazy Senior Dev Mode settings",
|
|
27
|
+
"priority.intro": "The runtime level takes the first valid value in the following order; items shadowed by a higher-priority source cannot be changed from the UI. Current: ",
|
|
28
|
+
"priority.title": "Config Priority",
|
|
29
|
+
"priority.unavailable": "Diagnostics unavailable. Please confirm the host version ships the priority diagnostics endpoint.",
|
|
35
30
|
"problem.env": "Invalid value, ignored",
|
|
36
31
|
"problem.patch": "Invalid value, ignored",
|
|
37
|
-
"
|
|
32
|
+
"skills.enabledToast": "Skill {name} enabled",
|
|
33
|
+
"skills.hiddenToast": "Skill {name} hidden",
|
|
34
|
+
"skills.hint": "Disabled skills disappear from the slash menu and are not loaded by the model.",
|
|
35
|
+
"skills.title": "Native Skills",
|
|
36
|
+
"skills.toggleOn": "Enable {name}",
|
|
37
|
+
"state.loading": "Loading…",
|
|
38
|
+
"state.readOnly": "This deployment stores settings read-only.",
|
|
39
|
+
"state.saved": "Config is stored in the ponytail directory of the current profile",
|
|
40
|
+
"toast.modeChanged": "Level switched to {name}",
|
|
41
|
+
"toast.resetDone": "Defaults restored"
|
|
38
42
|
}
|
package/locale/zh.json
CHANGED
|
@@ -1,38 +1,42 @@
|
|
|
1
1
|
{
|
|
2
|
-
"
|
|
3
|
-
"meta.description": "DietrichGebert/ponytail 的 DSH 完整移植:常驻懒人 senior 模式与七阶梯子(YAGNI 到最小实现),6 个中文原生技能(本体、评审、审计、债务、收益、帮助),零 tool 注册。",
|
|
4
|
-
"panel.title": "懒人模式配置",
|
|
5
|
-
"mode.title": "运行强度等级",
|
|
6
|
-
"mode.hint": "控制梯子提示词的注入强度,改动即时生效并写入配置文件,对所有会话生效。",
|
|
7
|
-
"mode.lockedHint": "当前有更高优先级的配置在生效,此处的修改不会改变实际运行等级。",
|
|
8
|
-
"mode.off": "关闭",
|
|
9
|
-
"mode.lite": "轻量",
|
|
10
|
-
"mode.full": "标准",
|
|
11
|
-
"mode.ultra": "激进",
|
|
12
|
-
"skills.title": "原生技能开关",
|
|
13
|
-
"skills.hint": "关闭后该技能不会出现在斜杠菜单,也不会被模型加载。",
|
|
14
|
-
"skills.toggleOn": "启用 {name}",
|
|
15
|
-
"skills.enabledToast": "技能 {name} 已启用",
|
|
16
|
-
"skills.hiddenToast": "技能 {name} 已隐藏",
|
|
2
|
+
"button.reset": "恢复默认配置",
|
|
17
3
|
"chain.hit": "生效中",
|
|
18
4
|
"chain.shadowed": "被覆盖",
|
|
19
5
|
"chain.unset": "未设置",
|
|
20
6
|
"chain.valueUnset": "(未设置)",
|
|
21
|
-
"priority.title": "配置优先级",
|
|
22
|
-
"priority.unavailable": "诊断信息不可用,请确认宿主版本已包含优先级诊断接口。",
|
|
23
|
-
"priority.intro": "运行等级按下列顺序取第一个有效值;被更高优先级压制的项,在界面上修改不会生效。当前生效:",
|
|
24
|
-
"state.loading": "读取中…",
|
|
25
|
-
"state.saved": "配置保存在 DSH 数据目录的 ponytail/config.json",
|
|
26
|
-
"error.operation": "操作失败:",
|
|
27
7
|
"confirm.reset": "确定恢复默认配置吗?等级回到标准(full),并重新启用全部 6 个技能。",
|
|
28
|
-
"
|
|
29
|
-
"
|
|
30
|
-
"toast.resetDone": "已恢复默认配置",
|
|
8
|
+
"error.operation": "操作失败:",
|
|
9
|
+
"error.rejected": "本部署没有接受这次修改,值已保留供你核对。",
|
|
31
10
|
"level.env": "环境变量",
|
|
32
|
-
"level.patch": "Profile 补丁",
|
|
33
|
-
"level.config": "用户配置文件",
|
|
34
11
|
"level.fallback": "内置兜底",
|
|
12
|
+
"level.patch": "Profile 补丁",
|
|
13
|
+
"meta": {
|
|
14
|
+
"title": "懒人模式",
|
|
15
|
+
"description": "常驻懒人资深开发者模式与七阶梯子(YAGNI 到最小实现),6 个中文原生技能(本体、评审、审计、债务、收益、帮助),零 Tool 注册。"
|
|
16
|
+
},
|
|
17
|
+
"meta.description": "DietrichGebert/ponytail 的 DSH 完整移植:常驻懒人 senior 模式与七阶梯子(YAGNI 到最小实现),6 个中文原生技能(本体、评审、审计、债务、收益、帮助),零 tool 注册。",
|
|
18
|
+
"meta.title": "懒人模式(ponytail)",
|
|
19
|
+
"mode.full": "标准",
|
|
20
|
+
"mode.hint": "控制梯子提示词的注入强度,改动即时生效并写入配置文件,对所有会话生效。",
|
|
21
|
+
"mode.lite": "轻量",
|
|
22
|
+
"mode.lockedHint": "当前有更高优先级的配置在生效,此处的修改不会改变实际运行等级。",
|
|
23
|
+
"mode.off": "关闭",
|
|
24
|
+
"mode.title": "运行强度等级",
|
|
25
|
+
"mode.ultra": "激进",
|
|
26
|
+
"panel.title": "懒人模式配置",
|
|
27
|
+
"priority.intro": "运行等级按下列顺序取第一个有效值;被更高优先级压制的项,在界面上修改不会生效。当前生效:",
|
|
28
|
+
"priority.title": "配置优先级",
|
|
29
|
+
"priority.unavailable": "诊断信息不可用,请确认宿主版本已包含优先级诊断接口。",
|
|
35
30
|
"problem.env": "值无效,已忽略",
|
|
36
31
|
"problem.patch": "值无效,已忽略",
|
|
37
|
-
"
|
|
32
|
+
"skills.enabledToast": "技能 {name} 已启用",
|
|
33
|
+
"skills.hiddenToast": "技能 {name} 已隐藏",
|
|
34
|
+
"skills.hint": "关闭后该技能不会出现在斜杠菜单,也不会被模型加载。",
|
|
35
|
+
"skills.title": "原生技能开关",
|
|
36
|
+
"skills.toggleOn": "启用 {name}",
|
|
37
|
+
"state.loading": "读取中…",
|
|
38
|
+
"state.readOnly": "本部署的设置为只读。",
|
|
39
|
+
"state.saved": "配置保存在当前 profile 的 ponytail 目录",
|
|
40
|
+
"toast.modeChanged": "运行等级已切为「{name}」",
|
|
41
|
+
"toast.resetDone": "已恢复默认配置"
|
|
38
42
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@wenaixi/dsh-ponytail",
|
|
3
|
-
"version": "5.
|
|
3
|
+
"version": "5.1.0",
|
|
4
4
|
"description": "DietrichGebert/ponytail 的 DSH 完整移植:常驻懒人 senior 模式与七阶梯子(YAGNI 到最小实现),6 个中文原生技能(本体、评审、审计、债务、收益、帮助),零 tool 注册",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "lib/ponytail.js",
|
|
@@ -47,12 +47,14 @@
|
|
|
47
47
|
"peerDependencies": {
|
|
48
48
|
"@deepseek-ai/cordis": "^4.0.4",
|
|
49
49
|
"@deepseek-ai/dsh-skill": ">=0.1.0-rc.1 <0.2.0-0 || >=0.2.0-rc.1 <0.3.0-0",
|
|
50
|
+
"@deepseek-ai/dsh-typert-protocol": "0.2.0-rc.2",
|
|
50
51
|
"@deepseek-ai/schemastery": "^3.18.4",
|
|
51
52
|
"react": "^18.2.0"
|
|
52
53
|
},
|
|
53
54
|
"devDependencies": {
|
|
54
55
|
"@deepseek-ai/cordis": "^4.0.4",
|
|
55
56
|
"@deepseek-ai/dsh-skill": "0.2.0-rc.2",
|
|
57
|
+
"@deepseek-ai/dsh-typert-protocol": "0.2.0-rc.2",
|
|
56
58
|
"@deepseek-ai/schemastery": "^3.18.4",
|
|
57
59
|
"@types/node": "^22.0.0",
|
|
58
60
|
"typescript": "^5.6.0"
|
package/lib/ponytail-http.d.ts
DELETED
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* ponytail-http — HTTP 配置端点深模块(纯 Node 工厂,零 ctx)
|
|
3
|
-
*
|
|
4
|
-
* 从 apply() 剥离出的 /api/plugins/ponytail/config 处理器:
|
|
5
|
-
* GET/POST 全部业务分支、请求体解析、响应组装、405 兜底内聚于此,
|
|
6
|
-
* apply() 只保留 webServer.register 一行接线。
|
|
7
|
-
* 依赖全部经 deps 注入(state / 解析函数 / 失效回调 / patch/env 原值),
|
|
8
|
-
* 因此不经 Cordis ctx 即可用 node:test + 假 req/res 单测。
|
|
9
|
-
*/
|
|
10
|
-
import type { PonytailState } from './ponytail-state.js';
|
|
11
|
-
export interface ConfigHttpDeps {
|
|
12
|
-
/** 等级与技能开关状态机 */
|
|
13
|
-
state: PonytailState;
|
|
14
|
-
/** 读取 config.json 的 defaultMode 原始值(undefined=缺失/损坏) */
|
|
15
|
-
readRawConfigMode: () => string | undefined;
|
|
16
|
-
/** 变更后让宿主技能目录失效(UI 改禁用后模型侧即时收敛) */
|
|
17
|
-
invalidateSkills: () => void;
|
|
18
|
-
/** 每次快照读取 cordis.patch.yml 与运行时用户意图的当前值 */
|
|
19
|
-
readPatchMode: () => string | undefined;
|
|
20
|
-
/** 日志(沿用 ctx.logger 形状) */
|
|
21
|
-
logger: {
|
|
22
|
-
info: (msg: string) => void;
|
|
23
|
-
};
|
|
24
|
-
/** 每次快照读取 PONYTAIL_DEFAULT_MODE 当前值 */
|
|
25
|
-
readEnvRaw: () => string | undefined;
|
|
26
|
-
/** 技能目录(读取 SKILL.md frontmatter 作为元数据真源) */
|
|
27
|
-
skillDir: string;
|
|
28
|
-
}
|
|
29
|
-
export interface SkillMeta {
|
|
30
|
-
id: string;
|
|
31
|
-
name: string;
|
|
32
|
-
description: string;
|
|
33
|
-
}
|
|
34
|
-
/**
|
|
35
|
-
* 从 skills/ 目录读取全部技能元数据(SKILL.md frontmatter 为唯一真源)。
|
|
36
|
-
* 不按禁用状态过滤——面板需要展示全部 6 项(enabled 由 state.isSkillEnabled 标记)。
|
|
37
|
-
* 目录/文件不可读时回退 FALLBACK_SKILL_META(不抛错)。
|
|
38
|
-
*/
|
|
39
|
-
export declare function readSkillMeta(skillDirPath: string): SkillMeta[];
|
|
40
|
-
/**
|
|
41
|
-
* 创建 /api/plugins/ponytail/config 处理器。
|
|
42
|
-
* @returns 纯 Node http handler(req/res),可被 webServer.register 直接消费
|
|
43
|
-
*/
|
|
44
|
-
export declare function createConfigHttpEndpoint(deps: ConfigHttpDeps): (req: import('node:http').IncomingMessage, res: import('node:http').ServerResponse) => Promise<void>;
|
|
45
|
-
//# sourceMappingURL=ponytail-http.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ponytail-http.d.ts","sourceRoot":"","sources":["../src/ponytail-http.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAKH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AAKxD,MAAM,WAAW,cAAc;IAC7B,iBAAiB;IACjB,KAAK,EAAE,aAAa,CAAA;IACpB,wDAAwD;IACxD,iBAAiB,EAAE,MAAM,MAAM,GAAG,SAAS,CAAA;IAC3C,mCAAmC;IACnC,gBAAgB,EAAE,MAAM,IAAI,CAAA;IAC5B,2CAA2C;IAC3C,aAAa,EAAE,MAAM,MAAM,GAAG,SAAS,CAAA;IACvC,2BAA2B;IAC3B,MAAM,EAAE;QAAE,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAA;KAAE,CAAA;IACvC,uCAAuC;IACvC,UAAU,EAAE,MAAM,MAAM,GAAG,SAAS,CAAA;IACpC,4CAA4C;IAC5C,QAAQ,EAAE,MAAM,CAAA;CACjB;AAyCD,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;;;GAGG;AACH,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,cAAc,GAC3D,CAAC,GAAG,EAAE,OAAO,WAAW,EAAE,eAAe,EAAE,GAAG,EAAE,OAAO,WAAW,EAAE,cAAc,KAAK,OAAO,CAAC,IAAI,CAAC,CAwErG"}
|