@wenaixi/dsh-ponytail 5.0.0 → 5.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +140 -226
- package/README.md +102 -98
- package/lib/client.js +303 -140
- package/lib/ponytail-config.d.ts +47 -21
- package/lib/ponytail-config.d.ts.map +1 -1
- package/lib/ponytail-config.js +42 -36
- package/lib/ponytail-config.js.map +1 -1
- package/lib/ponytail-instructions.d.ts.map +1 -1
- package/lib/ponytail-instructions.js +31 -31
- package/lib/ponytail-instructions.js.map +1 -1
- package/lib/ponytail-priority.d.ts +10 -8
- package/lib/ponytail-priority.d.ts.map +1 -1
- package/lib/ponytail-priority.js +12 -11
- package/lib/ponytail-priority.js.map +1 -1
- package/lib/ponytail-remote.d.ts +65 -0
- package/lib/ponytail-remote.d.ts.map +1 -0
- package/lib/ponytail-remote.js +141 -0
- package/lib/ponytail-remote.js.map +1 -0
- package/lib/ponytail-settings.d.ts +96 -0
- package/lib/ponytail-settings.d.ts.map +1 -0
- package/lib/ponytail-settings.js +165 -0
- package/lib/ponytail-settings.js.map +1 -0
- package/lib/ponytail-skills.d.ts +10 -0
- package/lib/ponytail-skills.d.ts.map +1 -1
- package/lib/ponytail-skills.js +23 -5
- package/lib/ponytail-skills.js.map +1 -1
- package/lib/ponytail-state.d.ts +8 -4
- package/lib/ponytail-state.d.ts.map +1 -1
- package/lib/ponytail-state.js +40 -39
- package/lib/ponytail-state.js.map +1 -1
- package/lib/ponytail.d.ts +28 -4
- package/lib/ponytail.d.ts.map +1 -1
- package/lib/ponytail.js +181 -83
- package/lib/ponytail.js.map +1 -1
- package/locale/en.json +37 -27
- package/locale/zh.json +37 -27
- package/package.json +3 -1
- package/skills/descriptions.en.json +8 -0
- package/skills/descriptions.zh.json +8 -0
- package/skills/ponytail/SKILL.md +89 -46
- package/skills/ponytail-audit/SKILL.md +27 -17
- package/skills/ponytail-debt/SKILL.md +27 -14
- package/skills/ponytail-gain/SKILL.md +32 -19
- package/skills/ponytail-help/SKILL.md +53 -32
- package/skills/ponytail-review/SKILL.md +36 -24
- package/lib/ponytail-http.d.ts +0 -45
- package/lib/ponytail-http.d.ts.map +0 -1
- package/lib/ponytail-http.js +0 -162
- package/lib/ponytail-http.js.map +0 -1
|
@@ -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;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,2BAA2B;IAC3B,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"}
|
|
@@ -0,0 +1,141 @@
|
|
|
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
|
+
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 } from 'node:fs';
|
|
53
|
+
import { Remote, TypertRemoteService } from '@deepseek-ai/dsh-typert-protocol';
|
|
54
|
+
/** 技能 id 列表与描述的唯一真源:skills/descriptions.{lang}.json */
|
|
55
|
+
const SKILL_IDS = ['ponytail', 'ponytail-review', 'ponytail-audit', 'ponytail-debt', 'ponytail-gain', 'ponytail-help'];
|
|
56
|
+
/**
|
|
57
|
+
* 短描述兜底:描述文件不可读时用(模型目录与面板至少有一行说明,不至于空白)。
|
|
58
|
+
* 完整描述在 skills/descriptions.{lang}.json,不在此重复。
|
|
59
|
+
*/
|
|
60
|
+
const FALLBACK_DESCRIPTION = {
|
|
61
|
+
zh: {
|
|
62
|
+
'ponytail': '懒人模式本体:7 阶梯子,lite/full/ultra 三档强度',
|
|
63
|
+
'ponytail-review': '过度设计评审:只挑能删的代码,一行一条',
|
|
64
|
+
'ponytail-audit': '全仓过度设计审计:按可删行数降序猎取臃肿',
|
|
65
|
+
'ponytail-debt': '收割 ponytail: 注释列成债务台账',
|
|
66
|
+
'ponytail-gain': '收益看板:benchmark 中位数实测收益',
|
|
67
|
+
'ponytail-help': '速查卡:模式、技能与命令',
|
|
68
|
+
},
|
|
69
|
+
en: {
|
|
70
|
+
'ponytail': 'Lazy senior dev mode: seven-rung ladder, lite/full/ultra',
|
|
71
|
+
'ponytail-review': 'Over-engineering review: only what can be deleted',
|
|
72
|
+
'ponytail-audit': 'Whole-repo audit for over-engineering, ranked by cut size',
|
|
73
|
+
'ponytail-debt': 'Harvest ponytail: shortcut comments into a debt ledger',
|
|
74
|
+
'ponytail-gain': 'Measured-impact scoreboard from benchmark medians',
|
|
75
|
+
'ponytail-help': 'Quick reference: modes, skills, commands',
|
|
76
|
+
},
|
|
77
|
+
};
|
|
78
|
+
/**
|
|
79
|
+
* 从包内描述文件读取技能元数据;文件不可读或缺项时回退短描述。
|
|
80
|
+
*
|
|
81
|
+
* lang 缺省或非法一律按 zh 处理:调用方(面板、Provider)读的是配置值,
|
|
82
|
+
* 而配置可能来自手写的补丁,不保证取值域干净。
|
|
83
|
+
*/
|
|
84
|
+
export function readSkillMeta(lang) {
|
|
85
|
+
const safeLang = lang === 'en' ? 'en' : 'zh';
|
|
86
|
+
const text = readSkillDescriptions(safeLang);
|
|
87
|
+
return SKILL_IDS.map((id) => ({
|
|
88
|
+
id,
|
|
89
|
+
name: id,
|
|
90
|
+
description: text?.[id] ?? FALLBACK_DESCRIPTION[safeLang][id] ?? id,
|
|
91
|
+
}));
|
|
92
|
+
}
|
|
93
|
+
/** 读 skills/descriptions.<lang>.json;不可读返回 null 由调用方回退。 */
|
|
94
|
+
export function readSkillDescriptions(lang) {
|
|
95
|
+
try {
|
|
96
|
+
const raw = readFileSync(new URL(`../skills/descriptions.${lang === 'en' ? 'en' : 'zh'}.json`, import.meta.url), 'utf8').replace(/^\uFEFF/, '');
|
|
97
|
+
const parsed = JSON.parse(raw);
|
|
98
|
+
const out = {};
|
|
99
|
+
for (const id of SKILL_IDS) {
|
|
100
|
+
const value = parsed[id];
|
|
101
|
+
if (typeof value === 'string' && value.length > 0)
|
|
102
|
+
out[id] = value;
|
|
103
|
+
}
|
|
104
|
+
return Object.keys(out).length === SKILL_IDS.length ? out : null;
|
|
105
|
+
}
|
|
106
|
+
catch {
|
|
107
|
+
return null;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* 远程服务:只暴露 snapshot 一个只读端点。
|
|
112
|
+
*
|
|
113
|
+
* 写操作一律不在这里——它们走 settings(官方配置通道),由宿主负责校验、
|
|
114
|
+
* revision 冲突检测与 loader 的 volatile 热提交。这里多开一个写端点等于绕过那套保护。
|
|
115
|
+
*
|
|
116
|
+
* `@Remote('snapshot')` 用字符串形式:仓库 tsconfig 的 experimentalDecorators 为 false
|
|
117
|
+
* (标准装饰器),零参 `@Remote()` 在该语义下拿不到 class context,TS 会报 TS2554/TS1241。
|
|
118
|
+
*/
|
|
119
|
+
let PonytailRemote = (() => {
|
|
120
|
+
let _classSuper = TypertRemoteService;
|
|
121
|
+
let _instanceExtraInitializers = [];
|
|
122
|
+
let _snapshot_decorators;
|
|
123
|
+
return class PonytailRemote extends _classSuper {
|
|
124
|
+
static {
|
|
125
|
+
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
|
|
126
|
+
_snapshot_decorators = [Remote('snapshot')];
|
|
127
|
+
__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);
|
|
128
|
+
if (_metadata) Object.defineProperty(this, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
|
|
129
|
+
}
|
|
130
|
+
deps = __runInitializers(this, _instanceExtraInitializers);
|
|
131
|
+
constructor(ctx, deps) {
|
|
132
|
+
super(ctx, 'ponytailRemote', { namespace: 'ponytail' });
|
|
133
|
+
this.deps = deps;
|
|
134
|
+
}
|
|
135
|
+
snapshot() {
|
|
136
|
+
return this.deps.snapshot();
|
|
137
|
+
}
|
|
138
|
+
};
|
|
139
|
+
})();
|
|
140
|
+
export { PonytailRemote };
|
|
141
|
+
//# 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":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAGH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAA;AAEvD,4EAA4E;AAC5E,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,KAAK,GAAG,OAAO,CAAA;IACnB,IAAI,EAAE,MAAM,EAAE,CAAA;IACd,KAAK,CAAC,EAAE,OAAO,CAAA;CAChB;AAED,wCAAwC;AACxC,MAAM,WAAW,YAAY;IAC3B,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,aAAa,EAAE,EAAE,gBAAgB,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;IACrF,QAAQ,CAAC,OAAO,CAAC,EAAE;QAAE,aAAa,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG;QAAE,UAAU,CAAC,EAAE;YAAE,EAAE,EAAE,MAAM,CAAC;YAAC,KAAK,CAAC,EAAE,OAAO,CAAA;SAAE,EAAE,CAAA;KAAE,GAAG,OAAO,EAAE,CAAA;IAC/G,MAAM,CAAC,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,gBAAgB,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;CACjG;AAED,MAAM,WAAW,kBAAkB;IACjC,wBAAwB;IACxB,eAAe,IAAI,WAAW,CAAA;IAC9B,4BAA4B;IAC5B,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI,CAAA;IAClD,iBAAiB;IACjB,YAAY,IAAI,MAAM,EAAE,CAAA;IACxB,gBAAgB;IAChB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,CAAA;IACrC,uCAAuC;IACvC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAA;CAC9B;AAkBD,MAAM,WAAW,mBAAmB;IAClC,MAAM,CAAC,EAAE;QAAE,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAA;CACrC;AAED,wBAAgB,kBAAkB,CAChC,GAAG,EAAE;IAAE,QAAQ,CAAC,EAAE,YAAY,GAAG,IAAI,CAAA;CAAE,EACvC,SAAS,SAAa,EACtB,OAAO,GAAE,mBAAwB,GAChC,kBAAkB,CA6DpB;AAWD;;;GAGG;AACH,wBAAgB,cAAc,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,kBAAkB,CAqBtE;AAED,MAAM,WAAW,mBAAmB;IAClC,mDAAmD;IACnD,QAAQ,EAAE;QACR,QAAQ,CAAC,OAAO,CAAC,EAAE;YAAE,aAAa,CAAC,EAAE,OAAO,CAAA;SAAE,GAAG;YAAE,UAAU,CAAC,EAAE;gBAAE,EAAE,EAAE,MAAM,CAAC;gBAAC,KAAK,CAAC,EAAE,OAAO,CAAA;aAAE,EAAE,CAAA;SAAE,GAAG,OAAO,EAAE,CAAA;QAC/G,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,gBAAgB,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;KAChG,CAAA;IACD,SAAS,EAAE,MAAM,CAAA;IACjB,+BAA+B;IAC/B,UAAU,EAAE,MAAM;QAAE,WAAW,EAAE,WAAW,CAAC;QAAC,cAAc,EAAE,MAAM,EAAE,CAAA;KAAE,CAAA;IACxE,gEAAgE;IAChE,YAAY,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;IACjC,MAAM,EAAE;QAAE,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAA;CAC7D;AAED;;;;;GAKG;AACH,wBAAsB,mBAAmB,CAAC,IAAI,EAAE,mBAAmB,GAAG,OAAO,CAAC,OAAO,CAAC,CA4BrF"}
|
|
@@ -0,0 +1,165 @@
|
|
|
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 { DEFAULT_MODE, normalizeMode, readFullConfig, resetFullConfig, writeFullConfig } from './ponytail-config.js';
|
|
19
|
+
function namespaceOf(describeResult, namespace) {
|
|
20
|
+
const namespaces = (Array.isArray(describeResult)
|
|
21
|
+
? describeResult
|
|
22
|
+
: describeResult?.namespaces ?? []);
|
|
23
|
+
const row = namespaces.find((item) => item?.ns === namespace);
|
|
24
|
+
const value = row?.value !== null && typeof row?.value === 'object'
|
|
25
|
+
? row.value
|
|
26
|
+
: {};
|
|
27
|
+
return { revision: row?.revision ?? 0, value };
|
|
28
|
+
}
|
|
29
|
+
export function createSettingsSink(ctx, namespace = 'ponytail', options = {}) {
|
|
30
|
+
const provided = ctx.settings;
|
|
31
|
+
if (provided === undefined || provided === null || typeof provided.mutate !== 'function') {
|
|
32
|
+
throw new Error('settings service is not available');
|
|
33
|
+
}
|
|
34
|
+
const service = provided;
|
|
35
|
+
const logger = options.logger;
|
|
36
|
+
// 本地镜像:启动时读一次 describe,之后跟随自己的写入(乐观更新)。
|
|
37
|
+
let mirror = {};
|
|
38
|
+
let revision = 0;
|
|
39
|
+
try {
|
|
40
|
+
const row = namespaceOf(service.describe(), namespace);
|
|
41
|
+
mirror = row.value;
|
|
42
|
+
revision = row.revision;
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
mirror = {};
|
|
46
|
+
}
|
|
47
|
+
function write(ops) {
|
|
48
|
+
// 先更新本地镜像再发请求:调用方拿到的同步返回值与 UI 显示都以此为准。
|
|
49
|
+
mirror = applyOps(mirror, ops);
|
|
50
|
+
void service
|
|
51
|
+
.mutate(namespace, ops, revision)
|
|
52
|
+
.then((response) => {
|
|
53
|
+
const next = response?.value?.revision;
|
|
54
|
+
if (typeof next === 'number')
|
|
55
|
+
revision = next;
|
|
56
|
+
})
|
|
57
|
+
.catch((error) => {
|
|
58
|
+
// 写入被宿主拒绝(schema 校验、上层补丁覆盖、revision 冲突)时如实记录。
|
|
59
|
+
// 不抛给同步调用方:命令层没有 await 链可走,抛出只会变成未处理拒绝;
|
|
60
|
+
// 面板侧下一次 describe 会带回服务端真值并覆盖乐观值。
|
|
61
|
+
logger?.warn(`[ponytail] 配置写入被拒(下次读取会带回真实值):${String(error)}`);
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
return {
|
|
65
|
+
readDefaultMode() {
|
|
66
|
+
const raw = mirror['defaultMode'];
|
|
67
|
+
return typeof raw === 'string' ? (normalizeMode(raw) ?? DEFAULT_MODE) : DEFAULT_MODE;
|
|
68
|
+
},
|
|
69
|
+
readDisabled() {
|
|
70
|
+
const raw = mirror['disabledSkills'];
|
|
71
|
+
return Array.isArray(raw) ? raw.filter((item) => typeof item === 'string') : [];
|
|
72
|
+
},
|
|
73
|
+
writeDefaultMode(mode) {
|
|
74
|
+
const normalized = normalizeMode(mode);
|
|
75
|
+
if (normalized === null)
|
|
76
|
+
return null;
|
|
77
|
+
write([{ op: 'set', path: ['defaultMode'], value: normalized }]);
|
|
78
|
+
return normalized;
|
|
79
|
+
},
|
|
80
|
+
writeDisabled(skills) {
|
|
81
|
+
write([{ op: 'set', path: ['disabledSkills'], value: skills.filter((item) => typeof item === 'string') }]);
|
|
82
|
+
},
|
|
83
|
+
reset() {
|
|
84
|
+
write([
|
|
85
|
+
{ op: 'unset', path: ['defaultMode'] },
|
|
86
|
+
{ op: 'unset', path: ['disabledSkills'] },
|
|
87
|
+
]);
|
|
88
|
+
},
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
function applyOps(value, ops) {
|
|
92
|
+
const next = { ...value };
|
|
93
|
+
for (const op of ops) {
|
|
94
|
+
if (op.op === 'unset')
|
|
95
|
+
delete next[op.path[0]];
|
|
96
|
+
else
|
|
97
|
+
next[op.path[0]] = op.value;
|
|
98
|
+
}
|
|
99
|
+
return next;
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* 文件回退通道:无 settings 服务的组合(headless / CLI)直接读写 profile 内 config.json。
|
|
103
|
+
* 与 settings 通道共享同一组语义:非法档不写、reset 清空两项。
|
|
104
|
+
*/
|
|
105
|
+
export function createFileSink(profileDir) {
|
|
106
|
+
return {
|
|
107
|
+
readDefaultMode() {
|
|
108
|
+
return readFullConfig(profileDir).defaultMode;
|
|
109
|
+
},
|
|
110
|
+
writeDefaultMode(mode) {
|
|
111
|
+
const normalized = normalizeMode(mode);
|
|
112
|
+
if (normalized === null)
|
|
113
|
+
return null;
|
|
114
|
+
const written = writeFullConfig({ defaultMode: normalized }, profileDir);
|
|
115
|
+
return written === null ? null : written.defaultMode;
|
|
116
|
+
},
|
|
117
|
+
readDisabled() {
|
|
118
|
+
return readFullConfig(profileDir).disabledSkills;
|
|
119
|
+
},
|
|
120
|
+
writeDisabled(skills) {
|
|
121
|
+
writeFullConfig({ disabledSkills: skills }, profileDir);
|
|
122
|
+
},
|
|
123
|
+
reset() {
|
|
124
|
+
resetFullConfig(profileDir);
|
|
125
|
+
},
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* 一次性把 config.json 的两个字段导入 profile 补丁,并改名旧文件使其幂等。
|
|
130
|
+
*
|
|
131
|
+
* 判据:旧配置「有内容」且 profile 侧该命名空间「还没设过」。两者同时成立才导入。
|
|
132
|
+
* 导入失败只 warn,不阻断启动——老用户配置丢了可以手动再填,但插件不该起不来。
|
|
133
|
+
*/
|
|
134
|
+
export async function migrateLegacyConfig(deps) {
|
|
135
|
+
const legacy = deps.readLegacy();
|
|
136
|
+
const hasContent = legacy.disabledSkills.length > 0 || legacy.defaultMode !== DEFAULT_MODE;
|
|
137
|
+
if (!hasContent)
|
|
138
|
+
return false;
|
|
139
|
+
let alreadySet = false;
|
|
140
|
+
try {
|
|
141
|
+
const described = deps.settings.describe();
|
|
142
|
+
const namespaces = (Array.isArray(described) ? described : described.namespaces ?? []);
|
|
143
|
+
alreadySet = namespaces.some((item) => item?.ns === deps.namespace);
|
|
144
|
+
}
|
|
145
|
+
catch (error) {
|
|
146
|
+
deps.logger.warn(`[ponytail] 读取 profile 命名空间失败,跳过旧配置导入:${String(error)}`);
|
|
147
|
+
return false;
|
|
148
|
+
}
|
|
149
|
+
if (alreadySet)
|
|
150
|
+
return false;
|
|
151
|
+
try {
|
|
152
|
+
await deps.settings.update(deps.namespace, {
|
|
153
|
+
defaultMode: legacy.defaultMode,
|
|
154
|
+
disabledSkills: legacy.disabledSkills,
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
catch (error) {
|
|
158
|
+
deps.logger.warn(`[ponytail] 旧配置导入 profile 补丁失败(可用 /ponytail default 重新设置):${String(error)}`);
|
|
159
|
+
return false;
|
|
160
|
+
}
|
|
161
|
+
await deps.renameLegacy();
|
|
162
|
+
deps.logger.info('[ponytail] 旧 config.json 已导入 profile 补丁并改名');
|
|
163
|
+
return true;
|
|
164
|
+
}
|
|
165
|
+
//# sourceMappingURL=ponytail-settings.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ponytail-settings.js","sourceRoot":"","sources":["../src/ponytail-settings.ts"],"names":[],"mappings":"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"}
|
package/lib/ponytail-skills.d.ts
CHANGED
|
@@ -8,6 +8,7 @@
|
|
|
8
8
|
* 事件监听,注册处一行构造调用。
|
|
9
9
|
*
|
|
10
10
|
* 边界:skillDir 由 entry 解析后传入(config.skillDir 的优先级归 entry 模块)。
|
|
11
|
+
* 描述语言由 getDescriptionLang 闭包现读,来源 skills/descriptions.{lang}.json。
|
|
11
12
|
* 与 @deepseek-ai/dsh-skill 的关系:实现其 SkillProvider 接口;
|
|
12
13
|
* 字段以该包 lib/types/index.d.ts 的生成类型为准。
|
|
13
14
|
*/
|
|
@@ -19,11 +20,20 @@ export declare class PonytailProvider implements SkillProvider {
|
|
|
19
20
|
private readonly ctx;
|
|
20
21
|
private readonly control;
|
|
21
22
|
private readonly isSkillEnabled?;
|
|
23
|
+
/** 当前配置要求的描述语言;每次求值现读 volatile 引用,不缓存 */
|
|
24
|
+
private readonly getDescriptionLang?;
|
|
22
25
|
constructor(ctx: Context, control: SkillProviderControl, options: {
|
|
23
26
|
providerName?: string;
|
|
24
27
|
skillDir: string;
|
|
25
28
|
isSkillEnabled?: (name: string) => boolean;
|
|
29
|
+
getDescriptionLang?: () => 'zh' | 'en';
|
|
26
30
|
});
|
|
31
|
+
/**
|
|
32
|
+
* 当前语言的描述表;描述文件不可读时返回 null,调用方回退 frontmatter 里的英文。
|
|
33
|
+
* 每次现读:配置改动经 loader/volatile-update 就地更新引用并触发目录失效,
|
|
34
|
+
* 缓存表会让切换停在旧语言。
|
|
35
|
+
*/
|
|
36
|
+
private descriptions;
|
|
27
37
|
invalidate(): void;
|
|
28
38
|
list(options: SkillLookupOptions): Promise<readonly SkillCandidate[] | SkillProviderObservation>;
|
|
29
39
|
get(candidate: SkillCandidate, options: SkillLookupOptions): Promise<SkillDefinition | undefined>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ponytail-skills.d.ts","sourceRoot":"","sources":["../src/ponytail-skills.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"ponytail-skills.d.ts","sourceRoot":"","sources":["../src/ponytail-skills.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAMH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAClD,OAAO,KAAK,EACV,cAAc,EACd,eAAe,EACf,kBAAkB,EAClB,aAAa,EACb,oBAAoB,EACpB,wBAAwB,EACzB,MAAM,wBAAwB,CAAA;AAuK/B,qBAAa,gBAAiB,YAAW,aAAa;IACpD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAQ;IACjC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAS;IAC7B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAsB;IAC9C,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,CAA2B;IAC3D,yCAAyC;IACzC,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAAmB;gBAGrD,GAAG,EAAE,OAAO,EACZ,OAAO,EAAE,oBAAoB,EAC7B,OAAO,EAAE;QACP,YAAY,CAAC,EAAE,MAAM,CAAA;QACrB,QAAQ,EAAE,MAAM,CAAA;QAChB,cAAc,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAA;QAC1C,kBAAkB,CAAC,EAAE,MAAM,IAAI,GAAG,IAAI,CAAA;KACvC;IAUH;;;;OAIG;IACH,OAAO,CAAC,YAAY;IAIpB,UAAU,IAAI,IAAI;IAQZ,IAAI,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,SAAS,cAAc,EAAE,GAAG,wBAAwB,CAAC;IA+DhG,GAAG,CAAC,SAAS,EAAE,cAAc,EAAE,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,eAAe,GAAG,SAAS,CAAC;CAgCxG"}
|
package/lib/ponytail-skills.js
CHANGED
|
@@ -8,12 +8,14 @@
|
|
|
8
8
|
* 事件监听,注册处一行构造调用。
|
|
9
9
|
*
|
|
10
10
|
* 边界:skillDir 由 entry 解析后传入(config.skillDir 的优先级归 entry 模块)。
|
|
11
|
+
* 描述语言由 getDescriptionLang 闭包现读,来源 skills/descriptions.{lang}.json。
|
|
11
12
|
* 与 @deepseek-ai/dsh-skill 的关系:实现其 SkillProvider 接口;
|
|
12
13
|
* 字段以该包 lib/types/index.d.ts 的生成类型为准。
|
|
13
14
|
*/
|
|
14
15
|
import { readdir, readFile } from 'node:fs/promises';
|
|
15
16
|
import { dirname, join } from 'node:path';
|
|
16
17
|
import { parse } from 'yaml';
|
|
18
|
+
import { readSkillDescriptions } from './ponytail-remote.js';
|
|
17
19
|
const SKILL_NAME_RE = /^[a-z0-9]+(?:-[a-z0-9]+)*$/;
|
|
18
20
|
const PONYTAIL_RANK = 550;
|
|
19
21
|
function isSkillName(v) {
|
|
@@ -126,11 +128,14 @@ async function parseSkillFile(path, signal) {
|
|
|
126
128
|
/**
|
|
127
129
|
* 私有组装流水线:从 frontmatter 提取并验证公共基础字段。
|
|
128
130
|
* 校验失败或格式非法时抛出 Error,由外层根据上下文决定记录日志或静默处理。
|
|
131
|
+
*
|
|
132
|
+
* 描述不在这里决定:SKILL.md 的 frontmatter 只保留英文原文(上游真源),
|
|
133
|
+
* 中文描述在 skills/descriptions.zh.json,由 Provider 按配置选择下发哪一套。
|
|
134
|
+
* frontmatter 的 description 因此只作为「文件可解析」的存在性校验与缺项兜底。
|
|
129
135
|
*/
|
|
130
|
-
function assembleSkillBase(data, filePath, providerName) {
|
|
136
|
+
function assembleSkillBase(data, filePath, providerName, description) {
|
|
131
137
|
const name = readString(data, 'name');
|
|
132
|
-
|
|
133
|
-
if (!name || !description) {
|
|
138
|
+
if (!name || !readString(data, 'description')) {
|
|
134
139
|
throw new Error('frontmatter 必须包含 name 和 description');
|
|
135
140
|
}
|
|
136
141
|
if (!isSkillName(name)) {
|
|
@@ -157,12 +162,23 @@ export class PonytailProvider {
|
|
|
157
162
|
ctx;
|
|
158
163
|
control;
|
|
159
164
|
isSkillEnabled;
|
|
165
|
+
/** 当前配置要求的描述语言;每次求值现读 volatile 引用,不缓存 */
|
|
166
|
+
getDescriptionLang;
|
|
160
167
|
constructor(ctx, control, options) {
|
|
161
168
|
this.ctx = ctx;
|
|
162
169
|
this.control = control;
|
|
163
170
|
this.name = options.providerName ?? 'ponytail';
|
|
164
171
|
this.skillDir = options.skillDir;
|
|
165
172
|
this.isSkillEnabled = options.isSkillEnabled;
|
|
173
|
+
this.getDescriptionLang = options.getDescriptionLang;
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* 当前语言的描述表;描述文件不可读时返回 null,调用方回退 frontmatter 里的英文。
|
|
177
|
+
* 每次现读:配置改动经 loader/volatile-update 就地更新引用并触发目录失效,
|
|
178
|
+
* 缓存表会让切换停在旧语言。
|
|
179
|
+
*/
|
|
180
|
+
descriptions() {
|
|
181
|
+
return readSkillDescriptions(this.getDescriptionLang?.() ?? 'zh');
|
|
166
182
|
}
|
|
167
183
|
invalidate() {
|
|
168
184
|
try {
|
|
@@ -206,9 +222,10 @@ export class PonytailProvider {
|
|
|
206
222
|
this.ctx.logger.warn(`[ponytail] 跳过 ${entry.name}:缺少或无效的 frontmatter`);
|
|
207
223
|
continue;
|
|
208
224
|
}
|
|
225
|
+
const descriptions = this.descriptions();
|
|
209
226
|
let base;
|
|
210
227
|
try {
|
|
211
|
-
base = assembleSkillBase(parsed.data, skillPath, this.name);
|
|
228
|
+
base = assembleSkillBase(parsed.data, skillPath, this.name, descriptions?.[entry.name] ?? readString(parsed.data, 'description'));
|
|
212
229
|
}
|
|
213
230
|
catch (err) {
|
|
214
231
|
this.ctx.logger.warn(`[ponytail] 跳过 ${skillPath}:${err.message}`);
|
|
@@ -243,7 +260,8 @@ export class PonytailProvider {
|
|
|
243
260
|
return undefined;
|
|
244
261
|
let base;
|
|
245
262
|
try {
|
|
246
|
-
|
|
263
|
+
const descriptions = this.descriptions();
|
|
264
|
+
base = assembleSkillBase(parsed.data, targetPath, this.name, descriptions?.[candidate.name] ?? readString(parsed.data, 'description'));
|
|
247
265
|
}
|
|
248
266
|
catch {
|
|
249
267
|
return undefined;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ponytail-skills.js","sourceRoot":"","sources":["../src/ponytail-skills.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"ponytail-skills.js","sourceRoot":"","sources":["../src/ponytail-skills.ts"],"names":[],"mappings":"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"}
|
package/lib/ponytail-state.d.ts
CHANGED
|
@@ -13,6 +13,7 @@
|
|
|
13
13
|
* 实例必须是 apply() 内的闭包变量:DSH 常驻进程下 HMR 重载会重建 apply,
|
|
14
14
|
* 模块级单例会让旧状态跨实例存活,与 flag 文件双写竞争。
|
|
15
15
|
*/
|
|
16
|
+
import { type PonytailConfigSink } from './ponytail-settings.js';
|
|
16
17
|
/**
|
|
17
18
|
* 状态持久化存储适配器契约(两个适配器证明切面价值:生产物理磁盘 + 测试内存隔离)
|
|
18
19
|
*/
|
|
@@ -24,6 +25,11 @@ export interface PonytailStorage {
|
|
|
24
25
|
export interface PonytailStateOptions {
|
|
25
26
|
/** 可选注入的存储适配器;缺省时使用内联的 DSH 配置目录磁盘实现(flag 存取已并入本模块) */
|
|
26
27
|
storage?: PonytailStorage;
|
|
28
|
+
/**
|
|
29
|
+
* 可持久化配置(默认档 + 技能禁用列表)的读写通道。缺省走 profile 内 config.json 文件实现;
|
|
30
|
+
* 有 settings 服务的组合由 apply 注入 settings 实现(写入落 profile 补丁)。
|
|
31
|
+
*/
|
|
32
|
+
sink?: PonytailConfigSink;
|
|
27
33
|
}
|
|
28
34
|
export interface PonytailState {
|
|
29
35
|
/** 当前等级的内存视图;不触发任何文件读。null 表示关闭('off' 由 set 归一为 null) */
|
|
@@ -46,12 +52,10 @@ export interface PonytailState {
|
|
|
46
52
|
setDefaultMode(mode: string): void;
|
|
47
53
|
/** 恢复所有默认配置(等级切回 full,启用所有技能) */
|
|
48
54
|
resetToDefaults(): void;
|
|
49
|
-
/** 文件优先:重读 config.json 的 disabledSkills 重建内存 Set(外部手改文件后的收敛入口) */
|
|
55
|
+
/** 文件优先:重读 profile 内 config.json 的 disabledSkills 重建内存 Set(外部手改文件后的收敛入口) */
|
|
50
56
|
reloadDisabledSkills(): void;
|
|
51
57
|
}
|
|
52
|
-
export declare function
|
|
53
|
-
export declare function clearMode(): void;
|
|
54
|
-
export declare function readMode(): string | null;
|
|
58
|
+
export declare function createDiskStorage(profileDir?: string): PonytailStorage;
|
|
55
59
|
export declare function createPonytailState(options?: PonytailStateOptions): PonytailState;
|
|
56
60
|
/**
|
|
57
61
|
* 纯函数守卫:「禁用主技能 ponytail → 关闭运行等级」业务规则的唯一实现。
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ponytail-state.d.ts","sourceRoot":"","sources":["../src/ponytail-state.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;
|
|
1
|
+
{"version":3,"file":"ponytail-state.d.ts","sourceRoot":"","sources":["../src/ponytail-state.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;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;CACd;AAED,MAAM,WAAW,oBAAoB;IACnC,sDAAsD;IACtD,OAAO,CAAC,EAAE,eAAe,CAAA;IACzB;;;OAGG;IACH,IAAI,CAAC,EAAE,kBAAkB,CAAA;CAC1B;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;CAC7B;AASD,wBAAgB,iBAAiB,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,eAAe,CAsBtE;AAED,wBAAgB,mBAAmB,CAAC,OAAO,CAAC,EAAE,oBAAoB,GAAG,aAAa,CAkFjF;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAExE"}
|