@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.
Files changed (51) hide show
  1. package/CHANGELOG.md +24 -0
  2. package/README.md +148 -1268
  3. package/lib/client.js +298 -17
  4. package/lib/client.js.map +1 -1
  5. package/lib/index.js +413 -68
  6. package/lib/plan-mode.js +3 -7
  7. package/lib/tool-result-pruner.js +1 -1
  8. package/lib/types/client/locales-ru/index.d.ts +2 -3
  9. package/lib/types/client/locales-ru/index.d.ts.map +1 -1
  10. package/lib/types/client/locales-ru/progress-updates.d.ts.map +1 -1
  11. package/lib/types/client/minimax-code/commands-contract.d.ts +1 -1
  12. package/lib/types/client/progress-updates/locales.d.ts +8 -2
  13. package/lib/types/client/progress-updates/locales.d.ts.map +1 -1
  14. package/lib/types/client/progress-updates/settings-binding.d.ts +8 -1
  15. package/lib/types/client/progress-updates/settings-binding.d.ts.map +1 -1
  16. package/lib/types/client/progress-updates/settings-section.d.ts +2 -1
  17. package/lib/types/client/progress-updates/settings-section.d.ts.map +1 -1
  18. package/lib/types/client/subagent/SubagentCard.d.ts.map +1 -1
  19. package/lib/types/client/subagent/locales.d.ts +14 -2
  20. package/lib/types/client/subagent/locales.d.ts.map +1 -1
  21. package/lib/types/client/subagent/styles.d.ts +1 -1
  22. package/lib/types/client/subagent/styles.d.ts.map +1 -1
  23. package/lib/types/client/subagent/subagent-card-controller.d.ts +26 -3
  24. package/lib/types/client/subagent/subagent-card-controller.d.ts.map +1 -1
  25. package/lib/types/compat.d.ts +1 -1
  26. package/lib/types/entry-plan-mode.d.ts +3 -7
  27. package/lib/types/entry-plan-mode.d.ts.map +1 -1
  28. package/lib/types/entry-tool-result-pruner.d.ts +1 -1
  29. package/lib/types/host/agent-preset.d.ts +5 -0
  30. package/lib/types/host/agent-preset.d.ts.map +1 -1
  31. package/lib/types/host/common/llm-compat.d.ts +3 -1
  32. package/lib/types/host/common/llm-compat.d.ts.map +1 -1
  33. package/lib/types/host/kimi-code/repeat-breaker.d.ts +1 -1
  34. package/lib/types/host/plan-mode-cache-guard.d.ts.map +1 -1
  35. package/lib/types/host/preferences.d.ts.map +1 -1
  36. package/lib/types/host/routes.d.ts.map +1 -1
  37. package/lib/types/host/subagent-model-authorization.d.ts +34 -16
  38. package/lib/types/host/subagent-model-authorization.d.ts.map +1 -1
  39. package/lib/types/host/subagent-route-audit.d.ts +6 -1
  40. package/lib/types/host/subagent-route-audit.d.ts.map +1 -1
  41. package/lib/types/host/team-policy-cache-guard.d.ts +44 -0
  42. package/lib/types/host/team-policy-cache-guard.d.ts.map +1 -0
  43. package/lib/types/index.d.ts +16 -2
  44. package/lib/types/index.d.ts.map +1 -1
  45. package/lib/types/shared/contracts.d.ts +19 -0
  46. package/lib/types/shared/contracts.d.ts.map +1 -1
  47. package/lib/types/shared/preferences.d.ts +22 -1
  48. package/lib/types/shared/preferences.d.ts.map +1 -1
  49. package/package.json +46 -43
  50. package/presets/dispatch/README.md +32 -11
  51. 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
- if (serverDefaults.length === 0 && Object.keys(serverByMain).length === 0 && local !== void 0) return local;
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: overrides[key] !== void 0
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 ?? 0) + ")"
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" && state.activeTargetOverridden ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
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;