@wenaixi/dsh-ponytail 5.3.1 → 5.4.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 +39 -1
- package/README.md +75 -108
- package/README.zh-CN.md +124 -0
- package/lib/client.js +9 -5
- package/lib/ponytail-commands.d.ts +29 -3
- package/lib/ponytail-commands.d.ts.map +1 -1
- package/lib/ponytail-commands.js +123 -19
- package/lib/ponytail-commands.js.map +1 -1
- package/lib/ponytail-instructions.d.ts +7 -1
- package/lib/ponytail-instructions.d.ts.map +1 -1
- package/lib/ponytail-instructions.js +45 -1
- package/lib/ponytail-instructions.js.map +1 -1
- package/lib/ponytail-remote.d.ts.map +1 -1
- package/lib/ponytail-remote.js.map +1 -1
- package/lib/ponytail-state.d.ts +24 -0
- package/lib/ponytail-state.d.ts.map +1 -1
- package/lib/ponytail-state.js +150 -6
- package/lib/ponytail-state.js.map +1 -1
- package/lib/ponytail.d.ts.map +1 -1
- package/lib/ponytail.js +27 -45
- package/lib/ponytail.js.map +1 -1
- package/locale/en.json +4 -3
- package/locale/zh.json +4 -3
- package/package.json +12 -5
- package/AGENTS.md +0 -32
package/lib/ponytail-commands.js
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
|
+
import { randomUUID } from 'node:crypto';
|
|
1
2
|
import { getDefaultMode, writeDefaultMode, } from './ponytail-config.js';
|
|
3
|
+
import { renderModeUpdate } from './ponytail-instructions.js';
|
|
2
4
|
/**
|
|
3
5
|
* 仅当整句为该命令时失活,避免 "add a normal mode toggle" 误触发
|
|
4
6
|
* 中英文全句匹配:英文 stop ponytail / normal mode,中文 退出 ponytail / 正常模式
|
|
@@ -86,18 +88,30 @@ export function parsePonytailCommand(rawText, currentMode, getDefault) {
|
|
|
86
88
|
/**
|
|
87
89
|
* 创建高内聚的命令调度器深模块
|
|
88
90
|
* 将文本提取、指令语法解析、状态机流转与副作用执行完整封装
|
|
91
|
+
* 支持可选的 sessionId 会话作用域,实现多会话模式隔离与零缓存破坏调度
|
|
89
92
|
*/
|
|
90
93
|
export function createCommandDispatcher(env) {
|
|
91
94
|
const getDef = env.getDefaultMode ?? getDefaultMode;
|
|
92
95
|
const writeDef = env.writeDefaultMode ?? writeDefaultMode;
|
|
93
|
-
function dispatchText(rawText) {
|
|
96
|
+
function dispatchText(rawText, sessionId) {
|
|
94
97
|
const text = String(rawText ?? '').trim();
|
|
95
|
-
const
|
|
98
|
+
const currentMode = (sessionId && typeof env.state.getSession === 'function')
|
|
99
|
+
? env.state.getSession(sessionId).effectiveMode
|
|
100
|
+
: env.state.get();
|
|
101
|
+
const result = parsePonytailCommand(text, currentMode, getDef);
|
|
96
102
|
if (!result.handled)
|
|
97
103
|
return { handled: false, switched: false };
|
|
98
|
-
|
|
99
|
-
env.state.
|
|
100
|
-
|
|
104
|
+
const applySessionMode = (m) => {
|
|
105
|
+
if (typeof env.state.setSessionMode === 'function') {
|
|
106
|
+
env.state.setSessionMode(sessionId, m);
|
|
107
|
+
}
|
|
108
|
+
else {
|
|
109
|
+
env.state.set(m);
|
|
110
|
+
}
|
|
111
|
+
};
|
|
112
|
+
if (result.deactivate || result.mode === 'off') {
|
|
113
|
+
applySessionMode(null);
|
|
114
|
+
env.logger.info(result.deactivate ? `[ponytail] 已通过指令退出:${text}` : '[ponytail] 已关闭');
|
|
101
115
|
return { handled: true, switched: true };
|
|
102
116
|
}
|
|
103
117
|
if (result.persistDefault) {
|
|
@@ -105,10 +119,16 @@ export function createCommandDispatcher(env) {
|
|
|
105
119
|
if (targetMode === 'off' || targetMode === 'lite' || targetMode === 'full' || targetMode === 'ultra') {
|
|
106
120
|
const written = writeDef(targetMode);
|
|
107
121
|
env.logger.info(`[ponytail] 默认等级已持久化:${written}`);
|
|
108
|
-
// 用户最新意图即时生效:同步外部判定源(apply 的 patchMode
|
|
109
|
-
// 否则 patch 层继续压住 config.json,写盘「成功」却「无效」(静默失效)
|
|
122
|
+
// 用户最新意图即时生效:同步外部判定源(apply 的 patchMode)
|
|
110
123
|
env.updateDefaultMode?.(targetMode);
|
|
111
|
-
|
|
124
|
+
// 关键:全局修改配置时,同步更新所有已有会话的 effectiveMode,
|
|
125
|
+
// 但严禁修改已有会话的 baselineMode,确保已有会话在下轮自动通过尾部追加通知生效!
|
|
126
|
+
if (typeof env.state.syncGlobalModeToSessions === 'function') {
|
|
127
|
+
env.state.syncGlobalModeToSessions(targetMode);
|
|
128
|
+
}
|
|
129
|
+
else {
|
|
130
|
+
env.state.set(targetMode);
|
|
131
|
+
}
|
|
112
132
|
}
|
|
113
133
|
return { handled: true, switched: true };
|
|
114
134
|
}
|
|
@@ -117,28 +137,112 @@ export function createCommandDispatcher(env) {
|
|
|
117
137
|
env.logger.info(`[ponytail] 当前等级:${result.mode}`);
|
|
118
138
|
return { handled: true, switched: false };
|
|
119
139
|
}
|
|
120
|
-
if (result.mode
|
|
121
|
-
|
|
140
|
+
if (result.mode) {
|
|
141
|
+
applySessionMode(result.mode);
|
|
122
142
|
env.logger.info(`[ponytail] 已切换 — 等级:${result.mode}`);
|
|
123
143
|
return { handled: true, switched: true };
|
|
124
144
|
}
|
|
125
|
-
if (result.mode === 'off') {
|
|
126
|
-
env.state.set(null);
|
|
127
|
-
env.logger.info('[ponytail] 已关闭');
|
|
128
|
-
return { handled: true, switched: true };
|
|
129
|
-
}
|
|
130
145
|
return { handled: true, switched: false };
|
|
131
146
|
}
|
|
132
147
|
return {
|
|
133
148
|
dispatchText,
|
|
134
|
-
dispatchContent(content) {
|
|
149
|
+
dispatchContent(content, sessionId) {
|
|
135
150
|
const text = extractTextFromContent(content);
|
|
136
|
-
return text ? dispatchText(text) : { handled: false, switched: false };
|
|
151
|
+
return text ? dispatchText(text, sessionId) : { handled: false, switched: false };
|
|
137
152
|
},
|
|
138
|
-
dispatchMessages(messages) {
|
|
153
|
+
dispatchMessages(messages, sessionId) {
|
|
139
154
|
const text = extractText(messages);
|
|
140
|
-
return text ? dispatchText(text) : { handled: false, switched: false };
|
|
155
|
+
return text ? dispatchText(text, sessionId) : { handled: false, switched: false };
|
|
141
156
|
},
|
|
142
157
|
};
|
|
143
158
|
}
|
|
159
|
+
/** 统一从多层级宿主上下文对象中安全提取会话 ID */
|
|
160
|
+
export function resolveSessionId(target) {
|
|
161
|
+
const t = target;
|
|
162
|
+
return t?.agent?.session?.id ?? t?.scope?.session?.id ?? t?.session?.id;
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* 轮次生命周期协作者深模块 (TurnCoordinator)
|
|
166
|
+
*
|
|
167
|
+
* 核心架构杠杆:
|
|
168
|
+
* 将用户指令解析、会话状态机流转、宿主 waterfall 穿透、变动对比、
|
|
169
|
+
* <system-reminder> 瞬态提醒构造、单轮原地替换与已发射标记回写完整内聚于此。
|
|
170
|
+
*
|
|
171
|
+
* 严守 6 大不变量:
|
|
172
|
+
* 1. Waterfall 不断链(异常捕获并穿透);
|
|
173
|
+
* 2. KV Cache 保护(顶层基线不可变,所有动态变动收敛在当前轮次尾部);
|
|
174
|
+
* 3. 单通知幂等(同轮重试时原地替换,绝不重复 push);
|
|
175
|
+
* 4. 发射标记收敛时机(仅在 downstream.kind === 'enter' 后标记已发射);
|
|
176
|
+
* 5. 多会话隔离(基于 sessionId 独立闭环);
|
|
177
|
+
* 6. 纯命令只读安全(裸 /ponytail 无副作用)。
|
|
178
|
+
*/
|
|
179
|
+
export function createTurnCoordinator(env) {
|
|
180
|
+
const dispatcher = createCommandDispatcher(env);
|
|
181
|
+
async function handlePreStep(payload, next) {
|
|
182
|
+
const raw = payload;
|
|
183
|
+
const sessionId = resolveSessionId(payload);
|
|
184
|
+
// 1. 尝试解析并分发指令
|
|
185
|
+
try {
|
|
186
|
+
if (raw?.messages) {
|
|
187
|
+
dispatcher.dispatchMessages(raw.messages, sessionId);
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
catch (err) {
|
|
191
|
+
env.logger.warn?.(`[ponytail] agent/pre-step 处理失败(仍会调用 next(),不拦截请求):${String(err)}`);
|
|
192
|
+
}
|
|
193
|
+
// 2. 必须且只能穿透下游 waterfall(断链守卫)
|
|
194
|
+
const downstream = (await next());
|
|
195
|
+
if (!downstream || typeof downstream !== 'object' || downstream.kind !== 'enter') {
|
|
196
|
+
return downstream;
|
|
197
|
+
}
|
|
198
|
+
const decision = downstream;
|
|
199
|
+
const sessionState = env.state.getSession(sessionId);
|
|
200
|
+
// 3. 变动检测(Change Detection 保护 KV 缓存幂等性)
|
|
201
|
+
if (sessionState.effectiveMode !== sessionState.lastEmittedMode) {
|
|
202
|
+
const noticeText = renderModeUpdate(sessionState.effectiveMode, sessionState.lastEmittedMode, env.skillDir);
|
|
203
|
+
const updateMsg = {
|
|
204
|
+
id: randomUUID(),
|
|
205
|
+
role: 'user',
|
|
206
|
+
content: [{ type: 'text', text: noticeText }],
|
|
207
|
+
source: {
|
|
208
|
+
kind: 'ponytail-mode-update',
|
|
209
|
+
mode: sessionState.effectiveMode,
|
|
210
|
+
previousMode: sessionState.lastEmittedMode,
|
|
211
|
+
},
|
|
212
|
+
};
|
|
213
|
+
// 4. 标记已发射(严守收敛时机不变量)
|
|
214
|
+
env.state.markSessionEmitted(sessionId, sessionState.effectiveMode);
|
|
215
|
+
// 5. 原地替换或追加(严守单通知幂等不变量,对齐 dsh-tool-skill)
|
|
216
|
+
const msgs = Array.isArray(decision.messages) ? [...decision.messages] : [];
|
|
217
|
+
const existingIdx = msgs.findIndex((m) => Boolean(m && typeof m === 'object' && m.source?.kind === 'ponytail-mode-update'));
|
|
218
|
+
if (existingIdx !== -1) {
|
|
219
|
+
msgs[existingIdx] = updateMsg;
|
|
220
|
+
}
|
|
221
|
+
else {
|
|
222
|
+
msgs.push(updateMsg);
|
|
223
|
+
}
|
|
224
|
+
return {
|
|
225
|
+
...decision,
|
|
226
|
+
messages: msgs,
|
|
227
|
+
};
|
|
228
|
+
}
|
|
229
|
+
return decision;
|
|
230
|
+
}
|
|
231
|
+
function handleSessionEvent(session, event) {
|
|
232
|
+
try {
|
|
233
|
+
const ev = event;
|
|
234
|
+
if (ev?.type !== 'user/message')
|
|
235
|
+
return;
|
|
236
|
+
const sessionId = session?.id;
|
|
237
|
+
dispatcher.dispatchContent(ev.data?.content, sessionId);
|
|
238
|
+
}
|
|
239
|
+
catch (err) {
|
|
240
|
+
env.logger.warn?.(`[ponytail] session/event 处理失败:${String(err)}`);
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
return {
|
|
244
|
+
handlePreStep,
|
|
245
|
+
handleSessionEvent,
|
|
246
|
+
};
|
|
247
|
+
}
|
|
144
248
|
//# sourceMappingURL=ponytail-commands.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ponytail-commands.js","sourceRoot":"","sources":["../src/ponytail-commands.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ponytail-commands.js","sourceRoot":"","sources":["../src/ponytail-commands.ts"],"names":[],"mappings":"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"}
|
|
@@ -14,5 +14,11 @@ export declare function render(skillDir: string, mode: string): string;
|
|
|
14
14
|
* 封装从状态外部纠偏(syncFromFile)、激活与关闭态守卫(off/null 返回空串)、
|
|
15
15
|
* 到按需直读模板(ADR-0003)与保底降级渲染的完整链路。
|
|
16
16
|
*/
|
|
17
|
-
export declare function renderPromptSection(skillDir: string, state: PonytailState): string;
|
|
17
|
+
export declare function renderPromptSection(skillDir: string, state: PonytailState, context?: unknown): string;
|
|
18
|
+
/**
|
|
19
|
+
* 对齐官方 @deepseek-ai/dsh-tool-skill 的 renderCatalogUpdate 范式:
|
|
20
|
+
* 当会话内命令切档或全局配置变更导致旧会话跟随更新时,绝不修改顶层 SystemPrompt 前缀(100% 保护历史缓存),
|
|
21
|
+
* 而是生成带有 <system-reminder> 的增量系统提醒,在当前轮次末尾追加,大模型当轮以最高注意力即时生效。
|
|
22
|
+
*/
|
|
23
|
+
export declare function renderModeUpdate(newMode: string | null, previousMode?: string | null, skillDir?: string): string;
|
|
18
24
|
//# sourceMappingURL=ponytail-instructions.d.ts.map
|
|
@@ -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;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,
|
|
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,CACjC,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,aAAa,EACpB,OAAO,CAAC,EAAE,OAAO,GAChB,MAAM,CA4BR;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,MAAM,GAAG,IAAI,EACtB,YAAY,GAAE,MAAM,GAAG,IAAW,EAClC,QAAQ,CAAC,EAAE,MAAM,GAChB,MAAM,CAuBR"}
|
|
@@ -86,11 +86,55 @@ export function render(skillDir, mode) {
|
|
|
86
86
|
* 封装从状态外部纠偏(syncFromFile)、激活与关闭态守卫(off/null 返回空串)、
|
|
87
87
|
* 到按需直读模板(ADR-0003)与保底降级渲染的完整链路。
|
|
88
88
|
*/
|
|
89
|
-
export function renderPromptSection(skillDir, state) {
|
|
89
|
+
export function renderPromptSection(skillDir, state, context) {
|
|
90
|
+
try {
|
|
91
|
+
state.reloadDisabledSkills?.();
|
|
92
|
+
}
|
|
93
|
+
catch {
|
|
94
|
+
// ignore
|
|
95
|
+
}
|
|
90
96
|
state.syncFromFile();
|
|
97
|
+
// 提取会话目标(支持 agent.session.id、scope.session.id 与直接 session.id 双通道)
|
|
98
|
+
const raw = context;
|
|
99
|
+
const sessionId = raw?.agent?.session?.id ?? raw?.scope?.session?.id ?? raw?.session?.id;
|
|
100
|
+
if (sessionId && typeof state.getSession === 'function') {
|
|
101
|
+
// 具名会话:锁定初始基线 baselineMode,绝不随切档变动,100% 保护会话前缀缓存(ADR-0012)
|
|
102
|
+
const sessionState = state.getSession(sessionId);
|
|
103
|
+
const baseMode = sessionState.baselineMode;
|
|
104
|
+
if (!baseMode || baseMode === 'off')
|
|
105
|
+
return '';
|
|
106
|
+
return render(skillDir, baseMode);
|
|
107
|
+
}
|
|
108
|
+
// 无会话目标时(单会话全局模式 / 单元测试裸调 / 外部直接读取):走全局单例出口
|
|
91
109
|
const mode = state.get();
|
|
92
110
|
if (!mode || mode === 'off')
|
|
93
111
|
return '';
|
|
94
112
|
return render(skillDir, mode);
|
|
95
113
|
}
|
|
114
|
+
/**
|
|
115
|
+
* 对齐官方 @deepseek-ai/dsh-tool-skill 的 renderCatalogUpdate 范式:
|
|
116
|
+
* 当会话内命令切档或全局配置变更导致旧会话跟随更新时,绝不修改顶层 SystemPrompt 前缀(100% 保护历史缓存),
|
|
117
|
+
* 而是生成带有 <system-reminder> 的增量系统提醒,在当前轮次末尾追加,大模型当轮以最高注意力即时生效。
|
|
118
|
+
*/
|
|
119
|
+
export function renderModeUpdate(newMode, previousMode = null, skillDir) {
|
|
120
|
+
const prev = previousMode ? ` (superseding previous level: ${previousMode})` : '';
|
|
121
|
+
if (!newMode || newMode === 'off') {
|
|
122
|
+
return [
|
|
123
|
+
'<system-reminder>',
|
|
124
|
+
`Ponytail mode has been switched OFF${prev}.`,
|
|
125
|
+
'Normal development mode applies for this session until explicitly reactivated. Follow standard engineering practices without ponytail ladder constraints.',
|
|
126
|
+
'</system-reminder>',
|
|
127
|
+
].join('\n');
|
|
128
|
+
}
|
|
129
|
+
const upper = newMode.toUpperCase();
|
|
130
|
+
const body = skillDir ? render(skillDir, newMode) : getFallbackInstructions(newMode);
|
|
131
|
+
return [
|
|
132
|
+
'<system-reminder>',
|
|
133
|
+
`Ponytail mode updated to ${upper}${prev}.`,
|
|
134
|
+
'This complete instruction set applies to all subsequent responses in this session:',
|
|
135
|
+
'',
|
|
136
|
+
body,
|
|
137
|
+
'</system-reminder>',
|
|
138
|
+
].join('\n');
|
|
139
|
+
}
|
|
96
140
|
//# sourceMappingURL=ponytail-instructions.js.map
|
|
@@ -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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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ponytail-remote.d.ts","sourceRoot":"","sources":["../src/ponytail-remote.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;
|
|
1
|
+
{"version":3,"file":"ponytail-remote.d.ts","sourceRoot":"","sources":["../src/ponytail-remote.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAGH,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;AAE5D,mDAAmD;AACnD,MAAM,MAAM,SAAS,GAAG,IAAI,GAAG,IAAI,CAAA;AAiCnC,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,EAAE,MAAM,CAAA;CACpB;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,IAAI,CAAC,EAAE,SAAS,GAAG,SAAS,EAAE,CAQ3D;AAED,2DAA2D;AAC3D,wBAAgB,qBAAqB,CAAC,IAAI,CAAC,EAAE,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAgBrF;AAED,yEAAyE;AACzE,MAAM,WAAW,sBAAsB;IACrC,yCAAyC;IACzC,WAAW,EAAE,MAAM,CAAA;IACnB,eAAe;IACf,QAAQ,EAAE,cAAc,CAAA;IACxB,4CAA4C;IAC5C,SAAS,EAAE,SAAS,CAAA;IACpB,iCAAiC;IACjC,MAAM,EAAE,SAAS,EAAE,CAAA;CACpB;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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ponytail-remote.js","sourceRoot":"","sources":["../src/ponytail-remote.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEH,OAAO,EAAE,YAAY,
|
|
1
|
+
{"version":3,"file":"ponytail-remote.js","sourceRoot":"","sources":["../src/ponytail-remote.ts"],"names":[],"mappings":"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"}
|
package/lib/ponytail-state.d.ts
CHANGED
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
* - 内存态(currentMode)与 flag 文件的同步
|
|
6
6
|
* - 「文件优先」与「内存赢」两种纠偏方向(由调用方选方法表达,不写死一处)
|
|
7
7
|
* - off / review / 非法值的归一
|
|
8
|
+
* - 扩展支持多会话隔离:每个会话锁定基线模式(baselineMode),当切换模式时通过追加通知生效,保护前缀缓存
|
|
8
9
|
*
|
|
9
10
|
* 与 config 的关系:flag(.ponytail-active)物理存取内联于此(原 ponytail-runtime.ts 已并入,
|
|
10
11
|
* C6 收敛:46 行薄壳 + 一层间接委托不如直接内联);也可由 options.storage 注入内存适配器隔离测试。
|
|
@@ -21,6 +22,10 @@ export interface PonytailStorage {
|
|
|
21
22
|
read(): string | null;
|
|
22
23
|
write(mode: string): void;
|
|
23
24
|
clear(): void;
|
|
25
|
+
/** 可选:读取会话状态持久化映射(解耦物理磁盘,支持测试纯内存隔离) */
|
|
26
|
+
readSessions?(): Record<string, SessionModeState>;
|
|
27
|
+
/** 可选:写入会话状态持久化映射(解耦物理磁盘,支持测试纯内存隔离) */
|
|
28
|
+
writeSessions?(sessions: Record<string, SessionModeState>): void;
|
|
24
29
|
}
|
|
25
30
|
export interface PonytailStateOptions {
|
|
26
31
|
/** 可选注入的存储适配器;缺省时使用内联的 DSH 配置目录磁盘实现(flag 存取已并入本模块) */
|
|
@@ -30,6 +35,15 @@ export interface PonytailStateOptions {
|
|
|
30
35
|
* 有 settings 服务的组合由 apply 注入 settings 实现(写入落 profile 补丁)。
|
|
31
36
|
*/
|
|
32
37
|
sink?: PonytailConfigSink;
|
|
38
|
+
/** profile 目录路径(由宿主 profileContext.dir 传入,用于会话状态持久化) */
|
|
39
|
+
profileDir?: string;
|
|
40
|
+
}
|
|
41
|
+
export interface SessionModeState {
|
|
42
|
+
sessionId: string;
|
|
43
|
+
baselineMode: string;
|
|
44
|
+
effectiveMode: string | null;
|
|
45
|
+
lastEmittedMode: string | null;
|
|
46
|
+
explicitlySet?: boolean;
|
|
33
47
|
}
|
|
34
48
|
export interface PonytailState {
|
|
35
49
|
/** 当前等级的内存视图;不触发任何文件读。null 表示关闭('off' 由 set 归一为 null) */
|
|
@@ -54,8 +68,18 @@ export interface PonytailState {
|
|
|
54
68
|
resetToDefaults(): void;
|
|
55
69
|
/** 文件优先:重读 profile 内 config.json 的 disabledSkills 重建内存 Set(外部手改文件后的收敛入口) */
|
|
56
70
|
reloadDisabledSkills(): void;
|
|
71
|
+
/** 获取指定会话的模式状态(不存在则原子捕获当前基线新建) */
|
|
72
|
+
getSession(sessionId?: string): SessionModeState;
|
|
73
|
+
/** 设置指定会话的当前生效模式 */
|
|
74
|
+
setSessionMode(sessionId: string | undefined, mode: string | null): void;
|
|
75
|
+
/** 标记指定会话已向模型发射了该模式的指令(避免重复追加通知) */
|
|
76
|
+
markSessionEmitted(sessionId: string | undefined, mode: string | null): void;
|
|
77
|
+
/** 全局配置变更时同步到已有会话的生效模式(但严禁修改 baselineMode,确保 Prompt Cache 恒定) */
|
|
78
|
+
syncGlobalModeToSessions(newDefaultMode: string): void;
|
|
57
79
|
}
|
|
58
80
|
export declare function createDiskStorage(profileDir?: string): PonytailStorage;
|
|
81
|
+
/** 纯内存存储适配器(用于单测与沙箱隔离,物理零磁盘触碰) */
|
|
82
|
+
export declare function createMemoryStorage(initialMode?: string | null): PonytailStorage;
|
|
59
83
|
export declare function createPonytailState(options?: PonytailStateOptions): PonytailState;
|
|
60
84
|
/**
|
|
61
85
|
* 纯函数守卫:「禁用主技能 ponytail → 关闭运行等级」业务规则的唯一实现。
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ponytail-state.d.ts","sourceRoot":"","sources":["../src/ponytail-state.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"ponytail-state.d.ts","sourceRoot":"","sources":["../src/ponytail-state.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAKH,OAAO,EAAkB,KAAK,kBAAkB,EAAE,MAAM,wBAAwB,CAAA;AAEhF;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,IAAI,IAAI,MAAM,GAAG,IAAI,CAAA;IACrB,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;IACzB,KAAK,IAAI,IAAI,CAAA;IACb,uCAAuC;IACvC,YAAY,CAAC,IAAI,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAA;IACjD,uCAAuC;IACvC,aAAa,CAAC,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,GAAG,IAAI,CAAA;CACjE;AAED,MAAM,WAAW,oBAAoB;IACnC,sDAAsD;IACtD,OAAO,CAAC,EAAE,eAAe,CAAA;IACzB;;;OAGG;IACH,IAAI,CAAC,EAAE,kBAAkB,CAAA;IACzB,wDAAwD;IACxD,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB;AAED,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,MAAM,CAAA;IACjB,YAAY,EAAE,MAAM,CAAA;IACpB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAA;IAC5B,eAAe,EAAE,MAAM,GAAG,IAAI,CAAA;IAC9B,aAAa,CAAC,EAAE,OAAO,CAAA;CACxB;AAED,MAAM,WAAW,aAAa;IAC5B,yDAAyD;IACzD,GAAG,IAAI,MAAM,GAAG,IAAI,CAAA;IACpB,wDAAwD;IACxD,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAAA;IAC9B,yDAAyD;IACzD,YAAY,IAAI,IAAI,CAAA;IACpB,uDAAuD;IACvD,UAAU,IAAI,IAAI,CAAA;IAClB,kBAAkB;IAClB,iBAAiB,IAAI,MAAM,EAAE,CAAA;IAC7B,wBAAwB;IACxB,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,CAAA;IACzC,uBAAuB;IACvB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAA;IACrC,8BAA8B;IAC9B,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,OAAO,CAAA;IACrD,qBAAqB;IACrB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;IAClC,iCAAiC;IACjC,eAAe,IAAI,IAAI,CAAA;IACvB,4EAA4E;IAC5E,oBAAoB,IAAI,IAAI,CAAA;IAC5B,kCAAkC;IAClC,UAAU,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,gBAAgB,CAAA;IAChD,oBAAoB;IACpB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAAA;IACxE,oCAAoC;IACpC,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAAA;IAC5E,iEAAiE;IACjE,wBAAwB,CAAC,cAAc,EAAE,MAAM,GAAG,IAAI,CAAA;CACvD;AAKD,wBAAgB,iBAAiB,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,eAAe,CAuCtE;AAED,kCAAkC;AAClC,wBAAgB,mBAAmB,CAAC,WAAW,GAAE,MAAM,GAAG,IAAW,GAAG,eAAe,CAatF;AAID,wBAAgB,mBAAmB,CAAC,OAAO,CAAC,EAAE,oBAAoB,GAAG,aAAa,CAuMjF;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAExE"}
|
package/lib/ponytail-state.js
CHANGED
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
* - 内存态(currentMode)与 flag 文件的同步
|
|
6
6
|
* - 「文件优先」与「内存赢」两种纠偏方向(由调用方选方法表达,不写死一处)
|
|
7
7
|
* - off / review / 非法值的归一
|
|
8
|
+
* - 扩展支持多会话隔离:每个会话锁定基线模式(baselineMode),当切换模式时通过追加通知生效,保护前缀缓存
|
|
8
9
|
*
|
|
9
10
|
* 与 config 的关系:flag(.ponytail-active)物理存取内联于此(原 ponytail-runtime.ts 已并入,
|
|
10
11
|
* C6 收敛:46 行薄壳 + 一层间接委托不如直接内联);也可由 options.storage 注入内存适配器隔离测试。
|
|
@@ -18,13 +19,10 @@ import { dirname, join } from 'node:path';
|
|
|
18
19
|
import { normalizeMode, getConfigDir } from './ponytail-config.js';
|
|
19
20
|
import { createFileSink } from './ponytail-settings.js';
|
|
20
21
|
// flag 物理存取(原 src/ponytail-runtime.ts,C6 内联):profile 内 .ponytail-active
|
|
21
|
-
//
|
|
22
|
-
// profileDir 与 config.json 同维度:不带它时 flag 落在 $DSH_HOME/ponytail 下,被所有实例共享,
|
|
23
|
-
// 多实例并存时 renderPromptSection 的 syncFromFile(文件优先)会把另一个实例写的档位当成本实例的
|
|
24
|
-
// 生效档。createDiskStorage(profileDir) 由 apply() 传入 profileContext.dir。
|
|
25
22
|
const STATE_FILE = '.ponytail-active';
|
|
26
23
|
export function createDiskStorage(profileDir) {
|
|
27
24
|
const statePath = () => join(getConfigDir(profileDir), STATE_FILE);
|
|
25
|
+
const sessionStatesPath = () => join(getConfigDir(profileDir), 'session-states.json');
|
|
28
26
|
return {
|
|
29
27
|
read: () => {
|
|
30
28
|
try {
|
|
@@ -46,13 +44,81 @@ export function createDiskStorage(profileDir) {
|
|
|
46
44
|
// ignore
|
|
47
45
|
}
|
|
48
46
|
},
|
|
47
|
+
readSessions: () => {
|
|
48
|
+
try {
|
|
49
|
+
const raw = readFileSync(sessionStatesPath(), 'utf8');
|
|
50
|
+
return JSON.parse(raw);
|
|
51
|
+
}
|
|
52
|
+
catch {
|
|
53
|
+
return {};
|
|
54
|
+
}
|
|
55
|
+
},
|
|
56
|
+
writeSessions: (sessions) => {
|
|
57
|
+
try {
|
|
58
|
+
mkdirSync(dirname(sessionStatesPath()), { recursive: true });
|
|
59
|
+
writeFileSync(sessionStatesPath(), JSON.stringify(sessions, null, 2), 'utf8');
|
|
60
|
+
}
|
|
61
|
+
catch {
|
|
62
|
+
// best-effort:文件写失败不阻断内存与会话
|
|
63
|
+
}
|
|
64
|
+
},
|
|
49
65
|
};
|
|
50
66
|
}
|
|
67
|
+
/** 纯内存存储适配器(用于单测与沙箱隔离,物理零磁盘触碰) */
|
|
68
|
+
export function createMemoryStorage(initialMode = null) {
|
|
69
|
+
let mode = initialMode;
|
|
70
|
+
const sessions = {};
|
|
71
|
+
return {
|
|
72
|
+
read: () => mode,
|
|
73
|
+
write: (m) => { mode = m; },
|
|
74
|
+
clear: () => { mode = null; },
|
|
75
|
+
readSessions: () => JSON.parse(JSON.stringify(sessions)),
|
|
76
|
+
writeSessions: (data) => {
|
|
77
|
+
for (const k of Object.keys(sessions))
|
|
78
|
+
delete sessions[k];
|
|
79
|
+
Object.assign(sessions, JSON.parse(JSON.stringify(data)));
|
|
80
|
+
},
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
const DEFAULT_SESSION_ID = '__default__';
|
|
51
84
|
export function createPonytailState(options) {
|
|
52
|
-
const storage = options?.storage ?? createDiskStorage();
|
|
85
|
+
const storage = options?.storage ?? createDiskStorage(options?.profileDir);
|
|
53
86
|
let current = null;
|
|
54
|
-
const sink = options?.sink ?? createFileSink();
|
|
87
|
+
const sink = options?.sink ?? createFileSink(options?.profileDir);
|
|
55
88
|
let disabledSkills = new Set(sink.readDisabled());
|
|
89
|
+
function loadPersistedSessions() {
|
|
90
|
+
try {
|
|
91
|
+
if (typeof storage.readSessions === 'function') {
|
|
92
|
+
return storage.readSessions() ?? {};
|
|
93
|
+
}
|
|
94
|
+
return {};
|
|
95
|
+
}
|
|
96
|
+
catch {
|
|
97
|
+
return {};
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
function savePersistedSessions(map) {
|
|
101
|
+
try {
|
|
102
|
+
const obj = {};
|
|
103
|
+
for (const [k, v] of map.entries()) {
|
|
104
|
+
if (k !== DEFAULT_SESSION_ID)
|
|
105
|
+
obj[k] = v;
|
|
106
|
+
}
|
|
107
|
+
if (typeof storage.writeSessions === 'function') {
|
|
108
|
+
storage.writeSessions(obj);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
catch {
|
|
112
|
+
// best-effort:存储写失败不阻断内存与会话
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
// 会话隔离状态表(带 LRU 上限防泄漏与持久化备份恢复)
|
|
116
|
+
const sessions = new Map();
|
|
117
|
+
const MAX_SESSIONS = 100;
|
|
118
|
+
function normalizeSessionKey(id) {
|
|
119
|
+
const trimmed = String(id ?? '').trim();
|
|
120
|
+
return trimmed.length > 0 ? trimmed : DEFAULT_SESSION_ID;
|
|
121
|
+
}
|
|
56
122
|
return {
|
|
57
123
|
get: () => current,
|
|
58
124
|
getDisabledSkills() {
|
|
@@ -85,6 +151,7 @@ export function createPonytailState(options) {
|
|
|
85
151
|
sink.reset();
|
|
86
152
|
disabledSkills.clear();
|
|
87
153
|
current = 'full';
|
|
154
|
+
sessions.clear();
|
|
88
155
|
storage.write('full');
|
|
89
156
|
},
|
|
90
157
|
reloadDisabledSkills() {
|
|
@@ -105,6 +172,10 @@ export function createPonytailState(options) {
|
|
|
105
172
|
// 单一关闭契约:'off' 与 null 都是关闭,统一为 null(删 flag)。
|
|
106
173
|
current = mode === 'off' ? null : mode;
|
|
107
174
|
this.syncToFile();
|
|
175
|
+
const defState = sessions.get(DEFAULT_SESSION_ID);
|
|
176
|
+
if (defState) {
|
|
177
|
+
defState.effectiveMode = current;
|
|
178
|
+
}
|
|
108
179
|
},
|
|
109
180
|
syncFromFile() {
|
|
110
181
|
let fileMode;
|
|
@@ -127,6 +198,79 @@ export function createPonytailState(options) {
|
|
|
127
198
|
current = null;
|
|
128
199
|
}
|
|
129
200
|
},
|
|
201
|
+
getSession(sessionId) {
|
|
202
|
+
const key = normalizeSessionKey(sessionId);
|
|
203
|
+
let state = sessions.get(key);
|
|
204
|
+
if (state) {
|
|
205
|
+
// 访问序 LRU:命中时移动至 Map 末尾,维持最新活跃度
|
|
206
|
+
sessions.delete(key);
|
|
207
|
+
sessions.set(key, state);
|
|
208
|
+
return state;
|
|
209
|
+
}
|
|
210
|
+
// 跨进程重启 / LRU 淘汰唤醒保护:优先从 Profile 磁盘恢复历史基线!
|
|
211
|
+
if (key !== DEFAULT_SESSION_ID) {
|
|
212
|
+
const persisted = loadPersistedSessions()[key];
|
|
213
|
+
if (persisted) {
|
|
214
|
+
state = persisted;
|
|
215
|
+
sessions.set(key, state);
|
|
216
|
+
return state;
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
if (sessions.size >= MAX_SESSIONS) {
|
|
220
|
+
// 循环找到首个非 DEFAULT_SESSION_ID 的项淘汰(彻底消除首键死锁)
|
|
221
|
+
for (const k of sessions.keys()) {
|
|
222
|
+
if (k !== DEFAULT_SESSION_ID) {
|
|
223
|
+
sessions.delete(k);
|
|
224
|
+
break;
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
// 全新会话诞生:基线锁定为当前全局模式(或 full)
|
|
229
|
+
const baseline = current ?? 'full';
|
|
230
|
+
state = {
|
|
231
|
+
sessionId: key,
|
|
232
|
+
baselineMode: baseline,
|
|
233
|
+
effectiveMode: baseline,
|
|
234
|
+
lastEmittedMode: baseline,
|
|
235
|
+
explicitlySet: false,
|
|
236
|
+
};
|
|
237
|
+
sessions.set(key, state);
|
|
238
|
+
savePersistedSessions(sessions);
|
|
239
|
+
return state;
|
|
240
|
+
},
|
|
241
|
+
setSessionMode(sessionId, mode) {
|
|
242
|
+
const key = normalizeSessionKey(sessionId);
|
|
243
|
+
const session = this.getSession(key);
|
|
244
|
+
const normalized = mode === 'off' ? null : normalizeMode(mode ?? '') ?? mode;
|
|
245
|
+
session.effectiveMode = normalized;
|
|
246
|
+
session.explicitlySet = true; // 用户在该会话内显式输入过命令,标记保护
|
|
247
|
+
savePersistedSessions(sessions);
|
|
248
|
+
if (key === DEFAULT_SESSION_ID) {
|
|
249
|
+
current = normalized;
|
|
250
|
+
this.syncToFile();
|
|
251
|
+
}
|
|
252
|
+
},
|
|
253
|
+
markSessionEmitted(sessionId, mode) {
|
|
254
|
+
const key = normalizeSessionKey(sessionId);
|
|
255
|
+
const session = this.getSession(key);
|
|
256
|
+
session.lastEmittedMode = mode === 'off' ? null : mode;
|
|
257
|
+
savePersistedSessions(sessions);
|
|
258
|
+
},
|
|
259
|
+
syncGlobalModeToSessions(newDefaultMode) {
|
|
260
|
+
const normalized = normalizeMode(newDefaultMode);
|
|
261
|
+
if (!normalized)
|
|
262
|
+
return;
|
|
263
|
+
current = normalized;
|
|
264
|
+
this.syncToFile();
|
|
265
|
+
// 对已有会话:保持 baselineMode 绝对不变(保护前缀缓存);
|
|
266
|
+
// 仅同步那些从未显式设置过的跟随型会话,保护用户的明确意图
|
|
267
|
+
for (const session of sessions.values()) {
|
|
268
|
+
if (!session.explicitlySet) {
|
|
269
|
+
session.effectiveMode = normalized;
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
savePersistedSessions(sessions);
|
|
273
|
+
},
|
|
130
274
|
};
|
|
131
275
|
}
|
|
132
276
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ponytail-state.js","sourceRoot":"","sources":["../src/ponytail-state.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"ponytail-state.js","sourceRoot":"","sources":["../src/ponytail-state.ts"],"names":[],"mappings":"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"}
|