@wenaixi/dsh-ponytail 5.0.0 → 5.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (49) hide show
  1. package/CHANGELOG.md +140 -226
  2. package/README.md +102 -98
  3. package/lib/client.js +303 -140
  4. package/lib/ponytail-config.d.ts +47 -21
  5. package/lib/ponytail-config.d.ts.map +1 -1
  6. package/lib/ponytail-config.js +42 -36
  7. package/lib/ponytail-config.js.map +1 -1
  8. package/lib/ponytail-instructions.d.ts.map +1 -1
  9. package/lib/ponytail-instructions.js +31 -31
  10. package/lib/ponytail-instructions.js.map +1 -1
  11. package/lib/ponytail-priority.d.ts +10 -8
  12. package/lib/ponytail-priority.d.ts.map +1 -1
  13. package/lib/ponytail-priority.js +12 -11
  14. package/lib/ponytail-priority.js.map +1 -1
  15. package/lib/ponytail-remote.d.ts +65 -0
  16. package/lib/ponytail-remote.d.ts.map +1 -0
  17. package/lib/ponytail-remote.js +141 -0
  18. package/lib/ponytail-remote.js.map +1 -0
  19. package/lib/ponytail-settings.d.ts +96 -0
  20. package/lib/ponytail-settings.d.ts.map +1 -0
  21. package/lib/ponytail-settings.js +165 -0
  22. package/lib/ponytail-settings.js.map +1 -0
  23. package/lib/ponytail-skills.d.ts +10 -0
  24. package/lib/ponytail-skills.d.ts.map +1 -1
  25. package/lib/ponytail-skills.js +23 -5
  26. package/lib/ponytail-skills.js.map +1 -1
  27. package/lib/ponytail-state.d.ts +8 -4
  28. package/lib/ponytail-state.d.ts.map +1 -1
  29. package/lib/ponytail-state.js +40 -39
  30. package/lib/ponytail-state.js.map +1 -1
  31. package/lib/ponytail.d.ts +28 -4
  32. package/lib/ponytail.d.ts.map +1 -1
  33. package/lib/ponytail.js +181 -83
  34. package/lib/ponytail.js.map +1 -1
  35. package/locale/en.json +37 -27
  36. package/locale/zh.json +37 -27
  37. package/package.json +3 -1
  38. package/skills/descriptions.en.json +8 -0
  39. package/skills/descriptions.zh.json +8 -0
  40. package/skills/ponytail/SKILL.md +89 -46
  41. package/skills/ponytail-audit/SKILL.md +27 -17
  42. package/skills/ponytail-debt/SKILL.md +27 -14
  43. package/skills/ponytail-gain/SKILL.md +32 -19
  44. package/skills/ponytail-help/SKILL.md +53 -32
  45. package/skills/ponytail-review/SKILL.md +36 -24
  46. package/lib/ponytail-http.d.ts +0 -45
  47. package/lib/ponytail-http.d.ts.map +0 -1
  48. package/lib/ponytail-http.js +0 -162
  49. package/lib/ponytail-http.js.map +0 -1
@@ -15,42 +15,44 @@
15
15
  */
16
16
  import { mkdirSync, readFileSync, unlinkSync, writeFileSync } from 'node:fs';
17
17
  import { dirname, join } from 'node:path';
18
- import { normalizeMode, readFullConfig, writeFullConfig, resetFullConfig, getConfigDir } from './ponytail-config.js';
19
- // flag 物理存取(原 src/ponytail-runtime.ts,C6 内联):DSH 数据根下 .ponytail-active
18
+ import { normalizeMode, getConfigDir } from './ponytail-config.js';
19
+ import { createFileSink } from './ponytail-settings.js';
20
+ // 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。
20
25
  const STATE_FILE = '.ponytail-active';
21
- function statePath() {
22
- return join(getConfigDir(), STATE_FILE);
23
- }
24
- export function setMode(mode) {
25
- mkdirSync(dirname(statePath()), { recursive: true });
26
- writeFileSync(statePath(), mode, 'utf8');
27
- }
28
- export function clearMode() {
29
- try {
30
- unlinkSync(statePath());
31
- }
32
- catch {
33
- // ignore
34
- }
35
- }
36
- export function readMode() {
37
- try {
38
- const v = readFileSync(statePath(), 'utf8').trim();
39
- return v || null;
40
- }
41
- catch {
42
- return null;
43
- }
26
+ export function createDiskStorage(profileDir) {
27
+ const statePath = () => join(getConfigDir(profileDir), STATE_FILE);
28
+ return {
29
+ read: () => {
30
+ try {
31
+ return readFileSync(statePath(), 'utf8').trim() || null;
32
+ }
33
+ catch {
34
+ return null;
35
+ }
36
+ },
37
+ write: (mode) => {
38
+ mkdirSync(dirname(statePath()), { recursive: true });
39
+ writeFileSync(statePath(), mode, 'utf8');
40
+ },
41
+ clear: () => {
42
+ try {
43
+ unlinkSync(statePath());
44
+ }
45
+ catch {
46
+ // ignore
47
+ }
48
+ },
49
+ };
44
50
  }
45
- const defaultDiskStorage = {
46
- read: () => readMode(),
47
- write: (mode) => setMode(mode),
48
- clear: () => clearMode(),
49
- };
50
51
  export function createPonytailState(options) {
51
- const storage = options?.storage ?? defaultDiskStorage;
52
+ const storage = options?.storage ?? createDiskStorage();
52
53
  let current = null;
53
- let disabledSkills = new Set(readFullConfig().disabledSkills);
54
+ const sink = options?.sink ?? createFileSink();
55
+ let disabledSkills = new Set(sink.readDisabled());
54
56
  return {
55
57
  get: () => current,
56
58
  getDisabledSkills() {
@@ -58,7 +60,7 @@ export function createPonytailState(options) {
58
60
  },
59
61
  setDisabledSkills(skills) {
60
62
  disabledSkills = new Set(skills);
61
- writeFullConfig({ disabledSkills: Array.from(disabledSkills) });
63
+ sink.writeDisabled(Array.from(disabledSkills));
62
64
  },
63
65
  isSkillEnabled(name) {
64
66
  return !disabledSkills.has(name);
@@ -71,23 +73,22 @@ export function createPonytailState(options) {
71
73
  else {
72
74
  disabledSkills.add(name);
73
75
  }
74
- writeFullConfig({ disabledSkills: Array.from(disabledSkills) });
76
+ sink.writeDisabled(Array.from(disabledSkills));
75
77
  return !disabledSkills.has(name);
76
78
  },
77
79
  setDefaultMode(mode) {
78
80
  const nm = normalizeMode(mode);
79
- if (nm) {
80
- writeFullConfig({ defaultMode: nm });
81
- }
81
+ if (nm)
82
+ sink.writeDefaultMode(nm);
82
83
  },
83
84
  resetToDefaults() {
84
- resetFullConfig();
85
+ sink.reset();
85
86
  disabledSkills.clear();
86
87
  current = 'full';
87
88
  storage.write('full');
88
89
  },
89
90
  reloadDisabledSkills() {
90
- disabledSkills = new Set(readFullConfig().disabledSkills);
91
+ disabledSkills = new Set(sink.readDisabled());
91
92
  },
92
93
  syncToFile() {
93
94
  try {
@@ -1 +1 @@
1
- {"version":3,"file":"ponytail-state.js","sourceRoot":"","sources":["../src/ponytail-state.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ponytail-state.js","sourceRoot":"","sources":["../src/ponytail-state.ts"],"names":[],"mappings":"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"}
package/lib/ponytail.d.ts CHANGED
@@ -11,14 +11,38 @@ import type { Context } from '@deepseek-ai/cordis';
11
11
  import Schema from '@deepseek-ai/schemastery';
12
12
  import { type PonytailConfig } from './ponytail-config.js';
13
13
  export type Config = PonytailConfig;
14
- export declare const Config: Schema<Config>;
14
+ export declare const Config: Schema<Schemastery.ObjectS<NoInfer<{
15
+ providerName: Schema<string, string, "defined">;
16
+ skillDir: Schema<string, string, "plain">;
17
+ defaultMode: Schema<"full" | "off" | "lite" | "ultra", "full" | "off" | "lite" | "ultra", "volatile">;
18
+ disabledSkills: Schema<NoInfer<string[]>, NoInfer<string[]>, "volatile">;
19
+ skillDescriptionLang: Schema<"zh" | "en", "zh" | "en", "volatile-defined">;
20
+ }>>, Schemastery.ObjectT<NoInfer<{
21
+ providerName: Schema<string, string, "defined">;
22
+ skillDir: Schema<string, string, "plain">;
23
+ defaultMode: Schema<"full" | "off" | "lite" | "ultra", "full" | "off" | "lite" | "ultra", "volatile">;
24
+ disabledSkills: Schema<NoInfer<string[]>, NoInfer<string[]>, "volatile">;
25
+ skillDescriptionLang: Schema<"zh" | "en", "zh" | "en", "volatile-defined">;
26
+ }>>, "plain">;
15
27
  export declare const name = "ponytail";
16
- export declare const inject: readonly ["skills", "systemPrompt", "webServer"];
28
+ export declare const inject: readonly ["skills", "systemPrompt"];
17
29
  export declare function apply(ctx: Context, config?: Config): void;
18
30
  declare const _default: {
19
31
  name: string;
20
- inject: readonly ["skills", "systemPrompt", "webServer"];
21
- Config: Schema<PonytailConfig>;
32
+ inject: readonly ["skills", "systemPrompt"];
33
+ Config: Schema<Schemastery.ObjectS<NoInfer<{
34
+ providerName: Schema<string, string, "defined">;
35
+ skillDir: Schema<string, string, "plain">;
36
+ defaultMode: Schema<"full" | "off" | "lite" | "ultra", "full" | "off" | "lite" | "ultra", "volatile">;
37
+ disabledSkills: Schema<NoInfer<string[]>, NoInfer<string[]>, "volatile">;
38
+ skillDescriptionLang: Schema<"zh" | "en", "zh" | "en", "volatile-defined">;
39
+ }>>, Schemastery.ObjectT<NoInfer<{
40
+ providerName: Schema<string, string, "defined">;
41
+ skillDir: Schema<string, string, "plain">;
42
+ defaultMode: Schema<"full" | "off" | "lite" | "ultra", "full" | "off" | "lite" | "ultra", "volatile">;
43
+ disabledSkills: Schema<NoInfer<string[]>, NoInfer<string[]>, "volatile">;
44
+ skillDescriptionLang: Schema<"zh" | "en", "zh" | "en", "volatile-defined">;
45
+ }>>, "plain">;
22
46
  apply: typeof apply;
23
47
  };
24
48
  export default _default;
@@ -1 +1 @@
1
- {"version":3,"file":"ponytail.d.ts","sourceRoot":"","sources":["../src/ponytail.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAKlD,OAAO,MAAM,MAAM,0BAA0B,CAAA;AAE7C,OAAO,EAKL,KAAK,cAAc,EACpB,MAAM,sBAAsB,CAAA;AAY7B,MAAM,MAAM,MAAM,GAAG,cAAc,CAAA;AAEnC,eAAO,MAAM,MAAM,EAAE,MAAM,CAAC,MAAM,CAOhC,CAAA;AAMF,eAAO,MAAM,IAAI,aAAa,CAAA;AAC9B,eAAO,MAAM,MAAM,kDAAmD,CAAA;AAmBtE,wBAAgB,KAAK,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,GAAE,MAAqB,GAAG,IAAI,CAoPvE;;;;;;;AAED,wBAA8C"}
1
+ {"version":3,"file":"ponytail.d.ts","sourceRoot":"","sources":["../src/ponytail.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAKH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAKlD,OAAO,MAAM,MAAM,0BAA0B,CAAA;AAE7C,OAAO,EAML,KAAK,cAAc,EACpB,MAAM,sBAAsB,CAAA;AAkB7B,MAAM,MAAM,MAAM,GAAG,cAAc,CAAA;AAInC,eAAO,MAAM,MAAM;;;;;;;;;;;;aAmBjB,CAAA;AAMF,eAAO,MAAM,IAAI,aAAa,CAAA;AAC9B,eAAO,MAAM,MAAM,qCAAsC,CAAA;AA0DzD,wBAAgB,KAAK,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,GAAE,MAAqB,GAAG,IAAI,CAoSvE;;;;;;;;;;;;;;;;;;;AAED,wBAA8C"}
package/lib/ponytail.js CHANGED
@@ -7,29 +7,45 @@
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, readConfigFileText, writeDefaultMode, } from './ponytail-config.js';
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, readSkillMeta } 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
- // 从而 shadow 掉 config.json 的 defaultMode 档;缺省时由 apply 走
25
- // resolvePriority()(env > patch > config 文件 > full,见 ponytail-priority.ts)
26
- defaultMode: Schema.union(['off', 'lite', 'full', 'ultra']),
28
+ // 从而让补丁的缺省与显式写入不可区分(诊断面板会失去判别力);缺省时由 apply 走
29
+ // resolvePriority()(env > patch > full,见 ponytail-priority.ts)
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(),
40
+ // 技能描述下发给模型目录与面板的语言。带默认值 zh:它不参与优先级链,
41
+ // 填默认值没有 shadow 代价,而面板需要区分「显式选了 en」与「没配过」。
42
+ skillDescriptionLang: Schema.union(['zh', 'en']).default('zh').volatile(),
27
43
  });
28
44
  // ---------------------------------------------------------------------------
29
45
  // 插件元信息
30
46
  // ---------------------------------------------------------------------------
31
47
  export const name = 'ponytail';
32
- export const inject = ['skills', 'systemPrompt', 'webServer'];
48
+ export const inject = ['skills', 'systemPrompt'];
33
49
  // ---------------------------------------------------------------------------
34
50
  // 工具函数(与 superpowers 同款健壮版)
35
51
  // ---------------------------------------------------------------------------
@@ -43,6 +59,41 @@ function resolveDefaultSkillDir(configSkillDir) {
43
59
  return resolve('skills');
44
60
  }
45
61
  }
62
+ /**
63
+ * 读一个可能不存在、且未在 inject 里声明的服务。
64
+ *
65
+ * 为什么不能用属性读:cordis 的 ctx 是 Proxy,读未 inject 的属性会抛
66
+ * cannot get property settings without inject(cordis/lib/index.js:676),而不是返回 undefined。
67
+ * 所以服务在不在只能靠 try/catch 判断——这也正是无 profileContext 的组合
68
+ * (headless / CLI,dsh-base 的 settings 行被 disabled 表达式关掉)需要文件回退通道的原因。
69
+ *
70
+ * 为什么不用 ctx.inject([settings], …):inject 让 fiber 等这个服务,
71
+ * 而 headless 组合里它永不出现,插件将永远不挂载(连提示词与技能都没有了)。
72
+ */
73
+ function readService(ctx, name) {
74
+ try {
75
+ return ctx[name];
76
+ }
77
+ catch {
78
+ return undefined;
79
+ }
80
+ }
81
+ /**
82
+ * 建立可持久化配置的读写通道。
83
+ *
84
+ * 有 settings 服务时走官方路径:写入落到 profile 补丁(profiles/<name>/cordis.patch.yml),
85
+ * 由宿主的 configForms 承载表单与 revision 冲突保护。
86
+ * 没有时(headless / CLI —— dsh-base 的 settings 行在无 profileContext 时禁用)
87
+ * 回退 config.json 文件通道,那些组合仍然可以改配置。
88
+ */
89
+ function createSinkFor(ctx, profileDir) {
90
+ try {
91
+ return createSettingsSink({ settings: readService(ctx, 'settings') }, 'ponytail', { logger: { warn: (msg) => ctx.logger.warn(msg) } });
92
+ }
93
+ catch {
94
+ return createFileSink(profileDir);
95
+ }
96
+ }
46
97
  // ---------------------------------------------------------------------------
47
98
  // 插件入口
48
99
  // ---------------------------------------------------------------------------
@@ -52,64 +103,79 @@ export function apply(ctx, config = {}) {
52
103
  const resolved = {
53
104
  providerName: rawConfig['providerName'] ?? 'ponytail',
54
105
  ...(rawConfig['skillDir'] !== undefined ? { skillDir: rawConfig['skillDir'] } : {}),
106
+ // 两个 volatile 字段原样透传:真实运行时它们是引用,读侧经 readVolatile 取值;
107
+ // 测试与 mock 宿主可能传裸值,readVolatile 两种都认。
108
+ ...(rawConfig['defaultMode'] !== undefined
109
+ ? { defaultMode: rawConfig['defaultMode'] }
110
+ : {}),
111
+ ...(rawConfig['disabledSkills'] !== undefined
112
+ ? { disabledSkills: rawConfig['disabledSkills'] }
113
+ : {}),
114
+ ...(rawConfig['skillDescriptionLang'] !== undefined
115
+ ? { skillDescriptionLang: rawConfig['skillDescriptionLang'] }
116
+ : {}),
55
117
  };
118
+ // 配置通道:有 settings 服务走官方路径(写入落 profile 补丁,由官方表单承载);
119
+ // 无 settings 服务的组合(headless / CLI —— dsh-base 的 settings 行在无 profileContext 时禁用)
120
+ // 静默回退 config.json 文件通道,不能因迁移而让这些组合失去配置能力。
121
+ const settingsService = readService(ctx, 'settings');
122
+ // profile 目录来自宿主的 profileContext 服务(runProfile 在整棵插件树挂载前 provide,
123
+ // 见 dsh/lib/profile-boot 的 hostCtx.provide('profileContext', ...))。
124
+ // 它把配置与 flag 的作用域收回单个实例:resolveDshHome() 结构上不含 profile 维度,
125
+ // 落在 $DSH_HOME/ponytail 下的文件被所有实例共享,多实例并存时互相覆盖。
126
+ // 读不到时(mock 宿主 / 裁剪宿主)退回全局路径,行为与旧版一致。
127
+ const profileContext = readService(ctx, 'profileContext');
128
+ const profileDir = typeof profileContext?.dir === 'string' ? profileContext.dir : undefined;
129
+ const configSink = createSinkFor(ctx, profileDir);
56
130
  // 优先级唯一真源(ADR-0006):apply 启动判定与 UI 诊断链共用 resolvePriority,
57
- // env > patch(cordis 显式声明)> config.json > full,逐级 normalizeMode 归一。
131
+ // env > patch(cordis 显式声明)> full,逐级 normalizeMode 归一。
58
132
  // 旧判定把未归一的 patch 值直接 state.set()(大小写/非法值注入垃圾态),此处一并修复。
59
133
  const envRaw = process.env['PONYTAIL_DEFAULT_MODE'];
60
134
  if (envRaw && !normalizeMode(envRaw)) {
61
135
  // ponytail: env 非法值静默回退与上游一致,此处 warn 为 DSH 差分(不改变回退语义),便于定位配置错误
62
136
  ctx.logger.warn(`[ponytail] PONYTAIL_DEFAULT_MODE 值无效(回退后续来源):${envRaw}`);
63
137
  }
64
- let patchMode = rawConfig['defaultMode'];
65
- // 读取 config.json 的 defaultMode 原始值:区分「字段缺失」与「文件损坏」交给诊断链统一标注
66
- // (initialMode 判定与 HTTP 诊断链共用同一份,必须先于 initialMode 定义)
67
- const readRawConfigMode = () => {
68
- try {
69
- const raw = readConfigFileText();
70
- if (raw === null)
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
- }
138
+ // profile 补丁里的 defaultMode 是 volatile 引用:启动时读一次,之后每次求值都重读,
139
+ // 因此官方表单改动后立刻反映到优先级链,无需重启。命令层写入的乐观值暂存 patchOverride,
140
+ // 收到 loader/volatile-update 的 defaultMode 后清掉。
141
+ let patchOverride;
142
+ const readPatchMode = () => {
143
+ const fromConfig = readVolatile(resolved.defaultMode);
144
+ return patchOverride ?? fromConfig;
79
145
  };
80
146
  const initialMode = resolvePriority({
81
147
  envRaw,
82
- patchMode,
83
- configMode: readRawConfigMode(),
148
+ patchMode: readPatchMode(),
84
149
  }).effective;
85
150
  const skillDir = resolveDefaultSkillDir(resolved.skillDir);
86
- // 官方设置通道:注册 ponytail 命名空间(与官方 shell、dsh-context 同款),插件页据此 serve 配置表单。
87
- // 用 ctx.inject 动态探测而非写进 inject 数组——桌面版未装配 settings 服务时静默降级,不影响其余能力。
88
- // 守卫与 webServer 同款:ctx.inject 缺失(精简宿主或 mock)时整段跳过,不阻断插件其余能力。
89
- if (typeof ctx.inject === 'function') {
90
- ctx.inject(['settings'], (sctx) => {
91
- const service = sctx.settings;
92
- if (typeof service?.register !== 'function')
93
- return;
94
- service.register('ponytail', Config);
95
- // 真源仍在 config.json(ADR-0005):设置表单写入的档位在启动时对齐回来,
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}`);
151
+ // 一次性把 config.json 的两个字段导入 profile 补丁,然后改名旧文件使其幂等。
152
+ // 官方做法同款:dsh-settings 导入退役的 settings.yaml 时先改名再逐 section 写入
153
+ // (dsh-settings/lib/index.js:346-363)。导入失败只 warn,不阻断启动。
154
+ if (settingsService !== undefined && settingsService !== null) {
155
+ void migrateLegacyConfig({
156
+ settings: settingsService,
157
+ namespace: 'ponytail',
158
+ readLegacy: () => readFullConfig(profileDir),
159
+ renameLegacy: async () => {
160
+ try {
161
+ await rename(getSharedConfigPath(), `${getSharedConfigPath()}.imported`);
104
162
  }
105
- }
106
- ctx.logger.info('[ponytail] 设置命名空间已注册: ponytail');
163
+ catch {
164
+ // 旧文件不存在或改名失败:数据仍在 profile 侧,下个版本移除兼容读取时无需处理
165
+ }
166
+ },
167
+ logger: {
168
+ info: (msg) => ctx.logger.info(msg),
169
+ warn: (msg) => ctx.logger.warn(msg),
170
+ },
171
+ }).catch((err) => {
172
+ ctx.logger.warn(`[ponytail] 旧配置迁移失败(不影响启动):${String(err)}`);
107
173
  });
108
174
  }
109
175
  // 等级状态唯一归属:get()/set()/syncFromFile() 三方法,闭包态随 HMR 重建
110
- const state = createPonytailState();
176
+ const state = createPonytailState({ sink: configSink, storage: createDiskStorage(profileDir) });
111
177
  // 会话启动对齐(对齐上游 ponytail-activate.js SessionStart 语义):
112
- // 每次会话启动都按 resolvePriority()(env > patch > config 文件 > full)重写 flag,
178
+ // 每次会话启动都按 resolvePriority()(env > patch > full)重写 flag,
113
179
  // 因此 /ponytail <档> 只在本会话生效,跨会话持久化必须用 /ponytail default <档>。
114
180
  state.set(initialMode === 'off' ? null : initialMode);
115
181
  if (state.get()) {
@@ -131,6 +197,9 @@ export function apply(ctx, config = {}) {
131
197
  // 同步过滤。此前从未传入,UI 改开关对模型侧目录无效(静默失效,跨会话仍放行)。
132
198
  // 失效闭环:POST 变更点直调 invalidateSkills() → providerInstance.invalidate() → 宿主重扫。
133
199
  isSkillEnabled: (name) => state.isSkillEnabled(name),
200
+ // 描述语言每次现读 volatile 引用:官方表单改完经 loader/volatile-update 就地更新引用,
201
+ // 闭包化读取让下一次 list/get 立刻拿到新语言(配合下方监听里的 invalidate 生效)。
202
+ getDescriptionLang: () => readVolatile(resolved.skillDescriptionLang) ?? 'zh',
134
203
  });
135
204
  return providerInstance;
136
205
  });
@@ -143,6 +212,67 @@ export function apply(ctx, config = {}) {
143
212
  anyCtx.on('skills/change', (..._args) => {
144
213
  ctx.logger.debug('[ponytail] 技能目录已变更');
145
214
  });
215
+ // 官方 volatile 提交的通知:宿主 loader 把 profile 补丁里的新值就地写进本进程引用后
216
+ // 派发本事件(cordis-plugin-loader/lib/index.js:420,事件只在插件自己的 fiber 上广播)。
217
+ // 两件事必须在这里收敛,否则都是静默失效:
218
+ // - disabledSkills 变了但技能目录不失效 → 模型侧目录仍列着已禁用的技能;
219
+ // - 命令层的乐观默认值不清理 → 面板写的新值被陈旧缓存压住,永远不生效。
220
+ anyCtx.on('loader/volatile-update', (...args) => {
221
+ const [paths] = args;
222
+ if (!Array.isArray(paths))
223
+ return;
224
+ const touched = new Set(paths.map((segment) => String(segment)));
225
+ if (touched.has('disabledSkills')) {
226
+ state.reloadDisabledSkills();
227
+ try {
228
+ providerInstance?.invalidate();
229
+ }
230
+ catch {
231
+ // 失效失败不阻断:宿主会保留旧缓存到下次自然失效,用户看得见 UI 与模型侧不一致
232
+ }
233
+ ctx.logger.debug('[ponytail] 技能启用状态已变更,技能目录已失效');
234
+ }
235
+ if (touched.has('defaultMode')) {
236
+ patchOverride = undefined;
237
+ ctx.logger.debug('[ponytail] 默认档已由 profile 补丁提交,乐观缓存已清除');
238
+ }
239
+ // 描述语言变了但目录不失效,模型侧仍读旧语言的描述(面板经 remote 能看到新值,
240
+ // 两侧因此不一致):与 disabledSkills 同一条失效路径。
241
+ if (touched.has('skillDescriptionLang')) {
242
+ try {
243
+ providerInstance?.invalidate();
244
+ }
245
+ catch {
246
+ // 同上:失效失败不阻断,宿主会保留旧缓存到下次自然失效
247
+ }
248
+ ctx.logger.debug('[ponytail] 技能描述语言已变更,技能目录已失效');
249
+ }
250
+ });
251
+ // 只读推导值走官方 Typert 通道(命名空间 ponytail):优先级诊断链与当前生效等级
252
+ // 不是配置——它们由 env / profile 补丁 / 兜底三层合并得出,写进配置层
253
+ // 会让落盘值永久盖住真值。浏览器侧经 ctx.remote.ponytail.snapshot() 读取。
254
+ // 直接挂载:服务随插件 fiber 失效自动注销,不需要额外 disposer。
255
+ // 守卫与 settings 同款:精简宿主或 mock 上 ctx.plugin 可能不存在,
256
+ // 缺失时快照通道不可用(客户端降级为不显示优先级段),但不得掀翻其余能力。
257
+ if (typeof ctx.plugin === 'function') {
258
+ ctx.plugin(PonytailRemote, {
259
+ snapshot: () => {
260
+ const skillLang = readVolatile(resolved.skillDescriptionLang) ?? 'zh';
261
+ return {
262
+ currentMode: state.get() ?? 'off',
263
+ priority: resolvePriority({
264
+ envRaw: process.env['PONYTAIL_DEFAULT_MODE'],
265
+ patchMode: readPatchMode(),
266
+ }),
267
+ skillLang,
268
+ skills: readSkillMeta(skillLang),
269
+ };
270
+ },
271
+ });
272
+ }
273
+ else {
274
+ ctx.logger.debug('[ponytail] 宿主无 ctx.plugin,远程快照通道未挂载(优先级面板将降级)');
275
+ }
146
276
  // Always-on 注入:systemPrompt section,order 50 位于 persona(0) 之后
147
277
  const systemPrompt = ctx.systemPrompt;
148
278
  systemPrompt.section({
@@ -164,21 +294,20 @@ export function apply(ctx, config = {}) {
164
294
  state,
165
295
  logger: ctx.logger,
166
296
  // 默认档唯一真源(ADR-0007 修订 ADR-0006):命令层的「兜底切默认档」与 apply 启动判定、
167
- // UI 面板 defaultMode 共用 resolvePriority().effective(env > patch > config > full)。
297
+ // UI 面板 defaultMode 共用 resolvePriority().effective(env > patch > full)。
168
298
  // 修复前未注入此闭包 → 落到 ponytail-config.getDefaultMode()(无 patch 层),
169
299
  // 当 cordis.patch.yml 显式声明 defaultMode 时,/ponytail foobar 会把等级从 patch 档切到 config 档(静默不一致)。
170
300
  // 必须传实时闭包而非快照:/ponytail default <档> 写盘后,下一次命令解析要读到新值。
171
301
  getDefaultMode: () => resolvePriority({
172
302
  envRaw,
173
- patchMode,
174
- configMode: readRawConfigMode(),
303
+ patchMode: readPatchMode(),
175
304
  }).effective,
176
305
  // /ponytail default <档> 写盘后更新 patchMode:用户最新意图覆盖宿主声明,
177
306
  // UI 快照与命令兜底同刻读新值(修复评审发现的静默 ignore)
178
307
  updateDefaultMode: (mode) => {
179
- patchMode = mode;
308
+ patchOverride = mode;
180
309
  },
181
- writeDefaultMode,
310
+ writeDefaultMode: (mode) => configSink.writeDefaultMode(mode),
182
311
  });
183
312
  // 监听 agent/pre-step waterfall:模型请求前的最后拦截点(对齐上游 UserPromptSubmit)
184
313
  // 必须 return next(),否则短路下游
@@ -237,37 +366,6 @@ export function apply(ctx, config = {}) {
237
366
  ctx.logger.warn(`[ponytail] agent/created 处理失败:${String(err)}`);
238
367
  }
239
368
  });
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
369
  // 清理:HMR 卸载时自动通过 ctx 逆序清理所有注册;额外标记
272
370
  ctx.effect(() => {
273
371
  return () => {
@@ -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,kBAAkB,EAClB,gBAAgB,GAEjB,MAAM,sBAAsB,CAAA;AAC7B,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA;AACxD,OAAO,EAAE,wBAAwB,EAAE,MAAM,oBAAoB,CAAA;AAC7D,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAA;AAChE,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAA;AAChE,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAA;AACzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAA;AAQvD,MAAM,CAAC,MAAM,MAAM,GAAmB,MAAM,CAAC,MAAM,CAAC;IAClD,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,UAAU,CAAC;IACjD,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE;IACzB,4DAA4D;IAC5D,uDAAuD;IACvD,2EAA2E;IAC3E,WAAW,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;CAC5D,CAAC,CAAA;AAEF,8EAA8E;AAC9E,QAAQ;AACR,8EAA8E;AAE9E,MAAM,CAAC,MAAM,IAAI,GAAG,UAAU,CAAA;AAC9B,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,QAAQ,EAAE,cAAc,EAAE,WAAW,CAAU,CAAA;AAEtE,8EAA8E;AAC9E,4BAA4B;AAC5B,8EAA8E;AAE9E,SAAS,sBAAsB,CAAC,cAAuB;IACrD,IAAI,cAAc;QAAE,OAAO,OAAO,CAAC,cAAc,CAAC,CAAA;IAClD,IAAI,CAAC;QACH,OAAO,aAAa,CAAC,IAAI,GAAG,CAAC,WAAW,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAA;IAC7D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,OAAO,CAAC,QAAQ,CAAC,CAAA;IAC1B,CAAC;AACH,CAAC;AAED,8EAA8E;AAC9E,OAAO;AACP,8EAA8E;AAE9E,MAAM,UAAU,KAAK,CAAC,GAAY,EAAE,SAAiB,EAAY;IAC/D,IAAI,gBAAgB,GAA4B,IAAI,CAAA;IAEpD,MAAM,SAAS,GAAG,MAAiC,CAAA;IACnD,MAAM,QAAQ,GAAW;QACvB,YAAY,EAAG,SAAS,CAAC,cAAc,CAAwB,IAAI,UAAU;QAC7E,GAAG,CAAC,SAAS,CAAC,UAAU,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,SAAS,CAAC,UAAU,CAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC9F,CAAA;IAED,0DAA0D;IAC1D,oEAAoE;IACpE,uDAAuD;IACvD,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAA;IACnD,IAAI,MAAM,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,EAAE,CAAC;QACrC,gEAAgE;QAChE,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,gDAAgD,MAAM,EAAE,CAAC,CAAA;IAC3E,CAAC;IACD,IAAI,SAAS,GAAG,SAAS,CAAC,aAAa,CAAuB,CAAA;IAC9D,4DAA4D;IAC5D,sDAAsD;IACtD,MAAM,iBAAiB,GAAG,GAAuB,EAAE;QACjD,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,kBAAkB,EAAE,CAAA;YAChC,IAAI,GAAG,KAAK,IAAI;gBAAE,OAAO,SAAS,CAAA;YAClC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAA4B,CAAA;YACzD,MAAM,EAAE,GAAG,MAAM,CAAC,aAAa,CAAC,CAAA;YAChC,OAAO,OAAO,EAAE,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAA;QAChD,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,SAAS,CAAA;QAClB,CAAC;IACH,CAAC,CAAA;IACD,MAAM,WAAW,GAAG,eAAe,CAAC;QAClC,MAAM;QACN,SAAS;QACT,UAAU,EAAE,iBAAiB,EAAE;KAChC,CAAC,CAAC,SAAS,CAAA;IAEZ,MAAM,QAAQ,GAAG,sBAAsB,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAA;IAE1D,sEAAsE;IACtE,oEAAoE;IACpE,6DAA6D;IAC7D,IAAI,OAAQ,GAAuC,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;QAC1E,GAAG,CAAC,MAAM,CAAC,CAAC,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,EAAE;YAChC,MAAM,OAAO,GAAI,IAEf,CAAC,QAAQ,CAAA;YACX,IAAI,OAAO,OAAO,EAAE,QAAQ,KAAK,UAAU;gBAAE,OAAM;YACnD,OAAO,CAAC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC,CAAA;YACpC,gDAAgD;YAChD,4BAA4B;YAC5B,oDAAoD;YACpD,IAAI,OAAO,OAAO,CAAC,GAAG,KAAK,UAAU,EAAE,CAAC;gBACtC,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,UAAU,CAAgD,CAAA;gBACrF,MAAM,IAAI,GAAG,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,aAAa,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;gBAC3E,IAAI,IAAI,IAAI,IAAI,KAAK,iBAAiB,EAAE,EAAE,CAAC;oBACzC,gBAAgB,CAAC,IAAI,CAAC,CAAA;oBACtB,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,yCAAyC,IAAI,EAAE,CAAC,CAAA;gBAClE,CAAC;YACH,CAAC;YACD,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAA;QACnD,CAAC,CAAC,CAAA;IACJ,CAAC;IAED,sDAAsD;IACtD,MAAM,KAAK,GAAG,mBAAmB,EAAE,CAAA;IACnC,qDAAqD;IACrD,qEAAqE;IACrE,4DAA4D;IAC5D,KAAK,CAAC,GAAG,CAAC,WAAW,KAAK,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC,CAAA;IAErD,IAAI,KAAK,CAAC,GAAG,EAAE,EAAE,CAAC;QAChB,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,uBAAuB,KAAK,CAAC,GAAG,EAAE,cAAc,QAAQ,GAAG,CAAC,CAAA;IAC9E,CAAC;SAAM,CAAC;QACN,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,wCAAwC,CAAC,CAAA;IAC3D,CAAC;IAED,IAAI,QAAQ,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,EAAE,CAAC;QACvC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,0CAA0C,QAAQ,EAAE,CAAC,CAAA;IACvE,CAAC;IAED,qEAAqE;IACrE,MAAM,MAAM,GAAI,GAA8H,CAAC,MAAM,CAAA;IACrJ,MAAM,CAAC,gBAAgB,CAAC,CAAC,OAAO,EAAE,EAAE;QAClC,gBAAgB,GAAG,IAAI,gBAAgB,CAAC,GAAG,EAAE,OAAO,EAAE;YACpD,YAAY,EAAE,QAAQ,CAAC,YAAY,IAAI,UAAU;YACjD,QAAQ;YACR,qEAAqE;YACrE,2CAA2C;YAC3C,6EAA6E;YAC7E,cAAc,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,cAAc,CAAC,IAAI,CAAC;SACrD,CAAC,CAAA;QACF,OAAO,gBAAgB,CAAA;IACzB,CAAC,CAAC,CAAA;IAEF,qCAAqC;IACrC,MAAM,MAAM,GAAG,GAA2F,CAAA;IAE1G,oEAAoE;IACpE,oEAAoE;IACpE,4CAA4C;IAC5C,8DAA8D;IAC9D,MAAM,CAAC,EAAE,CAAC,eAAe,EAAE,CAAC,GAAG,KAAgB,EAAE,EAAE;QACjD,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAA;IACxC,CAAC,CAAC,CAAA;IAEF,8DAA8D;IAC9D,MAAM,YAAY,GAAI,GAAyI,CAAC,YAAY,CAAA;IAC5K,YAAY,CAAC,OAAO,CAAC;QACnB,IAAI,EAAE,UAAU;QAChB,KAAK,EAAE,EAAE;QACT,IAAI,EAAE,GAAG,EAAE;YACT,uCAAuC;YACvC,IAAI,CAAC;gBACH,KAAK,CAAC,oBAAoB,EAAE,CAAA;YAC9B,CAAC;YAAC,MAAM,CAAC;gBACP,SAAS;YACX,CAAC;YACD,OAAO,mBAAmB,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAA;QAC7C,CAAC;KACF,CAAC,CAAA;IAEF,oCAAoC;IACpC,MAAM,UAAU,GAAG,uBAAuB,CAAC;QACzC,KAAK;QACL,MAAM,EAAE,GAAG,CAAC,MAAM;QAClB,0DAA0D;QAC1D,iFAAiF;QACjF,8DAA8D;QAC9D,0FAA0F;QAC1F,sDAAsD;QACtD,cAAc,EAAE,GAAG,EAAE,CACnB,eAAe,CAAC;YACd,MAAM;YACN,SAAS;YACT,UAAU,EAAE,iBAAiB,EAAE;SAChC,CAAC,CAAC,SAAS;QACd,sDAAsD;QACtD,oCAAoC;QACpC,iBAAiB,EAAE,CAAC,IAAI,EAAE,EAAE;YAC1B,SAAS,GAAG,IAAI,CAAA;QAClB,CAAC;QACD,gBAAgB;KACjB,CAAC,CAAA;IAEF,iEAAiE;IACjE,0BAA0B;IAC1B,MAAM,CAAC,EAAE,CACP,gBAAgB,EAChB,KAAK,EAAE,GAAG,IAAe,EAAE,EAAE;QAC3B,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,GAAG,IAAyE,CAAA;QACjG,IAAI,CAAC;YACH,UAAU,CAAC,gBAAgB,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAA;QAChD,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACtB,mDAAmD;YACnD,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,qDAAqD,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;QACrF,CAAC;QACD,OAAO,CAAC,MAAM,IAAI,EAAE,CAAgD,CAAA;IACtE,CAAC,CACF,CAAA;IAED,6DAA6D;IAC7D,qDAAqD;IACrD,MAAM,CAAC,EAAE,CAAC,eAAe,EAAE,CAAC,GAAG,IAAe,EAAE,EAAE;QAChD,IAAI,CAAC;YACH,MAAM,CAAC,QAAQ,EAAE,KAAK,CAAC,GAAG,IAAiE,CAAA;YAC3F,IAAI,KAAK,EAAE,IAAI,KAAK,cAAc;gBAAE,OAAM;YAC1C,UAAU,CAAC,eAAe,CAAC,KAAK,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;QACjD,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACtB,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,iCAAiC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;QACjE,CAAC;IACH,CAAC,CAAC,CAAA;IAEF,iEAAiE;IACjE,MAAM,kBAAkB,GAAG,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAA;IACnE,IAAI,UAAU,GAAkB,IAAI,CAAA;IACpC,IAAI,kBAAkB,EAAE,CAAC;QACvB,IAAI,CAAC;YACH,UAAU,GAAG,IAAI,MAAM,CAAC,kBAAkB,EAAE,GAAG,CAAC,CAAA;QAClD,CAAC;QAAC,MAAM,CAAC;YACP,UAAU,GAAG,IAAI,CAAA;YACjB,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,6CAA6C,kBAAkB,EAAE,CAAC,CAAA;QACpF,CAAC;IACH,CAAC;IAED,8CAA8C;IAC9C,iHAAiH;IACjH,gHAAgH;IAChH,MAAM,CAAC,EAAE,CAAC,eAAe,EAAE,CAAC,GAAG,IAAe,EAAE,EAAE;QAChD,IAAI,CAAC;YACH,MAAM,CAAC,OAAO,CAAC,GAAG,IAAoD,CAAA;YACtE,IAAI,UAAU,EAAE,CAAC;gBACf,GAAG,CAAC,MAAM,CAAC,KAAK,CACd,sBAAsB,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,UAAU,kBAAkB,EAAE,CAC7E,CAAA;YACH,CAAC;YACD,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS,IAAI,OAAO,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;gBAChE,uCAAuC;gBACvC,KAAK,CAAC,UAAU,EAAE,CAAA;gBAClB,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,mBAAmB,OAAO,CAAC,MAAM,iBAAiB,KAAK,CAAC,GAAG,EAAE,EAAE,CAAC,CAAA;YACnF,CAAC;QACH,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACtB,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,iCAAiC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;QACjE,CAAC;IACH,CAAC,CAAC,CAAA;IAGF,8EAA8E;IAC9E,8EAA8E;IAC9E,mDAAmD;IACnD,yDAAyD;IACzD,IAAK,GAAW,CAAC,SAAS,EAAE,CAAC;QAC3B,GAAG,CAAC,MAAM,CAAC,GAAG,EAAE;YACd,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,sDAAsD,CAAC,CAAA;YACvE,OAAQ,GAAW,CAAC,SAAS,CAAC,QAAQ,CAAC;gBACrC,IAAI,EAAE,OAAO;gBACb,IAAI,EAAE,8BAA8B;gBACpC,OAAO,EAAE,wBAAwB,CAAC;oBAChC,KAAK;oBACL,iBAAiB;oBACjB,gBAAgB,EAAE,GAAG,EAAE;wBACrB,IAAI,gBAAgB,EAAE,CAAC;4BACrB,IAAI,CAAC;gCACH,gBAAgB,CAAC,UAAU,EAAE,CAAA;4BAC/B,CAAC;4BAAC,MAAM,CAAC;gCACP,OAAO;4BACT,CAAC;wBACH,CAAC;oBACH,CAAC;oBACD,aAAa,EAAE,GAAG,EAAE,CAAC,SAAS;oBAC9B,MAAM,EAAE,GAAG,CAAC,MAAM;oBAClB,UAAU,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC;oBACtD,QAAQ;iBACT,CAAC;aACH,CAAC,CAAA;QACJ,CAAC,EAAE,qBAAqB,CAAC,CAAA;IAC3B,CAAC;IAED,mCAAmC;IACnC,GAAG,CAAC,MAAM,CAAC,GAAG,EAAE;QACd,OAAO,GAAG,EAAE;YACV,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,yCAAyC,CAAC,CAAA;QAC5D,CAAC,CAAA;IACH,CAAC,CAAC,CAAA;AACJ,CAAC;AAED,eAAe,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,CAAA"}
1
+ {"version":3,"file":"ponytail.js","sourceRoot":"","sources":["../src/ponytail.ts"],"names":[],"mappings":"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"}