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.
- package/README.md +18 -12
- package/engine/anchor-match.mjs +117 -0
- package/engine/compositions/library/context-gate.yml +2 -2
- package/engine/compositions/library/delegation.yml +2 -2
- package/engine/compositions/library/str-replace-editor.yml +1 -1
- package/engine/compositions/library/tool-bootstrap.yml +2 -2
- package/engine/compositions/library/tool-filter.yml +3 -3
- package/engine/compositions/source/local/context-gate.yml +2 -2
- package/engine/compositions/source/local/tool-bootstrap.yml +3 -3
- package/engine/executor.mjs +9 -2
- package/engine/interpolate.mjs +66 -0
- package/engine/layers.mjs +26 -22
- package/engine/schema.mjs +18 -0
- package/engine/session-vars.mjs +52 -0
- package/engine/shared.mjs +0 -19
- package/engine/strategies.mjs +28 -38
- package/lib/client.js +471 -162
- package/lib/client.js.map +1 -1
- package/lib/index.d.mts +35 -9
- package/lib/index.mjs +376 -92
- package/lib/preset-core.d.mts +2 -2
- package/lib/preset-core.mjs +3 -6
- package/lib/{prompt-configs-BcP6miu9.d.mts → prompt-configs-B4vH09wx.d.mts} +1 -3
- package/lib/{prompt-configs-k7wuZs0C.mjs → prompt-configs-ThS4iXPg.mjs} +85 -33
- package/package.json +105 -104
- package/preset/anchored/preset.yml +40 -42
- package/preset/creative/preset.yml +33 -30
- package/preset/creative/skills/cordis-plugin-development/SKILL.md +420 -0
- package/preset/creative/skills/editing-cordis-compositions/SKILL.md +165 -0
- package/preset/liangshen/preset.yml +24 -18
- package/preset/minimal/preset.yml +27 -24
- package/preset/ptc/preset.yml +23 -17
- package/preset/standard/preset.yml +23 -17
- package/templates/20-system-section.yml +5 -0
- package/engine/compositions/library/router-first-turn.yml +0 -9
- package/engine/compositions/source/local/router-first-turn.yml +0 -5
- 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
|
-
|
|
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
|
-
|
|
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: "
|
|
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": "
|
|
1783
|
-
value:
|
|
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
|
-
|
|
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: [
|
|
1824
|
-
|
|
1825
|
-
|
|
1826
|
-
|
|
1827
|
-
|
|
1828
|
-
|
|
1829
|
-
|
|
1830
|
-
children:
|
|
1831
|
-
|
|
1832
|
-
|
|
1833
|
-
|
|
1834
|
-
|
|
1835
|
-
|
|
1836
|
-
|
|
1837
|
-
|
|
1838
|
-
|
|
1839
|
-
|
|
1840
|
-
|
|
1841
|
-
|
|
1842
|
-
|
|
1843
|
-
|
|
1844
|
-
|
|
1845
|
-
|
|
1846
|
-
|
|
1847
|
-
|
|
1848
|
-
|
|
1849
|
-
|
|
1850
|
-
|
|
1851
|
-
|
|
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
|
-
})
|
|
1854
|
-
|
|
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
|
-
/**
|
|
1909
|
-
function
|
|
1910
|
-
const
|
|
1911
|
-
|
|
1912
|
-
|
|
1913
|
-
|
|
1914
|
-
|
|
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[
|
|
2051
|
+
const current = next[currentIndex];
|
|
1917
2052
|
const targetCard = next[targetIndex];
|
|
1918
2053
|
if (current === void 0 || targetCard === void 0) return all;
|
|
1919
|
-
next[
|
|
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
|
|
2037
|
-
const position =
|
|
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 <
|
|
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: [
|
|
2298
|
-
|
|
2299
|
-
|
|
2300
|
-
|
|
2301
|
-
|
|
2302
|
-
|
|
2303
|
-
|
|
2304
|
-
|
|
2305
|
-
|
|
2306
|
-
|
|
2307
|
-
|
|
2308
|
-
|
|
2309
|
-
|
|
2310
|
-
|
|
2311
|
-
|
|
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
|
-
|
|
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
|
});
|