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.
- package/README.md +14 -10
- package/README.zh-CN.md +14 -10
- package/dist/chain-walk.d.ts +211 -0
- package/dist/chains.d.ts +28 -6
- package/dist/client/index.js +86 -194
- package/dist/client/locales.d.ts +2 -12
- package/dist/commands.d.ts +3 -10
- package/dist/config.d.ts +4 -16
- package/dist/cooldown.d.ts +1 -15
- package/dist/events.d.ts +8 -8
- package/dist/gateway.d.ts +5 -3
- package/dist/index.d.ts +19 -40
- package/dist/index.js +685 -875
- package/dist/role-resolution.d.ts +12 -51
- package/dist/roles.d.ts +3 -4
- package/dist/state.d.ts +18 -102
- package/dist/subagent-policy.d.ts +22 -8
- package/dist/subagents-seam.d.ts +70 -11
- package/dist/tui-settings.d.ts +4 -2
- package/dist/virtual-adapter.d.ts +42 -46
- package/docs/DETAIL.md +1 -0
- package/docs/DETAIL.zh.md +1 -0
- package/docs/preview.svg +47 -0
- package/docs/preview.zh.svg +47 -0
- package/locale/en.json +2 -1
- package/locale/zh.json +2 -1
- package/package.json +29 -25
- package/dist/authorized-route.d.ts +0 -68
- package/dist/automatch.d.ts +0 -98
- package/dist/override.d.ts +0 -39
package/dist/client/index.js
CHANGED
|
@@ -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
|
|
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
|
-
"
|
|
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
|
|
1561
|
+
"maxSwitchesPerStep.label": "Max switches per request walk",
|
|
1578
1562
|
"maxSwitchesPerStep.hint": "Stops switching beyond the cap",
|
|
1579
|
-
"maxSwitchesPerStep.tooltip": "Beyond this
|
|
1580
|
-
"
|
|
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-
|
|
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,
|
|
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
|
|
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,
|
|
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
|
-
|
|
4280
|
-
|
|
4281
|
-
|
|
4282
|
-
|
|
4283
|
-
|
|
4284
|
-
|
|
4285
|
-
|
|
4286
|
-
|
|
4287
|
-
|
|
4288
|
-
|
|
4289
|
-
|
|
4290
|
-
|
|
4291
|
-
|
|
4292
|
-
|
|
4293
|
-
|
|
4294
|
-
|
|
4295
|
-
|
|
4296
|
-
|
|
4297
|
-
|
|
4298
|
-
|
|
4299
|
-
|
|
4300
|
-
|
|
4301
|
-
|
|
4302
|
-
|
|
4303
|
-
|
|
4304
|
-
|
|
4305
|
-
|
|
4306
|
-
|
|
4307
|
-
|
|
4308
|
-
|
|
4309
|
-
|
|
4310
|
-
|
|
4311
|
-
|
|
4312
|
-
|
|
4313
|
-
|
|
4314
|
-
/* @__PURE__ */ (0, react_jsx_runtime.
|
|
4315
|
-
|
|
4316
|
-
children:
|
|
4317
|
-
|
|
4318
|
-
|
|
4319
|
-
|
|
4320
|
-
|
|
4321
|
-
|
|
4322
|
-
|
|
4323
|
-
|
|
4324
|
-
|
|
4325
|
-
|
|
4326
|
-
|
|
4327
|
-
|
|
4328
|
-
|
|
4329
|
-
|
|
4330
|
-
|
|
4331
|
-
|
|
4332
|
-
|
|
4333
|
-
|
|
4334
|
-
|
|
4335
|
-
|
|
4336
|
-
|
|
4337
|
-
|
|
4338
|
-
|
|
4339
|
-
|
|
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,
|
package/dist/client/locales.d.ts
CHANGED
|
@@ -22,15 +22,10 @@ export declare const zh: {
|
|
|
22
22
|
'maxSwitchesPerStep.label': string;
|
|
23
23
|
'maxSwitchesPerStep.hint': string;
|
|
24
24
|
'maxSwitchesPerStep.tooltip': string;
|
|
25
|
-
'
|
|
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
|
-
'
|
|
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;
|
package/dist/commands.d.ts
CHANGED
|
@@ -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
|
|
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
|
|
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
|