@eddyskywalker/dsh-chatgpt-subscription 0.55.0 → 0.57.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +24 -0
- package/README.md +148 -1268
- package/lib/client.js +298 -17
- package/lib/client.js.map +1 -1
- package/lib/index.js +413 -68
- package/lib/plan-mode.js +3 -7
- package/lib/tool-result-pruner.js +1 -1
- package/lib/types/client/locales-ru/index.d.ts +2 -3
- package/lib/types/client/locales-ru/index.d.ts.map +1 -1
- package/lib/types/client/locales-ru/progress-updates.d.ts.map +1 -1
- package/lib/types/client/minimax-code/commands-contract.d.ts +1 -1
- package/lib/types/client/progress-updates/locales.d.ts +8 -2
- package/lib/types/client/progress-updates/locales.d.ts.map +1 -1
- package/lib/types/client/progress-updates/settings-binding.d.ts +8 -1
- package/lib/types/client/progress-updates/settings-binding.d.ts.map +1 -1
- package/lib/types/client/progress-updates/settings-section.d.ts +2 -1
- package/lib/types/client/progress-updates/settings-section.d.ts.map +1 -1
- package/lib/types/client/subagent/SubagentCard.d.ts.map +1 -1
- package/lib/types/client/subagent/locales.d.ts +14 -2
- package/lib/types/client/subagent/locales.d.ts.map +1 -1
- package/lib/types/client/subagent/styles.d.ts +1 -1
- package/lib/types/client/subagent/styles.d.ts.map +1 -1
- package/lib/types/client/subagent/subagent-card-controller.d.ts +26 -3
- package/lib/types/client/subagent/subagent-card-controller.d.ts.map +1 -1
- package/lib/types/compat.d.ts +1 -1
- package/lib/types/entry-plan-mode.d.ts +3 -7
- package/lib/types/entry-plan-mode.d.ts.map +1 -1
- package/lib/types/entry-tool-result-pruner.d.ts +1 -1
- package/lib/types/host/agent-preset.d.ts +5 -0
- package/lib/types/host/agent-preset.d.ts.map +1 -1
- package/lib/types/host/common/llm-compat.d.ts +3 -1
- package/lib/types/host/common/llm-compat.d.ts.map +1 -1
- package/lib/types/host/kimi-code/repeat-breaker.d.ts +1 -1
- package/lib/types/host/plan-mode-cache-guard.d.ts.map +1 -1
- package/lib/types/host/preferences.d.ts.map +1 -1
- package/lib/types/host/routes.d.ts.map +1 -1
- package/lib/types/host/subagent-model-authorization.d.ts +34 -16
- package/lib/types/host/subagent-model-authorization.d.ts.map +1 -1
- package/lib/types/host/subagent-route-audit.d.ts +6 -1
- package/lib/types/host/subagent-route-audit.d.ts.map +1 -1
- package/lib/types/host/team-policy-cache-guard.d.ts +44 -0
- package/lib/types/host/team-policy-cache-guard.d.ts.map +1 -0
- package/lib/types/index.d.ts +16 -2
- package/lib/types/index.d.ts.map +1 -1
- package/lib/types/shared/contracts.d.ts +19 -0
- package/lib/types/shared/contracts.d.ts.map +1 -1
- package/lib/types/shared/preferences.d.ts +22 -1
- package/lib/types/shared/preferences.d.ts.map +1 -1
- package/package.json +46 -43
- package/presets/dispatch/README.md +32 -11
- package/presets/dispatch/agent.cordis.yml +26 -22
package/lib/client.js
CHANGED
|
@@ -21499,6 +21499,8 @@ window.__ModuleLoader__.load({
|
|
|
21499
21499
|
settingsPlanModePipelineNote: "澄清访谈收敛后自动进入计划模式出计划,再交审批(仅调度模式生效);关闭后该模式会请用户手动输入 /plan",
|
|
21500
21500
|
settingsDispatchExecutionGuardName: "调度执行守卫",
|
|
21501
21501
|
settingsDispatchExecutionGuardNote: "执行期拦截子代理越权调用主控工具及等待子代理时的纯 sleep 空等;不改工具声明面,零损耗保护 Kimi 缓存",
|
|
21502
|
+
settingsTeamPolicyCacheGuardName: "智能体团队策略段",
|
|
21503
|
+
settingsTeamPolicyCacheGuardNote: "把内置 Agent Teams 的策略段从系统提示词摘掉,改为开启团队协作时以尾部消息投递一次;会话中途切开关不再刷掉整段前缀缓存(默认开启)",
|
|
21502
21504
|
settingsThresholdName: "催促阈值",
|
|
21503
21505
|
settingsThresholdNote: "连续这么多轮没有进展时,提醒 agent 汇报一次",
|
|
21504
21506
|
settingsLanguageName: "输出语言",
|
|
@@ -21546,6 +21548,8 @@ window.__ModuleLoader__.load({
|
|
|
21546
21548
|
settingsPlanModePipelineNote: "After the clarification interview converges, enter plan mode, write the plan and send it for approval (dispatch mode only); turning it off makes that mode ask the user to type /plan",
|
|
21547
21549
|
settingsDispatchExecutionGuardName: "Dispatch execution guard",
|
|
21548
21550
|
settingsDispatchExecutionGuardNote: "Block subagents from calling dispatcher-only tools at execution time and reject pure sleep waits while child agents run; keeps tool declarations untouched to protect the Kimi prefix cache",
|
|
21551
|
+
settingsTeamPolicyCacheGuardName: "Agent Teams policy section",
|
|
21552
|
+
settingsTeamPolicyCacheGuardNote: "Lift the built-in Agent Teams policy section out of the system prompt and deliver it as one tail message when team collaboration is switched on, so toggling mid-session no longer rebuilds the whole prefix cache (on by default)",
|
|
21549
21553
|
settingsThresholdName: "Nudge threshold",
|
|
21550
21554
|
settingsThresholdNote: "Remind the agent after this many rounds without an update",
|
|
21551
21555
|
settingsLanguageName: "Output language",
|
|
@@ -22930,6 +22934,8 @@ window.__ModuleLoader__.load({
|
|
|
22930
22934
|
settingsPlanModePipelineNote: "После схождения уточняющего интервью автоматически войти в режим плана, подготовить план и отправить его на утверждение (только в режиме диспетчера); если выключено, этот режим попросит пользователя ввести /plan вручную",
|
|
22931
22935
|
settingsDispatchExecutionGuardName: "Защита выполнения диспетчера",
|
|
22932
22936
|
settingsDispatchExecutionGuardNote: "Блокировать вызовы инструментов диспетчера субагентами во время выполнения и запрещать пустое ожидание sleep при активных дочерних агентах; не меняет объявления инструментов и сохраняет префиксный кеш Kimi",
|
|
22937
|
+
settingsTeamPolicyCacheGuardName: "Раздел политики Agent Teams",
|
|
22938
|
+
settingsTeamPolicyCacheGuardNote: "Убрать встроенный раздел политики Agent Teams из системного промпта и передавать его одним сообщением в хвосте при включении командной работы, чтобы переключение посреди сессии больше не пересобирало весь префиксный кеш (включено по умолчанию)",
|
|
22933
22939
|
settingsThresholdName: "Порог напоминания",
|
|
22934
22940
|
settingsThresholdNote: "Напомнить агенту после стольких раундов без отчёта",
|
|
22935
22941
|
settingsLanguageName: "Язык вывода",
|
|
@@ -55300,6 +55306,34 @@ window.__ModuleLoader__.load({
|
|
|
55300
55306
|
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("path", { d: "M10 3 4.5 5.2v4.6c0 3.8 2.3 6.4 5.5 7.2 3.2-.8 5.5-3.4 5.5-7.2V5.2L10 3Z" }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("path", { d: "m7.5 10 1.8 1.8 3.4-3.6" })]
|
|
55301
55307
|
});
|
|
55302
55308
|
}
|
|
55309
|
+
/**
|
|
55310
|
+
* 「Agent Teams 策略段」标记:一块带勾选行的共享任务板。
|
|
55311
|
+
* @returns 与其它行同规格的 20px 图标。
|
|
55312
|
+
*/
|
|
55313
|
+
function TeamBoardMark() {
|
|
55314
|
+
return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("svg", {
|
|
55315
|
+
viewBox: "0 0 20 20",
|
|
55316
|
+
width: "20",
|
|
55317
|
+
height: "20",
|
|
55318
|
+
fill: "none",
|
|
55319
|
+
stroke: "currentColor",
|
|
55320
|
+
strokeWidth: "1.6",
|
|
55321
|
+
strokeLinecap: "round",
|
|
55322
|
+
strokeLinejoin: "round",
|
|
55323
|
+
"aria-hidden": "true",
|
|
55324
|
+
children: [
|
|
55325
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("rect", {
|
|
55326
|
+
x: "3.5",
|
|
55327
|
+
y: "4.5",
|
|
55328
|
+
width: "13",
|
|
55329
|
+
height: "11",
|
|
55330
|
+
rx: "2"
|
|
55331
|
+
}),
|
|
55332
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("path", { d: "m6.5 8.4 1.4 1.4 2.4-2.6" }),
|
|
55333
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("path", { d: "M12 8.6h2M6.5 12.8h7.5" })
|
|
55334
|
+
]
|
|
55335
|
+
});
|
|
55336
|
+
}
|
|
55303
55337
|
function PanelMark() {
|
|
55304
55338
|
return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("svg", {
|
|
55305
55339
|
viewBox: "0 0 20 20",
|
|
@@ -55378,6 +55412,7 @@ window.__ModuleLoader__.load({
|
|
|
55378
55412
|
const cacheWaitWarmup = value.cacheWaitWarmup !== false;
|
|
55379
55413
|
const planModePipeline = value.planModePipeline !== false;
|
|
55380
55414
|
const dispatchExecutionGuard = value.dispatchExecutionGuard !== false;
|
|
55415
|
+
const teamPolicyCacheGuard = value.teamPolicyCacheGuard !== false;
|
|
55381
55416
|
const threshold = typeof value.progressUpdatesNudgeThreshold === "number" ? value.progressUpdatesNudgeThreshold : 8;
|
|
55382
55417
|
const language = value.progressUpdatesLanguage === "zh" || value.progressUpdatesLanguage === "en" || value.progressUpdatesLanguage === "ru" ? value.progressUpdatesLanguage : "auto";
|
|
55383
55418
|
const [draft, setDraft] = (0, react.useState)(() => String(threshold));
|
|
@@ -55578,6 +55613,27 @@ window.__ModuleLoader__.load({
|
|
|
55578
55613
|
}
|
|
55579
55614
|
})
|
|
55580
55615
|
}),
|
|
55616
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(CardRow, {
|
|
55617
|
+
part: "settings-row-team-policy-cache-guard",
|
|
55618
|
+
brand: "#8a5a9e",
|
|
55619
|
+
mark: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(TeamBoardMark, {}),
|
|
55620
|
+
name: translate("settingsTeamPolicyCacheGuardName"),
|
|
55621
|
+
note: failure?.row === "teamPolicyCacheGuard" ? failure.text : translate("settingsTeamPolicyCacheGuardNote"),
|
|
55622
|
+
danger: failure?.row === "teamPolicyCacheGuard",
|
|
55623
|
+
enabled: teamPolicyCacheGuard,
|
|
55624
|
+
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
|
|
55625
|
+
type: "button",
|
|
55626
|
+
role: "switch",
|
|
55627
|
+
"aria-checked": teamPolicyCacheGuard,
|
|
55628
|
+
"aria-label": translate("settingsTeamPolicyCacheGuardName"),
|
|
55629
|
+
className: "dsh-progress-switch",
|
|
55630
|
+
"data-dsh-part": "settings-team-policy-cache-guard-switch",
|
|
55631
|
+
disabled: !writable,
|
|
55632
|
+
onClick: () => {
|
|
55633
|
+
write("teamPolicyCacheGuard", "teamPolicyCacheGuard", !teamPolicyCacheGuard);
|
|
55634
|
+
}
|
|
55635
|
+
})
|
|
55636
|
+
}),
|
|
55581
55637
|
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(CardRow, {
|
|
55582
55638
|
part: "settings-row-threshold",
|
|
55583
55639
|
brand: "#2f9e6e",
|
|
@@ -56616,6 +56672,22 @@ window.__ModuleLoader__.load({
|
|
|
56616
56672
|
function routeKey(route) {
|
|
56617
56673
|
return `${route.provider}/${route.model}`;
|
|
56618
56674
|
}
|
|
56675
|
+
/**
|
|
56676
|
+
* 把 `<provider>/<model>` 拆回一条路由。
|
|
56677
|
+
*
|
|
56678
|
+
* provider id 与 model id 都可能含 `/`(例如 `openrouter/anthropic/claude`),
|
|
56679
|
+
* 所以只按**第一个**斜杠拆;这与 `list_subagent_models` 的输出约定一致。
|
|
56680
|
+
* @param key - 目标键。
|
|
56681
|
+
* @returns 路由,或 undefined(不是路由形态)。
|
|
56682
|
+
*/
|
|
56683
|
+
function parseRouteKey(key) {
|
|
56684
|
+
const cut = key.indexOf("/");
|
|
56685
|
+
if (cut <= 0 || cut === key.length - 1) return void 0;
|
|
56686
|
+
return {
|
|
56687
|
+
provider: key.slice(0, cut),
|
|
56688
|
+
model: key.slice(cut + 1)
|
|
56689
|
+
};
|
|
56690
|
+
}
|
|
56619
56691
|
/** 过滤并克隆非空合法路由。 */
|
|
56620
56692
|
function cloneRoutes(routes) {
|
|
56621
56693
|
const out = [];
|
|
@@ -56647,6 +56719,22 @@ window.__ModuleLoader__.load({
|
|
|
56647
56719
|
if (leftKeys.length !== rightKeys.length) return false;
|
|
56648
56720
|
return leftKeys.every((key, index) => key === rightKeys[index] && sameRouteSet(left[key] ?? [], right[key] ?? []));
|
|
56649
56721
|
}
|
|
56722
|
+
function normalizeForkOverrides(raw) {
|
|
56723
|
+
const out = {};
|
|
56724
|
+
if (typeof raw !== "object" || raw === null || Array.isArray(raw)) return out;
|
|
56725
|
+
for (const [rawKey, value] of Object.entries(raw)) {
|
|
56726
|
+
const key = rawKey.trim();
|
|
56727
|
+
if (parseRouteKey(key) === void 0 || typeof value !== "boolean") continue;
|
|
56728
|
+
out[key] = value;
|
|
56729
|
+
}
|
|
56730
|
+
return out;
|
|
56731
|
+
}
|
|
56732
|
+
function sameForkOverrides(left, right) {
|
|
56733
|
+
const leftKeys = Object.keys(left).sort();
|
|
56734
|
+
const rightKeys = Object.keys(right).sort();
|
|
56735
|
+
if (leftKeys.length !== rightKeys.length) return false;
|
|
56736
|
+
return leftKeys.every((key, index) => key === rightKeys[index] && left[key] === right[key]);
|
|
56737
|
+
}
|
|
56650
56738
|
/** 最小快照 store:`useSyncExternalStore` 要求引用在两次变更之间稳定。 */
|
|
56651
56739
|
function createStore(initial) {
|
|
56652
56740
|
let snapshot = initial;
|
|
@@ -56720,7 +56808,9 @@ window.__ModuleLoader__.load({
|
|
|
56720
56808
|
if (typeof parsed !== "object" || parsed === null) return void 0;
|
|
56721
56809
|
return {
|
|
56722
56810
|
subagentDefaultModels: Array.isArray(parsed.subagentDefaultModels) ? cloneRoutes(parsed.subagentDefaultModels) : [],
|
|
56723
|
-
subagentModelsByMainModel: parsed.subagentModelsByMainModel ?? {}
|
|
56811
|
+
subagentModelsByMainModel: parsed.subagentModelsByMainModel ?? {},
|
|
56812
|
+
subagentDefaultAllowParentFork: parsed.subagentDefaultAllowParentFork === true,
|
|
56813
|
+
subagentAllowParentForkByMainModel: normalizeForkOverrides(parsed.subagentAllowParentForkByMainModel)
|
|
56724
56814
|
};
|
|
56725
56815
|
} catch {
|
|
56726
56816
|
return;
|
|
@@ -56733,14 +56823,22 @@ window.__ModuleLoader__.load({
|
|
|
56733
56823
|
const mergedOverrides = { ...prev?.subagentModelsByMainModel ?? {} };
|
|
56734
56824
|
for (const [k, v] of Object.entries(patch.subagentModelsByMainModel ?? {})) if (v === null || !Array.isArray(v) || v.length === 0) delete mergedOverrides[k];
|
|
56735
56825
|
else mergedOverrides[k] = cloneRoutes(v);
|
|
56826
|
+
const mergedForkOverrides = normalizeForkOverrides(prev?.subagentAllowParentForkByMainModel);
|
|
56827
|
+
for (const [k, v] of Object.entries(patch.subagentAllowParentForkByMainModel ?? {})) {
|
|
56828
|
+
const trimmed = k.trim();
|
|
56829
|
+
if (v === null) delete mergedForkOverrides[trimmed];
|
|
56830
|
+
else if (typeof v === "boolean" && parseRouteKey(trimmed) !== void 0) mergedForkOverrides[trimmed] = v;
|
|
56831
|
+
}
|
|
56736
56832
|
localStorage.setItem(LOCAL_STORAGE_KEY, JSON.stringify({
|
|
56737
56833
|
subagentDefaultModels: Array.isArray(patch.subagentDefaultModels) ? cloneRoutes(patch.subagentDefaultModels) : prev?.subagentDefaultModels ?? [],
|
|
56738
|
-
subagentModelsByMainModel: mergedOverrides
|
|
56834
|
+
subagentModelsByMainModel: mergedOverrides,
|
|
56835
|
+
subagentDefaultAllowParentFork: typeof patch.subagentDefaultAllowParentFork === "boolean" ? patch.subagentDefaultAllowParentFork : prev?.subagentDefaultAllowParentFork === true,
|
|
56836
|
+
subagentAllowParentForkByMainModel: mergedForkOverrides
|
|
56739
56837
|
}));
|
|
56740
56838
|
} catch {}
|
|
56741
56839
|
}
|
|
56742
56840
|
/**
|
|
56743
|
-
*
|
|
56841
|
+
* 读本插件偏好里的子代理模型配置。
|
|
56744
56842
|
* @returns 偏好切片;读取失败时 undefined(卡片照常可用,只是从空列表起步)。
|
|
56745
56843
|
*/
|
|
56746
56844
|
async function readSubagentPreferences() {
|
|
@@ -56752,10 +56850,14 @@ window.__ModuleLoader__.load({
|
|
|
56752
56850
|
if (preferences === void 0 || preferences === null) return local;
|
|
56753
56851
|
const serverDefaults = Array.isArray(preferences.subagentDefaultModels) ? cloneRoutes(preferences.subagentDefaultModels) : [];
|
|
56754
56852
|
const serverByMain = preferences.subagentModelsByMainModel ?? {};
|
|
56755
|
-
|
|
56853
|
+
const serverDefaultFork = preferences.subagentDefaultAllowParentFork === true;
|
|
56854
|
+
const serverForkByMain = normalizeForkOverrides(preferences.subagentAllowParentForkByMainModel);
|
|
56855
|
+
if (serverDefaults.length === 0 && Object.keys(serverByMain).length === 0 && !serverDefaultFork && Object.keys(serverForkByMain).length === 0 && local !== void 0) return local;
|
|
56756
56856
|
return {
|
|
56757
56857
|
subagentDefaultModels: serverDefaults,
|
|
56758
|
-
subagentModelsByMainModel: serverByMain
|
|
56858
|
+
subagentModelsByMainModel: serverByMain,
|
|
56859
|
+
subagentDefaultAllowParentFork: serverDefaultFork,
|
|
56860
|
+
subagentAllowParentForkByMainModel: serverForkByMain
|
|
56759
56861
|
};
|
|
56760
56862
|
} catch {
|
|
56761
56863
|
return local;
|
|
@@ -56851,6 +56953,8 @@ window.__ModuleLoader__.load({
|
|
|
56851
56953
|
draftEnabled;
|
|
56852
56954
|
draftDefault;
|
|
56853
56955
|
draftOverrides;
|
|
56956
|
+
draftDefaultFork;
|
|
56957
|
+
draftForkOverrides;
|
|
56854
56958
|
draftRevision;
|
|
56855
56959
|
activeTarget = GLOBAL_TARGET;
|
|
56856
56960
|
saving = false;
|
|
@@ -56921,12 +57025,18 @@ window.__ModuleLoader__.load({
|
|
|
56921
57025
|
toggleModel: (key) => {
|
|
56922
57026
|
this.toggleModel(key);
|
|
56923
57027
|
},
|
|
57028
|
+
toggleAllowParentFork: () => {
|
|
57029
|
+
this.toggleAllowParentFork();
|
|
57030
|
+
},
|
|
56924
57031
|
setActiveTarget: (target) => {
|
|
56925
57032
|
this.setActiveTarget(target);
|
|
56926
57033
|
},
|
|
56927
57034
|
resetActiveTarget: () => {
|
|
56928
57035
|
this.resetActiveTarget();
|
|
56929
57036
|
},
|
|
57037
|
+
resetActiveTargetFork: () => {
|
|
57038
|
+
this.resetActiveTargetFork();
|
|
57039
|
+
},
|
|
56930
57040
|
retryCatalog: () => {
|
|
56931
57041
|
this.loadCatalogOnce();
|
|
56932
57042
|
},
|
|
@@ -57000,6 +57110,12 @@ window.__ModuleLoader__.load({
|
|
|
57000
57110
|
}
|
|
57001
57111
|
return out;
|
|
57002
57112
|
}
|
|
57113
|
+
currentDefaultFork() {
|
|
57114
|
+
return this.preferences?.subagentDefaultAllowParentFork === true;
|
|
57115
|
+
}
|
|
57116
|
+
currentForkOverrides() {
|
|
57117
|
+
return normalizeForkOverrides(this.preferences?.subagentAllowParentForkByMainModel);
|
|
57118
|
+
}
|
|
57003
57119
|
enabled() {
|
|
57004
57120
|
return this.draftEnabled ?? this.currentEnabled();
|
|
57005
57121
|
}
|
|
@@ -57012,6 +57128,17 @@ window.__ModuleLoader__.load({
|
|
|
57012
57128
|
for (const [key, value] of Object.entries(source)) out[key] = cloneRoutes(value);
|
|
57013
57129
|
return out;
|
|
57014
57130
|
}
|
|
57131
|
+
defaultAllowParentFork() {
|
|
57132
|
+
return this.draftDefaultFork ?? this.currentDefaultFork();
|
|
57133
|
+
}
|
|
57134
|
+
forkOverrides() {
|
|
57135
|
+
return { ...this.draftForkOverrides ?? this.currentForkOverrides() };
|
|
57136
|
+
}
|
|
57137
|
+
activeAllowParentFork() {
|
|
57138
|
+
if (this.activeTarget === "default") return this.defaultAllowParentFork();
|
|
57139
|
+
const own = this.forkOverrides()[this.activeTarget];
|
|
57140
|
+
return typeof own === "boolean" ? own : this.defaultAllowParentFork();
|
|
57141
|
+
}
|
|
57015
57142
|
/** 当前目标生效的列表(专属列表优先,否则回落到全局默认)。 */
|
|
57016
57143
|
activeRoutes() {
|
|
57017
57144
|
if (this.activeTarget === "default") return this.defaultRoutes();
|
|
@@ -57023,6 +57150,8 @@ window.__ModuleLoader__.load({
|
|
|
57023
57150
|
this.draftEnabled = this.currentEnabled();
|
|
57024
57151
|
this.draftDefault = this.currentDefault();
|
|
57025
57152
|
this.draftOverrides = this.currentOverrides();
|
|
57153
|
+
this.draftDefaultFork = this.currentDefaultFork();
|
|
57154
|
+
this.draftForkOverrides = this.currentForkOverrides();
|
|
57026
57155
|
this.draftRevision = this.modelSelection.getSnapshot().revision;
|
|
57027
57156
|
}
|
|
57028
57157
|
clearDraft() {
|
|
@@ -57033,6 +57162,8 @@ window.__ModuleLoader__.load({
|
|
|
57033
57162
|
this.draftEnabled = void 0;
|
|
57034
57163
|
this.draftDefault = void 0;
|
|
57035
57164
|
this.draftOverrides = void 0;
|
|
57165
|
+
this.draftDefaultFork = void 0;
|
|
57166
|
+
this.draftForkOverrides = void 0;
|
|
57036
57167
|
this.draftRevision = void 0;
|
|
57037
57168
|
this.failed = false;
|
|
57038
57169
|
}
|
|
@@ -57109,13 +57240,41 @@ window.__ModuleLoader__.load({
|
|
|
57109
57240
|
this.activeTarget = target === "" ? GLOBAL_TARGET : target;
|
|
57110
57241
|
this.publish();
|
|
57111
57242
|
}
|
|
57112
|
-
/**
|
|
57243
|
+
/** 切换当前目标的同源分叉(`subagent_fork`)开关。 */
|
|
57244
|
+
toggleAllowParentFork() {
|
|
57245
|
+
if (this.saving || !this.enabled()) return;
|
|
57246
|
+
if (this.modelSelection.getSnapshot().status !== "ready") return;
|
|
57247
|
+
this.ensureDraft();
|
|
57248
|
+
if (this.activeTarget === "default") this.draftDefaultFork = !this.defaultAllowParentFork();
|
|
57249
|
+
else {
|
|
57250
|
+
const forkOverrides = this.draftForkOverrides ?? this.currentForkOverrides();
|
|
57251
|
+
const current = forkOverrides[this.activeTarget] ?? this.defaultAllowParentFork();
|
|
57252
|
+
forkOverrides[this.activeTarget] = !current;
|
|
57253
|
+
this.draftForkOverrides = forkOverrides;
|
|
57254
|
+
}
|
|
57255
|
+
this.failed = false;
|
|
57256
|
+
this.publish();
|
|
57257
|
+
}
|
|
57258
|
+
/** 让当前主代理的同源分叉策略单独恢复「跟随全局默认」。 */
|
|
57259
|
+
resetActiveTargetFork() {
|
|
57260
|
+
if (this.saving || this.activeTarget === "default") return;
|
|
57261
|
+
this.ensureDraft();
|
|
57262
|
+
const forkOverrides = this.draftForkOverrides ?? this.currentForkOverrides();
|
|
57263
|
+
delete forkOverrides[this.activeTarget];
|
|
57264
|
+
this.draftForkOverrides = forkOverrides;
|
|
57265
|
+
this.failed = false;
|
|
57266
|
+
this.publish();
|
|
57267
|
+
}
|
|
57268
|
+
/** 让当前目标恢复「跟随全局默认」:删掉它的专属列表与专属同源分叉覆盖。 */
|
|
57113
57269
|
resetActiveTarget() {
|
|
57114
57270
|
if (this.saving || this.activeTarget === "default") return;
|
|
57115
57271
|
this.ensureDraft();
|
|
57116
57272
|
const overrides = this.draftOverrides ?? this.currentOverrides();
|
|
57117
57273
|
delete overrides[this.activeTarget];
|
|
57118
57274
|
this.draftOverrides = overrides;
|
|
57275
|
+
const forkOverrides = this.draftForkOverrides ?? this.currentForkOverrides();
|
|
57276
|
+
delete forkOverrides[this.activeTarget];
|
|
57277
|
+
this.draftForkOverrides = forkOverrides;
|
|
57119
57278
|
this.failed = false;
|
|
57120
57279
|
this.publish();
|
|
57121
57280
|
}
|
|
@@ -57166,16 +57325,18 @@ window.__ModuleLoader__.load({
|
|
|
57166
57325
|
/** 主代理模型下拉的分组(目录分组 + 已保存但不可用的孤儿)。 */
|
|
57167
57326
|
mainModelGroups() {
|
|
57168
57327
|
const overrides = this.overrides();
|
|
57328
|
+
const forkOverrides = this.forkOverrides();
|
|
57169
57329
|
const groups = [];
|
|
57170
57330
|
for (const group of this.catalogGroups) {
|
|
57171
57331
|
if (!group.provider || group.provider === "undefined") continue;
|
|
57172
57332
|
const models = group.models.filter((model) => Boolean(model.id) && model.id !== "undefined").map((model) => {
|
|
57173
57333
|
const key = `${group.provider}/${model.id}`;
|
|
57334
|
+
const overridden = overrides[key] !== void 0 || forkOverrides[key] !== void 0;
|
|
57174
57335
|
return {
|
|
57175
57336
|
key,
|
|
57176
57337
|
model: model.id,
|
|
57177
57338
|
modelName: model.name,
|
|
57178
|
-
overridden
|
|
57339
|
+
overridden
|
|
57179
57340
|
};
|
|
57180
57341
|
});
|
|
57181
57342
|
if (models.length > 0) groups.push({
|
|
@@ -57190,7 +57351,7 @@ window.__ModuleLoader__.load({
|
|
|
57190
57351
|
orphanMainModels() {
|
|
57191
57352
|
const known = /* @__PURE__ */ new Set();
|
|
57192
57353
|
for (const group of this.catalogGroups) for (const model of group.models) known.add(`${group.provider}/${model.id}`);
|
|
57193
|
-
return Object.keys(this.overrides()).filter((key) => !known.has(key));
|
|
57354
|
+
return [.../* @__PURE__ */ new Set([...Object.keys(this.overrides()), ...Object.keys(this.forkOverrides())])].filter((key) => !known.has(key));
|
|
57194
57355
|
}
|
|
57195
57356
|
/**
|
|
57196
57357
|
* 一次保存三份存储。
|
|
@@ -57201,6 +57362,8 @@ window.__ModuleLoader__.load({
|
|
|
57201
57362
|
const desiredEnabled = this.enabled();
|
|
57202
57363
|
const desiredDefault = this.defaultRoutes();
|
|
57203
57364
|
const desiredOverrides = this.overrides();
|
|
57365
|
+
const desiredDefaultFork = this.defaultAllowParentFork();
|
|
57366
|
+
const desiredForkOverrides = this.forkOverrides();
|
|
57204
57367
|
const generation = this.saveGeneration;
|
|
57205
57368
|
this.saving = true;
|
|
57206
57369
|
this.failed = false;
|
|
@@ -57212,16 +57375,28 @@ window.__ModuleLoader__.load({
|
|
|
57212
57375
|
const list = desiredOverrides[key];
|
|
57213
57376
|
patch[key] = list !== void 0 && list.length > 0 ? cloneRoutes(list) : null;
|
|
57214
57377
|
}
|
|
57378
|
+
const initialFork = this.currentForkOverrides();
|
|
57379
|
+
const forkPatch = {};
|
|
57380
|
+
for (const key of /* @__PURE__ */ new Set([...Object.keys(initialFork), ...Object.keys(desiredForkOverrides)])) {
|
|
57381
|
+
const flag = desiredForkOverrides[key];
|
|
57382
|
+
forkPatch[key] = typeof flag === "boolean" ? flag : null;
|
|
57383
|
+
}
|
|
57215
57384
|
await this.savePreferences({
|
|
57216
57385
|
subagentDefaultModels: cloneRoutes(desiredDefault),
|
|
57217
|
-
subagentModelsByMainModel: patch
|
|
57386
|
+
subagentModelsByMainModel: patch,
|
|
57387
|
+
subagentDefaultAllowParentFork: desiredDefaultFork,
|
|
57388
|
+
subagentAllowParentForkByMainModel: forkPatch
|
|
57218
57389
|
});
|
|
57219
57390
|
if (this.disposed || generation !== this.saveGeneration) return;
|
|
57220
57391
|
const nextOverrides = {};
|
|
57221
57392
|
for (const [k, v] of Object.entries(desiredOverrides)) if (v.length > 0) nextOverrides[k] = cloneRoutes(v);
|
|
57393
|
+
const nextForkOverrides = {};
|
|
57394
|
+
for (const [k, v] of Object.entries(desiredForkOverrides)) if (typeof v === "boolean") nextForkOverrides[k] = v;
|
|
57222
57395
|
this.preferences = {
|
|
57223
57396
|
subagentDefaultModels: cloneRoutes(desiredDefault),
|
|
57224
|
-
subagentModelsByMainModel: nextOverrides
|
|
57397
|
+
subagentModelsByMainModel: nextOverrides,
|
|
57398
|
+
subagentDefaultAllowParentFork: desiredDefaultFork,
|
|
57399
|
+
subagentAllowParentForkByMainModel: nextForkOverrides
|
|
57225
57400
|
};
|
|
57226
57401
|
this.preferencesStatus = "ready";
|
|
57227
57402
|
const union = /* @__PURE__ */ new Map();
|
|
@@ -57328,13 +57503,17 @@ window.__ModuleLoader__.load({
|
|
|
57328
57503
|
const enabled = this.enabled();
|
|
57329
57504
|
const desiredDefault = this.defaultRoutes();
|
|
57330
57505
|
const desiredOverrides = this.overrides();
|
|
57506
|
+
const desiredDefaultFork = this.defaultAllowParentFork();
|
|
57507
|
+
const desiredForkOverrides = this.forkOverrides();
|
|
57331
57508
|
const currentOverrides = this.currentOverrides();
|
|
57332
57509
|
const currentDefault = this.currentDefault();
|
|
57510
|
+
const currentDefaultFork = this.currentDefaultFork();
|
|
57511
|
+
const currentForkOverrides = this.currentForkOverrides();
|
|
57333
57512
|
const union = /* @__PURE__ */ new Map();
|
|
57334
57513
|
for (const route of desiredDefault) union.set(routeKey(route), route);
|
|
57335
57514
|
for (const list of Object.values(desiredOverrides)) for (const route of list) union.set(routeKey(route), route);
|
|
57336
57515
|
const hostAllowed = cloneRoutes(modelSnapshot.value?.allowedModels ?? []);
|
|
57337
|
-
const modelsDirty = this.currentEnabled() !== enabled || !sameRouteSet(currentDefault, desiredDefault) || !sameOverrides(currentOverrides, desiredOverrides) || this.draftDefault !== void 0 && !sameRouteSet(hostAllowed, [...union.values()]);
|
|
57516
|
+
const modelsDirty = this.currentEnabled() !== enabled || !sameRouteSet(currentDefault, desiredDefault) || !sameOverrides(currentOverrides, desiredOverrides) || currentDefaultFork !== desiredDefaultFork || !sameForkOverrides(currentForkOverrides, desiredForkOverrides) || this.draftDefault !== void 0 && !sameRouteSet(hostAllowed, [...union.values()]);
|
|
57338
57517
|
const depthPersistedOverridden = userHas(limitsSnapshot.user, "maxDepth");
|
|
57339
57518
|
const activePersistedOverridden = userHas(limitsSnapshot.user, "maxActiveSubagents");
|
|
57340
57519
|
const depthDirty = this.draftDepthCleared ? depthPersistedOverridden : this.draftDepth !== void 0 && maxDepth.value !== String(readNumber(limitsSnapshot.value, "maxDepth", 1));
|
|
@@ -57343,6 +57522,7 @@ window.__ModuleLoader__.load({
|
|
|
57343
57522
|
const emptyOverride = Object.values(desiredOverrides).some((list) => list.length === 0);
|
|
57344
57523
|
const invalid = maxDepth.invalid || maxActive.invalid || enabled && (desiredDefault.length === 0 || emptyOverride);
|
|
57345
57524
|
const activeOverridden = this.activeTarget !== "default" && desiredOverrides[this.activeTarget] !== void 0;
|
|
57525
|
+
const activeForkOverridden = this.activeTarget !== "default" && desiredForkOverrides[this.activeTarget] !== void 0;
|
|
57346
57526
|
return {
|
|
57347
57527
|
available: limitsAvailable || modelsAvailable,
|
|
57348
57528
|
writable: (limitsAvailable ? limitsSnapshot.writable : true) && (modelsAvailable ? modelSnapshot.writable : true),
|
|
@@ -57363,6 +57543,10 @@ window.__ModuleLoader__.load({
|
|
|
57363
57543
|
candidates: this.candidates(),
|
|
57364
57544
|
activeTargetOverridden: activeOverridden,
|
|
57365
57545
|
activeTargetCount: this.activeRoutes().length,
|
|
57546
|
+
defaultAllowParentFork: desiredDefaultFork,
|
|
57547
|
+
forkOverridesByMainModel: desiredForkOverrides,
|
|
57548
|
+
activeTargetAllowParentFork: this.activeAllowParentFork(),
|
|
57549
|
+
activeTargetForkOverridden: activeForkOverridden,
|
|
57366
57550
|
preferencesStatus: this.preferencesStatus
|
|
57367
57551
|
};
|
|
57368
57552
|
}
|
|
@@ -57563,7 +57747,8 @@ window.__ModuleLoader__.load({
|
|
|
57563
57747
|
return key;
|
|
57564
57748
|
};
|
|
57565
57749
|
const activeModelKey = state.activeTarget;
|
|
57566
|
-
const overrideKeys = Object.keys(state.overridesByMainModel);
|
|
57750
|
+
const overrideKeys = [.../* @__PURE__ */ new Set([...Object.keys(state.overridesByMainModel), ...Object.keys(state.forkOverridesByMainModel)])];
|
|
57751
|
+
const activeAnyOverridden = state.activeTargetOverridden || state.activeTargetForkOverridden;
|
|
57567
57752
|
const limitsHeadingId = headingId + "-limits";
|
|
57568
57753
|
const modelsHeadingId = headingId + "-models";
|
|
57569
57754
|
const mainModelId = headingId + "-main-model";
|
|
@@ -57742,7 +57927,7 @@ window.__ModuleLoader__.load({
|
|
|
57742
57927
|
onClick: () => {
|
|
57743
57928
|
props.setActiveTarget(key);
|
|
57744
57929
|
},
|
|
57745
|
-
children: mainModelName(key) + " (" + String(state.overridesByMainModel[key]?.length ??
|
|
57930
|
+
children: mainModelName(key) + " (" + String(state.overridesByMainModel[key]?.length ?? state.defaultCount) + ")"
|
|
57746
57931
|
}, key))]
|
|
57747
57932
|
}),
|
|
57748
57933
|
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
@@ -57754,10 +57939,13 @@ window.__ModuleLoader__.load({
|
|
|
57754
57939
|
}) : state.activeTargetOverridden ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
|
|
57755
57940
|
className: "dsh-subagent-hint",
|
|
57756
57941
|
children: withCount(t("subagentTargetOverrideStatus"), state.activeTargetCount)
|
|
57942
|
+
}) : state.activeTargetForkOverridden ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
|
|
57943
|
+
className: "dsh-subagent-hint",
|
|
57944
|
+
children: t("subagentTargetForkOnlyOverrideStatus")
|
|
57757
57945
|
}) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
|
|
57758
57946
|
className: "dsh-subagent-hint",
|
|
57759
57947
|
children: t("subagentTargetFollowGlobalStatus")
|
|
57760
|
-
}), activeModelKey !== "default" &&
|
|
57948
|
+
}), activeModelKey !== "default" && activeAnyOverridden ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
|
|
57761
57949
|
type: "button",
|
|
57762
57950
|
className: "dsh-subagent-reset",
|
|
57763
57951
|
"data-dsh-part": "subagent-reset-to-global",
|
|
@@ -57770,6 +57958,54 @@ window.__ModuleLoader__.load({
|
|
|
57770
57958
|
})
|
|
57771
57959
|
]
|
|
57772
57960
|
}),
|
|
57961
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("fieldset", {
|
|
57962
|
+
className: "dsh-subagent-fork-card",
|
|
57963
|
+
"data-dsh-part": "subagent-fork-card",
|
|
57964
|
+
children: [
|
|
57965
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("legend", { children: t("subagentForkTitle") }),
|
|
57966
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
57967
|
+
className: "dsh-subagent-fork-head",
|
|
57968
|
+
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
57969
|
+
className: "dsh-subagent-fork-title-group",
|
|
57970
|
+
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
57971
|
+
className: "dsh-subagent-fork-label",
|
|
57972
|
+
children: t("subagentForkToggle")
|
|
57973
|
+
}), activeModelKey !== "default" && state.activeTargetForkOverridden ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
|
|
57974
|
+
className: "dsh-subagent-badges",
|
|
57975
|
+
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
57976
|
+
className: "dsh-subagent-override-tag",
|
|
57977
|
+
children: t("overridden")
|
|
57978
|
+
}), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
|
|
57979
|
+
type: "button",
|
|
57980
|
+
className: "dsh-subagent-reset-link",
|
|
57981
|
+
"data-dsh-part": "subagent-fork-reset",
|
|
57982
|
+
disabled,
|
|
57983
|
+
onClick: () => {
|
|
57984
|
+
props.resetActiveTargetFork();
|
|
57985
|
+
},
|
|
57986
|
+
children: t("reset")
|
|
57987
|
+
})]
|
|
57988
|
+
}) : null]
|
|
57989
|
+
}), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
|
|
57990
|
+
type: "button",
|
|
57991
|
+
role: "switch",
|
|
57992
|
+
"aria-checked": state.activeTargetAllowParentFork,
|
|
57993
|
+
"aria-label": t("subagentForkToggle"),
|
|
57994
|
+
className: "dsh-subagent-switch",
|
|
57995
|
+
"data-dsh-part": "subagent-fork-switch",
|
|
57996
|
+
disabled,
|
|
57997
|
+
onClick: () => {
|
|
57998
|
+
props.toggleAllowParentFork();
|
|
57999
|
+
},
|
|
58000
|
+
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { className: "dsh-subagent-switch-thumb" })
|
|
58001
|
+
})]
|
|
58002
|
+
}),
|
|
58003
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
|
|
58004
|
+
className: "dsh-subagent-hint",
|
|
58005
|
+
children: t("subagentForkHint")
|
|
58006
|
+
})
|
|
58007
|
+
]
|
|
58008
|
+
}),
|
|
57773
58009
|
state.catalogStatus === "loading" ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
|
|
57774
58010
|
className: "dsh-subagent-notice",
|
|
57775
58011
|
role: "status",
|
|
@@ -57934,11 +58170,15 @@ window.__ModuleLoader__.load({
|
|
|
57934
58170
|
subagentChipGlobal: "全局默认 ({count})",
|
|
57935
58171
|
subagentTargetGlobalHint: "正在编辑全局默认子代理模型列表;未单独配置专属列表的主代理将使用此列表。",
|
|
57936
58172
|
subagentTargetOverrideStatus: "已为该主代理单独配置 {count} 个子代理模型",
|
|
58173
|
+
subagentTargetForkOnlyOverrideStatus: "子代理模型列表跟随全局默认;已为该主代理单独配置同源分叉策略",
|
|
57937
58174
|
subagentTargetFollowGlobalStatus: "当前跟随全局默认列表(勾选或取消下方模型即可为该主代理创建专属列表)",
|
|
57938
58175
|
subagentResetToGlobal: "恢复跟随全局默认",
|
|
57939
58176
|
subagentOverrideBadge: "(已覆盖)",
|
|
57940
58177
|
subagentPreferencesLoadFailed: "无法读取已保存的子代理模型偏好;保存时将以当前界面为准。",
|
|
57941
|
-
subagentModelPerTargetRequired: "保存前请至少选择一个模型(或点击「恢复跟随全局默认」)。"
|
|
58178
|
+
subagentModelPerTargetRequired: "保存前请至少选择一个模型(或点击「恢复跟随全局默认」)。",
|
|
58179
|
+
subagentForkTitle: "同源分叉",
|
|
58180
|
+
subagentForkToggle: "允许同源分叉(subagent_fork 继承当前主代理模型)",
|
|
58181
|
+
subagentForkHint: "开启后,subagent_fork 可直接继承当前主代理模型以复用会话上下文与前缀缓存,无需将该主模型加入下方冷启动可选列表;不影响冷启动 subagent 与团队派生。"
|
|
57942
58182
|
};
|
|
57943
58183
|
/** 英文对照,键集与中文完全一致。 */
|
|
57944
58184
|
const en = {
|
|
@@ -57983,11 +58223,15 @@ window.__ModuleLoader__.load({
|
|
|
57983
58223
|
subagentChipGlobal: "Global default ({count})",
|
|
57984
58224
|
subagentTargetGlobalHint: "Editing the global default subagent model list; main agents without their own list use it.",
|
|
57985
58225
|
subagentTargetOverrideStatus: "This main agent has {count} dedicated subagent models",
|
|
58226
|
+
subagentTargetForkOnlyOverrideStatus: "Subagent models follow the global default; same-model fork is overridden for this main agent",
|
|
57986
58227
|
subagentTargetFollowGlobalStatus: "Currently following the global default list (tick or untick a model below to create a dedicated list for this main agent)",
|
|
57987
58228
|
subagentResetToGlobal: "Follow the global default again",
|
|
57988
58229
|
subagentOverrideBadge: " (overridden)",
|
|
57989
58230
|
subagentPreferencesLoadFailed: "Saved subagent model preferences could not be read; saving will use what this page shows.",
|
|
57990
|
-
subagentModelPerTargetRequired: "Select at least one model before saving (or choose \"Follow the global default again\")."
|
|
58231
|
+
subagentModelPerTargetRequired: "Select at least one model before saving (or choose \"Follow the global default again\").",
|
|
58232
|
+
subagentForkTitle: "Same-model fork",
|
|
58233
|
+
subagentForkToggle: "Allow same-model fork (subagent_fork inherits the main agent model)",
|
|
58234
|
+
subagentForkHint: "When enabled, subagent_fork may inherit the main agent model to reuse conversation context and prefix cache without adding that model to the cold-spawn list below; cold-spawn subagent and teammate creation remain governed by the list."
|
|
57991
58235
|
};
|
|
57992
58236
|
/** 与其余线路同形的字典包(四个内置语言 id 都指向那两份)。 */
|
|
57993
58237
|
const dictionaries = {
|
|
@@ -58612,12 +58856,49 @@ window.__ModuleLoader__.load({
|
|
|
58612
58856
|
border-radius: var(--dsw-radius-lg, 10px);
|
|
58613
58857
|
}
|
|
58614
58858
|
|
|
58615
|
-
.dsh-subagent-models > legend
|
|
58859
|
+
.dsh-subagent-models > legend,
|
|
58860
|
+
.dsh-subagent-fork-card > legend {
|
|
58616
58861
|
padding: 0 4px;
|
|
58617
58862
|
font-size: 12px;
|
|
58618
58863
|
color: var(--dsw-alias-label-secondary);
|
|
58619
58864
|
}
|
|
58620
58865
|
|
|
58866
|
+
.dsh-subagent-fork-card {
|
|
58867
|
+
display: grid;
|
|
58868
|
+
align-content: start;
|
|
58869
|
+
gap: 4px;
|
|
58870
|
+
min-width: 0;
|
|
58871
|
+
margin: 0;
|
|
58872
|
+
padding: 10px;
|
|
58873
|
+
border: 0.5px solid var(--dsw-alias-border-l4);
|
|
58874
|
+
border-radius: var(--dsw-radius-lg, 10px);
|
|
58875
|
+
background: transparent;
|
|
58876
|
+
}
|
|
58877
|
+
|
|
58878
|
+
.dsh-subagent-fork-head {
|
|
58879
|
+
display: flex;
|
|
58880
|
+
align-items: center;
|
|
58881
|
+
justify-content: space-between;
|
|
58882
|
+
gap: 16px;
|
|
58883
|
+
min-width: 0;
|
|
58884
|
+
}
|
|
58885
|
+
|
|
58886
|
+
.dsh-subagent-fork-title-group {
|
|
58887
|
+
display: flex;
|
|
58888
|
+
flex-wrap: wrap;
|
|
58889
|
+
align-items: center;
|
|
58890
|
+
gap: 8px;
|
|
58891
|
+
flex: 1;
|
|
58892
|
+
min-width: 0;
|
|
58893
|
+
}
|
|
58894
|
+
|
|
58895
|
+
.dsh-subagent-fork-label {
|
|
58896
|
+
font-size: 13px;
|
|
58897
|
+
font-weight: 500;
|
|
58898
|
+
line-height: 1.5;
|
|
58899
|
+
color: var(--dsw-alias-label-primary);
|
|
58900
|
+
}
|
|
58901
|
+
|
|
58621
58902
|
.dsh-subagent-group {
|
|
58622
58903
|
display: grid;
|
|
58623
58904
|
gap: 6px;
|