dsh-llm-fallbacks 0.6.12 → 0.7.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.
@@ -489,9 +489,7 @@ window.__ModuleLoader__.load({
489
489
  cooldownMs: 3e5,
490
490
  revertPolicy: "cooldown-expiry",
491
491
  maxSwitchesPerStep: 8,
492
- alwaysModeRetryCap: 5,
493
492
  presets: "bundled",
494
- roleAutoMatch: true,
495
493
  timeSlots: [],
496
494
  tz: "Asia/Shanghai",
497
495
  recovery: "timer"
@@ -698,18 +696,11 @@ window.__ModuleLoader__.load({
698
696
  });
699
697
  const cooldownMs = value.cooldownMs;
700
698
  const maxSwitchesPerStep = value.maxSwitchesPerStep;
701
- const alwaysModeRetryCap = value.alwaysModeRetryCap;
702
- for (const [field, raw] of [
703
- ["cooldownMs", cooldownMs],
704
- ["maxSwitchesPerStep", maxSwitchesPerStep],
705
- ["alwaysModeRetryCap", alwaysModeRetryCap]
706
- ]) if (raw !== void 0 && typeof raw !== "number") throw new TypeError(`fallbacks descriptor ${field} must be a number`);
699
+ for (const [field, raw] of [["cooldownMs", cooldownMs], ["maxSwitchesPerStep", maxSwitchesPerStep]]) if (raw !== void 0 && typeof raw !== "number") throw new TypeError(`fallbacks descriptor ${field} must be a number`);
707
700
  const revertPolicy = value.revertPolicy;
708
701
  if (revertPolicy !== void 0 && revertPolicy !== "cooldown-expiry" && revertPolicy !== "never") throw new TypeError("fallbacks descriptor revertPolicy must be cooldown-expiry|never");
709
702
  const presets = value.presets;
710
703
  if (presets !== void 0 && presets !== "bundled" && presets !== "none") throw new TypeError("fallbacks descriptor presets must be bundled|none");
711
- const roleAutoMatch = value.roleAutoMatch;
712
- if (roleAutoMatch !== void 0 && typeof roleAutoMatch !== "boolean") throw new TypeError("fallbacks descriptor roleAutoMatch must be a boolean");
713
704
  const timeSlots = value.timeSlots;
714
705
  if (timeSlots !== void 0 && (!Array.isArray(timeSlots) || timeSlots.some((row) => {
715
706
  if (!isRecord(row)) return true;
@@ -739,9 +730,7 @@ window.__ModuleLoader__.load({
739
730
  cooldownMs: cooldownMs ?? defaultFallbacksConfig.cooldownMs,
740
731
  revertPolicy: revertPolicy ?? defaultFallbacksConfig.revertPolicy,
741
732
  maxSwitchesPerStep: maxSwitchesPerStep ?? defaultFallbacksConfig.maxSwitchesPerStep,
742
- alwaysModeRetryCap: alwaysModeRetryCap ?? defaultFallbacksConfig.alwaysModeRetryCap,
743
733
  presets: presets ?? defaultFallbacksConfig.presets,
744
- roleAutoMatch: roleAutoMatch ?? defaultFallbacksConfig.roleAutoMatch,
745
734
  timeSlots: timeSlots ?? [...defaultFallbacksConfig.timeSlots ?? []],
746
735
  tz: tz ?? defaultFallbacksConfig.tz,
747
736
  recovery: recovery ?? defaultFallbacksConfig.recovery
@@ -1378,18 +1367,13 @@ window.__ModuleLoader__.load({
1378
1367
  "cooldownMs.label": "冷却时长(毫秒)",
1379
1368
  "cooldownMs.hint": "冷却期内模型不再入选",
1380
1369
  "cooldownMs.tooltip": "被切离/失败的模型在冷却期内不再入选。",
1381
- "maxSwitchesPerStep.label": "单步最大切换次数",
1370
+ "maxSwitchesPerStep.label": "单次请求行走最大切换",
1382
1371
  "maxSwitchesPerStep.hint": "超过后停止切换",
1383
- "maxSwitchesPerStep.tooltip": "超过后停止切换,以原始错误语义结束当前步,防止链循环放大延迟。",
1384
- "alwaysModeRetryCap.label": "always 模式重试上限",
1385
- "alwaysModeRetryCap.hint": "达到上限次数后切换;0 表示禁用",
1386
- "alwaysModeRetryCap.tooltip": "retryPolicy 为 always 的模型在同一请求内重试达到该次数后切换;0 表示禁用。",
1372
+ "maxSwitchesPerStep.tooltip": "超过后不再切换,以原始错误语义结束本次请求,防止链循环放大延迟。",
1373
+ "virtualOnly.rule": "只有模型选择为 FallbacksChain/Auto 的会话(含插件注入的子代理)会执行降级链;选择真实模型的会话没有插件降级,仅由 llm-retry 处理重试。",
1387
1374
  "advanced.label": "高级选项",
1388
1375
  "advanced.expand": "展开高级选项",
1389
1376
  "advanced.collapse": "收起高级选项",
1390
- "roleAutoMatch.label": "启用角色自动匹配",
1391
- "roleAutoMatch.hint": "规则未命中时,由模型自选最贴近的已声明角色",
1392
- "roleAutoMatch.tooltip": "规则未命中时,模型会自动从已声明角色(id + persona)中选择最匹配者并注入该角色的链;关闭后未命中规则时按现状回落(inherit / rootChain)。",
1393
1377
  "rootChain.label": "默认降级链",
1394
1378
  "rootChain.tooltip": "未命中任何分时槽时先走这条降级链;全部失败后落到下面的默认模型。",
1395
1379
  "defaultModel.label": "默认模型",
@@ -1423,7 +1407,7 @@ window.__ModuleLoader__.load({
1423
1407
  "timeSlots.name": "名称",
1424
1408
  "timeSlots.expand": "展开该行",
1425
1409
  "timeSlots.collapse": "收起该行",
1426
- "timeSlots.tooltip": "命中行的模型链成为 root 生效链(取代全时段链);未命中任何行时使用全时段链。分时切换是路由种子而非失败决策:不消耗冷却、不计入单步切换上限。",
1410
+ "timeSlots.tooltip": "命中行的模型链成为 root 生效链(取代全时段链);未命中任何行时使用全时段链。分时切换是路由种子而非失败决策:不消耗冷却、不计入单次请求行走的切换上限。",
1427
1411
  "timeSlots.addPreset": "添加预设",
1428
1412
  "timeSlots.addCustom": "添加自定义时段",
1429
1413
  "timeSlots.presetPlaceholder": "选择预设",
@@ -1574,18 +1558,13 @@ window.__ModuleLoader__.load({
1574
1558
  "cooldownMs.label": "Cooldown (milliseconds)",
1575
1559
  "cooldownMs.hint": "Models stay out of candidacy during cooldown",
1576
1560
  "cooldownMs.tooltip": "Switched-away or failed models stay out of candidacy during the cooldown window.",
1577
- "maxSwitchesPerStep.label": "Max switches per step",
1561
+ "maxSwitchesPerStep.label": "Max switches per request walk",
1578
1562
  "maxSwitchesPerStep.hint": "Stops switching beyond the cap",
1579
- "maxSwitchesPerStep.tooltip": "Beyond this the step stops switching and ends with the original error semantics, preventing chain loops from amplifying latency.",
1580
- "alwaysModeRetryCap.label": "Always-mode retry cap",
1581
- "alwaysModeRetryCap.hint": "Switches after the cap; 0 disables",
1582
- "alwaysModeRetryCap.tooltip": "Models whose retryPolicy is always switch after this many retries within one request; 0 disables.",
1563
+ "maxSwitchesPerStep.tooltip": "Beyond this no further switch happens and the request ends with the original error semantics, preventing chain loops from amplifying latency.",
1564
+ "virtualOnly.rule": "Only sessions whose model selection is FallbacksChain/Auto (including plugin-injected subagents) walk a chain; a real-model selection gets no plugin fallback — llm-retry alone handles its retries.",
1583
1565
  "advanced.label": "Advanced options",
1584
1566
  "advanced.expand": "Expand advanced options",
1585
1567
  "advanced.collapse": "Collapse advanced options",
1586
- "roleAutoMatch.label": "Enable role auto-match",
1587
- "roleAutoMatch.hint": "On rules-miss, the model picks the closest declared role",
1588
- "roleAutoMatch.tooltip": "When no rule matches, the model auto-selects the best-fit declared role (id + persona) and uses its chain; turn off to keep today's fallback (inherit / rootChain) on a rules-miss.",
1589
1568
  "rootChain.label": "Default fallback chain",
1590
1569
  "rootChain.tooltip": "Walked first whenever no time slot matches; if every entry fails, the default model below is the last fallback.",
1591
1570
  "defaultModel.label": "Default model",
@@ -1619,7 +1598,7 @@ window.__ModuleLoader__.load({
1619
1598
  "timeSlots.name": "Name",
1620
1599
  "timeSlots.expand": "Expand this row",
1621
1600
  "timeSlots.collapse": "Collapse this row",
1622
- "timeSlots.tooltip": "A matched row's model chain becomes the effective root chain (replacing the all-day chain); no match uses the all-day chain. A time-slot switch is a routing seed, not a failure decision: it consumes no cooldown and does not count against the per-step switch cap.",
1601
+ "timeSlots.tooltip": "A matched row's model chain becomes the effective root chain (replacing the all-day chain); no match uses the all-day chain. A time-slot switch is a routing seed, not a failure decision: it consumes no cooldown and does not count against the per-request-walk switch cap.",
1623
1602
  "timeSlots.addPreset": "Add preset",
1624
1603
  "timeSlots.addCustom": "Add custom time slot",
1625
1604
  "timeSlots.presetPlaceholder": "Select a preset",
@@ -1788,7 +1767,7 @@ window.__ModuleLoader__.load({
1788
1767
  }
1789
1768
  //#endregion
1790
1769
  //#region \0dsh-css:/home/runner/work/dsh-llm-fallbacks/dsh-llm-fallbacks/src/client/FallbacksCard.module.css.mjs
1791
- const css$3 = "\n\n\n._20fd0e45_root {\n min-width: 0;\n}\n\n\n._4e39cf17_readOnly {\n margin: 12px 0 0;\n font-size: 12px;\n line-height: 1.5;\n color: var(--dsw-alias-label-tertiary);\n}\n\n._9860a5b1_notice {\n margin: 12px 0 0;\n font-size: 12px;\n line-height: 18px;\n color: var(--dsw-alias-state-business-primary);\n}\n\n\n._5006d43e_legacyNotice {\n margin: 12px 0 0;\n padding: 10px 12px;\n border-radius: 8px;\n background: var(--dsw-alias-bg-module-platform);\n font-size: 12px;\n line-height: 18px;\n color: var(--dsw-alias-state-business-primary);\n}\n\n._21918751_error {\n margin: 12px 0 0;\n font-size: 12px;\n line-height: 18px;\n color: var(--dsw-alias-state-error-primary);\n}\n\n\n._7cea4b2f_noticeRow {\n display: flex;\n align-items: center;\n gap: 8px;\n margin: 12px 0 0;\n}\n\n._7cea4b2f_noticeRow ._21918751_error {\n flex: 1;\n min-width: 0;\n margin: 0;\n}\n\n\n._94c91bfd_fieldset {\n margin: 0;\n padding: 0;\n border: none;\n display: flex;\n flex-direction: column;\n min-width: 0;\n}\n\n\n._ba240d82_sectionHeading {\n display: flex;\n align-items: center;\n gap: 8px;\n margin: 0;\n padding: 4px 0;\n font-size: 16px;\n line-height: 24px;\n font-weight: 600;\n color: var(--dsw-alias-label-primary);\n}\n\n._ddbc1b49_sectionHeadingText {\n display: block;\n min-width: 0;\n}\n\n\n._c41f9db7_sectionActions {\n display: flex;\n align-items: center;\n gap: 8px;\n margin-left: auto;\n}\n\n._c41f9db7_sectionActions ._f0864181_discard,\n._c41f9db7_sectionActions ._ccff7e48_save {\n padding: 3px 12px;\n font-size: 12px;\n line-height: 18px;\n}\n\n\n._b116c758_sectionToggle {\n appearance: none;\n border: 0;\n background: none;\n display: flex;\n align-items: center;\n gap: 4px;\n margin: 0;\n padding: 0;\n font: inherit;\n color: inherit;\n cursor: pointer;\n}\n\n._b116c758_sectionToggle:disabled {\n cursor: default;\n}\n\n._b116c758_sectionToggle:focus-visible {\n outline: 2px solid var(--dsw-alias-brand-primary);\n outline-offset: 1px;\n}\n\n\n._80101203_advancedBody {\n display: flex;\n flex-direction: column;\n min-width: 0;\n}\n\n._94c91bfd_fieldset > ._80101203_advancedBody > ._67826267_field,\n._94c91bfd_fieldset > ._80101203_advancedBody > ._9998065c_checkboxRow,\n._94c91bfd_fieldset > ._80101203_advancedBody > ._3e95886d_numberFields {\n padding: 12px 0;\n}\n\n._94c91bfd_fieldset > ._80101203_advancedBody > ._67826267_field + ._67826267_field,\n._94c91bfd_fieldset > ._80101203_advancedBody > ._9998065c_checkboxRow + ._67826267_field,\n._94c91bfd_fieldset > ._80101203_advancedBody > ._67826267_field + ._3e95886d_numberFields {\n border-top: 0.5px solid var(--dsw-alias-border-l2);\n}\n\n\n._67826267_field {\n display: flex;\n flex-direction: column;\n gap: 6px;\n margin: 0;\n padding: 0;\n border: none;\n min-width: 0;\n}\n\n\n._94c91bfd_fieldset > ._67826267_field,\n._94c91bfd_fieldset > ._9998065c_checkboxRow,\n._94c91bfd_fieldset > ._3e95886d_numberFields {\n padding: 12px 0;\n}\n\n._94c91bfd_fieldset > ._67826267_field + ._67826267_field,\n._94c91bfd_fieldset > ._67826267_field + ._3e95886d_numberFields,\n._94c91bfd_fieldset > ._9998065c_checkboxRow + ._67826267_field {\n border-top: 0.5px solid var(--dsw-alias-border-l2);\n}\n\n\n._9998065c_checkboxRow {\n display: flex;\n align-items: flex-start;\n gap: 8px;\n}\n\n\n._9998065c_checkboxRow ._06389b18_checkbox {\n margin-top: 3px;\n}\n\n._13e68c3f_fieldLabel {\n \n display: inline-flex;\n align-items: center;\n gap: 10px;\n padding: 0;\n font-size: 13px;\n line-height: 1.5;\n font-weight: 500;\n color: var(--dsw-alias-label-primary);\n}\n\n._4bc809b8_hint {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n flex-wrap: wrap;\n font-size: 12px;\n line-height: 18px;\n color: var(--dsw-alias-label-tertiary);\n}\n\n\n._02c2f6df_checkLabel {\n flex: 1;\n min-width: 0;\n display: flex;\n flex-direction: column;\n gap: 4px;\n font-size: 14px;\n line-height: 22px;\n font-weight: 400;\n color: var(--dsw-alias-label-primary);\n cursor: pointer;\n}\n\n._f2d47237_checkLabelTitle {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n font-weight: 400;\n}\n\n._c1bed8ea_checkLabelDesc {\n font-size: 12px;\n line-height: 18px;\n font-weight: 400;\n color: var(--dsw-alias-label-tertiary);\n}\n\n\n._06389b18_checkbox {\n flex: none;\n width: 16px;\n height: 16px;\n margin: 0;\n accent-color: var(--dsw-alias-brand-primary);\n cursor: pointer;\n}\n\n._06389b18_checkbox:disabled {\n opacity: 0.4;\n cursor: default;\n}\n\n\n._b1962759_slotPresetName {\n font-size: 14px;\n line-height: 22px;\n font-weight: 500;\n color: var(--dsw-alias-label-primary);\n}\n\n\n._a6244318_infoHint {\n position: relative;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex: none;\n width: 16px;\n height: 16px;\n border-radius: 50%;\n font-size: 14px;\n line-height: 1;\n color: var(--dsw-alias-label-tertiary);\n background: var(--dsw-alias-interactive-bg-hover);\n cursor: help;\n user-select: none;\n}\n\n._a6244318_infoHint:focus-visible {\n outline: none;\n box-shadow: 0 0 0 2px var(--dsw-alias-border-l3);\n}\n\n._a6244318_infoHint::after {\n content: attr(data-tip);\n position: absolute;\n top: 50%;\n left: calc(100% + 8px);\n transform: translateY(-50%);\n z-index: 10;\n box-sizing: border-box;\n width: max-content;\n max-width: 280px;\n padding: 5px 10px;\n border-radius: 8px;\n background: var(--dsw-alias-label-primary);\n color: var(--dsw-alias-bg-layer-3);\n font-size: 11px;\n line-height: 17px;\n font-weight: 400;\n white-space: normal;\n text-align: left;\n pointer-events: none;\n opacity: 0;\n transition: opacity .12s;\n}\n\n._a6244318_infoHint:hover::after,\n._a6244318_infoHint:focus-visible::after {\n opacity: 1;\n}\n\n\n._e655c840_infoHintDisabled {\n opacity: 0.4;\n cursor: default;\n}\n\n\n._a2521bb0_optionRow {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 6px 8px;\n border-radius: 6px;\n font-size: 14px;\n line-height: 22px;\n color: var(--dsw-alias-label-primary);\n cursor: pointer;\n}\n\n._a2521bb0_optionRow:hover:has(input:not(:disabled)) {\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\n\n._06389b18_checkbox,\n._a2521bb0_optionRow input {\n flex: none;\n width: 16px;\n height: 16px;\n margin: 0;\n accent-color: var(--dsw-alias-brand-primary);\n cursor: pointer;\n}\n\n._06389b18_checkbox:focus-visible,\n._a2521bb0_optionRow input:focus-visible {\n outline: none;\n box-shadow: 0 0 0 2px var(--dsw-alias-border-l3);\n}\n\n._a2521bb0_optionRow input:disabled {\n cursor: default;\n}\n\n\n._c4ecbdf3_dayRow {\n display: flex;\n flex-wrap: wrap;\n gap: 4px;\n}\n\n._0330c1ed_dayCell {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 2px 6px;\n border-radius: 6px;\n font-size: 12px;\n line-height: 18px;\n color: var(--dsw-alias-label-secondary);\n cursor: pointer;\n}\n\n._0330c1ed_dayCell:hover:has(input:not(:disabled)) {\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\n._0330c1ed_dayCell input {\n flex: none;\n width: 16px;\n height: 16px;\n margin: 0;\n accent-color: var(--dsw-alias-brand-primary);\n cursor: pointer;\n}\n\n._0330c1ed_dayCell input:disabled {\n cursor: default;\n}\n\n._0330c1ed_dayCell input:focus-visible {\n outline: none;\n box-shadow: 0 0 0 2px var(--dsw-alias-border-l3);\n}\n\n\n._f9d86f7b_input {\n box-sizing: border-box;\n width: 100%;\n height: 34px;\n padding: 0 12px;\n border: 0.5px solid var(--dsw-alias-border-l4);\n border-radius: var(--dsw-radius-md);\n font: inherit;\n font-size: 13px;\n line-height: 1.5;\n background: var(--dsw-alias-bg-layer-3);\n color: var(--dsw-alias-label-primary);\n}\n\n._f9d86f7b_input:focus-visible {\n outline: none;\n border-color: var(--dsw-alias-state-business-primary);\n}\n\n._f9d86f7b_input::placeholder {\n color: var(--dsw-alias-label-dimmed);\n}\n\n._f9d86f7b_input:disabled {\n color: var(--dsw-alias-label-tertiary);\n cursor: default;\n}\n\n\n._3a9b42fd_inputTextarea {\n height: auto;\n min-height: 72px;\n padding: 8px 12px;\n resize: vertical;\n}\n\n\n._1285c19b_personaBriefRow {\n display: flex;\n align-items: center;\n gap: 4px;\n min-width: 0;\n}\n\n._4b8f7345_personaBrief {\n flex: 1;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n font-size: 14px;\n line-height: 22px;\n color: var(--dsw-alias-label-primary);\n}\n\n\n._2686400e_personaBriefEmpty {\n color: var(--dsw-alias-label-tertiary);\n}\n\n\n._4e4a07be_personaFull {\n margin: 0;\n font-size: 14px;\n line-height: 22px;\n color: var(--dsw-alias-label-secondary);\n white-space: pre-wrap;\n overflow-wrap: anywhere;\n}\n\n\n._7b60337a_inputInvalid,\n._7b60337a_inputInvalid:focus-visible {\n border-color: var(--dsw-alias-state-error-primary);\n}\n\n\nselect._f9d86f7b_input {\n max-width: 240px;\n cursor: pointer;\n}\n\n\n._16eb7153_selectInput {\n appearance: none;\n padding-right: 32px;\n \n background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12' fill='none'%3E%3Cpath d='M3 4.5L6 7.5L9 4.5' stroke='%2381858C' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E\");\n background-repeat: no-repeat;\n background-position: right 12px center;\n background-size: 12px 12px;\n}\n\n\n._3e95886d_numberFields {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(160px, 1fr));\n gap: 12px;\n}\n\n._3e95886d_numberFields ._67826267_field {\n padding: 0;\n}\n\n._0cfb5881_list {\n display: flex;\n flex-direction: column;\n gap: 8px;\n margin-top: 4px;\n}\n\n\n._f5c620d6_editorCard {\n display: flex;\n flex-direction: column;\n gap: 14px;\n padding: 14px 16px;\n border-radius: 12px;\n background: var(--dsw-alias-bg-module-platform);\n}\n\n._224b1387_cardFoot {\n display: flex;\n justify-content: flex-end;\n}\n\n._8e220e07_ruleGrid {\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n}\n\n._24a12a2f_ruleCell {\n display: flex;\n flex-direction: column;\n gap: 4px;\n min-width: 120px;\n flex: 1;\n}\n\n._1014c097_ruleCellLabel {\n font-size: 12px;\n line-height: 18px;\n color: var(--dsw-alias-label-secondary);\n}\n\n\n._631094a0_chevron {\n flex: none;\n color: var(--dsw-alias-label-tertiary);\n transform: rotate(-90deg);\n transition: transform .16s;\n}\n\n._44836ce8_chevronOpen {\n transform: none;\n}\n\n\n._cf3961bb_chevronFlip {\n transform: rotate(180deg);\n}\n\n\n._86bc52d2_collapseRow {\n display: flex;\n align-items: center;\n gap: 8px;\n min-width: 0;\n}\n\n._a73efcc6_collapseToggle {\n appearance: none;\n border: 0;\n background: none;\n padding: 0;\n cursor: pointer;\n color: var(--dsw-alias-label-secondary);\n display: flex;\n align-items: center;\n gap: 8px;\n flex: 1;\n min-width: 0;\n font: inherit;\n text-align: left;\n}\n\n._a73efcc6_collapseToggle:disabled {\n cursor: default;\n}\n\n._af017718_collapseTitle {\n \n flex: none;\n max-width: 55%;\n min-width: 0;\n font-size: 12px;\n line-height: 18px;\n font-weight: 500;\n color: var(--dsw-alias-label-primary);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n._2cabe603_collapseMeta {\n \n flex: 0 1 auto;\n min-width: 0;\n max-width: 40%;\n margin-left: auto;\n font-size: 12px;\n line-height: 18px;\n color: var(--dsw-alias-label-secondary);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n\n._52d6df87_seedBadge {\n flex: none;\n max-width: 40%;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n border-radius: 999px;\n padding: 1px 8px;\n font-size: 11px;\n line-height: 17px;\n font-weight: 500;\n white-space: nowrap;\n background: var(--dsw-alias-bg-layer-1);\n color: var(--dsw-alias-label-secondary);\n}\n\n\n._7b04f727_slotTag {\n flex: none;\n display: inline-flex;\n align-items: center;\n border-radius: 999px;\n padding: 0 6px;\n font-size: 11px;\n line-height: 17px;\n font-weight: 500;\n white-space: nowrap;\n border: 1px solid;\n}\n\n._c381e792_slotTagHighCost {\n color: var(--dsw-alias-state-error-primary);\n border-color: var(--dsw-alias-state-error-primary);\n background: color-mix(in srgb, var(--dsw-alias-state-error-primary) 10%, transparent);\n}\n\n._23bdb6fc_slotTagMultiplier {\n color: var(--dsw-alias-state-warn-primary);\n border-color: var(--dsw-alias-state-warn-primary);\n background: color-mix(in srgb, var(--dsw-alias-state-warn-primary) 10%, transparent);\n}\n\n._f000eed9_slotTagActive {\n color: var(--dsw-alias-state-success-primary);\n border-color: var(--dsw-alias-state-success-primary);\n background: color-mix(in srgb, var(--dsw-alias-state-success-primary) 10%, transparent);\n}\n\n\n._cd905ce5_dragHandle {\n appearance: none;\n border: 0;\n background: none;\n padding: 0;\n cursor: grab;\n color: var(--dsw-alias-label-tertiary);\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 20px;\n height: 20px;\n border-radius: 6px;\n flex: none;\n}\n\n._cd905ce5_dragHandle:hover:not(:disabled) {\n background: var(--dsw-alias-interactive-bg-hover);\n color: var(--dsw-alias-label-primary);\n}\n\n._cd905ce5_dragHandle:active {\n cursor: grabbing;\n}\n\n._cd905ce5_dragHandle:disabled {\n cursor: default;\n opacity: 0.4;\n}\n\n._cd905ce5_dragHandle:focus-visible {\n outline: none;\n box-shadow: 0 0 0 2px var(--dsw-alias-border-l3);\n}\n\n\n._fee63b7e_slotCardDragging {\n opacity: 0.45;\n}\n\n._6f108491_slotCardOver {\n outline: 1px dashed var(--dsw-alias-brand-primary);\n outline-offset: 2px;\n}\n\n\n._1a0fa2e1_selectorRowDragging {\n opacity: 0.45;\n}\n\n._688095f2_selectorRowOver {\n outline: 1px dashed var(--dsw-alias-brand-primary);\n outline-offset: 2px;\n border-radius: 6px;\n}\n\n\n._7489fed0_selectorGrip {\n flex: none;\n}\n\n._7489fed0_selectorGrip:disabled {\n display: none;\n}\n\n\n._28237b53_chainBlock {\n display: flex;\n flex-direction: column;\n gap: 6px;\n}\n\n\n._15a12620_chainSelectors {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n\n._5694c1de_selectorLine {\n display: flex;\n align-items: center;\n gap: 8px;\n flex-wrap: nowrap;\n \n min-height: 32px;\n}\n\n\n._2f156f38_selectorIndex {\n flex: none;\n width: 1.5em;\n text-align: right;\n font-size: 11px;\n line-height: 16px;\n color: var(--dsw-alias-label-tertiary);\n font-variant-numeric: tabular-nums;\n}\n\n\n._4843ae21_selectorProviderCell {\n flex: 0 1 clamp(140px, 20%, 220px);\n min-width: 0;\n}\n\n._df828181_selectorModelCell {\n flex: 1 1 auto;\n min-width: 0;\n}\n\n\n._df828181_selectorModelCell > select._f9d86f7b_input {\n max-width: 100%;\n}\n\n\n._fe6d05a5_selectorHint {\n display: flex;\n align-items: center;\n flex: 0 1 auto;\n min-width: 0;\n}\n\n\n._d04ee9fe_selectorHintText {\n flex: 0 1 auto;\n min-width: 0;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n font-size: 11px;\n line-height: 16px;\n color: var(--dsw-alias-label-secondary);\n}\n\n\n._fe6d05a5_selectorHint > ._a6244318_infoHint {\n flex: none;\n margin-left: 4px;\n}\n\n\n._ec7c2fac_selectorRemove {\n flex: none;\n opacity: 0;\n transition: opacity .12s;\n}\n\n\n._ec7c2fac_selectorRemove:disabled {\n display: none;\n}\n\n\n._240cbbf8_selectorRow:hover ._ec7c2fac_selectorRemove:not(:disabled),\n._240cbbf8_selectorRow:focus-within ._ec7c2fac_selectorRemove:not(:disabled) {\n opacity: 1;\n}\n\n@media (hover: none) {\n ._ec7c2fac_selectorRemove:not(:disabled) {\n opacity: 0.7;\n }\n}\n\n\n._70effa64_iconButton {\n position: relative;\n box-sizing: border-box;\n appearance: none;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n padding: 0;\n border: 0;\n border-radius: 6px;\n background: none;\n color: var(--dsw-alias-label-tertiary);\n cursor: pointer;\n}\n\n._70effa64_iconButton:disabled {\n opacity: 0.4;\n cursor: default;\n}\n\n._70effa64_iconButton:hover:not(:disabled) {\n background: var(--dsw-alias-interactive-bg-hover);\n color: var(--dsw-alias-label-primary);\n}\n\n._70effa64_iconButton:focus-visible {\n outline: none;\n box-shadow: 0 0 0 2px var(--dsw-alias-border-l3);\n}\n\n._70effa64_iconButton::after {\n content: attr(data-tip);\n position: absolute;\n bottom: calc(100% + 6px);\n left: 50%;\n transform: translateX(-50%);\n padding: 3px 8px;\n border-radius: 6px;\n background: var(--dsw-alias-label-primary);\n color: var(--dsw-alias-bg-layer-3);\n font-size: 11px;\n line-height: 17px;\n white-space: nowrap;\n opacity: 0;\n pointer-events: none;\n transition: opacity .12s;\n}\n\n._70effa64_iconButton:hover::after,\n._70effa64_iconButton:focus-visible::after {\n opacity: 1;\n}\n\n\n._a0968257_iconButtonDanger:hover:not(:disabled) {\n background: var(--dsw-alias-interactive-bg-hover-danger);\n color: var(--dsw-alias-state-error-primary);\n}\n\n\n._711248a9_outlineButton {\n appearance: none;\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 4px 10px;\n border: 1px solid var(--dsw-alias-border-l2);\n border-radius: var(--dsw-radius-md);\n background: none;\n font: inherit;\n font-size: 12px;\n line-height: 18px;\n color: var(--dsw-alias-label-secondary);\n cursor: pointer;\n}\n\n._711248a9_outlineButton:hover:not(:disabled) {\n color: var(--dsw-alias-label-primary);\n border-color: var(--dsw-alias-label-dimmed);\n}\n\n._711248a9_outlineButton:disabled {\n opacity: 0.4;\n cursor: default;\n}\n\n._711248a9_outlineButton:focus-visible {\n outline: 2px solid var(--dsw-alias-brand-primary);\n outline-offset: 1px;\n}\n\n\n._28202c90_addButton {\n align-self: flex-start;\n}\n\n\n._28237b53_chainBlock > ._28202c90_addButton {\n box-sizing: border-box;\n align-self: flex-start;\n height: 26px;\n padding: 0 8px;\n border: 1px solid transparent;\n gap: 4px;\n font-size: 12px;\n line-height: 18px;\n color: var(--dsw-alias-label-secondary);\n}\n\n._28237b53_chainBlock > ._28202c90_addButton:hover:not(:disabled) {\n border-color: transparent;\n background: var(--dsw-alias-interactive-bg-hover);\n color: var(--dsw-alias-label-primary);\n}\n\n\n._28237b53_chainBlock > ._28202c90_addButton:focus-visible {\n outline: none;\n box-shadow: 0 0 0 2px var(--dsw-alias-border-l3);\n}\n\n\n._6a2bd54c_slotAddRow {\n display: flex;\n align-items: center;\n gap: 8px;\n margin-top: 4px;\n flex-wrap: wrap;\n}\n\n\n._4e77523e_rowActions {\n display: flex;\n align-items: center;\n gap: 4px;\n}\n\n\n._f0864181_discard,\n._ccff7e48_save {\n appearance: none;\n border: 1px solid transparent;\n border-radius: var(--dsw-radius-md);\n padding: 5px 14px;\n font: inherit;\n font-size: 13px;\n line-height: 1.5;\n cursor: pointer;\n}\n\n._f0864181_discard {\n border-color: var(--dsw-alias-border-l2);\n background: none;\n color: var(--dsw-alias-label-secondary);\n}\n\n._f0864181_discard:hover:not(:disabled) {\n color: var(--dsw-alias-label-primary);\n border-color: var(--dsw-alias-label-dimmed);\n}\n\n._ccff7e48_save {\n background: var(--dsw-alias-label-primary);\n color: var(--dsw-alias-bg-layer-3);\n}\n\n._f0864181_discard:disabled,\n._ccff7e48_save:disabled {\n opacity: 0.4;\n cursor: default;\n}\n\n._f0864181_discard:focus-visible,\n._ccff7e48_save:focus-visible {\n outline: 2px solid var(--dsw-alias-brand-primary);\n outline-offset: 1px;\n}\n\n\n._fbd045e0_statusBlock {\n display: flex;\n flex-direction: column;\n gap: 12px;\n padding: 12px 14px;\n margin-top: 12px;\n border: 1px solid var(--dsw-alias-border-l2);\n border-radius: 12px;\n}\n\n._d4f70367_statusTitle {\n font-size: 12px;\n line-height: 18px;\n font-weight: 500;\n color: var(--dsw-alias-label-secondary);\n}\n\n\n._8ab300ed_statusLine {\n margin: 0;\n font-size: 12px;\n line-height: 18px;\n color: var(--dsw-alias-label-secondary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n._e8cedbf5_statusLineLabel {\n font-weight: 500;\n color: var(--dsw-alias-label-secondary);\n}\n\n\n._700006c9_policyStatus {\n margin: 12px 0 0;\n padding: 10px 12px;\n border-radius: 8px;\n background: var(--dsw-alias-bg-module-platform);\n display: flex;\n flex-direction: column;\n gap: 6px;\n}\n\n\n._aa3fae4a_policyStatusText {\n display: flex;\n flex-direction: column;\n gap: 6px;\n}\n\n._d90f6286_policyStatusSync {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: 6px;\n}\n\n\n._579f87fb_policyStatusLive:empty {\n position: absolute;\n width: 1px;\n height: 1px;\n overflow: hidden;\n clip-path: inset(50%);\n white-space: nowrap;\n}\n\n._d4b67a81_policyStatusLabel {\n font-size: 12px;\n font-weight: 600;\n line-height: 18px;\n color: var(--dsw-alias-label-secondary);\n}\n\n._278bb4b3_policyStatusLine {\n font-size: 12px;\n line-height: 18px;\n color: var(--dsw-alias-label-primary);\n}\n\n._da6387e5_policyStatusWarn {\n font-size: 12px;\n line-height: 18px;\n color: var(--dsw-alias-state-warn-primary);\n}\n\n@media (prefers-reduced-motion: reduce) {\n ._70effa64_iconButton::after,\n ._a6244318_infoHint::after {\n transition: none;\n }\n\n ._631094a0_chevron {\n transition: none;\n }\n}\n";
1770
+ const css$3 = "\n\n\n._20fd0e45_root {\n min-width: 0;\n}\n\n\n._4e39cf17_readOnly {\n margin: 12px 0 0;\n font-size: 12px;\n line-height: 1.5;\n color: var(--dsw-alias-label-tertiary);\n}\n\n._9860a5b1_notice {\n margin: 12px 0 0;\n font-size: 12px;\n line-height: 18px;\n color: var(--dsw-alias-state-business-primary);\n}\n\n\n._5006d43e_legacyNotice {\n margin: 12px 0 0;\n padding: 10px 12px;\n border-radius: 8px;\n background: var(--dsw-alias-bg-module-platform);\n font-size: 12px;\n line-height: 18px;\n color: var(--dsw-alias-state-business-primary);\n}\n\n._21918751_error {\n margin: 12px 0 0;\n font-size: 12px;\n line-height: 18px;\n color: var(--dsw-alias-state-error-primary);\n}\n\n\n._7cea4b2f_noticeRow {\n display: flex;\n align-items: center;\n gap: 8px;\n margin: 12px 0 0;\n}\n\n._7cea4b2f_noticeRow ._21918751_error {\n flex: 1;\n min-width: 0;\n margin: 0;\n}\n\n\n._94c91bfd_fieldset {\n margin: 0;\n padding: 0;\n border: none;\n display: flex;\n flex-direction: column;\n min-width: 0;\n}\n\n\n._ba240d82_sectionHeading {\n display: flex;\n align-items: center;\n gap: 8px;\n margin: 0;\n padding: 4px 0;\n font-size: 16px;\n line-height: 24px;\n font-weight: 600;\n color: var(--dsw-alias-label-primary);\n}\n\n._ddbc1b49_sectionHeadingText {\n display: block;\n min-width: 0;\n}\n\n\n._c41f9db7_sectionActions {\n display: flex;\n align-items: center;\n gap: 8px;\n margin-left: auto;\n}\n\n._c41f9db7_sectionActions ._f0864181_discard,\n._c41f9db7_sectionActions ._ccff7e48_save {\n padding: 3px 12px;\n font-size: 12px;\n line-height: 18px;\n}\n\n\n._b116c758_sectionToggle {\n appearance: none;\n border: 0;\n background: none;\n display: flex;\n align-items: center;\n gap: 4px;\n margin: 0;\n padding: 0;\n font: inherit;\n color: inherit;\n cursor: pointer;\n}\n\n._b116c758_sectionToggle:disabled {\n cursor: default;\n}\n\n._b116c758_sectionToggle:focus-visible {\n outline: 2px solid var(--dsw-alias-brand-primary);\n outline-offset: 1px;\n}\n\n\n._80101203_advancedBody {\n display: flex;\n flex-direction: column;\n min-width: 0;\n}\n\n._94c91bfd_fieldset > ._80101203_advancedBody > ._67826267_field,\n._94c91bfd_fieldset > ._80101203_advancedBody > ._3e95886d_numberFields {\n padding: 12px 0;\n}\n\n._94c91bfd_fieldset > ._80101203_advancedBody > ._67826267_field + ._67826267_field,\n._94c91bfd_fieldset > ._80101203_advancedBody > ._67826267_field + ._3e95886d_numberFields {\n border-top: 0.5px solid var(--dsw-alias-border-l2);\n}\n\n\n._67826267_field {\n display: flex;\n flex-direction: column;\n gap: 6px;\n margin: 0;\n padding: 0;\n border: none;\n min-width: 0;\n}\n\n\n._94c91bfd_fieldset > ._67826267_field,\n._94c91bfd_fieldset > ._3e95886d_numberFields {\n padding: 12px 0;\n}\n\n._94c91bfd_fieldset > ._67826267_field + ._67826267_field,\n._94c91bfd_fieldset > ._67826267_field + ._3e95886d_numberFields {\n border-top: 0.5px solid var(--dsw-alias-border-l2);\n}\n\n._13e68c3f_fieldLabel {\n \n display: inline-flex;\n align-items: center;\n gap: 10px;\n padding: 0;\n font-size: 13px;\n line-height: 1.5;\n font-weight: 500;\n color: var(--dsw-alias-label-primary);\n}\n\n._4bc809b8_hint {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n flex-wrap: wrap;\n font-size: 12px;\n line-height: 18px;\n color: var(--dsw-alias-label-tertiary);\n}\n\n\n._b1962759_slotPresetName {\n font-size: 14px;\n line-height: 22px;\n font-weight: 500;\n color: var(--dsw-alias-label-primary);\n}\n\n\n._a6244318_infoHint {\n position: relative;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex: none;\n width: 16px;\n height: 16px;\n border-radius: 50%;\n font-size: 14px;\n line-height: 1;\n color: var(--dsw-alias-label-tertiary);\n background: var(--dsw-alias-interactive-bg-hover);\n cursor: help;\n user-select: none;\n}\n\n._a6244318_infoHint:focus-visible {\n outline: none;\n box-shadow: 0 0 0 2px var(--dsw-alias-border-l3);\n}\n\n._a6244318_infoHint::after {\n content: attr(data-tip);\n position: absolute;\n top: 50%;\n left: calc(100% + 8px);\n transform: translateY(-50%);\n z-index: 10;\n box-sizing: border-box;\n width: max-content;\n max-width: 280px;\n padding: 5px 10px;\n border-radius: 8px;\n background: var(--dsw-alias-label-primary);\n color: var(--dsw-alias-bg-layer-3);\n font-size: 11px;\n line-height: 17px;\n font-weight: 400;\n white-space: normal;\n text-align: left;\n pointer-events: none;\n opacity: 0;\n transition: opacity .12s;\n}\n\n._a6244318_infoHint:hover::after,\n._a6244318_infoHint:focus-visible::after {\n opacity: 1;\n}\n\n\n._e655c840_infoHintDisabled {\n opacity: 0.4;\n cursor: default;\n}\n\n\n._a2521bb0_optionRow {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 6px 8px;\n border-radius: 6px;\n font-size: 14px;\n line-height: 22px;\n color: var(--dsw-alias-label-primary);\n cursor: pointer;\n}\n\n._a2521bb0_optionRow:hover:has(input:not(:disabled)) {\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\n\n._06389b18_checkbox,\n._a2521bb0_optionRow input {\n flex: none;\n width: 16px;\n height: 16px;\n margin: 0;\n accent-color: var(--dsw-alias-brand-primary);\n cursor: pointer;\n}\n\n._06389b18_checkbox:focus-visible,\n._a2521bb0_optionRow input:focus-visible {\n outline: none;\n box-shadow: 0 0 0 2px var(--dsw-alias-border-l3);\n}\n\n._a2521bb0_optionRow input:disabled {\n cursor: default;\n}\n\n\n._c4ecbdf3_dayRow {\n display: flex;\n flex-wrap: wrap;\n gap: 4px;\n}\n\n._0330c1ed_dayCell {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 2px 6px;\n border-radius: 6px;\n font-size: 12px;\n line-height: 18px;\n color: var(--dsw-alias-label-secondary);\n cursor: pointer;\n}\n\n._0330c1ed_dayCell:hover:has(input:not(:disabled)) {\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\n._0330c1ed_dayCell input {\n flex: none;\n width: 16px;\n height: 16px;\n margin: 0;\n accent-color: var(--dsw-alias-brand-primary);\n cursor: pointer;\n}\n\n._0330c1ed_dayCell input:disabled {\n cursor: default;\n}\n\n._0330c1ed_dayCell input:focus-visible {\n outline: none;\n box-shadow: 0 0 0 2px var(--dsw-alias-border-l3);\n}\n\n\n._f9d86f7b_input {\n box-sizing: border-box;\n width: 100%;\n height: 34px;\n padding: 0 12px;\n border: 0.5px solid var(--dsw-alias-border-l4);\n border-radius: var(--dsw-radius-md);\n font: inherit;\n font-size: 13px;\n line-height: 1.5;\n background: var(--dsw-alias-bg-layer-3);\n color: var(--dsw-alias-label-primary);\n}\n\n._f9d86f7b_input:focus-visible {\n outline: none;\n border-color: var(--dsw-alias-state-business-primary);\n}\n\n._f9d86f7b_input::placeholder {\n color: var(--dsw-alias-label-dimmed);\n}\n\n._f9d86f7b_input:disabled {\n color: var(--dsw-alias-label-tertiary);\n cursor: default;\n}\n\n\n._3a9b42fd_inputTextarea {\n height: auto;\n min-height: 72px;\n padding: 8px 12px;\n resize: vertical;\n}\n\n\n._1285c19b_personaBriefRow {\n display: flex;\n align-items: center;\n gap: 4px;\n min-width: 0;\n}\n\n._4b8f7345_personaBrief {\n flex: 1;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n font-size: 14px;\n line-height: 22px;\n color: var(--dsw-alias-label-primary);\n}\n\n\n._2686400e_personaBriefEmpty {\n color: var(--dsw-alias-label-tertiary);\n}\n\n\n._4e4a07be_personaFull {\n margin: 0;\n font-size: 14px;\n line-height: 22px;\n color: var(--dsw-alias-label-secondary);\n white-space: pre-wrap;\n overflow-wrap: anywhere;\n}\n\n\n._7b60337a_inputInvalid,\n._7b60337a_inputInvalid:focus-visible {\n border-color: var(--dsw-alias-state-error-primary);\n}\n\n\nselect._f9d86f7b_input {\n max-width: 240px;\n cursor: pointer;\n}\n\n\n._16eb7153_selectInput {\n appearance: none;\n padding-right: 32px;\n \n background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12' fill='none'%3E%3Cpath d='M3 4.5L6 7.5L9 4.5' stroke='%2381858C' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E\");\n background-repeat: no-repeat;\n background-position: right 12px center;\n background-size: 12px 12px;\n}\n\n\n._3e95886d_numberFields {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(160px, 1fr));\n gap: 12px;\n}\n\n._3e95886d_numberFields ._67826267_field {\n padding: 0;\n}\n\n._0cfb5881_list {\n display: flex;\n flex-direction: column;\n gap: 8px;\n margin-top: 4px;\n}\n\n\n._f5c620d6_editorCard {\n display: flex;\n flex-direction: column;\n gap: 14px;\n padding: 14px 16px;\n border-radius: 12px;\n background: var(--dsw-alias-bg-module-platform);\n}\n\n._224b1387_cardFoot {\n display: flex;\n justify-content: flex-end;\n}\n\n._8e220e07_ruleGrid {\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n}\n\n._24a12a2f_ruleCell {\n display: flex;\n flex-direction: column;\n gap: 4px;\n min-width: 120px;\n flex: 1;\n}\n\n._1014c097_ruleCellLabel {\n font-size: 12px;\n line-height: 18px;\n color: var(--dsw-alias-label-secondary);\n}\n\n\n._631094a0_chevron {\n flex: none;\n color: var(--dsw-alias-label-tertiary);\n transform: rotate(-90deg);\n transition: transform .16s;\n}\n\n._44836ce8_chevronOpen {\n transform: none;\n}\n\n\n._cf3961bb_chevronFlip {\n transform: rotate(180deg);\n}\n\n\n._86bc52d2_collapseRow {\n display: flex;\n align-items: center;\n gap: 8px;\n min-width: 0;\n}\n\n._a73efcc6_collapseToggle {\n appearance: none;\n border: 0;\n background: none;\n padding: 0;\n cursor: pointer;\n color: var(--dsw-alias-label-secondary);\n display: flex;\n align-items: center;\n gap: 8px;\n flex: 1;\n min-width: 0;\n font: inherit;\n text-align: left;\n}\n\n._a73efcc6_collapseToggle:disabled {\n cursor: default;\n}\n\n._af017718_collapseTitle {\n \n flex: none;\n max-width: 55%;\n min-width: 0;\n font-size: 12px;\n line-height: 18px;\n font-weight: 500;\n color: var(--dsw-alias-label-primary);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n._2cabe603_collapseMeta {\n \n flex: 0 1 auto;\n min-width: 0;\n max-width: 40%;\n margin-left: auto;\n font-size: 12px;\n line-height: 18px;\n color: var(--dsw-alias-label-secondary);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n\n._52d6df87_seedBadge {\n flex: none;\n max-width: 40%;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n border-radius: 999px;\n padding: 1px 8px;\n font-size: 11px;\n line-height: 17px;\n font-weight: 500;\n white-space: nowrap;\n background: var(--dsw-alias-bg-layer-1);\n color: var(--dsw-alias-label-secondary);\n}\n\n\n._7b04f727_slotTag {\n flex: none;\n display: inline-flex;\n align-items: center;\n border-radius: 999px;\n padding: 0 6px;\n font-size: 11px;\n line-height: 17px;\n font-weight: 500;\n white-space: nowrap;\n border: 1px solid;\n}\n\n._c381e792_slotTagHighCost {\n color: var(--dsw-alias-state-error-primary);\n border-color: var(--dsw-alias-state-error-primary);\n background: color-mix(in srgb, var(--dsw-alias-state-error-primary) 10%, transparent);\n}\n\n._23bdb6fc_slotTagMultiplier {\n color: var(--dsw-alias-state-warn-primary);\n border-color: var(--dsw-alias-state-warn-primary);\n background: color-mix(in srgb, var(--dsw-alias-state-warn-primary) 10%, transparent);\n}\n\n._f000eed9_slotTagActive {\n color: var(--dsw-alias-state-success-primary);\n border-color: var(--dsw-alias-state-success-primary);\n background: color-mix(in srgb, var(--dsw-alias-state-success-primary) 10%, transparent);\n}\n\n\n._cd905ce5_dragHandle {\n appearance: none;\n border: 0;\n background: none;\n padding: 0;\n cursor: grab;\n color: var(--dsw-alias-label-tertiary);\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 20px;\n height: 20px;\n border-radius: 6px;\n flex: none;\n}\n\n._cd905ce5_dragHandle:hover:not(:disabled) {\n background: var(--dsw-alias-interactive-bg-hover);\n color: var(--dsw-alias-label-primary);\n}\n\n._cd905ce5_dragHandle:active {\n cursor: grabbing;\n}\n\n._cd905ce5_dragHandle:disabled {\n cursor: default;\n opacity: 0.4;\n}\n\n._cd905ce5_dragHandle:focus-visible {\n outline: none;\n box-shadow: 0 0 0 2px var(--dsw-alias-border-l3);\n}\n\n\n._fee63b7e_slotCardDragging {\n opacity: 0.45;\n}\n\n._6f108491_slotCardOver {\n outline: 1px dashed var(--dsw-alias-brand-primary);\n outline-offset: 2px;\n}\n\n\n._1a0fa2e1_selectorRowDragging {\n opacity: 0.45;\n}\n\n._688095f2_selectorRowOver {\n outline: 1px dashed var(--dsw-alias-brand-primary);\n outline-offset: 2px;\n border-radius: 6px;\n}\n\n\n._7489fed0_selectorGrip {\n flex: none;\n}\n\n._7489fed0_selectorGrip:disabled {\n display: none;\n}\n\n\n._28237b53_chainBlock {\n display: flex;\n flex-direction: column;\n gap: 6px;\n}\n\n\n._15a12620_chainSelectors {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n\n._5694c1de_selectorLine {\n display: flex;\n align-items: center;\n gap: 8px;\n flex-wrap: nowrap;\n \n min-height: 32px;\n}\n\n\n._2f156f38_selectorIndex {\n flex: none;\n width: 1.5em;\n text-align: right;\n font-size: 11px;\n line-height: 16px;\n color: var(--dsw-alias-label-tertiary);\n font-variant-numeric: tabular-nums;\n}\n\n\n._4843ae21_selectorProviderCell {\n flex: 0 1 clamp(140px, 20%, 220px);\n min-width: 0;\n}\n\n._df828181_selectorModelCell {\n flex: 1 1 auto;\n min-width: 0;\n}\n\n\n._df828181_selectorModelCell > select._f9d86f7b_input {\n max-width: 100%;\n}\n\n\n._fe6d05a5_selectorHint {\n display: flex;\n align-items: center;\n flex: 0 1 auto;\n min-width: 0;\n}\n\n\n._d04ee9fe_selectorHintText {\n flex: 0 1 auto;\n min-width: 0;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n font-size: 11px;\n line-height: 16px;\n color: var(--dsw-alias-label-secondary);\n}\n\n\n._fe6d05a5_selectorHint > ._a6244318_infoHint {\n flex: none;\n margin-left: 4px;\n}\n\n\n._ec7c2fac_selectorRemove {\n flex: none;\n opacity: 0;\n transition: opacity .12s;\n}\n\n\n._ec7c2fac_selectorRemove:disabled {\n display: none;\n}\n\n\n._240cbbf8_selectorRow:hover ._ec7c2fac_selectorRemove:not(:disabled),\n._240cbbf8_selectorRow:focus-within ._ec7c2fac_selectorRemove:not(:disabled) {\n opacity: 1;\n}\n\n@media (hover: none) {\n ._ec7c2fac_selectorRemove:not(:disabled) {\n opacity: 0.7;\n }\n}\n\n\n._70effa64_iconButton {\n position: relative;\n box-sizing: border-box;\n appearance: none;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n padding: 0;\n border: 0;\n border-radius: 6px;\n background: none;\n color: var(--dsw-alias-label-tertiary);\n cursor: pointer;\n}\n\n._70effa64_iconButton:disabled {\n opacity: 0.4;\n cursor: default;\n}\n\n._70effa64_iconButton:hover:not(:disabled) {\n background: var(--dsw-alias-interactive-bg-hover);\n color: var(--dsw-alias-label-primary);\n}\n\n._70effa64_iconButton:focus-visible {\n outline: none;\n box-shadow: 0 0 0 2px var(--dsw-alias-border-l3);\n}\n\n._70effa64_iconButton::after {\n content: attr(data-tip);\n position: absolute;\n bottom: calc(100% + 6px);\n left: 50%;\n transform: translateX(-50%);\n padding: 3px 8px;\n border-radius: 6px;\n background: var(--dsw-alias-label-primary);\n color: var(--dsw-alias-bg-layer-3);\n font-size: 11px;\n line-height: 17px;\n white-space: nowrap;\n opacity: 0;\n pointer-events: none;\n transition: opacity .12s;\n}\n\n._70effa64_iconButton:hover::after,\n._70effa64_iconButton:focus-visible::after {\n opacity: 1;\n}\n\n\n._a0968257_iconButtonDanger:hover:not(:disabled) {\n background: var(--dsw-alias-interactive-bg-hover-danger);\n color: var(--dsw-alias-state-error-primary);\n}\n\n\n._711248a9_outlineButton {\n appearance: none;\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 4px 10px;\n border: 1px solid var(--dsw-alias-border-l2);\n border-radius: var(--dsw-radius-md);\n background: none;\n font: inherit;\n font-size: 12px;\n line-height: 18px;\n color: var(--dsw-alias-label-secondary);\n cursor: pointer;\n}\n\n._711248a9_outlineButton:hover:not(:disabled) {\n color: var(--dsw-alias-label-primary);\n border-color: var(--dsw-alias-label-dimmed);\n}\n\n._711248a9_outlineButton:disabled {\n opacity: 0.4;\n cursor: default;\n}\n\n._711248a9_outlineButton:focus-visible {\n outline: 2px solid var(--dsw-alias-brand-primary);\n outline-offset: 1px;\n}\n\n\n._28202c90_addButton {\n align-self: flex-start;\n}\n\n\n._28237b53_chainBlock > ._28202c90_addButton {\n box-sizing: border-box;\n align-self: flex-start;\n height: 26px;\n padding: 0 8px;\n border: 1px solid transparent;\n gap: 4px;\n font-size: 12px;\n line-height: 18px;\n color: var(--dsw-alias-label-secondary);\n}\n\n._28237b53_chainBlock > ._28202c90_addButton:hover:not(:disabled) {\n border-color: transparent;\n background: var(--dsw-alias-interactive-bg-hover);\n color: var(--dsw-alias-label-primary);\n}\n\n\n._28237b53_chainBlock > ._28202c90_addButton:focus-visible {\n outline: none;\n box-shadow: 0 0 0 2px var(--dsw-alias-border-l3);\n}\n\n\n._6a2bd54c_slotAddRow {\n display: flex;\n align-items: center;\n gap: 8px;\n margin-top: 4px;\n flex-wrap: wrap;\n}\n\n\n._4e77523e_rowActions {\n display: flex;\n align-items: center;\n gap: 4px;\n}\n\n\n._f0864181_discard,\n._ccff7e48_save {\n appearance: none;\n border: 1px solid transparent;\n border-radius: var(--dsw-radius-md);\n padding: 5px 14px;\n font: inherit;\n font-size: 13px;\n line-height: 1.5;\n cursor: pointer;\n}\n\n._f0864181_discard {\n border-color: var(--dsw-alias-border-l2);\n background: none;\n color: var(--dsw-alias-label-secondary);\n}\n\n._f0864181_discard:hover:not(:disabled) {\n color: var(--dsw-alias-label-primary);\n border-color: var(--dsw-alias-label-dimmed);\n}\n\n._ccff7e48_save {\n background: var(--dsw-alias-label-primary);\n color: var(--dsw-alias-bg-layer-3);\n}\n\n._f0864181_discard:disabled,\n._ccff7e48_save:disabled {\n opacity: 0.4;\n cursor: default;\n}\n\n._f0864181_discard:focus-visible,\n._ccff7e48_save:focus-visible {\n outline: 2px solid var(--dsw-alias-brand-primary);\n outline-offset: 1px;\n}\n\n\n._fbd045e0_statusBlock {\n display: flex;\n flex-direction: column;\n gap: 12px;\n padding: 12px 14px;\n margin-top: 12px;\n border: 1px solid var(--dsw-alias-border-l2);\n border-radius: 12px;\n}\n\n._d4f70367_statusTitle {\n font-size: 12px;\n line-height: 18px;\n font-weight: 500;\n color: var(--dsw-alias-label-secondary);\n}\n\n\n._8ab300ed_statusLine {\n margin: 0;\n font-size: 12px;\n line-height: 18px;\n color: var(--dsw-alias-label-secondary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n._e8cedbf5_statusLineLabel {\n font-weight: 500;\n color: var(--dsw-alias-label-secondary);\n}\n\n\n._700006c9_policyStatus {\n margin: 12px 0 0;\n padding: 10px 12px;\n border-radius: 8px;\n background: var(--dsw-alias-bg-module-platform);\n display: flex;\n flex-direction: column;\n gap: 6px;\n}\n\n\n._aa3fae4a_policyStatusText {\n display: flex;\n flex-direction: column;\n gap: 6px;\n}\n\n._d90f6286_policyStatusSync {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: 6px;\n}\n\n\n._579f87fb_policyStatusLive:empty {\n position: absolute;\n width: 1px;\n height: 1px;\n overflow: hidden;\n clip-path: inset(50%);\n white-space: nowrap;\n}\n\n._d4b67a81_policyStatusLabel {\n font-size: 12px;\n font-weight: 600;\n line-height: 18px;\n color: var(--dsw-alias-label-secondary);\n}\n\n._278bb4b3_policyStatusLine {\n font-size: 12px;\n line-height: 18px;\n color: var(--dsw-alias-label-primary);\n}\n\n._da6387e5_policyStatusWarn {\n font-size: 12px;\n line-height: 18px;\n color: var(--dsw-alias-state-warn-primary);\n}\n\n@media (prefers-reduced-motion: reduce) {\n ._70effa64_iconButton::after,\n ._a6244318_infoHint::after {\n transition: none;\n }\n\n ._631094a0_chevron {\n transition: none;\n }\n}\n";
1792
1771
  const tagId$3 = "dsh-llm-fallbacks/FallbacksCard.module.css";
1793
1772
  if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId$3) + "]") === null) {
1794
1773
  const tag = document.createElement("style");
@@ -1813,18 +1792,14 @@ window.__ModuleLoader__.load({
1813
1792
  "sectionToggle": "_b116c758_sectionToggle",
1814
1793
  "advancedBody": "_80101203_advancedBody",
1815
1794
  "field": "_67826267_field",
1816
- "checkboxRow": "_9998065c_checkboxRow",
1817
1795
  "numberFields": "_3e95886d_numberFields",
1818
- "checkbox": "_06389b18_checkbox",
1819
1796
  "fieldLabel": "_13e68c3f_fieldLabel",
1820
1797
  "hint": "_4bc809b8_hint",
1821
- "checkLabel": "_02c2f6df_checkLabel",
1822
- "checkLabelTitle": "_f2d47237_checkLabelTitle",
1823
- "checkLabelDesc": "_c1bed8ea_checkLabelDesc",
1824
1798
  "slotPresetName": "_b1962759_slotPresetName",
1825
1799
  "infoHint": "_a6244318_infoHint",
1826
1800
  "infoHintDisabled": "_e655c840_infoHintDisabled",
1827
1801
  "optionRow": "_a2521bb0_optionRow",
1802
+ "checkbox": "_06389b18_checkbox",
1828
1803
  "dayRow": "_c4ecbdf3_dayRow",
1829
1804
  "dayCell": "_0330c1ed_dayCell",
1830
1805
  "input": "_f9d86f7b_input",
@@ -2147,8 +2122,6 @@ window.__ModuleLoader__.load({
2147
2122
  cooldownMs: config.cooldownMs,
2148
2123
  revertPolicy: config.revertPolicy,
2149
2124
  maxSwitchesPerStep: config.maxSwitchesPerStep,
2150
- alwaysModeRetryCap: config.alwaysModeRetryCap,
2151
- roleAutoMatch: config.roleAutoMatch,
2152
2125
  tz: config.tz ?? "Asia/Shanghai"
2153
2126
  };
2154
2127
  }
@@ -2161,12 +2134,6 @@ window.__ModuleLoader__.load({
2161
2134
  * the top level: no presets UI this iteration (R-001 re-defer), so the
2162
2135
  * draft carries the accepted value through untouched — a clean draft stays
2163
2136
  * equal to the accepted config and a save never drops the key.
2164
- * `roleAutoMatch` follows the same rule (config-model mirror of `presets`):
2165
- * the draft carries the scalar's value through untouched. The scalar is
2166
- * ALWAYS defined — the gateway composition resolves the schema default
2167
- * `true` even for a legacy config that never declared the key — so the
2168
- * toggle always renders (default on) and a save persists the resolved value
2169
- * (AC-7 re-scope, PM decision 2026-08-17 Option A).
2170
2137
  *
2171
2138
  * All-day: rootChain is composed from the 默认降级链 editor's leading
2172
2139
  * selectors plus the 默认模型 tail (exactly one official model — Flash or
@@ -2175,7 +2142,7 @@ window.__ModuleLoader__.load({
2175
2142
  * is a card scalar: preset rows lock it to Asia/Shanghai; custom rows
2176
2143
  * follow the selected timezone.
2177
2144
  */
2178
- function assembleConfig(scalars, allDayModel, acceptedRootChain, allDayChainRow, roleRows, ruleRows, originalRoles, presets, roleAutoMatch, timeSlotRows) {
2145
+ function assembleConfig(scalars, allDayModel, acceptedRootChain, allDayChainRow, roleRows, ruleRows, originalRoles, presets, timeSlotRows) {
2179
2146
  const list = mergeRoleExtras(roleRows, originalRoles);
2180
2147
  const trailingChain = rowsToRootChain([allDayChainRow]);
2181
2148
  const tz = resolvedSlotTz(timeSlotRows, scalars.tz);
@@ -2189,9 +2156,7 @@ window.__ModuleLoader__.load({
2189
2156
  cooldownMs: scalars.cooldownMs,
2190
2157
  revertPolicy: scalars.revertPolicy,
2191
2158
  maxSwitchesPerStep: scalars.maxSwitchesPerStep,
2192
- alwaysModeRetryCap: scalars.alwaysModeRetryCap,
2193
2159
  ...presets === void 0 ? {} : { presets },
2194
- roleAutoMatch,
2195
2160
  timeSlots: rowsToTimeSlots(timeSlotRows),
2196
2161
  tz
2197
2162
  };
@@ -2222,7 +2187,7 @@ window.__ModuleLoader__.load({
2222
2187
  * rootChain and role chains. Returns one localized message per violation,
2223
2188
  * bucketed by the section that owns the offending field (主代理: allDay /
2224
2189
  * timeSlots / slot* / tz / default model / default chain; 子代理: role* /
2225
- * rule*; 高级选项: trigger / cooldown / revert / always / roleAutoMatch —
2190
+ * rule*; 高级选项: trigger / cooldown / revert —
2226
2191
  * the scalars are never validated, so the advanced bucket stays empty
2227
2192
  * today). A non-empty bucket blocks THAT section's Save write only
2228
2193
  * (per-section saves, plan fallbacks-card-section-ux) — a sibling section
@@ -2712,7 +2677,7 @@ window.__ModuleLoader__.load({
2712
2677
  const [lastSaveSection, setLastSaveSection] = (0, react.useState)(null);
2713
2678
  const [advancedOpen, setAdvancedOpen] = (0, react.useState)(false);
2714
2679
  const seededConfigKey = (0, react.useRef)(null);
2715
- const draft = assembleConfig(scalars, allDayModel, state.config.rootChain, allDayChainRow, roleRows, ruleRows, state.config.roles.list, state.config.presets, scalars.roleAutoMatch, timeSlotRows);
2680
+ const draft = assembleConfig(scalars, allDayModel, state.config.rootChain, allDayChainRow, roleRows, ruleRows, state.config.roles.list, state.config.presets, timeSlotRows);
2716
2681
  const hasEmptyRuleRows = ruleRows.some((row) => row.role === "");
2717
2682
  const mainDirty = JSON.stringify([...draft.rootChain, draft.timeSlots]) !== JSON.stringify([...state.config.rootChain, state.config.timeSlots ?? []]);
2718
2683
  const subDirty = hasEmptyRuleRows || JSON.stringify(draft.roles) !== JSON.stringify(state.config.roles);
@@ -2720,16 +2685,12 @@ window.__ModuleLoader__.load({
2720
2685
  draft.triggerCodes,
2721
2686
  draft.cooldownMs,
2722
2687
  draft.revertPolicy,
2723
- draft.maxSwitchesPerStep,
2724
- draft.alwaysModeRetryCap,
2725
- draft.roleAutoMatch
2688
+ draft.maxSwitchesPerStep
2726
2689
  ]) !== JSON.stringify([
2727
2690
  state.config.triggerCodes,
2728
2691
  state.config.cooldownMs,
2729
2692
  state.config.revertPolicy,
2730
- state.config.maxSwitchesPerStep,
2731
- state.config.alwaysModeRetryCap,
2732
- state.config.roleAutoMatch
2693
+ state.config.maxSwitchesPerStep
2733
2694
  ]);
2734
2695
  const enabledPolicy = state.subagentPolicy?.state === "enabled" ? state.subagentPolicy : void 0;
2735
2696
  const allowedModels = enabledPolicy?.allowedModels;
@@ -2771,9 +2732,7 @@ window.__ModuleLoader__.load({
2771
2732
  triggerCodes: [...state.config.triggerCodes],
2772
2733
  cooldownMs: state.config.cooldownMs,
2773
2734
  revertPolicy: state.config.revertPolicy,
2774
- maxSwitchesPerStep: state.config.maxSwitchesPerStep,
2775
- alwaysModeRetryCap: state.config.alwaysModeRetryCap,
2776
- roleAutoMatch: state.config.roleAutoMatch
2735
+ maxSwitchesPerStep: state.config.maxSwitchesPerStep
2777
2736
  }));
2778
2737
  }, [
2779
2738
  state.status,
@@ -2994,7 +2953,6 @@ window.__ModuleLoader__.load({
2994
2953
  const advancedVisible = advancedOpen || !writable;
2995
2954
  const cooldownMsTip = `${t("cooldownMs.tooltip")} ${t("defaults.prefix")}: ${defaultFallbacksConfig.cooldownMs}`;
2996
2955
  const maxSwitchesPerStepTip = `${t("maxSwitchesPerStep.tooltip")} ${t("defaults.prefix")}: ${defaultFallbacksConfig.maxSwitchesPerStep}`;
2997
- const alwaysModeRetryCapTip = `${t("alwaysModeRetryCap.tooltip")} ${t("defaults.prefix")}: ${defaultFallbacksConfig.alwaysModeRetryCap}`;
2998
2956
  const unknownCodes = scalars.triggerCodes.filter((code) => !KNOWN_TRIGGER_CODES.includes(code));
2999
2957
  const presetsPresent = timeSlotRows.some((row) => row.kind === "preset");
3000
2958
  const glmConfigured = state.configuredProviders.some((entry) => entry.provider === "zai-coding-cn");
@@ -3075,9 +3033,7 @@ window.__ModuleLoader__.load({
3075
3033
  triggerCodes: draft.triggerCodes,
3076
3034
  cooldownMs: draft.cooldownMs,
3077
3035
  revertPolicy: draft.revertPolicy,
3078
- maxSwitchesPerStep: draft.maxSwitchesPerStep,
3079
- alwaysModeRetryCap: draft.alwaysModeRetryCap,
3080
- roleAutoMatch: draft.roleAutoMatch
3036
+ maxSwitchesPerStep: draft.maxSwitchesPerStep
3081
3037
  };
3082
3038
  }
3083
3039
  };
@@ -3107,9 +3063,7 @@ window.__ModuleLoader__.load({
3107
3063
  triggerCodes: [...state.config.triggerCodes],
3108
3064
  cooldownMs: state.config.cooldownMs,
3109
3065
  revertPolicy: state.config.revertPolicy,
3110
- maxSwitchesPerStep: state.config.maxSwitchesPerStep,
3111
- alwaysModeRetryCap: state.config.alwaysModeRetryCap,
3112
- roleAutoMatch: state.config.roleAutoMatch
3066
+ maxSwitchesPerStep: state.config.maxSwitchesPerStep
3113
3067
  }));
3114
3068
  }
3115
3069
  };
@@ -3127,6 +3081,10 @@ window.__ModuleLoader__.load({
3127
3081
  role: "status",
3128
3082
  children: t("legacy.banner", { keys: state.legacyKeys.join(", ") })
3129
3083
  }),
3084
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
3085
+ className: FallbacksCard_module_css_default.notice,
3086
+ children: t("virtualOnly.rule")
3087
+ }),
3130
3088
  state.status === "error" && state.error !== null && lastSaveSection === null && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
3131
3089
  className: FallbacksCard_module_css_default.noticeRow,
3132
3090
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
@@ -4171,37 +4129,6 @@ window.__ModuleLoader__.load({
4171
4129
  role: "alert",
4172
4130
  children: t("error.generic", { message: state.error })
4173
4131
  }),
4174
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
4175
- className: FallbacksCard_module_css_default.checkboxRow,
4176
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
4177
- id: "fallbacks-role-automatch",
4178
- type: "checkbox",
4179
- className: FallbacksCard_module_css_default.checkbox,
4180
- checked: scalars.roleAutoMatch,
4181
- disabled: !writable,
4182
- onChange: (event) => {
4183
- updateScalars((draft) => {
4184
- draft.roleAutoMatch = event.target.checked;
4185
- });
4186
- }
4187
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
4188
- className: FallbacksCard_module_css_default.checkLabel,
4189
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
4190
- className: FallbacksCard_module_css_default.checkLabelTitle,
4191
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("label", {
4192
- htmlFor: "fallbacks-role-automatch",
4193
- children: t("roleAutoMatch.label")
4194
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(InfoHint, {
4195
- label: t("roleAutoMatch.tooltip"),
4196
- disabled: !writable
4197
- })]
4198
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("label", {
4199
- className: FallbacksCard_module_css_default.checkLabelDesc,
4200
- htmlFor: "fallbacks-role-automatch",
4201
- children: t("roleAutoMatch.hint")
4202
- })]
4203
- })]
4204
- }),
4205
4132
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
4206
4133
  className: FallbacksCard_module_css_default.field,
4207
4134
  role: "group",
@@ -4275,104 +4202,69 @@ window.__ModuleLoader__.load({
4275
4202
  }),
4276
4203
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
4277
4204
  className: FallbacksCard_module_css_default.numberFields,
4278
- children: [
4279
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
4280
- className: FallbacksCard_module_css_default.field,
4281
- children: [
4282
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
4283
- className: FallbacksCard_module_css_default.fieldLabel,
4284
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("label", {
4285
- htmlFor: "fallbacks-cooldown-ms",
4286
- children: t("cooldownMs.label")
4287
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(InfoHint, {
4288
- label: cooldownMsTip,
4289
- disabled: !writable
4290
- })]
4291
- }),
4292
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
4293
- id: "fallbacks-cooldown-ms",
4294
- className: FallbacksCard_module_css_default.input,
4295
- type: "number",
4296
- min: 0,
4297
- value: String(scalars.cooldownMs),
4298
- disabled: !writable,
4299
- onChange: (event) => {
4300
- updateScalars((draft) => {
4301
- draft.cooldownMs = parseCount(event.target.value);
4302
- });
4303
- }
4304
- }),
4305
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
4306
- className: FallbacksCard_module_css_default.hint,
4307
- children: t("cooldownMs.hint")
4308
- })
4309
- ]
4310
- }),
4311
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
4312
- className: FallbacksCard_module_css_default.field,
4313
- children: [
4314
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
4315
- className: FallbacksCard_module_css_default.fieldLabel,
4316
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("label", {
4317
- htmlFor: "fallbacks-max-switches",
4318
- children: t("maxSwitchesPerStep.label")
4319
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(InfoHint, {
4320
- label: maxSwitchesPerStepTip,
4321
- disabled: !writable
4322
- })]
4323
- }),
4324
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
4325
- id: "fallbacks-max-switches",
4326
- className: FallbacksCard_module_css_default.input,
4327
- type: "number",
4328
- min: 0,
4329
- value: String(scalars.maxSwitchesPerStep),
4330
- disabled: !writable,
4331
- onChange: (event) => {
4332
- updateScalars((draft) => {
4333
- draft.maxSwitchesPerStep = parseCount(event.target.value);
4334
- });
4335
- }
4336
- }),
4337
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
4338
- className: FallbacksCard_module_css_default.hint,
4339
- children: t("maxSwitchesPerStep.hint")
4340
- })
4341
- ]
4342
- }),
4343
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
4344
- className: FallbacksCard_module_css_default.field,
4345
- children: [
4346
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
4347
- className: FallbacksCard_module_css_default.fieldLabel,
4348
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("label", {
4349
- htmlFor: "fallbacks-always-cap",
4350
- children: t("alwaysModeRetryCap.label")
4351
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(InfoHint, {
4352
- label: alwaysModeRetryCapTip,
4353
- disabled: !writable
4354
- })]
4355
- }),
4356
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
4357
- id: "fallbacks-always-cap",
4358
- className: FallbacksCard_module_css_default.input,
4359
- type: "number",
4360
- min: 0,
4361
- value: String(scalars.alwaysModeRetryCap),
4362
- disabled: !writable,
4363
- onChange: (event) => {
4364
- updateScalars((draft) => {
4365
- draft.alwaysModeRetryCap = parseCount(event.target.value);
4366
- });
4367
- }
4368
- }),
4369
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
4370
- className: FallbacksCard_module_css_default.hint,
4371
- children: t("alwaysModeRetryCap.hint")
4372
- })
4373
- ]
4374
- })
4375
- ]
4205
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
4206
+ className: FallbacksCard_module_css_default.field,
4207
+ children: [
4208
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
4209
+ className: FallbacksCard_module_css_default.fieldLabel,
4210
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("label", {
4211
+ htmlFor: "fallbacks-cooldown-ms",
4212
+ children: t("cooldownMs.label")
4213
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(InfoHint, {
4214
+ label: cooldownMsTip,
4215
+ disabled: !writable
4216
+ })]
4217
+ }),
4218
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
4219
+ id: "fallbacks-cooldown-ms",
4220
+ className: FallbacksCard_module_css_default.input,
4221
+ type: "number",
4222
+ min: 0,
4223
+ value: String(scalars.cooldownMs),
4224
+ disabled: !writable,
4225
+ onChange: (event) => {
4226
+ updateScalars((draft) => {
4227
+ draft.cooldownMs = parseCount(event.target.value);
4228
+ });
4229
+ }
4230
+ }),
4231
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
4232
+ className: FallbacksCard_module_css_default.hint,
4233
+ children: t("cooldownMs.hint")
4234
+ })
4235
+ ]
4236
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
4237
+ className: FallbacksCard_module_css_default.field,
4238
+ children: [
4239
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
4240
+ className: FallbacksCard_module_css_default.fieldLabel,
4241
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("label", {
4242
+ htmlFor: "fallbacks-max-switches",
4243
+ children: t("maxSwitchesPerStep.label")
4244
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(InfoHint, {
4245
+ label: maxSwitchesPerStepTip,
4246
+ disabled: !writable
4247
+ })]
4248
+ }),
4249
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
4250
+ id: "fallbacks-max-switches",
4251
+ className: FallbacksCard_module_css_default.input,
4252
+ type: "number",
4253
+ min: 0,
4254
+ value: String(scalars.maxSwitchesPerStep),
4255
+ disabled: !writable,
4256
+ onChange: (event) => {
4257
+ updateScalars((draft) => {
4258
+ draft.maxSwitchesPerStep = parseCount(event.target.value);
4259
+ });
4260
+ }
4261
+ }),
4262
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
4263
+ className: FallbacksCard_module_css_default.hint,
4264
+ children: t("maxSwitchesPerStep.hint")
4265
+ })
4266
+ ]
4267
+ })]
4376
4268
  }),
4377
4269
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
4378
4270
  className: FallbacksCard_module_css_default.sectionActions,
@@ -22,15 +22,10 @@ export declare const zh: {
22
22
  'maxSwitchesPerStep.label': string;
23
23
  'maxSwitchesPerStep.hint': string;
24
24
  'maxSwitchesPerStep.tooltip': string;
25
- 'alwaysModeRetryCap.label': string;
26
- 'alwaysModeRetryCap.hint': string;
27
- 'alwaysModeRetryCap.tooltip': string;
25
+ 'virtualOnly.rule': string;
28
26
  'advanced.label': string;
29
27
  'advanced.expand': string;
30
28
  'advanced.collapse': string;
31
- 'roleAutoMatch.label': string;
32
- 'roleAutoMatch.hint': string;
33
- 'roleAutoMatch.tooltip': string;
34
29
  'rootChain.label': string;
35
30
  'rootChain.tooltip': string;
36
31
  'defaultModel.label': string;
@@ -220,15 +215,10 @@ export declare const en: {
220
215
  'maxSwitchesPerStep.label': string;
221
216
  'maxSwitchesPerStep.hint': string;
222
217
  'maxSwitchesPerStep.tooltip': string;
223
- 'alwaysModeRetryCap.label': string;
224
- 'alwaysModeRetryCap.hint': string;
225
- 'alwaysModeRetryCap.tooltip': string;
218
+ 'virtualOnly.rule': string;
226
219
  'advanced.label': string;
227
220
  'advanced.expand': string;
228
221
  'advanced.collapse': string;
229
- 'roleAutoMatch.label': string;
230
- 'roleAutoMatch.hint': string;
231
- 'roleAutoMatch.tooltip': string;
232
222
  'rootChain.label': string;
233
223
  'rootChain.tooltip': string;
234
224
  'defaultModel.label': string;
@@ -140,10 +140,7 @@ export interface FallbacksConfigSummary {
140
140
  readonly cooldownMs: number;
141
141
  readonly revertPolicy: string;
142
142
  readonly maxSwitchesPerStep: number;
143
- readonly alwaysModeRetryCap: number;
144
143
  readonly presets: 'bundled' | 'none';
145
- /** Dispatch-time LLM role auto-match switch (default true). */
146
- readonly roleAutoMatch: boolean;
147
144
  }
148
145
  /**
149
146
  * The session-scoped read-only operations the `/fallbacks` handler drives.
@@ -220,10 +217,8 @@ export declare const FALLBACKS_COMMAND_LOCALES: {
220
217
  readonly configRules: "角色规则";
221
218
  readonly configCooldown: "冷却";
222
219
  readonly configRevert: "回主策略";
223
- readonly configMaxSwitches: "单步最大切换";
224
- readonly configAlwaysCap: "always 上限";
220
+ readonly configMaxSwitches: "单次请求行走最大切换";
225
221
  readonly configPresets: "预置";
226
- readonly configRoleAutoMatch: "角色自动匹配";
227
222
  readonly configEdit: "编辑:/settings(TUI 设置界面)或 ~/.dsh/profiles/<profile>/cordis.patch.yml(插件行)/ $DSH_HOME/settings.yaml(fallbacks: 分节)";
228
223
  readonly configEditHint: "TUI 通过 /settings 修改配置;文件编辑仍然可用";
229
224
  readonly revertSeedOk: "角色 {id} 已还原为 Seed 默认";
@@ -275,10 +270,8 @@ export declare const FALLBACKS_COMMAND_LOCALES: {
275
270
  readonly configRules: "Rules";
276
271
  readonly configCooldown: "Cooldown";
277
272
  readonly configRevert: "Revert";
278
- readonly configMaxSwitches: "Max switches/step";
279
- readonly configAlwaysCap: "Always-mode cap";
273
+ readonly configMaxSwitches: "Max switches per request walk";
280
274
  readonly configPresets: "Presets";
281
- readonly configRoleAutoMatch: "Auto-match";
282
275
  readonly configEdit: "Edit: /settings (TUI settings screen) or ~/.dsh/profiles/<profile>/cordis.patch.yml (plugin row) / $DSH_HOME/settings.yaml (fallbacks: section)";
283
276
  readonly configEditHint: "TUI edits config via /settings; file editing still works";
284
277
  readonly revertSeedOk: "role {id} reverted to its seed default";
@@ -328,7 +321,7 @@ export declare function recentFallbacksSwitches(events: readonly unknown[], limi
328
321
  * role resolve to `rootChain`. `inherit: true` marks the append-not-replace
329
322
  * tail — the role's `fallback` is `'inherit-root'` (the default) or the role
330
323
  * is unknown/built-in `'inherit'`, and `rootChain` is non-empty. Mirrors
331
- * `resolveChainViews`'s concatenation (see {@link buildRoleEntries} —
324
+ * `resolveChainViews`'s concatenation (see {@link roleChainEntries} —
332
325
  * `src/chains.ts`; the diagnostic keeps its display semantics: the role's
333
326
  * own chain renders in full, `rootChain` only when the role has no own
334
327
  * chain, with the inherit tail as an annotation) without a failing model to