dsh-llm-fallbacks 0.6.6 → 0.6.8

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.
@@ -1365,7 +1365,9 @@ window.__ModuleLoader__.load({
1365
1365
  "rootChain.label": "默认降级链",
1366
1366
  "rootChain.tooltip": "未命中任何分时槽时先走这条降级链;全部失败后落到下面的默认模型。",
1367
1367
  "defaultModel.label": "默认模型",
1368
- "chains.selector.remove": "删除该选择器",
1368
+ "chains.selector.remove": "删除第 {index} 个选择器",
1369
+ "chains.selector.providerAria": "第 {index} 个选择器的 provider",
1370
+ "chains.selector.modelAria": "第 {index} 个选择器的 model",
1369
1371
  "chains.selector.providerPlaceholder": "选择 provider",
1370
1372
  "chains.selector.modelPlaceholder": "选择 model",
1371
1373
  "chains.selector.wildcardLegacy": "该条目为通配(provider/*):选择具体模型后将转为精确条目",
@@ -1552,7 +1554,9 @@ window.__ModuleLoader__.load({
1552
1554
  "rootChain.label": "Default fallback chain",
1553
1555
  "rootChain.tooltip": "Walked first whenever no time slot matches; if every entry fails, the default model below is the last fallback.",
1554
1556
  "defaultModel.label": "Default model",
1555
- "chains.selector.remove": "Remove this selector",
1557
+ "chains.selector.remove": "Remove selector {index}",
1558
+ "chains.selector.providerAria": "Selector {index} provider",
1559
+ "chains.selector.modelAria": "Selector {index} model",
1556
1560
  "chains.selector.providerPlaceholder": "Select provider",
1557
1561
  "chains.selector.modelPlaceholder": "Select model",
1558
1562
  "chains.selector.wildcardLegacy": "This entry is a wildcard (provider/*): picking a model converts it to an exact entry",
@@ -1742,7 +1746,7 @@ window.__ModuleLoader__.load({
1742
1746
  }
1743
1747
  //#endregion
1744
1748
  //#region \0dsh-css:/home/runner/work/dsh-llm-fallbacks/dsh-llm-fallbacks/src/client/FallbacksCard.module.css.mjs
1745
- 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: none;\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._15a12620_chainSelectors {\n display: flex;\n flex-direction: column;\n gap: 10px;\n}\n\n._240cbbf8_selectorRow {\n display: flex;\n flex-direction: column;\n gap: 6px;\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._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._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";
1749
+ 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: none;\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._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._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";
1746
1750
  const tagId$3 = "dsh-llm-fallbacks/FallbacksCard.module.css";
1747
1751
  if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId$3) + "]") === null) {
1748
1752
  const tag = document.createElement("style");
@@ -1810,7 +1814,15 @@ window.__ModuleLoader__.load({
1810
1814
  "dragHandle": "_cd905ce5_dragHandle",
1811
1815
  "slotCardDragging": "_fee63b7e_slotCardDragging",
1812
1816
  "slotCardOver": "_6f108491_slotCardOver",
1817
+ "chainBlock": "_28237b53_chainBlock",
1813
1818
  "chainSelectors": "_15a12620_chainSelectors",
1819
+ "selectorLine": "_5694c1de_selectorLine",
1820
+ "selectorIndex": "_2f156f38_selectorIndex",
1821
+ "selectorProviderCell": "_4843ae21_selectorProviderCell",
1822
+ "selectorModelCell": "_df828181_selectorModelCell",
1823
+ "selectorHint": "_fe6d05a5_selectorHint",
1824
+ "selectorHintText": "_d04ee9fe_selectorHintText",
1825
+ "selectorRemove": "_ec7c2fac_selectorRemove",
1814
1826
  "selectorRow": "_240cbbf8_selectorRow",
1815
1827
  "iconButton": "_70effa64_iconButton",
1816
1828
  "iconButtonDanger": "_a0968257_iconButtonDanger",
@@ -2311,6 +2323,12 @@ window.__ModuleLoader__.load({
2311
2323
  }
2312
2324
  /**
2313
2325
  * One chain entry selector row: provider select + model select (cascade).
2326
+ * The row is ONE compact line (plan fallbacks-chain-row-compact T1): the
2327
+ * 1-based order index, the provider select, the model select, any row-level
2328
+ * hint (inline, so it never re-opens the row height) and the trailing remove
2329
+ * icon. The visible provider/model field labels are gone — the two selects
2330
+ * carry their accessible name on `aria-label` (the visible labels repeated on
2331
+ * every row and cost a whole line).
2314
2332
  * The GUI never offers a `provider/*` wildcard (root agent and role chains
2315
2333
  * alike; provider-any matching lives in the role rules) — but `provider/*`
2316
2334
  * stays a legal YAML entry, so a wildcard row read back from the server
@@ -2327,7 +2345,7 @@ window.__ModuleLoader__.load({
2327
2345
  * existing value is never hidden or dropped. New rows only offer configured
2328
2346
  * options.
2329
2347
  */
2330
- function ChainSelectorEditor({ selector, catalog, configuredProviders, disabled, t, onChange, onRemove }) {
2348
+ function ChainSelectorEditor({ selector, index, catalog, configuredProviders, disabled, t, onChange, onRemove }) {
2331
2349
  const providerRaw = selectionToRaw(selector.provider);
2332
2350
  const providerOutside = selector.provider?.kind === "outside";
2333
2351
  const providerUnconfigured = !providerOutside && providerRaw !== "" && (catalog?.providers.some((entry) => entry.provider === providerRaw) ?? false) && !configuredProviders.some((entry) => entry.provider === providerRaw);
@@ -2336,19 +2354,26 @@ window.__ModuleLoader__.load({
2336
2354
  const group = catalog?.groups.find((entry) => entry.id === providerRaw);
2337
2355
  const groupMissing = providerRaw !== "" && !providerOutside && group === void 0;
2338
2356
  const modelDisabled = disabled || providerRaw === "" || groupMissing || providerOutside && modelRaw === "";
2339
- return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
2357
+ const hintInstanceId = (0, react.useId)().replace(/:/g, "");
2358
+ const strictHintId = groupMissing ? `fallbacks-selector-hint-${index}-${hintInstanceId}` : void 0;
2359
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
2340
2360
  className: FallbacksCard_module_css_default.selectorRow,
2341
- children: [
2342
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
2343
- className: FallbacksCard_module_css_default.ruleGrid,
2344
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("label", {
2345
- className: FallbacksCard_module_css_default.ruleCell,
2346
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
2347
- className: FallbacksCard_module_css_default.ruleCellLabel,
2348
- children: t("roles.rule.provider")
2349
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("select", {
2361
+ "data-selector-row": "",
2362
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
2363
+ className: FallbacksCard_module_css_default.selectorLine,
2364
+ children: [
2365
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
2366
+ className: FallbacksCard_module_css_default.selectorIndex,
2367
+ "aria-hidden": "true",
2368
+ "data-selector-index": index,
2369
+ children: index
2370
+ }),
2371
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
2372
+ className: FallbacksCard_module_css_default.selectorProviderCell,
2373
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("select", {
2350
2374
  className: `${FallbacksCard_module_css_default.input} ${FallbacksCard_module_css_default.selectInput}`,
2351
2375
  value: providerRaw,
2376
+ "aria-label": t("chains.selector.providerAria", { index: String(index) }),
2352
2377
  disabled,
2353
2378
  onChange: (event) => {
2354
2379
  if (event.target.value === providerRaw) return;
@@ -2375,69 +2400,77 @@ window.__ModuleLoader__.load({
2375
2400
  children: `${providerRaw}${t("catalog.outside.short")}`
2376
2401
  })
2377
2402
  ]
2403
+ })
2404
+ }),
2405
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
2406
+ className: FallbacksCard_module_css_default.selectorModelCell,
2407
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("select", {
2408
+ className: `${FallbacksCard_module_css_default.input} ${FallbacksCard_module_css_default.selectInput}`,
2409
+ value: modelRaw,
2410
+ "aria-label": t("chains.selector.modelAria", { index: String(index) }),
2411
+ "aria-describedby": strictHintId,
2412
+ disabled: modelDisabled,
2413
+ onChange: (event) => {
2414
+ onChange({
2415
+ model: classifyModel(providerRaw, event.target.value, catalog),
2416
+ ...selector.wildcard ? { wildcard: false } : {}
2417
+ });
2418
+ },
2419
+ children: [
2420
+ modelRaw === "" && !providerOutside && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("option", {
2421
+ value: "",
2422
+ children: t("chains.selector.modelPlaceholder")
2423
+ }),
2424
+ (group?.models ?? []).map((model) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("option", {
2425
+ value: model.id,
2426
+ children: model.name
2427
+ }, model.id)),
2428
+ modelOutside && !selector.wildcard && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("option", {
2429
+ value: modelRaw,
2430
+ children: `${modelRaw}${t("catalog.outside.short")}`
2431
+ })
2432
+ ]
2433
+ })
2434
+ }),
2435
+ groupMissing && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
2436
+ className: FallbacksCard_module_css_default.selectorHint,
2437
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
2438
+ id: strictHintId,
2439
+ className: FallbacksCard_module_css_default.selectorHintText,
2440
+ title: t("chains.selector.noModelsStrict"),
2441
+ children: t("chains.selector.noModelsStrict")
2442
+ })
2443
+ }),
2444
+ (providerOutside || modelOutside) && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
2445
+ className: FallbacksCard_module_css_default.selectorHint,
2446
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
2447
+ className: FallbacksCard_module_css_default.selectorHintText,
2448
+ title: t("catalog.outside.hint"),
2449
+ children: t("catalog.outside.hint")
2450
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(InfoHint, {
2451
+ label: t("catalog.outside.tooltip"),
2452
+ disabled
2378
2453
  })]
2379
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("label", {
2380
- className: FallbacksCard_module_css_default.ruleCell,
2381
- children: [
2382
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
2383
- className: FallbacksCard_module_css_default.ruleCellLabel,
2384
- children: t("roles.rule.model")
2385
- }),
2386
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("select", {
2387
- className: `${FallbacksCard_module_css_default.input} ${FallbacksCard_module_css_default.selectInput}`,
2388
- value: modelRaw,
2389
- disabled: modelDisabled,
2390
- onChange: (event) => {
2391
- onChange({
2392
- model: classifyModel(providerRaw, event.target.value, catalog),
2393
- ...selector.wildcard ? { wildcard: false } : {}
2394
- });
2395
- },
2396
- children: [
2397
- modelRaw === "" && !providerOutside && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("option", {
2398
- value: "",
2399
- children: t("chains.selector.modelPlaceholder")
2400
- }),
2401
- (group?.models ?? []).map((model) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("option", {
2402
- value: model.id,
2403
- children: model.name
2404
- }, model.id)),
2405
- modelOutside && !selector.wildcard && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("option", {
2406
- value: modelRaw,
2407
- children: `${modelRaw}${t("catalog.outside.short")}`
2408
- })
2409
- ]
2410
- }),
2411
- groupMissing && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
2412
- className: FallbacksCard_module_css_default.hint,
2413
- children: t("chains.selector.noModelsStrict")
2414
- })
2415
- ]
2416
- })]
2417
- }),
2418
- (providerOutside || modelOutside) && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
2419
- className: FallbacksCard_module_css_default.hint,
2420
- children: [t("catalog.outside.hint"), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(InfoHint, {
2421
- label: t("catalog.outside.tooltip"),
2422
- disabled
2423
- })]
2424
- }),
2425
- selector.wildcard && !modelDisabled && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
2426
- className: FallbacksCard_module_css_default.hint,
2427
- children: t("chains.selector.wildcardLegacy")
2428
- }),
2429
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
2430
- className: FallbacksCard_module_css_default.cardFoot,
2431
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
2454
+ }),
2455
+ selector.wildcard && !modelDisabled && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
2456
+ className: FallbacksCard_module_css_default.selectorHint,
2457
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
2458
+ className: FallbacksCard_module_css_default.selectorHintText,
2459
+ title: t("chains.selector.wildcardLegacy"),
2460
+ children: t("chains.selector.wildcardLegacy")
2461
+ })
2462
+ }),
2463
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
2432
2464
  type: "button",
2433
- className: `${FallbacksCard_module_css_default.iconButton} ${FallbacksCard_module_css_default.iconButtonDanger}`,
2434
- "data-tip": t("chains.selector.remove"),
2435
- "aria-label": t("chains.selector.remove"),
2465
+ className: `${FallbacksCard_module_css_default.iconButton} ${FallbacksCard_module_css_default.iconButtonDanger} ${FallbacksCard_module_css_default.selectorRemove}`,
2466
+ "data-tip": t("chains.selector.remove", { index: String(index) }),
2467
+ "aria-label": t("chains.selector.remove", { index: String(index) }),
2468
+ disabled,
2436
2469
  onClick: onRemove,
2437
2470
  children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(TrashIcon, {})
2438
2471
  })
2439
- })
2440
- ]
2472
+ ]
2473
+ })
2441
2474
  });
2442
2475
  }
2443
2476
  /**
@@ -3137,30 +3170,34 @@ window.__ModuleLoader__.load({
3137
3170
  className: FallbacksCard_module_css_default.hint,
3138
3171
  children: t("validation.slotChainRequired")
3139
3172
  }),
3140
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
3141
- className: FallbacksCard_module_css_default.chainSelectors,
3142
- children: row.selectors.map((selector, selectorIndex) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ChainSelectorEditor, {
3143
- selector,
3144
- catalog: catalogOf(state),
3145
- configuredProviders: state.configuredProviders,
3173
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
3174
+ className: FallbacksCard_module_css_default.chainBlock,
3175
+ "data-chain-block": "",
3176
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
3177
+ className: FallbacksCard_module_css_default.chainSelectors,
3178
+ children: row.selectors.map((selector, selectorIndex) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ChainSelectorEditor, {
3179
+ index: selectorIndex + 1,
3180
+ selector,
3181
+ catalog: catalogOf(state),
3182
+ configuredProviders: state.configuredProviders,
3183
+ disabled: !writable,
3184
+ t,
3185
+ onChange: (patch) => {
3186
+ updateTimeSlotSelector(index, selectorIndex, patch);
3187
+ },
3188
+ onRemove: () => {
3189
+ removeTimeSlotSelector(index, selectorIndex);
3190
+ }
3191
+ }, selectorIndex))
3192
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
3193
+ type: "button",
3194
+ className: `${FallbacksCard_module_css_default.outlineButton} ${FallbacksCard_module_css_default.addButton}`,
3146
3195
  disabled: !writable,
3147
- t,
3148
- onChange: (patch) => {
3149
- updateTimeSlotSelector(index, selectorIndex, patch);
3196
+ onClick: () => {
3197
+ addTimeSlotSelector(index);
3150
3198
  },
3151
- onRemove: () => {
3152
- removeTimeSlotSelector(index, selectorIndex);
3153
- }
3154
- }, selectorIndex))
3155
- }),
3156
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
3157
- type: "button",
3158
- className: `${FallbacksCard_module_css_default.outlineButton} ${FallbacksCard_module_css_default.addButton}`,
3159
- disabled: !writable,
3160
- onClick: () => {
3161
- addTimeSlotSelector(index);
3162
- },
3163
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(PlusIcon, {}), t("timeSlots.selector.add")]
3199
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(PlusIcon, {}), t("timeSlots.selector.add")]
3200
+ })]
3164
3201
  }),
3165
3202
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
3166
3203
  className: FallbacksCard_module_css_default.cardFoot,
@@ -3276,30 +3313,35 @@ window.__ModuleLoader__.load({
3276
3313
  }),
3277
3314
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
3278
3315
  className: FallbacksCard_module_css_default.list,
3279
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
3316
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
3280
3317
  className: FallbacksCard_module_css_default.editorCard,
3281
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
3282
- className: FallbacksCard_module_css_default.chainSelectors,
3283
- children: allDayChainRow.selectors.map((selector, selectorIndex) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ChainSelectorEditor, {
3284
- selector,
3285
- catalog: catalogOf(state),
3286
- configuredProviders: state.configuredProviders,
3318
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
3319
+ className: FallbacksCard_module_css_default.chainBlock,
3320
+ "data-chain-block": "",
3321
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
3322
+ className: FallbacksCard_module_css_default.chainSelectors,
3323
+ children: allDayChainRow.selectors.map((selector, selectorIndex) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ChainSelectorEditor, {
3324
+ index: selectorIndex + 1,
3325
+ selector,
3326
+ catalog: catalogOf(state),
3327
+ configuredProviders: state.configuredProviders,
3328
+ disabled: !writable,
3329
+ t,
3330
+ onChange: (patch) => {
3331
+ updateAllDayChainSelector(selectorIndex, patch);
3332
+ },
3333
+ onRemove: () => {
3334
+ removeAllDayChainSelector(selectorIndex);
3335
+ }
3336
+ }, selectorIndex))
3337
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
3338
+ type: "button",
3339
+ className: `${FallbacksCard_module_css_default.outlineButton} ${FallbacksCard_module_css_default.addButton}`,
3287
3340
  disabled: !writable,
3288
- t,
3289
- onChange: (patch) => {
3290
- updateAllDayChainSelector(selectorIndex, patch);
3291
- },
3292
- onRemove: () => {
3293
- removeAllDayChainSelector(selectorIndex);
3294
- }
3295
- }, selectorIndex))
3296
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
3297
- type: "button",
3298
- className: `${FallbacksCard_module_css_default.outlineButton} ${FallbacksCard_module_css_default.addButton}`,
3299
- disabled: !writable,
3300
- onClick: addAllDayChainSelector,
3301
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(PlusIcon, {}), t("timeSlots.selector.add")]
3302
- })]
3341
+ onClick: addAllDayChainSelector,
3342
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(PlusIcon, {}), t("timeSlots.selector.add")]
3343
+ })]
3344
+ })
3303
3345
  })
3304
3346
  })
3305
3347
  ]
@@ -3546,22 +3588,35 @@ window.__ModuleLoader__.load({
3546
3588
  })
3547
3589
  }),
3548
3590
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
3549
- className: FallbacksCard_module_css_default.chainSelectors,
3550
- children: [row.selectors.map((selector, selectorIndex) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ChainSelectorEditor, {
3551
- selector,
3552
- catalog: catalogOf(state),
3553
- configuredProviders: state.configuredProviders,
3591
+ className: FallbacksCard_module_css_default.chainBlock,
3592
+ "data-chain-block": "",
3593
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
3594
+ className: FallbacksCard_module_css_default.chainSelectors,
3595
+ children: [row.selectors.map((selector, selectorIndex) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ChainSelectorEditor, {
3596
+ index: selectorIndex + 1,
3597
+ selector,
3598
+ catalog: catalogOf(state),
3599
+ configuredProviders: state.configuredProviders,
3600
+ disabled: !writable,
3601
+ t,
3602
+ onChange: (patch) => {
3603
+ updateRoleSelector(index, selectorIndex, patch);
3604
+ },
3605
+ onRemove: () => {
3606
+ removeRoleSelector(index, selectorIndex);
3607
+ }
3608
+ }, selectorIndex)), row.selectors.every((selector) => selectorRowToRaw(selector) === "") && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
3609
+ className: FallbacksCard_module_css_default.hint,
3610
+ children: seed !== void 0 ? t("roles.seedChainOptional", { id: row.id }) : t("validation.roleChainRequired", { id: row.id })
3611
+ })]
3612
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
3613
+ type: "button",
3614
+ className: `${FallbacksCard_module_css_default.outlineButton} ${FallbacksCard_module_css_default.addButton}`,
3554
3615
  disabled: !writable,
3555
- t,
3556
- onChange: (patch) => {
3557
- updateRoleSelector(index, selectorIndex, patch);
3616
+ onClick: () => {
3617
+ addRoleSelector(index);
3558
3618
  },
3559
- onRemove: () => {
3560
- removeRoleSelector(index, selectorIndex);
3561
- }
3562
- }, selectorIndex)), row.selectors.every((selector) => selectorRowToRaw(selector) === "") && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
3563
- className: FallbacksCard_module_css_default.hint,
3564
- children: seed !== void 0 ? t("roles.seedChainOptional", { id: row.id }) : t("validation.roleChainRequired", { id: row.id })
3619
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(PlusIcon, {}), t("roles.selector.add")]
3565
3620
  })]
3566
3621
  }),
3567
3622
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
@@ -3589,15 +3644,6 @@ window.__ModuleLoader__.load({
3589
3644
  })]
3590
3645
  })
3591
3646
  }),
3592
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
3593
- type: "button",
3594
- className: `${FallbacksCard_module_css_default.outlineButton} ${FallbacksCard_module_css_default.addButton}`,
3595
- disabled: !writable,
3596
- onClick: () => {
3597
- addRoleSelector(index);
3598
- },
3599
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(PlusIcon, {}), t("roles.selector.add")]
3600
- }),
3601
3647
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
3602
3648
  className: FallbacksCard_module_css_default.cardFoot,
3603
3649
  children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
@@ -35,6 +35,8 @@ export declare const zh: {
35
35
  'rootChain.tooltip': string;
36
36
  'defaultModel.label': string;
37
37
  'chains.selector.remove': string;
38
+ 'chains.selector.providerAria': string;
39
+ 'chains.selector.modelAria': string;
38
40
  'chains.selector.providerPlaceholder': string;
39
41
  'chains.selector.modelPlaceholder': string;
40
42
  'chains.selector.wildcardLegacy': string;
@@ -224,6 +226,8 @@ export declare const en: {
224
226
  'rootChain.tooltip': string;
225
227
  'defaultModel.label': string;
226
228
  'chains.selector.remove': string;
229
+ 'chains.selector.providerAria': string;
230
+ 'chains.selector.modelAria': string;
227
231
  'chains.selector.providerPlaceholder': string;
228
232
  'chains.selector.modelPlaceholder': string;
229
233
  'chains.selector.wildcardLegacy': string;
package/dist/index.d.ts CHANGED
@@ -57,10 +57,12 @@ export declare const provide: readonly ["llm-fallbacks"];
57
57
  * The named cordis service `ctx.get('llm-fallbacks')` exposes while the
58
58
  * plugin is applied: the pure-function library surface + `name`/`version`
59
59
  * metadata, plus the three ADDITIVE role-seed methods (spec §9.1, plan
60
- * fallbacks-role-seeds T2). Deliberately no state BEARING FIELDS (no
60
+ * fallbacks-role-seeds T2) and the ADDITIVE dispatch-role getter (plan
61
+ * agent-role-getter). Deliberately no state BEARING FIELDS (no
61
62
  * stateStore, no event emitters, no filter helpers) — the seed methods are
62
- * closures over the per-apply `FallbacksSeedManager`, so state stays behind
63
- * the closure and dies with the fiber (spec §9.5).
63
+ * closures over the per-apply `FallbacksSeedManager` and the getter is a
64
+ * closure over the fiber's own seam, so state stays behind the closures and
65
+ * dies with the fiber (spec §9.5).
64
66
  */
65
67
  export interface FallbacksService {
66
68
  /** Matches the plugin `name`. */
@@ -83,6 +85,23 @@ export interface FallbacksService {
83
85
  getEffectiveRoles(): EffectiveRolesReadback;
84
86
  /** (c) Revert one id to the CURRENT declared seed default. */
85
87
  revertSeededPersona(id: string): Promise<SeedRevertOutcome>;
88
+ /**
89
+ * (d) The dispatch role the seam resolved for a live agent, keyed by child
90
+ * session id (= `Agent.id`).
91
+ *
92
+ * Reads the seam's ROOT-shared per-child record, which the install writes at
93
+ * dispatch BEFORE the native activation call — so the role is readable
94
+ * before the child's first step and for the whole activation lifetime (the
95
+ * existing `agent/disposed` cleanup bounds it, unchanged). The durable
96
+ * surface stays the notice row / `fallbacksSubagentRole` projection; this is
97
+ * the immediate in-memory read over the same single record, with no write
98
+ * path of its own.
99
+ *
100
+ * @returns the DECLARED RAW role id, or `null` when the agent carries no
101
+ * resolved dispatch role (no header / undeclared / `inherit` /
102
+ * unknown id).
103
+ */
104
+ getAgentRole(agentId: string): string | null;
86
105
  }
87
106
  declare module '@deepseek-ai/cordis' {
88
107
  interface Context {
@@ -103,6 +122,7 @@ export { defaultFallbacksConfig, detectLegacyKeys, INHERIT_ROLE_ID, ROLE_ID_PATT
103
122
  export { parseSelector, SelectorError, type Selector, } from './selectors.ts';
104
123
  export { FallbacksSeedManager, type EffectiveRole, type EffectiveRolesReadback, type SeedConflict, type SeedDeclaration, type SeedDeclareOutcome, type SeedRevertFailReason, type SeedRevertOutcome, type SeedSkipReason, type SeedSource, type SeedsDeclareOptions, type SeedsIo, type SeedsWireStatus, } from './seeds.ts';
105
124
  export { presetRoles } from './presets.ts';
125
+ export { ROLE_PROJECTION_KEY, readRoleProjectionValue } from './role-projection-key.ts';
106
126
  /**
107
127
  * @internal Test seam (T3 review Minor 3): the per-agent fallback state store
108
128
  * of the plugin applied to `ctx` — last apply wins. Not part of the plugin's
package/dist/index.js CHANGED
@@ -697,6 +697,11 @@ async function resolveRoleAtDispatch(agent, rules, roleIds, opts) {
697
697
  const declared = roleIds.get(preset);
698
698
  if (declared !== void 0) return declared;
699
699
  }
700
+ const dispatch = opts.dispatchRole?.trim();
701
+ if (dispatch !== void 0 && dispatch !== "" && dispatch !== "inherit") {
702
+ const declared = roleIds.get(dispatch);
703
+ if (declared !== void 0) return declared;
704
+ }
700
705
  const role = resolveRole(agent, rules, roleIds, opts.warn, opts.servedRoute);
701
706
  if (role !== "inherit") return role;
702
707
  if (opts.automatchEnabled && opts.automatch !== void 0) {
@@ -865,6 +870,9 @@ function installRoleNotice(ctx, options) {
865
870
  //#endregion
866
871
  //#region .build/host/role-projection-key.js
867
872
  const ROLE_PROJECTION_KEY = "fallbacksSubagentRole";
873
+ function readRoleProjectionValue(value) {
874
+ return typeof value === "string" && value.trim() !== "" ? value : void 0;
875
+ }
868
876
  const ROLE_STATE_SCHEMA = { parse(value) {
869
877
  if (value === null) return null;
870
878
  if (typeof value === "object") {
@@ -1084,6 +1092,9 @@ function seamStateFor(root) {
1084
1092
  return created;
1085
1093
  }
1086
1094
  const subagentSeamRoots = new WeakSet();
1095
+ function subagentSeamOf(ctx) {
1096
+ return subagentSeamStores.get(ctx);
1097
+ }
1087
1098
  function installSubagentSeam(ctx, options) {
1088
1099
  const root = ctx.root;
1089
1100
  const state = seamStateFor(root);
@@ -3134,7 +3145,8 @@ function apply(ctx, config = defaultFallbacksConfig) {
3134
3145
  detectLegacyKeys,
3135
3146
  declareSeeds: (declarations, options) => seeds.declare(declarations, seedsIo, options?.set === void 0 ? void 0 : { set: options.set }),
3136
3147
  getEffectiveRoles: () => seeds.effectiveRoles(seedsIo),
3137
- revertSeededPersona: (id) => seeds.revert(id, seedsIo)
3148
+ revertSeededPersona: (id) => seeds.revert(id, seedsIo),
3149
+ getAgentRole: (agentId) => subagentSeamOf(ctx)?.records.get(agentId)?.role ?? null
3138
3150
  });
3139
3151
  serviceOwned = true;
3140
3152
  } catch (error) {
@@ -3396,6 +3408,7 @@ function apply(ctx, config = defaultFallbacksConfig) {
3396
3408
  const role = await resolveRoleAtDispatch(agent, config.roles.rules, roleIds, {
3397
3409
  automatchEnabled: config.roleAutoMatch ?? true,
3398
3410
  automatch: (agent) => pickRoleByLlm(ctx, config.roles, agent, { warn: logger.warn }),
3411
+ dispatchRole: subagentSeam.records.get(agent.id)?.role,
3399
3412
  warn: logger.warn,
3400
3413
  servedRoute: servedRouteFor(agent, config)
3401
3414
  });
@@ -3564,4 +3577,4 @@ function apply(ctx, config = defaultFallbacksConfig) {
3564
3577
  });
3565
3578
  }
3566
3579
  //#endregion
3567
- export { Config, FallbacksSeedManager, INHERIT_ROLE_ID, ROLE_ID_PATTERN, SelectorError, annotateCandidates, apply, blockedAttempts, chainHeads, countRetryEvents, createCandidateFilter, defaultFallbacksConfig, detectLegacyKeys, hasWildcardEntry, name, parseSelector, presetRoles, provide, resolveCandidate, resolveChain, resolveChainViews, resolveRole, selectCandidates, stateStore, validateFallbacksConfig };
3580
+ export { Config, FallbacksSeedManager, INHERIT_ROLE_ID, ROLE_ID_PATTERN, ROLE_PROJECTION_KEY, SelectorError, annotateCandidates, apply, blockedAttempts, chainHeads, countRetryEvents, createCandidateFilter, defaultFallbacksConfig, detectLegacyKeys, hasWildcardEntry, name, parseSelector, presetRoles, provide, readRoleProjectionValue, resolveCandidate, resolveChain, resolveChainViews, resolveRole, selectCandidates, stateStore, validateFallbacksConfig };