dsh-plugin-prompt-tool 0.6.1 → 0.6.2

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/README.md CHANGED
@@ -50,12 +50,19 @@ dsh --profile prompt-tool # 首次启
50
50
  | 锚定 | `firstTurnAnchor` `firstTurnCustom` `firstTurnText` `firstTurnWord` `firstTurnBuild` `firstTurnInspect` `firstTurnDeep` |
51
51
  | 引导 | `guideCustom` `guideText` `guideComplexPattern` `guideWeak` `guideDeep` `buildPattern` `complexPattern` |
52
52
  | PTC/门控 | `usePtcMode` `bootstrapMaxTokens` `injectPrompt` `allowKinds` |
53
- | 主对话模型 | `modelProvider` `modelName` `modelReasoningEffort` `modelTemperature` `modelMaxTokens` |
54
- | 子代理模型 | `subagentModelProvider` `subagentModelName` `subagentReasoningEffort` `subagentTemperature` `subagentMaxTokens` |
55
53
  | 人设 | 模块列表的 `persona-main`(system-section + `deployment:persona`,complete 互斥 + suppressRuntimeContext);`subagentPersona`(子代理显式,缺省经 scope 链继承主会话) |
56
54
  | 工具集 | `toolFilterAllow` `toolFilterDeny`(子代理 toolFilter;主对话 tool-filter 模块共用) |
57
55
  | 深度 | `maxDepth`(0 禁止委派 / `provider-managed` / 正整数) |
58
56
 
57
+ 模型参数在 **preset.yml 顶层 `model` / `subagentModel` 段**(官方 `agent-default-model` 同构):
58
+
59
+ | 段 | 键 |
60
+ |---|---|
61
+ | `model`(主对话) | `provider` `name` `reasoningEffort` `temperature` `maxTokens` |
62
+ | `subagentModel`(子代理固定路由) | `provider` `name` `reasoningEffort` `temperature` `maxTokens` |
63
+
64
+ 读取时顶层段展平进 params 扁平键(`modelProvider` 等),旧扁平键双读兼容;保存时写顶层段并清理旧键(保存即迁移)。
65
+
59
66
  > 根目录 **`preset.yml`** 是配置参数齐全、逐项注释的完整模板,复制即得自定义预设起点。
60
67
 
61
68
  ## 提示词配置(六层全家桶)
package/lib/index.d.mts CHANGED
@@ -198,6 +198,10 @@ interface PresetSpec {
198
198
  composition?: string;
199
199
  /** 扁平参数:全部直读(true/false、数字、字符串),on/off 作为兼容写法。 */
200
200
  params?: Record<string, unknown>;
201
+ /** 顶层模型段(主对话,官方 agent-default-model 同构):provider/name/reasoningEffort/temperature/maxTokens。 */
202
+ model?: Record<string, unknown>;
203
+ /** 顶层子代理模型段:provider/name/reasoningEffort/temperature/maxTokens。 */
204
+ subagentModel?: Record<string, unknown>;
201
205
  /** 预设级模板变量({{key}} 插值源;与引擎行为参数 params 分离,顶层 variables 段)。 */
202
206
  variables?: Record<string, string>;
203
207
  /** 模板变量插值开关(缺省 true = 启用;false = 停用,writePreset 不生成变量文件)。 */
package/lib/index.mjs CHANGED
@@ -1,4 +1,4 @@
1
- import { C as userPresetsDir, D as DEFAULT_SKILLS_DIR, E as DEFAULT_RESIDENT_AGENTS_PATH, O as LEGACY_CONTAINER_DIR, S as savePresetParams, T as DEFAULT_PRESET_DIR, _ as readPluginState, a as asString, b as resolvePresetDir, c as duplicateUserPreset, d as listPresets, f as loadPresetContent, g as parseImportedPresetId, h as packageEngineDir, i as applyModuleConfigs, k as LEGACY_USER_PRESETS_DIR, l as ensurePresetSeed, m as openPresetLocation, n as mergePromptConfigs, o as assertCompositionArray, p as loadPresetSpec, r as renderPromptConfigYaml, s as cloneBuiltinPreset, t as loadPromptConfigFiles, u as listBuiltinTemplates, v as removeUserPreset, w as writePluginState, x as resolvePresetParams, y as renderComposition } from "./prompt-configs-ThS4iXPg.mjs";
1
+ import { C as userPresetsDir, D as DEFAULT_SKILLS_DIR, E as DEFAULT_RESIDENT_AGENTS_PATH, O as LEGACY_CONTAINER_DIR, S as savePresetParams, T as DEFAULT_PRESET_DIR, _ as readPluginState, a as asString, b as resolvePresetDir, c as duplicateUserPreset, d as listPresets, f as loadPresetContent, g as parseImportedPresetId, h as packageEngineDir, i as applyModuleConfigs, k as LEGACY_USER_PRESETS_DIR, l as ensurePresetSeed, m as openPresetLocation, n as mergePromptConfigs, o as assertCompositionArray, p as loadPresetSpec, r as renderPromptConfigYaml, s as cloneBuiltinPreset, t as loadPromptConfigFiles, u as listBuiltinTemplates, v as removeUserPreset, w as writePluginState, x as resolvePresetParams, y as renderComposition } from "./prompt-configs-BgFw_bFf.mjs";
2
2
  import { settingsNamespace } from "@deepseek-ai/dsh-settings";
3
3
  import { appendFileSync, cpSync, existsSync, mkdirSync, mkdtempSync, readFileSync, readdirSync, renameSync, rmSync, statSync, watch, writeFileSync } from "node:fs";
4
4
  import { parse, parseDocument, stringify } from "yaml";
@@ -1,4 +1,4 @@
1
- import { n as mergePromptConfigs, o as assertCompositionArray, p as loadPresetSpec, r as renderPromptConfigYaml, t as loadPromptConfigFiles, y as renderComposition } from "./prompt-configs-ThS4iXPg.mjs";
1
+ import { n as mergePromptConfigs, o as assertCompositionArray, p as loadPresetSpec, r as renderPromptConfigYaml, t as loadPromptConfigFiles, y as renderComposition } from "./prompt-configs-BgFw_bFf.mjs";
2
2
  import { fileURLToPath } from "node:url";
3
3
  //#region src/preset-core.ts
4
4
  /**
@@ -84,6 +84,28 @@ function loadPresetSpec(dir) {
84
84
  const parsed = parse(raw, { logLevel: "silent" });
85
85
  if (parsed === null || typeof parsed !== "object") throw new Error(`preset ${join(dir, "preset.yml")} is not a YAML map`);
86
86
  if (typeof parsed.id !== "string" || parsed.id.length === 0) parsed.id = basename(dir);
87
+ const flattenModelGroup = (source, mapping) => {
88
+ if (source === null || typeof source !== "object" || Array.isArray(source)) return;
89
+ if (parsed.params === null || typeof parsed.params !== "object" || Array.isArray(parsed.params)) parsed.params = {};
90
+ for (const [segmentKey, flatKey] of Object.entries(mapping)) {
91
+ const value = source[segmentKey];
92
+ if (value !== void 0) parsed.params[flatKey] = value;
93
+ }
94
+ };
95
+ flattenModelGroup(parsed.model, {
96
+ provider: "modelProvider",
97
+ name: "modelName",
98
+ reasoningEffort: "modelReasoningEffort",
99
+ temperature: "modelTemperature",
100
+ maxTokens: "modelMaxTokens"
101
+ });
102
+ flattenModelGroup(parsed.subagentModel, {
103
+ provider: "subagentModelProvider",
104
+ name: "subagentModelName",
105
+ reasoningEffort: "subagentReasoningEffort",
106
+ temperature: "subagentTemperature",
107
+ maxTokens: "subagentMaxTokens"
108
+ });
87
109
  return parsed;
88
110
  }
89
111
  /** 读取预设模板内容资产(presetText / agentsText);模板缺失时静默降级。
@@ -363,12 +385,28 @@ function openPresetLocation(id, presetRoot = userPresetsDir()) {
363
385
  * 通道残留——参数已并入 preset.yml,避免旧值覆盖新值)。
364
386
  */
365
387
  function savePresetParams(presetRoot, templateName, params, promptConfigs, variables, variablesEnabled) {
388
+ const MODEL_KEY_MAP = {
389
+ modelProvider: ["model", "provider"],
390
+ modelName: ["model", "name"],
391
+ modelReasoningEffort: ["model", "reasoningEffort"],
392
+ modelTemperature: ["model", "temperature"],
393
+ modelMaxTokens: ["model", "maxTokens"],
394
+ subagentModelProvider: ["subagentModel", "provider"],
395
+ subagentModelName: ["subagentModel", "name"],
396
+ subagentReasoningEffort: ["subagentModel", "reasoningEffort"],
397
+ subagentTemperature: ["subagentModel", "temperature"],
398
+ subagentMaxTokens: ["subagentModel", "maxTokens"]
399
+ };
366
400
  const file = join(presetRoot, templateName, "preset.yml");
367
401
  if (!existsSync(file)) throw new Error(`preset ${templateName} 无 preset.yml`);
368
402
  const doc = parseDocument(readFileSync(file, "utf8"), { logLevel: "silent" });
369
403
  if (params !== void 0) for (const [key, value] of Object.entries(params)) {
370
404
  if (value === void 0 || value === null || key.trim().length === 0) continue;
371
- doc.setIn(["params", key], value);
405
+ const segment = MODEL_KEY_MAP[key];
406
+ if (segment !== void 0) {
407
+ doc.setIn([segment[0], segment[1]], value);
408
+ doc.deleteIn(["params", key]);
409
+ } else doc.setIn(["params", key], value);
372
410
  }
373
411
  if (promptConfigs !== void 0) {
374
412
  const cleaned = promptConfigs.map((config) => {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dsh-plugin-prompt-tool",
3
- "version": "0.6.1",
3
+ "version": "0.6.2",
4
4
  "description": "DSH 插件:提示词工具,规范模型的思维链与回答内容,提供 Web UI 编辑 preset.md 与 AGENTS.md,并按 skills 目录注册可开关技能。",
5
5
  "license": "MIT",
6
6
  "repository": {