@edge-sky/dsh-oauth-adapter 0.1.3-rc.1 → 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 +2 -2
- package/README.md +10 -22
- package/README.zh.md +10 -22
- package/lib/index.d.ts +5 -2
- package/lib/index.js +10 -1
- package/lib/model-catalog.js +4 -4
- package/lib/model-service.d.ts +6 -4
- package/lib/model-service.js +8 -9
- package/package.json +56 -51
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:
|
|
4
|
-
README.zh.md:
|
|
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
|
+
[](https://www.npmjs.com/package/@edge-sky/dsh-oauth-adapter)
|
|
4
|
+
[](https://www.npmjs.com/package/@edge-sky/dsh-oauth-adapter)
|
|
5
|
+
[](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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
55
|
+
The profile patch mounts an authorization fallback when the host does not provide `ctx.authorization`.
|
|
68
56
|
|
|
69
|
-
|
|
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
|
+
[](https://www.npmjs.com/package/@edge-sky/dsh-oauth-adapter)
|
|
4
|
+
[](https://www.npmjs.com/package/@edge-sky/dsh-oauth-adapter)
|
|
5
|
+
[](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
|
-
|
|
20
|
+
当前源码面向 DSH `0.2.0-rc.2`。发布声明 DSH 0.2 peer 依赖范围的适配器版本后,请安装该版本。较早的 DSH 版本需使用对应的适配器旧版本。
|
|
17
21
|
|
|
18
22
|
## 安装
|
|
19
23
|
|
|
20
|
-
对于 DSH
|
|
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
|
-
|
|
57
|
+
当宿主未提供 `ctx.authorization` 时,profile patch 会挂载授权服务后备实现。
|
|
70
58
|
|
|
71
|
-
|
|
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
|
|
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:
|
|
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,
|
package/lib/model-catalog.js
CHANGED
|
@@ -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
|
|
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
|
|
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
|
|
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-
|
|
130
|
+
retryPolicy: resolveRetryPolicy(parsed.retryPolicy, `dsh-oauth-adapter/${provider}`),
|
|
131
131
|
configuredMaxTokens: caps,
|
|
132
132
|
modelErrors: new Map(),
|
|
133
133
|
piProvider,
|
package/lib/model-service.d.ts
CHANGED
|
@@ -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
|
|
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:
|
|
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;
|
package/lib/model-service.js
CHANGED
|
@@ -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-
|
|
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
|
-
|
|
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(
|
|
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.
|
|
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.
|
|
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.
|
|
63
|
-
"@deepseek-ai/dsh-authorization": ">=0.
|
|
64
|
-
"@deepseek-ai/dsh-client-locale": ">=0.
|
|
65
|
-
"@deepseek-ai/dsh-client-ui-settings": ">=0.
|
|
66
|
-
"@deepseek-ai/dsh-client-ui-slots": ">=0.
|
|
67
|
-
"@deepseek-ai/dsh-credentials": ">=0.
|
|
68
|
-
"@deepseek-ai/dsh-host-webserver": ">=0.
|
|
69
|
-
"@deepseek-ai/dsh-invariants": ">=0.
|
|
70
|
-
"@deepseek-ai/dsh-llm": ">=0.
|
|
71
|
-
"@deepseek-ai/dsh-llm-pi-ai": ">=0.
|
|
72
|
-
"@deepseek-ai/dsh-settings": ">=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.
|
|
75
|
-
"@deepseek-ai/dsh-attachment": ">=0.
|
|
76
|
-
"@deepseek-ai/dsh-fs": ">=0.
|
|
77
|
-
"@deepseek-ai/dsh-client-ui-renderer": ">=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": "
|
|
136
|
+
"@deepseek-ai/schemastery": "~3.18.4",
|
|
128
137
|
"ws": "^8.18.3",
|
|
129
|
-
"@earendil-works/pi-ai": "0.
|
|
138
|
+
"@earendil-works/pi-ai": "^0.87.1"
|
|
130
139
|
},
|
|
131
140
|
"devDependencies": {
|
|
132
|
-
"@deepseek-ai/cordis": "
|
|
133
|
-
"@deepseek-ai/dsh-authorization": "0.
|
|
134
|
-
"@deepseek-ai/dsh-client-locale": "0.
|
|
135
|
-
"@deepseek-ai/dsh-client-ui-settings": "0.
|
|
136
|
-
"@deepseek-ai/dsh-client-ui-slots": "0.
|
|
137
|
-
"@deepseek-ai/dsh-credentials": "0.
|
|
138
|
-
"@deepseek-ai/dsh-host-webserver": "0.
|
|
139
|
-
"@deepseek-ai/dsh-invariants": "0.
|
|
140
|
-
"@deepseek-ai/dsh-llm": "0.
|
|
141
|
-
"@deepseek-ai/dsh-llm-pi-ai": "0.
|
|
142
|
-
"@deepseek-ai/dsh-settings": "0.
|
|
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.
|
|
153
|
-
"@deepseek-ai/dsh-attachment": "0.
|
|
154
|
-
"@deepseek-ai/dsh-fs": "0.
|
|
155
|
-
"@deepseek-ai/dsh-
|
|
156
|
-
"@deepseek-ai/dsh-
|
|
157
|
-
"@deepseek-ai/dsh-client-ui-renderer": "0.1.5-rc.2",
|
|
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.
|
|
160
|
-
"@deepseek-ai/dsh-client-store": "0.
|
|
161
|
-
"@deepseek-ai/dsh-atomic-write": "0.
|
|
162
|
-
"@deepseek-ai/dsh-home-paths": "0.
|
|
163
|
-
"@deepseek-ai/dsh-launch-environment": "0.
|
|
164
|
-
"@deepseek-ai/dsh-session": "0.
|
|
165
|
-
"@deepseek-ai/dsh-scope": "0.
|
|
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
|
-
|
|
186
|
-
"
|
|
187
|
-
"
|
|
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
|
+
}
|