dsh-plugin-prompt-tool 0.5.0 → 0.6.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 (37) hide show
  1. package/README.md +18 -12
  2. package/engine/anchor-match.mjs +117 -0
  3. package/engine/compositions/library/context-gate.yml +2 -2
  4. package/engine/compositions/library/delegation.yml +2 -2
  5. package/engine/compositions/library/str-replace-editor.yml +1 -1
  6. package/engine/compositions/library/tool-bootstrap.yml +2 -2
  7. package/engine/compositions/library/tool-filter.yml +3 -3
  8. package/engine/compositions/source/local/context-gate.yml +2 -2
  9. package/engine/compositions/source/local/tool-bootstrap.yml +3 -3
  10. package/engine/executor.mjs +9 -2
  11. package/engine/interpolate.mjs +66 -0
  12. package/engine/layers.mjs +26 -22
  13. package/engine/schema.mjs +18 -0
  14. package/engine/session-vars.mjs +52 -0
  15. package/engine/shared.mjs +0 -19
  16. package/engine/strategies.mjs +28 -38
  17. package/lib/client.js +471 -162
  18. package/lib/client.js.map +1 -1
  19. package/lib/index.d.mts +35 -9
  20. package/lib/index.mjs +376 -92
  21. package/lib/preset-core.d.mts +2 -2
  22. package/lib/preset-core.mjs +3 -6
  23. package/lib/{prompt-configs-BcP6miu9.d.mts → prompt-configs-B4vH09wx.d.mts} +1 -3
  24. package/lib/{prompt-configs-k7wuZs0C.mjs → prompt-configs-ThS4iXPg.mjs} +85 -33
  25. package/package.json +105 -104
  26. package/preset/anchored/preset.yml +40 -42
  27. package/preset/creative/preset.yml +33 -30
  28. package/preset/creative/skills/cordis-plugin-development/SKILL.md +420 -0
  29. package/preset/creative/skills/editing-cordis-compositions/SKILL.md +165 -0
  30. package/preset/liangshen/preset.yml +24 -18
  31. package/preset/minimal/preset.yml +27 -24
  32. package/preset/ptc/preset.yml +23 -17
  33. package/preset/standard/preset.yml +23 -17
  34. package/templates/20-system-section.yml +5 -0
  35. package/engine/compositions/library/router-first-turn.yml +0 -9
  36. package/engine/compositions/source/local/router-first-turn.yml +0 -5
  37. package/engine/router-first-turn.mjs +0 -85
package/lib/client.js CHANGED
@@ -85,7 +85,6 @@ window.__ModuleLoader__.load({
85
85
  subagentReasoningEffort: "",
86
86
  subagentTemperature: "",
87
87
  subagentMaxTokens: "",
88
- mainPersona: "",
89
88
  subagentPersona: "",
90
89
  toolFilterAllow: "",
91
90
  toolFilterDeny: "",
@@ -212,7 +211,6 @@ window.__ModuleLoader__.load({
212
211
  subagentReasoningEffort: readString(value, "subagentReasoningEffort") ?? readString(base, "subagentReasoningEffort") ?? "",
213
212
  subagentTemperature: readString(value, "subagentTemperature") ?? readString(base, "subagentTemperature") ?? "",
214
213
  subagentMaxTokens: readString(value, "subagentMaxTokens") ?? readString(base, "subagentMaxTokens") ?? "",
215
- mainPersona: "",
216
214
  subagentPersona: "",
217
215
  toolFilterAllow: "",
218
216
  toolFilterDeny: "",
@@ -405,6 +403,8 @@ window.__ModuleLoader__.load({
405
403
  const [templatePreStepCount, setTemplatePreStepCount] = (0, react.useState)(0);
406
404
  const [savedSwitches, setSavedSwitches] = (0, react.useState)(EMPTY_SWITCHES);
407
405
  const [savedConfigs, setSavedConfigs] = (0, react.useState)([]);
406
+ const [templateVariables, setTemplateVariables] = (0, react.useState)({});
407
+ const [templateVariablesEnabled, setTemplateVariablesEnabled] = (0, react.useState)(true);
408
408
  const [loading, setLoading] = (0, react.useState)(false);
409
409
  const [savingSkillsDir, setSavingSkillsDir] = (0, react.useState)(false);
410
410
  const [fixingSkill, setFixingSkill] = (0, react.useState)(void 0);
@@ -491,7 +491,6 @@ window.__ModuleLoader__.load({
491
491
  if (typeof o.subagentMaxTokens === "string") paramPatch.subagentMaxTokens = o.subagentMaxTokens;
492
492
  if (typeof o.usePtcMode === "boolean") paramPatch.usePtcMode = o.usePtcMode;
493
493
  if (typeof o.injectPrompt === "boolean") paramPatch.injectPrompt = o.injectPrompt;
494
- if (typeof o.mainPersona === "string") paramPatch.mainPersona = o.mainPersona;
495
494
  if (typeof o.subagentPersona === "string") paramPatch.subagentPersona = o.subagentPersona;
496
495
  if (Array.isArray(o.toolFilterAllow)) paramPatch.toolFilterAllow = o.toolFilterAllow.join(", ");
497
496
  else if (typeof o.toolFilterAllow === "string") paramPatch.toolFilterAllow = o.toolFilterAllow;
@@ -512,6 +511,12 @@ window.__ModuleLoader__.load({
512
511
  setSavedSwitches(snapshotSwitches(next));
513
512
  }
514
513
  }
514
+ const varsRes = await bridgePost("/preset-variables", {});
515
+ if (seq !== loadSeqRef.current) return EMPTY_FIELDS;
516
+ if (varsRes.ok && varsRes.value.variables !== null && typeof varsRes.value.variables === "object") {
517
+ setTemplateVariables(varsRes.value.variables);
518
+ setTemplateVariablesEnabled(varsRes.value.enabled !== false);
519
+ }
515
520
  const configsRes = await bridgePost("/prompt-configs", {});
516
521
  if (seq !== loadSeqRef.current) return EMPTY_FIELDS;
517
522
  if (configsRes.ok && Array.isArray(configsRes.value.promptConfigs) && configsRes.value.promptConfigs.length > 0) {
@@ -549,10 +554,26 @@ window.__ModuleLoader__.load({
549
554
  } catch {}
550
555
  }, [settings]);
551
556
  const patch = (0, react.useCallback)((partial) => {
552
- const next = {
557
+ let next = {
553
558
  ...fieldsRef.current,
554
559
  ...partial
555
560
  };
561
+ if (Array.isArray(next.promptConfigs)) {
562
+ const activeComplete = (config) => config.enabled !== false && config.params?.complete === true;
563
+ if (next.promptConfigs.some(activeComplete)) {
564
+ const kept = next.promptConfigs.findIndex(activeComplete);
565
+ next = {
566
+ ...next,
567
+ promptConfigs: next.promptConfigs.map((config, index) => index === kept || config.enabled === false ? config : {
568
+ ...config,
569
+ params: {
570
+ ...config.params,
571
+ complete: false
572
+ }
573
+ })
574
+ };
575
+ }
576
+ }
556
577
  fieldsRef.current = next;
557
578
  setFields(next);
558
579
  }, []);
@@ -658,7 +679,6 @@ window.__ModuleLoader__.load({
658
679
  ...f.subagentReasoningEffort.trim().length > 0 ? { subagentReasoningEffort: f.subagentReasoningEffort } : {},
659
680
  ...f.subagentTemperature.trim().length > 0 ? { subagentTemperature: f.subagentTemperature } : {},
660
681
  ...f.subagentMaxTokens.trim().length > 0 ? { subagentMaxTokens: f.subagentMaxTokens } : {},
661
- ...f.mainPersona.trim().length > 0 ? { mainPersona: f.mainPersona } : {},
662
682
  ...f.subagentPersona.trim().length > 0 ? { subagentPersona: f.subagentPersona } : {},
663
683
  toolFilterAllow: splitList(f.toolFilterAllow),
664
684
  toolFilterDeny: splitList(f.toolFilterDeny),
@@ -693,6 +713,23 @@ window.__ModuleLoader__.load({
693
713
  } else showNotice("error", "提示词配置保存失败:" + (res.message ?? "settings bridge unavailable"));
694
714
  })();
695
715
  }, [load, showNotice]);
716
+ /** 模板变量:写激活预设 preset.yml 内容变量(后端 savePresetParams + afterOverridesChange 触发重建)。 */
717
+ const saveTemplateVariables = (0, react.useCallback)(async (next) => {
718
+ const cleaned = Object.fromEntries(Object.entries(next ?? templateVariables).filter(([key]) => key.trim().length > 0));
719
+ const res = await bridgePost("/preset-variables", {
720
+ variables: cleaned,
721
+ enabled: templateVariablesEnabled
722
+ });
723
+ if (!res.ok) {
724
+ showNotice("error", `模板变量保存失败:${res.message ?? "未知错误"}`);
725
+ return;
726
+ }
727
+ setTemplateVariables(cleaned);
728
+ }, [
729
+ templateVariables,
730
+ templateVariablesEnabled,
731
+ showNotice
732
+ ]);
696
733
  const toggle = (0, react.useCallback)((key) => {
697
734
  patch({ [key]: !fieldsRef.current[key] });
698
735
  if (PARAM_SWITCH_KEYS.has(key)) persistParamOverrides();
@@ -842,6 +879,11 @@ window.__ModuleLoader__.load({
842
879
  persistSwitches,
843
880
  persistParamOverrides,
844
881
  persistConfigs,
882
+ templateVariables,
883
+ setTemplateVariables,
884
+ templateVariablesEnabled,
885
+ setTemplateVariablesEnabled,
886
+ saveTemplateVariables,
845
887
  toggle,
846
888
  toggleBootstrapMaxTokens,
847
889
  setPresetTemplate,
@@ -861,7 +903,7 @@ window.__ModuleLoader__.load({
861
903
  }
862
904
  //#endregion
863
905
  //#region \0dsh-css:E:\Documents\GitHub\dsh-plugin-prompt-tool\src\client\PromptUi.module.css.mjs
864
- const css$1 = ":root{--pt-accent:var(--dsw-alias-state-business-primary,#1783ff);--pt-chip-model:#1d4ed8;--pt-chip-error:#b91c1c;--pt-chip-off:#6b7280;--pt-on-chip:#fff;--pt-z-modal:100}.YcFama_visuallyHidden{clip:rect(0 0 0 0);clip-path:inset(50%);white-space:nowrap;width:1px;height:1px;position:absolute;overflow:hidden}.YcFama_pageShell{width:100%;min-width:0;max-width:760px}.YcFama_page{box-sizing:border-box;width:100%;min-width:0;color:var(--dsw-alias-label-primary);flex-direction:column;gap:28px;padding-bottom:28px;font-family:inherit;display:flex}.YcFama_page *,.YcFama_page :before,.YcFama_page :after,.YcFama_pageShell *,.YcFama_pageShell :before,.YcFama_pageShell :after{box-sizing:border-box}.YcFama_page button,.YcFama_page input,.YcFama_page select,.YcFama_page textarea,.YcFama_pageShell button,.YcFama_pageShell input,.YcFama_pageShell select,.YcFama_pageShell textarea{color:inherit;font:inherit}.YcFama_loading{min-height:140px;color:var(--dsw-alias-label-tertiary);text-align:center;margin:0;font-size:13px;line-height:140px}.YcFama_pageHeader{flex-wrap:wrap;justify-content:space-between;align-items:flex-start;gap:18px;min-width:0;animation:.3s cubic-bezier(.22,1,.36,1) both YcFama_pt-rise;display:flex}.YcFama_pageHeader h1,.YcFama_pageHeader h2{color:var(--dsw-alias-label-primary);letter-spacing:-.01em;margin:0;padding-left:14px;font-size:17px;font-weight:600;line-height:24px;position:relative}.YcFama_pageHeader h1:before,.YcFama_pageHeader h2:before{content:\"\";background:linear-gradient(180deg, var(--pt-accent), color-mix(in srgb, var(--pt-accent) 35%, transparent));width:4px;box-shadow:0 0 12px color-mix(in srgb, var(--pt-accent) 45%, transparent);border-radius:999px;position:absolute;top:4px;bottom:4px;left:0}.YcFama_pageHeader p{max-width:64ch;color:var(--dsw-alias-label-tertiary);margin:8px 0 0;font-size:14px;line-height:22px}.YcFama_section{flex-direction:column;gap:12px;min-width:0;animation:.32s cubic-bezier(.22,1,.36,1) both YcFama_pt-rise;display:flex}.YcFama_subagentConfigs,.YcFama_configsStack{margin-top:12px}.YcFama_sectionHeading{border:1px solid var(--dsw-alias-border-l2);background:linear-gradient(180deg, color-mix(in srgb, var(--pt-accent) 5%, transparent), transparent 60%), var(--dsw-alias-bg-layer-3);border-radius:12px;flex-wrap:wrap;justify-content:space-between;align-items:flex-start;gap:18px;min-width:0;padding:10px 14px;display:flex}.YcFama_sectionHeading>div{flex:1;min-width:0}.YcFama_sectionHeading h2{color:var(--dsw-alias-label-primary);letter-spacing:-.005em;margin:0;font-size:14px;font-weight:600;line-height:22px}.YcFama_sectionHeading h2:after{content:\"\";background:color-mix(in srgb, var(--pt-accent) 70%, transparent);width:5px;height:5px;box-shadow:0 0 8px color-mix(in srgb, var(--pt-accent) 55%, transparent);border-radius:50%;margin:0 0 2px 7px;display:inline-block}.YcFama_sectionHeading p{max-width:66ch;color:var(--dsw-alias-label-tertiary);margin:1px 0 0;font-size:12px;line-height:18px}.YcFama_sectionActions{flex-wrap:wrap;flex:none;justify-content:flex-end;align-items:center;gap:8px;margin-left:auto;display:flex}.YcFama_importBar{border:1px solid color-mix(in srgb, var(--pt-accent) 16%, var(--dsw-alias-border-l2));background:radial-gradient(120% 180% at 100% 0%, color-mix(in srgb, var(--pt-accent) 8%, transparent), transparent 42%), var(--dsw-alias-bg-layer-2);border-radius:12px;grid-template-columns:minmax(160px,1fr) auto auto;align-items:center;gap:10px;min-width:0;padding:10px 12px;display:grid}.YcFama_importBar>div{min-width:0;display:grid}.YcFama_importBar strong{text-overflow:ellipsis;white-space:nowrap;font-size:12px;font-weight:600;line-height:18px;overflow:hidden}.YcFama_importBar small{color:var(--dsw-alias-label-tertiary);font-size:10px;line-height:15px}.YcFama_importBar .YcFama_configInput{min-width:220px;height:36px}.YcFama_importMenuHost{display:inline-flex;position:relative}.YcFama_assetTabs{gap:4px;margin-bottom:10px;display:flex}.YcFama_assetTabs button{background:var(--dsw-alias-fill-field,transparent);cursor:pointer;border:0;border-radius:999px;padding:4px 10px;font-size:12px;line-height:18px}.YcFama_assetTabs button[data-active]{background:var(--dsw-alias-state-business-primary,currentColor);color:var(--dsw-alias-text-on-accent,#fff)}.YcFama_modalBackdrop{z-index:var(--pt-z-modal);background:#0000006b;place-items:center;display:grid;position:fixed;inset:0}.YcFama_templateModal{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-3);border-radius:14px;flex-direction:column;width:min(440px,92vw);max-height:72vh;display:flex;overflow:hidden;box-shadow:0 14px 44px #00000052}.YcFama_templateModalHead{border-bottom:1px solid var(--dsw-alias-border-l1);justify-content:space-between;align-items:center;gap:10px;padding:12px 16px;display:flex}.YcFama_templateModalList{gap:8px;padding:10px;display:grid;overflow-y:auto}.YcFama_templateModalItem{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-2);color:var(--dsw-alias-label-primary);font:inherit;text-align:left;cursor:pointer;border-radius:12px;flex-direction:column;gap:3px;padding:12px 14px;display:flex}.YcFama_templateModalItem strong{letter-spacing:-.005em;overflow-wrap:anywhere;font-size:13px;font-weight:600;line-height:1.5}.YcFama_templateModalItem small{color:var(--dsw-alias-label-tertiary);overflow-wrap:anywhere;font-size:12px;line-height:1.5}.YcFama_templateModalItem:hover{border-color:color-mix(in srgb, var(--pt-accent) 28%, var(--dsw-alias-border-l2));box-shadow:0 8px 22px -16px color-mix(in srgb, var(--pt-accent) 50%, transparent);transform:translateY(-1px)}.YcFama_templateModalItem:focus-visible{outline:2px solid color-mix(in srgb, var(--pt-accent) 45%, var(--dsw-alias-border-l2));outline-offset:2px}.YcFama_pillButton,.YcFama_primaryPill,.YcFama_actions button{appearance:none;box-sizing:border-box;border:1px solid var(--dsw-alias-border-l2);height:36px;color:var(--dsw-alias-label-primary);background:var(--dsw-alias-fill-field,var(--dsw-alias-bg-layer-3));cursor:pointer;white-space:nowrap;border-radius:18px;justify-content:center;align-items:center;gap:4px;padding:0 14px;font-size:14px;line-height:22px;transition:transform .14s,background-color .14s,border-color .14s,box-shadow .14s;display:inline-flex}.YcFama_pillButton:hover:not(:disabled),.YcFama_actions button:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover-solid)}.YcFama_pillButton:active:not(:disabled),.YcFama_primaryPill:active:not(:disabled),.YcFama_actions button:active:not(:disabled){transform:translateY(1px)}.YcFama_pillButton:disabled,.YcFama_primaryPill:disabled,.YcFama_actions button:disabled{cursor:default;opacity:.4}.YcFama_primaryPill,.YcFama_save{color:var(--dsw-alias-label-primary-foreground)!important;background:var(--dsw-alias-button-primary-fill)!important;border-color:#0000!important}.YcFama_primaryPill:hover:not(:disabled),.YcFama_save:hover:not(:disabled){background:var(--dsw-alias-button-primary-hover)!important}.YcFama_primaryPill:not(:disabled),.YcFama_save:not(:disabled){box-shadow:0 6px 18px -10px color-mix(in srgb, var(--pt-accent) 85%, transparent)}.YcFama_pillButton[data-danger]{color:var(--dsw-alias-state-error-primary);border-color:color-mix(in srgb, var(--dsw-alias-state-error-primary) 34%, var(--dsw-alias-border-l2))}.YcFama_pillButton[data-danger]:hover:not(:disabled){border-color:color-mix(in srgb, var(--dsw-alias-state-error-primary) 54%, var(--dsw-alias-border-l2));background:color-mix(in srgb, var(--dsw-alias-state-error-primary) 8%, transparent)}.YcFama_settingRow,.YcFama_toggleRow{border-top:1px solid var(--dsw-alias-border-l2);justify-content:space-between;align-items:center;gap:18px;min-width:0;min-height:62px;padding:11px 0;display:flex;position:relative}.YcFama_settingRowStack{border-top:1px solid var(--dsw-alias-border-l2);flex-direction:column;align-items:stretch;gap:8px;min-width:0;padding:11px 0;display:flex}.YcFama_settingRowStack .YcFama_directoryControl{flex:auto;max-width:none}.YcFama_settingCopy{flex-direction:column;flex:1;min-width:0;display:flex}.YcFama_settingCopy strong{color:var(--dsw-alias-label-primary);font-size:14px;font-weight:500;line-height:21px}.YcFama_settingCopy small{color:var(--dsw-alias-label-tertiary);font-size:11px;line-height:17px}.YcFama_settingCopy code{font-family:var(--ds-font-family-code,ui-monospace, monospace)}.YcFama_activePath{width:fit-content;max-width:100%;color:var(--dsw-alias-label-secondary);background:var(--dsw-alias-bg-layer-2);font-family:var(--ds-font-family-code,ui-monospace, monospace);text-overflow:ellipsis;white-space:nowrap;border-radius:6px;margin-top:4px;padding:2px 7px;font-size:11px;line-height:17px;overflow:hidden}.YcFama_directoryControl{flex:0 460px;align-items:center;gap:8px;min-width:0;max-width:62%;display:flex}.YcFama_directoryInput{border:1px solid var(--dsw-alias-border-l2);width:100%;min-width:0;height:38px;color:var(--dsw-alias-label-primary);background:var(--dsw-alias-bg-layer-3);font-family:var(--ds-font-family-code,ui-monospace, monospace);border-radius:10px;outline:none;padding:0 11px;font-size:12px;line-height:20px}.YcFama_directoryInput::placeholder{color:var(--dsw-alias-label-caption)}.YcFama_directoryInput:disabled{cursor:default;opacity:.46}.YcFama_bootstrapTokensInput{box-sizing:border-box;border:1px solid var(--dsw-alias-border-l2);width:108px;height:38px;color:var(--dsw-alias-label-primary);background:var(--dsw-alias-bg-layer-3);font-family:var(--ds-font-family-code,ui-monospace, monospace);text-align:right;border-radius:10px;outline:none;flex:none;padding:0 10px;font-size:12px}.YcFama_bootstrapTokensInput:disabled{cursor:default;opacity:.46}.YcFama_rowGroup{border-bottom:1px solid var(--dsw-alias-border-l2)}.YcFama_section>.YcFama_rowGroup+.YcFama_rowGroup .YcFama_toggleRow:first-child,.YcFama_section>.YcFama_rowGroup+.YcFama_rowGroup .YcFama_textBlock:first-child{border-top:0}.YcFama_toggleRow{cursor:pointer}.YcFama_toggleRow:first-child{border-top:1px solid var(--dsw-alias-border-l2)}.YcFama_toggleRow:has(input:disabled){cursor:default;opacity:.46}.YcFama_rowDisabled{opacity:.55}.YcFama_skillCardList{flex-direction:column;gap:8px;min-width:0;display:flex}.YcFama_skillCard{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-3);border-radius:12px;align-items:center;gap:8px;min-width:0;padding:9px 12px;transition:border-color .16s,box-shadow .16s,opacity .16s;display:flex;position:relative}.YcFama_skillCard:hover{border-color:color-mix(in srgb, var(--pt-accent) 28%, var(--dsw-alias-border-l2))}.YcFama_skillCard[data-dragging]{opacity:.4}.YcFama_skillCard[data-nested]{margin-left:26px}.YcFama_skillCard[data-nested]:before{content:\"\";background:color-mix(in srgb, var(--pt-accent) 22%, var(--dsw-alias-border-l2));width:1px;position:absolute;top:0;bottom:0;left:-13px}.YcFama_skillCard[data-drop-before]{box-shadow:0 -2px 0 0 var(--pt-accent)}.YcFama_skillCard[data-drop-after]{box-shadow:0 2px 0 0 var(--pt-accent)}.YcFama_skillCard[data-selected]{border-color:color-mix(in srgb, var(--pt-accent) 55%, var(--dsw-alias-border-l2));box-shadow:0 0 0 2px color-mix(in srgb, var(--pt-accent) 16%, transparent)}.YcFama_skillCardList[data-dragging] .YcFama_skillCard{transition:none}.YcFama_skillCard:has(.YcFama_skillSwitch input:disabled) .YcFama_switch{opacity:.55}.YcFama_skillNestedMark{width:20px;height:20px;color:var(--dsw-alias-label-tertiary);background:var(--dsw-alias-bg-layer-2);border-radius:50%;flex:none;place-items:center;font-size:10px;line-height:1;display:grid}.YcFama_skillRowInvalid .YcFama_skillCardBody{opacity:.55}.YcFama_skillRowInvalid .YcFama_dragHandle{opacity:.4;cursor:not-allowed}.YcFama_skillRowInvalid .YcFama_switch{opacity:.55}.YcFama_duplicateBadge{border:1px solid color-mix(in srgb, var(--pt-chip-error) 36%, var(--dsw-alias-border-l2));color:var(--dsw-alias-state-error-primary,#d5484d);background:color-mix(in srgb, var(--pt-chip-error) 7%, transparent);white-space:nowrap;border-radius:999px;flex:none;align-items:center;padding:1px 8px;font-size:10px;font-weight:650;line-height:16px;display:inline-flex}.YcFama_dirCardList{flex-direction:column;gap:8px;min-width:0;display:flex}.YcFama_presetGrid{grid-template-columns:repeat(auto-fill,minmax(268px,1fr));grid-auto-rows:1fr;gap:12px;min-width:0;margin-top:2px;display:grid}.YcFama_presetCard{background:var(--dsw-alias-bg-layer-3);border:1px solid #0000;border-radius:12px;flex-direction:column;min-width:0;transition:border-color .16s,box-shadow .16s,transform .16s,background .16s;display:flex}.YcFama_presetCard:hover:not([data-active]){box-shadow:0 8px 22px -16px color-mix(in srgb, var(--pt-accent) 50%, transparent);transform:translateY(-1px)}.YcFama_presetCard[data-active]{background:color-mix(in srgb, var(--pt-accent) 6%, var(--dsw-alias-bg-layer-3));box-shadow:0 0 0 2px color-mix(in srgb, var(--pt-accent) 45%, transparent)}.YcFama_presetCardMain{min-width:0;font:inherit;color:inherit;text-align:left;cursor:pointer;background:0 0;border:0;border-radius:12px 12px 0 0;flex-direction:column;flex:1;gap:8px;padding:14px 16px 12px;display:flex}.YcFama_presetCardMain:disabled{cursor:default;opacity:.6}.YcFama_presetCardMain:focus-visible{outline:2px solid var(--dsw-alias-brand-primary);outline-offset:-2px}.YcFama_presetCardBody{border-radius:12px 12px 0 0;flex-direction:column;flex:1;gap:8px;min-width:0;padding:14px 16px 12px;display:flex}.YcFama_presetCardHead{align-items:center;gap:8px;min-width:0;display:flex}.YcFama_presetCardName{color:var(--dsw-alias-label-primary);overflow-wrap:anywhere;min-width:0;font-size:15px;font-weight:600;line-height:1.4}.YcFama_presetCardId{color:var(--dsw-alias-label-dimmed);font-family:var(--dsw-font-mono,ui-monospace, SFMono-Regular, Menlo, monospace);overflow-wrap:anywhere;margin-top:auto;font-size:11px;line-height:1.5}.YcFama_presetCardDesc{min-height:42px;color:var(--dsw-alias-label-secondary);overflow-wrap:anywhere;-webkit-line-clamp:4;-webkit-box-orient:vertical;margin:0;font-size:13px;line-height:1.55;display:-webkit-box;overflow:hidden}.YcFama_presetCardFooter{border-top:1px solid var(--dsw-alias-border-l2);flex-wrap:wrap;justify-content:flex-end;align-items:center;gap:4px;min-width:0;padding:6px 10px;display:flex}.YcFama_presetCardActions{align-items:center;gap:6px;display:flex}.YcFama_presetInUse{background:var(--pt-accent);color:var(--pt-on-chip);white-space:nowrap;border-radius:999px;flex:none;margin-left:auto;padding:1px 8px;font-size:11px;font-weight:500;line-height:17px}.YcFama_presetCardFooter .YcFama_pillButton{border-radius:14px;height:28px;padding:0 10px;font-size:12px;line-height:18px}.YcFama_presetIconButton{appearance:none;color:var(--dsw-alias-label-tertiary);cursor:pointer;background:0 0;border:0;border-radius:7px;align-items:center;padding:6px;display:inline-flex;position:relative}.YcFama_presetIconButton:hover:not(:disabled){background:var(--dsw-alias-bg-layer-1);color:var(--dsw-alias-label-primary)}.YcFama_presetIconButton:focus-visible{outline:2px solid var(--dsw-alias-brand-primary);outline-offset:-1px}.YcFama_presetIconButton:after{content:attr(data-tip);background:var(--dsw-alias-label-primary);color:var(--dsw-alias-bg-layer-3);white-space:nowrap;opacity:0;pointer-events:none;border-radius:6px;padding:3px 8px;font-size:11px;line-height:17px;transition:opacity .12s;position:absolute;bottom:calc(100% + 6px);left:50%;transform:translate(-50%)}.YcFama_presetIconButton:hover:after,.YcFama_presetIconButton:focus-visible:after{opacity:1}.YcFama_dirCard{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-3);border-radius:12px;align-items:center;gap:8px;min-width:0;padding:9px 12px;transition:border-color .16s;display:flex}.YcFama_dirCard[data-invalid]{border-color:color-mix(in srgb, var(--pt-chip-error) 38%, var(--dsw-alias-border-l2))}.YcFama_dirCardBody{flex-direction:column;flex:1;gap:2px;min-width:0;display:flex}.YcFama_dirCardTitle{flex-wrap:wrap;align-items:center;gap:8px;min-width:0;display:flex}.YcFama_dirPath{min-width:0;color:var(--dsw-alias-label-primary);font-family:var(--ds-font-family-code,ui-monospace, monospace);text-overflow:ellipsis;white-space:nowrap;font-size:12px;line-height:1.5;overflow:hidden}.YcFama_dirCardMeta{color:var(--dsw-alias-label-tertiary);font-size:11px;line-height:1.5}.YcFama_dirCardActions{flex-wrap:wrap;flex:none;align-items:center;gap:6px;display:flex}.YcFama_dirCardActions .YcFama_pillButton{height:28px;padding:0 11px;font-size:12px}.YcFama_dirAddBar{flex-wrap:wrap;align-items:center;gap:8px;min-width:0;display:flex}.YcFama_dirAddInput{flex:280px;align-items:center;gap:8px;min-width:0;display:flex}.YcFama_dirAddInput .YcFama_directoryInput{flex:1}.YcFama_listFilterRow{align-items:center;gap:8px;min-width:0;display:flex}.YcFama_listFilterRow .YcFama_listFilter{flex:1;max-width:none}.YcFama_skillRankBadge{border:1px solid var(--dsw-alias-border-l1);width:20px;height:20px;color:var(--dsw-alias-label-secondary);background:var(--dsw-alias-bg-layer-2);font-variant-numeric:tabular-nums;border-radius:50%;flex:none;place-items:center;font-size:10px;font-weight:700;line-height:1;display:grid}.YcFama_skillCardBody{flex-direction:column;flex:1;gap:2px;min-width:0;display:flex}.YcFama_skillCardTitleRow{flex-wrap:wrap;align-items:center;gap:8px;min-width:0;display:flex}.YcFama_skillCardTitleRow strong{color:var(--dsw-alias-label-primary);overflow-wrap:anywhere;font-size:13px;font-weight:600;line-height:1.5}.YcFama_skillCardMeta{color:var(--dsw-alias-label-tertiary);overflow-wrap:anywhere;font-size:11px;line-height:1.5}.YcFama_skillSelect{cursor:pointer;flex:none;align-items:center;display:inline-flex}.YcFama_skillSelect input{width:15px;height:15px;accent-color:var(--pt-accent);cursor:pointer;margin:0}.YcFama_skillSelect input:disabled{cursor:default}.YcFama_skillSwitch{cursor:pointer;flex:none;align-items:center;display:inline-flex}.YcFama_skillOrderButtons{flex-direction:column;flex:none;align-self:center;gap:4px;display:inline-flex}.YcFama_skillOrderButtons .YcFama_pillButton{border-radius:11px;height:22px;padding:0 9px;font-size:12px;line-height:1}.YcFama_skillStats{grid-template-columns:repeat(4,minmax(0,1fr));gap:8px;display:grid}.YcFama_skillStatsRow{align-items:center;gap:10px;margin-bottom:10px;display:flex}.YcFama_skillStatsRow .YcFama_skillStats{flex:1;grid-template-columns:repeat(3,minmax(0,1fr));min-width:0}.YcFama_skillStatsRow>button{flex:none}.YcFama_skillStats button{appearance:none;border:1px solid var(--dsw-alias-border-l2);color:var(--dsw-alias-label-primary);background:var(--dsw-alias-bg-layer-2);font:inherit;cursor:pointer;border-radius:12px;flex-direction:column;align-items:flex-start;gap:2px;padding:9px 11px;transition:border-color .16s,box-shadow .16s,transform .16s;display:flex}.YcFama_skillStats button:hover{border-color:color-mix(in srgb, var(--pt-accent) 30%, var(--dsw-alias-border-l2));transform:translateY(-1px)}.YcFama_skillStats button[data-active]{border-color:color-mix(in srgb, var(--pt-accent) 45%, var(--dsw-alias-border-l2));box-shadow:0 0 0 2px color-mix(in srgb, var(--pt-accent) 18%, transparent)}.YcFama_skillStats strong{font-variant-numeric:tabular-nums;font-size:18px;font-weight:700;line-height:1.1}.YcFama_skillStats small{color:var(--dsw-alias-label-tertiary);font-size:11px;line-height:1.3}.YcFama_skillStatDot{background:var(--chip);border-radius:50%;width:8px;height:8px;margin-bottom:1px}.YcFama_skillStatAll{--chip:var(--dsw-alias-label-tertiary)}.YcFama_selectionCount{color:var(--dsw-alias-label-secondary);white-space:nowrap;flex:none;font-size:12px;font-weight:600;line-height:1.5}.YcFama_listFilterRow .YcFama_pillButton[data-active]{border-color:color-mix(in srgb, var(--pt-accent) 45%, var(--dsw-alias-border-l2));box-shadow:0 0 0 2px color-mix(in srgb, var(--pt-accent) 18%, transparent);color:color-mix(in srgb, var(--pt-accent) 80%, var(--dsw-alias-label-primary));background:color-mix(in srgb, var(--pt-accent) 8%, transparent)}.YcFama_disclosure{border-top:1px solid var(--dsw-alias-border-l2)}.YcFama_disclosure>summary{color:var(--dsw-alias-label-primary);cursor:pointer;align-items:baseline;gap:8px;padding:10px 2px;font-size:13px;font-weight:600;list-style:none;display:flex}.YcFama_disclosure>summary::-webkit-details-marker{display:none}.YcFama_disclosure>summary:before{content:\"▸\";color:var(--dsw-alias-label-tertiary);font-size:11px;transition:transform .18s cubic-bezier(.22,1,.36,1)}.YcFama_disclosure[open]>summary:before{transform:rotate(90deg)}.YcFama_disclosure>summary small{color:var(--dsw-alias-label-tertiary);font-size:11px;font-weight:400}.YcFama_disclosureBody{flex-direction:column;gap:10px;padding:2px 0 6px;display:flex}.YcFama_cardDivider{border-top:1px solid var(--dsw-alias-border-l2);margin:2px 0 10px;padding-top:12px}.YcFama_skillStatusRow{flex-wrap:wrap;flex:none;align-items:center;gap:6px;display:inline-flex}.YcFama_skillStatusChip{border:1px solid var(--chip);color:var(--pt-on-chip);background:var(--chip);white-space:nowrap;text-shadow:0 1px 1px #0000002e;border-radius:999px;align-items:center;gap:5px;padding:3px 9px;font-size:11px;font-weight:650;line-height:16px;display:inline-flex}.YcFama_skillStatusModel{--chip:var(--pt-chip-model)}.YcFama_skillStatusError{--chip:var(--pt-chip-error)}.YcFama_skillStatusOff{--chip:var(--pt-chip-off)}.YcFama_skillStatusDot{background:currentColor;border-radius:50%;flex:none;width:6px;height:6px}.YcFama_skillIssue{overflow-wrap:anywhere;color:var(--dsw-alias-state-error-primary,#d5484d);margin:0;padding-left:2px;font-size:12px;line-height:1.5}.YcFama_dragHandle{width:28px;height:28px;color:var(--dsw-alias-label-tertiary);cursor:grab;letter-spacing:-.04em;user-select:none;background:0 0;border:1px solid #0000;border-radius:8px;flex:none;place-items:center;font-size:15px;transition:color .14s,background-color .14s,border-color .14s,transform .14s;display:grid}.YcFama_skillCard:hover .YcFama_dragHandle{color:var(--pt-accent);border-color:color-mix(in srgb, var(--pt-accent) 22%, var(--dsw-alias-border-l2));background:color-mix(in srgb, var(--pt-accent) 7%, transparent);transform:translateY(-1px)}.YcFama_dragHandle:active{cursor:grabbing;transform:scale(.94)}.YcFama_configEnable{cursor:pointer;align-items:center;gap:10px;display:inline-flex}.YcFama_toggleRow input[type=checkbox],.YcFama_configEnable>input,.YcFama_skillSwitch input{clip:rect(0 0 0 0);clip-path:inset(50%);white-space:nowrap;width:1px;height:1px;position:absolute;overflow:hidden}.YcFama_inlineControls{flex:none;align-items:center;gap:8px;display:flex}.YcFama_switch{background:var(--dsw-alias-bg-layer-2);width:40px;height:24px;box-shadow:inset 0 0 0 1px var(--dsw-alias-border-l2);border-radius:999px;flex:none;transition:background-color .18s cubic-bezier(.22,1,.36,1),box-shadow .18s;display:block;position:relative}.YcFama_switch i{background:var(--dsw-alias-bg-layer-3);width:18px;height:18px;box-shadow:0 1px 3px color-mix(in srgb, var(--dsw-alias-label-primary) 22%, transparent);border-radius:50%;transition:transform .18s cubic-bezier(.22,1,.36,1);position:absolute;top:3px;left:3px}.YcFama_configEnable:hover .YcFama_switch,.YcFama_toggleRow:hover .YcFama_switch,.YcFama_skillSwitch:hover .YcFama_switch{box-shadow:inset 0 0 0 1px color-mix(in srgb, var(--pt-accent) 45%, var(--dsw-alias-border-l2))}.YcFama_toggleRow input:checked+.YcFama_switch,.YcFama_configEnable>input:checked+.YcFama_switch,.YcFama_skillSwitch input:checked+.YcFama_switch{background:var(--pt-accent);box-shadow:none}.YcFama_toggleRow input:checked+.YcFama_switch i,.YcFama_configEnable>input:checked+.YcFama_switch i,.YcFama_skillSwitch input:checked+.YcFama_switch i{transform:translate(16px)}.YcFama_tagInput{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-3);border-radius:10px;flex-wrap:wrap;align-items:center;gap:6px;min-width:0;padding:6px 8px;transition:border-color .14s,box-shadow .14s;display:flex}.YcFama_tagInput:focus-within{border-color:color-mix(in srgb, var(--pt-accent) 55%, var(--dsw-alias-border-l2));box-shadow:0 0 0 2px color-mix(in srgb, var(--pt-accent) 20%, transparent)}.YcFama_tagInput[data-disabled]{opacity:.46}.YcFama_tagChip{border:1px solid color-mix(in srgb, var(--pt-accent) 26%, var(--dsw-alias-border-l2));color:var(--dsw-alias-label-primary);background:color-mix(in srgb, var(--pt-accent) 8%, transparent);white-space:nowrap;border-radius:999px;align-items:center;gap:4px;padding:2px 9px;font-size:11px;line-height:17px;display:inline-flex}.YcFama_tagChipRemove{appearance:none;width:14px;height:14px;color:var(--dsw-alias-label-tertiary);cursor:pointer;background:0 0;border:0;border-radius:50%;place-items:center;padding:0;font-size:12px;line-height:1;display:grid}.YcFama_tagChipRemove:hover{color:var(--dsw-alias-label-primary);background:var(--dsw-alias-interactive-bg-hover-solid)}.YcFama_tagInputField{min-width:90px;color:var(--dsw-alias-label-primary);font:inherit;background:0 0;border:0;outline:none;flex:1;padding:4px 2px;font-size:12px;line-height:18px}.YcFama_tagInputField::placeholder{color:var(--dsw-alias-label-caption)}.YcFama_textBlock{border-top:1px solid var(--dsw-alias-border-l2);flex-direction:column;gap:8px;min-width:0;padding:11px 0;display:flex}.YcFama_firstTurnInput,.YcFama_textarea{field-sizing:content;box-sizing:border-box;border:1px solid var(--dsw-alias-border-l2);width:100%;max-height:60vh;color:var(--dsw-alias-label-primary);background:var(--dsw-specific-input-major,var(--dsw-alias-bg-layer-2));font-family:var(--ds-font-family-code,ui-monospace, monospace);resize:vertical;border-radius:10px;outline:none;padding:9px 11px;font-size:13px;line-height:1.6}.YcFama_firstTurnInput{min-height:84px}.YcFama_textarea{min-height:420px}.YcFama_firstTurnInput:disabled,.YcFama_textarea:disabled{cursor:default;opacity:.55}.YcFama_notice{color:var(--dsw-alias-state-success-primary);overflow-wrap:anywhere;font-size:12px}.YcFama_noticeError{color:var(--dsw-alias-state-error-primary,#d5484d)}.YcFama_configList{flex-direction:column;gap:10px;min-width:0;display:flex}.YcFama_configCardPair{grid-template-columns:repeat(auto-fit,minmax(280px,1fr));gap:10px;display:grid}.YcFama_configCardPair>.YcFama_configCard{min-width:0}.YcFama_configCard{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-3);border-radius:14px;flex-direction:column;transition:border-color .16s,box-shadow .16s,transform .16s;display:flex;overflow:hidden}.YcFama_configCard:hover{border-color:color-mix(in srgb, var(--pt-accent) 28%, var(--dsw-alias-border-l2));box-shadow:0 8px 22px -16px color-mix(in srgb, var(--pt-accent) 50%, transparent);transform:translateY(-1px)}.YcFama_configCardOpen{border-color:color-mix(in srgb, var(--pt-accent) 38%, var(--dsw-alias-border-l2));box-shadow:0 10px 26px -18px color-mix(in srgb, var(--pt-accent) 55%, transparent)}.YcFama_configHeader{flex-wrap:wrap;align-items:center;gap:10px;padding:10px 12px;display:flex}.YcFama_configHeaderActions{flex:none;align-items:center;gap:8px;margin-left:auto;display:flex}.YcFama_configToggle{appearance:none;min-width:160px;font:inherit;color:inherit;text-align:left;cursor:pointer;background:0 0;border:0;flex:1;align-items:center;gap:8px;padding:4px 0;display:flex}.YcFama_configToggle:focus-visible{outline:2px solid var(--dsw-alias-state-business-primary);outline-offset:2px}.YcFama_configTitle{flex-direction:column;flex:1;gap:2px;min-width:0;display:flex}.YcFama_configName{color:var(--dsw-alias-label-primary);overflow-wrap:anywhere;letter-spacing:-.005em;font-size:13px;font-weight:600;line-height:1.5}.YcFama_configMeta{color:var(--dsw-alias-label-tertiary);overflow-wrap:anywhere;font-size:12px;line-height:1.5}.YcFama_chevron{color:var(--dsw-alias-label-tertiary);flex:none;transition:transform .18s cubic-bezier(.22,1,.36,1)}.YcFama_chevronOpen{color:var(--pt-accent);transform:rotate(180deg)}.YcFama_configEnable{cursor:pointer;flex:none;display:inline-flex;position:relative}.YcFama_configActions{flex-wrap:wrap;align-items:center;gap:6px;margin-left:auto;display:flex}.YcFama_configActions .YcFama_pillButton{border-radius:15px;height:30px;padding:0 11px;font-size:12px}.YcFama_configForm{border-top:1px solid color-mix(in srgb, var(--pt-accent) 16%, var(--dsw-alias-border-l2));background:linear-gradient(180deg, color-mix(in srgb, var(--pt-accent) 4%, transparent), transparent 28%), var(--dsw-alias-bg-layer-2);flex-direction:column;gap:10px;padding:12px 14px;display:flex}.YcFama_configBody{background:linear-gradient(180deg, color-mix(in srgb, var(--pt-accent) 4%, transparent), transparent 28%), var(--dsw-alias-bg-layer-2);flex-direction:column;gap:10px;padding:12px 14px;display:flex}.YcFama_configBody .YcFama_rowGroup{border-bottom:0}.YcFama_configBody .YcFama_toggleRow:first-child{border-top:0}.YcFama_configFormToolbar{border-bottom:1px solid color-mix(in srgb, var(--pt-accent) 16%, var(--dsw-alias-border-l2));flex-wrap:wrap;align-items:center;gap:10px;min-width:0;padding-bottom:12px;display:flex}.YcFama_configGrid{flex-wrap:wrap;align-items:flex-end;gap:10px 14px;display:flex}.YcFama_configField{flex-direction:column;gap:4px;min-width:0;display:flex}.YcFama_configFieldLabel{color:var(--dsw-alias-label-primary);font-size:12px;font-weight:500;line-height:1.5}.YcFama_configFieldHint{color:var(--dsw-alias-label-tertiary);margin:0;font-size:12px;line-height:1.5}.YcFama_configFieldStack{flex-direction:column;gap:6px;min-width:0;display:flex}.YcFama_configFieldStack>textarea{margin-top:2px}.YcFama_configInput{box-sizing:border-box;border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-3);max-width:100%;height:34px;font:inherit;color:var(--dsw-alias-label-primary);border-radius:9px;padding:0 8px;font-size:12px;line-height:1.5}.YcFama_configInput:focus-visible{border-color:var(--dsw-alias-state-business-primary);outline:none}.YcFama_configInput:disabled{color:var(--dsw-alias-label-tertiary);cursor:default}.YcFama_configInputError{border-color:var(--dsw-alias-label-error)!important}.YcFama_configTextarea{field-sizing:content;box-sizing:border-box;width:100%;min-height:72px;max-height:60vh;font-family:var(--ds-font-family-code,ui-monospace, monospace);color:var(--dsw-alias-label-primary);background:var(--dsw-specific-input-major,var(--dsw-alias-bg-layer-2));border:1px solid var(--dsw-alias-border-l2);resize:vertical;border-radius:9px;padding:8px 10px;font-size:12px;line-height:1.6}.YcFama_configTextarea:focus-visible{border-color:var(--dsw-alias-state-business-primary);outline:none}.YcFama_configJsonInput{min-height:88px}.YcFama_configJsonError{color:var(--dsw-alias-state-error-primary,#d5484d);font-weight:400}.YcFama_configErrorBox{border:1px solid var(--dsw-alias-label-error);background:var(--dsw-alias-bg-layer-2);border-radius:10px;flex-direction:column;gap:4px;padding:8px 10px;display:flex}.YcFama_configErrorLine{font-family:var(--ds-font-family-code,ui-monospace, monospace);color:var(--dsw-alias-state-error-primary,#d5484d);overflow-wrap:anywhere;font-size:12px;line-height:1.5}.YcFama_emptyState{border:1px dashed color-mix(in srgb, var(--pt-accent) 24%, var(--dsw-alias-border-l2));background:radial-gradient(90% 160% at 50% 0%, color-mix(in srgb, var(--pt-accent) 5%, transparent), transparent 60%), color-mix(in srgb, var(--dsw-alias-bg-layer-1) 50%, transparent);border-radius:13px;justify-content:center;align-items:center;gap:18px;min-height:150px;padding:24px;display:flex}.YcFama_emptyGlyph{border:1px solid color-mix(in srgb, var(--pt-accent) 24%, var(--dsw-alias-border-l1));width:42px;height:42px;color:var(--pt-accent);background:color-mix(in srgb, var(--pt-accent) 6%, var(--dsw-alias-bg-layer-1));box-shadow:0 0 18px -10px color-mix(in srgb, var(--pt-accent) 70%, transparent);border-radius:11px;flex:none;place-items:center;font-size:20px;display:grid}.YcFama_emptyState h3{margin:0 0 5px;font-size:15px;line-height:1.4}.YcFama_emptyState p{max-width:520px;color:var(--dsw-alias-label-tertiary);margin:0;font-size:12px;line-height:1.6}.YcFama_feedback{gap:4px;display:grid}.YcFama_feedback:empty{display:none}.YcFama_feedback p{overflow-wrap:anywhere;margin:0;font-size:12px;line-height:18px}.YcFama_success{color:var(--dsw-alias-state-success-primary)}.YcFama_readOnly{color:var(--dsw-alias-label-tertiary);font-size:12px;line-height:18px}.YcFama_actions{display:none}.YcFama_actionsVisible{border-top:1px solid var(--dsw-alias-border-l2);justify-content:space-between;align-items:center;gap:16px;padding-top:14px;display:flex}.YcFama_actions>span{color:var(--dsw-alias-label-tertiary);font-size:12px;line-height:18px}.YcFama_actions>div{gap:8px;display:flex}.YcFama_pillButton[data-variant=secondary]{border-color:var(--dsw-alias-border-l2);color:var(--dsw-alias-label-primary);background:0 0}.YcFama_listFilterRow{flex-wrap:wrap;align-items:center;gap:8px;min-width:0;display:flex}.YcFama_listFilter{box-sizing:border-box;border:1px solid var(--dsw-alias-border-l2);width:100%;max-width:320px;height:32px;color:var(--dsw-alias-label-primary);background:var(--dsw-alias-bg-layer-3);font:inherit;border-radius:9px;outline:none;padding:0 10px;font-size:12px;line-height:1.5}.YcFama_listFilter:focus-visible{border-color:color-mix(in srgb, var(--pt-accent) 55%, var(--dsw-alias-border-l2));box-shadow:0 0 0 2px color-mix(in srgb, var(--pt-accent) 20%, transparent)}.YcFama_listFilter::placeholder{color:var(--dsw-alias-label-caption)}.YcFama_listFilterRow select.YcFama_listFilter{flex:none;width:auto;max-width:none}.YcFama_batchControls{align-items:center;gap:6px;margin-left:auto;display:flex}.YcFama_batchControls .YcFama_pillButton{border-radius:16px;height:32px;padding:0 12px;font-size:12px;line-height:18px}.YcFama_skeletonStack{gap:10px;padding:2px 0;display:grid}.YcFama_skeletonRow{background:linear-gradient(90deg, var(--dsw-alias-bg-layer-2) 25%, var(--dsw-alias-bg-layer-3) 50%, var(--dsw-alias-bg-layer-2) 75%);background-size:200% 100%;border-radius:11px;height:46px;animation:1.4s linear infinite YcFama_pt-shimmer}@keyframes YcFama_pt-shimmer{0%{background-position:200% 0}to{background-position:-200% 0}}.YcFama_spinner{border:2px solid color-mix(in srgb, currentColor 28%, transparent);border-top-color:currentColor;border-radius:50%;flex:none;width:12px;height:12px;animation:.7s linear infinite YcFama_pt-spin;display:inline-block}@keyframes YcFama_pt-spin{to{transform:rotate(360deg)}}.YcFama_settingsNote{color:var(--dsw-alias-label-tertiary);margin:-14px 0 0;font-size:10px;line-height:16px}.YcFama_settingsNote code{color:var(--dsw-alias-label-secondary);font-family:var(--ds-font-family-code,ui-monospace, monospace)}.YcFama_pillButton:focus-visible,.YcFama_primaryPill:focus-visible,.YcFama_actions button:focus-visible,.YcFama_directoryInput:focus-visible,.YcFama_bootstrapTokensInput:focus-visible,.YcFama_firstTurnInput:focus-visible,.YcFama_textarea:focus-visible,.YcFama_toggleRow input:focus-visible+.YcFama_switch,.YcFama_configEnable>input:focus-visible+.YcFama_switch,.YcFama_skillSwitch input:focus-visible+.YcFama_switch{box-shadow:0 0 0 2px color-mix(in srgb, var(--pt-accent) 45%, transparent);outline:none}@keyframes YcFama_pt-rise{0%{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}@media (width<=620px){.YcFama_page{gap:24px}.YcFama_textarea{min-height:260px}.YcFama_skillStats{grid-template-columns:repeat(2,minmax(0,1fr))}.YcFama_settingRow,.YcFama_toggleRow{flex-direction:column;align-items:stretch;gap:9px}.YcFama_directoryControl{justify-content:space-between;max-width:none}.YcFama_sectionActions{flex-wrap:wrap}.YcFama_importBar{grid-template-columns:minmax(0,1fr) auto}.YcFama_importBar .YcFama_primaryPill,.YcFama_importBar .YcFama_pillButton{grid-column:auto}.YcFama_importBar .YcFama_configInput{grid-column:1/-1;width:100%;min-width:0}.YcFama_importBar>:last-child:nth-child(3){grid-column:2}.YcFama_actionsVisible{flex-direction:column;align-items:stretch}.YcFama_actions>div,.YcFama_actions button{flex:1}.YcFama_configActions{width:100%}.YcFama_configActions .YcFama_pillButton{flex:1}.YcFama_configHeader{align-items:flex-start}.YcFama_emptyState{text-align:center;flex-direction:column;gap:12px}}@media (prefers-reduced-motion:reduce){.YcFama_switch,.YcFama_switch i,.YcFama_chevron,.YcFama_pageHeader,.YcFama_section,.YcFama_skeletonRow,.YcFama_spinner,.YcFama_pillButton,.YcFama_primaryPill{transition:none;animation:none}}.YcFama_variableRow{align-items:center;gap:6px;display:flex}.YcFama_variableRow .YcFama_configInput{flex:1;min-width:0}.YcFama_variableRow .YcFama_pillButton{flex:none}.YcFama_templateGroup{flex-direction:column;gap:4px;display:flex}.YcFama_templateGroup+.YcFama_templateGroup{margin-top:12px}.YcFama_templateGroupTitle{color:var(--dsw-alias-label-tertiary);padding:0 4px;font-size:12px}";
906
+ const css$1 = ":root{--pt-accent:var(--dsw-alias-state-business-primary,#1783ff);--pt-chip-model:#1d4ed8;--pt-chip-error:#b91c1c;--pt-chip-off:#6b7280;--pt-on-chip:#fff;--pt-z-modal:100}.YcFama_visuallyHidden{clip:rect(0 0 0 0);clip-path:inset(50%);white-space:nowrap;width:1px;height:1px;position:absolute;overflow:hidden}.YcFama_pageShell{width:100%;min-width:0;max-width:760px}.YcFama_page{box-sizing:border-box;width:100%;min-width:0;color:var(--dsw-alias-label-primary);flex-direction:column;gap:28px;padding-bottom:28px;font-family:inherit;display:flex}.YcFama_page *,.YcFama_page :before,.YcFama_page :after,.YcFama_pageShell *,.YcFama_pageShell :before,.YcFama_pageShell :after{box-sizing:border-box}.YcFama_page button,.YcFama_page input,.YcFama_page select,.YcFama_page textarea,.YcFama_pageShell button,.YcFama_pageShell input,.YcFama_pageShell select,.YcFama_pageShell textarea{color:inherit;font:inherit}.YcFama_loading{min-height:140px;color:var(--dsw-alias-label-tertiary);text-align:center;margin:0;font-size:13px;line-height:140px}.YcFama_pageHeader{flex-wrap:wrap;justify-content:space-between;align-items:flex-start;gap:18px;min-width:0;animation:.3s cubic-bezier(.22,1,.36,1) both YcFama_pt-rise;display:flex}.YcFama_pageHeader h1,.YcFama_pageHeader h2{color:var(--dsw-alias-label-primary);letter-spacing:-.01em;margin:0;padding-left:14px;font-size:17px;font-weight:600;line-height:24px;position:relative}.YcFama_pageHeader h1:before,.YcFama_pageHeader h2:before{content:\"\";background:linear-gradient(180deg, var(--pt-accent), color-mix(in srgb, var(--pt-accent) 35%, transparent));width:4px;box-shadow:0 0 12px color-mix(in srgb, var(--pt-accent) 45%, transparent);border-radius:999px;position:absolute;top:4px;bottom:4px;left:0}.YcFama_pageHeader p{max-width:64ch;color:var(--dsw-alias-label-tertiary);margin:8px 0 0;font-size:14px;line-height:22px}.YcFama_section{flex-direction:column;gap:12px;min-width:0;animation:.32s cubic-bezier(.22,1,.36,1) both YcFama_pt-rise;display:flex}.YcFama_subagentConfigs,.YcFama_configsStack{margin-top:12px}.YcFama_sectionHeading{border:1px solid var(--dsw-alias-border-l2);background:linear-gradient(180deg, color-mix(in srgb, var(--pt-accent) 5%, transparent), transparent 60%), var(--dsw-alias-bg-layer-3);border-radius:12px;flex-wrap:wrap;justify-content:space-between;align-items:flex-start;gap:18px;min-width:0;padding:10px 14px;display:flex}.YcFama_sectionHeading>div{flex:1;min-width:0}.YcFama_sectionHeading h2{color:var(--dsw-alias-label-primary);letter-spacing:-.005em;margin:0;font-size:14px;font-weight:600;line-height:22px}.YcFama_sectionHeading h2:after{content:\"\";background:color-mix(in srgb, var(--pt-accent) 70%, transparent);width:5px;height:5px;box-shadow:0 0 8px color-mix(in srgb, var(--pt-accent) 55%, transparent);border-radius:50%;margin:0 0 2px 7px;display:inline-block}.YcFama_sectionHeading p{max-width:66ch;color:var(--dsw-alias-label-tertiary);margin:1px 0 0;font-size:12px;line-height:18px}.YcFama_sectionActions{flex-wrap:wrap;flex:none;justify-content:flex-end;align-items:center;gap:8px;margin-left:auto;display:flex}.YcFama_importBar{border:1px solid color-mix(in srgb, var(--pt-accent) 16%, var(--dsw-alias-border-l2));background:radial-gradient(120% 180% at 100% 0%, color-mix(in srgb, var(--pt-accent) 8%, transparent), transparent 42%), var(--dsw-alias-bg-layer-2);border-radius:12px;grid-template-columns:minmax(160px,1fr) auto auto;align-items:center;gap:10px;min-width:0;padding:10px 12px;display:grid}.YcFama_importBar>div{min-width:0;display:grid}.YcFama_importBar strong{text-overflow:ellipsis;white-space:nowrap;font-size:12px;font-weight:600;line-height:18px;overflow:hidden}.YcFama_importBar small{color:var(--dsw-alias-label-tertiary);font-size:10px;line-height:15px}.YcFama_importBar .YcFama_configInput{min-width:220px;height:36px}.YcFama_importMenuHost{display:inline-flex;position:relative}.YcFama_assetTabs{gap:4px;margin-bottom:10px;display:flex}.YcFama_assetTabs button{background:var(--dsw-alias-fill-field,transparent);cursor:pointer;border:0;border-radius:999px;padding:4px 10px;font-size:12px;line-height:18px}.YcFama_assetTabs button[data-active]{background:var(--dsw-alias-state-business-primary,currentColor);color:var(--dsw-alias-text-on-accent,#fff)}.YcFama_modalBackdrop{z-index:var(--pt-z-modal);background:#0000006b;place-items:center;display:grid;position:fixed;inset:0}.YcFama_templateModal{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-3);border-radius:14px;flex-direction:column;width:min(440px,92vw);max-height:72vh;display:flex;overflow:hidden;box-shadow:0 14px 44px #00000052}.YcFama_templateModalHead{border-bottom:1px solid var(--dsw-alias-border-l1);justify-content:space-between;align-items:center;gap:10px;padding:12px 16px;display:flex}.YcFama_templateModalList{gap:8px;padding:10px;display:grid;overflow-y:auto}.YcFama_templateModalItem{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-2);color:var(--dsw-alias-label-primary);font:inherit;text-align:left;cursor:pointer;border-radius:12px;flex-direction:column;gap:3px;padding:12px 14px;display:flex}.YcFama_templateModalItem strong{letter-spacing:-.005em;overflow-wrap:anywhere;font-size:13px;font-weight:600;line-height:1.5}.YcFama_templateModalItem small{color:var(--dsw-alias-label-tertiary);overflow-wrap:anywhere;font-size:12px;line-height:1.5}.YcFama_templateModalItem:hover{border-color:color-mix(in srgb, var(--pt-accent) 28%, var(--dsw-alias-border-l2));box-shadow:0 8px 22px -16px color-mix(in srgb, var(--pt-accent) 50%, transparent);transform:translateY(-1px)}.YcFama_templateModalItem:focus-visible{outline:2px solid color-mix(in srgb, var(--pt-accent) 45%, var(--dsw-alias-border-l2));outline-offset:2px}.YcFama_pillButton,.YcFama_primaryPill,.YcFama_actions button{appearance:none;box-sizing:border-box;border:1px solid var(--dsw-alias-border-l2);height:36px;color:var(--dsw-alias-label-primary);background:var(--dsw-alias-fill-field,var(--dsw-alias-bg-layer-3));cursor:pointer;white-space:nowrap;border-radius:18px;justify-content:center;align-items:center;gap:4px;padding:0 14px;font-size:14px;line-height:22px;transition:transform .14s,background-color .14s,border-color .14s,box-shadow .14s;display:inline-flex}.YcFama_pillButton:hover:not(:disabled),.YcFama_actions button:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover-solid)}.YcFama_pillButton:active:not(:disabled),.YcFama_primaryPill:active:not(:disabled),.YcFama_actions button:active:not(:disabled){transform:translateY(1px)}.YcFama_pillButton:disabled,.YcFama_primaryPill:disabled,.YcFama_actions button:disabled{cursor:default;opacity:.4}.YcFama_primaryPill,.YcFama_save{color:var(--dsw-alias-label-primary-foreground)!important;background:var(--dsw-alias-button-primary-fill)!important;border-color:#0000!important}.YcFama_primaryPill:hover:not(:disabled),.YcFama_save:hover:not(:disabled){background:var(--dsw-alias-button-primary-hover)!important}.YcFama_primaryPill:not(:disabled),.YcFama_save:not(:disabled){box-shadow:0 6px 18px -10px color-mix(in srgb, var(--pt-accent) 85%, transparent)}.YcFama_pillButton[data-danger]{color:var(--dsw-alias-state-error-primary);border-color:color-mix(in srgb, var(--dsw-alias-state-error-primary) 34%, var(--dsw-alias-border-l2))}.YcFama_pillButton[data-danger]:hover:not(:disabled){border-color:color-mix(in srgb, var(--dsw-alias-state-error-primary) 54%, var(--dsw-alias-border-l2));background:color-mix(in srgb, var(--dsw-alias-state-error-primary) 8%, transparent)}.YcFama_settingRow,.YcFama_toggleRow{border-top:1px solid var(--dsw-alias-border-l2);justify-content:space-between;align-items:center;gap:18px;min-width:0;min-height:62px;padding:11px 0;display:flex;position:relative}.YcFama_settingRowStack{border-top:1px solid var(--dsw-alias-border-l2);flex-direction:column;align-items:stretch;gap:8px;min-width:0;padding:11px 0;display:flex}.YcFama_settingRowStack .YcFama_directoryControl{flex:auto;max-width:none}.YcFama_settingCopy{flex-direction:column;flex:1;min-width:0;display:flex}.YcFama_settingCopy strong{color:var(--dsw-alias-label-primary);font-size:14px;font-weight:500;line-height:21px}.YcFama_settingCopy small{color:var(--dsw-alias-label-tertiary);font-size:11px;line-height:17px}.YcFama_settingCopy code{font-family:var(--ds-font-family-code,ui-monospace, monospace)}.YcFama_activePath{width:fit-content;max-width:100%;color:var(--dsw-alias-label-secondary);background:var(--dsw-alias-bg-layer-2);font-family:var(--ds-font-family-code,ui-monospace, monospace);text-overflow:ellipsis;white-space:nowrap;border-radius:6px;margin-top:4px;padding:2px 7px;font-size:11px;line-height:17px;overflow:hidden}.YcFama_directoryControl{flex:0 460px;align-items:center;gap:8px;min-width:0;max-width:62%;display:flex}.YcFama_directoryInput{border:1px solid var(--dsw-alias-border-l2);width:100%;min-width:0;height:38px;color:var(--dsw-alias-label-primary);background:var(--dsw-alias-bg-layer-3);font-family:var(--ds-font-family-code,ui-monospace, monospace);border-radius:10px;outline:none;padding:0 11px;font-size:12px;line-height:20px}.YcFama_directoryInput::placeholder{color:var(--dsw-alias-label-caption)}.YcFama_directoryInput:disabled{cursor:default;opacity:.46}.YcFama_bootstrapTokensInput{box-sizing:border-box;border:1px solid var(--dsw-alias-border-l2);width:108px;height:38px;color:var(--dsw-alias-label-primary);background:var(--dsw-alias-bg-layer-3);font-family:var(--ds-font-family-code,ui-monospace, monospace);text-align:right;border-radius:10px;outline:none;flex:none;padding:0 10px;font-size:12px}.YcFama_bootstrapTokensInput:disabled{cursor:default;opacity:.46}.YcFama_rowGroup{border-bottom:1px solid var(--dsw-alias-border-l2)}.YcFama_section>.YcFama_rowGroup+.YcFama_rowGroup .YcFama_toggleRow:first-child,.YcFama_section>.YcFama_rowGroup+.YcFama_rowGroup .YcFama_textBlock:first-child{border-top:0}.YcFama_toggleRow{cursor:pointer}.YcFama_toggleRow:first-child{border-top:1px solid var(--dsw-alias-border-l2)}.YcFama_toggleRow:has(input:disabled){cursor:default;opacity:.46}.YcFama_rowDisabled{opacity:.55}.YcFama_skillCardList{flex-direction:column;gap:8px;min-width:0;display:flex}.YcFama_skillCard{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-3);border-radius:12px;align-items:center;gap:8px;min-width:0;padding:9px 12px;transition:border-color .16s,box-shadow .16s,opacity .16s;display:flex;position:relative}.YcFama_skillCard:hover{border-color:color-mix(in srgb, var(--pt-accent) 28%, var(--dsw-alias-border-l2))}.YcFama_skillCard[data-dragging]{opacity:.4}.YcFama_skillCard[data-nested]{margin-left:26px}.YcFama_skillCard[data-nested]:before{content:\"\";background:color-mix(in srgb, var(--pt-accent) 22%, var(--dsw-alias-border-l2));width:1px;position:absolute;top:0;bottom:0;left:-13px}.YcFama_skillCard[data-drop-before]{box-shadow:0 -2px 0 0 var(--pt-accent)}.YcFama_skillCard[data-drop-after]{box-shadow:0 2px 0 0 var(--pt-accent)}.YcFama_skillCard[data-selected]{border-color:color-mix(in srgb, var(--pt-accent) 55%, var(--dsw-alias-border-l2));box-shadow:0 0 0 2px color-mix(in srgb, var(--pt-accent) 16%, transparent)}.YcFama_skillCardList[data-dragging] .YcFama_skillCard{transition:none}.YcFama_skillCard:has(.YcFama_skillSwitch input:disabled) .YcFama_switch{opacity:.55}.YcFama_skillNestedMark{width:20px;height:20px;color:var(--dsw-alias-label-tertiary);background:var(--dsw-alias-bg-layer-2);border-radius:50%;flex:none;place-items:center;font-size:10px;line-height:1;display:grid}.YcFama_skillRowInvalid .YcFama_skillCardBody{opacity:.55}.YcFama_skillRowInvalid .YcFama_dragHandle{opacity:.4;cursor:not-allowed}.YcFama_skillRowInvalid .YcFama_switch{opacity:.55}.YcFama_duplicateBadge{border:1px solid color-mix(in srgb, var(--pt-chip-error) 36%, var(--dsw-alias-border-l2));color:var(--dsw-alias-state-error-primary,#d5484d);background:color-mix(in srgb, var(--pt-chip-error) 7%, transparent);white-space:nowrap;border-radius:999px;flex:none;align-items:center;padding:1px 8px;font-size:10px;font-weight:650;line-height:16px;display:inline-flex}.YcFama_dirCardList{flex-direction:column;gap:8px;min-width:0;display:flex}.YcFama_presetGrid{grid-template-columns:repeat(auto-fill,minmax(268px,1fr));grid-auto-rows:1fr;gap:12px;min-width:0;margin-top:2px;display:grid}.YcFama_presetCard{background:var(--dsw-alias-bg-layer-3);border:1px solid #0000;border-radius:12px;flex-direction:column;min-width:0;transition:border-color .16s,box-shadow .16s,transform .16s,background .16s;display:flex}.YcFama_presetCard:hover:not([data-active]){box-shadow:0 8px 22px -16px color-mix(in srgb, var(--pt-accent) 50%, transparent);transform:translateY(-1px)}.YcFama_presetCard[data-active]{background:color-mix(in srgb, var(--pt-accent) 6%, var(--dsw-alias-bg-layer-3));box-shadow:0 0 0 2px color-mix(in srgb, var(--pt-accent) 45%, transparent)}.YcFama_presetCardMain{min-width:0;font:inherit;color:inherit;text-align:left;cursor:pointer;background:0 0;border:0;border-radius:12px 12px 0 0;flex-direction:column;flex:1;gap:8px;padding:14px 16px 12px;display:flex}.YcFama_presetCardMain:disabled{cursor:default;opacity:.6}.YcFama_presetCardMain:focus-visible{outline:2px solid var(--dsw-alias-brand-primary);outline-offset:-2px}.YcFama_presetCardBody{border-radius:12px 12px 0 0;flex-direction:column;flex:1;gap:8px;min-width:0;padding:14px 16px 12px;display:flex}.YcFama_presetCardHead{align-items:center;gap:8px;min-width:0;display:flex}.YcFama_presetCardName{color:var(--dsw-alias-label-primary);overflow-wrap:anywhere;min-width:0;font-size:15px;font-weight:600;line-height:1.4}.YcFama_presetCardId{color:var(--dsw-alias-label-dimmed);font-family:var(--dsw-font-mono,ui-monospace, SFMono-Regular, Menlo, monospace);overflow-wrap:anywhere;margin-top:auto;font-size:11px;line-height:1.5}.YcFama_presetCardDesc{min-height:42px;color:var(--dsw-alias-label-secondary);overflow-wrap:anywhere;-webkit-line-clamp:4;-webkit-box-orient:vertical;margin:0;font-size:13px;line-height:1.55;display:-webkit-box;overflow:hidden}.YcFama_presetCardFooter{border-top:1px solid var(--dsw-alias-border-l2);flex-wrap:wrap;justify-content:flex-end;align-items:center;gap:4px;min-width:0;padding:6px 10px;display:flex}.YcFama_presetCardActions{align-items:center;gap:6px;display:flex}.YcFama_presetInUse{background:var(--pt-accent);color:var(--pt-on-chip);white-space:nowrap;border-radius:999px;flex:none;margin-left:auto;padding:1px 8px;font-size:11px;font-weight:500;line-height:17px}.YcFama_presetCardFooter .YcFama_pillButton{border-radius:14px;height:28px;padding:0 10px;font-size:12px;line-height:18px}.YcFama_presetIconButton{appearance:none;color:var(--dsw-alias-label-tertiary);cursor:pointer;background:0 0;border:0;border-radius:7px;align-items:center;padding:6px;display:inline-flex;position:relative}.YcFama_presetIconButton:hover:not(:disabled){background:var(--dsw-alias-bg-layer-1);color:var(--dsw-alias-label-primary)}.YcFama_presetIconButton:focus-visible{outline:2px solid var(--dsw-alias-brand-primary);outline-offset:-1px}.YcFama_presetIconButton:after{content:attr(data-tip);background:var(--dsw-alias-label-primary);color:var(--dsw-alias-bg-layer-3);white-space:nowrap;opacity:0;pointer-events:none;border-radius:6px;padding:3px 8px;font-size:11px;line-height:17px;transition:opacity .12s;position:absolute;bottom:calc(100% + 6px);left:50%;transform:translate(-50%)}.YcFama_presetIconButton:hover:after,.YcFama_presetIconButton:focus-visible:after{opacity:1}.YcFama_dirCard{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-3);border-radius:12px;align-items:center;gap:8px;min-width:0;padding:9px 12px;transition:border-color .16s;display:flex}.YcFama_dirCard[data-invalid]{border-color:color-mix(in srgb, var(--pt-chip-error) 38%, var(--dsw-alias-border-l2))}.YcFama_dirCardBody{flex-direction:column;flex:1;gap:2px;min-width:0;display:flex}.YcFama_dirCardTitle{flex-wrap:wrap;align-items:center;gap:8px;min-width:0;display:flex}.YcFama_dirPath{min-width:0;color:var(--dsw-alias-label-primary);font-family:var(--ds-font-family-code,ui-monospace, monospace);text-overflow:ellipsis;white-space:nowrap;font-size:12px;line-height:1.5;overflow:hidden}.YcFama_dirCardMeta{color:var(--dsw-alias-label-tertiary);font-size:11px;line-height:1.5}.YcFama_dirCardActions{flex-wrap:wrap;flex:none;align-items:center;gap:6px;display:flex}.YcFama_dirCardActions .YcFama_pillButton{height:28px;padding:0 11px;font-size:12px}.YcFama_dirAddBar{flex-wrap:wrap;align-items:center;gap:8px;min-width:0;display:flex}.YcFama_dirAddInput{flex:280px;align-items:center;gap:8px;min-width:0;display:flex}.YcFama_dirAddInput .YcFama_directoryInput{flex:1}.YcFama_listFilterRow{align-items:center;gap:8px;min-width:0;display:flex}.YcFama_listFilterRow .YcFama_listFilter{flex:1;max-width:none}.YcFama_skillRankBadge{border:1px solid var(--dsw-alias-border-l1);width:20px;height:20px;color:var(--dsw-alias-label-secondary);background:var(--dsw-alias-bg-layer-2);font-variant-numeric:tabular-nums;border-radius:50%;flex:none;place-items:center;font-size:10px;font-weight:700;line-height:1;display:grid}.YcFama_skillCardBody{flex-direction:column;flex:1;gap:2px;min-width:0;display:flex}.YcFama_skillCardTitleRow{flex-wrap:wrap;align-items:center;gap:8px;min-width:0;display:flex}.YcFama_skillCardTitleRow strong{color:var(--dsw-alias-label-primary);overflow-wrap:anywhere;font-size:13px;font-weight:600;line-height:1.5}.YcFama_skillCardMeta{color:var(--dsw-alias-label-tertiary);overflow-wrap:anywhere;font-size:11px;line-height:1.5}.YcFama_skillSelect{cursor:pointer;flex:none;align-items:center;display:inline-flex}.YcFama_skillSelect input{width:15px;height:15px;accent-color:var(--pt-accent);cursor:pointer;margin:0}.YcFama_skillSelect input:disabled{cursor:default}.YcFama_skillSwitch{cursor:pointer;flex:none;align-items:center;display:inline-flex}.YcFama_skillOrderButtons{flex-direction:column;flex:none;align-self:center;gap:4px;display:inline-flex}.YcFama_skillOrderButtons .YcFama_pillButton{border-radius:11px;height:22px;padding:0 9px;font-size:12px;line-height:1}.YcFama_skillStats{grid-template-columns:repeat(4,minmax(0,1fr));gap:8px;display:grid}.YcFama_skillStatsRow{align-items:center;gap:10px;margin-bottom:10px;display:flex}.YcFama_skillStatsRow .YcFama_skillStats{flex:1;grid-template-columns:repeat(3,minmax(0,1fr));min-width:0}.YcFama_skillStatsRow>button{flex:none}.YcFama_skillStats button{appearance:none;border:1px solid var(--dsw-alias-border-l2);color:var(--dsw-alias-label-primary);background:var(--dsw-alias-bg-layer-2);font:inherit;cursor:pointer;border-radius:12px;flex-direction:column;align-items:flex-start;gap:2px;padding:9px 11px;transition:border-color .16s,box-shadow .16s,transform .16s;display:flex}.YcFama_skillStats button:hover{border-color:color-mix(in srgb, var(--pt-accent) 30%, var(--dsw-alias-border-l2));transform:translateY(-1px)}.YcFama_skillStats button[data-active]{border-color:color-mix(in srgb, var(--pt-accent) 45%, var(--dsw-alias-border-l2));box-shadow:0 0 0 2px color-mix(in srgb, var(--pt-accent) 18%, transparent)}.YcFama_skillStats strong{font-variant-numeric:tabular-nums;font-size:18px;font-weight:700;line-height:1.1}.YcFama_skillStats small{color:var(--dsw-alias-label-tertiary);font-size:11px;line-height:1.3}.YcFama_skillStatDot{background:var(--chip);border-radius:50%;width:8px;height:8px;margin-bottom:1px}.YcFama_skillStatAll{--chip:var(--dsw-alias-label-tertiary)}.YcFama_selectionCount{color:var(--dsw-alias-label-secondary);white-space:nowrap;flex:none;font-size:12px;font-weight:600;line-height:1.5}.YcFama_listFilterRow .YcFama_pillButton[data-active]{border-color:color-mix(in srgb, var(--pt-accent) 45%, var(--dsw-alias-border-l2));box-shadow:0 0 0 2px color-mix(in srgb, var(--pt-accent) 18%, transparent);color:color-mix(in srgb, var(--pt-accent) 80%, var(--dsw-alias-label-primary));background:color-mix(in srgb, var(--pt-accent) 8%, transparent)}.YcFama_disclosure{border-top:1px solid var(--dsw-alias-border-l2)}.YcFama_disclosure>summary{color:var(--dsw-alias-label-primary);cursor:pointer;align-items:baseline;gap:8px;padding:10px 2px;font-size:13px;font-weight:600;list-style:none;display:flex}.YcFama_disclosure>summary::-webkit-details-marker{display:none}.YcFama_disclosure>summary:before{content:\"▸\";color:var(--dsw-alias-label-tertiary);font-size:11px;transition:transform .18s cubic-bezier(.22,1,.36,1)}.YcFama_disclosure[open]>summary:before{transform:rotate(90deg)}.YcFama_disclosure>summary small{color:var(--dsw-alias-label-tertiary);font-size:11px;font-weight:400}.YcFama_disclosureBody{flex-direction:column;gap:10px;padding:2px 0 6px;display:flex}.YcFama_cardDivider{border-top:1px solid var(--dsw-alias-border-l2);margin:2px 0 10px;padding-top:12px}.YcFama_skillStatusRow{flex-wrap:wrap;flex:none;align-items:center;gap:6px;display:inline-flex}.YcFama_skillStatusChip{border:1px solid var(--chip);color:var(--pt-on-chip);background:var(--chip);white-space:nowrap;text-shadow:0 1px 1px #0000002e;border-radius:999px;align-items:center;gap:5px;padding:3px 9px;font-size:11px;font-weight:650;line-height:16px;display:inline-flex}.YcFama_skillStatusModel{--chip:var(--pt-chip-model)}.YcFama_skillStatusError{--chip:var(--pt-chip-error)}.YcFama_skillStatusOff{--chip:var(--pt-chip-off)}.YcFama_skillStatusDot{background:currentColor;border-radius:50%;flex:none;width:6px;height:6px}.YcFama_skillIssue{overflow-wrap:anywhere;color:var(--dsw-alias-state-error-primary,#d5484d);margin:0;padding-left:2px;font-size:12px;line-height:1.5}.YcFama_dragHandle{width:28px;height:28px;color:var(--dsw-alias-label-tertiary);cursor:grab;letter-spacing:-.04em;user-select:none;background:0 0;border:1px solid #0000;border-radius:8px;flex:none;place-items:center;font-size:15px;transition:color .14s,background-color .14s,border-color .14s,transform .14s;display:grid}.YcFama_skillCard:hover .YcFama_dragHandle{color:var(--pt-accent);border-color:color-mix(in srgb, var(--pt-accent) 22%, var(--dsw-alias-border-l2));background:color-mix(in srgb, var(--pt-accent) 7%, transparent);transform:translateY(-1px)}.YcFama_dragHandle:active{cursor:grabbing;transform:scale(.94)}.YcFama_configEnable{cursor:pointer;align-items:center;gap:10px;display:inline-flex}.YcFama_toggleRow input[type=checkbox],.YcFama_configEnable>input,.YcFama_skillSwitch input{clip:rect(0 0 0 0);clip-path:inset(50%);white-space:nowrap;width:1px;height:1px;position:absolute;overflow:hidden}.YcFama_inlineControls{flex:none;align-items:center;gap:8px;display:flex}.YcFama_switch{background:var(--dsw-alias-bg-layer-2);width:40px;height:24px;box-shadow:inset 0 0 0 1px var(--dsw-alias-border-l2);border-radius:999px;flex:none;transition:background-color .18s cubic-bezier(.22,1,.36,1),box-shadow .18s;display:block;position:relative}.YcFama_switch i{background:var(--dsw-alias-bg-layer-3);width:18px;height:18px;box-shadow:0 1px 3px color-mix(in srgb, var(--dsw-alias-label-primary) 22%, transparent);border-radius:50%;transition:transform .18s cubic-bezier(.22,1,.36,1);position:absolute;top:3px;left:3px}.YcFama_configEnable:hover .YcFama_switch,.YcFama_toggleRow:hover .YcFama_switch,.YcFama_skillSwitch:hover .YcFama_switch{box-shadow:inset 0 0 0 1px color-mix(in srgb, var(--pt-accent) 45%, var(--dsw-alias-border-l2))}.YcFama_toggleRow input:checked+.YcFama_switch,.YcFama_configEnable>input:checked+.YcFama_switch,.YcFama_skillSwitch input:checked+.YcFama_switch{background:var(--pt-accent);box-shadow:none}.YcFama_toggleRow input:checked+.YcFama_switch i,.YcFama_configEnable>input:checked+.YcFama_switch i,.YcFama_skillSwitch input:checked+.YcFama_switch i{transform:translate(16px)}.YcFama_tagInput{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-3);border-radius:10px;flex-wrap:wrap;align-items:center;gap:6px;min-width:0;padding:6px 8px;transition:border-color .14s,box-shadow .14s;display:flex}.YcFama_tagInput:focus-within{border-color:color-mix(in srgb, var(--pt-accent) 55%, var(--dsw-alias-border-l2));box-shadow:0 0 0 2px color-mix(in srgb, var(--pt-accent) 20%, transparent)}.YcFama_tagInput[data-disabled]{opacity:.46}.YcFama_tagChip{border:1px solid color-mix(in srgb, var(--pt-accent) 26%, var(--dsw-alias-border-l2));color:var(--dsw-alias-label-primary);background:color-mix(in srgb, var(--pt-accent) 8%, transparent);white-space:nowrap;border-radius:999px;align-items:center;gap:4px;padding:2px 9px;font-size:11px;line-height:17px;display:inline-flex}.YcFama_tagChipRemove{appearance:none;width:14px;height:14px;color:var(--dsw-alias-label-tertiary);cursor:pointer;background:0 0;border:0;border-radius:50%;place-items:center;padding:0;font-size:12px;line-height:1;display:grid}.YcFama_tagChipRemove:hover{color:var(--dsw-alias-label-primary);background:var(--dsw-alias-interactive-bg-hover-solid)}.YcFama_tagInputField{min-width:90px;color:var(--dsw-alias-label-primary);font:inherit;background:0 0;border:0;outline:none;flex:1;padding:4px 2px;font-size:12px;line-height:18px}.YcFama_tagInputField::placeholder{color:var(--dsw-alias-label-caption)}.YcFama_textBlock{border-top:1px solid var(--dsw-alias-border-l2);flex-direction:column;gap:8px;min-width:0;padding:11px 0;display:flex}.YcFama_firstTurnInput,.YcFama_textarea{field-sizing:content;box-sizing:border-box;border:1px solid var(--dsw-alias-border-l2);width:100%;max-height:60vh;color:var(--dsw-alias-label-primary);background:var(--dsw-specific-input-major,var(--dsw-alias-bg-layer-2));font-family:var(--ds-font-family-code,ui-monospace, monospace);resize:vertical;border-radius:10px;outline:none;padding:9px 11px;font-size:13px;line-height:1.6}.YcFama_firstTurnInput{min-height:84px}.YcFama_textarea{min-height:420px}.YcFama_firstTurnInput:disabled,.YcFama_textarea:disabled{cursor:default;opacity:.55}.YcFama_notice{color:var(--dsw-alias-state-success-primary);overflow-wrap:anywhere;font-size:12px}.YcFama_noticeError{color:var(--dsw-alias-state-error-primary,#d5484d)}.YcFama_configList{flex-direction:column;gap:10px;min-width:0;display:flex}.YcFama_configCardPair{grid-template-columns:repeat(auto-fit,minmax(280px,1fr));gap:10px;display:grid}.YcFama_configCardPair>.YcFama_configCard{min-width:0}.YcFama_configCard{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-3);border-radius:14px;flex-direction:column;transition:border-color .16s,box-shadow .16s,transform .16s;display:flex;overflow:hidden}.YcFama_configCard:hover{border-color:color-mix(in srgb, var(--pt-accent) 28%, var(--dsw-alias-border-l2));box-shadow:0 8px 22px -16px color-mix(in srgb, var(--pt-accent) 50%, transparent);transform:translateY(-1px)}.YcFama_configCard[data-dragging]{opacity:.4}.YcFama_configCard[data-drop-before]{box-shadow:0 -2px 0 0 var(--pt-accent)}.YcFama_configCard[data-drop-after]{box-shadow:0 2px 0 0 var(--pt-accent)}.YcFama_configCardOpen{border-color:color-mix(in srgb, var(--pt-accent) 38%, var(--dsw-alias-border-l2));box-shadow:0 10px 26px -18px color-mix(in srgb, var(--pt-accent) 55%, transparent)}.YcFama_configHeader{flex-wrap:wrap;align-items:center;gap:10px;padding:10px 12px;display:flex}.YcFama_configHeaderActions{flex:none;align-items:center;gap:8px;margin-left:auto;display:flex}.YcFama_configToggle{appearance:none;min-width:160px;font:inherit;color:inherit;text-align:left;cursor:pointer;background:0 0;border:0;flex:1;align-items:center;gap:8px;padding:4px 0;display:flex}.YcFama_configToggle:focus-visible{outline:2px solid var(--dsw-alias-state-business-primary);outline-offset:2px}.YcFama_configTitle{flex-direction:column;flex:1;gap:2px;min-width:0;display:flex}.YcFama_configName{color:var(--dsw-alias-label-primary);overflow-wrap:anywhere;letter-spacing:-.005em;font-size:13px;font-weight:600;line-height:1.5}.YcFama_configMeta{color:var(--dsw-alias-label-tertiary);overflow-wrap:anywhere;font-size:12px;line-height:1.5}.YcFama_configChip{color:var(--dsw-alias-label-brand,#3b82f6);background:color-mix(in srgb, var(--dsw-alias-label-brand,#3b82f6) 12%, transparent);border-radius:999px;margin-left:8px;padding:1px 8px;font-size:11px;line-height:1.6}.YcFama_chevron{color:var(--dsw-alias-label-tertiary);flex:none;transition:transform .18s cubic-bezier(.22,1,.36,1)}.YcFama_chevronOpen{color:var(--pt-accent);transform:rotate(180deg)}.YcFama_configEnable{cursor:pointer;flex:none;display:inline-flex;position:relative}.YcFama_configActions{flex-wrap:wrap;align-items:center;gap:6px;margin-left:auto;display:flex}.YcFama_configActions .YcFama_pillButton{border-radius:15px;height:30px;padding:0 11px;font-size:12px}.YcFama_configForm{border-top:1px solid color-mix(in srgb, var(--pt-accent) 16%, var(--dsw-alias-border-l2));background:linear-gradient(180deg, color-mix(in srgb, var(--pt-accent) 4%, transparent), transparent 28%), var(--dsw-alias-bg-layer-2);flex-direction:column;gap:10px;padding:12px 14px;display:flex}.YcFama_configBody{background:linear-gradient(180deg, color-mix(in srgb, var(--pt-accent) 4%, transparent), transparent 28%), var(--dsw-alias-bg-layer-2);flex-direction:column;gap:10px;padding:12px 14px;display:flex}.YcFama_configBody .YcFama_rowGroup{border-bottom:0}.YcFama_configBody .YcFama_toggleRow:first-child{border-top:0}.YcFama_configFormToolbar{border-bottom:1px solid color-mix(in srgb, var(--pt-accent) 16%, var(--dsw-alias-border-l2));flex-wrap:wrap;align-items:center;gap:10px;min-width:0;padding-bottom:12px;display:flex}.YcFama_configGrid{flex-wrap:wrap;align-items:flex-end;gap:10px 14px;display:flex}.YcFama_configField{flex-direction:column;gap:4px;min-width:0;display:flex}.YcFama_configFieldLabel{color:var(--dsw-alias-label-primary);font-size:12px;font-weight:500;line-height:1.5}.YcFama_configFieldHint{color:var(--dsw-alias-label-tertiary);margin:0;font-size:12px;line-height:1.5}.YcFama_configFieldStack{flex-direction:column;gap:6px;min-width:0;display:flex}.YcFama_configFieldStack>textarea{margin-top:2px}.YcFama_configInput{box-sizing:border-box;border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-3);max-width:100%;height:34px;font:inherit;color:var(--dsw-alias-label-primary);border-radius:9px;padding:0 8px;font-size:12px;line-height:1.5}.YcFama_configInput:focus-visible{border-color:var(--dsw-alias-state-business-primary);outline:none}.YcFama_configInput:disabled{color:var(--dsw-alias-label-tertiary);cursor:default}.YcFama_configInputError{border-color:var(--dsw-alias-label-error)!important}.YcFama_configTextarea{field-sizing:content;box-sizing:border-box;width:100%;min-height:72px;max-height:60vh;font-family:var(--ds-font-family-code,ui-monospace, monospace);color:var(--dsw-alias-label-primary);background:var(--dsw-specific-input-major,var(--dsw-alias-bg-layer-2));border:1px solid var(--dsw-alias-border-l2);resize:vertical;border-radius:9px;padding:8px 10px;font-size:12px;line-height:1.6}.YcFama_configTextarea:focus-visible{border-color:var(--dsw-alias-state-business-primary);outline:none}.YcFama_configJsonInput{min-height:88px}.YcFama_configJsonError{color:var(--dsw-alias-state-error-primary,#d5484d);font-weight:400}.YcFama_configErrorBox{border:1px solid var(--dsw-alias-label-error);background:var(--dsw-alias-bg-layer-2);border-radius:10px;flex-direction:column;gap:4px;padding:8px 10px;display:flex}.YcFama_configErrorLine{font-family:var(--ds-font-family-code,ui-monospace, monospace);color:var(--dsw-alias-state-error-primary,#d5484d);overflow-wrap:anywhere;font-size:12px;line-height:1.5}.YcFama_emptyState{border:1px dashed color-mix(in srgb, var(--pt-accent) 24%, var(--dsw-alias-border-l2));background:radial-gradient(90% 160% at 50% 0%, color-mix(in srgb, var(--pt-accent) 5%, transparent), transparent 60%), color-mix(in srgb, var(--dsw-alias-bg-layer-1) 50%, transparent);border-radius:13px;justify-content:center;align-items:center;gap:18px;min-height:150px;padding:24px;display:flex}.YcFama_emptyGlyph{border:1px solid color-mix(in srgb, var(--pt-accent) 24%, var(--dsw-alias-border-l1));width:42px;height:42px;color:var(--pt-accent);background:color-mix(in srgb, var(--pt-accent) 6%, var(--dsw-alias-bg-layer-1));box-shadow:0 0 18px -10px color-mix(in srgb, var(--pt-accent) 70%, transparent);border-radius:11px;flex:none;place-items:center;font-size:20px;display:grid}.YcFama_emptyState h3{margin:0 0 5px;font-size:15px;line-height:1.4}.YcFama_emptyState p{max-width:520px;color:var(--dsw-alias-label-tertiary);margin:0;font-size:12px;line-height:1.6}.YcFama_feedback{gap:4px;display:grid}.YcFama_feedback:empty{display:none}.YcFama_feedback p{overflow-wrap:anywhere;margin:0;font-size:12px;line-height:18px}.YcFama_success{color:var(--dsw-alias-state-success-primary)}.YcFama_readOnly{color:var(--dsw-alias-label-tertiary);font-size:12px;line-height:18px}.YcFama_actions{display:none}.YcFama_actionsVisible{border-top:1px solid var(--dsw-alias-border-l2);justify-content:space-between;align-items:center;gap:16px;padding-top:14px;display:flex}.YcFama_actions>span{color:var(--dsw-alias-label-tertiary);font-size:12px;line-height:18px}.YcFama_actions>div{gap:8px;display:flex}.YcFama_pillButton[data-variant=secondary]{border-color:var(--dsw-alias-border-l2);color:var(--dsw-alias-label-primary);background:0 0}.YcFama_listFilterRow{flex-wrap:wrap;align-items:center;gap:8px;min-width:0;display:flex}.YcFama_listFilter{box-sizing:border-box;border:1px solid var(--dsw-alias-border-l2);width:100%;max-width:320px;height:32px;color:var(--dsw-alias-label-primary);background:var(--dsw-alias-bg-layer-3);font:inherit;border-radius:9px;outline:none;padding:0 10px;font-size:12px;line-height:1.5}.YcFama_listFilter:focus-visible{border-color:color-mix(in srgb, var(--pt-accent) 55%, var(--dsw-alias-border-l2));box-shadow:0 0 0 2px color-mix(in srgb, var(--pt-accent) 20%, transparent)}.YcFama_listFilter::placeholder{color:var(--dsw-alias-label-caption)}.YcFama_listFilterRow select.YcFama_listFilter{flex:none;width:auto;max-width:none}.YcFama_batchControls{align-items:center;gap:6px;margin-left:auto;display:flex}.YcFama_batchControls .YcFama_pillButton{border-radius:16px;height:32px;padding:0 12px;font-size:12px;line-height:18px}.YcFama_skeletonStack{gap:10px;padding:2px 0;display:grid}.YcFama_skeletonRow{background:linear-gradient(90deg, var(--dsw-alias-bg-layer-2) 25%, var(--dsw-alias-bg-layer-3) 50%, var(--dsw-alias-bg-layer-2) 75%);background-size:200% 100%;border-radius:11px;height:46px;animation:1.4s linear infinite YcFama_pt-shimmer}@keyframes YcFama_pt-shimmer{0%{background-position:200% 0}to{background-position:-200% 0}}.YcFama_spinner{border:2px solid color-mix(in srgb, currentColor 28%, transparent);border-top-color:currentColor;border-radius:50%;flex:none;width:12px;height:12px;animation:.7s linear infinite YcFama_pt-spin;display:inline-block}@keyframes YcFama_pt-spin{to{transform:rotate(360deg)}}.YcFama_settingsNote{color:var(--dsw-alias-label-tertiary);margin:-14px 0 0;font-size:10px;line-height:16px}.YcFama_settingsNote code{color:var(--dsw-alias-label-secondary);font-family:var(--ds-font-family-code,ui-monospace, monospace)}.YcFama_pillButton:focus-visible,.YcFama_primaryPill:focus-visible,.YcFama_actions button:focus-visible,.YcFama_directoryInput:focus-visible,.YcFama_bootstrapTokensInput:focus-visible,.YcFama_firstTurnInput:focus-visible,.YcFama_textarea:focus-visible,.YcFama_toggleRow input:focus-visible+.YcFama_switch,.YcFama_configEnable>input:focus-visible+.YcFama_switch,.YcFama_skillSwitch input:focus-visible+.YcFama_switch{box-shadow:0 0 0 2px color-mix(in srgb, var(--pt-accent) 45%, transparent);outline:none}@keyframes YcFama_pt-rise{0%{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}@media (width<=620px){.YcFama_page{gap:24px}.YcFama_textarea{min-height:260px}.YcFama_skillStats{grid-template-columns:repeat(2,minmax(0,1fr))}.YcFama_settingRow,.YcFama_toggleRow{flex-direction:column;align-items:stretch;gap:9px}.YcFama_directoryControl{justify-content:space-between;max-width:none}.YcFama_sectionActions{flex-wrap:wrap}.YcFama_importBar{grid-template-columns:minmax(0,1fr) auto}.YcFama_importBar .YcFama_primaryPill,.YcFama_importBar .YcFama_pillButton{grid-column:auto}.YcFama_importBar .YcFama_configInput{grid-column:1/-1;width:100%;min-width:0}.YcFama_importBar>:last-child:nth-child(3){grid-column:2}.YcFama_actionsVisible{flex-direction:column;align-items:stretch}.YcFama_actions>div,.YcFama_actions button{flex:1}.YcFama_configActions{width:100%}.YcFama_configActions .YcFama_pillButton{flex:1}.YcFama_configHeader{align-items:flex-start}.YcFama_emptyState{text-align:center;flex-direction:column;gap:12px}}@media (prefers-reduced-motion:reduce){.YcFama_switch,.YcFama_switch i,.YcFama_chevron,.YcFama_pageHeader,.YcFama_section,.YcFama_skeletonRow,.YcFama_spinner,.YcFama_pillButton,.YcFama_primaryPill{transition:none;animation:none}}.YcFama_variableRow{align-items:center;gap:6px;display:flex}.YcFama_variableRow .YcFama_configInput{flex:1;min-width:0}.YcFama_variableRow .YcFama_pillButton{flex:none}.YcFama_templateGroup{flex-direction:column;gap:4px;display:flex}.YcFama_templateGroup+.YcFama_templateGroup{margin-top:12px}.YcFama_templateGroupTitle{color:var(--dsw-alias-label-tertiary);padding:0 4px;font-size:12px}";
865
907
  const tagId$1 = "dsh-plugin-prompt-tool/PromptUi.module.css";
866
908
  if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId$1) + "]") === null) {
867
909
  const tag = document.createElement("style");
@@ -885,6 +927,7 @@ window.__ModuleLoader__.load({
885
927
  "configCard": "YcFama_configCard",
886
928
  "configCardOpen": "YcFama_configCardOpen",
887
929
  "configCardPair": "YcFama_configCardPair",
930
+ "configChip": "YcFama_configChip",
888
931
  "configEnable": "YcFama_configEnable",
889
932
  "configErrorBox": "YcFama_configErrorBox",
890
933
  "configErrorLine": "YcFama_configErrorLine",
@@ -1269,7 +1312,7 @@ window.__ModuleLoader__.load({
1269
1312
  * 无固定字段的策略回退 JSON 编辑(保留任意 params 能力)。
1270
1313
  */
1271
1314
  function StrategyParamsFields(props) {
1272
- const { strategy, params, onPatch } = props;
1315
+ const { strategy, layer, params, onPatch } = props;
1273
1316
  const value = params ?? {};
1274
1317
  const str = (key) => typeof value[key] === "string" ? value[key] : "";
1275
1318
  const bool = (key) => value[key] === true;
@@ -1277,6 +1320,26 @@ window.__ModuleLoader__.load({
1277
1320
  ...value,
1278
1321
  [key]: next
1279
1322
  });
1323
+ if (layer === "system-section") return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [
1324
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ParamInput, {
1325
+ label: "sectionName(注册段名)",
1326
+ hint: "deployment:persona = 人设段(同名 shadow 全局 persona)",
1327
+ value: str("sectionName"),
1328
+ onChange: (next) => set("sectionName", next)
1329
+ }),
1330
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ParamToggle, {
1331
+ label: "complete(独占 system prompt)",
1332
+ hint: "开启后 assembly 只保留本段;预设内互斥(多个 complete 官方 fail loud)",
1333
+ checked: bool("complete"),
1334
+ onChange: (next) => set("complete", next)
1335
+ }),
1336
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ParamToggle, {
1337
+ label: "suppressRuntimeContext(抑制动态上下文)",
1338
+ hint: "等价官方 dsh-persona includeRuntimeContext:false",
1339
+ checked: bool("suppressRuntimeContext"),
1340
+ onChange: (next) => set("suppressRuntimeContext", next)
1341
+ })
1342
+ ] });
1280
1343
  if (strategy === "first-turn-anchor") return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [
1281
1344
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ParamToggle, {
1282
1345
  label: "useCustom(自定义锚文本)",
@@ -1393,6 +1456,31 @@ window.__ModuleLoader__.load({
1393
1456
  hint: "true = 关键字必须整词出现(词边界),false = 子串包含即命中",
1394
1457
  checked: bool("wholeWords"),
1395
1458
  onChange: (next) => set("wholeWords", next)
1459
+ }),
1460
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ParamToggle, {
1461
+ label: "useRegex(键为正则)",
1462
+ hint: "true = keys / secondaryKeys 按正则表达式匹配(作者负责合法性)",
1463
+ checked: bool("useRegex"),
1464
+ onChange: (next) => set("useRegex", next)
1465
+ }),
1466
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(OptionField, {
1467
+ label: "selectiveLogic(触发逻辑)",
1468
+ hint: "ST world_info_logic:0 = 主/副键任一命中;3 = 副键全中才注入;1 = 副键全不中才注入;2 = 至少一个副键未中才注入",
1469
+ value: value["selectiveLogic"] !== void 0 ? String(value["selectiveLogic"]) : "0",
1470
+ options: [
1471
+ "0",
1472
+ "1",
1473
+ "2",
1474
+ "3"
1475
+ ],
1476
+ fallback: "0",
1477
+ labels: {
1478
+ "0": "0 · 任一命中(默认)",
1479
+ "1": "1 · 副键全排除",
1480
+ "2": "2 · 部分排除",
1481
+ "3": "3 · 副键全包含"
1482
+ },
1483
+ onChange: (next) => set("selectiveLogic", Number(next))
1396
1484
  })
1397
1485
  ] });
1398
1486
  }
@@ -1441,6 +1529,10 @@ window.__ModuleLoader__.load({
1441
1529
  onChange: (next) => set("emptyText", next)
1442
1530
  })
1443
1531
  ] });
1532
+ if (Object.keys(value).length === 0) return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
1533
+ className: PromptUi_module_css_default.configFieldHint,
1534
+ children: "本策略无高级参数;模板变量见上方「variables」。"
1535
+ });
1444
1536
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(JsonField, {
1445
1537
  label: "params(高级参数 JSON;本策略无固定字段)",
1446
1538
  value,
@@ -1449,12 +1541,11 @@ window.__ModuleLoader__.load({
1449
1541
  }
1450
1542
  });
1451
1543
  }
1452
- /** 模板变量键值对编辑器(替代 JSON):每行 key + value,可增删。 */
1544
+ /** 模板变量键值对编辑器(替代 JSON):每行 key + value,可增删。工作台「模板变量」卡片复用。 */
1453
1545
  function VariablesEditor(props) {
1454
1546
  const entries = Object.entries(props.value ?? {});
1455
1547
  const commit = (next) => {
1456
- const cleaned = next.filter(([key]) => key.trim().length > 0);
1457
- props.onChange(cleaned.length > 0 ? Object.fromEntries(cleaned) : void 0);
1548
+ props.onChange(next.length > 0 ? Object.fromEntries(next) : void 0);
1458
1549
  };
1459
1550
  const setEntry = (index, key, value) => {
1460
1551
  commit(entries.map((entry, at) => at === index ? [key, value] : entry));
@@ -1503,7 +1594,7 @@ window.__ModuleLoader__.load({
1503
1594
  type: "button",
1504
1595
  className: PromptUi_module_css_default.pillButton,
1505
1596
  onClick: () => commit([...entries, ["", ""]]),
1506
- children: "添加变量"
1597
+ children: "添加"
1507
1598
  }) })
1508
1599
  ]
1509
1600
  });
@@ -1760,31 +1851,23 @@ window.__ModuleLoader__.load({
1760
1851
  className: PromptUi_module_css_default.configFieldStack,
1761
1852
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
1762
1853
  className: PromptUi_module_css_default.configFieldLabel,
1763
- children: "text(注入文本;空 = 不注入)"
1764
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("textarea", {
1765
- className: PromptUi_module_css_default.configTextarea,
1766
- "aria-label": "注入文本(text,空 = 不注入)",
1767
- value: config.text ?? "",
1768
- spellCheck: false,
1769
- onChange: (e) => {
1770
- autoResizeTextarea(e);
1771
- onPatch({ text: e.target.value });
1772
- }
1773
- })]
1774
- }),
1775
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
1776
- className: PromptUi_module_css_default.configFieldStack,
1777
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
1778
- className: PromptUi_module_css_default.configFieldLabel,
1779
- children: "texts(多段内容块,每行一段;text 为空时生效)"
1854
+ children: "内容(注入文本;空 = 不注入;变量 {{key}} 插值)"
1780
1855
  }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("textarea", {
1781
1856
  className: PromptUi_module_css_default.configTextarea,
1782
- "aria-label": "多段内容块(texts,每行一段;text 为空时生效)",
1783
- value: (config.texts ?? []).join("\n"),
1857
+ "aria-label": "注入内容(空 = 不注入)",
1858
+ value: [config.text ?? "", ...config.texts ?? []].filter((item) => item.length > 0).join("\n"),
1784
1859
  spellCheck: false,
1785
1860
  onChange: (e) => {
1786
1861
  autoResizeTextarea(e);
1787
- onPatch({ texts: e.target.value.split("\n").filter((line) => line.length > 0) });
1862
+ const next = e.target.value;
1863
+ if (config.id === "prompt-injector" || config.fill === "instruction-hint") onPatch({
1864
+ text: next,
1865
+ texts: []
1866
+ });
1867
+ else onPatch({
1868
+ text: void 0,
1869
+ texts: next.trim().length > 0 ? [next] : []
1870
+ });
1788
1871
  }
1789
1872
  })]
1790
1873
  }),
@@ -1794,6 +1877,7 @@ window.__ModuleLoader__.load({
1794
1877
  }),
1795
1878
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)(StrategyParamsFields, {
1796
1879
  strategy,
1880
+ layer: config.layer,
1797
1881
  params: config.params,
1798
1882
  onPatch: (value) => onPatch({ params: value })
1799
1883
  }),
@@ -1818,83 +1902,108 @@ window.__ModuleLoader__.load({
1818
1902
  if (config.group) chips.push(config.exclusive === true ? `exclusive:${config.group}` : `group:${config.group}`);
1819
1903
  return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("article", {
1820
1904
  className: clsx(PromptUi_module_css_default.configCard, props.expanded && PromptUi_module_css_default.configCardOpen),
1905
+ "data-dragging": props.drag?.dragging ? "" : void 0,
1906
+ "data-drop-before": props.drag?.dropBefore ? "" : void 0,
1907
+ "data-drop-after": props.drag?.dropAfter ? "" : void 0,
1908
+ onDragOver: props.drag?.onDragOver,
1909
+ onDrop: props.drag?.onDrop,
1910
+ onDragEnd: props.drag?.onDragEnd,
1821
1911
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("header", {
1822
1912
  className: PromptUi_module_css_default.configHeader,
1823
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
1824
- type: "button",
1825
- className: PromptUi_module_css_default.configToggle,
1826
- "aria-expanded": props.expanded,
1827
- onClick: props.onToggleExpanded,
1828
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
1829
- className: PromptUi_module_css_default.configTitle,
1830
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
1831
- className: PromptUi_module_css_default.configName,
1832
- children: config.name && config.name !== config.id ? `${config.id} · ${config.name}` : config.id
1833
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
1834
- className: PromptUi_module_css_default.configMeta,
1835
- children: chips.join(" · ")
1836
- })]
1837
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconChevronDownOutline14, { className: clsx(PromptUi_module_css_default.chevron, props.expanded && PromptUi_module_css_default.chevronOpen) })]
1838
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
1839
- className: PromptUi_module_css_default.configHeaderActions,
1840
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("label", {
1841
- className: PromptUi_module_css_default.configEnable,
1842
- title: enabled ? "点击关闭" : "点击启用",
1843
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
1844
- type: "checkbox",
1845
- checked: enabled,
1846
- "aria-label": `启用 ${config.name ?? config.id}`,
1847
- onChange: (e) => props.onToggleEnabled(e.target.checked)
1848
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
1849
- className: PromptUi_module_css_default.switch,
1850
- "aria-hidden": "true",
1851
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("i", {})
1913
+ children: [
1914
+ props.drag !== void 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
1915
+ className: PromptUi_module_css_default.dragHandle,
1916
+ title: "拖动调整顺序",
1917
+ "aria-hidden": "true",
1918
+ draggable: true,
1919
+ onDragStart: props.drag.onDragStart,
1920
+ children: "⠿"
1921
+ }),
1922
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
1923
+ type: "button",
1924
+ className: PromptUi_module_css_default.configToggle,
1925
+ "aria-expanded": props.expanded,
1926
+ onClick: props.onToggleExpanded,
1927
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
1928
+ className: PromptUi_module_css_default.configTitle,
1929
+ children: [
1930
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
1931
+ className: PromptUi_module_css_default.configName,
1932
+ children: config.name && config.name !== config.id ? `${config.id} · ${config.name}` : config.id
1933
+ }),
1934
+ config.layer === "system-section" && config.params?.sectionName === "deployment:persona" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
1935
+ className: PromptUi_module_css_default.configChip,
1936
+ title: "deployment:persona 同名 shadow:主会话人设(子代理经 scope 链继承)",
1937
+ children: "人设"
1938
+ }),
1939
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
1940
+ className: PromptUi_module_css_default.configMeta,
1941
+ children: chips.join(" · ")
1942
+ })
1943
+ ]
1944
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconChevronDownOutline14, { className: clsx(PromptUi_module_css_default.chevron, props.expanded && PromptUi_module_css_default.chevronOpen) })]
1945
+ }),
1946
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
1947
+ className: PromptUi_module_css_default.configHeaderActions,
1948
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("label", {
1949
+ className: PromptUi_module_css_default.configEnable,
1950
+ title: enabled ? "点击关闭" : "点击启用",
1951
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
1952
+ type: "checkbox",
1953
+ checked: enabled,
1954
+ "aria-label": `启用 ${config.name ?? config.id}`,
1955
+ onChange: (e) => props.onToggleEnabled(e.target.checked)
1956
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
1957
+ className: PromptUi_module_css_default.switch,
1958
+ "aria-hidden": "true",
1959
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("i", {})
1960
+ })]
1961
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
1962
+ className: PromptUi_module_css_default.configActions,
1963
+ children: [
1964
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
1965
+ type: "button",
1966
+ className: PromptUi_module_css_default.pillButton,
1967
+ disabled: !actions.canMoveUp,
1968
+ onClick: actions.onMoveUp,
1969
+ children: "上移"
1970
+ }),
1971
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
1972
+ type: "button",
1973
+ className: PromptUi_module_css_default.pillButton,
1974
+ disabled: !actions.canMoveDown,
1975
+ onClick: actions.onMoveDown,
1976
+ children: "下移"
1977
+ }),
1978
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
1979
+ type: "button",
1980
+ className: PromptUi_module_css_default.pillButton,
1981
+ onClick: actions.onDuplicate,
1982
+ children: "复制"
1983
+ }),
1984
+ confirmingDelete ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
1985
+ type: "button",
1986
+ className: PromptUi_module_css_default.pillButton,
1987
+ "data-danger": true,
1988
+ onClick: actions.onDelete,
1989
+ children: "确认删除"
1990
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
1991
+ type: "button",
1992
+ className: PromptUi_module_css_default.pillButton,
1993
+ "data-variant": "secondary",
1994
+ onClick: () => setConfirmingDelete(false),
1995
+ children: "取消"
1996
+ })] }) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
1997
+ type: "button",
1998
+ className: PromptUi_module_css_default.pillButton,
1999
+ "data-danger": true,
2000
+ onClick: () => setConfirmingDelete(true),
2001
+ children: "删除"
2002
+ })
2003
+ ]
1852
2004
  })]
1853
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
1854
- className: PromptUi_module_css_default.configActions,
1855
- children: [
1856
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
1857
- type: "button",
1858
- className: PromptUi_module_css_default.pillButton,
1859
- disabled: !actions.canMoveUp,
1860
- onClick: actions.onMoveUp,
1861
- children: "上移"
1862
- }),
1863
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
1864
- type: "button",
1865
- className: PromptUi_module_css_default.pillButton,
1866
- disabled: !actions.canMoveDown,
1867
- onClick: actions.onMoveDown,
1868
- children: "下移"
1869
- }),
1870
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
1871
- type: "button",
1872
- className: PromptUi_module_css_default.pillButton,
1873
- onClick: actions.onDuplicate,
1874
- children: "复制"
1875
- }),
1876
- confirmingDelete ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
1877
- type: "button",
1878
- className: PromptUi_module_css_default.pillButton,
1879
- "data-danger": true,
1880
- onClick: actions.onDelete,
1881
- children: "确认删除"
1882
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
1883
- type: "button",
1884
- className: PromptUi_module_css_default.pillButton,
1885
- "data-variant": "secondary",
1886
- onClick: () => setConfirmingDelete(false),
1887
- children: "取消"
1888
- })] }) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
1889
- type: "button",
1890
- className: PromptUi_module_css_default.pillButton,
1891
- "data-danger": true,
1892
- onClick: () => setConfirmingDelete(true),
1893
- children: "删除"
1894
- })
1895
- ]
1896
- })]
1897
- })]
2005
+ })
2006
+ ]
1898
2007
  }), props.expanded && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(PromptConfigForm, {
1899
2008
  meta,
1900
2009
  config,
@@ -1905,18 +2014,44 @@ window.__ModuleLoader__.load({
1905
2014
  //#endregion
1906
2015
  //#region src/client/PromptConfigList.tsx
1907
2016
  const layerOf = (config) => config.layer ?? "pre-step";
1908
- /** 在全局数组中按同层位置交换;未指定 layer 时也保持“同层内移动”语义。 */
1909
- function moveWithinLayer(all, globalIndex, delta, layer) {
1910
- const layerIndices = all.flatMap((config, index) => layer === void 0 || layerOf(config) === layer ? [index] : []);
1911
- const position = layerIndices.indexOf(globalIndex);
1912
- const target = position + delta;
1913
- if (position < 0 || target < 0 || target >= layerIndices.length) return all;
1914
- const targetIndex = layerIndices[target];
2017
+ /** 与列表一致的显示视图排序:按(层序, order, 声明序)稳定排序,返回排序后 id 序列。 */
2018
+ function viewOrderedIds(all, layer, layers) {
2019
+ const layerRank = (config) => {
2020
+ const index = layers.indexOf(layerOf(config));
2021
+ return index < 0 ? layers.length : index;
2022
+ };
2023
+ return all.map((config, index) => ({
2024
+ config,
2025
+ index
2026
+ })).filter((entry) => layer === void 0 || layerOf(entry.config) === layer).sort((a, b) => {
2027
+ const byLayer = layerRank(a.config) - layerRank(b.config);
2028
+ if (byLayer !== 0) return byLayer;
2029
+ const byOrder = (a.config.order ?? 0) - (b.config.order ?? 0);
2030
+ if (byOrder !== 0) return byOrder;
2031
+ return a.index - b.index;
2032
+ }).map((entry) => entry.config.id);
2033
+ }
2034
+ /**
2035
+ * 在显示视图中向上/向下移动:目标 = 当前项的显示相邻项(层序/order/声明序),
2036
+ * 交换两者的 order 与数组位置——显示顺序与引擎注入顺序(数组序)同步变化。
2037
+ * 修复:此前按数组相邻交换,跨层配置混合时数组顺序 ≠ 显示顺序,上移/下移视觉失效。
2038
+ */
2039
+ function moveWithinLayer(all, globalIndex, delta, layer, layers) {
2040
+ const currentId = all[globalIndex]?.id;
2041
+ if (currentId === void 0) return all;
2042
+ const view = viewOrderedIds(all, layer, layers ?? []);
2043
+ const viewIndex = view.indexOf(currentId);
2044
+ const targetViewIndex = viewIndex + delta;
2045
+ if (viewIndex < 0 || targetViewIndex < 0 || targetViewIndex >= view.length) return all;
2046
+ const targetId = view[targetViewIndex];
2047
+ const currentIndex = all.findIndex((config) => config.id === currentId);
2048
+ const targetIndex = all.findIndex((config) => config.id === targetId);
2049
+ if (currentIndex < 0 || targetIndex < 0) return all;
1915
2050
  const next = [...all];
1916
- const current = next[globalIndex];
2051
+ const current = next[currentIndex];
1917
2052
  const targetCard = next[targetIndex];
1918
2053
  if (current === void 0 || targetCard === void 0) return all;
1919
- next[globalIndex] = {
2054
+ next[currentIndex] = {
1920
2055
  ...targetCard,
1921
2056
  order: current.order ?? 0
1922
2057
  };
@@ -1926,14 +2061,37 @@ window.__ModuleLoader__.load({
1926
2061
  };
1927
2062
  return next;
1928
2063
  }
2064
+ /** 拖拽移动到目标显示位置:把 source 移到 target 前/后,用显示视图相邻交换逐步到位
2065
+ * (order 链式交换,与连续点击上移/下移等价)。 */
2066
+ function moveToView(all, sourceId, targetId, before, layer, layers) {
2067
+ const view = viewOrderedIds(all, layer, layers ?? []);
2068
+ const sourceIndex = view.indexOf(sourceId);
2069
+ if (sourceIndex < 0) return all;
2070
+ const targetIndex = view.filter((id) => id !== sourceId).indexOf(targetId);
2071
+ if (targetIndex < 0) return all;
2072
+ const targetViewIndex = targetIndex + (before ? 0 : 1);
2073
+ if (targetViewIndex === sourceIndex) return all;
2074
+ const steps = targetViewIndex - sourceIndex;
2075
+ const delta = steps > 0 ? 1 : -1;
2076
+ let current = all;
2077
+ for (let step = 0; step < Math.abs(steps); step++) {
2078
+ const globalIndex = current.findIndex((config) => config.id === sourceId);
2079
+ if (globalIndex < 0) break;
2080
+ current = moveWithinLayer(current, globalIndex, delta, layer, layers);
2081
+ }
2082
+ return current;
2083
+ }
1929
2084
  /** 共享的提示词配置列表:校验、保存、脏检测、复制、删除、层内移动。 */
1930
2085
  function PromptConfigList(props) {
1931
- const { meta, configs, savedConfigs, layer, scope, extraActions, emptyHint, onPatchConfigs, onSaveConfigs, onNotice } = props;
2086
+ const { meta, configs, savedConfigs, layer, scope, extraActions, beforeCards, emptyHint, onPatchConfigs, onSaveConfigs, onNotice } = props;
1932
2087
  const [expanded, setExpanded] = (0, react.useState)(void 0);
1933
2088
  const [errors, setErrors] = (0, react.useState)([]);
1934
2089
  const [validating, setValidating] = (0, react.useState)(false);
1935
2090
  const [saving, setSaving] = (0, react.useState)(false);
1936
2091
  const [filter, setFilter] = (0, react.useState)("");
2092
+ /** 拖拽排序状态:源卡片 id + 落点(目标 id + 前/后)。 */
2093
+ const [dragId, setDragId] = (0, react.useState)(void 0);
2094
+ const [dropTarget, setDropTarget] = (0, react.useState)(void 0);
1937
2095
  /** 合并过滤下拉:全部 / 世界书(策略)/ 各注入层级。外部 layer prop 传入时固定该层。 */
1938
2096
  const [viewFilter, setViewFilter] = (0, react.useState)("all");
1939
2097
  const effectiveLayer = layer ?? (viewFilter !== "all" && viewFilter !== "world-book" ? viewFilter : void 0);
@@ -2033,13 +2191,42 @@ window.__ModuleLoader__.load({
2033
2191
  };
2034
2192
  const renderCard = (config) => {
2035
2193
  const globalIndex = configs.indexOf(config);
2036
- const layerIndices = configs.flatMap((candidate, index) => layer === void 0 || layerOf(candidate) === layer ? [index] : []);
2037
- const position = layerIndices.indexOf(globalIndex);
2194
+ const view = viewOrderedIds(configs, layer, meta.layers);
2195
+ const position = view.indexOf(config.id);
2038
2196
  const isOpen = expanded === config.id;
2039
2197
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(PromptConfigCard, {
2040
2198
  meta,
2041
2199
  config,
2042
2200
  expanded: isOpen,
2201
+ drag: {
2202
+ dragging: dragId === config.id,
2203
+ dropBefore: dropTarget?.id === config.id && dropTarget.before,
2204
+ dropAfter: dropTarget?.id === config.id && !dropTarget.before,
2205
+ onDragStart: (event) => {
2206
+ setDragId(config.id);
2207
+ event.dataTransfer.effectAllowed = "move";
2208
+ },
2209
+ onDragOver: (event) => {
2210
+ event.preventDefault();
2211
+ if (dragId === void 0 || dragId === config.id) return;
2212
+ const rect = event.currentTarget.getBoundingClientRect();
2213
+ setDropTarget({
2214
+ id: config.id,
2215
+ before: event.clientY < rect.top + rect.height / 2
2216
+ });
2217
+ },
2218
+ onDrop: (event) => {
2219
+ event.preventDefault();
2220
+ const target = dropTarget;
2221
+ if (dragId !== void 0 && target !== void 0 && dragId !== config.id) onPatchConfigs(moveToView(configs, dragId, target.id, target.before, layer, meta.layers));
2222
+ setDragId(void 0);
2223
+ setDropTarget(void 0);
2224
+ },
2225
+ onDragEnd: () => {
2226
+ setDragId(void 0);
2227
+ setDropTarget(void 0);
2228
+ }
2229
+ },
2043
2230
  onToggleExpanded: () => {
2044
2231
  setExpanded(isOpen ? void 0 : config.id);
2045
2232
  },
@@ -2047,9 +2234,9 @@ window.__ModuleLoader__.load({
2047
2234
  onPatch: (patch) => patchAt(globalIndex, patch),
2048
2235
  actions: {
2049
2236
  canMoveUp: position > 0,
2050
- canMoveDown: position >= 0 && position < layerIndices.length - 1,
2051
- onMoveUp: () => onPatchConfigs(moveWithinLayer(configs, globalIndex, -1, layer)),
2052
- onMoveDown: () => onPatchConfigs(moveWithinLayer(configs, globalIndex, 1, layer)),
2237
+ canMoveDown: position >= 0 && position < view.length - 1,
2238
+ onMoveUp: () => onPatchConfigs(moveWithinLayer(configs, globalIndex, -1, layer, meta.layers)),
2239
+ onMoveDown: () => onPatchConfigs(moveWithinLayer(configs, globalIndex, 1, layer, meta.layers)),
2053
2240
  onDuplicate: () => duplicateAt(globalIndex),
2054
2241
  onDelete: () => removeAt(globalIndex)
2055
2242
  }
@@ -2159,6 +2346,7 @@ window.__ModuleLoader__.load({
2159
2346
  ]
2160
2347
  }, `${error.index}-${index}`))
2161
2348
  }),
2349
+ beforeCards,
2162
2350
  scoped.length === 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
2163
2351
  className: PromptUi_module_css_default.emptyState,
2164
2352
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
@@ -2229,7 +2417,7 @@ window.__ModuleLoader__.load({
2229
2417
  "tool-pipeline": "工具管线层"
2230
2418
  };
2231
2419
  function TemplatePicker(props) {
2232
- const { templates, layer, onPick, onClose } = props;
2420
+ const { templates, layer, onPick, onPickVariables, onClose } = props;
2233
2421
  const dialogRef = (0, react.useRef)(null);
2234
2422
  const restoreRef = (0, react.useRef)(null);
2235
2423
  (0, react.useEffect)(() => {
@@ -2294,21 +2482,36 @@ window.__ModuleLoader__.load({
2294
2482
  })]
2295
2483
  }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
2296
2484
  className: PromptUi_module_css_default.templateModalList,
2297
- children: [visible.length === 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
2298
- className: PromptUi_module_css_default.configFieldHint,
2299
- children: "本层暂无内置模板。"
2300
- }), [...groups.entries()].map(([groupLayer, items]) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
2301
- className: PromptUi_module_css_default.templateGroup,
2302
- children: [layer === void 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("strong", {
2303
- className: PromptUi_module_css_default.templateGroupTitle,
2304
- children: TEMPLATE_LAYER_TITLES[groupLayer] ?? groupLayer
2305
- }), items.map((template) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
2306
- type: "button",
2307
- className: PromptUi_module_css_default.templateModalItem,
2308
- onClick: () => onPick(template),
2309
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("strong", { children: template.file }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("small", { children: template.spec.name ?? template.spec.id })]
2310
- }, template.file))]
2311
- }, groupLayer))]
2485
+ children: [
2486
+ onPickVariables !== void 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
2487
+ className: PromptUi_module_css_default.templateGroup,
2488
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("strong", {
2489
+ className: PromptUi_module_css_default.templateGroupTitle,
2490
+ children: "变量"
2491
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
2492
+ type: "button",
2493
+ className: PromptUi_module_css_default.templateModalItem,
2494
+ onClick: onPickVariables,
2495
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("strong", { children: "Variables" }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("small", { children: "模板变量(预设级 {{key}} 插值)" })]
2496
+ })]
2497
+ }),
2498
+ visible.length === 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
2499
+ className: PromptUi_module_css_default.configFieldHint,
2500
+ children: "本层暂无内置模板。"
2501
+ }),
2502
+ [...groups.entries()].map(([groupLayer, items]) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
2503
+ className: PromptUi_module_css_default.templateGroup,
2504
+ children: [layer === void 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("strong", {
2505
+ className: PromptUi_module_css_default.templateGroupTitle,
2506
+ children: TEMPLATE_LAYER_TITLES[groupLayer] ?? groupLayer
2507
+ }), items.map((template) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
2508
+ type: "button",
2509
+ className: PromptUi_module_css_default.templateModalItem,
2510
+ onClick: () => onPick(template),
2511
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("strong", { children: template.file }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("small", { children: template.spec.name ?? template.spec.id })]
2512
+ }, template.file))]
2513
+ }, groupLayer))
2514
+ ]
2312
2515
  })]
2313
2516
  })
2314
2517
  });
@@ -2361,9 +2564,113 @@ window.__ModuleLoader__.load({
2361
2564
  }
2362
2565
  //#endregion
2363
2566
  //#region src/client/PromptConfigsEditor.tsx
2567
+ /** 预设级模板变量模块卡片(归类于配置列表下):{{key}} 插值源,非 promptConfig——
2568
+ * 不进配置保存路径,保存走 /preset-variables 写 preset.yml 顶层 variables 段。
2569
+ * 可折叠(chevron)/ 可删除(清空全部变量,两段式确认)/ 可新建(VariablesEditor 添加变量)。 */
2570
+ function TemplateVariablesModuleCard(props) {
2571
+ const [confirmingDelete, setConfirmingDelete] = (0, react.useState)(false);
2572
+ const cardRef = (0, react.useRef)(null);
2573
+ const count = Object.keys(props.templateVariables).length;
2574
+ const enabled = props.templateVariablesEnabled;
2575
+ if (count === 0) return null;
2576
+ const clearAll = () => {
2577
+ props.setTemplateVariables({});
2578
+ props.saveTemplateVariables({});
2579
+ setConfirmingDelete(false);
2580
+ if (props.expanded) props.onToggleExpanded();
2581
+ };
2582
+ /** 失焦自动保存:焦点离开卡片容器(含收起/切换开关/点击删除)即持久化。 */
2583
+ const autoSaveOnBlur = (event) => {
2584
+ const next = event.relatedTarget;
2585
+ if (next === null || !cardRef.current?.contains(next)) props.saveTemplateVariables();
2586
+ };
2587
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("article", {
2588
+ ref: cardRef,
2589
+ className: PromptUi_module_css_default.configCard,
2590
+ onBlur: autoSaveOnBlur,
2591
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("header", {
2592
+ className: PromptUi_module_css_default.configHeader,
2593
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
2594
+ type: "button",
2595
+ className: PromptUi_module_css_default.configToggle,
2596
+ "aria-expanded": props.expanded,
2597
+ onClick: props.onToggleExpanded,
2598
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
2599
+ className: PromptUi_module_css_default.configTitle,
2600
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
2601
+ className: PromptUi_module_css_default.configName,
2602
+ children: "模板变量"
2603
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
2604
+ className: PromptUi_module_css_default.configMeta,
2605
+ children: `预设级 {{key}} 插值 · ${count} 个变量`
2606
+ })]
2607
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconChevronDownOutline14, { className: clsx(PromptUi_module_css_default.chevron, props.expanded && PromptUi_module_css_default.chevronOpen) })]
2608
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
2609
+ className: PromptUi_module_css_default.configHeaderActions,
2610
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("label", {
2611
+ className: PromptUi_module_css_default.configEnable,
2612
+ title: enabled ? "点击停用模板变量插值" : "点击启用模板变量插值",
2613
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
2614
+ type: "checkbox",
2615
+ "aria-label": "启用模板变量插值",
2616
+ checked: enabled,
2617
+ onChange: (e) => {
2618
+ props.setTemplateVariablesEnabled(e.target.checked);
2619
+ props.saveTemplateVariables();
2620
+ }
2621
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
2622
+ className: PromptUi_module_css_default.switch,
2623
+ "aria-hidden": "true",
2624
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("i", {})
2625
+ })]
2626
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
2627
+ className: PromptUi_module_css_default.configActions,
2628
+ children: confirmingDelete ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
2629
+ type: "button",
2630
+ className: PromptUi_module_css_default.pillButton,
2631
+ "data-danger": true,
2632
+ onClick: clearAll,
2633
+ children: "确认清空"
2634
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
2635
+ type: "button",
2636
+ className: PromptUi_module_css_default.pillButton,
2637
+ "data-variant": "secondary",
2638
+ onClick: () => setConfirmingDelete(false),
2639
+ children: "取消"
2640
+ })] }) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
2641
+ type: "button",
2642
+ className: PromptUi_module_css_default.pillButton,
2643
+ "data-danger": true,
2644
+ onClick: () => setConfirmingDelete(true),
2645
+ children: "删除"
2646
+ })
2647
+ })]
2648
+ })]
2649
+ }), props.expanded && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
2650
+ className: PromptUi_module_css_default.configForm,
2651
+ children: [!enabled && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
2652
+ className: PromptUi_module_css_default.configFieldHint,
2653
+ children: "模板变量插值已停用:{{key}} 将不再被替换(预设级变量文件不生成)。"
2654
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(VariablesEditor, {
2655
+ value: props.templateVariables,
2656
+ onChange: (next) => props.setTemplateVariables(next ?? {})
2657
+ })]
2658
+ })]
2659
+ });
2660
+ }
2364
2661
  /** 提示词配置编辑器:配置列表(层级/策略过滤已并入列表)+ 模板插入 + 保存前权威校验。 */
2365
2662
  function PromptConfigsEditor(props) {
2663
+ const [templateVarsExpanded, setTemplateVarsExpanded] = (0, react.useState)(false);
2366
2664
  const templatePicker = useTemplatePicker(props.configs, (config) => props.onPatchConfigs([...props.configs, config]), props.onNotice);
2665
+ /** 「新建 → Variables」:展开模板变量卡片并添加一个待编辑空行。 */
2666
+ const pickVariables = () => {
2667
+ props.setTemplateVariables({
2668
+ ...props.templateVariables,
2669
+ "": ""
2670
+ });
2671
+ setTemplateVarsExpanded(true);
2672
+ templatePicker.closePicker();
2673
+ };
2367
2674
  return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("section", {
2368
2675
  className: PromptUi_module_css_default.page,
2369
2676
  "aria-label": "提示词配置",
@@ -2378,6 +2685,15 @@ window.__ModuleLoader__.load({
2378
2685
  onClick: templatePicker.openPicker,
2379
2686
  children: "新建"
2380
2687
  }),
2688
+ beforeCards: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(TemplateVariablesModuleCard, {
2689
+ templateVariables: props.templateVariables,
2690
+ setTemplateVariables: props.setTemplateVariables,
2691
+ templateVariablesEnabled: props.templateVariablesEnabled,
2692
+ setTemplateVariablesEnabled: props.setTemplateVariablesEnabled,
2693
+ saveTemplateVariables: props.saveTemplateVariables,
2694
+ expanded: templateVarsExpanded,
2695
+ onToggleExpanded: () => setTemplateVarsExpanded(!templateVarsExpanded)
2696
+ }),
2381
2697
  onPatchConfigs: props.onPatchConfigs,
2382
2698
  onSaveConfigs: props.onSaveConfigs,
2383
2699
  onNotice: props.onNotice
@@ -2385,6 +2701,7 @@ window.__ModuleLoader__.load({
2385
2701
  templatePicker.open && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(TemplatePicker, {
2386
2702
  templates: templatePicker.templates,
2387
2703
  onPick: templatePicker.pickTemplate,
2704
+ onPickVariables: pickVariables,
2388
2705
  onClose: templatePicker.closePicker
2389
2706
  }),
2390
2707
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("p", {
@@ -2891,14 +3208,21 @@ window.__ModuleLoader__.load({
2891
3208
  for (const byte of bytes) text += String.fromCharCode(byte);
2892
3209
  return text;
2893
3210
  }
2894
- function decodeBase64(text) {
3211
+ async function decodeBase64(text) {
2895
3212
  const binary = atob(text);
2896
3213
  const bytes = new Uint8Array(binary.length);
2897
3214
  for (let index = 0; index < binary.length; index++) bytes[index] = binary.charCodeAt(index);
2898
- return new TextDecoder("utf-8").decode(bytes);
3215
+ const plain = new TextDecoder("utf-8").decode(bytes);
3216
+ try {
3217
+ JSON.parse(plain);
3218
+ return plain;
3219
+ } catch {
3220
+ const stream = new Blob([bytes]).stream().pipeThrough(new DecompressionStream("deflate"));
3221
+ return new TextDecoder("utf-8").decode(await new Response(stream).arrayBuffer());
3222
+ }
2899
3223
  }
2900
3224
  /** 解析角色卡 PNG:返回角色卡 JSON + 原图 base64。非 PNG / 无角色卡 chunk 抛错。 */
2901
- function parseCharacterCardPng(buffer, fileName) {
3225
+ async function parseCharacterCardPng(buffer, fileName) {
2902
3226
  const bytes = new Uint8Array(buffer);
2903
3227
  if (bytes.length < 24 || bytes[0] !== 137 || bytes[1] !== 80 || bytes[2] !== 78 || bytes[3] !== 71) throw new Error("不是有效的 PNG 文件");
2904
3228
  const chunks = [];
@@ -2921,7 +3245,7 @@ window.__ModuleLoader__.load({
2921
3245
  }
2922
3246
  const card = chunks.find((chunk) => chunk.keyword === "ccv3") ?? chunks.find((chunk) => chunk.keyword === "chara");
2923
3247
  if (card === void 0) throw new Error("PNG 不含角色卡数据(无 chara/ccv3 tEXt chunk)");
2924
- const jsonText = decodeBase64(card.text);
3248
+ const jsonText = await decodeBase64(card.text);
2925
3249
  let name = "";
2926
3250
  try {
2927
3251
  const parsed = JSON.parse(jsonText);
@@ -2969,7 +3293,7 @@ window.__ModuleLoader__.load({
2969
3293
  setImporting(true);
2970
3294
  try {
2971
3295
  for (const file of Array.from(files)) if (/\.png$/i.test(file.name)) {
2972
- const card = parseCharacterCardPng(await file.arrayBuffer(), file.name);
3296
+ const card = await parseCharacterCardPng(await file.arrayBuffer(), file.name);
2973
3297
  const res = await bridgePost("/characters-import", { files: [{
2974
3298
  path: "avatar.png",
2975
3299
  content: card.imageBase64
@@ -3488,26 +3812,6 @@ window.__ModuleLoader__.load({
3488
3812
  })]
3489
3813
  })
3490
3814
  }),
3491
- props.scope === "main" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
3492
- className: PromptUi_module_css_default.rowGroup,
3493
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("label", {
3494
- className: PromptUi_module_css_default.textBlock,
3495
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
3496
- className: PromptUi_module_css_default.settingCopy,
3497
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("strong", { children: "主对话自定义模型人设" }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("small", { children: "主对话命中快速模型(Flash 档)时替换人设(router-first-turn);子代理未单独设置时回退使用。留空 = 模板默认;失焦保存。" })]
3498
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("textarea", {
3499
- className: PromptUi_module_css_default.firstTurnInput,
3500
- value: fields.mainPersona,
3501
- disabled: !fields.writePreset,
3502
- onChange: (event) => {
3503
- autoResizeTextarea(event);
3504
- store.patch({ mainPersona: event.target.value });
3505
- },
3506
- onBlur: () => void store.persistParamOverrides(),
3507
- spellCheck: false
3508
- })]
3509
- })
3510
- }),
3511
3815
  props.scope === "subagent" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
3512
3816
  className: PromptUi_module_css_default.rowGroup,
3513
3817
  children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("label", {
@@ -3648,7 +3952,12 @@ window.__ModuleLoader__.load({
3648
3952
  savedConfigs: store.savedConfigs,
3649
3953
  onPatchConfigs: (configs) => store.patch({ promptConfigs: configs }),
3650
3954
  onSaveConfigs: (configs) => store.persistConfigs(configs),
3651
- onNotice: store.showNotice
3955
+ onNotice: store.showNotice,
3956
+ templateVariables: store.templateVariables,
3957
+ setTemplateVariables: store.setTemplateVariables,
3958
+ templateVariablesEnabled: store.templateVariablesEnabled,
3959
+ setTemplateVariablesEnabled: store.setTemplateVariablesEnabled,
3960
+ saveTemplateVariables: store.saveTemplateVariables
3652
3961
  })
3653
3962
  ]
3654
3963
  });