@dan-ai-studio/dshopencodego 0.1.21 → 0.1.23
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.en.md +2 -1
- package/README.md +2 -1
- package/lib/client.js +299 -10
- package/lib/index.js +156 -10
- package/lib/types/catalog/constants.d.ts +3 -1
- package/lib/types/catalog/constants.js +3 -1
- package/lib/types/catalog/index.d.ts +1 -1
- package/lib/types/catalog/index.js +1 -1
- package/lib/types/conversion/stream.js +6 -0
- package/lib/types/go-limits.js +1 -1
- package/lib/types/index.d.ts +3 -3
- package/lib/types/index.js +7 -4
- package/lib/types/remotes.js +2 -1
- package/lib/types/session-header.d.ts +5 -3
- package/lib/types/session-header.js +8 -4
- package/lib/types/update/check.d.ts +74 -0
- package/lib/types/update/check.js +132 -0
- package/lib/types/update/contract.d.ts +23 -0
- package/lib/types/update/contract.js +52 -0
- package/lib/types/update/index.d.ts +12 -0
- package/lib/types/update/index.js +10 -0
- package/lib/types/update/service.d.ts +28 -0
- package/lib/types/update/service.js +28 -0
- package/lib/types/update/version.d.ts +14 -0
- package/lib/types/update/version.js +16 -0
- package/package.json +26 -26
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Self update check: is a newer release of this package published?
|
|
3
|
+
*
|
|
4
|
+
* This module only *reads*: it asks the npm registry for the latest published
|
|
5
|
+
* version and compares it with the running build. It never downloads,
|
|
6
|
+
* installs, or replaces anything — the actual update stays with the host's
|
|
7
|
+
* `pluginManager` (`removeBundle` + `installBundle`), driven by an explicit
|
|
8
|
+
* user click on the settings page. Automatic self-replacement would bypass
|
|
9
|
+
* the host's manifest lock, peer-compatibility checks, build approvals, and
|
|
10
|
+
* HMR lifecycle, so it is deliberately not implemented here.
|
|
11
|
+
*
|
|
12
|
+
* The check runs only when the settings page asks (page open or manual
|
|
13
|
+
* refresh), never on the model-request path, and fails silent: an unreachable
|
|
14
|
+
* registry simply hides the banner instead of erroring the page.
|
|
15
|
+
*
|
|
16
|
+
* @module @dan-ai-studio/dshopencodego/update/check
|
|
17
|
+
*/
|
|
18
|
+
/** This package as addressed on the registry. */
|
|
19
|
+
export const PACKAGE_NAME = '@dan-ai-studio/dshopencodego';
|
|
20
|
+
/** Document address answering `{ "version": "x.y.z", ... }`. */
|
|
21
|
+
export const REGISTRY_LATEST_URL = `https://registry.npmjs.org/${encodeURIComponent(PACKAGE_NAME)}/latest`;
|
|
22
|
+
/** How long one lookup answers for before the registry is asked again. */
|
|
23
|
+
export const CHECK_CACHE_MS = 6 * 60 * 60 * 1000;
|
|
24
|
+
/** Bound on one registry round trip; expiry fails silent, never throws. */
|
|
25
|
+
export const CHECK_TIMEOUT_MS = 10_000;
|
|
26
|
+
/** Split `1.2.3-tag.4+build` into comparable parts; invalid input yields undefined. */
|
|
27
|
+
export function parseVersion(value) {
|
|
28
|
+
const match = /^(\d+)\.(\d+)\.(\d+)(?:-([0-9a-zA-Z.-]+))?(?:\+[0-9a-zA-Z.-]+)?$/.exec(value.trim());
|
|
29
|
+
if (match === undefined || match === null)
|
|
30
|
+
return undefined;
|
|
31
|
+
const [, major, minor, patch, prerelease] = match;
|
|
32
|
+
return {
|
|
33
|
+
core: [Number(major), Number(minor), Number(patch)],
|
|
34
|
+
prerelease: prerelease === undefined ? undefined : prerelease.split('.'),
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Compare two version strings.
|
|
39
|
+
* @returns negative when `left` is older, positive when newer, zero when equal.
|
|
40
|
+
* @throws {Error} when either side is not a version.
|
|
41
|
+
*/
|
|
42
|
+
export function compareVersions(left, right) {
|
|
43
|
+
const ours = parseVersion(left);
|
|
44
|
+
const theirs = parseVersion(right);
|
|
45
|
+
if (ours === undefined || theirs === undefined)
|
|
46
|
+
throw new Error(`dshopencodego: cannot compare versions "${left}" and "${right}"`);
|
|
47
|
+
for (let index = 0; index < 3; index += 1) {
|
|
48
|
+
const difference = (ours.core[index] ?? 0) - (theirs.core[index] ?? 0);
|
|
49
|
+
if (difference !== 0)
|
|
50
|
+
return difference;
|
|
51
|
+
}
|
|
52
|
+
if (ours.prerelease === undefined && theirs.prerelease === undefined)
|
|
53
|
+
return 0;
|
|
54
|
+
if (ours.prerelease === undefined)
|
|
55
|
+
return 1;
|
|
56
|
+
if (theirs.prerelease === undefined)
|
|
57
|
+
return -1;
|
|
58
|
+
const width = Math.max(ours.prerelease.length, theirs.prerelease.length);
|
|
59
|
+
for (let index = 0; index < width; index += 1) {
|
|
60
|
+
const oursPart = ours.prerelease[index];
|
|
61
|
+
const theirsPart = theirs.prerelease[index];
|
|
62
|
+
if (oursPart === undefined)
|
|
63
|
+
return -1;
|
|
64
|
+
if (theirsPart === undefined)
|
|
65
|
+
return 1;
|
|
66
|
+
if (oursPart !== theirsPart)
|
|
67
|
+
return oursPart < theirsPart ? -1 : 1;
|
|
68
|
+
}
|
|
69
|
+
return 0;
|
|
70
|
+
}
|
|
71
|
+
/** True when `latest` is a newer release than `current`. Unparsable input is never an update. */
|
|
72
|
+
export function isUpdateAvailable(current, latest) {
|
|
73
|
+
if (latest === undefined)
|
|
74
|
+
return false;
|
|
75
|
+
try {
|
|
76
|
+
return compareVersions(latest, current) > 0;
|
|
77
|
+
}
|
|
78
|
+
catch {
|
|
79
|
+
return false;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
/** Read the `version` field out of a registry `latest` document. */
|
|
83
|
+
export function parseLatestVersion(body) {
|
|
84
|
+
if (body === null || typeof body !== 'object')
|
|
85
|
+
return undefined;
|
|
86
|
+
const version = body['version'];
|
|
87
|
+
return typeof version === 'string' && parseVersion(version) !== undefined ? version : undefined;
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Ask the registry for the latest published version, cached per process.
|
|
91
|
+
*
|
|
92
|
+
* Concurrent callers share one in-flight lookup. A lookup that fails for any
|
|
93
|
+
* reason — network, timeout, malformed document — resolves as "no update
|
|
94
|
+
* known" rather than rejecting, so the settings page never breaks because
|
|
95
|
+
* the registry is unreachable.
|
|
96
|
+
*/
|
|
97
|
+
export function createUpdateChecker(deps) {
|
|
98
|
+
const now = deps.now ?? Date.now;
|
|
99
|
+
const fetchImpl = deps.fetchImpl ?? fetch;
|
|
100
|
+
let cached;
|
|
101
|
+
let inflight;
|
|
102
|
+
async function lookup() {
|
|
103
|
+
const checkedAt = now();
|
|
104
|
+
try {
|
|
105
|
+
const response = await fetchImpl(REGISTRY_LATEST_URL, { signal: AbortSignal.timeout(CHECK_TIMEOUT_MS) });
|
|
106
|
+
if (!response.ok)
|
|
107
|
+
throw new Error(`registry answered ${response.status}`);
|
|
108
|
+
const latest = parseLatestVersion(await response.json());
|
|
109
|
+
return {
|
|
110
|
+
current: deps.currentVersion,
|
|
111
|
+
latest,
|
|
112
|
+
available: isUpdateAvailable(deps.currentVersion, latest),
|
|
113
|
+
checkedAt,
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
catch {
|
|
117
|
+
return { current: deps.currentVersion, latest: undefined, available: false, checkedAt };
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
return {
|
|
121
|
+
check(force = false) {
|
|
122
|
+
if (!force && cached !== undefined && now() - cached.checkedAt < CHECK_CACHE_MS)
|
|
123
|
+
return Promise.resolve(cached);
|
|
124
|
+
inflight ??= lookup().then((status) => {
|
|
125
|
+
cached = status;
|
|
126
|
+
inflight = undefined;
|
|
127
|
+
return status;
|
|
128
|
+
});
|
|
129
|
+
return inflight;
|
|
130
|
+
},
|
|
131
|
+
};
|
|
132
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Wire contract for the update Remote.
|
|
3
|
+
*
|
|
4
|
+
* `readUpdate` answers whether a newer release of this package is published.
|
|
5
|
+
* The reading is advisory — applying the update stays a user click that
|
|
6
|
+
* drives the host's `pluginManager`, never an automatic download.
|
|
7
|
+
*
|
|
8
|
+
* @module @dan-ai-studio/dshopencodego/update/contract
|
|
9
|
+
*/
|
|
10
|
+
import type { RemoteResult, TypertRemoteContribution } from '@deepseek-ai/dsh-typert-protocol';
|
|
11
|
+
import type { UpdateStatus } from './check.ts';
|
|
12
|
+
export type { UpdateStatus } from './check.ts';
|
|
13
|
+
/** Validate an update reading crossing the wire. */
|
|
14
|
+
export declare function parseUpdateStatus(value: unknown): UpdateStatus;
|
|
15
|
+
declare module '@deepseek-ai/dsh-typert-protocol' {
|
|
16
|
+
interface TypertRemoteNamespaceMap {
|
|
17
|
+
opencodeGoUpdate: {
|
|
18
|
+
readUpdate(force?: boolean): Promise<RemoteResult<UpdateStatus>>;
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
/** Remote methods this package owns, mounted together by the plugin. */
|
|
23
|
+
export declare const updateRemote: TypertRemoteContribution;
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Wire contract for the update Remote.
|
|
3
|
+
*
|
|
4
|
+
* `readUpdate` answers whether a newer release of this package is published.
|
|
5
|
+
* The reading is advisory — applying the update stays a user click that
|
|
6
|
+
* drives the host's `pluginManager`, never an automatic download.
|
|
7
|
+
*
|
|
8
|
+
* @module @dan-ai-studio/dshopencodego/update/contract
|
|
9
|
+
*/
|
|
10
|
+
/** Validate an update reading crossing the wire. */
|
|
11
|
+
export function parseUpdateStatus(value) {
|
|
12
|
+
if (value === null || typeof value !== 'object')
|
|
13
|
+
throw new Error('invalid update reading');
|
|
14
|
+
const row = value;
|
|
15
|
+
if (typeof row['current'] !== 'string')
|
|
16
|
+
throw new Error('invalid update reading');
|
|
17
|
+
if (row['latest'] !== undefined && typeof row['latest'] !== 'string')
|
|
18
|
+
throw new Error('invalid update reading');
|
|
19
|
+
if (typeof row['available'] !== 'boolean')
|
|
20
|
+
throw new Error('invalid update reading');
|
|
21
|
+
if (typeof row['checkedAt'] !== 'number' || !Number.isFinite(row['checkedAt'])) {
|
|
22
|
+
throw new Error('invalid update reading');
|
|
23
|
+
}
|
|
24
|
+
return {
|
|
25
|
+
current: row['current'],
|
|
26
|
+
latest: typeof row['latest'] === 'string' ? row['latest'] : undefined,
|
|
27
|
+
available: row['available'],
|
|
28
|
+
checkedAt: row['checkedAt'],
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
/** Codec shape accepted by both released and source DSH builds. */
|
|
32
|
+
const codec = (typeSymbol, parse) => ({
|
|
33
|
+
mode: 'strict',
|
|
34
|
+
typeSymbol,
|
|
35
|
+
schema: { parse },
|
|
36
|
+
create: () => ({ parse }),
|
|
37
|
+
});
|
|
38
|
+
/** Remote methods this package owns, mounted together by the plugin. */
|
|
39
|
+
export const updateRemote = {
|
|
40
|
+
package: '@dan-ai-studio/dshopencodego',
|
|
41
|
+
descriptors: [
|
|
42
|
+
{
|
|
43
|
+
id: '@dan-ai-studio/dshopencodego#opencodeGoUpdate/readUpdate',
|
|
44
|
+
service: 'opencodeGoUpdate',
|
|
45
|
+
namespace: 'opencodeGoUpdate',
|
|
46
|
+
method: 'readUpdate',
|
|
47
|
+
invocation: { kind: 'direct' },
|
|
48
|
+
parameters: [],
|
|
49
|
+
result: codec('@dan-ai-studio/dshopencodego#UpdateStatus', parseUpdateStatus),
|
|
50
|
+
},
|
|
51
|
+
],
|
|
52
|
+
};
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Self update check (advisory only).
|
|
3
|
+
*
|
|
4
|
+
* @module @dan-ai-studio/dshopencodego/update
|
|
5
|
+
*/
|
|
6
|
+
export { PACKAGE_NAME, REGISTRY_LATEST_URL, CHECK_CACHE_MS, CHECK_TIMEOUT_MS } from './check.ts';
|
|
7
|
+
export type { UpdateStatus } from './check.ts';
|
|
8
|
+
export { compareVersions, createUpdateChecker, isUpdateAvailable, parseLatestVersion, parseVersion } from './check.ts';
|
|
9
|
+
export { PLUGIN_VERSION } from './version.ts';
|
|
10
|
+
export { OpencodeGoUpdateService } from './service.ts';
|
|
11
|
+
export type { UpdateServiceOptions } from './service.ts';
|
|
12
|
+
export { parseUpdateStatus, updateRemote } from './contract.ts';
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Self update check (advisory only).
|
|
3
|
+
*
|
|
4
|
+
* @module @dan-ai-studio/dshopencodego/update
|
|
5
|
+
*/
|
|
6
|
+
export { PACKAGE_NAME, REGISTRY_LATEST_URL, CHECK_CACHE_MS, CHECK_TIMEOUT_MS } from "./check.js";
|
|
7
|
+
export { compareVersions, createUpdateChecker, isUpdateAvailable, parseLatestVersion, parseVersion } from "./check.js";
|
|
8
|
+
export { PLUGIN_VERSION } from "./version.js";
|
|
9
|
+
export { OpencodeGoUpdateService } from "./service.js";
|
|
10
|
+
export { parseUpdateStatus, updateRemote } from "./contract.js";
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Host half of the update Remote.
|
|
3
|
+
*
|
|
4
|
+
* One method, one question: is a newer release of this package published?
|
|
5
|
+
* The service answers from the registry through the cached checker in
|
|
6
|
+
* `./check.ts`, so the settings page learns about updates without the model
|
|
7
|
+
* path ever touching the network. Applying an update is intentionally absent
|
|
8
|
+
* here — the page drives the host's own `pluginManager` (`removeBundle` then
|
|
9
|
+
* `installBundle`), which owns the manifest lock, peer checks, build
|
|
10
|
+
* approvals, and the HMR lifecycle a self-replacing plugin would bypass.
|
|
11
|
+
*
|
|
12
|
+
* @module @dan-ai-studio/dshopencodego/update/service
|
|
13
|
+
*/
|
|
14
|
+
import type { Context } from '@deepseek-ai/cordis';
|
|
15
|
+
import { TypertRemoteService } from '@deepseek-ai/dsh-typert-protocol';
|
|
16
|
+
import type { UpdateStatus } from './check.ts';
|
|
17
|
+
/** Host inputs for the update service. */
|
|
18
|
+
export interface UpdateServiceOptions {
|
|
19
|
+
/** Running build's version. */
|
|
20
|
+
readonly currentVersion: string;
|
|
21
|
+
}
|
|
22
|
+
/** Update Remote: the cached registry reading for the settings page. */
|
|
23
|
+
export declare class OpencodeGoUpdateService extends TypertRemoteService {
|
|
24
|
+
private readonly check;
|
|
25
|
+
constructor(ctx: Context, options: UpdateServiceOptions);
|
|
26
|
+
/** Whether a newer release is published; `force` bypasses the cache. */
|
|
27
|
+
readUpdate(force?: boolean): Promise<UpdateStatus>;
|
|
28
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Host half of the update Remote.
|
|
3
|
+
*
|
|
4
|
+
* One method, one question: is a newer release of this package published?
|
|
5
|
+
* The service answers from the registry through the cached checker in
|
|
6
|
+
* `./check.ts`, so the settings page learns about updates without the model
|
|
7
|
+
* path ever touching the network. Applying an update is intentionally absent
|
|
8
|
+
* here — the page drives the host's own `pluginManager` (`removeBundle` then
|
|
9
|
+
* `installBundle`), which owns the manifest lock, peer checks, build
|
|
10
|
+
* approvals, and the HMR lifecycle a self-replacing plugin would bypass.
|
|
11
|
+
*
|
|
12
|
+
* @module @dan-ai-studio/dshopencodego/update/service
|
|
13
|
+
*/
|
|
14
|
+
import { TypertRemoteService } from '@deepseek-ai/dsh-typert-protocol';
|
|
15
|
+
import { createUpdateChecker } from "./check.js";
|
|
16
|
+
/** Update Remote: the cached registry reading for the settings page. */
|
|
17
|
+
export class OpencodeGoUpdateService extends TypertRemoteService {
|
|
18
|
+
check;
|
|
19
|
+
constructor(ctx, options) {
|
|
20
|
+
super(ctx, 'opencodeGoUpdate');
|
|
21
|
+
const checker = createUpdateChecker({ currentVersion: options.currentVersion });
|
|
22
|
+
this.check = (force) => checker.check(force);
|
|
23
|
+
}
|
|
24
|
+
/** Whether a newer release is published; `force` bypasses the cache. */
|
|
25
|
+
readUpdate(force) {
|
|
26
|
+
return this.check(force);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The running build's own version.
|
|
3
|
+
*
|
|
4
|
+
* `scripts/build.mjs` replaces `__DSHOPENCODEGO_VERSION__` with the package
|
|
5
|
+
* version at bundle time, so the Host knows what it is without reading its
|
|
6
|
+
* own files back from disk. Outside the bundle (tests, source runs) the
|
|
7
|
+
* constant is absent and the value reads as a development placeholder; the
|
|
8
|
+
* update check treats an unparsable current version as "no update known"
|
|
9
|
+
* rather than erroring.
|
|
10
|
+
*
|
|
11
|
+
* @module @dan-ai-studio/dshopencodego/update/version
|
|
12
|
+
*/
|
|
13
|
+
/** Version of this build, or a placeholder outside the bundle. */
|
|
14
|
+
export declare const PLUGIN_VERSION: string;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The running build's own version.
|
|
3
|
+
*
|
|
4
|
+
* `scripts/build.mjs` replaces `__DSHOPENCODEGO_VERSION__` with the package
|
|
5
|
+
* version at bundle time, so the Host knows what it is without reading its
|
|
6
|
+
* own files back from disk. Outside the bundle (tests, source runs) the
|
|
7
|
+
* constant is absent and the value reads as a development placeholder; the
|
|
8
|
+
* update check treats an unparsable current version as "no update known"
|
|
9
|
+
* rather than erroring.
|
|
10
|
+
*
|
|
11
|
+
* @module @dan-ai-studio/dshopencodego/update/version
|
|
12
|
+
*/
|
|
13
|
+
/** Version of this build, or a placeholder outside the bundle. */
|
|
14
|
+
export const PLUGIN_VERSION = typeof __DSHOPENCODEGO_VERSION__ === 'string'
|
|
15
|
+
? __DSHOPENCODEGO_VERSION__
|
|
16
|
+
: '0.0.0-dev';
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dan-ai-studio/dshopencodego",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.23",
|
|
4
4
|
"description": "OpenCode Go provider for DeepSeek Harness: live gateway catalog, per-conversation session header, usage",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
},
|
|
16
16
|
"engines": {
|
|
17
17
|
"node": "^22.19.0 || >=24.0.0",
|
|
18
|
-
"dsh": ">=0.1.7-alpha.1 <0.2.0 || >=0.2.0-rc.1 <0.3.0"
|
|
18
|
+
"dsh": ">=0.1.7-alpha.1 <0.2.0 || >=0.2.0-rc.1 <0.2.1 || >=0.2.1-alpha.1 <0.3.0"
|
|
19
19
|
},
|
|
20
20
|
"main": "./lib/index.js",
|
|
21
21
|
"types": "./lib/types/index.d.ts",
|
|
@@ -67,11 +67,11 @@
|
|
|
67
67
|
"prepack": "npm run build"
|
|
68
68
|
},
|
|
69
69
|
"dependencies": {
|
|
70
|
-
"@deepseek-ai/schemastery": "~3.18.5-alpha.
|
|
70
|
+
"@deepseek-ai/schemastery": "~3.18.5-alpha.2",
|
|
71
71
|
"@earendil-works/pi-ai": "~1.0.2"
|
|
72
72
|
},
|
|
73
73
|
"peerDependencies": {
|
|
74
|
-
"@deepseek-ai/cordis": "4.0.2 || 4.0.3 || 4.0.4 || 4.0.5-alpha.1",
|
|
74
|
+
"@deepseek-ai/cordis": "4.0.2 || 4.0.3 || 4.0.4 || 4.0.5-alpha.1 || 4.0.5-alpha.2",
|
|
75
75
|
"@deepseek-ai/dsh-api-remotes": ">=0.1.7-alpha.1 <0.2.0 || >=0.2.0-rc.1 <0.3.0",
|
|
76
76
|
"@deepseek-ai/dsh-attachment": ">=0.1.7-alpha.1 <0.2.0 || >=0.2.0-rc.1 <0.3.0",
|
|
77
77
|
"@deepseek-ai/dsh-brand": ">=0.1.7-alpha.1 <0.2.0 || >=0.2.0-rc.1 <0.3.0",
|
|
@@ -111,28 +111,28 @@
|
|
|
111
111
|
}
|
|
112
112
|
},
|
|
113
113
|
"devDependencies": {
|
|
114
|
-
"@deepseek-ai/cordis": "4.0.5-alpha.
|
|
115
|
-
"@deepseek-ai/dsh-api-remotes": "0.2.1-alpha.
|
|
116
|
-
"@deepseek-ai/dsh-attachment": "0.2.1-alpha.
|
|
117
|
-
"@deepseek-ai/dsh-brand": "0.2.1-alpha.
|
|
118
|
-
"@deepseek-ai/dsh-client-locale": "0.2.1-alpha.
|
|
119
|
-
"@deepseek-ai/dsh-client-store": "0.2.1-alpha.
|
|
120
|
-
"@deepseek-ai/dsh-client-ui-conversation": "
|
|
121
|
-
"@deepseek-ai/dsh-client-ui-model-selection": "0.2.1-alpha.
|
|
122
|
-
"@deepseek-ai/dsh-client-ui-renderer": "
|
|
123
|
-
"@deepseek-ai/dsh-client-ui-settings": "0.2.1-alpha.
|
|
124
|
-
"@deepseek-ai/dsh-client-ui-slots": "0.2.1-alpha.
|
|
125
|
-
"@deepseek-ai/dsh-credentials": "0.2.1-alpha.
|
|
126
|
-
"@deepseek-ai/dsh-fs": "0.2.1-alpha.
|
|
127
|
-
"@deepseek-ai/dsh-launch-environment": "0.2.1-alpha.
|
|
128
|
-
"@deepseek-ai/dsh-llm": "0.2.1-alpha.
|
|
129
|
-
"@deepseek-ai/dsh-sandbox": "0.2.1-alpha.
|
|
130
|
-
"@deepseek-ai/dsh-scope": "0.2.1-alpha.
|
|
131
|
-
"@deepseek-ai/dsh-session": "0.2.1-alpha.
|
|
132
|
-
"@deepseek-ai/dsh-settings": "0.2.1-alpha.
|
|
133
|
-
"@deepseek-ai/dsh-timeout": "0.2.1-alpha.
|
|
134
|
-
"@deepseek-ai/dsh-typert-protocol": "0.2.1-alpha.
|
|
135
|
-
"@deepseek-ai/dsh-typert-registry": "
|
|
114
|
+
"@deepseek-ai/cordis": "4.0.5-alpha.2",
|
|
115
|
+
"@deepseek-ai/dsh-api-remotes": "0.2.1-alpha.3",
|
|
116
|
+
"@deepseek-ai/dsh-attachment": "0.2.1-alpha.3",
|
|
117
|
+
"@deepseek-ai/dsh-brand": "0.2.1-alpha.3",
|
|
118
|
+
"@deepseek-ai/dsh-client-locale": "0.2.1-alpha.3",
|
|
119
|
+
"@deepseek-ai/dsh-client-store": "0.2.1-alpha.3",
|
|
120
|
+
"@deepseek-ai/dsh-client-ui-conversation": "0.2.1-alpha.3",
|
|
121
|
+
"@deepseek-ai/dsh-client-ui-model-selection": "0.2.1-alpha.3",
|
|
122
|
+
"@deepseek-ai/dsh-client-ui-renderer": "0.2.1-alpha.3",
|
|
123
|
+
"@deepseek-ai/dsh-client-ui-settings": "0.2.1-alpha.3",
|
|
124
|
+
"@deepseek-ai/dsh-client-ui-slots": "0.2.1-alpha.3",
|
|
125
|
+
"@deepseek-ai/dsh-credentials": "0.2.1-alpha.3",
|
|
126
|
+
"@deepseek-ai/dsh-fs": "0.2.1-alpha.3",
|
|
127
|
+
"@deepseek-ai/dsh-launch-environment": "0.2.1-alpha.3",
|
|
128
|
+
"@deepseek-ai/dsh-llm": "0.2.1-alpha.3",
|
|
129
|
+
"@deepseek-ai/dsh-sandbox": "0.2.1-alpha.3",
|
|
130
|
+
"@deepseek-ai/dsh-scope": "0.2.1-alpha.3",
|
|
131
|
+
"@deepseek-ai/dsh-session": "0.2.1-alpha.3",
|
|
132
|
+
"@deepseek-ai/dsh-settings": "0.2.1-alpha.3",
|
|
133
|
+
"@deepseek-ai/dsh-timeout": "0.2.1-alpha.3",
|
|
134
|
+
"@deepseek-ai/dsh-typert-protocol": "0.2.1-alpha.3",
|
|
135
|
+
"@deepseek-ai/dsh-typert-registry": "0.2.1-alpha.3",
|
|
136
136
|
"@testing-library/dom": "^10.4.1",
|
|
137
137
|
"@testing-library/react": "^16.3.0",
|
|
138
138
|
"@types/node": "^22.20.0",
|