@edge-sky/dsh-oauth-adapter 0.1.3-rc.2 → 0.1.3-rc.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.i18n.yaml CHANGED
@@ -1,4 +1,4 @@
1
1
  # Bilingual-pair consistency record: the git blob hash of each side as of the
2
2
  # last confirmed-consistent state. Both languages carry equal authority.
3
- README.md: 745b055c42ba308b7e9f33819f6c084bad98dda4
4
- README.zh.md: 6bcdf2437386378d19e0045d8c6397ba65637374
3
+ README.md: 643064b672859791cce2551254d03f3154647f20
4
+ README.zh.md: d1f28dc87675dd408f84eb495a67da58a7065b33
package/README.md CHANGED
@@ -1,5 +1,9 @@
1
1
  # dsh-oauth-adapter
2
2
 
3
+ [![npm version](https://img.shields.io/npm/v/@edge-sky/dsh-oauth-adapter)](https://www.npmjs.com/package/@edge-sky/dsh-oauth-adapter)
4
+ [![npm downloads](https://img.shields.io/npm/dm/@edge-sky/dsh-oauth-adapter)](https://www.npmjs.com/package/@edge-sky/dsh-oauth-adapter)
5
+ [![license](https://img.shields.io/npm/l/@edge-sky/dsh-oauth-adapter)](https://www.npmjs.com/package/@edge-sky/dsh-oauth-adapter)
6
+
3
7
  English | [中文](README.zh.md)
4
8
 
5
9
  An OAuth account page for the DSH Web profile. It supports:
@@ -13,35 +17,19 @@ An OAuth account page for the DSH Web profile. It supports:
13
17
  | OpenRouter | Browser PKCE callback |
14
18
  | xAI | Device code |
15
19
 
16
- dsh-oauth-adapter`>= v0.1.3-rc.0` has been adapted for DSH`v0.1.2-rc.1`; for earlier versions, please use dsh-oauth-adapter `v0.1.2-rc.0`.
20
+ This checkout targets DSH `0.2.0-rc.2`. Once an adapter release with the DSH 0.2 peer range is published, install that release. Earlier DSH releases require an earlier adapter release.
17
21
 
18
22
  ## Install
19
23
 
20
- For DSH`~v0.1.2-rc.1`
24
+ For DSH `0.2.0-rc.2`, after the compatible adapter release is published:
21
25
 
22
26
  ```sh
23
27
  dsh plugin --profile web add @edge-sky/dsh-oauth-adapter
24
28
  ```
25
29
 
26
- or
27
-
28
- ```sh
29
- npx @deepseek-ai/dsh plugin --profile web add @edge-sky/dsh-oauth-adapter
30
- ```
31
-
32
- ----
33
-
34
- For DSH`0.1.1-rc.2`
35
-
36
- ```sh
37
- dsh plugin --profile web add @edge-sky/dsh-oauth-adapter@v0.1.2-rc.0
38
- ```
39
-
40
- or
30
+ Or for the official desktop, use `@edge-sky/dsh-oauth-adapter`
41
31
 
42
- ```sh
43
- npx @deepseek-ai/dsh plugin --profile web add @edge-sky/dsh-oauth-adapter@v0.1.2-rc.0
44
- ```
32
+ For DSH `0.1.2-rc.1` through `0.1.5-rc.1`, use an adapter release from the `0.1.3` series. For DSH `0.1.1-rc.2`, use `@edge-sky/dsh-oauth-adapter@0.1.2-rc.0`.
45
33
 
46
34
  Start DSH:
47
35
 
@@ -64,9 +52,9 @@ For models not explicitly listed as supported by the built-in pi-ai, you can add
64
52
 
65
53
  DSH integrates pi-ai through the `@deepseek-ai/dsh-llm-pi-ai` adapter, but does not provide an OAuth entry point. `@edge-sky/dsh-oauth-adapter` exposes pi-ai's existing provider login flows through the DSH Authorization Service. Browser links, device codes, text and secret input, method selection, cancellation, and withdrawn prompts all use the same provider-neutral transport.
66
54
 
67
- Because DSH does not currently mount the `ctx.authorization` service, this plugin also mounts it manually.
55
+ The profile patch mounts an authorization fallback when the host does not provide `ctx.authorization`.
68
56
 
69
- The plugin itself does not manage OAuth credentials or maintain login state. Maybe DSH support this sign-in method in the future; but for now, this plugin lets you enjoy it.
57
+ DSH owns OAuth credentials and login state. This adapter stores model configuration in `dsh-oauth-adapter.modelStore`; see [model migration and recovery](docs/oauth-models.md).
70
58
 
71
59
  If this plugins is has helped you, please give a star for me, or create issues if you have any suggestion~
72
60
 
package/README.zh.md CHANGED
@@ -1,5 +1,9 @@
1
1
  # dsh-oauth-adapter
2
2
 
3
+ [![npm version](https://img.shields.io/npm/v/@edge-sky/dsh-oauth-adapter)](https://www.npmjs.com/package/@edge-sky/dsh-oauth-adapter)
4
+ [![npm downloads](https://img.shields.io/npm/dm/@edge-sky/dsh-oauth-adapter)](https://www.npmjs.com/package/@edge-sky/dsh-oauth-adapter)
5
+ [![license](https://img.shields.io/npm/l/@edge-sky/dsh-oauth-adapter)](https://www.npmjs.com/package/@edge-sky/dsh-oauth-adapter)
6
+
3
7
  [English](README.md) | 中文
4
8
 
5
9
  为 DSH Web profile 提供独立的 OAuth 账户页面。当前支持:
@@ -13,36 +17,20 @@
13
17
  | OpenRouter | 浏览器 PKCE 回调 |
14
18
  | xAI | 设备码 |
15
19
 
16
- dsh-oauth-adapter`>= v0.1.3-rc.0` 已适配 DSH`v0.1.2-rc.1`,早期版本请使用 dsh-oauth-adapter`v0.1.2-rc.0`
20
+ 当前源码面向 DSH `0.2.0-rc.2`。发布声明 DSH 0.2 peer 依赖范围的适配器版本后,请安装该版本。较早的 DSH 版本需使用对应的适配器旧版本。
17
21
 
18
22
  ## 安装
19
23
 
20
- 对于 DSH`~v0.1.2-rc.1`
24
+ 对于 DSH `0.2.0-rc.2`:
21
25
 
22
26
  ```sh
23
27
  dsh plugin --profile web add @edge-sky/dsh-oauth-adapter
24
28
  ```
25
29
 
26
- 或
27
-
28
- ```sh
29
- npx @deepseek-ai/dsh plugin --profile web add @edge-sky/dsh-oauth-adapter
30
- ```
31
-
32
- ----
33
-
34
- 对于 DSH`0.1.1-rc.2`
35
-
36
- ```sh
37
- dsh plugin --profile web add @edge-sky/dsh-oauth-adapter@v0.1.2-rc.0
38
- ```
39
-
40
- 或
30
+ 或使用于官方桌面端 `@edge-sky/dsh-oauth-adapter`
41
31
 
42
- ```sh
43
- npx @deepseek-ai/dsh plugin --profile web add @edge-sky/dsh-oauth-adapter@v0.1.2-rc.0
44
- ```
45
32
 
33
+ 对于 DSH `0.1.2-rc.1` 至 `0.1.5-rc.1`,请使用适配器 `0.1.3` 系列;对于 DSH `0.1.1-rc.2`,请使用 `@edge-sky/dsh-oauth-adapter@0.1.2-rc.0`。
46
34
 
47
35
  启动 DSH:
48
36
 
@@ -66,8 +54,8 @@ npx @deepseek-ai/dsh web
66
54
 
67
55
  DSH 通过 `@deepseek-ai/dsh-llm-pi-ai` 适配器接入 pi-ai,但并没有提供 OAuth 的入口。`@edge-sky/dsh-oauth-adapter` 通过 DSH Authorization Service 暴露 pi-ai 已有的 provider 登录流程。浏览器链接、设备码、文本与密码输入、登录方式选择、取消和撤回提示均通过同一套 provider-neutral 传输完成。
68
56
 
69
- 由于 DSH 目前并没有挂载`ctx.authorization`服务,因此该插件同时手动对其进行了挂载
57
+ 当宿主未提供 `ctx.authorization` 时,profile patch 会挂载授权服务后备实现。
70
58
 
71
- 插件本身并不承担 OAuth 凭证管理与维持登录态的职责,或许将来 DSH 会官方支持这一登录方式,但至少现在你可以通过这个插件体验它
59
+ OAuth 凭据和登录状态由 DSH 管理。适配器将模型配置保存在 `dsh-oauth-adapter.modelStore`;参见[模型迁移与恢复](docs/oauth-models.zh.md)。
72
60
 
73
61
  如果这个插件帮到了你,还请留下你的小星星,如果有任何建议,欢迎 issues~
package/lib/index.d.ts CHANGED
@@ -5,13 +5,16 @@
5
5
  */
6
6
  import { type ModelContext } from './model-service.js';
7
7
  import type { IncomingMessage } from 'node:http';
8
+ import type { Volatile } from '@deepseek-ai/cordis';
8
9
  import type { AuthorizationService } from '@deepseek-ai/dsh-authorization';
9
10
  import type { CredentialProvider } from '@deepseek-ai/dsh-credentials';
10
11
  import type { WebServer } from '@deepseek-ai/dsh-host-webserver';
11
- import { type SettingsProvider } from '@deepseek-ai/dsh-settings';
12
+ import type SettingsForms from '@deepseek-ai/dsh-settings';
12
13
  import z from '@deepseek-ai/schemastery';
14
+ import { type ModelStore } from './model-catalog.js';
13
15
  /** Plugin configuration. */
14
16
  export interface Config {
17
+ modelStore: Volatile<ModelStore>;
15
18
  /** Emit secret-free transport lifecycle diagnostics. */
16
19
  debug?: boolean;
17
20
  modelSyncTimeoutMs?: number;
@@ -28,7 +31,7 @@ export declare const inject: string[];
28
31
  type OAuthContext = ModelContext & {
29
32
  authorization: AuthorizationService;
30
33
  credentials: CredentialProvider;
31
- settings: SettingsProvider;
34
+ settings: SettingsForms;
32
35
  webServer: WebServer;
33
36
  };
34
37
  /** Whether a socket address belongs to the local host. */
package/lib/index.js CHANGED
@@ -10,8 +10,10 @@ import { inspect } from 'node:util';
10
10
  import z from '@deepseek-ai/schemastery';
11
11
  import WebSocket, { WebSocketServer } from 'ws';
12
12
  import { MAX_FRAME_BYTES, OAUTH_SOCKET_PATH, OAUTH_SOCKET_PROTOCOL, PROVIDERS, parseClientCommand, } from './protocol.js';
13
+ import { validateModelStore } from './model-catalog.js';
13
14
  /** Runtime-validated plugin configuration. */
14
15
  export const Config = z.object({
16
+ modelStore: z.object({ version: z.const(1).default(1), providers: z.dict(z.any()).default({}) }).default({ version: 1, providers: {} }).volatile(),
15
17
  debug: z.boolean().default(false),
16
18
  modelSyncTimeoutMs: z.number().min(1).max(2147483647).step(1).default(30000),
17
19
  modelSyncMaxResponseBytes: z.number().min(1024).step(1).default(4194304),
@@ -464,6 +466,13 @@ class OAuthConnection {
464
466
  }
465
467
  /** Mount the loopback-only OAuth WebSocket over official rc services. */
466
468
  export function apply(ctx, config) {
469
+ validateModelStore(config.modelStore.get());
470
+ ctx.on('internal/config', function (_raw, next) {
471
+ const raw = next();
472
+ if (this === ctx.fiber)
473
+ validateModelStore(Config(raw).modelStore.get());
474
+ return raw;
475
+ });
467
476
  const debug = config.debug === true
468
477
  ? (message) => { ctx.logger.debug('dsh-oauth-adapter: %s', message); }
469
478
  : () => { };
@@ -474,7 +483,7 @@ export function apply(ctx, config) {
474
483
  maxPages: config.modelSyncMaxPages ?? 100,
475
484
  codexClientVersion: config.codexClientVersion ?? '0.149.0',
476
485
  }, provider => { for (const connection of connections)
477
- connection.modelChanged(provider); });
486
+ connection.modelChanged(provider); }, config.modelStore);
478
487
  const server = new WebSocketServer({
479
488
  noServer: true,
480
489
  maxPayload: MAX_FRAME_BYTES,
@@ -21,10 +21,10 @@ export const providerFactories = {
21
21
  /** Validate data loaded from the settings file, including the opaque legacy profile. */
22
22
  export function validateModelStore(value) {
23
23
  if (!value || typeof value !== 'object')
24
- throw new Error('Invalid oauth-models settings');
24
+ throw new Error('Invalid OAuth modelStore settings');
25
25
  const store = value;
26
26
  if (store.version !== 1 || !store.providers || typeof store.providers !== 'object' || Array.isArray(store.providers))
27
- throw new Error('Unsupported oauth-models format');
27
+ throw new Error('Unsupported OAuth modelStore format');
28
28
  for (const [id, entry] of Object.entries(store.providers)) {
29
29
  if (!PROVIDERS.some(p => p.id === id) || !entry || !['pending', 'managed'].includes(entry.phase))
30
30
  throw new Error('Invalid OAuth model provider');
@@ -47,7 +47,7 @@ export function validateModelStore(value) {
47
47
  /** Exact IDs only: unrelated providers and display-name similarities confer no compatibility. */
48
48
  export function materialize(provider, state, catalog = providerFactories[provider]()) {
49
49
  const defaults = new Map(catalog.getModels().map(m => [m.id, m]));
50
- const parsed = PiConfig({ providers: { [provider]: state.legacy } }).providers?.[provider];
50
+ const parsed = structuredClone(PiConfig({ providers: { [provider]: state.legacy } }).providers.get()[provider]);
51
51
  if (!parsed)
52
52
  throw new Error('Missing provider profile');
53
53
  const manual = new Map(state.manual.map(m => [m.id, m]));
@@ -127,7 +127,7 @@ export function materialize(provider, state, catalog = providerFactories[provide
127
127
  maxRequestImageBytes: parsed.maxRequestImageBytes ?? 20971520,
128
128
  requestImagePixelBudget: parsed.requestImagePixelBudget ?? 4194304,
129
129
  requestImageMaxBytes: parsed.requestImageMaxBytes ?? 1048576,
130
- retryPolicy: resolveRetryPolicy(parsed.retryPolicy, `oauth-models/${provider}`),
130
+ retryPolicy: resolveRetryPolicy(parsed.retryPolicy, `dsh-oauth-adapter/${provider}`),
131
131
  configuredMaxTokens: caps,
132
132
  modelErrors: new Map(),
133
133
  piProvider,
@@ -1,10 +1,11 @@
1
1
  /** Persistent OAuth model management and reversible ownership of existing provider routes. */
2
- import type { Context } from '@deepseek-ai/cordis';
2
+ import type { Context, Volatile } from '@deepseek-ai/cordis';
3
3
  import type { CredentialProvider } from '@deepseek-ai/dsh-credentials';
4
- import type { SettingsProvider } from '@deepseek-ai/dsh-settings';
4
+ import type SettingsForms from '@deepseek-ai/dsh-settings';
5
5
  import type LlmRuntime from '@deepseek-ai/dsh-llm';
6
6
  import { type ProviderId } from './protocol.js';
7
7
  import { type ModelPage, type ManualModel } from './model-types.js';
8
+ import { type ModelStore } from './model-catalog.js';
8
9
  export interface ModelServiceOptions {
9
10
  timeoutMs: number;
10
11
  maxResponseBytes: number;
@@ -12,7 +13,7 @@ export interface ModelServiceOptions {
12
13
  codexClientVersion: string;
13
14
  }
14
15
  export type ModelContext = Context & {
15
- settings: SettingsProvider;
16
+ settings: SettingsForms;
16
17
  credentials: CredentialProvider;
17
18
  llm: LlmRuntime;
18
19
  };
@@ -20,6 +21,7 @@ export declare class OAuthModelService {
20
21
  private readonly ctx;
21
22
  private readonly options;
22
23
  private readonly changed;
24
+ private readonly modelStore;
23
25
  private profiles;
24
26
  private handle;
25
27
  private readonly queues;
@@ -34,7 +36,7 @@ export declare class OAuthModelService {
34
36
  private readonly signedOut;
35
37
  private readonly adapter;
36
38
  readonly ready: Promise<void>;
37
- constructor(ctx: ModelContext, options: ModelServiceOptions, changed: (provider: ProviderId) => void);
39
+ constructor(ctx: ModelContext, options: ModelServiceOptions, changed: (provider: ProviderId) => void, modelStore: Volatile<ModelStore>);
38
40
  private state;
39
41
  revision(): number;
40
42
  isManaged(provider: ProviderId): boolean;
@@ -1,4 +1,3 @@
1
- import z from '@deepseek-ai/schemastery';
2
1
  import { createModels } from '@earendil-works/pi-ai';
3
2
  import { SettingsConflictError } from '@deepseek-ai/dsh-settings';
4
3
  import { resolveImageAttachmentAccess } from '@deepseek-ai/dsh-llm';
@@ -8,15 +7,15 @@ import { MODEL_PAGE_SIZE, MODEL_PROTOCOLS, validManual } from './model-types.js'
8
7
  import { accountIdentity, credentialBridge, fromRecord } from './model-auth.js';
9
8
  import { materialize, providerFactories, validateModelStore } from './model-catalog.js';
10
9
  import { discoverAccountModels, ModelOperationError } from './model-discovery.js';
11
- const NS = 'oauth-models';
10
+ const NS = 'dsh-oauth-adapter';
12
11
  const LEGACY_NS = 'llm-pi-ai';
13
- const Schema = z.object({ version: z.const(1).default(1), providers: z.dict(z.any()).default({}) });
14
12
  function object(value) { return value && typeof value === 'object' && !Array.isArray(value) ? value : undefined; }
15
13
  function failure(code, message) { throw new ModelOperationError(code, message); }
16
14
  export class OAuthModelService {
17
15
  ctx;
18
16
  options;
19
17
  changed;
18
+ modelStore;
20
19
  profiles = new Map();
21
20
  handle;
22
21
  queues = new Map();
@@ -31,11 +30,11 @@ export class OAuthModelService {
31
30
  signedOut = new Set();
32
31
  adapter;
33
32
  ready;
34
- constructor(ctx, options, changed) {
33
+ constructor(ctx, options, changed, modelStore) {
35
34
  this.ctx = ctx;
36
35
  this.options = options;
37
36
  this.changed = changed;
38
- const scope = ctx.settings.register(NS, Schema, { base: { version: 1, providers: {} }, validate: value => { validateModelStore(value); } });
37
+ this.modelStore = modelStore;
39
38
  this.adapter = new PiAiAdapter({
40
39
  profiles: () => this.profiles,
41
40
  resolveApiKey: async () => undefined,
@@ -47,8 +46,8 @@ export class OAuthModelService {
47
46
  resolveImageAccess: (attachments, ref) => resolveImageAttachmentAccess(attachments, hostPath => ctx.get('fs')?.processPathFromHostPath(hostPath), ref),
48
47
  });
49
48
  this.ready = this.initialize();
50
- this.disposers.push(scope.watch(() => {
51
- if (this.closed)
49
+ this.disposers.push(ctx.on('settings/document-updated', ns => {
50
+ if (this.closed || ns !== NS)
52
51
  return;
53
52
  for (const p of PROVIDERS)
54
53
  void this.enqueue(p.id, async () => { await this.reconcile(p.id); }).catch(error => this.report(p.id, error));
@@ -60,7 +59,7 @@ export class OAuthModelService {
60
59
  void this.enqueue(provider, async () => { await this.reconcile(provider); }).catch(error => this.report(provider, error));
61
60
  }));
62
61
  }
63
- state() { return validateModelStore(this.ctx.settings.get(NS)); }
62
+ state() { return validateModelStore(this.modelStore.get()); }
64
63
  revision() { return this.ctx.settings.describe().find(s => s.ns === NS)?.revision ?? 0; }
65
64
  isManaged(provider) { return this.profiles.has(provider); }
66
65
  checkRevision(revision) { if (revision !== this.revision())
@@ -71,7 +70,7 @@ export class OAuthModelService {
71
70
  this.checkOpen();
72
71
  materialize(provider, state);
73
72
  try {
74
- await this.ctx.settings.mutate(NS, [{ op: 'set', path: ['providers', provider], value: state }], revision);
73
+ await this.ctx.settings.mutate(NS, [{ op: 'set', path: ['modelStore', 'providers', provider], value: state }], revision);
75
74
  }
76
75
  catch (error) {
77
76
  if (error instanceof SettingsConflictError)
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@edge-sky/dsh-oauth-adapter",
3
3
  "description": "Web OAuth account surface for official DSH authorization flows",
4
- "version": "0.1.3-rc.2",
4
+ "version": "0.1.3-rc.3",
5
5
  "author": {
6
6
  "name": "edge-sky",
7
7
  "url": "https://github.com/edge-sky"
@@ -13,6 +13,7 @@
13
13
  "type": "git",
14
14
  "url": "git+https://github.com/edge-sky/dsh-oauth-adapter.git"
15
15
  },
16
+ "packageManager": "pnpm@11.23.0",
16
17
  "engines": {
17
18
  "node": "^22.19.0 || >=24.0.0"
18
19
  },
@@ -44,6 +45,14 @@
44
45
  "lib/**/*.js",
45
46
  "lib/**/*.d.ts"
46
47
  ],
48
+ "scripts": {
49
+ "build": "tsdown && pnpm run build:host && pnpm run build:client:types",
50
+ "build:host": "tsc -p tsconfig.json",
51
+ "build:client:types": "tsc -p tsconfig.client.json",
52
+ "test": "pnpm run build && vitest run",
53
+ "typecheck": "tsc -p tsconfig.json --noEmit && tsc -p tsconfig.client.json --noEmit",
54
+ "prepack": "pnpm run typecheck && pnpm test"
55
+ },
47
56
  "license": "MIT",
48
57
  "dsh": {
49
58
  "bundle": {
@@ -59,22 +68,22 @@
59
68
  }
60
69
  },
61
70
  "peerDependencies": {
62
- "@deepseek-ai/cordis": ">=4.0.2",
63
- "@deepseek-ai/dsh-authorization": ">=0.1.5-rc.1 <0.1.6-0",
64
- "@deepseek-ai/dsh-client-locale": ">=0.1.5-rc.1 <0.1.6-0",
65
- "@deepseek-ai/dsh-client-ui-settings": ">=0.1.5-rc.1 <0.1.6-0",
66
- "@deepseek-ai/dsh-client-ui-slots": ">=0.1.5-rc.1 <0.1.6-0",
67
- "@deepseek-ai/dsh-credentials": ">=0.1.5-rc.1 <0.1.6-0",
68
- "@deepseek-ai/dsh-host-webserver": ">=0.1.5-rc.1 <0.1.6-0",
69
- "@deepseek-ai/dsh-invariants": ">=0.1.5-rc.1 <0.1.6-0",
70
- "@deepseek-ai/dsh-llm": ">=0.1.5-rc.1 <0.1.6-0",
71
- "@deepseek-ai/dsh-llm-pi-ai": ">=0.1.5-rc.1 <0.1.6-0",
72
- "@deepseek-ai/dsh-settings": ">=0.1.5-rc.1 <0.1.6-0",
71
+ "@deepseek-ai/cordis": ">=4.0.4 <5",
72
+ "@deepseek-ai/dsh-authorization": ">=0.2.0-rc.2 <0.3.0-0",
73
+ "@deepseek-ai/dsh-client-locale": ">=0.2.0-rc.2 <0.3.0-0",
74
+ "@deepseek-ai/dsh-client-ui-settings": ">=0.2.0-rc.2 <0.3.0-0",
75
+ "@deepseek-ai/dsh-client-ui-slots": ">=0.2.0-rc.2 <0.3.0-0",
76
+ "@deepseek-ai/dsh-credentials": ">=0.2.0-rc.2 <0.3.0-0",
77
+ "@deepseek-ai/dsh-host-webserver": ">=0.2.0-rc.2 <0.3.0-0",
78
+ "@deepseek-ai/dsh-invariants": ">=0.2.0-rc.2 <0.3.0-0",
79
+ "@deepseek-ai/dsh-llm": ">=0.2.0-rc.2 <0.3.0-0",
80
+ "@deepseek-ai/dsh-llm-pi-ai": ">=0.2.0-rc.2 <0.3.0-0",
81
+ "@deepseek-ai/dsh-settings": ">=0.2.0-rc.2 <0.3.0-0",
73
82
  "react": ">=18.2.0",
74
- "@deepseek-ai/dsh-client-ui-settings-models": ">=0.1.5-rc.1 <0.1.6-0",
75
- "@deepseek-ai/dsh-attachment": ">=0.1.5-rc.1 <0.1.6-0",
76
- "@deepseek-ai/dsh-fs": ">=0.1.5-rc.1 <0.1.6-0",
77
- "@deepseek-ai/dsh-client-ui-renderer": ">=0.1.5-rc.1 <0.1.6-0"
83
+ "@deepseek-ai/dsh-client-ui-settings-models": ">=0.2.0-rc.2 <0.3.0-0",
84
+ "@deepseek-ai/dsh-attachment": ">=0.2.0-rc.2 <0.3.0-0",
85
+ "@deepseek-ai/dsh-fs": ">=0.2.0-rc.2 <0.3.0-0",
86
+ "@deepseek-ai/dsh-client-ui-renderer": ">=0.2.0-rc.2 <0.3.0-0"
78
87
  },
79
88
  "peerDependenciesMeta": {
80
89
  "@deepseek-ai/cordis": {
@@ -124,22 +133,22 @@
124
133
  }
125
134
  },
126
135
  "dependencies": {
127
- "@deepseek-ai/schemastery": "^3.18.2",
136
+ "@deepseek-ai/schemastery": "~3.18.4",
128
137
  "ws": "^8.18.3",
129
- "@earendil-works/pi-ai": "0.85.1"
138
+ "@earendil-works/pi-ai": "^0.87.1"
130
139
  },
131
140
  "devDependencies": {
132
- "@deepseek-ai/cordis": "^4.0.2",
133
- "@deepseek-ai/dsh-authorization": "0.1.5-rc.1",
134
- "@deepseek-ai/dsh-client-locale": "0.1.5-rc.1",
135
- "@deepseek-ai/dsh-client-ui-settings": "0.1.5-rc.1",
136
- "@deepseek-ai/dsh-client-ui-slots": "0.1.5-rc.1",
137
- "@deepseek-ai/dsh-credentials": "0.1.5-rc.1",
138
- "@deepseek-ai/dsh-host-webserver": "0.1.5-rc.1",
139
- "@deepseek-ai/dsh-invariants": "0.1.5-rc.1",
140
- "@deepseek-ai/dsh-llm": "0.1.5-rc.1",
141
- "@deepseek-ai/dsh-llm-pi-ai": "0.1.5-rc.1",
142
- "@deepseek-ai/dsh-settings": "0.1.5-rc.1",
141
+ "@deepseek-ai/cordis": "~4.0.4",
142
+ "@deepseek-ai/dsh-authorization": "0.2.0-rc.2",
143
+ "@deepseek-ai/dsh-client-locale": "0.2.0-rc.2",
144
+ "@deepseek-ai/dsh-client-ui-settings": "0.2.0-rc.2",
145
+ "@deepseek-ai/dsh-client-ui-slots": "0.2.0-rc.2",
146
+ "@deepseek-ai/dsh-credentials": "0.2.0-rc.2",
147
+ "@deepseek-ai/dsh-host-webserver": "0.2.0-rc.2",
148
+ "@deepseek-ai/dsh-invariants": "0.2.0-rc.2",
149
+ "@deepseek-ai/dsh-llm": "0.2.0-rc.2",
150
+ "@deepseek-ai/dsh-llm-pi-ai": "0.2.0-rc.2",
151
+ "@deepseek-ai/dsh-settings": "0.2.0-rc.2",
143
152
  "@types/node": "^22.20.0",
144
153
  "@types/react": "~18.3.1",
145
154
  "@types/react-dom": "~18.3.1",
@@ -149,20 +158,19 @@
149
158
  "tsdown": "^0.22.2",
150
159
  "typescript": "^6.0.3",
151
160
  "vitest": "^4.1.8",
152
- "@deepseek-ai/dsh-client-ui-settings-models": "0.1.5-rc.1",
153
- "@deepseek-ai/dsh-attachment": "0.1.5-rc.1",
154
- "@deepseek-ai/dsh-fs": "0.1.5-rc.1",
155
- "@deepseek-ai/dsh-settings-file": "0.1.5-rc.1",
156
- "@deepseek-ai/dsh-credentials-local": "0.1.5-rc.1",
157
- "@deepseek-ai/dsh-client-ui-renderer": "0.1.5-rc.1",
161
+ "@deepseek-ai/dsh-client-ui-settings-models": "0.2.0-rc.2",
162
+ "@deepseek-ai/dsh-attachment": "0.2.0-rc.2",
163
+ "@deepseek-ai/dsh-fs": "0.2.0-rc.2",
164
+ "@deepseek-ai/dsh-credentials-local": "0.2.0-rc.2",
165
+ "@deepseek-ai/dsh-client-ui-renderer": "0.2.0-rc.2",
158
166
  "jsdom": "^26.1.0",
159
- "@deepseek-ai/dsh-client-ui-primitives": "0.1.5-rc.1",
160
- "@deepseek-ai/dsh-client-store": "0.1.5-rc.1",
161
- "@deepseek-ai/dsh-atomic-write": "0.1.5-rc.1",
162
- "@deepseek-ai/dsh-home-paths": "0.1.5-rc.1",
163
- "@deepseek-ai/dsh-launch-environment": "0.1.5-rc.1",
164
- "@deepseek-ai/dsh-session": "0.1.5-rc.1",
165
- "@deepseek-ai/dsh-scope": "0.1.5-rc.1",
167
+ "@deepseek-ai/dsh-client-ui-primitives": "0.2.0-rc.2",
168
+ "@deepseek-ai/dsh-client-store": "0.2.0-rc.2",
169
+ "@deepseek-ai/dsh-atomic-write": "0.2.0-rc.2",
170
+ "@deepseek-ai/dsh-home-paths": "0.2.0-rc.2",
171
+ "@deepseek-ai/dsh-launch-environment": "0.2.0-rc.2",
172
+ "@deepseek-ai/dsh-session": "0.2.0-rc.2",
173
+ "@deepseek-ai/dsh-scope": "0.2.0-rc.2",
166
174
  "clsx": "^2.0.0",
167
175
  "anser": "^2.3.5",
168
176
  "shiki": "^4.3.1",
@@ -180,13 +188,10 @@
180
188
  "micromark-util-sanitize-uri": "^2.0.1",
181
189
  "katex": "^0.16.47",
182
190
  "zustand": "~4.4.7",
183
- "immer": "^10.1.1"
184
- },
185
- "scripts": {
186
- "build": "tsdown && pnpm run build:host && pnpm run build:client:types",
187
- "build:host": "tsc -p tsconfig.json",
188
- "build:client:types": "tsc -p tsconfig.client.json",
189
- "test": "pnpm run build && vitest run",
190
- "typecheck": "tsc -p tsconfig.json --noEmit && tsc -p tsconfig.client.json --noEmit"
191
+ "immer": "^10.1.1",
192
+ "@deepseek-ai/dsh-util-workspace-path": "0.2.0-rc.2",
193
+ "@deepseek-ai/dsh-util-code-language": "0.2.0-rc.2",
194
+ "diff": "^9.0.0",
195
+ "simple-icons": "16.31.0"
191
196
  }
192
- }
197
+ }