dsh-model-extension 1.3.3-alpha.1 → 1.3.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,7 +1,7 @@
1
1
  # dsh-model-extension
2
2
  > 基于 deepseek-harness 的模型扩展插件
3
3
 
4
- [![License: MIT](https://img.shields.io/badge/license-MIT-blue.svg)](./LICENSE) [![npm](https://img.shields.io/npm/v/dsh-model-extension.svg?label=npm&labelColor=000000&color=ff4b01)](https://www.npmjs.com/package/dsh-model-extension) [![DeepSeek Harness:0.2.0-rc.1](https://img.shields.io/badge/DeepSeek%20Harness-0.2.0--rc.1-success.svg?labelColor=4D6BFE)](https://github.com/deepseek-ai/deepseek-harness) [![Desktop: supported](https://img.shields.io/badge/Desktop-supported-success.svg?labelColor=4D6BFE)](#安装)
4
+ [![License: MIT](https://img.shields.io/badge/license-MIT-blue.svg)](./LICENSE) [![npm](https://img.shields.io/npm/v/dsh-model-extension.svg?label=npm&labelColor=000000&color=ff4b01)](https://www.npmjs.com/package/dsh-model-extension) [![DeepSeek Harness:0.2.1-rc.2](https://img.shields.io/badge/DeepSeek%20Harness-0.2.1--rc.2-success.svg?labelColor=4D6BFE)](https://github.com/deepseek-ai/deepseek-harness) [![Desktop: supported](https://img.shields.io/badge/Desktop-supported-success.svg?labelColor=4D6BFE)](#安装)
5
5
 
6
6
  | 供应商 | 模型 |
7
7
  | --- | --- |
@@ -20,7 +20,7 @@
20
20
  - API 密钥字段与官方模型页同一套口径:优先使用已保存的凭据,其次按顺序回落到启动环境、`$cwd/.env`、`$DSH_HOME/.env`;字段旁提供认证说明气泡与密钥显示/隐藏切换,并如实提示环境变量的检测结果。
21
21
  - 支持通过 `models.json` 元数据自动预填。可通过插件下载或自行下载并放到 `$DSH_HOME/models.json` 供插件使用。
22
22
  - **仅支持`https://models.dev/models.json`数据格式**。
23
- - 支持 **DeepSeek 账号**路由(`deepseek-account`):置顶显示,无可用模型时整行隐藏;编辑卡片只含模型目录(账号不使用 API 密钥与地址)。
23
+ - 支持 **DeepSeek 账号**路由(`deepseek-account`):置顶显示,无可用模型时整行隐藏;模型目录由账号的 `/models` 列表提供,本页只读展示登录状态(单模型覆盖请在 `cordis.patch.yml` 的 `modelOverrides` 中配置)。
24
24
  - 所有保存走 DSH 原生 `settings.mutate`,落盘 `$DSH_HOME/settings.yaml`。
25
25
 
26
26
  ## 安装
@@ -55,6 +55,9 @@ npm run build
55
55
  ## 版本历史
56
56
 
57
57
  - **1.3.3**
58
+ - 更改插件兼容性定义为 engines.dsh
59
+ - 💪适配 deepseek harness 0.2.1-rc.2
60
+ - npm publish 1.3.3
58
61
  - **1.3.3-alpha.1**
59
62
  - 💪同步官方API密钥保存&读取策略
60
63
  - 💪其他UI优化
package/lib/client.js CHANGED
@@ -3,7 +3,7 @@ window.__ModuleLoader__.load({
3
3
  factory: (require) => {
4
4
  var module = { exports: {} };
5
5
  var exports = module.exports;
6
- var __extCss = "._5ikCMa_section{max-width:720px;color:var(--dsw-alias-label-primary);flex-direction:column;gap:12px;display:flex}._5ikCMa_titleRow{align-items:center;gap:10px;display:flex}._5ikCMa_title{color:var(--dsw-alias-label-primary);margin:0;font-size:16px;font-weight:500;line-height:24px}._5ikCMa_intro{color:var(--dsw-alias-label-tertiary);margin:0;font-size:14px;line-height:22px}._5ikCMa_savedNotice{color:var(--dsw-alias-state-success-primary);margin:0;font-size:12px;line-height:18px}._5ikCMa_notice{color:var(--dsw-alias-state-warn-label);margin:0;font-size:12px;line-height:18px}._5ikCMa_error{color:var(--dsw-alias-state-error-primary);margin:0;font-size:12px;line-height:18px}._5ikCMa_rows{flex-direction:column;gap:8px;margin:12px 0 0;padding:0;list-style:none;display:flex}._5ikCMa_rowCard{border:.5px solid var(--dsw-alias-border-l4);border-radius:16px;flex-direction:column;gap:12px;padding:12px 14px;display:flex}._5ikCMa_rowHead{align-items:center;gap:10px;display:flex}._5ikCMa_rowIdentity{align-items:center;gap:6px;min-width:0;display:inline-flex}._5ikCMa_rowName{color:var(--dsw-alias-label-primary);font-size:14px;font-weight:500;line-height:22px}._5ikCMa_rowTag{border:.5px solid var(--dsw-alias-border-l3);color:var(--dsw-alias-label-secondary);border-radius:4px;flex:none;padding:1px 6px;font-size:11px;line-height:16px}._5ikCMa_credentialDot{box-sizing:border-box;border-radius:50%;flex:none;width:8px;height:8px;display:inline-block}._5ikCMa_credentialDotConfigured{background:var(--dsw-alias-state-success-primary)}._5ikCMa_credentialDotMissing{background:var(--dsw-alias-state-error-primary)}._5ikCMa_rowActions{align-items:center;gap:4px;margin-left:auto;display:inline-flex}._5ikCMa_primaryButton,._5ikCMa_secondaryButton,._5ikCMa_addButton{box-sizing:border-box;height:36px;font:inherit;cursor:pointer;border:none;border-radius:18px;justify-content:center;align-items:center;gap:4px;padding:0 14px;font-size:14px;line-height:22px;display:inline-flex}._5ikCMa_primaryButton{background:var(--dsw-alias-button-primary-fill);color:var(--dsw-alias-label-primary-foreground)}._5ikCMa_primaryButton:hover:not(:disabled){background:var(--dsw-alias-button-primary-hover)}._5ikCMa_secondaryButton,._5ikCMa_addButton{border:.5px solid var(--dsw-alias-border-l3);color:var(--dsw-alias-label-primary);background:0 0}._5ikCMa_secondaryButton:hover:not(:disabled),._5ikCMa_addButton:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover)}._5ikCMa_secondaryButton:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover-solid)}._5ikCMa_dangerButton{box-sizing:border-box;height:36px;color:var(--dsw-alias-state-error-primary);font:inherit;cursor:pointer;background:0 0;border:none;border-radius:18px;justify-content:center;align-items:center;padding:0 14px;font-size:14px;line-height:22px;display:inline-flex}._5ikCMa_dangerButton:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover-danger)}._5ikCMa_rowActions ._5ikCMa_secondaryButton,._5ikCMa_rowActions ._5ikCMa_dangerButton{border-radius:14px;height:28px;padding:0 10px;font-size:12px;line-height:18px}._5ikCMa_primaryButton:disabled,._5ikCMa_secondaryButton:disabled,._5ikCMa_dangerButton:disabled,._5ikCMa_addButton:disabled,._5ikCMa_linkButton:disabled,._5ikCMa_addModelButton:disabled{opacity:.4;cursor:default}._5ikCMa_primaryButton:focus-visible,._5ikCMa_secondaryButton:focus-visible,._5ikCMa_dangerButton:focus-visible,._5ikCMa_addButton:focus-visible,._5ikCMa_linkButton:focus-visible,._5ikCMa_addModelButton:focus-visible,._5ikCMa_iconButton:focus-visible,._5ikCMa_dragHandle:focus-visible,._5ikCMa_customizedSummary:focus-visible{box-shadow:0 0 0 2px var(--dsw-alias-border-l3);outline:none}._5ikCMa_editor{background:var(--dsw-alias-bg-module-platform);border-radius:12px;flex-direction:column;gap:14px;padding:14px 16px;display:flex}._5ikCMa_field{flex-direction:column;gap:6px;display:flex}._5ikCMa_fieldLabel{color:var(--dsw-alias-label-secondary);align-items:center;gap:10px;font-size:12px;font-weight:500;line-height:18px;display:inline-flex}._5ikCMa_linkButton{box-sizing:border-box;height:28px;color:var(--dsw-alias-label-tertiary);font:inherit;cursor:pointer;background:0 0;border:none;border-radius:14px;align-items:center;padding:0 10px;font-size:12px;line-height:18px;display:inline-flex}._5ikCMa_linkButton:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-secondary)}._5ikCMa_advancedHint{color:var(--dsw-alias-label-tertiary);margin:0;font-size:12px;line-height:18px}._5ikCMa_helpButton{border:.5px solid var(--dsw-alias-border-l3);corner-shape:round;width:16px;height:16px;color:var(--dsw-alias-label-tertiary);font:inherit;text-align:center;cursor:help;background:0 0;border-radius:50%;padding:0;font-size:11px;line-height:15px}._5ikCMa_helpButton:hover,._5ikCMa_helpButton:focus-visible{color:var(--dsw-alias-label-primary);border-color:var(--dsw-alias-label-tertiary)}._5ikCMa_editorActions{justify-content:flex-end;gap:8px;display:flex}._5ikCMa_addBlock{flex-direction:column;gap:12px;display:flex}._5ikCMa_addActions{flex-wrap:wrap;gap:10px;display:flex}._5ikCMa_addButton{border:1px dashed var(--dsw-alias-border-l3);border-radius:16px;flex:1 1 0;gap:6px;min-width:180px;height:44px}._5ikCMa_addCard{background:var(--dsw-alias-bg-module-platform);border-radius:12px;flex-direction:column;gap:14px;padding:14px 16px;list-style:none;display:flex}._5ikCMa_addCard ._5ikCMa_editor,._5ikCMa_setupCard ._5ikCMa_editor{background:0 0;padding:0}._5ikCMa_tabs{flex-direction:column;gap:12px;display:flex}._5ikCMa_tabBar{border-bottom:.5px solid var(--dsw-alias-border-l2);gap:4px;display:flex}._5ikCMa_tabButton{appearance:none;font:inherit;color:var(--dsw-alias-label-tertiary);cursor:pointer;background:0 0;border:none;padding:6px 12px 8px;font-size:13px;line-height:20px;position:relative}._5ikCMa_tabButton:hover{color:var(--dsw-alias-label-primary)}._5ikCMa_tabButton:disabled{opacity:.4;cursor:default}._5ikCMa_tabButtonActive{color:var(--dsw-alias-label-primary);font-weight:500}._5ikCMa_tabButtonActive:after{content:\"\";background:var(--dsw-alias-brand-primary);border-radius:2px;height:2px;position:absolute;bottom:-1px;left:10px;right:10px}._5ikCMa_tabPanel{flex-direction:column;gap:12px;display:flex}._5ikCMa_modelCatalog{flex-direction:column;gap:10px;display:flex}._5ikCMa_modelCatalogHeading{flex-direction:column;gap:2px;display:flex}._5ikCMa_modelCatalogTitle{color:var(--dsw-alias-label-secondary);font-size:12px;font-weight:500;line-height:18px}._5ikCMa_modelCatalogMeta,._5ikCMa_modelEmpty{color:var(--dsw-alias-label-tertiary);margin:0;font-size:12px;line-height:18px}._5ikCMa_modelList{flex-direction:column;gap:8px;display:flex}._5ikCMa_modelListHead{justify-content:space-between;align-items:flex-start;gap:12px;display:flex}._5ikCMa_modelEntry{border:.5px solid var(--dsw-alias-border-l4);border-radius:10px;padding:6px}._5ikCMa_modelRow{grid-template-columns:minmax(0,1.4fr) minmax(0,1fr) auto auto auto;align-items:center;gap:6px;display:grid;position:relative}._5ikCMa_modelEntryDragging{border:.5px solid var(--dsw-alias-border-l4);opacity:.5;border-radius:10px;padding:6px}._5ikCMa_dragHandle{box-sizing:border-box;width:24px;height:28px;color:var(--dsw-alias-label-tertiary);cursor:grab;touch-action:none;background:0 0;border:none;border-radius:6px;justify-content:center;align-items:center;display:inline-flex}._5ikCMa_dragHandle:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}._5ikCMa_dragHandle:active:not(:disabled){cursor:grabbing}._5ikCMa_dragHandle:disabled{cursor:default;opacity:.4}._5ikCMa_modelDropLine{background:var(--dsw-alias-brand-primary);pointer-events:none;border-radius:2px;height:2px;position:absolute;left:0;right:0}._5ikCMa_modelDropLine[data-edge=before]{top:-5px}._5ikCMa_modelDropLine[data-edge=after]{bottom:-5px}._5ikCMa_iconButton{box-sizing:border-box;width:28px;height:28px;color:var(--dsw-alias-label-tertiary);cursor:pointer;background:0 0;border:none;border-radius:6px;justify-content:center;align-items:center;display:inline-flex}._5ikCMa_iconButton:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}._5ikCMa_iconButton:disabled{cursor:default;opacity:.4}._5ikCMa_iconButtonDanger:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover-danger);color:var(--dsw-alias-state-error-primary)}._5ikCMa_modelAdvanced{grid-template-columns:repeat(auto-fit,minmax(160px,1fr));gap:8px;padding:8px 4px 2px;display:grid}._5ikCMa_capacityRow{grid-template-columns:repeat(auto-fit,minmax(160px,1fr));gap:8px;padding:0 4px;display:grid}._5ikCMa_modelField{flex-direction:column;gap:4px;display:flex}._5ikCMa_modelFieldLabel{color:var(--dsw-alias-label-tertiary);font-size:12px;line-height:18px}._5ikCMa_modelEmpty{border:1px dashed var(--dsw-alias-border-l3);text-align:center;border-radius:8px;padding:12px}._5ikCMa_addModelButton{box-sizing:border-box;border:.5px solid var(--dsw-alias-border-l3);height:28px;color:var(--dsw-alias-label-primary);font:inherit;cursor:pointer;background:0 0;border-radius:14px;align-self:flex-start;align-items:center;gap:4px;padding:0 10px;font-size:12px;line-height:18px;display:inline-flex}._5ikCMa_addModelButton:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover)}._5ikCMa_input{box-sizing:border-box;border:.5px solid var(--dsw-alias-border-l4);width:100%;height:32px;font:inherit;background:var(--dsw-alias-bg-layer-1);color:var(--dsw-alias-label-primary);border-radius:8px;padding:0 10px;font-size:14px;line-height:22px}select._5ikCMa_input{cursor:pointer;max-width:240px}._5ikCMa_input:focus{border-color:var(--dsw-alias-brand-primary);outline:none}._5ikCMa_input::placeholder{color:var(--dsw-alias-label-dimmed)}._5ikCMa_input:disabled{opacity:.6;cursor:default}._5ikCMa_keyInput{position:relative}._5ikCMa_keyInputFilled{padding-right:40px}._5ikCMa_keyToggle{border-radius:var(--dsw-radius-md);width:32px;color:var(--dsw-alias-label-secondary);cursor:pointer;background:0 0;border:none;justify-content:center;align-items:center;padding:0;display:inline-flex;position:absolute;inset:1px 1px 1px auto}._5ikCMa_keyToggle:hover:not(:disabled){color:var(--dsw-alias-label-primary)}._5ikCMa_keyToggle:focus-visible{outline:var(--dsw-focus-ring-width) solid var(--dsw-focus-ring-color,var(--dsw-alias-state-business-primary));outline-offset:-2px}._5ikCMa_keyToggle:disabled{opacity:.6;cursor:default}._5ikCMa_selectInput{appearance:none;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\");background-position:right 12px center;background-repeat:no-repeat;background-size:12px 12px;padding-right:32px}._5ikCMa_deleteDialog{width:min(480px,100%)}._5ikCMa_deleteConfirm:not(:disabled){border-color:var(--dsw-alias-state-error-primary);color:var(--dsw-alias-state-error-primary)}._5ikCMa_deleteConfirm:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover-danger)}._5ikCMa_fetchDialog{max-width:520px}._5ikCMa_candidateToolbar{align-items:center;gap:8px;margin-bottom:6px;display:flex}._5ikCMa_candidateSearch{flex:240px;min-width:0}._5ikCMa_candidateList{flex-direction:column;gap:2px;max-height:320px;margin:0;padding:0;list-style:none;display:flex;overflow-y:auto}._5ikCMa_candidate{border-radius:6px}._5ikCMa_candidateLabel{cursor:pointer;align-items:center;gap:8px;padding:6px 8px;display:flex}._5ikCMa_candidateId{overflow-wrap:anywhere;flex:auto;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:13px}._5ikCMa_candidateEmpty{color:var(--dsw-alias-label-secondary);text-align:center;margin:24px 0;font-size:13px;line-height:20px}[hidden]{display:none!important}._5ikCMa_extBlock{border:.5px solid var(--dsw-alias-border-l3);background:var(--dsw-alias-bg-layer-1);border-radius:10px;flex-direction:column;gap:10px;margin:8px 4px 2px;padding:10px;display:flex}._5ikCMa_extGroup{border-top:.5px solid var(--dsw-alias-border-l2);padding-top:12px}._5ikCMa_extGroupFirst{border-top:none;padding-top:0}._5ikCMa_extCheck{cursor:pointer;align-items:flex-start;gap:8px;display:flex}._5ikCMa_extCheckLabel{color:var(--dsw-alias-label-primary);font-size:14px;line-height:22px}._5ikCMa_extHint{color:var(--dsw-alias-label-tertiary);font-size:12px;line-height:18px}._5ikCMa_extGated{flex-direction:column;gap:12px;padding-left:2px;display:flex}._5ikCMa_extField{flex-direction:column;gap:6px;display:flex}._5ikCMa_extLabel{color:var(--dsw-alias-label-tertiary);font-size:12px;line-height:18px}._5ikCMa_extTable{border:.5px solid var(--dsw-alias-border-l4);border-radius:8px;overflow:hidden}._5ikCMa_extTHead{color:var(--dsw-alias-label-tertiary);background:var(--dsw-alias-bg-module-platform);grid-template-columns:64px minmax(0,1fr) minmax(0,1.2fr);font-size:12px;line-height:18px;display:grid}._5ikCMa_extTHead>div{padding:6px 10px}._5ikCMa_extTHead>div+div{border-left:.5px solid var(--dsw-alias-border-l2)}._5ikCMa_extTRow{border-top:.5px solid var(--dsw-alias-border-l2);grid-template-columns:64px minmax(0,1fr) minmax(0,1.2fr);align-items:center;display:grid}._5ikCMa_extTRow>div{padding:6px 10px;font-size:14px}._5ikCMa_extTRow>div+div{border-left:.5px solid var(--dsw-alias-border-l2)}._5ikCMa_extTRow input[type=text]{box-sizing:border-box;border:.5px solid var(--dsw-alias-border-l4);width:100%;height:32px;font:inherit;background:var(--dsw-alias-bg-layer-1);color:var(--dsw-alias-label-primary);border-radius:8px;padding:0 10px;font-size:14px}._5ikCMa_extTRow input[type=text]:disabled{opacity:.6;cursor:default}._5ikCMa_extCheckbox{accent-color:var(--dsw-alias-brand-primary);flex:none;width:15px;height:15px}._5ikCMa_switchRow{cursor:pointer;align-items:center;gap:8px;font-size:14px;line-height:22px;display:flex}._5ikCMa_extTag{background:var(--dsw-static-deepseek-100);color:var(--dsw-static-deepseek-600);border:.5px solid #4176e659;border-radius:4px;flex:none;padding:1px 6px;font-size:11px;font-weight:500;line-height:16px}._5ikCMa_modalMask{background:var(--dsw-alias-bg-mask-1);z-index:100;justify-content:center;align-items:center;padding:24px;display:flex;position:fixed;inset:0}._5ikCMa_modal{background:var(--dsw-specific-menu);border-radius:16px;width:100%;padding:20px;box-shadow:0 12px 40px #0000002e}._5ikCMa_modalTitle{color:var(--dsw-alias-label-primary);margin-bottom:8px;font-size:16px;font-weight:500;line-height:24px}._5ikCMa_modalDesc{color:var(--dsw-alias-label-secondary);margin-bottom:16px;font-size:14px;line-height:22px}._5ikCMa_modalFoot{justify-content:flex-end;gap:8px;display:flex}._5ikCMa_quickWrap{flex-direction:column;gap:6px;display:flex;position:relative}._5ikCMa_quickList{z-index:20;background:var(--dsw-specific-menu);backdrop-filter:var(--dsw-menu-backdrop-filter);--dsw-elevation-stroke-color:var(--dsw-alias-border-l1);box-shadow:var(--dsw-elevation-prominent);border:0;border-radius:8px;max-height:264px;margin-top:2px;padding:4px;position:absolute;top:100%;left:0;right:0;overflow-y:auto}._5ikCMa_quickItem{width:100%;color:var(--dsw-alias-label-primary);text-align:left;cursor:pointer;background:0 0;border:none;border-radius:6px;flex-direction:column;gap:1px;padding:6px 8px;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:13px;display:flex}._5ikCMa_quickItemId{overflow-wrap:anywhere}._5ikCMa_quickItemApi{color:var(--dsw-alias-label-tertiary);letter-spacing:.2px;font-size:11px;line-height:14px}._5ikCMa_quickItem:hover{background:var(--dsw-alias-interactive-bg-hover)}._5ikCMa_quickEmpty{color:var(--dsw-alias-label-tertiary);padding:6px 8px;font-size:12px;line-height:18px}@media (prefers-reduced-motion:reduce){._5ikCMa_customizedSummary:before{transition:none}}\n";
6
+ var __extCss = "._5ikCMa_section{max-width:720px;color:var(--dsw-alias-label-primary);flex-direction:column;gap:12px;display:flex}._5ikCMa_titleRow{align-items:center;gap:10px;display:flex}._5ikCMa_title{color:var(--dsw-alias-label-primary);margin:0;font-size:16px;font-weight:500;line-height:24px}._5ikCMa_intro{color:var(--dsw-alias-label-tertiary);margin:0;font-size:14px;line-height:22px}._5ikCMa_savedNotice{color:var(--dsw-alias-state-success-primary);margin:0;font-size:12px;line-height:18px}._5ikCMa_notice{color:var(--dsw-alias-state-warn-label);margin:0;font-size:12px;line-height:18px}._5ikCMa_error{color:var(--dsw-alias-state-error-primary);margin:0;font-size:12px;line-height:18px}._5ikCMa_rows{flex-direction:column;gap:8px;margin:12px 0 0;padding:0;list-style:none;display:flex}._5ikCMa_rowCard{border:.5px solid var(--dsw-alias-border-l4);border-radius:16px;flex-direction:column;gap:12px;padding:12px 14px;display:flex}._5ikCMa_rowHead{align-items:center;gap:10px;display:flex}._5ikCMa_rowIdentity{align-items:center;gap:6px;min-width:0;display:inline-flex}._5ikCMa_rowName{color:var(--dsw-alias-label-primary);font-size:14px;font-weight:500;line-height:22px}._5ikCMa_rowTag{border:.5px solid var(--dsw-alias-border-l3);color:var(--dsw-alias-label-secondary);border-radius:4px;flex:none;padding:1px 6px;font-size:11px;line-height:16px}._5ikCMa_credentialDot{box-sizing:border-box;border-radius:50%;flex:none;width:8px;height:8px;display:inline-block}._5ikCMa_credentialDotConfigured{background:var(--dsw-alias-state-success-primary)}._5ikCMa_accountStatus{color:var(--dsw-alias-state-success-primary);align-items:center;gap:4px;font-size:12px;line-height:18px;display:inline-flex}._5ikCMa_credentialDotMissing{background:var(--dsw-alias-state-error-primary)}._5ikCMa_rowActions{align-items:center;gap:4px;margin-left:auto;display:inline-flex}._5ikCMa_primaryButton,._5ikCMa_secondaryButton,._5ikCMa_addButton{box-sizing:border-box;height:36px;font:inherit;cursor:pointer;border:none;border-radius:18px;justify-content:center;align-items:center;gap:4px;padding:0 14px;font-size:14px;line-height:22px;display:inline-flex}._5ikCMa_primaryButton{background:var(--dsw-alias-button-primary-fill);color:var(--dsw-alias-label-primary-foreground)}._5ikCMa_primaryButton:hover:not(:disabled){background:var(--dsw-alias-button-primary-hover)}._5ikCMa_secondaryButton,._5ikCMa_addButton{border:.5px solid var(--dsw-alias-border-l3);color:var(--dsw-alias-label-primary);background:0 0}._5ikCMa_secondaryButton:hover:not(:disabled),._5ikCMa_addButton:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover)}._5ikCMa_secondaryButton:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover-solid)}._5ikCMa_dangerButton{box-sizing:border-box;height:36px;color:var(--dsw-alias-state-error-primary);font:inherit;cursor:pointer;background:0 0;border:none;border-radius:18px;justify-content:center;align-items:center;padding:0 14px;font-size:14px;line-height:22px;display:inline-flex}._5ikCMa_dangerButton:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover-danger)}._5ikCMa_rowActions ._5ikCMa_secondaryButton,._5ikCMa_rowActions ._5ikCMa_dangerButton{border-radius:14px;height:28px;padding:0 10px;font-size:12px;line-height:18px}._5ikCMa_primaryButton:disabled,._5ikCMa_secondaryButton:disabled,._5ikCMa_dangerButton:disabled,._5ikCMa_addButton:disabled,._5ikCMa_linkButton:disabled,._5ikCMa_addModelButton:disabled{opacity:.4;cursor:default}._5ikCMa_primaryButton:focus-visible,._5ikCMa_secondaryButton:focus-visible,._5ikCMa_dangerButton:focus-visible,._5ikCMa_addButton:focus-visible,._5ikCMa_linkButton:focus-visible,._5ikCMa_addModelButton:focus-visible,._5ikCMa_iconButton:focus-visible,._5ikCMa_dragHandle:focus-visible,._5ikCMa_customizedSummary:focus-visible{box-shadow:0 0 0 2px var(--dsw-alias-border-l3);outline:none}._5ikCMa_editor{background:var(--dsw-alias-bg-module-platform);border-radius:12px;flex-direction:column;gap:14px;padding:14px 16px;display:flex}._5ikCMa_field{flex-direction:column;gap:6px;display:flex}._5ikCMa_fieldLabel{color:var(--dsw-alias-label-secondary);align-items:center;gap:10px;font-size:12px;font-weight:500;line-height:18px;display:inline-flex}._5ikCMa_linkButton{box-sizing:border-box;height:28px;color:var(--dsw-alias-label-tertiary);font:inherit;cursor:pointer;background:0 0;border:none;border-radius:14px;align-items:center;padding:0 10px;font-size:12px;line-height:18px;display:inline-flex}._5ikCMa_linkButton:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-secondary)}._5ikCMa_advancedHint{color:var(--dsw-alias-label-tertiary);margin:0;font-size:12px;line-height:18px}._5ikCMa_helpButton{border:.5px solid var(--dsw-alias-border-l3);corner-shape:round;width:16px;height:16px;color:var(--dsw-alias-label-tertiary);font:inherit;text-align:center;cursor:help;background:0 0;border-radius:50%;padding:0;font-size:11px;line-height:15px}._5ikCMa_helpButton:hover,._5ikCMa_helpButton:focus-visible{color:var(--dsw-alias-label-primary);border-color:var(--dsw-alias-label-tertiary)}._5ikCMa_editorActions{justify-content:flex-end;gap:8px;display:flex}._5ikCMa_addBlock{flex-direction:column;gap:12px;display:flex}._5ikCMa_addActions{flex-wrap:wrap;gap:10px;display:flex}._5ikCMa_addButton{border:1px dashed var(--dsw-alias-border-l3);border-radius:16px;flex:1 1 0;gap:6px;min-width:180px;height:44px}._5ikCMa_addCard{background:var(--dsw-alias-bg-module-platform);border-radius:12px;flex-direction:column;gap:14px;padding:14px 16px;list-style:none;display:flex}._5ikCMa_addCard ._5ikCMa_editor,._5ikCMa_setupCard ._5ikCMa_editor{background:0 0;padding:0}._5ikCMa_tabs{flex-direction:column;gap:12px;display:flex}._5ikCMa_tabBar{border-bottom:.5px solid var(--dsw-alias-border-l2);gap:4px;display:flex}._5ikCMa_tabButton{appearance:none;font:inherit;color:var(--dsw-alias-label-tertiary);cursor:pointer;background:0 0;border:none;padding:6px 12px 8px;font-size:13px;line-height:20px;position:relative}._5ikCMa_tabButton:hover{color:var(--dsw-alias-label-primary)}._5ikCMa_tabButton:disabled{opacity:.4;cursor:default}._5ikCMa_tabButtonActive{color:var(--dsw-alias-label-primary);font-weight:500}._5ikCMa_tabButtonActive:after{content:\"\";background:var(--dsw-alias-brand-primary);border-radius:2px;height:2px;position:absolute;bottom:-1px;left:10px;right:10px}._5ikCMa_tabPanel{flex-direction:column;gap:12px;display:flex}._5ikCMa_modelCatalog{flex-direction:column;gap:10px;display:flex}._5ikCMa_modelCatalogHeading{flex-direction:column;gap:2px;display:flex}._5ikCMa_modelCatalogTitle{color:var(--dsw-alias-label-secondary);font-size:12px;font-weight:500;line-height:18px}._5ikCMa_modelCatalogMeta,._5ikCMa_modelEmpty{color:var(--dsw-alias-label-tertiary);margin:0;font-size:12px;line-height:18px}._5ikCMa_modelList{flex-direction:column;gap:8px;display:flex}._5ikCMa_modelListHead{justify-content:space-between;align-items:flex-start;gap:12px;display:flex}._5ikCMa_modelEntry{border:.5px solid var(--dsw-alias-border-l4);border-radius:10px;padding:6px}._5ikCMa_modelRow{grid-template-columns:minmax(0,1.4fr) minmax(0,1fr) auto auto auto;align-items:center;gap:6px;display:grid;position:relative}._5ikCMa_modelEntryDragging{border:.5px solid var(--dsw-alias-border-l4);opacity:.5;border-radius:10px;padding:6px}._5ikCMa_dragHandle{box-sizing:border-box;width:24px;height:28px;color:var(--dsw-alias-label-tertiary);cursor:grab;touch-action:none;background:0 0;border:none;border-radius:6px;justify-content:center;align-items:center;display:inline-flex}._5ikCMa_dragHandle:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}._5ikCMa_dragHandle:active:not(:disabled){cursor:grabbing}._5ikCMa_dragHandle:disabled{cursor:default;opacity:.4}._5ikCMa_modelDropLine{background:var(--dsw-alias-brand-primary);pointer-events:none;border-radius:2px;height:2px;position:absolute;left:0;right:0}._5ikCMa_modelDropLine[data-edge=before]{top:-5px}._5ikCMa_modelDropLine[data-edge=after]{bottom:-5px}._5ikCMa_iconButton{box-sizing:border-box;width:28px;height:28px;color:var(--dsw-alias-label-tertiary);cursor:pointer;background:0 0;border:none;border-radius:6px;justify-content:center;align-items:center;display:inline-flex}._5ikCMa_iconButton:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}._5ikCMa_iconButton:disabled{cursor:default;opacity:.4}._5ikCMa_iconButtonDanger:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover-danger);color:var(--dsw-alias-state-error-primary)}._5ikCMa_modelAdvanced{grid-template-columns:repeat(auto-fit,minmax(160px,1fr));gap:8px;padding:8px 4px 2px;display:grid}._5ikCMa_capacityRow{grid-template-columns:repeat(auto-fit,minmax(160px,1fr));gap:8px;padding:0 4px;display:grid}._5ikCMa_modelField{flex-direction:column;gap:4px;display:flex}._5ikCMa_modelFieldLabel{color:var(--dsw-alias-label-tertiary);font-size:12px;line-height:18px}._5ikCMa_modelEmpty{border:1px dashed var(--dsw-alias-border-l3);text-align:center;border-radius:8px;padding:12px}._5ikCMa_addModelButton{box-sizing:border-box;border:.5px solid var(--dsw-alias-border-l3);height:28px;color:var(--dsw-alias-label-primary);font:inherit;cursor:pointer;background:0 0;border-radius:14px;align-self:flex-start;align-items:center;gap:4px;padding:0 10px;font-size:12px;line-height:18px;display:inline-flex}._5ikCMa_addModelButton:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover)}._5ikCMa_input{box-sizing:border-box;border:.5px solid var(--dsw-alias-border-l4);width:100%;height:32px;font:inherit;background:var(--dsw-alias-bg-layer-1);color:var(--dsw-alias-label-primary);border-radius:8px;padding:0 10px;font-size:14px;line-height:22px}select._5ikCMa_input{cursor:pointer;max-width:240px}._5ikCMa_input:focus{border-color:var(--dsw-alias-brand-primary);outline:none}._5ikCMa_input::placeholder{color:var(--dsw-alias-label-dimmed)}._5ikCMa_input:disabled{opacity:.6;cursor:default}._5ikCMa_keyInput{position:relative}._5ikCMa_keyInputFilled{padding-right:40px}._5ikCMa_keyToggle{border-radius:var(--dsw-radius-md);width:32px;color:var(--dsw-alias-label-secondary);cursor:pointer;background:0 0;border:none;justify-content:center;align-items:center;padding:0;display:inline-flex;position:absolute;inset:1px 1px 1px auto}._5ikCMa_keyToggle:hover:not(:disabled){color:var(--dsw-alias-label-primary)}._5ikCMa_keyToggle:focus-visible{outline:var(--dsw-focus-ring-width) solid var(--dsw-focus-ring-color,var(--dsw-alias-state-business-primary));outline-offset:-2px}._5ikCMa_keyToggle:disabled{opacity:.6;cursor:default}._5ikCMa_selectInput{appearance:none;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\");background-position:right 12px center;background-repeat:no-repeat;background-size:12px 12px;padding-right:32px}._5ikCMa_deleteDialog{width:min(480px,100%)}._5ikCMa_deleteConfirm:not(:disabled){border-color:var(--dsw-alias-state-error-primary);color:var(--dsw-alias-state-error-primary)}._5ikCMa_deleteConfirm:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover-danger)}._5ikCMa_fetchDialog{max-width:520px}._5ikCMa_candidateToolbar{align-items:center;gap:8px;margin-bottom:6px;display:flex}._5ikCMa_candidateSearch{flex:240px;min-width:0}._5ikCMa_candidateList{flex-direction:column;gap:2px;max-height:320px;margin:0;padding:0;list-style:none;display:flex;overflow-y:auto}._5ikCMa_candidate{border-radius:6px}._5ikCMa_candidateLabel{cursor:pointer;align-items:center;gap:8px;padding:6px 8px;display:flex}._5ikCMa_candidateId{overflow-wrap:anywhere;flex:auto;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:13px}._5ikCMa_candidateEmpty{color:var(--dsw-alias-label-secondary);text-align:center;margin:24px 0;font-size:13px;line-height:20px}[hidden]{display:none!important}._5ikCMa_extBlock{border:.5px solid var(--dsw-alias-border-l3);background:var(--dsw-alias-bg-layer-1);border-radius:10px;flex-direction:column;gap:10px;margin:8px 4px 2px;padding:10px;display:flex}._5ikCMa_extGroup{border-top:.5px solid var(--dsw-alias-border-l2);padding-top:12px}._5ikCMa_extGroupFirst{border-top:none;padding-top:0}._5ikCMa_extCheck{cursor:pointer;align-items:flex-start;gap:8px;display:flex}._5ikCMa_extCheckLabel{color:var(--dsw-alias-label-primary);font-size:14px;line-height:22px}._5ikCMa_extHint{color:var(--dsw-alias-label-tertiary);font-size:12px;line-height:18px}._5ikCMa_extGated{flex-direction:column;gap:12px;padding-left:2px;display:flex}._5ikCMa_extField{flex-direction:column;gap:6px;display:flex}._5ikCMa_extLabel{color:var(--dsw-alias-label-tertiary);font-size:12px;line-height:18px}._5ikCMa_extTable{border:.5px solid var(--dsw-alias-border-l4);border-radius:8px;overflow:hidden}._5ikCMa_extTHead{color:var(--dsw-alias-label-tertiary);background:var(--dsw-alias-bg-module-platform);grid-template-columns:64px minmax(0,1fr) minmax(0,1.2fr);font-size:12px;line-height:18px;display:grid}._5ikCMa_extTHead>div{padding:6px 10px}._5ikCMa_extTHead>div+div{border-left:.5px solid var(--dsw-alias-border-l2)}._5ikCMa_extTRow{border-top:.5px solid var(--dsw-alias-border-l2);grid-template-columns:64px minmax(0,1fr) minmax(0,1.2fr);align-items:center;display:grid}._5ikCMa_extTRow>div{padding:6px 10px;font-size:14px}._5ikCMa_extTRow>div+div{border-left:.5px solid var(--dsw-alias-border-l2)}._5ikCMa_extTRow input[type=text]{box-sizing:border-box;border:.5px solid var(--dsw-alias-border-l4);width:100%;height:32px;font:inherit;background:var(--dsw-alias-bg-layer-1);color:var(--dsw-alias-label-primary);border-radius:8px;padding:0 10px;font-size:14px}._5ikCMa_extTRow input[type=text]:disabled{opacity:.6;cursor:default}._5ikCMa_extCheckbox{accent-color:var(--dsw-alias-brand-primary);flex:none;width:15px;height:15px}._5ikCMa_switchRow{cursor:pointer;align-items:center;gap:8px;font-size:14px;line-height:22px;display:flex}._5ikCMa_extTag{background:var(--dsw-static-deepseek-100);color:var(--dsw-static-deepseek-600);border:.5px solid #4176e659;border-radius:4px;flex:none;padding:1px 6px;font-size:11px;font-weight:500;line-height:16px}._5ikCMa_modalMask{background:var(--dsw-alias-bg-mask-1);z-index:100;justify-content:center;align-items:center;padding:24px;display:flex;position:fixed;inset:0}._5ikCMa_modal{background:var(--dsw-specific-menu);border-radius:16px;width:100%;padding:20px;box-shadow:0 12px 40px #0000002e}._5ikCMa_modalTitle{color:var(--dsw-alias-label-primary);margin-bottom:8px;font-size:16px;font-weight:500;line-height:24px}._5ikCMa_modalDesc{color:var(--dsw-alias-label-secondary);margin-bottom:16px;font-size:14px;line-height:22px}._5ikCMa_modalFoot{justify-content:flex-end;gap:8px;display:flex}._5ikCMa_quickWrap{flex-direction:column;gap:6px;display:flex;position:relative}._5ikCMa_quickList{z-index:20;background:var(--dsw-specific-menu);backdrop-filter:var(--dsw-menu-backdrop-filter);--dsw-elevation-stroke-color:var(--dsw-alias-border-l1);box-shadow:var(--dsw-elevation-prominent);border:0;border-radius:8px;max-height:264px;margin-top:2px;padding:4px;position:absolute;top:100%;left:0;right:0;overflow-y:auto}._5ikCMa_quickItem{width:100%;color:var(--dsw-alias-label-primary);text-align:left;cursor:pointer;background:0 0;border:none;border-radius:6px;flex-direction:column;gap:1px;padding:6px 8px;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:13px;display:flex}._5ikCMa_quickItemId{overflow-wrap:anywhere}._5ikCMa_quickItemApi{color:var(--dsw-alias-label-tertiary);letter-spacing:.2px;font-size:11px;line-height:14px}._5ikCMa_quickItem:hover{background:var(--dsw-alias-interactive-bg-hover)}._5ikCMa_quickEmpty{color:var(--dsw-alias-label-tertiary);padding:6px 8px;font-size:12px;line-height:18px}@media (prefers-reduced-motion:reduce){._5ikCMa_customizedSummary:before{transition:none}}\n";
7
7
  if (typeof document !== 'undefined' && document.querySelector('style[data-plugin-css="dsh-model-extension"]') === null) {
8
8
  var __tag = document.createElement('style');
9
9
  __tag.dataset.plugin = "dsh-model-extension";
@@ -520,7 +520,7 @@ if (typeof document !== 'undefined' && document.querySelector('style[data-plugin
520
520
  * was last verified against, and the extra locale keys the extension adds on
521
521
  * top of the official Models page dictionaries.
522
522
  */
523
- /** Thinking levels offered by llm-pi-ai (THINKING_LEVEL_GATE @ 0.1.2-alpha.4). Only `off` may carry an empty wire value. */
523
+ /** Thinking levels offered by llm-pi-ai (THINKING_LEVEL_GATE @ 0.2.1-rc.2). Only `off` may carry an empty wire value. */
524
524
  const THINKING_LEVELS = [
525
525
  "off",
526
526
  "minimal",
@@ -530,7 +530,7 @@ if (typeof document !== 'undefined' && document.querySelector('style[data-plugin
530
530
  "xhigh",
531
531
  "max"
532
532
  ];
533
- /** Reasoning wire formats understood by llm-pi-ai (SUPPORTED_THINKING_FORMATS @ 0.1.2-alpha.4). */
533
+ /** Reasoning wire formats understood by llm-pi-ai (SUPPORTED_THINKING_FORMATS @ 0.2.1-rc.2). */
534
534
  const THINKING_FORMATS = [
535
535
  "openai",
536
536
  "deepseek",
@@ -546,7 +546,7 @@ if (typeof document !== 'undefined' && document.querySelector('style[data-plugin
546
546
  ];
547
547
  /**
548
548
  * The compatibility switches llm-pi-ai *offers*, by wire protocol (the `offer`
549
- * set of its COMPAT_GATES @ 0.1.5-rc.2). Only these may reach a model row: the
549
+ * set of its COMPAT_GATES @ 0.2.1-rc.2). Only these may reach a model row: the
550
550
  * adapter refuses a switch no protocol offers rather than ignoring it, so
551
551
  * copying pi-ai's catalog `compat` across verbatim would fail resolution on
552
552
  * the withheld fields it also records (routing preferences, session affinity,
@@ -680,7 +680,12 @@ if (typeof document !== 'undefined' && document.querySelector('style[data-plugin
680
680
  keyEnvLocked: "Provided by the launch environment (read-only)",
681
681
  customized: "Customized settings",
682
682
  baseUrl: "Base URL",
683
- baseUrlDefault: "Provider default",
683
+ baseUrlDefault: "No default endpoint",
684
+ baseUrlEnvironment: "Provider endpoint configuration: {env}",
685
+ baseUrlConfigured: "Provider-configured endpoint",
686
+ baseUrlPlaceholder: "{url}",
687
+ accountSignedIn: "Signed in",
688
+ accountReadOnly: "The account catalog comes from the account /models listing; per-model overrides live under modelOverrides in cordis.patch.yml.",
684
689
  models: "Models",
685
690
  modelsInherited: "Using the adapter defaults",
686
691
  modelsCustomized: "Customized model catalog",
@@ -801,7 +806,12 @@ if (typeof document !== 'undefined' && document.querySelector('style[data-plugin
801
806
  keyEnvLocked: "由启动环境提供(只读)",
802
807
  customized: "自定义设置",
803
808
  baseUrl: "API 地址",
804
- baseUrlDefault: "提供方默认",
809
+ baseUrlDefault: "没有默认地址",
810
+ baseUrlEnvironment: "提供方地址配置:{env}",
811
+ baseUrlConfigured: "由提供方配置地址",
812
+ baseUrlPlaceholder: "{url}",
813
+ accountSignedIn: "已登录",
814
+ accountReadOnly: "账号模型目录来自账号 /models 列表;单模型覆盖请在 cordis.patch.yml 的 modelOverrides 中配置。",
805
815
  models: "模型目录",
806
816
  modelsInherited: "正在使用适配器默认模型",
807
817
  modelsCustomized: "已自定义模型目录",
@@ -1064,9 +1074,48 @@ if (typeof document !== 'undefined' && document.querySelector('style[data-plugin
1064
1074
  }
1065
1075
  }
1066
1076
  }
1077
+ /**
1078
+ * Whether pi-ai accepts one stored wire value: a non-empty string, or `null`
1079
+ * for the `off` level (which sends nothing).
1080
+ * @param level - the declared level.
1081
+ * @param wire - the value stored for it.
1082
+ * @returns whether the adapter would resolve the entry.
1083
+ */
1084
+ function acceptedReasoningValue(level, wire) {
1085
+ return typeof wire === "string" ? wire.length > 0 : wire === null && level === "off";
1086
+ }
1087
+ /**
1088
+ * Mirror the adapter's own refusals for a hand-declared `reasoningEfforts`
1089
+ * field, so a card names the row instead of failing at write time.
1090
+ *
1091
+ * A declaration is refused when a non-off level carries an empty value (or a
1092
+ * non-string that is not `off`'s `null`), and when it declares no level
1093
+ * beyond `off`. An absent or `false` field means "does not reason" and
1094
+ * passes; a `null` or `{}` field is a valueless declaration and is refused
1095
+ * the same way the adapter refuses it.
1096
+ * @param value - drafted `models` value, or undefined while inherited.
1097
+ * @returns the first refused row, or undefined when the adapter accepts every row.
1098
+ */
1099
+ function validateReasoningEfforts(value) {
1100
+ for (const [index, model] of modelDrafts(value).entries()) {
1101
+ const raw = model["reasoningEfforts"];
1102
+ if (raw === void 0 || raw === false) continue;
1103
+ const entries = raw === null ? [] : typeof raw === "object" && !Array.isArray(raw) ? Object.entries(raw) : void 0;
1104
+ if (entries === void 0) continue;
1105
+ if (entries.some(([level, wire]) => !acceptedReasoningValue(level, wire))) return {
1106
+ index,
1107
+ key: "modelReasoningValueRequired"
1108
+ };
1109
+ if (!entries.some(([level]) => level !== "off")) return {
1110
+ index,
1111
+ key: "modelReasoningNeedsLevel"
1112
+ };
1113
+ }
1114
+ }
1067
1115
  //#endregion
1068
1116
  //#region src/client/models-plus/models-plus.module.css
1069
1117
  var models_plus_module_default = {
1118
+ "accountStatus": "_5ikCMa_accountStatus",
1070
1119
  "addActions": "_5ikCMa_addActions",
1071
1120
  "addBlock": "_5ikCMa_addBlock",
1072
1121
  "addButton": "_5ikCMa_addButton",
@@ -2781,7 +2830,13 @@ if (typeof document !== 'undefined' && document.querySelector('style[data-plugin
2781
2830
  * from; without it a row can carry switches the route will refuse.
2782
2831
  */
2783
2832
  const routeApi = layout === "pi-ai" ? (props.declared === true ? stringAt(draft, "api") ?? stringAt(fallback, "api") : void 0) ?? sharedCatalogApi(prefillIndex, props.provider) : void 0;
2784
- const modelFailure = validateModelRows(schema.getPath(draft, ["models"]), routeApi);
2833
+ /** One positioned, localised sentence for any model-row refusal. */
2834
+ const describeModelFailure = (failure) => {
2835
+ if (failure.key === "modelCompatNotOffered") return compatFailureMessage(failure);
2836
+ const copy = failure.key === "modelReasoningValueRequired" ? "reasoningEffortEmptyWire" : failure.key === "modelReasoningNeedsLevel" ? "reasoningEffortsNeedNonOff" : failure.key;
2837
+ return `模型 ${String(failure.index + 1)}:${props.t(copy)}`;
2838
+ };
2839
+ const modelFailure = validateModelRows(schema.getPath(draft, ["models"]), routeApi) ?? (layout === "pi-ai" ? validateReasoningEfforts(schema.getPath(draft, ["models"])) : void 0);
2785
2840
  const keyFailure = (() => {
2786
2841
  if (keyDraft.length === 0) return void 0;
2787
2842
  const value = keyDraft.trim();
@@ -2809,14 +2864,8 @@ if (typeof document !== 'undefined' && document.querySelector('style[data-plugin
2809
2864
  const applyOnce = async () => {
2810
2865
  const ns = namespace.ns;
2811
2866
  let next = layout === "pi-ai" && stringAt(draft, "apiKeyEnv") === void 0 && stringAt(fallback, "apiKeyEnv") === void 0 && keyValue.length > 0 ? schema.setPath(draft, ["apiKeyEnv"], keyRef) : draft;
2812
- const rowFailure = validateModelRows(schema.getPath(next, ["models"]), routeApi);
2813
- if (rowFailure !== void 0) return rowFailure.key === "modelCompatNotOffered" ? compatFailureMessage(rowFailure) : `模型 ${String(rowFailure.index + 1)}:${{
2814
- modelIdRequired: "模型 ID 不能为空。",
2815
- modelIdDuplicate: "模型 ID 不能重复。",
2816
- modelNameInvalid: "显示名称不能为空。",
2817
- modelContextInvalid: "上下文窗口须为正数,如 131072、256K、1M。",
2818
- modelMaxTokensInvalid: "最大输出 token 数须为正数,如 8192、64K、1M。"
2819
- }[rowFailure.key]}`;
2867
+ const rowFailure = validateModelRows(schema.getPath(next, ["models"]), routeApi) ?? (layout === "pi-ai" ? validateReasoningEfforts(schema.getPath(next, ["models"])) : void 0);
2868
+ if (rowFailure !== void 0) return describeModelFailure(rowFailure);
2820
2869
  if (node !== void 0 && settingsPath.length === 0) {
2821
2870
  const sectionError = schema.validate(node, next);
2822
2871
  if (sectionError !== void 0) return sectionError;
@@ -2897,6 +2946,9 @@ if (typeof document !== 'undefined' && document.querySelector('style[data-plugin
2897
2946
  })
2898
2947
  });
2899
2948
  const keyPlaceholder = props.t(view.placeholderKey).replace("{hint}", () => view.placeholderHint ?? "");
2949
+ const baseURL = stringAt(fallback, "baseURL") ?? props.defaultBaseURL;
2950
+ const endpointEnv = props.baseURLEnv ?? [];
2951
+ const endpointHint = layout === "deepseek" ? "该路由固定使用 Messages 协议,地址须指向兼容该协议的端点。" : baseURL === void 0 && endpointEnv.length > 0 ? props.t("baseUrlEnvironment").replace("{env}", () => endpointEnv.join(", ")) : void 0;
2900
2952
  return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
2901
2953
  className: models_plus_module_default["editor"],
2902
2954
  children: [
@@ -2907,23 +2959,9 @@ if (typeof document !== 'undefined' && document.querySelector('style[data-plugin
2907
2959
  namespace.ns,
2908
2960
  ")"
2909
2961
  ]
2910
- }) : accountProvider ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ModelCatalog, {
2911
- models,
2912
- overridden: modelsOverridden,
2913
- routeApi,
2914
- defaultContextWindow: typeof defaultContextWindow === "number" ? defaultContextWindow : void 0,
2915
- defaultMaxTokens: typeof defaultMaxTokens === "number" ? defaultMaxTokens : void 0,
2916
- probe,
2917
- probeBlocked: keyFailure,
2918
- hideFetch: true,
2919
- operations,
2920
- disabled,
2921
- onChange: (rows) => {
2922
- setDraft((current) => schema.setPath(current, ["models"], rows));
2923
- },
2924
- onReset: () => {
2925
- setDraft((current) => schema.deletePath(current, ["models"]));
2926
- }
2962
+ }) : accountProvider ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
2963
+ className: models_plus_module_default["advancedHint"],
2964
+ children: props.t("accountReadOnly")
2927
2965
  }) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)(react_jsx_runtime.Fragment, { children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
2928
2966
  className: models_plus_module_default["tabs"],
2929
2967
  children: [
@@ -3014,17 +3052,19 @@ if (typeof document !== 'undefined' && document.querySelector('style[data-plugin
3014
3052
  className: models_plus_module_default["input"],
3015
3053
  type: "text",
3016
3054
  value: stringAt(draft, "baseURL") ?? "",
3017
- placeholder: layout === "deepseek" ? DEEPSEEK_BASE_URL : stringAt(fallback, "baseURL") ?? "提供方默认",
3055
+ placeholder: layout === "deepseek" ? DEEPSEEK_BASE_URL : baseURL === void 0 ? props.t(endpointEnv.length > 0 ? "baseUrlConfigured" : "baseUrlDefault") : props.t("baseUrlPlaceholder").replace("{url}", () => baseURL),
3056
+ "aria-describedby": endpointHint === void 0 ? void 0 : `${props.provider}-endpoint-hint`,
3018
3057
  "aria-label": "API 地址",
3019
3058
  disabled,
3020
3059
  onChange: (event) => {
3021
3060
  setField("baseURL", event.target.value === "" ? void 0 : event.target.value);
3022
3061
  }
3023
3062
  }),
3024
- layout === "deepseek" ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
3063
+ endpointHint === void 0 ? null : /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
3064
+ id: `${props.provider}-endpoint-hint`,
3025
3065
  className: models_plus_module_default["advancedHint"],
3026
- children: "该路由固定使用 Messages 协议,地址须指向兼容该协议的端点。"
3027
- }) : null
3066
+ children: endpointHint
3067
+ })
3028
3068
  ]
3029
3069
  }),
3030
3070
  layout === "pi-ai" && props.declared === true ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
@@ -3082,7 +3122,7 @@ if (typeof document !== 'undefined' && document.querySelector('style[data-plugin
3082
3122
  }) : null,
3083
3123
  modelFailure === void 0 ? null : /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
3084
3124
  className: models_plus_module_default["advancedHint"],
3085
- children: modelFailure.key === "modelCompatNotOffered" ? compatFailureMessage(modelFailure) : `模型 ${String(modelFailure.index + 1)}:${modelFailure.key}`
3125
+ children: describeModelFailure(modelFailure)
3086
3126
  }),
3087
3127
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
3088
3128
  className: models_plus_module_default["editorActions"],
@@ -3146,7 +3186,7 @@ if (typeof document !== 'undefined' && document.querySelector('style[data-plugin
3146
3186
  const profileDisabled = disabled || committed;
3147
3187
  const routeInvalid = route.length > 0 && !ROUTE_PATTERN.test(route);
3148
3188
  const routeTaken = taken.includes(route);
3149
- const modelFailure = validateModelRows(models, protocol);
3189
+ const modelFailure = validateModelRows(models, protocol) ?? validateReasoningEfforts(models);
3150
3190
  const keyFailure = (() => {
3151
3191
  if (keyDraft.length === 0) return void 0;
3152
3192
  const value = keyDraft.trim();
@@ -3158,7 +3198,13 @@ if (typeof document !== 'undefined' && document.querySelector('style[data-plugin
3158
3198
  })();
3159
3199
  const keyValue = keyDraft.trim();
3160
3200
  const ready = route.length > 0 && !routeInvalid && !routeTaken && baseURL.length > 0 && models.length > 0 && modelFailure === void 0 && keyFailure === void 0;
3161
- const hint = failure !== void 0 || ready || keyFailure !== void 0 || route.length === 0 || routeInvalid || routeTaken ? void 0 : baseURL.length === 0 ? "自定义提供方需要填写 API 地址。" : modelFailure !== void 0 ? modelFailure.key === "modelCompatNotOffered" ? compatFailureMessage(modelFailure) : `模型 ${String(modelFailure.index + 1)}:${modelFailure.key}` : "自定义提供方至少需要一个模型。";
3201
+ const modelFailureText = (() => {
3202
+ if (modelFailure === void 0) return void 0;
3203
+ if (modelFailure.key === "modelCompatNotOffered") return compatFailureMessage(modelFailure);
3204
+ const copy = modelFailure.key === "modelReasoningValueRequired" ? "reasoningEffortEmptyWire" : modelFailure.key === "modelReasoningNeedsLevel" ? "reasoningEffortsNeedNonOff" : modelFailure.key;
3205
+ return `模型 ${String(modelFailure.index + 1)}:${props.t(copy)}`;
3206
+ })();
3207
+ const hint = failure !== void 0 || ready || keyFailure !== void 0 || route.length === 0 || routeInvalid || routeTaken ? void 0 : baseURL.length === 0 ? "自定义提供方需要填写 API 地址。" : modelFailureText !== void 0 ? modelFailureText : "自定义提供方至少需要一个模型。";
3162
3208
  /** Perform the create, returning a failure message or undefined. */
3163
3209
  const createOnce = async () => {
3164
3210
  const keyRef = deriveKeyRef(route);
@@ -3646,6 +3692,13 @@ if (typeof document !== 'undefined' && document.querySelector('style[data-plugin
3646
3692
  className: models_plus_module_default["rowTag"],
3647
3693
  children: "自定义"
3648
3694
  }) : null,
3695
+ row.entry.provider === "deepseek-account" ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
3696
+ className: models_plus_module_default["accountStatus"],
3697
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
3698
+ className: `${models_plus_module_default["credentialDot"]} ${models_plus_module_default["credentialDotConfigured"]}`,
3699
+ "aria-hidden": "true"
3700
+ }), t("accountSignedIn")]
3701
+ }) : null,
3649
3702
  credentialConfigured ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
3650
3703
  className: `${models_plus_module_default["credentialDot"]} ${models_plus_module_default["credentialDotConfigured"]}`,
3651
3704
  role: "img",
@@ -3660,11 +3713,13 @@ if (typeof document !== 'undefined' && document.querySelector('style[data-plugin
3660
3713
  ]
3661
3714
  }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
3662
3715
  className: models_plus_module_default["rowActions"],
3663
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
3716
+ children: [row.entry.provider === "deepseek-account" ? null : /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
3664
3717
  type: "button",
3665
3718
  className: models_plus_module_default["secondaryButton"],
3666
3719
  "aria-label": providerCopy("编辑 {provider}", target),
3720
+ disabled: !open && state.status !== "ready",
3667
3721
  onClick: () => {
3722
+ if (!open && state.status !== "ready") return;
3668
3723
  setSavedTarget(void 0);
3669
3724
  setDeclaring(false);
3670
3725
  setAdding(false);
@@ -3675,8 +3730,9 @@ if (typeof document !== 'undefined' && document.querySelector('style[data-plugin
3675
3730
  type: "button",
3676
3731
  className: models_plus_module_default["dangerButton"],
3677
3732
  "aria-label": providerCopy("删除 {provider}", target),
3678
- disabled: !state.writable,
3733
+ disabled: !state.writable || state.status !== "ready",
3679
3734
  onClick: () => {
3735
+ if (state.status !== "ready") return;
3680
3736
  setSavedTarget(void 0);
3681
3737
  setDeleteFailure(void 0);
3682
3738
  setDeleteTarget(target);
@@ -3752,8 +3808,9 @@ if (typeof document !== 'undefined' && document.querySelector('style[data-plugin
3752
3808
  children: [configurable.length > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
3753
3809
  type: "button",
3754
3810
  className: models_plus_module_default["addButton"],
3755
- disabled: addable.length === 0 || !state.writable,
3811
+ disabled: addable.length === 0 || !state.writable || state.status !== "ready",
3756
3812
  onClick: () => {
3813
+ if (state.status !== "ready") return;
3757
3814
  const first = addable[0];
3758
3815
  if (first === void 0) return;
3759
3816
  setSavedTarget(void 0);
@@ -3777,8 +3834,9 @@ if (typeof document !== 'undefined' && document.querySelector('style[data-plugin
3777
3834
  }), state.namespaces.has("llm-pi-ai") && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
3778
3835
  type: "button",
3779
3836
  className: models_plus_module_default["addButton"],
3780
- disabled: protocols.length === 0 || !state.writable,
3837
+ disabled: protocols.length === 0 || !state.writable || state.status !== "ready",
3781
3838
  onClick: () => {
3839
+ if (state.status !== "ready") return;
3782
3840
  setSavedTarget(void 0);
3783
3841
  setAdding(false);
3784
3842
  setEditing(void 0);