dsh-provider-qoder 0.3.1 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,18 +1,22 @@
1
- # DSH Qoder Subscription Plugin
1
+ # dsh-provider-qoder
2
+
3
+ [![npm version](https://img.shields.io/npm/v/dsh-provider-qoder.svg?color=blue)](https://www.npmjs.com/package/dsh-provider-qoder)
4
+ [![License: MIT](https://img.shields.io/badge/License-MIT-green.svg)](LICENSE)
5
+ [![Awesome DSH Plugin](https://awesome-dsh-plugin.com/badge.svg)](https://awesome-dsh-plugin.com)
2
6
 
3
7
  English | [简体中文](./README_CN.md)
4
8
 
5
- `dsh-provider-qoder` integrates your Qoder subscription into DeepSeek Harness (DSH), supporting text and image input, streaming text, reasoning content, and tool calls across Global and China Qoder services.
9
+ Use your Qoder subscription in DeepSeek Harness (DSH), supporting multimodality, web search, and tool calls across Global and China Qoder services.
6
10
 
7
11
  The plugin handles authentication and model communication, while tool execution, workspace operations, and permission management are handled by DSH.
8
- This project is a community adapter plugin.
12
+ This project is a community adapter plugin and is not affiliated with Qoder or DeepSeek.
9
13
 
10
14
  ## Features
11
15
 
12
16
  - Configure subscription access via Qoder Personal Access Token (PAT).
13
17
  - Supports both Global (`global`) and China (`china`) services.
14
18
  - Discovers available models for your account, allows selecting enabled models, and displays pricing multipliers and reasoning effort options when reported by the service.
15
- - Supports streaming responses, reasoning content, multimodality, search, tool calls, and multi-turn interactions.
19
+ - Supports multimodality, search, and tool calls.
16
20
  - View account information, quota, and reset dates in Settings.
17
21
 
18
22
  ## Installation
@@ -21,8 +25,7 @@ This project is a community adapter plugin.
21
25
 
22
26
  You will need a running DSH Web environment, an active Qoder subscription, and a PAT matching the selected service region. The DSH profile running the plugin must provide a managed credentials service; when configuring via the settings page, the credential storage must also be writable.
23
27
 
24
- This package's dependency ranges are DSH packages `>=0.1.2-rc.1 <0.2`, Cordis `>=4.0.2 <5`, and React `^18.2.0`. The settings UI also depends on the host providing remote credential endpoints and settings slots—please use a DSH version equipped with these interfaces; the ranges above do not imply that every version has been tested.
25
-
28
+ This package supports DSH `>=0.1.7-rc.2 <0.2.0-0 || >=0.2.0-rc.1 <0.3.0-0`, Cordis `>=4.0.4 <5`, and React `^18.2.0`.
26
29
  ### Install from npm
27
30
 
28
31
  Run in your terminal:
@@ -55,60 +58,23 @@ Fetching models uses the **saved PAT and service region**. If you switch account
55
58
 
56
59
  The model picker refreshes Qoder metadata for enabled models when opened, with a five-minute cache after a successful fetch. When settings are writable, refreshed multipliers and capabilities are also synchronized to the saved catalog shown in **Custom Settings**, without enabling additional models. Failed refreshes retain the last known metadata.
57
60
 
58
- ### 3. View Account & Quota
59
-
60
- Open **Settings → Qoder** to view account and quota details.
61
-
62
- ## FAQ
63
-
64
- ### The plugin fails to start, or credentials cannot be saved
65
-
66
- Ensure you have restarted the profile where the plugin was installed, and that the profile provides the DSH managed credentials service. If prompted that the storage is not writable, a writable credential store needs to be configured on the host side. The plugin does not read PATs from environment variables.
67
-
68
- ### PAT is saved, but model fetching or requests fail
69
-
70
- Verify that the PAT is valid and matches the saved service region. If modified, save first before fetching models. The save action itself does not validate the token. If your account quota is exhausted, you will need to resolve your subscription quota first.
71
-
72
- ### Models remain unavailable after switching regions
73
-
74
- Global and China model catalogs are stored separately. Switching regions does not automatically update your PAT or refetch that region's models; after saving the matching PAT, fetch and save the models for the selected region.
75
-
76
- ### Are requests automatically retried?
77
-
78
- Model-generation retries are managed by DSH. To enable them, the running profile should include `@deepseek-ai/dsh-llm-retry`. The plugin reports empty responses, rate limits, server errors, timeouts, and transport errors using DSH's default retry policy; authentication, invalid requests, cancellations, quota issues, and protocol formatting errors are not retried by default. The Qoder transport may independently retry an idempotent model-catalog, subscriber-profile, or quota read once, but never retries a model-generation POST internally.
79
-
80
- ## Install from Source & Development
61
+ <p align="center">
62
+ <img src="./assets/credentials-settings.png" alt="Qoder credentials and model configuration" width="680" />
63
+ </p>
81
64
 
82
- Run in an environment with Git, Node.js, and pnpm installed. Node.js must support the `--experimental-strip-types` and `--test-isolation=none` flags used by the project's test scripts.
83
-
84
- ```sh
85
- git clone https://github.com/mo-n/dsh-provider-qoder.git
86
- cd dsh-provider-qoder
87
- pnpm install --frozen-lockfile
88
- pnpm run build
89
- ```
90
-
91
- Install the built repository directory into your DSH profile. The path below is a placeholder example; replace it with the actual absolute path:
92
-
93
- ```sh
94
- dsh plugin --profile web add /absolute/path/to/dsh-provider-qoder
95
- ```
96
-
97
- After restarting the profile, follow the configuration steps above. If running the CLI within a DSH source workspace, you can use `pnpm dsh` from that workspace.
65
+ ### 3. View Account & Quota
98
66
 
99
- For development, run watch mode in the plugin directory:
67
+ Open **Settings → Qoder** to view account and quota details, and configure the web search policy as needed:
100
68
 
101
- ```sh
102
- pnpm run dev
103
- ```
69
+ <p align="center">
70
+ <img src="./assets/account-quota.png" alt="Qoder account quota and search settings" width="650" />
71
+ </p>
104
72
 
105
- Before committing changes, run:
106
-
107
- ```sh
108
- pnpm run check
109
- ```
73
+ ## Upcoming Features
110
74
 
111
- This command runs non-UI mocked tests, builds the ESM package and type declarations, checks build artifacts, and previews the package tarball without sending real Qoder model requests or publishing npm packages.
75
+ - [ ] Context window tier switching
76
+ - [ ] Request rate-limiting queue mechanism
77
+ - [ ] Connect with Qoder's Protobuf protocol
112
78
 
113
79
  ## References
114
80
 
package/README_CN.md CHANGED
@@ -1,18 +1,24 @@
1
- # DSH Qoder 订阅插件
1
+ # dsh-provider-qoder
2
+
3
+ [![npm version](https://img.shields.io/npm/v/dsh-provider-qoder.svg?color=blue)](https://www.npmjs.com/package/dsh-provider-qoder)
4
+ [![License: MIT](https://img.shields.io/badge/License-MIT-green.svg)](LICENSE)
5
+ [![DSH Plugin](https://img.shields.io/badge/DSH-Plugin-6f42c1.svg)](https://github.com/mo-n/dsh-provider-qoder)
6
+ [![Awesome DSH Plugin](https://awesome-dsh-plugin.com/badge.svg)](https://awesome-dsh-plugin.com)
7
+
2
8
 
3
9
  [English](./README.md) | 简体中文
4
10
 
5
- `dsh-provider-qoder` 将你的 Qoder 订阅接入 DeepSeek Harness(DSH),支持文本与图片输入、流式文本、推理内容和工具调用,可选择国际版或中国区 Qoder 服务。
11
+ 在 DeepSeek Harness(DSH) 中使用 Qoder 订阅,支持多模态、联网搜索和工具调用,可选择国际版或中国区 Qoder 服务。
6
12
 
7
13
  插件负责认证和模型通信,工具执行、工作区操作及权限管理由 DSH 负责。
8
- 本项目是社区适配插件。
14
+ 本项目是社区适配插件,与 Qoder、DeepSeek 官方均无关联。
9
15
 
10
16
  ## 功能
11
17
 
12
18
  - 通过 Qoder Personal Access Token(PAT,个人访问令牌)配置订阅访问。
13
19
  - 支持国际版(`global`)和中国区(`china`)服务。
14
20
  - 获取账号可用模型,选择启用的模型,并在服务返回相关信息时显示价格倍率和推理强度选项。
15
- - 支持流式回答、推理内容、多模态、搜索、工具调用及多轮交互。
21
+ - 支持多模态、搜索以及工具调用。
16
22
  - 在设置中查看账号信息、额度和重置时间。
17
23
 
18
24
  ## 安装
@@ -21,7 +27,7 @@
21
27
 
22
28
  你需要可运行的 DSH Web 环境、可用的 Qoder 订阅,以及与所选服务区域匹配的 PAT。运行插件的 DSH profile 必须提供托管凭据服务;通过设置页面配置时,凭据存储还需可写。
23
29
 
24
- 本包的依赖范围为 DSH 相关包 `>=0.1.2-rc.1 <0.2`、Cordis `>=4.0.2 <5` 和 React `^18.2.0`。设置界面还依赖宿主提供凭据远程接口和设置插槽,请使用具备这些接口的 DSH 版本;上述范围不代表每个版本都经过实测。
30
+ 本包支持 DSH `>=0.1.7-rc.2 <0.2.0-0 || >=0.2.0-rc.1 <0.3.0-0`、Cordis `>=4.0.4 <5` 和 React `^18.2.0`。
25
31
 
26
32
  ### 从 npm 安装
27
33
 
@@ -55,60 +61,23 @@ dsh plugin --profile web add dsh-provider-qoder
55
61
 
56
62
  展开模型选择器时会自动刷新已启用 Qoder 模型的元数据,成功获取后缓存 5 分钟。设置可写时,更新后的倍率和能力信息也会同步到**自定义设置**显示的已保存目录,不会自动启用其他模型。刷新失败时保留最近一次成功获取的信息。
57
63
 
58
- ### 3. 查看账号与额度
59
-
60
- 打开 **设置 → Qoder** 查看账号和额度。
61
-
62
- ## 常见问题
63
-
64
- ### 插件无法启动,或凭据无法保存
65
-
66
- 确认已重启安装插件的 profile,且该 profile 提供 DSH 托管凭据服务。如果提示存储不可写,需要在宿主侧配置可写的凭据存储。插件不会从环境变量读取 PAT。
67
-
68
- ### 已保存 PAT,但获取模型或请求失败
69
-
70
- 确认 PAT 有效且与已保存的服务区域匹配。修改后先保存,再获取模型。保存操作本身不会验证令牌。若账号额度已用尽,需先处理订阅额度问题。
71
-
72
- ### 切换区域后,模型仍不可用
73
-
74
- Global 与 China 的模型目录会分别保存。切换区域不会自动替换 PAT,也不会自动重新获取该区域的模型;请先保存匹配区域的 PAT,再获取并保存所选区域的模型。
75
-
76
- ### 请求是否会自动重试?
77
-
78
- 模型生成重试由 DSH 管理。需要启用时,运行中的 profile 应包含 `@deepseek-ai/dsh-llm-retry`。插件使用 DSH 默认重试策略报告空响应、限流、服务端、超时和传输错误;认证、无效请求、取消、额度及协议格式错误默认不重试。Qoder transport 可以独立重试一次幂等的模型目录、订阅者资料或配额读取,但绝不会在内部重试模型生成 POST。
79
-
80
- ## 从源码安装与开发
64
+ <p align="center">
65
+ <img src="./assets/credentials-settings.png" alt="Qoder 凭据与模型配置" width="680" />
66
+ </p>
81
67
 
82
- 在已安装 Git、Node.js 和 pnpm 的环境中执行。Node.js 需支持项目测试脚本使用的 `--experimental-strip-types` 和 `--test-isolation=none` 参数。
83
-
84
- ```sh
85
- git clone https://github.com/mo-n/dsh-provider-qoder.git
86
- cd dsh-provider-qoder
87
- pnpm install --frozen-lockfile
88
- pnpm run build
89
- ```
90
-
91
- 将构建后的仓库目录安装到 DSH profile。以下路径为占位示例,请替换为实际绝对路径:
92
-
93
- ```sh
94
- dsh plugin --profile web add /absolute/path/to/dsh-provider-qoder
95
- ```
96
-
97
- 重启 profile 后,按前文完成配置。若在 DSH 源码工作区中运行 CLI,可使用该工作区的 `pnpm dsh` 命令。
68
+ ### 3. 查看账号与额度
98
69
 
99
- 开发时,在插件目录运行监听构建:
70
+ 打开 **设置 → Qoder** 查看账号额度,并可按需切换联网搜索策略:
100
71
 
101
- ```sh
102
- pnpm run dev
103
- ```
72
+ <p align="center">
73
+ <img src="./assets/account-quota.png" alt="Qoder 账号额度与搜索设置" width="650" />
74
+ </p>
104
75
 
105
- 提交修改前运行:
106
-
107
- ```sh
108
- pnpm run check
109
- ```
110
76
 
111
- 该命令运行模拟网络的非 UI 测试、构建 ESM 包与类型声明、检查构建产物并预览打包内容,不会发起真实 Qoder 模型请求或发布 npm 包。
77
+ ## 后续计划功能
78
+ - [ ] 支持上下文窗口(Context Window)档位切换
79
+ - [ ] 请求限流排队机制
80
+ - [ ] 接入 Qoder 的 Protobuf 协议
112
81
 
113
82
  ## 参考项目
114
83
 
package/lib/client.js CHANGED
@@ -781,7 +781,7 @@ window.__ModuleLoader__.load({
781
781
  const region = selectedRegion ?? (section.region === "china" ? "china" : "global");
782
782
  const scoped = section.modelsByRegion?.[region];
783
783
  if (Array.isArray(scoped)) return scoped;
784
- return region === (section.region === "china" ? "china" : "global") && Array.isArray(section.models) ? section.models : defaultModels.map((model) => ({ ...model }));
784
+ return defaultModels.map((model) => ({ ...model }));
785
785
  }
786
786
  function regionOf(value) {
787
787
  if (typeof value !== "object" || value === null) return "global";
@@ -1166,21 +1166,15 @@ window.__ModuleLoader__.load({
1166
1166
  "slots",
1167
1167
  "locale",
1168
1168
  "remote",
1169
- "remote.credentials"
1169
+ "remote.credentials",
1170
+ "configForms"
1170
1171
  ];
1171
1172
  const fill = (text, values) => {
1172
1173
  if (!values) return text;
1173
1174
  return Object.entries(values).reduce((next, [key, value]) => next.replace(new RegExp(`\\{${key}\\}`, "g"), String(value)), text);
1174
1175
  };
1175
1176
  function apply(ctx) {
1176
- ctx.inject(["settingsScope"], (child) => {
1177
- const scopes = child.settingsScope;
1178
- mount(child, scopes.bind({ namespace: settingsNamespace }));
1179
- });
1180
- ctx.inject(["configForms"], (child) => {
1181
- const forms = child.configForms;
1182
- mount(child, forms.get(settingsNamespace));
1183
- });
1177
+ mount(ctx, ctx.configForms.get(settingsNamespace));
1184
1178
  }
1185
1179
  function mount(ctx, modelScope) {
1186
1180
  ctx.effect(() => ctx.locale.register(localeNamespace, {
package/lib/index.d.ts CHANGED
@@ -43,8 +43,6 @@ type QoderWebSearchMode = 'auto' | 'always' | 'disabled';
43
43
  interface Config {
44
44
  region?: QoderRegion;
45
45
  modelsByRegion?: QoderModelsByRegion;
46
- /** @deprecated Migrated to modelsByRegion for the selected region. */
47
- models?: QoderCatalogModel[];
48
46
  streamIdleTimeoutMs?: number;
49
47
  responseHeaderTimeoutMs?: number;
50
48
  preserveThinking?: boolean;
package/lib/index.js CHANGED
@@ -830,8 +830,7 @@ async function resolveImagePart(block, context) {
830
830
  const target = {
831
831
  width: Math.max(1, Math.floor(width * scale)),
832
832
  height: Math.max(1, Math.floor(height * scale)),
833
- maxBytes: limits.maxImageBytes,
834
- maxPixels: limits.maxImagePixels
833
+ maxBytes: limits.maxImageBytes
835
834
  };
836
835
  image = await attachments.readImageRequest(block.attachment, target, signal);
837
836
  } catch (error) {
@@ -3000,7 +2999,7 @@ function createQoderTransport(options) {
3000
2999
  }
3001
3000
  //#endregion
3002
3001
  //#region src/dsh/config.ts
3003
- /** DSH configuration schema and region-scoped model catalog migration rules. */
3002
+ /** DSH configuration schema and region-scoped model catalog selection. */
3004
3003
  const catalogModel = z.object({
3005
3004
  id: z.string().required(),
3006
3005
  name: z.string().required(),
@@ -3028,7 +3027,6 @@ const modelsByRegionSchema = z.dict(z.array(catalogModel));
3028
3027
  const Config = z.object({
3029
3028
  region: z.union(["global", "china"]).default("global"),
3030
3029
  modelsByRegion: modelsByRegionSchema.default({}),
3031
- models: z.array(catalogModel),
3032
3030
  streamIdleTimeoutMs: z.number().step(1).min(1).default(defaultStreamIdleTimeoutMs),
3033
3031
  responseHeaderTimeoutMs: z.number().step(1).min(1).default(defaultResponseHeaderTimeoutMs),
3034
3032
  preserveThinking: z.boolean().default(true),
@@ -3053,11 +3051,8 @@ function resolveModels(models) {
3053
3051
  return { ...model };
3054
3052
  });
3055
3053
  }
3056
- function modelsFor(config, region, legacyModelsRegion = config.region ?? "global") {
3057
- const scoped = config.modelsByRegion?.[region];
3058
- if (scoped !== void 0) return resolveModels(scoped);
3059
- if (legacyModelsRegion === region && config.models !== void 0 && config.models.length > 0) return resolveModels(config.models);
3060
- return resolveModels(defaultModels);
3054
+ function modelsFor(config, region) {
3055
+ return resolveModels(config.modelsByRegion?.[region]);
3061
3056
  }
3062
3057
  //#endregion
3063
3058
  //#region src/dsh/provider.ts
@@ -3245,14 +3240,6 @@ async function resolveManagedQoderPat(credentials) {
3245
3240
  //#endregion
3246
3241
  //#region src/dsh/settings.ts
3247
3242
  function bindQoderSettings(owner, ctx, input, options) {
3248
- const settings = ctx.settings;
3249
- if (typeof settings.register === "function") {
3250
- const namespace = "provider-qoder";
3251
- return {
3252
- namespace,
3253
- scope: settings.register(namespace, Config, options)
3254
- };
3255
- }
3256
3243
  const namespace = owner.fiber.entry?.options.id ?? "provider-qoder";
3257
3244
  const get = () => readConfig(input);
3258
3245
  options.validate?.(get());
@@ -3265,10 +3252,9 @@ function bindQoderSettings(owner, ctx, input, options) {
3265
3252
  namespace,
3266
3253
  scope: {
3267
3254
  get,
3268
- update: (patch) => settings.update(namespace, patch),
3255
+ update: (patch) => ctx.settings.update(namespace, patch),
3269
3256
  watch: (listener) => {
3270
- const on = owner.on.bind(owner);
3271
- return ctx.effect(() => on("loader/volatile-update", () => {
3257
+ return ctx.effect(() => owner.on("loader/volatile-update", () => {
3272
3258
  Promise.resolve().then(listener).catch((error) => ctx.emit("internal/error", error));
3273
3259
  }));
3274
3260
  }
@@ -3313,7 +3299,7 @@ function registerQoderRpc(ctx, handler) {
3313
3299
  fetch: (request) => handleQoderRpcRequest(endpoint, handler, request)
3314
3300
  }));
3315
3301
  return () => {
3316
- for (const dispose of disposers) if (typeof dispose === "function") dispose();
3302
+ for (const dispose of disposers) dispose();
3317
3303
  };
3318
3304
  }
3319
3305
  /**
@@ -3386,19 +3372,15 @@ function publicError(code, message, details = { issues: [] }) {
3386
3372
  function apply(ctx, input = {}) {
3387
3373
  const config = readConfig(input);
3388
3374
  const logger = ctx.logger;
3389
- const initialRegion = config.region ?? "global";
3390
- const hasConfiguredModels = config.models !== void 0 && config.models.length > 0;
3391
3375
  const baseConfig = {
3392
- region: initialRegion,
3376
+ region: config.region ?? "global",
3393
3377
  modelsByRegion: { ...config.modelsByRegion },
3394
- ...hasConfiguredModels ? { models: resolveModels(config.models) } : {},
3395
3378
  streamIdleTimeoutMs: config.streamIdleTimeoutMs ?? 3e5,
3396
3379
  responseHeaderTimeoutMs: config.responseHeaderTimeoutMs ?? 6e4,
3397
3380
  preserveThinking: config.preserveThinking ?? true,
3398
3381
  webSearchMode: config.webSearchMode ?? "auto"
3399
3382
  };
3400
3383
  let current = () => baseConfig;
3401
- let legacyModelsRegion = initialRegion;
3402
3384
  let persistDiscoveredModels = async (_region) => {};
3403
3385
  const discoveredCatalogs = {
3404
3386
  global: [],
@@ -3418,7 +3400,7 @@ function apply(ctx, input = {}) {
3418
3400
  const region = value.region ?? "global";
3419
3401
  return {
3420
3402
  region,
3421
- models: mergeQoderDiscoveryMetadata(modelsFor(value, region, legacyModelsRegion), discoveredCatalogs[region]),
3403
+ models: mergeQoderDiscoveryMetadata(modelsFor(value, region), discoveredCatalogs[region]),
3422
3404
  streamIdleTimeoutMs: value.streamIdleTimeoutMs ?? 3e5,
3423
3405
  responseHeaderTimeoutMs: value.responseHeaderTimeoutMs ?? 6e4,
3424
3406
  preserveThinking: value.preserveThinking ?? true,
@@ -3464,15 +3446,11 @@ function apply(ctx, input = {}) {
3464
3446
  registration.replace([providerQoder]);
3465
3447
  };
3466
3448
  ctx.inject(["settings"], (settingsCtx) => {
3467
- const { scope, namespace } = bindQoderSettings(ctx, settingsCtx, input, {
3468
- base: baseConfig,
3469
- validate: (value) => {
3470
- for (const region of Object.keys(value.modelsByRegion ?? {})) if (region !== "global" && region !== "china") throw new Error(`provider-qoder: unsupported model catalog region "${region}"`);
3471
- modelsFor(value, "global", legacyModelsRegion);
3472
- modelsFor(value, "china", legacyModelsRegion);
3473
- }
3474
- });
3475
- legacyModelsRegion = scope.get().region ?? initialRegion;
3449
+ const { scope, namespace } = bindQoderSettings(ctx, settingsCtx, input, { validate: (value) => {
3450
+ for (const region of Object.keys(value.modelsByRegion ?? {})) if (region !== "global" && region !== "china") throw new Error(`provider-qoder: unsupported model catalog region "${region}"`);
3451
+ modelsFor(value, "global");
3452
+ modelsFor(value, "china");
3453
+ } });
3476
3454
  current = () => scope.get();
3477
3455
  let bindingActive = true;
3478
3456
  const persistCatalog = async (region) => {
@@ -3480,7 +3458,7 @@ function apply(ctx, input = {}) {
3480
3458
  if (!settingsCtx.settings.writable || discoveredCatalogs[region].length === 0) return;
3481
3459
  const snapshot = settingsCtx.settings.describe().find((section) => section.ns === namespace);
3482
3460
  if (snapshot === void 0) return;
3483
- const selected = modelsFor(snapshot.value, region, legacyModelsRegion);
3461
+ const selected = modelsFor(snapshot.value, region);
3484
3462
  const enriched = modelsFor(Config({ modelsByRegion: { [region]: mergeQoderDiscoveryMetadata(selected, discoveredCatalogs[region]) } }), region);
3485
3463
  if (hasSameQoderDiscoveryMetadata(selected, enriched)) return;
3486
3464
  try {
@@ -3493,9 +3471,6 @@ function apply(ctx, input = {}) {
3493
3471
  };
3494
3472
  persistDiscoveredModels = persistCatalog;
3495
3473
  refreshAdapter();
3496
- const loaded = scope.get();
3497
- const loadedRegion = loaded.region ?? "global";
3498
- if (loaded.models !== void 0 && loaded.models.length > 0 && loaded.modelsByRegion?.[loadedRegion] === void 0) scope.update({ modelsByRegion: { [loadedRegion]: resolveModels(loaded.models) } }).catch((error) => logger?.error?.("[Qoder Settings] Failed to migrate model catalog", logError(error)));
3499
3474
  scope.watch(async () => {
3500
3475
  if (!bindingActive || ctx.fiber.state === fiberUnloading || ctx.fiber.state === fiberDisposed) return;
3501
3476
  refreshAdapter();
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "dsh-provider-qoder",
3
3
  "description": "Global Qoder subscription adapter for the DeepSeek Harness LLM seam",
4
- "version": "0.3.1",
4
+ "version": "0.4.0",
5
5
  "publishConfig": {
6
6
  "access": "public"
7
7
  },
@@ -65,43 +65,42 @@
65
65
  },
66
66
  "license": "MIT",
67
67
  "peerDependencies": {
68
- "@deepseek-ai/cordis": ">=4.0.2 <5",
69
- "@deepseek-ai/dsh-api-remotes": ">=0.1.2-rc.1 <0.2",
70
- "@deepseek-ai/dsh-attachment": ">=0.1.2-rc.1 <0.2",
71
- "@deepseek-ai/dsh-client-connection": ">=0.1.2-rc.1 <0.2",
72
- "@deepseek-ai/dsh-client-locale": ">=0.1.2-rc.1 <0.2",
73
- "@deepseek-ai/dsh-client-ui-settings": ">=0.1.2-rc.1 <0.2",
74
- "@deepseek-ai/dsh-client-ui-slots": ">=0.1.2-rc.1 <0.2",
75
- "@deepseek-ai/dsh-credentials": ">=0.1.2-rc.1 <0.2",
76
- "@deepseek-ai/dsh-invariants": ">=0.1.2-rc.1 <0.2",
77
- "@deepseek-ai/dsh-llm": ">=0.1.2-rc.1 <0.2",
78
- "@deepseek-ai/dsh-settings": ">=0.1.2-rc.1 <0.2",
79
- "@deepseek-ai/dsh-web": ">=0.1.2-rc.1 <0.2",
68
+ "@deepseek-ai/cordis": ">=4.0.4 <5",
69
+ "@deepseek-ai/dsh-api-remotes": ">=0.1.7-rc.2 <0.2.0-0 || >=0.2.0-rc.1 <0.3.0-0",
70
+ "@deepseek-ai/dsh-attachment": ">=0.1.7-rc.2 <0.2.0-0 || >=0.2.0-rc.1 <0.3.0-0",
71
+ "@deepseek-ai/dsh-client-connection": ">=0.1.7-rc.2 <0.2.0-0 || >=0.2.0-rc.1 <0.3.0-0",
72
+ "@deepseek-ai/dsh-client-locale": ">=0.1.7-rc.2 <0.2.0-0 || >=0.2.0-rc.1 <0.3.0-0",
73
+ "@deepseek-ai/dsh-client-ui-settings": ">=0.1.7-rc.2 <0.2.0-0 || >=0.2.0-rc.1 <0.3.0-0",
74
+ "@deepseek-ai/dsh-client-ui-slots": ">=0.1.7-rc.2 <0.2.0-0 || >=0.2.0-rc.1 <0.3.0-0",
75
+ "@deepseek-ai/dsh-credentials": ">=0.1.7-rc.2 <0.2.0-0 || >=0.2.0-rc.1 <0.3.0-0",
76
+ "@deepseek-ai/dsh-invariants": ">=0.1.7-rc.2 <0.2.0-0 || >=0.2.0-rc.1 <0.3.0-0",
77
+ "@deepseek-ai/dsh-llm": ">=0.1.7-rc.2 <0.2.0-0 || >=0.2.0-rc.1 <0.3.0-0",
78
+ "@deepseek-ai/dsh-settings": ">=0.1.7-rc.2 <0.2.0-0 || >=0.2.0-rc.1 <0.3.0-0",
79
+ "@deepseek-ai/dsh-web": ">=0.1.7-rc.2 <0.2.0-0 || >=0.2.0-rc.1 <0.3.0-0",
80
80
  "react": "^18.2.0"
81
81
  },
82
82
  "dependencies": {
83
- "@deepseek-ai/schemastery": "3.18.3"
83
+ "@deepseek-ai/schemastery": "3.18.4"
84
84
  },
85
85
  "devDependencies": {
86
- "@deepseek-ai/cordis": "4.0.3",
87
- "@deepseek-ai/cordis-plugin-loader": "1.0.4",
88
- "@deepseek-ai/dsh-agent": "0.1.7-alpha.1",
89
- "@deepseek-ai/dsh-api-remotes": "0.1.7-alpha.1",
90
- "@deepseek-ai/dsh-app-boot": "0.1.7-alpha.1",
91
- "@deepseek-ai/dsh-attachment": "0.1.7-alpha.1",
92
- "@deepseek-ai/dsh-brand": "0.1.7-alpha.1",
93
- "@deepseek-ai/dsh-client-connection": "0.1.7-alpha.1",
94
- "@deepseek-ai/dsh-client-locale": "0.1.7-alpha.1",
95
- "@deepseek-ai/dsh-client-ui-settings": "0.1.7-alpha.1",
96
- "@deepseek-ai/dsh-client-ui-slots": "0.1.7-alpha.1",
97
- "@deepseek-ai/dsh-config-editor": "0.1.7-alpha.1",
98
- "@deepseek-ai/dsh-credentials": "0.1.7-alpha.1",
99
- "@deepseek-ai/dsh-invariants": "0.1.7-alpha.1",
100
- "@deepseek-ai/dsh-llm": "0.1.7-alpha.1",
101
- "@deepseek-ai/dsh-session": "0.1.7-alpha.1",
102
- "@deepseek-ai/dsh-settings": "0.1.7-alpha.1",
103
- "@deepseek-ai/dsh-settings-legacy": "npm:@deepseek-ai/dsh-settings@0.1.2-rc.1",
104
- "@deepseek-ai/dsh-web": "0.1.7-alpha.1",
86
+ "@deepseek-ai/cordis": "4.0.4",
87
+ "@deepseek-ai/cordis-plugin-loader": "1.0.5",
88
+ "@deepseek-ai/dsh-agent": "0.1.7-rc.2",
89
+ "@deepseek-ai/dsh-api-remotes": "0.1.7-rc.2",
90
+ "@deepseek-ai/dsh-app-boot": "0.1.7-rc.2",
91
+ "@deepseek-ai/dsh-attachment": "0.1.7-rc.2",
92
+ "@deepseek-ai/dsh-brand": "0.1.7-rc.2",
93
+ "@deepseek-ai/dsh-client-connection": "0.1.7-rc.2",
94
+ "@deepseek-ai/dsh-client-locale": "0.1.7-rc.2",
95
+ "@deepseek-ai/dsh-client-ui-settings": "0.1.7-rc.2",
96
+ "@deepseek-ai/dsh-client-ui-slots": "0.1.7-rc.2",
97
+ "@deepseek-ai/dsh-config-editor": "0.1.7-rc.2",
98
+ "@deepseek-ai/dsh-credentials": "0.1.7-rc.2",
99
+ "@deepseek-ai/dsh-invariants": "0.1.7-rc.2",
100
+ "@deepseek-ai/dsh-llm": "0.1.7-rc.2",
101
+ "@deepseek-ai/dsh-session": "0.1.7-rc.2",
102
+ "@deepseek-ai/dsh-settings": "0.1.7-rc.2",
103
+ "@deepseek-ai/dsh-web": "0.1.7-rc.2",
105
104
  "@types/node": "24.3.0",
106
105
  "@types/react": "18.3.1",
107
106
  "lightningcss": "^1.33.0",