dsh-fallback-router 0.1.0 → 0.1.1-alpha.1

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/LICENSE CHANGED
@@ -1,21 +1,21 @@
1
- MIT License
2
-
3
- Copyright (c) 2026 dsh-external
4
-
5
- Permission is hereby granted, free of charge, to any person obtaining a copy
6
- of this software and associated documentation files (the "Software"), to deal
7
- in the Software without restriction, including without limitation the rights
8
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
- copies of the Software, and to permit persons to whom the Software is
10
- furnished to do so, subject to the following conditions:
11
-
12
- The above copyright notice and this permission notice shall be included in all
13
- copies or substantial portions of the Software.
14
-
15
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
- SOFTWARE.
1
+ MIT License
2
+
3
+ Copyright (c) 2026 dsh-external
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md CHANGED
@@ -14,7 +14,11 @@ dsh plugin --profile desktop add github:hongxin-y/dsh-fallback-router
14
14
 
15
15
  Pin a commit (`#<sha>`) if you want the code that runs to stop changing. pnpm ≥ 10 does not run a git dependency's build script by default, so the first `add` may stop with `ERR_PNPM_GIT_DEP_PREPARE_NOT_ALLOWED`; run `pnpm approve-builds` inside the profile directory (`$DSH_HOME/profiles/desktop`), or add the package to that profile's `pnpm-workspace.yaml` allow list (`allowBuilds`, or `onlyBuiltDependencies` on older pnpm), then run the `add` again. Details, verification and uninstall → [docs/install.md](docs/install.md).
16
16
 
17
- The npm package name is `dsh-fallback-router`, but it is **not published to the registry yet** (the release workflow's npm step is gated off) — install from the GitHub source above.
17
+ The package is also published to the registry as `dsh-fallback-router`, which skips the build step entirely:
18
+
19
+ ```sh
20
+ dsh plugin --profile desktop add dsh-fallback-router
21
+ ```
18
22
 
19
23
  ## 1. The core idea: model profiles
20
24
 
package/README.zh-CN.md CHANGED
@@ -14,7 +14,11 @@ dsh plugin --profile desktop add github:hongxin-y/dsh-fallback-router
14
14
 
15
15
  想锁定代码版本就带上提交号(`#<sha>`)。pnpm ≥ 10 默认不执行 git 依赖的构建脚本,第一次 `add` 可能停在 `ERR_PNPM_GIT_DEP_PREPARE_NOT_ALLOWED`:在 profile 目录(`$DSH_HOME/profiles/desktop`)里跑一次 `pnpm approve-builds`,或把该包写进该 profile 的 `pnpm-workspace.yaml` 允许列表(pnpm 11 用 `allowBuilds`,pnpm 10 用 `onlyBuiltDependencies`),再执行一次。详细步骤、验证与卸载 → [docs/install.md](docs/install.md)。
16
16
 
17
- 本包的 npm 包名是 `dsh-fallback-router`,但**还没有发布到注册表**(发布流程里的 npm 步骤默认关闭),请按上面的 GitHub 源安装。
17
+ 本包也已发布到 npm 注册表,装它不需要现场构建:
18
+
19
+ ```sh
20
+ dsh plugin --profile desktop add dsh-fallback-router
21
+ ```
18
22
 
19
23
  ## 一、核心概念:模型配置
20
24
 
@@ -1,19 +1,19 @@
1
- # The dsh-fallback-router profile-bundle patch: ONE insert of the plugin row over
2
- # the profile's bundle stack (`dsh.profile.bundles` order — dsh-base first,
3
- # this bundle after the llm-retry bundle; later layers win per row).
4
- #
5
- # Insert position matters for the host waterfall: the profile must list the
6
- # llm-retry bundle BEFORE dsh-fallback-router, so this plugin's
7
- # `agent/request-error` listener composes after llm-retry and only intervenes
8
- # once retry policy is exhausted (normal mode) or delegates downstream first
9
- # (always mode). See plan Risk table.
10
- #
11
- # A patch replaces the targeted row's whole `config` rather than merging into
12
- # it, so a user-level override must restate every field it keeps. The row
13
- # ships only neutral defaults; profile-layer (`cordis.patch.yml`) overrides
14
- # win.
15
-
16
- - insert:
17
- - id: llm-router
18
- name: 'dsh-fallback-router'
19
- config: {}
1
+ # The dsh-fallback-router profile-bundle patch: ONE insert of the plugin row over
2
+ # the profile's bundle stack (`dsh.profile.bundles` order — dsh-base first,
3
+ # this bundle after the llm-retry bundle; later layers win per row).
4
+ #
5
+ # Insert position matters for the host waterfall: the profile must list the
6
+ # llm-retry bundle BEFORE dsh-fallback-router, so this plugin's
7
+ # `agent/request-error` listener composes after llm-retry and only intervenes
8
+ # once retry policy is exhausted (normal mode) or delegates downstream first
9
+ # (always mode). See plan Risk table.
10
+ #
11
+ # A patch replaces the targeted row's whole `config` rather than merging into
12
+ # it, so a user-level override must restate every field it keeps. The row
13
+ # ships only neutral defaults; profile-layer (`cordis.patch.yml`) overrides
14
+ # win.
15
+
16
+ - insert:
17
+ - id: llm-router
18
+ name: 'dsh-fallback-router'
19
+ config: {}
@@ -10,7 +10,7 @@ window.__ModuleLoader__.load({
10
10
  let react = require("react");
11
11
  let react_jsx_runtime = require("react/jsx-runtime");
12
12
  let _deepseek_ai_dsh_client_store = require("@deepseek-ai/dsh-client-store");
13
- //#region ../Artifacts/dsh-llm-router/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.production.js
13
+ //#region node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.production.js
14
14
  /**
15
15
  * @license React
16
16
  * use-sync-external-store-shim.production.js
@@ -70,12 +70,12 @@ window.__ModuleLoader__.load({
70
70
  exports.useSyncExternalStore = void 0 !== React$1.useSyncExternalStore ? React$1.useSyncExternalStore : shim;
71
71
  }));
72
72
  //#endregion
73
- //#region ../Artifacts/dsh-llm-router/node_modules/use-sync-external-store/shim/index.js
73
+ //#region node_modules/use-sync-external-store/shim/index.js
74
74
  var require_shim = /* @__PURE__ */ __commonJSMin(((exports, module) => {
75
75
  module.exports = require_use_sync_external_store_shim_production();
76
76
  }));
77
77
  //#endregion
78
- //#region ../Artifacts/dsh-llm-router/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim/with-selector.production.js
78
+ //#region node_modules/use-sync-external-store/cjs/use-sync-external-store-shim/with-selector.production.js
79
79
  /**
80
80
  * @license React
81
81
  * use-sync-external-store-shim/with-selector.production.js
@@ -167,8 +167,8 @@ window.__ModuleLoader__.load({
167
167
  };
168
168
  }
169
169
  //#endregion
170
- //#region \0dsh-css:D:\Repos\dsh-llm-router\src\client\FallbacksCard.module.css.mjs
171
- const css$4 = "\r\n\r\n\r\n._c6b9cfef_root {\r\n min-width: 0;\r\n}\r\n\r\n\r\n._17e44069_readOnly {\r\n margin: 12px 0 0;\r\n font-size: 12px;\r\n line-height: 1.5;\r\n color: var(--dsw-alias-label-tertiary);\r\n}\r\n\r\n._dbee053b_notice {\r\n margin: 12px 0 0;\r\n font-size: 12px;\r\n line-height: 18px;\r\n color: var(--dsw-alias-state-business-primary);\r\n}\r\n\r\n\r\n._a7fc41a0_legacyNotice {\r\n margin: 12px 0 0;\r\n padding: 10px 12px;\r\n border-radius: 8px;\r\n background: var(--dsw-alias-bg-module-platform);\r\n font-size: 12px;\r\n line-height: 18px;\r\n color: var(--dsw-alias-state-business-primary);\r\n}\r\n\r\n._23364cdb_error {\r\n margin: 12px 0 0;\r\n font-size: 12px;\r\n line-height: 18px;\r\n color: var(--dsw-alias-state-error-primary);\r\n}\r\n\r\n\r\n._8b79a4c1_noticeRow {\r\n display: flex;\r\n align-items: center;\r\n gap: 8px;\r\n margin: 12px 0 0;\r\n}\r\n\r\n._8b79a4c1_noticeRow ._23364cdb_error {\r\n flex: 1;\r\n min-width: 0;\r\n margin: 0;\r\n}\r\n\r\n\r\n._dd5a759b_fieldset {\r\n margin: 0;\r\n padding: 0;\r\n border: none;\r\n display: flex;\r\n flex-direction: column;\r\n min-width: 0;\r\n}\r\n\r\n\r\n._4a9f4378_sectionHeading {\r\n display: flex;\r\n align-items: center;\r\n gap: 8px;\r\n margin: 0;\r\n padding: 4px 0;\r\n font-size: 16px;\r\n line-height: 24px;\r\n font-weight: 600;\r\n color: var(--dsw-alias-label-primary);\r\n}\r\n\r\n._3b1ec6bf_sectionHeadingText {\r\n display: block;\r\n min-width: 0;\r\n}\r\n\r\n\r\n._243fb84d_sectionActions {\r\n display: flex;\r\n align-items: center;\r\n gap: 8px;\r\n margin-left: auto;\r\n}\r\n\r\n._243fb84d_sectionActions ._9320e17f_discard,\r\n._243fb84d_sectionActions ._c8248e0e_save {\r\n padding: 3px 12px;\r\n font-size: 12px;\r\n line-height: 18px;\r\n}\r\n\r\n\r\n._1a4fb8ee_sectionToggle {\r\n appearance: none;\r\n border: 0;\r\n background: none;\r\n display: flex;\r\n align-items: center;\r\n gap: 4px;\r\n margin: 0;\r\n padding: 0;\r\n font: inherit;\r\n color: inherit;\r\n cursor: pointer;\r\n}\r\n\r\n._1a4fb8ee_sectionToggle:disabled {\r\n cursor: default;\r\n}\r\n\r\n._1a4fb8ee_sectionToggle:focus-visible {\r\n outline: 2px solid var(--dsw-alias-brand-primary);\r\n outline-offset: 1px;\r\n}\r\n\r\n\r\n._49e6b68d_advancedBody {\r\n display: flex;\r\n flex-direction: column;\r\n min-width: 0;\r\n}\r\n\r\n._dd5a759b_fieldset > ._49e6b68d_advancedBody > ._a72f7f8d_field,\r\n._dd5a759b_fieldset > ._49e6b68d_advancedBody > ._345d580e_checkboxRow,\r\n._dd5a759b_fieldset > ._49e6b68d_advancedBody > ._adeed03f_numberFields {\r\n padding: 12px 0;\r\n}\r\n\r\n._dd5a759b_fieldset > ._49e6b68d_advancedBody > ._a72f7f8d_field + ._a72f7f8d_field,\r\n._dd5a759b_fieldset > ._49e6b68d_advancedBody > ._345d580e_checkboxRow + ._a72f7f8d_field,\r\n._dd5a759b_fieldset > ._49e6b68d_advancedBody > ._a72f7f8d_field + ._adeed03f_numberFields {\r\n border-top: 0.5px solid var(--dsw-alias-border-l2);\r\n}\r\n\r\n\r\n._a72f7f8d_field {\r\n display: flex;\r\n flex-direction: column;\r\n gap: 6px;\r\n margin: 0;\r\n padding: 0;\r\n border: none;\r\n min-width: 0;\r\n}\r\n\r\n\r\n._dd5a759b_fieldset > ._a72f7f8d_field,\r\n._dd5a759b_fieldset > ._345d580e_checkboxRow,\r\n._dd5a759b_fieldset > ._adeed03f_numberFields {\r\n padding: 12px 0;\r\n}\r\n\r\n._dd5a759b_fieldset > ._a72f7f8d_field + ._a72f7f8d_field,\r\n._dd5a759b_fieldset > ._a72f7f8d_field + ._adeed03f_numberFields,\r\n._dd5a759b_fieldset > ._345d580e_checkboxRow + ._a72f7f8d_field {\r\n border-top: 0.5px solid var(--dsw-alias-border-l2);\r\n}\r\n\r\n\r\n._345d580e_checkboxRow {\r\n display: flex;\r\n align-items: flex-start;\r\n gap: 8px;\r\n}\r\n\r\n\r\n._345d580e_checkboxRow ._27b96bc2_checkbox {\r\n margin-top: 3px;\r\n}\r\n\r\n._56212755_fieldLabel {\r\n \r\n display: inline-flex;\r\n align-items: center;\r\n gap: 10px;\r\n padding: 0;\r\n font-size: 13px;\r\n line-height: 1.5;\r\n font-weight: 500;\r\n color: var(--dsw-alias-label-primary);\r\n}\r\n\r\n._d7541ea2_hint {\r\n display: inline-flex;\r\n align-items: center;\r\n gap: 6px;\r\n flex-wrap: wrap;\r\n font-size: 12px;\r\n line-height: 18px;\r\n color: var(--dsw-alias-label-tertiary);\r\n}\r\n\r\n\r\n._9e7453cd_checkLabel {\r\n flex: 1;\r\n min-width: 0;\r\n display: flex;\r\n flex-direction: column;\r\n gap: 4px;\r\n font-size: 14px;\r\n line-height: 22px;\r\n font-weight: 400;\r\n color: var(--dsw-alias-label-primary);\r\n cursor: pointer;\r\n}\r\n\r\n._e4709a41_checkLabelTitle {\r\n display: inline-flex;\r\n align-items: center;\r\n gap: 6px;\r\n font-weight: 400;\r\n}\r\n\r\n._8234d308_checkLabelDesc {\r\n font-size: 12px;\r\n line-height: 18px;\r\n font-weight: 400;\r\n color: var(--dsw-alias-label-tertiary);\r\n}\r\n\r\n\r\n._27b96bc2_checkbox {\r\n flex: none;\r\n width: 16px;\r\n height: 16px;\r\n margin: 0;\r\n accent-color: var(--dsw-alias-brand-primary);\r\n cursor: pointer;\r\n}\r\n\r\n._27b96bc2_checkbox:disabled {\r\n opacity: 0.4;\r\n cursor: default;\r\n}\r\n\r\n\r\n._3c784feb_slotPresetName {\r\n font-size: 14px;\r\n line-height: 22px;\r\n font-weight: 500;\r\n color: var(--dsw-alias-label-primary);\r\n}\r\n\r\n\r\n._9cdfc0a6_infoHint {\r\n position: relative;\r\n display: inline-flex;\r\n align-items: center;\r\n justify-content: center;\r\n flex: none;\r\n width: 16px;\r\n height: 16px;\r\n border-radius: 50%;\r\n font-size: 14px;\r\n line-height: 1;\r\n color: var(--dsw-alias-label-tertiary);\r\n background: var(--dsw-alias-interactive-bg-hover);\r\n cursor: help;\r\n user-select: none;\r\n}\r\n\r\n._9cdfc0a6_infoHint:focus-visible {\r\n outline: none;\r\n box-shadow: 0 0 0 2px var(--dsw-alias-border-l3);\r\n}\r\n\r\n._9cdfc0a6_infoHint::after {\r\n content: attr(data-tip);\r\n position: absolute;\r\n top: 50%;\r\n left: calc(100% + 8px);\r\n transform: translateY(-50%);\r\n z-index: 10;\r\n box-sizing: border-box;\r\n width: max-content;\r\n max-width: 280px;\r\n padding: 5px 10px;\r\n border-radius: 8px;\r\n background: var(--dsw-alias-label-primary);\r\n color: var(--dsw-alias-bg-layer-3);\r\n font-size: 11px;\r\n line-height: 17px;\r\n font-weight: 400;\r\n white-space: normal;\r\n text-align: left;\r\n pointer-events: none;\r\n opacity: 0;\r\n transition: opacity .12s;\r\n}\r\n\r\n._9cdfc0a6_infoHint:hover::after,\r\n._9cdfc0a6_infoHint:focus-visible::after {\r\n opacity: 1;\r\n}\r\n\r\n\r\n._74c4f11e_infoHintDisabled {\r\n opacity: 0.4;\r\n cursor: default;\r\n}\r\n\r\n\r\n._a106dba2_optionRow {\r\n display: flex;\r\n align-items: center;\r\n gap: 8px;\r\n padding: 6px 8px;\r\n border-radius: 6px;\r\n font-size: 14px;\r\n line-height: 22px;\r\n color: var(--dsw-alias-label-primary);\r\n cursor: pointer;\r\n}\r\n\r\n._a106dba2_optionRow:hover:has(input:not(:disabled)) {\r\n background: var(--dsw-alias-interactive-bg-hover);\r\n}\r\n\r\n\r\n._27b96bc2_checkbox,\r\n._a106dba2_optionRow input {\r\n flex: none;\r\n width: 16px;\r\n height: 16px;\r\n margin: 0;\r\n accent-color: var(--dsw-alias-brand-primary);\r\n cursor: pointer;\r\n}\r\n\r\n._27b96bc2_checkbox:focus-visible,\r\n._a106dba2_optionRow input:focus-visible {\r\n outline: none;\r\n box-shadow: 0 0 0 2px var(--dsw-alias-border-l3);\r\n}\r\n\r\n._a106dba2_optionRow input:disabled {\r\n cursor: default;\r\n}\r\n\r\n\r\n._a49c7ded_dayRow {\r\n display: flex;\r\n flex-wrap: wrap;\r\n gap: 4px;\r\n}\r\n\r\n._bdf02c23_dayCell {\r\n display: inline-flex;\r\n align-items: center;\r\n gap: 4px;\r\n padding: 2px 6px;\r\n border-radius: 6px;\r\n font-size: 12px;\r\n line-height: 18px;\r\n color: var(--dsw-alias-label-secondary);\r\n cursor: pointer;\r\n}\r\n\r\n._bdf02c23_dayCell:hover:has(input:not(:disabled)) {\r\n background: var(--dsw-alias-interactive-bg-hover);\r\n}\r\n\r\n._bdf02c23_dayCell input {\r\n flex: none;\r\n width: 16px;\r\n height: 16px;\r\n margin: 0;\r\n accent-color: var(--dsw-alias-brand-primary);\r\n cursor: pointer;\r\n}\r\n\r\n._bdf02c23_dayCell input:disabled {\r\n cursor: default;\r\n}\r\n\r\n._bdf02c23_dayCell input:focus-visible {\r\n outline: none;\r\n box-shadow: 0 0 0 2px var(--dsw-alias-border-l3);\r\n}\r\n\r\n\r\n._b82bc091_input {\r\n box-sizing: border-box;\r\n width: 100%;\r\n height: 34px;\r\n padding: 0 12px;\r\n border: 0.5px solid var(--dsw-alias-border-l4);\r\n border-radius: var(--dsw-radius-md);\r\n font: inherit;\r\n font-size: 13px;\r\n line-height: 1.5;\r\n background: var(--dsw-alias-bg-layer-3);\r\n color: var(--dsw-alias-label-primary);\r\n}\r\n\r\n._b82bc091_input:focus-visible {\r\n outline: none;\r\n border-color: var(--dsw-alias-state-business-primary);\r\n}\r\n\r\n._b82bc091_input::placeholder {\r\n color: var(--dsw-alias-label-dimmed);\r\n}\r\n\r\n._b82bc091_input:disabled {\r\n color: var(--dsw-alias-label-tertiary);\r\n cursor: default;\r\n}\r\n\r\n\r\n._c9e5ffe7_inputTextarea {\r\n height: auto;\r\n min-height: 72px;\r\n padding: 8px 12px;\r\n resize: vertical;\r\n}\r\n\r\n\r\n._b5886f05_personaBriefRow {\r\n display: flex;\r\n align-items: center;\r\n gap: 4px;\r\n min-width: 0;\r\n}\r\n\r\n._ee45acf7_personaBrief {\r\n flex: 1;\r\n min-width: 0;\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n white-space: nowrap;\r\n font-size: 14px;\r\n line-height: 22px;\r\n color: var(--dsw-alias-label-primary);\r\n}\r\n\r\n\r\n._1d900a64_personaBriefEmpty {\r\n color: var(--dsw-alias-label-tertiary);\r\n}\r\n\r\n\r\n._5ecb2b94_personaFull {\r\n margin: 0;\r\n font-size: 14px;\r\n line-height: 22px;\r\n color: var(--dsw-alias-label-secondary);\r\n white-space: pre-wrap;\r\n overflow-wrap: anywhere;\r\n}\r\n\r\n\r\n._90bd6054_inputInvalid,\r\n._90bd6054_inputInvalid:focus-visible {\r\n border-color: var(--dsw-alias-state-error-primary);\r\n}\r\n\r\n\r\nselect._b82bc091_input {\r\n max-width: 240px;\r\n cursor: pointer;\r\n}\r\n\r\n\r\n._261230a1_selectInput {\r\n appearance: none;\r\n padding-right: 32px;\r\n \r\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\");\r\n background-repeat: no-repeat;\r\n background-position: right 12px center;\r\n background-size: 12px 12px;\r\n}\r\n\r\n\r\n._adeed03f_numberFields {\r\n display: grid;\r\n grid-template-columns: repeat(auto-fit, minmax(160px, 1fr));\r\n gap: 12px;\r\n}\r\n\r\n._adeed03f_numberFields ._a72f7f8d_field {\r\n padding: 0;\r\n}\r\n\r\n._8c756cfb_list {\r\n display: flex;\r\n flex-direction: column;\r\n gap: 8px;\r\n margin-top: 4px;\r\n}\r\n\r\n\r\n._bba0bbe4_editorCard {\r\n display: flex;\r\n flex-direction: column;\r\n gap: 14px;\r\n padding: 14px 16px;\r\n border-radius: 12px;\r\n background: var(--dsw-alias-bg-module-platform);\r\n}\r\n\r\n._87c4f7f9_cardFoot {\r\n display: flex;\r\n justify-content: flex-end;\r\n}\r\n\r\n._fce20e49_ruleGrid {\r\n display: flex;\r\n flex-wrap: wrap;\r\n gap: 8px;\r\n}\r\n\r\n._cfc66c5d_ruleCell {\r\n display: flex;\r\n flex-direction: column;\r\n gap: 4px;\r\n min-width: 120px;\r\n flex: 1;\r\n}\r\n\r\n._9d4091c5_ruleCellLabel {\r\n font-size: 12px;\r\n line-height: 18px;\r\n color: var(--dsw-alias-label-secondary);\r\n}\r\n\r\n\r\n._8e7f566e_chevron {\r\n flex: none;\r\n color: var(--dsw-alias-label-tertiary);\r\n transform: rotate(-90deg);\r\n transition: transform .16s;\r\n}\r\n\r\n._7dbaf9ce_chevronOpen {\r\n transform: none;\r\n}\r\n\r\n\r\n._ae6bf76d_chevronFlip {\r\n transform: rotate(180deg);\r\n}\r\n\r\n\r\n._e93c9e2c_collapseRow {\r\n display: flex;\r\n align-items: center;\r\n gap: 8px;\r\n min-width: 0;\r\n}\r\n\r\n._0934b8f4_collapseToggle {\r\n appearance: none;\r\n border: 0;\r\n background: none;\r\n padding: 0;\r\n cursor: pointer;\r\n color: var(--dsw-alias-label-secondary);\r\n display: flex;\r\n align-items: center;\r\n gap: 8px;\r\n flex: 1;\r\n min-width: 0;\r\n font: inherit;\r\n text-align: left;\r\n}\r\n\r\n._0934b8f4_collapseToggle:disabled {\r\n cursor: default;\r\n}\r\n\r\n._1133fbee_collapseTitle {\r\n \r\n flex: none;\r\n max-width: 55%;\r\n min-width: 0;\r\n font-size: 12px;\r\n line-height: 18px;\r\n font-weight: 500;\r\n color: var(--dsw-alias-label-primary);\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n white-space: nowrap;\r\n}\r\n\r\n._d82ef63d_collapseMeta {\r\n \r\n flex: 0 1 auto;\r\n min-width: 0;\r\n max-width: 40%;\r\n margin-left: auto;\r\n font-size: 12px;\r\n line-height: 18px;\r\n color: var(--dsw-alias-label-secondary);\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n white-space: nowrap;\r\n}\r\n\r\n\r\n._b134c585_seedBadge {\r\n flex: none;\r\n max-width: 40%;\r\n min-width: 0;\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n border-radius: 999px;\r\n padding: 1px 8px;\r\n font-size: 11px;\r\n line-height: 17px;\r\n font-weight: 500;\r\n white-space: nowrap;\r\n background: var(--dsw-alias-bg-layer-1);\r\n color: var(--dsw-alias-label-secondary);\r\n}\r\n\r\n\r\n._0e70e355_slotTag {\r\n flex: none;\r\n display: inline-flex;\r\n align-items: center;\r\n border-radius: 999px;\r\n padding: 0 6px;\r\n font-size: 11px;\r\n line-height: 17px;\r\n font-weight: 500;\r\n white-space: nowrap;\r\n border: 1px solid;\r\n}\r\n\r\n._f3b7ca50_slotTagHighCost {\r\n color: var(--dsw-alias-state-error-primary);\r\n border-color: var(--dsw-alias-state-error-primary);\r\n background: color-mix(in srgb, var(--dsw-alias-state-error-primary) 10%, transparent);\r\n}\r\n\r\n._9216af96_slotTagMultiplier {\r\n color: var(--dsw-alias-state-warn-primary);\r\n border-color: var(--dsw-alias-state-warn-primary);\r\n background: color-mix(in srgb, var(--dsw-alias-state-warn-primary) 10%, transparent);\r\n}\r\n\r\n._e6c0e39f_slotTagActive {\r\n color: var(--dsw-alias-state-success-primary);\r\n border-color: var(--dsw-alias-state-success-primary);\r\n background: color-mix(in srgb, var(--dsw-alias-state-success-primary) 10%, transparent);\r\n}\r\n\r\n\r\n._0849b09f_dragHandle {\r\n appearance: none;\r\n border: 0;\r\n background: none;\r\n padding: 0;\r\n cursor: grab;\r\n color: var(--dsw-alias-label-tertiary);\r\n display: inline-flex;\r\n align-items: center;\r\n justify-content: center;\r\n width: 20px;\r\n height: 20px;\r\n border-radius: 6px;\r\n flex: none;\r\n}\r\n\r\n._0849b09f_dragHandle:hover:not(:disabled) {\r\n background: var(--dsw-alias-interactive-bg-hover);\r\n color: var(--dsw-alias-label-primary);\r\n}\r\n\r\n._0849b09f_dragHandle:active {\r\n cursor: grabbing;\r\n}\r\n\r\n._0849b09f_dragHandle:disabled {\r\n cursor: default;\r\n opacity: 0.4;\r\n}\r\n\r\n._0849b09f_dragHandle:focus-visible {\r\n outline: none;\r\n box-shadow: 0 0 0 2px var(--dsw-alias-border-l3);\r\n}\r\n\r\n\r\n._83fb72f8_slotCardDragging {\r\n opacity: 0.45;\r\n}\r\n\r\n._5d67996b_slotCardOver {\r\n outline: 1px dashed var(--dsw-alias-brand-primary);\r\n outline-offset: 2px;\r\n}\r\n\r\n\r\n._d8f6c9e3_selectorRowDragging {\r\n opacity: 0.45;\r\n}\r\n\r\n._49b56db4_selectorRowOver {\r\n outline: 1px dashed var(--dsw-alias-brand-primary);\r\n outline-offset: 2px;\r\n border-radius: 6px;\r\n}\r\n\r\n\r\n._13d58efe_selectorGrip {\r\n flex: none;\r\n}\r\n\r\n._13d58efe_selectorGrip:disabled {\r\n display: none;\r\n}\r\n\r\n\r\n._bfe77c29_chainBlock {\r\n display: flex;\r\n flex-direction: column;\r\n gap: 6px;\r\n}\r\n\r\n\r\n._428b5d1a_chainSelectors {\r\n display: flex;\r\n flex-direction: column;\r\n gap: 4px;\r\n}\r\n\r\n\r\n._c190e3f0_selectorLine {\r\n display: flex;\r\n align-items: center;\r\n gap: 8px;\r\n flex-wrap: nowrap;\r\n \r\n min-height: 32px;\r\n}\r\n\r\n\r\n._6534b816_selectorIndex {\r\n flex: none;\r\n width: 1.5em;\r\n text-align: right;\r\n font-size: 11px;\r\n line-height: 16px;\r\n color: var(--dsw-alias-label-tertiary);\r\n font-variant-numeric: tabular-nums;\r\n}\r\n\r\n\r\n._334a37c3_selectorProviderCell {\r\n flex: 0 1 clamp(140px, 20%, 220px);\r\n min-width: 0;\r\n}\r\n\r\n._63065c63_selectorModelCell {\r\n flex: 1 1 auto;\r\n min-width: 0;\r\n}\r\n\r\n\r\n._63065c63_selectorModelCell > select._b82bc091_input {\r\n max-width: 100%;\r\n}\r\n\r\n\r\n._9222de4f_selectorHint {\r\n display: flex;\r\n align-items: center;\r\n flex: 0 1 auto;\r\n min-width: 0;\r\n}\r\n\r\n\r\n._b3f9f018_selectorHintText {\r\n flex: 0 1 auto;\r\n min-width: 0;\r\n white-space: nowrap;\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n font-size: 11px;\r\n line-height: 16px;\r\n color: var(--dsw-alias-label-secondary);\r\n}\r\n\r\n\r\n._9222de4f_selectorHint > ._9cdfc0a6_infoHint {\r\n flex: none;\r\n margin-left: 4px;\r\n}\r\n\r\n\r\n._832cfce6_selectorRemove {\r\n flex: none;\r\n opacity: 0;\r\n transition: opacity .12s;\r\n}\r\n\r\n\r\n._832cfce6_selectorRemove:disabled {\r\n display: none;\r\n}\r\n\r\n\r\n._15ebf4ae_selectorRow:hover ._832cfce6_selectorRemove:not(:disabled),\r\n._15ebf4ae_selectorRow:focus-within ._832cfce6_selectorRemove:not(:disabled) {\r\n opacity: 1;\r\n}\r\n\r\n@media (hover: none) {\r\n ._832cfce6_selectorRemove:not(:disabled) {\r\n opacity: 0.7;\r\n }\r\n}\r\n\r\n\r\n._572ba95a_iconButton {\r\n position: relative;\r\n box-sizing: border-box;\r\n appearance: none;\r\n display: inline-flex;\r\n align-items: center;\r\n justify-content: center;\r\n width: 28px;\r\n height: 28px;\r\n padding: 0;\r\n border: 0;\r\n border-radius: 6px;\r\n background: none;\r\n color: var(--dsw-alias-label-tertiary);\r\n cursor: pointer;\r\n}\r\n\r\n._572ba95a_iconButton:disabled {\r\n opacity: 0.4;\r\n cursor: default;\r\n}\r\n\r\n._572ba95a_iconButton:hover:not(:disabled) {\r\n background: var(--dsw-alias-interactive-bg-hover);\r\n color: var(--dsw-alias-label-primary);\r\n}\r\n\r\n._572ba95a_iconButton:focus-visible {\r\n outline: none;\r\n box-shadow: 0 0 0 2px var(--dsw-alias-border-l3);\r\n}\r\n\r\n._572ba95a_iconButton::after {\r\n content: attr(data-tip);\r\n position: absolute;\r\n bottom: calc(100% + 6px);\r\n left: 50%;\r\n transform: translateX(-50%);\r\n padding: 3px 8px;\r\n border-radius: 6px;\r\n background: var(--dsw-alias-label-primary);\r\n color: var(--dsw-alias-bg-layer-3);\r\n font-size: 11px;\r\n line-height: 17px;\r\n white-space: nowrap;\r\n opacity: 0;\r\n pointer-events: none;\r\n transition: opacity .12s;\r\n}\r\n\r\n._572ba95a_iconButton:hover::after,\r\n._572ba95a_iconButton:focus-visible::after {\r\n opacity: 1;\r\n}\r\n\r\n\r\n._dce04c19_iconButtonDanger:hover:not(:disabled) {\r\n background: var(--dsw-alias-interactive-bg-hover-danger);\r\n color: var(--dsw-alias-state-error-primary);\r\n}\r\n\r\n\r\n._60ce2a17_outlineButton {\r\n appearance: none;\r\n display: inline-flex;\r\n align-items: center;\r\n gap: 4px;\r\n padding: 4px 10px;\r\n border: 1px solid var(--dsw-alias-border-l2);\r\n border-radius: var(--dsw-radius-md);\r\n background: none;\r\n font: inherit;\r\n font-size: 12px;\r\n line-height: 18px;\r\n color: var(--dsw-alias-label-secondary);\r\n cursor: pointer;\r\n}\r\n\r\n._60ce2a17_outlineButton:hover:not(:disabled) {\r\n color: var(--dsw-alias-label-primary);\r\n border-color: var(--dsw-alias-label-dimmed);\r\n}\r\n\r\n._60ce2a17_outlineButton:disabled {\r\n opacity: 0.4;\r\n cursor: default;\r\n}\r\n\r\n._60ce2a17_outlineButton:focus-visible {\r\n outline: 2px solid var(--dsw-alias-brand-primary);\r\n outline-offset: 1px;\r\n}\r\n\r\n\r\n._0b13c716_addButton {\r\n align-self: flex-start;\r\n}\r\n\r\n\r\n._bfe77c29_chainBlock > ._0b13c716_addButton {\r\n box-sizing: border-box;\r\n align-self: flex-start;\r\n height: 26px;\r\n padding: 0 8px;\r\n border: 1px solid transparent;\r\n gap: 4px;\r\n font-size: 12px;\r\n line-height: 18px;\r\n color: var(--dsw-alias-label-secondary);\r\n}\r\n\r\n._bfe77c29_chainBlock > ._0b13c716_addButton:hover:not(:disabled) {\r\n border-color: transparent;\r\n background: var(--dsw-alias-interactive-bg-hover);\r\n color: var(--dsw-alias-label-primary);\r\n}\r\n\r\n\r\n._bfe77c29_chainBlock > ._0b13c716_addButton:focus-visible {\r\n outline: none;\r\n box-shadow: 0 0 0 2px var(--dsw-alias-border-l3);\r\n}\r\n\r\n\r\n._26e91326_slotAddRow {\r\n display: flex;\r\n align-items: center;\r\n gap: 8px;\r\n margin-top: 4px;\r\n flex-wrap: wrap;\r\n}\r\n\r\n\r\n._007c1b38_rowActions {\r\n display: flex;\r\n align-items: center;\r\n gap: 4px;\r\n}\r\n\r\n\r\n._9320e17f_discard,\r\n._c8248e0e_save {\r\n appearance: none;\r\n border: 1px solid transparent;\r\n border-radius: var(--dsw-radius-md);\r\n padding: 5px 14px;\r\n font: inherit;\r\n font-size: 13px;\r\n line-height: 1.5;\r\n cursor: pointer;\r\n}\r\n\r\n._9320e17f_discard {\r\n border-color: var(--dsw-alias-border-l2);\r\n background: none;\r\n color: var(--dsw-alias-label-secondary);\r\n}\r\n\r\n._9320e17f_discard:hover:not(:disabled) {\r\n color: var(--dsw-alias-label-primary);\r\n border-color: var(--dsw-alias-label-dimmed);\r\n}\r\n\r\n._c8248e0e_save {\r\n background: var(--dsw-alias-label-primary);\r\n color: var(--dsw-alias-bg-layer-3);\r\n}\r\n\r\n._9320e17f_discard:disabled,\r\n._c8248e0e_save:disabled {\r\n opacity: 0.4;\r\n cursor: default;\r\n}\r\n\r\n._9320e17f_discard:focus-visible,\r\n._c8248e0e_save:focus-visible {\r\n outline: 2px solid var(--dsw-alias-brand-primary);\r\n outline-offset: 1px;\r\n}\r\n\r\n\r\n._7d807542_statusBlock {\r\n display: flex;\r\n flex-direction: column;\r\n gap: 12px;\r\n padding: 12px 14px;\r\n margin-top: 12px;\r\n border: 1px solid var(--dsw-alias-border-l2);\r\n border-radius: 12px;\r\n}\r\n\r\n._2d5242e9_statusTitle {\r\n font-size: 12px;\r\n line-height: 18px;\r\n font-weight: 500;\r\n color: var(--dsw-alias-label-secondary);\r\n}\r\n\r\n\r\n._06913287_statusLine {\r\n margin: 0;\r\n font-size: 12px;\r\n line-height: 18px;\r\n color: var(--dsw-alias-label-secondary);\r\n white-space: nowrap;\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n}\r\n\r\n._b5c76c1f_statusLineLabel {\r\n font-weight: 500;\r\n color: var(--dsw-alias-label-secondary);\r\n}\r\n\r\n\r\n._0d87013f_policyStatus {\r\n margin: 12px 0 0;\r\n padding: 10px 12px;\r\n border-radius: 8px;\r\n background: var(--dsw-alias-bg-module-platform);\r\n display: flex;\r\n flex-direction: column;\r\n gap: 6px;\r\n}\r\n\r\n\r\n._0ebbca28_policyStatusText {\r\n display: flex;\r\n flex-direction: column;\r\n gap: 6px;\r\n}\r\n\r\n._c1a1a4b8_policyStatusSync {\r\n display: flex;\r\n flex-wrap: wrap;\r\n align-items: center;\r\n gap: 6px;\r\n}\r\n\r\n\r\n._59029705_policyStatusLive:empty {\r\n position: absolute;\r\n width: 1px;\r\n height: 1px;\r\n overflow: hidden;\r\n clip-path: inset(50%);\r\n white-space: nowrap;\r\n}\r\n\r\n._f899bec7_policyStatusLabel {\r\n font-size: 12px;\r\n font-weight: 600;\r\n line-height: 18px;\r\n color: var(--dsw-alias-label-secondary);\r\n}\r\n\r\n._68ef287d_policyStatusLine {\r\n font-size: 12px;\r\n line-height: 18px;\r\n color: var(--dsw-alias-label-primary);\r\n}\r\n\r\n._67addcbf_policyStatusWarn {\r\n font-size: 12px;\r\n line-height: 18px;\r\n color: var(--dsw-alias-state-warn-primary);\r\n}\r\n\r\n@media (prefers-reduced-motion: reduce) {\r\n ._572ba95a_iconButton::after,\r\n ._9cdfc0a6_infoHint::after {\r\n transition: none;\r\n }\r\n\r\n ._8e7f566e_chevron {\r\n transition: none;\r\n }\r\n}\r\n";
170
+ //#region \0dsh-css:/home/runner/work/dsh-fallback-router/dsh-fallback-router/src/client/FallbacksCard.module.css.mjs
171
+ const css$4 = "\n\n\n._c6b9cfef_root {\n min-width: 0;\n}\n\n\n._17e44069_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._dbee053b_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._a7fc41a0_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._23364cdb_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._8b79a4c1_noticeRow {\n display: flex;\n align-items: center;\n gap: 8px;\n margin: 12px 0 0;\n}\n\n._8b79a4c1_noticeRow ._23364cdb_error {\n flex: 1;\n min-width: 0;\n margin: 0;\n}\n\n\n._dd5a759b_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._4a9f4378_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._3b1ec6bf_sectionHeadingText {\n display: block;\n min-width: 0;\n}\n\n\n._243fb84d_sectionActions {\n display: flex;\n align-items: center;\n gap: 8px;\n margin-left: auto;\n}\n\n._243fb84d_sectionActions ._9320e17f_discard,\n._243fb84d_sectionActions ._c8248e0e_save {\n padding: 3px 12px;\n font-size: 12px;\n line-height: 18px;\n}\n\n\n._1a4fb8ee_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._1a4fb8ee_sectionToggle:disabled {\n cursor: default;\n}\n\n._1a4fb8ee_sectionToggle:focus-visible {\n outline: 2px solid var(--dsw-alias-brand-primary);\n outline-offset: 1px;\n}\n\n\n._49e6b68d_advancedBody {\n display: flex;\n flex-direction: column;\n min-width: 0;\n}\n\n._dd5a759b_fieldset > ._49e6b68d_advancedBody > ._a72f7f8d_field,\n._dd5a759b_fieldset > ._49e6b68d_advancedBody > ._345d580e_checkboxRow,\n._dd5a759b_fieldset > ._49e6b68d_advancedBody > ._adeed03f_numberFields {\n padding: 12px 0;\n}\n\n._dd5a759b_fieldset > ._49e6b68d_advancedBody > ._a72f7f8d_field + ._a72f7f8d_field,\n._dd5a759b_fieldset > ._49e6b68d_advancedBody > ._345d580e_checkboxRow + ._a72f7f8d_field,\n._dd5a759b_fieldset > ._49e6b68d_advancedBody > ._a72f7f8d_field + ._adeed03f_numberFields {\n border-top: 0.5px solid var(--dsw-alias-border-l2);\n}\n\n\n._a72f7f8d_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._dd5a759b_fieldset > ._a72f7f8d_field,\n._dd5a759b_fieldset > ._345d580e_checkboxRow,\n._dd5a759b_fieldset > ._adeed03f_numberFields {\n padding: 12px 0;\n}\n\n._dd5a759b_fieldset > ._a72f7f8d_field + ._a72f7f8d_field,\n._dd5a759b_fieldset > ._a72f7f8d_field + ._adeed03f_numberFields,\n._dd5a759b_fieldset > ._345d580e_checkboxRow + ._a72f7f8d_field {\n border-top: 0.5px solid var(--dsw-alias-border-l2);\n}\n\n\n._345d580e_checkboxRow {\n display: flex;\n align-items: flex-start;\n gap: 8px;\n}\n\n\n._345d580e_checkboxRow ._27b96bc2_checkbox {\n margin-top: 3px;\n}\n\n._56212755_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._d7541ea2_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._9e7453cd_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._e4709a41_checkLabelTitle {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n font-weight: 400;\n}\n\n._8234d308_checkLabelDesc {\n font-size: 12px;\n line-height: 18px;\n font-weight: 400;\n color: var(--dsw-alias-label-tertiary);\n}\n\n\n._27b96bc2_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._27b96bc2_checkbox:disabled {\n opacity: 0.4;\n cursor: default;\n}\n\n\n._3c784feb_slotPresetName {\n font-size: 14px;\n line-height: 22px;\n font-weight: 500;\n color: var(--dsw-alias-label-primary);\n}\n\n\n._9cdfc0a6_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._9cdfc0a6_infoHint:focus-visible {\n outline: none;\n box-shadow: 0 0 0 2px var(--dsw-alias-border-l3);\n}\n\n._9cdfc0a6_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._9cdfc0a6_infoHint:hover::after,\n._9cdfc0a6_infoHint:focus-visible::after {\n opacity: 1;\n}\n\n\n._74c4f11e_infoHintDisabled {\n opacity: 0.4;\n cursor: default;\n}\n\n\n._a106dba2_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._a106dba2_optionRow:hover:has(input:not(:disabled)) {\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\n\n._27b96bc2_checkbox,\n._a106dba2_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._27b96bc2_checkbox:focus-visible,\n._a106dba2_optionRow input:focus-visible {\n outline: none;\n box-shadow: 0 0 0 2px var(--dsw-alias-border-l3);\n}\n\n._a106dba2_optionRow input:disabled {\n cursor: default;\n}\n\n\n._a49c7ded_dayRow {\n display: flex;\n flex-wrap: wrap;\n gap: 4px;\n}\n\n._bdf02c23_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._bdf02c23_dayCell:hover:has(input:not(:disabled)) {\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\n._bdf02c23_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._bdf02c23_dayCell input:disabled {\n cursor: default;\n}\n\n._bdf02c23_dayCell input:focus-visible {\n outline: none;\n box-shadow: 0 0 0 2px var(--dsw-alias-border-l3);\n}\n\n\n._b82bc091_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._b82bc091_input:focus-visible {\n outline: none;\n border-color: var(--dsw-alias-state-business-primary);\n}\n\n._b82bc091_input::placeholder {\n color: var(--dsw-alias-label-dimmed);\n}\n\n._b82bc091_input:disabled {\n color: var(--dsw-alias-label-tertiary);\n cursor: default;\n}\n\n\n._c9e5ffe7_inputTextarea {\n height: auto;\n min-height: 72px;\n padding: 8px 12px;\n resize: vertical;\n}\n\n\n._b5886f05_personaBriefRow {\n display: flex;\n align-items: center;\n gap: 4px;\n min-width: 0;\n}\n\n._ee45acf7_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._1d900a64_personaBriefEmpty {\n color: var(--dsw-alias-label-tertiary);\n}\n\n\n._5ecb2b94_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._90bd6054_inputInvalid,\n._90bd6054_inputInvalid:focus-visible {\n border-color: var(--dsw-alias-state-error-primary);\n}\n\n\nselect._b82bc091_input {\n max-width: 240px;\n cursor: pointer;\n}\n\n\n._261230a1_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._adeed03f_numberFields {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(160px, 1fr));\n gap: 12px;\n}\n\n._adeed03f_numberFields ._a72f7f8d_field {\n padding: 0;\n}\n\n._8c756cfb_list {\n display: flex;\n flex-direction: column;\n gap: 8px;\n margin-top: 4px;\n}\n\n\n._bba0bbe4_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._87c4f7f9_cardFoot {\n display: flex;\n justify-content: flex-end;\n}\n\n._fce20e49_ruleGrid {\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n}\n\n._cfc66c5d_ruleCell {\n display: flex;\n flex-direction: column;\n gap: 4px;\n min-width: 120px;\n flex: 1;\n}\n\n._9d4091c5_ruleCellLabel {\n font-size: 12px;\n line-height: 18px;\n color: var(--dsw-alias-label-secondary);\n}\n\n\n._8e7f566e_chevron {\n flex: none;\n color: var(--dsw-alias-label-tertiary);\n transform: rotate(-90deg);\n transition: transform .16s;\n}\n\n._7dbaf9ce_chevronOpen {\n transform: none;\n}\n\n\n._ae6bf76d_chevronFlip {\n transform: rotate(180deg);\n}\n\n\n._e93c9e2c_collapseRow {\n display: flex;\n align-items: center;\n gap: 8px;\n min-width: 0;\n}\n\n._0934b8f4_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._0934b8f4_collapseToggle:disabled {\n cursor: default;\n}\n\n._1133fbee_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._d82ef63d_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._b134c585_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._0e70e355_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._f3b7ca50_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._9216af96_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._e6c0e39f_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._0849b09f_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._0849b09f_dragHandle:hover:not(:disabled) {\n background: var(--dsw-alias-interactive-bg-hover);\n color: var(--dsw-alias-label-primary);\n}\n\n._0849b09f_dragHandle:active {\n cursor: grabbing;\n}\n\n._0849b09f_dragHandle:disabled {\n cursor: default;\n opacity: 0.4;\n}\n\n._0849b09f_dragHandle:focus-visible {\n outline: none;\n box-shadow: 0 0 0 2px var(--dsw-alias-border-l3);\n}\n\n\n._83fb72f8_slotCardDragging {\n opacity: 0.45;\n}\n\n._5d67996b_slotCardOver {\n outline: 1px dashed var(--dsw-alias-brand-primary);\n outline-offset: 2px;\n}\n\n\n._d8f6c9e3_selectorRowDragging {\n opacity: 0.45;\n}\n\n._49b56db4_selectorRowOver {\n outline: 1px dashed var(--dsw-alias-brand-primary);\n outline-offset: 2px;\n border-radius: 6px;\n}\n\n\n._13d58efe_selectorGrip {\n flex: none;\n}\n\n._13d58efe_selectorGrip:disabled {\n display: none;\n}\n\n\n._bfe77c29_chainBlock {\n display: flex;\n flex-direction: column;\n gap: 6px;\n}\n\n\n._428b5d1a_chainSelectors {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n\n._c190e3f0_selectorLine {\n display: flex;\n align-items: center;\n gap: 8px;\n flex-wrap: nowrap;\n \n min-height: 32px;\n}\n\n\n._6534b816_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._334a37c3_selectorProviderCell {\n flex: 0 1 clamp(140px, 20%, 220px);\n min-width: 0;\n}\n\n._63065c63_selectorModelCell {\n flex: 1 1 auto;\n min-width: 0;\n}\n\n\n._63065c63_selectorModelCell > select._b82bc091_input {\n max-width: 100%;\n}\n\n\n._9222de4f_selectorHint {\n display: flex;\n align-items: center;\n flex: 0 1 auto;\n min-width: 0;\n}\n\n\n._b3f9f018_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._9222de4f_selectorHint > ._9cdfc0a6_infoHint {\n flex: none;\n margin-left: 4px;\n}\n\n\n._832cfce6_selectorRemove {\n flex: none;\n opacity: 0;\n transition: opacity .12s;\n}\n\n\n._832cfce6_selectorRemove:disabled {\n display: none;\n}\n\n\n._15ebf4ae_selectorRow:hover ._832cfce6_selectorRemove:not(:disabled),\n._15ebf4ae_selectorRow:focus-within ._832cfce6_selectorRemove:not(:disabled) {\n opacity: 1;\n}\n\n@media (hover: none) {\n ._832cfce6_selectorRemove:not(:disabled) {\n opacity: 0.7;\n }\n}\n\n\n._572ba95a_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._572ba95a_iconButton:disabled {\n opacity: 0.4;\n cursor: default;\n}\n\n._572ba95a_iconButton:hover:not(:disabled) {\n background: var(--dsw-alias-interactive-bg-hover);\n color: var(--dsw-alias-label-primary);\n}\n\n._572ba95a_iconButton:focus-visible {\n outline: none;\n box-shadow: 0 0 0 2px var(--dsw-alias-border-l3);\n}\n\n._572ba95a_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._572ba95a_iconButton:hover::after,\n._572ba95a_iconButton:focus-visible::after {\n opacity: 1;\n}\n\n\n._dce04c19_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._60ce2a17_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._60ce2a17_outlineButton:hover:not(:disabled) {\n color: var(--dsw-alias-label-primary);\n border-color: var(--dsw-alias-label-dimmed);\n}\n\n._60ce2a17_outlineButton:disabled {\n opacity: 0.4;\n cursor: default;\n}\n\n._60ce2a17_outlineButton:focus-visible {\n outline: 2px solid var(--dsw-alias-brand-primary);\n outline-offset: 1px;\n}\n\n\n._0b13c716_addButton {\n align-self: flex-start;\n}\n\n\n._bfe77c29_chainBlock > ._0b13c716_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._bfe77c29_chainBlock > ._0b13c716_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._bfe77c29_chainBlock > ._0b13c716_addButton:focus-visible {\n outline: none;\n box-shadow: 0 0 0 2px var(--dsw-alias-border-l3);\n}\n\n\n._26e91326_slotAddRow {\n display: flex;\n align-items: center;\n gap: 8px;\n margin-top: 4px;\n flex-wrap: wrap;\n}\n\n\n._007c1b38_rowActions {\n display: flex;\n align-items: center;\n gap: 4px;\n}\n\n\n._9320e17f_discard,\n._c8248e0e_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._9320e17f_discard {\n border-color: var(--dsw-alias-border-l2);\n background: none;\n color: var(--dsw-alias-label-secondary);\n}\n\n._9320e17f_discard:hover:not(:disabled) {\n color: var(--dsw-alias-label-primary);\n border-color: var(--dsw-alias-label-dimmed);\n}\n\n._c8248e0e_save {\n background: var(--dsw-alias-label-primary);\n color: var(--dsw-alias-bg-layer-3);\n}\n\n._9320e17f_discard:disabled,\n._c8248e0e_save:disabled {\n opacity: 0.4;\n cursor: default;\n}\n\n._9320e17f_discard:focus-visible,\n._c8248e0e_save:focus-visible {\n outline: 2px solid var(--dsw-alias-brand-primary);\n outline-offset: 1px;\n}\n\n\n._7d807542_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._2d5242e9_statusTitle {\n font-size: 12px;\n line-height: 18px;\n font-weight: 500;\n color: var(--dsw-alias-label-secondary);\n}\n\n\n._06913287_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._b5c76c1f_statusLineLabel {\n font-weight: 500;\n color: var(--dsw-alias-label-secondary);\n}\n\n\n._0d87013f_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._0ebbca28_policyStatusText {\n display: flex;\n flex-direction: column;\n gap: 6px;\n}\n\n._c1a1a4b8_policyStatusSync {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: 6px;\n}\n\n\n._59029705_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._f899bec7_policyStatusLabel {\n font-size: 12px;\n font-weight: 600;\n line-height: 18px;\n color: var(--dsw-alias-label-secondary);\n}\n\n._68ef287d_policyStatusLine {\n font-size: 12px;\n line-height: 18px;\n color: var(--dsw-alias-label-primary);\n}\n\n._67addcbf_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 ._572ba95a_iconButton::after,\n ._9cdfc0a6_infoHint::after {\n transition: none;\n }\n\n ._8e7f566e_chevron {\n transition: none;\n }\n}\n";
172
172
  const tagId$4 = "dsh-fallback-router/FallbacksCard.module.css";
173
173
  if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId$4) + "]") === null) {
174
174
  const tag = document.createElement("style");
@@ -503,7 +503,7 @@ window.__ModuleLoader__.load({
503
503
  return out;
504
504
  }
505
505
  //#endregion
506
- //#region \0dsh-css:D:\Repos\dsh-llm-router\src\client\ModelsPanel.module.css.mjs
506
+ //#region \0dsh-css:/home/runner/work/dsh-fallback-router/dsh-fallback-router/src/client/ModelsPanel.module.css.mjs
507
507
  const css$3 = "\n\n._c1b3c26c_panel {\n display: flex;\n flex-direction: column;\n gap: 16px;\n min-width: 0;\n}\n\n._666e6b5d_cards {\n display: flex;\n flex-direction: column;\n gap: 10px;\n margin-top: 4px;\n min-width: 0;\n}\n\n._070bb53c_card {\n display: flex;\n flex-direction: column;\n gap: 14px;\n min-width: 0;\n padding: 14px 16px;\n border-radius: 12px;\n background: var(--dsw-alias-bg-module-platform);\n}\n\n._d83cbbbe_cardHead {\n display: flex;\n align-items: center;\n gap: 8px;\n min-width: 0;\n}\n\n._b3a9407a_cardTitle {\n flex: 1 1 auto;\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\n\n._eb328c21_group {\n display: flex;\n flex-direction: column;\n gap: 8px;\n min-width: 0;\n}\n\n._1634974d_groupTitle {\n font-size: 13px;\n line-height: 20px;\n font-weight: 500;\n color: var(--dsw-alias-label-primary);\n}\n\n\n\n._10eb2316_grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));\n gap: 10px;\n min-width: 0;\n}\n\n._41343a46_cell {\n display: flex;\n flex-direction: column;\n gap: 4px;\n min-width: 0;\n}\n\n._87af396c_cellLabel {\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\n\n._a2c470a2_row {\n display: flex;\n flex-wrap: wrap;\n align-items: flex-end;\n gap: 10px;\n min-width: 0;\n}\n\n._e9775e88_rowMid {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: 8px;\n min-width: 0;\n}\n\n\n._ee1b76c6_rowField {\n display: flex;\n flex-direction: column;\n gap: 4px;\n flex: 0 0 auto;\n min-width: 0;\n}\n\n._0fef9eb1_grow {\n flex: 1 1 180px;\n min-width: 150px;\n}\n\n._21606582_w90 { width: 90px; }\n\n._39a847b7_w110 { width: 110px; }\n\n._2da3b7a5_w130 { width: 130px; }\n\n._23925ec6_w180 { width: 180px; }\n\n\n._1fef9bb0_chipRow {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n flex: 0 0 auto;\n height: 34px;\n font-size: 13px;\n line-height: 20px;\n color: var(--dsw-alias-label-primary);\n white-space: nowrap;\n cursor: pointer;\n}\n\n\n\n._c529eca5_chips {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: 6px 16px;\n min-width: 0;\n}\n\n._e0ca1b94_chip {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n font-size: 13px;\n line-height: 22px;\n color: var(--dsw-alias-label-primary);\n white-space: nowrap;\n cursor: pointer;\n}\n\n._e0ca1b94_chip input,\n._1fef9bb0_chipRow input,\n._03deab5c_day input {\n flex: 0 0 auto;\n margin: 0;\n}\n\n\n\n._46877afd_days {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: 4px;\n}\n\n._03deab5c_day {\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 white-space: nowrap;\n cursor: pointer;\n}\n\n._b3aafe93_arrow {\n flex: 0 0 auto;\n font-size: 12px;\n line-height: 34px;\n color: var(--dsw-alias-label-tertiary);\n}\n\n\n\n._5cd75b59_iconBtn {\n appearance: none;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex: 0 0 auto;\n width: 28px;\n height: 28px;\n padding: 0;\n border: 0;\n border-radius: 6px;\n background: none;\n font: inherit;\n font-size: 12px;\n color: var(--dsw-alias-label-tertiary);\n cursor: pointer;\n}\n\n._5cd75b59_iconBtn:hover:not(:disabled) {\n background: var(--dsw-alias-bg-layer-3);\n color: var(--dsw-alias-label-primary);\n}\n\n._5cd75b59_iconBtn:disabled {\n opacity: 0.5;\n cursor: default;\n}\n\n._3a75da7f_addBtn {\n appearance: none;\n align-self: flex-start;\n padding: 4px 12px;\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._3a75da7f_addBtn:hover:not(:disabled) {\n color: var(--dsw-alias-label-primary);\n border-color: var(--dsw-alias-border-l3);\n}\n\n._3a75da7f_addBtn:disabled {\n opacity: 0.5;\n cursor: default;\n}\n";
508
508
  const tagId$3 = "dsh-fallback-router/ModelsPanel.module.css";
509
509
  if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId$3) + "]") === null) {
@@ -2160,8 +2160,8 @@ window.__ModuleLoader__.load({
2160
2160
  };
2161
2161
  [...defaultFallbacksConfig.triggerCodes];
2162
2162
  //#endregion
2163
- //#region \0dsh-css:D:\Repos\dsh-llm-router\src\client\GeneralFallbacksRow.module.css.mjs
2164
- const css$2 = "\r\n\r\n._ca8f2965_row {\r\n display: flex;\r\n align-items: center;\r\n gap: 8px;\r\n padding: 16px 0;\r\n border-bottom: 1px solid var(--dsw-alias-border-l2);\r\n}\r\n\r\n._c8d611be_rowText {\r\n flex: 1;\r\n min-width: 0;\r\n display: flex;\r\n flex-direction: column;\r\n gap: 4px;\r\n padding-right: 48px;\r\n}\r\n\r\n._6c90d81f_title {\r\n font-size: 14px;\r\n font-weight: 400;\r\n line-height: 22px;\r\n color: var(--dsw-alias-label-primary);\r\n}\r\n\r\n\r\n._71e34951_summary {\r\n font-size: 12px;\r\n line-height: 18px;\r\n color: var(--dsw-alias-label-tertiary);\r\n white-space: nowrap;\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n}\r\n\r\n\r\n._dbfcb0f6_badge {\r\n flex: none;\r\n padding: 2px 10px;\r\n border-radius: 9px;\r\n font-size: 12px;\r\n line-height: 18px;\r\n background: var(--dsw-alias-bg-module-platform);\r\n color: var(--dsw-alias-label-tertiary);\r\n}\r\n\r\n._e0b4af03_badgeEnabled {\r\n color: var(--dsw-alias-state-success-primary);\r\n}\r\n";
2163
+ //#region \0dsh-css:/home/runner/work/dsh-fallback-router/dsh-fallback-router/src/client/GeneralFallbacksRow.module.css.mjs
2164
+ const css$2 = "\n\n._ca8f2965_row {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 16px 0;\n border-bottom: 1px solid var(--dsw-alias-border-l2);\n}\n\n._c8d611be_rowText {\n flex: 1;\n min-width: 0;\n display: flex;\n flex-direction: column;\n gap: 4px;\n padding-right: 48px;\n}\n\n._6c90d81f_title {\n font-size: 14px;\n font-weight: 400;\n line-height: 22px;\n color: var(--dsw-alias-label-primary);\n}\n\n\n._71e34951_summary {\n font-size: 12px;\n line-height: 18px;\n color: var(--dsw-alias-label-tertiary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n\n._dbfcb0f6_badge {\n flex: none;\n padding: 2px 10px;\n border-radius: 9px;\n font-size: 12px;\n line-height: 18px;\n background: var(--dsw-alias-bg-module-platform);\n color: var(--dsw-alias-label-tertiary);\n}\n\n._e0b4af03_badgeEnabled {\n color: var(--dsw-alias-state-success-primary);\n}\n";
2165
2165
  const tagId$2 = "dsh-fallback-router/GeneralFallbacksRow.module.css";
2166
2166
  if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId$2) + "]") === null) {
2167
2167
  const tag = document.createElement("style");
@@ -2287,8 +2287,8 @@ window.__ModuleLoader__.load({
2287
2287
  return typeof from?.provider === "string" && typeof from?.model === "string" && typeof to?.provider === "string" && typeof to?.model === "string";
2288
2288
  }
2289
2289
  //#endregion
2290
- //#region \0dsh-css:D:\Repos\dsh-llm-router\src\client\ConversationFallbackSwitch.module.css.mjs
2291
- const css$1 = "\r\n\r\n._ccce8bff_switchRow {\r\n display: flex;\r\n align-items: center;\r\n padding: 2px 0;\r\n font-size: 14px;\r\n line-height: 24px;\r\n}\r\n\r\n\r\n._b5489dcd_switchTitle {\r\n flex: none;\r\n color: var(--dsw-alias-state-warn-primary);\r\n}\r\n\r\n._690b095b_switchSep {\r\n flex: none;\r\n width: 2px;\r\n height: 2px;\r\n margin: 0 8px;\r\n border-radius: 1px;\r\n background: var(--dsw-alias-label-caption);\r\n}\r\n\r\n\r\n._8749463f_switchSummary {\r\n flex: 1 1 auto;\r\n min-width: 0;\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n white-space: nowrap;\r\n color: var(--dsw-alias-label-tertiary);\r\n}\r\n\r\n\r\n._11cf2c8c_roleBadge {\r\n flex: none;\r\n max-width: 96px;\r\n padding: 0 8px;\r\n border-radius: 999px;\r\n font-size: 12px;\r\n line-height: 20px;\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n white-space: nowrap;\r\n background: var(--dsw-alias-bg-module-platform);\r\n color: var(--dsw-alias-label-primary);\r\n}\r\n\r\n\r\n._39c00738_roleModelMap {\r\n flex: 0 1 auto;\r\n min-width: 0;\r\n margin-left: 8px;\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n white-space: nowrap;\r\n color: var(--dsw-alias-label-secondary);\r\n}\r\n";
2290
+ //#region \0dsh-css:/home/runner/work/dsh-fallback-router/dsh-fallback-router/src/client/ConversationFallbackSwitch.module.css.mjs
2291
+ const css$1 = "\n\n._ccce8bff_switchRow {\n display: flex;\n align-items: center;\n padding: 2px 0;\n font-size: 14px;\n line-height: 24px;\n}\n\n\n._b5489dcd_switchTitle {\n flex: none;\n color: var(--dsw-alias-state-warn-primary);\n}\n\n._690b095b_switchSep {\n flex: none;\n width: 2px;\n height: 2px;\n margin: 0 8px;\n border-radius: 1px;\n background: var(--dsw-alias-label-caption);\n}\n\n\n._8749463f_switchSummary {\n flex: 1 1 auto;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n color: var(--dsw-alias-label-tertiary);\n}\n\n\n._11cf2c8c_roleBadge {\n flex: none;\n max-width: 96px;\n padding: 0 8px;\n border-radius: 999px;\n font-size: 12px;\n line-height: 20px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n background: var(--dsw-alias-bg-module-platform);\n color: var(--dsw-alias-label-primary);\n}\n\n\n._39c00738_roleModelMap {\n flex: 0 1 auto;\n min-width: 0;\n margin-left: 8px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n color: var(--dsw-alias-label-secondary);\n}\n";
2292
2292
  const tagId$1 = "dsh-fallback-router/ConversationFallbackSwitch.module.css";
2293
2293
  if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId$1) + "]") === null) {
2294
2294
  const tag = document.createElement("style");
@@ -2460,8 +2460,8 @@ window.__ModuleLoader__.load({
2460
2460
  return typeof value === "string" && value.trim() !== "" ? value : void 0;
2461
2461
  }
2462
2462
  //#endregion
2463
- //#region \0dsh-css:D:\Repos\dsh-llm-router\src\client\SubagentRoleBadge.module.css.mjs
2464
- const css = "\r\n\r\n._041c72bb_badge {\r\n display: inline-block;\r\n max-width: 240px;\r\n padding: 0 8px;\r\n border-radius: 999px;\r\n font-size: 12px;\r\n line-height: 20px;\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n white-space: nowrap;\r\n vertical-align: middle;\r\n background: var(--dsw-alias-bg-module-platform);\r\n color: var(--dsw-alias-label-primary);\r\n}\r\n\r\n\r\n._a23785cd_route {\r\n color: var(--dsw-alias-label-tertiary);\r\n}\r\n";
2463
+ //#region \0dsh-css:/home/runner/work/dsh-fallback-router/dsh-fallback-router/src/client/SubagentRoleBadge.module.css.mjs
2464
+ const css = "\n\n._041c72bb_badge {\n display: inline-block;\n max-width: 240px;\n padding: 0 8px;\n border-radius: 999px;\n font-size: 12px;\n line-height: 20px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n vertical-align: middle;\n background: var(--dsw-alias-bg-module-platform);\n color: var(--dsw-alias-label-primary);\n}\n\n\n._a23785cd_route {\n color: var(--dsw-alias-label-tertiary);\n}\n";
2465
2465
  const tagId = "dsh-fallback-router/SubagentRoleBadge.module.css";
2466
2466
  if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId) + "]") === null) {
2467
2467
  const tag = document.createElement("style");
package/icon.svg CHANGED
@@ -1,16 +1,16 @@
1
- <svg width="36" height="36" viewBox="0 0 36 36" fill="none" xmlns="http://www.w3.org/2000/svg">
2
- <defs>
3
- <linearGradient id="dsh-llm-fallbacks-icon-a" x1="14.9894" y1="9.0697" x2="14.9894" y2="21.3063" gradientUnits="userSpaceOnUse">
4
- <stop stop-color="#69B9FF"/>
5
- <stop offset="1" stop-color="#324DE2"/>
6
- </linearGradient>
7
- <linearGradient id="dsh-llm-fallbacks-icon-b" x1="21.1075" y1="15.1877" x2="21.1075" y2="27.4243" gradientUnits="userSpaceOnUse">
8
- <stop stop-color="#45E7A4"/>
9
- <stop offset="1" stop-color="#05909D"/>
10
- </linearGradient>
11
- </defs>
12
- <rect x="8.87109" y="9.0697" width="12.2365" height="12.2365" rx="2" fill="url(#dsh-llm-fallbacks-icon-a)" fill-opacity="0.8"/>
13
- <rect x="14.9893" y="15.1877" width="12.2365" height="12.2365" rx="2" fill="url(#dsh-llm-fallbacks-icon-b)" fill-opacity="0.8"/>
14
- <path d="M13.3 13.3L19.4 19.4" stroke="#F9FAFB" stroke-opacity="0.95" stroke-width="1.7" stroke-linecap="round"/>
15
- <path d="M19.4 15.9V19.4H15.9" stroke="#F9FAFB" stroke-opacity="0.95" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round"/>
16
- </svg>
1
+ <svg width="36" height="36" viewBox="0 0 36 36" fill="none" xmlns="http://www.w3.org/2000/svg">
2
+ <defs>
3
+ <linearGradient id="dsh-llm-fallbacks-icon-a" x1="14.9894" y1="9.0697" x2="14.9894" y2="21.3063" gradientUnits="userSpaceOnUse">
4
+ <stop stop-color="#69B9FF"/>
5
+ <stop offset="1" stop-color="#324DE2"/>
6
+ </linearGradient>
7
+ <linearGradient id="dsh-llm-fallbacks-icon-b" x1="21.1075" y1="15.1877" x2="21.1075" y2="27.4243" gradientUnits="userSpaceOnUse">
8
+ <stop stop-color="#45E7A4"/>
9
+ <stop offset="1" stop-color="#05909D"/>
10
+ </linearGradient>
11
+ </defs>
12
+ <rect x="8.87109" y="9.0697" width="12.2365" height="12.2365" rx="2" fill="url(#dsh-llm-fallbacks-icon-a)" fill-opacity="0.8"/>
13
+ <rect x="14.9893" y="15.1877" width="12.2365" height="12.2365" rx="2" fill="url(#dsh-llm-fallbacks-icon-b)" fill-opacity="0.8"/>
14
+ <path d="M13.3 13.3L19.4 19.4" stroke="#F9FAFB" stroke-opacity="0.95" stroke-width="1.7" stroke-linecap="round"/>
15
+ <path d="M19.4 15.9V19.4H15.9" stroke="#F9FAFB" stroke-opacity="0.95" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round"/>
16
+ </svg>
package/package.json CHANGED
@@ -1,138 +1,138 @@
1
- {
2
- "name": "dsh-fallback-router",
3
- "description": "Model-centric routing for DeepSeek Harness: per-model fallback (official or loop), time windows, per-provider retry and failure rules",
4
- "keywords": [
5
- "dsh",
6
- "dsh-plugin"
7
- ],
8
- "version": "0.1.0",
9
- "type": "module",
10
- "main": "./dist/index.js",
11
- "types": "./dist/index.d.ts",
12
- "icon": "./icon.svg",
13
- "exports": {
14
- ".": {
15
- "types": "./dist/index.d.ts",
16
- "default": "./dist/index.js"
17
- },
18
- "./client": {
19
- "types": "./dist/client/index.d.ts",
20
- "default": "./dist/client/index.js"
21
- },
22
- "./locale/*.json": "./locale/*.json",
23
- "./bundle/cordis.patch.yml": "./bundle/cordis.patch.yml",
24
- "./package.json": "./package.json"
25
- },
26
- "files": [
27
- "dist",
28
- "bundle",
29
- "locale",
30
- "icon.svg"
31
- ],
32
- "dsh": {
33
- "bundle": {
34
- "patch": "./bundle/cordis.patch.yml"
35
- },
36
- "client": {
37
- "inject": [
38
- "@deepseek-ai/dsh-client-ui-plugin-manager",
39
- "@deepseek-ai/dsh-client-ui-settings",
40
- "@deepseek-ai/dsh-client-ui-conversation",
41
- "@deepseek-ai/dsh-client-locale",
42
- "@deepseek-ai/dsh-client-connection",
43
- "@deepseek-ai/dsh-api-remotes"
44
- ],
45
- "platform": "web"
46
- }
47
- },
48
- "scripts": {
49
- "build": "tsc -p tsconfig.build.json && tsdown && pnpm run build-client && node scripts/strip-bundle-comments.mjs && tsc && node scripts/verify-dist.mjs",
50
- "build-client": "tsx scripts/build-client.ts",
51
- "release:prepare": "tsx scripts/prepare-release.ts",
52
- "release:validate": "tsx scripts/validate-release-version.ts",
53
- "repair:session-logs": "tsx scripts/repair-session-logs.ts",
54
- "test": "vitest run",
55
- "typecheck": "tsc -p tsconfig.build.json --noEmit && tsc --noEmit && pnpm run typecheck:scripts",
56
- "typecheck:scripts": "tsc -p tsconfig.scripts.json",
57
- "prepare": "pnpm run build"
58
- },
59
- "engines": {
60
- "node": ">=22"
61
- },
62
- "dependencies": {
63
- "use-sync-external-store": "^1.6.0"
64
- },
65
- "peerDependencies": {
66
- "@deepseek-ai/cordis": "^4.0.5",
67
- "@deepseek-ai/dsh-agent": "^0.2.1-rc.5",
68
- "@deepseek-ai/dsh-api-gateway": "^0.2.1-rc.5",
69
- "@deepseek-ai/dsh-api-remotes": "^0.2.1-rc.5",
70
- "@deepseek-ai/dsh-api-session-controller": "^0.2.1-rc.5",
71
- "@deepseek-ai/dsh-client-connection": "^0.2.1-rc.5",
72
- "@deepseek-ai/dsh-client-locale": "^0.2.1-rc.5",
73
- "@deepseek-ai/dsh-client-store": "^0.2.1-rc.5",
74
- "@deepseek-ai/dsh-client-ui-chat": "^0.2.1-rc.5",
75
- "@deepseek-ai/dsh-client-ui-conversation": "^0.2.1-rc.5",
76
- "@deepseek-ai/dsh-client-ui-plugin-manager": "^0.2.1-rc.5",
77
- "@deepseek-ai/dsh-client-ui-renderer": "^0.2.1-rc.5",
78
- "@deepseek-ai/dsh-client-ui-settings": "^0.2.1-rc.5",
79
- "@deepseek-ai/dsh-client-ui-slots": "^0.2.1-rc.5",
80
- "@deepseek-ai/dsh-commands": "^0.2.1-rc.5",
81
- "@deepseek-ai/dsh-llm": "^0.2.1-rc.5",
82
- "@deepseek-ai/dsh-llm-retry": "^0.2.1-rc.5",
83
- "@deepseek-ai/dsh-session": "^0.2.1-rc.5",
84
- "@deepseek-ai/dsh-session-projection": "^0.2.1-rc.5",
85
- "@deepseek-ai/dsh-settings": "^0.2.1-rc.5",
86
- "@deepseek-ai/dsh-system-prompt": "^0.2.1-rc.5",
87
- "@deepseek-ai/dsh-tool-subagent": "^0.2.1-rc.5",
88
- "@deepseek-ai/dsh-typert-protocol": "^0.2.1-rc.5",
89
- "@deepseek-ai/dsh-typert-registry": "^0.2.1-rc.5",
90
- "@deepseek-ai/schemastery": "^3.18.5",
91
- "react": "^18.2.0"
92
- },
93
- "devDependencies": {
94
- "@shikijs/langs": "^4.4.3",
95
- "@testing-library/dom": "^10.4.1",
96
- "@testing-library/react": "^16.3.2",
97
- "@types/mdast": "^4.0.4",
98
- "@types/node": "^22.20.0",
99
- "@types/react": "~18.3.31",
100
- "@types/react-dom": "~18.3.7",
101
- "@types/use-sync-external-store": "^1.5.0",
102
- "anser": "^2.3.5",
103
- "clsx": "^2.1.1",
104
- "immer": "^10.2.0",
105
- "jsdom": "29.1.1",
106
- "katex": "^0.18.2",
107
- "mdast-util-from-markdown": "^2.0.3",
108
- "mdast-util-gfm": "^3.1.0",
109
- "mdast-util-math": "^3.0.0",
110
- "micromark-core-commonmark": "^2.0.3",
111
- "micromark-extension-gfm": "^3.0.0",
112
- "micromark-extension-math": "^3.1.0",
113
- "micromark-factory-space": "^2.0.1",
114
- "micromark-util-character": "^2.1.1",
115
- "micromark-util-classify-character": "^2.0.1",
116
- "micromark-util-sanitize-uri": "^2.0.1",
117
- "micromark-util-symbol": "^2.0.1",
118
- "micromark-util-types": "^2.0.2",
119
- "react": "^18.3.1",
120
- "react-dom": "^18.3.1",
121
- "shiki": "^4.4.3",
122
- "tsdown": "^0.22.2",
123
- "tsx": "^4.22.4",
124
- "typescript": "^5.9.3",
125
- "vitest": "^4.1.12",
126
- "zustand": "~4.4.7"
127
- },
128
- "repository": {
129
- "type": "git",
130
- "url": "git+https://github.com/hongxin-y/dsh-fallback-router.git"
131
- },
132
- "homepage": "https://github.com/hongxin-y/dsh-fallback-router#readme",
133
- "bugs": {
134
- "url": "https://github.com/hongxin-y/dsh-fallback-router/issues"
135
- },
136
- "author": "hongxin-y",
137
- "license": "MIT"
138
- }
1
+ {
2
+ "name": "dsh-fallback-router",
3
+ "description": "Model-centric routing for DeepSeek Harness: per-model fallback (official or loop), time windows, per-provider retry and failure rules",
4
+ "keywords": [
5
+ "dsh",
6
+ "dsh-plugin"
7
+ ],
8
+ "version": "0.1.1-alpha.1",
9
+ "type": "module",
10
+ "main": "./dist/index.js",
11
+ "types": "./dist/index.d.ts",
12
+ "icon": "./icon.svg",
13
+ "exports": {
14
+ ".": {
15
+ "types": "./dist/index.d.ts",
16
+ "default": "./dist/index.js"
17
+ },
18
+ "./client": {
19
+ "types": "./dist/client/index.d.ts",
20
+ "default": "./dist/client/index.js"
21
+ },
22
+ "./locale/*.json": "./locale/*.json",
23
+ "./bundle/cordis.patch.yml": "./bundle/cordis.patch.yml",
24
+ "./package.json": "./package.json"
25
+ },
26
+ "files": [
27
+ "dist",
28
+ "bundle",
29
+ "locale",
30
+ "icon.svg"
31
+ ],
32
+ "dsh": {
33
+ "bundle": {
34
+ "patch": "./bundle/cordis.patch.yml"
35
+ },
36
+ "client": {
37
+ "inject": [
38
+ "@deepseek-ai/dsh-client-ui-plugin-manager",
39
+ "@deepseek-ai/dsh-client-ui-settings",
40
+ "@deepseek-ai/dsh-client-ui-conversation",
41
+ "@deepseek-ai/dsh-client-locale",
42
+ "@deepseek-ai/dsh-client-connection",
43
+ "@deepseek-ai/dsh-api-remotes"
44
+ ],
45
+ "platform": "web"
46
+ }
47
+ },
48
+ "scripts": {
49
+ "build": "tsc -p tsconfig.build.json && tsdown && pnpm run build-client && node scripts/strip-bundle-comments.mjs && tsc && node scripts/verify-dist.mjs",
50
+ "build-client": "tsx scripts/build-client.ts",
51
+ "release:prepare": "tsx scripts/prepare-release.ts",
52
+ "release:validate": "tsx scripts/validate-release-version.ts",
53
+ "repair:session-logs": "tsx scripts/repair-session-logs.ts",
54
+ "test": "vitest run",
55
+ "typecheck": "tsc -p tsconfig.build.json --noEmit && tsc --noEmit && pnpm run typecheck:scripts",
56
+ "typecheck:scripts": "tsc -p tsconfig.scripts.json",
57
+ "prepare": "pnpm run build"
58
+ },
59
+ "engines": {
60
+ "node": ">=22"
61
+ },
62
+ "dependencies": {
63
+ "use-sync-external-store": "^1.6.0"
64
+ },
65
+ "peerDependencies": {
66
+ "@deepseek-ai/cordis": "^4.0.5",
67
+ "@deepseek-ai/dsh-agent": "^0.2.1-rc.5",
68
+ "@deepseek-ai/dsh-api-gateway": "^0.2.1-rc.5",
69
+ "@deepseek-ai/dsh-api-remotes": "^0.2.1-rc.5",
70
+ "@deepseek-ai/dsh-api-session-controller": "^0.2.1-rc.5",
71
+ "@deepseek-ai/dsh-client-connection": "^0.2.1-rc.5",
72
+ "@deepseek-ai/dsh-client-locale": "^0.2.1-rc.5",
73
+ "@deepseek-ai/dsh-client-store": "^0.2.1-rc.5",
74
+ "@deepseek-ai/dsh-client-ui-chat": "^0.2.1-rc.5",
75
+ "@deepseek-ai/dsh-client-ui-conversation": "^0.2.1-rc.5",
76
+ "@deepseek-ai/dsh-client-ui-plugin-manager": "^0.2.1-rc.5",
77
+ "@deepseek-ai/dsh-client-ui-renderer": "^0.2.1-rc.5",
78
+ "@deepseek-ai/dsh-client-ui-settings": "^0.2.1-rc.5",
79
+ "@deepseek-ai/dsh-client-ui-slots": "^0.2.1-rc.5",
80
+ "@deepseek-ai/dsh-commands": "^0.2.1-rc.5",
81
+ "@deepseek-ai/dsh-llm": "^0.2.1-rc.5",
82
+ "@deepseek-ai/dsh-llm-retry": "^0.2.1-rc.5",
83
+ "@deepseek-ai/dsh-session": "^0.2.1-rc.5",
84
+ "@deepseek-ai/dsh-session-projection": "^0.2.1-rc.5",
85
+ "@deepseek-ai/dsh-settings": "^0.2.1-rc.5",
86
+ "@deepseek-ai/dsh-system-prompt": "^0.2.1-rc.5",
87
+ "@deepseek-ai/dsh-tool-subagent": "^0.2.1-rc.5",
88
+ "@deepseek-ai/dsh-typert-protocol": "^0.2.1-rc.5",
89
+ "@deepseek-ai/dsh-typert-registry": "^0.2.1-rc.5",
90
+ "@deepseek-ai/schemastery": "^3.18.5",
91
+ "react": "^18.2.0"
92
+ },
93
+ "devDependencies": {
94
+ "@shikijs/langs": "^4.4.3",
95
+ "@testing-library/dom": "^10.4.1",
96
+ "@testing-library/react": "^16.3.2",
97
+ "@types/mdast": "^4.0.4",
98
+ "@types/node": "^22.20.0",
99
+ "@types/react": "~18.3.31",
100
+ "@types/react-dom": "~18.3.7",
101
+ "@types/use-sync-external-store": "^1.5.0",
102
+ "anser": "^2.3.5",
103
+ "clsx": "^2.1.1",
104
+ "immer": "^10.2.0",
105
+ "jsdom": "29.1.1",
106
+ "katex": "^0.18.2",
107
+ "mdast-util-from-markdown": "^2.0.3",
108
+ "mdast-util-gfm": "^3.1.0",
109
+ "mdast-util-math": "^3.0.0",
110
+ "micromark-core-commonmark": "^2.0.3",
111
+ "micromark-extension-gfm": "^3.0.0",
112
+ "micromark-extension-math": "^3.1.0",
113
+ "micromark-factory-space": "^2.0.1",
114
+ "micromark-util-character": "^2.1.1",
115
+ "micromark-util-classify-character": "^2.0.1",
116
+ "micromark-util-sanitize-uri": "^2.0.1",
117
+ "micromark-util-symbol": "^2.0.1",
118
+ "micromark-util-types": "^2.0.2",
119
+ "react": "^18.3.1",
120
+ "react-dom": "^18.3.1",
121
+ "shiki": "^4.4.3",
122
+ "tsdown": "^0.22.2",
123
+ "tsx": "^4.22.4",
124
+ "typescript": "^5.9.3",
125
+ "vitest": "^4.1.12",
126
+ "zustand": "~4.4.7"
127
+ },
128
+ "repository": {
129
+ "type": "git",
130
+ "url": "git+https://github.com/hongxin-y/dsh-fallback-router.git"
131
+ },
132
+ "homepage": "https://github.com/hongxin-y/dsh-fallback-router#readme",
133
+ "bugs": {
134
+ "url": "https://github.com/hongxin-y/dsh-fallback-router/issues"
135
+ },
136
+ "author": "hongxin-y",
137
+ "license": "MIT"
138
+ }