@wisdoverse/dsh-inline-media-viewer 1.0.1 → 1.0.2
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/CHANGELOG.md +25 -18
- package/LICENSE +21 -21
- package/README.md +3 -0
- package/README.zh-CN.md +2 -0
- package/SECURITY.md +67 -67
- package/client/client.js +555 -554
- package/index.js +185 -185
- package/lib.js +178 -178
- package/package.json +43 -43
package/lib.js
CHANGED
|
@@ -1,178 +1,178 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* dsh-inline-media-viewer — pure helpers.
|
|
3
|
-
*
|
|
4
|
-
* This module has NO runtime dependencies: unit tests and reviewers can import
|
|
5
|
-
* it anywhere. Integration concerns (RPC channel, settings registration) live
|
|
6
|
-
* in `index.js`.
|
|
7
|
-
*
|
|
8
|
-
* @module dsh-inline-media-viewer/lib
|
|
9
|
-
*/
|
|
10
|
-
|
|
11
|
-
import { extname, isAbsolute, relative, resolve, sep } from "node:path";
|
|
12
|
-
|
|
13
|
-
export const MAX_BYTES = 48 * 1024 * 1024;
|
|
14
|
-
|
|
15
|
-
/**
|
|
16
|
-
* Built-in loopback aliases: host:port pairs treated as ComfyUI media URLs
|
|
17
|
-
* even before any address is configured. Every alias is rewritten to the
|
|
18
|
-
* configured origin before fetching (like any other accepted source).
|
|
19
|
-
*/
|
|
20
|
-
export const COMFY_HOSTS = Object.freeze([
|
|
21
|
-
"127.0.0.1",
|
|
22
|
-
"localhost",
|
|
23
|
-
]);
|
|
24
|
-
|
|
25
|
-
/** ComfyUI's standard HTTP port. */
|
|
26
|
-
export const COMFY_PORTS = Object.freeze(["8188"]);
|
|
27
|
-
|
|
28
|
-
/**
|
|
29
|
-
* Default fetch origin (ComfyUI's standard local address). Point the
|
|
30
|
-
* settings `comfyUrl` at any other server the host process can reach.
|
|
31
|
-
*/
|
|
32
|
-
export const COMFY_DEFAULT_ORIGIN = "http://127.0.0.1:8188";
|
|
33
|
-
|
|
34
|
-
export const MIME = Object.freeze({
|
|
35
|
-
png: "image/png",
|
|
36
|
-
jpg: "image/jpeg",
|
|
37
|
-
jpeg: "image/jpeg",
|
|
38
|
-
webp: "image/webp",
|
|
39
|
-
gif: "image/gif",
|
|
40
|
-
avif: "image/avif",
|
|
41
|
-
bmp: "image/bmp",
|
|
42
|
-
svg: "image/svg+xml",
|
|
43
|
-
mp4: "video/mp4",
|
|
44
|
-
webm: "video/webm",
|
|
45
|
-
mov: "video/quicktime",
|
|
46
|
-
m4v: "video/x-m4v",
|
|
47
|
-
mkv: "video/x-matroska",
|
|
48
|
-
avi: "video/x-msvideo",
|
|
49
|
-
ogv: "video/ogg",
|
|
50
|
-
mp3: "audio/mpeg",
|
|
51
|
-
wav: "audio/wav",
|
|
52
|
-
m4a: "audio/mp4",
|
|
53
|
-
aac: "audio/aac",
|
|
54
|
-
ogg: "audio/ogg",
|
|
55
|
-
oga: "audio/ogg",
|
|
56
|
-
flac: "audio/flac",
|
|
57
|
-
opus: "audio/ogg",
|
|
58
|
-
});
|
|
59
|
-
|
|
60
|
-
export const MEDIA_EXTENSIONS = Object.freeze(Object.keys(MIME));
|
|
61
|
-
|
|
62
|
-
export function extensionOf(source) {
|
|
63
|
-
try {
|
|
64
|
-
const url = new URL(source);
|
|
65
|
-
const filename = url.searchParams.get("filename");
|
|
66
|
-
if (filename) return extname(filename).slice(1).toLowerCase();
|
|
67
|
-
return extname(url.pathname).slice(1).toLowerCase();
|
|
68
|
-
} catch {
|
|
69
|
-
return extname(source.split(/[?#]/, 1)[0]).slice(1).toLowerCase();
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
export function mimeOf(source) {
|
|
74
|
-
return MIME[extensionOf(source)];
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
export function isInside(root, target) {
|
|
78
|
-
const rel = relative(root, target);
|
|
79
|
-
return rel === "" || (!isAbsolute(rel) && rel !== ".." && !rel.startsWith(`..${sep}`));
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
/**
|
|
83
|
-
* Parse a user-configured ComfyUI address into a canonical origin URL.
|
|
84
|
-
*
|
|
85
|
-
* Accepts `http(s)://host[:port]` or a bare `host[:port]` (http assumed).
|
|
86
|
-
* Credentials, extra path segments, queries, and hashes are rejected so the
|
|
87
|
-
* value is always a bare origin. A missing port defaults to ComfyUI's
|
|
88
|
-
* standard 8188 for http and 443 for https.
|
|
89
|
-
*
|
|
90
|
-
* @param {unknown} input - the configured address string.
|
|
91
|
-
* @returns {URL | null} canonical origin URL, or null when unparseable.
|
|
92
|
-
*/
|
|
93
|
-
export function normalizeComfyOrigin(input) {
|
|
94
|
-
if (typeof input !== "string") return null;
|
|
95
|
-
let raw = input.trim();
|
|
96
|
-
if (!raw) return null;
|
|
97
|
-
if (!/^[a-z][a-z0-9+.-]*:\/\//i.test(raw)) raw = `http://${raw}`;
|
|
98
|
-
let url;
|
|
99
|
-
try {
|
|
100
|
-
url = new URL(raw);
|
|
101
|
-
} catch {
|
|
102
|
-
return null;
|
|
103
|
-
}
|
|
104
|
-
if (url.protocol !== "http:" && url.protocol !== "https:") return null;
|
|
105
|
-
if (!url.hostname || url.username || url.password) return null;
|
|
106
|
-
const host = url.hostname;
|
|
107
|
-
if (!/^[a-z0-9.-]+$/i.test(host) && !/^\[[0-9a-f:.%]+\]$/i.test(host)) return null;
|
|
108
|
-
if (url.pathname !== "" && url.pathname !== "/") return null;
|
|
109
|
-
if (url.search || url.hash) return null;
|
|
110
|
-
const port = url.port || (url.protocol === "https:" ? "443" : "8188");
|
|
111
|
-
return new URL(`${url.protocol}//${url.hostname}:${port}`);
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
/**
|
|
115
|
-
* All source origins the proxy accepts for one canonical configured origin:
|
|
116
|
-
* the built-in loopback aliases plus the configured host:port itself.
|
|
117
|
-
*
|
|
118
|
-
* @param {URL} origin - canonical origin from {@link normalizeComfyOrigin}.
|
|
119
|
-
* @returns {Set<string>} accepted "host:port" keys.
|
|
120
|
-
*/
|
|
121
|
-
export function allowedComfyOrigins(origin) {
|
|
122
|
-
const origins = new Set();
|
|
123
|
-
for (const host of COMFY_HOSTS) {
|
|
124
|
-
for (const port of COMFY_PORTS) origins.add(`${host}:${port}`);
|
|
125
|
-
}
|
|
126
|
-
if (origin instanceof URL) {
|
|
127
|
-
const port = origin.port || (origin.protocol === "https:" ? "443" : "8188");
|
|
128
|
-
origins.add(`${origin.hostname}:${port}`);
|
|
129
|
-
}
|
|
130
|
-
return origins;
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
/**
|
|
134
|
-
* Rewrite an allowed ComfyUI media URL onto the canonical configured origin.
|
|
135
|
-
*
|
|
136
|
-
* The fetch target is ALWAYS the configured origin (default
|
|
137
|
-
* `http://127.0.0.1:8188`) — never the source host — so chat content can only
|
|
138
|
-
* select a path/query on a server the user configured. Source origins are
|
|
139
|
-
* accepted when their host:port is a loopback alias or matches the configured
|
|
140
|
-
* origin.
|
|
141
|
-
*
|
|
142
|
-
* @param {string} source - absolute http(s) URL.
|
|
143
|
-
* @param {string | URL | null} [origin] - configured ComfyUI address
|
|
144
|
-
* (canonical or parseable string); invalid input falls back to the default.
|
|
145
|
-
* @returns {URL | null} the rewritten fetch URL, or null when not allowed.
|
|
146
|
-
*/
|
|
147
|
-
export function comfyUrl(source, origin = null) {
|
|
148
|
-
let url;
|
|
149
|
-
try {
|
|
150
|
-
url = new URL(source);
|
|
151
|
-
} catch {
|
|
152
|
-
return null;
|
|
153
|
-
}
|
|
154
|
-
if (url.protocol !== "http:" && url.protocol !== "https:") return null;
|
|
155
|
-
const port = url.port || (url.protocol === "https:" ? "443" : "80");
|
|
156
|
-
const canonical = typeof origin === "string" && origin.trim() !== ""
|
|
157
|
-
? normalizeComfyOrigin(origin) ?? normalizeComfyOrigin(COMFY_DEFAULT_ORIGIN)
|
|
158
|
-
: origin instanceof URL && origin.hostname
|
|
159
|
-
? origin
|
|
160
|
-
: normalizeComfyOrigin(COMFY_DEFAULT_ORIGIN);
|
|
161
|
-
if (!allowedComfyOrigins(canonical).has(`${url.hostname}:${port}`)) return null;
|
|
162
|
-
const target = new URL(canonical.href);
|
|
163
|
-
target.pathname = url.pathname;
|
|
164
|
-
target.search = url.search;
|
|
165
|
-
target.hash = "";
|
|
166
|
-
target.username = "";
|
|
167
|
-
target.password = "";
|
|
168
|
-
return target;
|
|
169
|
-
}
|
|
170
|
-
|
|
171
|
-
export const testing = Object.freeze({
|
|
172
|
-
allowedComfyOrigins,
|
|
173
|
-
comfyUrl,
|
|
174
|
-
extensionOf,
|
|
175
|
-
isInside,
|
|
176
|
-
mimeOf,
|
|
177
|
-
normalizeComfyOrigin,
|
|
178
|
-
});
|
|
1
|
+
/**
|
|
2
|
+
* dsh-inline-media-viewer — pure helpers.
|
|
3
|
+
*
|
|
4
|
+
* This module has NO runtime dependencies: unit tests and reviewers can import
|
|
5
|
+
* it anywhere. Integration concerns (RPC channel, settings registration) live
|
|
6
|
+
* in `index.js`.
|
|
7
|
+
*
|
|
8
|
+
* @module dsh-inline-media-viewer/lib
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
import { extname, isAbsolute, relative, resolve, sep } from "node:path";
|
|
12
|
+
|
|
13
|
+
export const MAX_BYTES = 48 * 1024 * 1024;
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Built-in loopback aliases: host:port pairs treated as ComfyUI media URLs
|
|
17
|
+
* even before any address is configured. Every alias is rewritten to the
|
|
18
|
+
* configured origin before fetching (like any other accepted source).
|
|
19
|
+
*/
|
|
20
|
+
export const COMFY_HOSTS = Object.freeze([
|
|
21
|
+
"127.0.0.1",
|
|
22
|
+
"localhost",
|
|
23
|
+
]);
|
|
24
|
+
|
|
25
|
+
/** ComfyUI's standard HTTP port. */
|
|
26
|
+
export const COMFY_PORTS = Object.freeze(["8188"]);
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Default fetch origin (ComfyUI's standard local address). Point the
|
|
30
|
+
* settings `comfyUrl` at any other server the host process can reach.
|
|
31
|
+
*/
|
|
32
|
+
export const COMFY_DEFAULT_ORIGIN = "http://127.0.0.1:8188";
|
|
33
|
+
|
|
34
|
+
export const MIME = Object.freeze({
|
|
35
|
+
png: "image/png",
|
|
36
|
+
jpg: "image/jpeg",
|
|
37
|
+
jpeg: "image/jpeg",
|
|
38
|
+
webp: "image/webp",
|
|
39
|
+
gif: "image/gif",
|
|
40
|
+
avif: "image/avif",
|
|
41
|
+
bmp: "image/bmp",
|
|
42
|
+
svg: "image/svg+xml",
|
|
43
|
+
mp4: "video/mp4",
|
|
44
|
+
webm: "video/webm",
|
|
45
|
+
mov: "video/quicktime",
|
|
46
|
+
m4v: "video/x-m4v",
|
|
47
|
+
mkv: "video/x-matroska",
|
|
48
|
+
avi: "video/x-msvideo",
|
|
49
|
+
ogv: "video/ogg",
|
|
50
|
+
mp3: "audio/mpeg",
|
|
51
|
+
wav: "audio/wav",
|
|
52
|
+
m4a: "audio/mp4",
|
|
53
|
+
aac: "audio/aac",
|
|
54
|
+
ogg: "audio/ogg",
|
|
55
|
+
oga: "audio/ogg",
|
|
56
|
+
flac: "audio/flac",
|
|
57
|
+
opus: "audio/ogg",
|
|
58
|
+
});
|
|
59
|
+
|
|
60
|
+
export const MEDIA_EXTENSIONS = Object.freeze(Object.keys(MIME));
|
|
61
|
+
|
|
62
|
+
export function extensionOf(source) {
|
|
63
|
+
try {
|
|
64
|
+
const url = new URL(source);
|
|
65
|
+
const filename = url.searchParams.get("filename");
|
|
66
|
+
if (filename) return extname(filename).slice(1).toLowerCase();
|
|
67
|
+
return extname(url.pathname).slice(1).toLowerCase();
|
|
68
|
+
} catch {
|
|
69
|
+
return extname(source.split(/[?#]/, 1)[0]).slice(1).toLowerCase();
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
export function mimeOf(source) {
|
|
74
|
+
return MIME[extensionOf(source)];
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
export function isInside(root, target) {
|
|
78
|
+
const rel = relative(root, target);
|
|
79
|
+
return rel === "" || (!isAbsolute(rel) && rel !== ".." && !rel.startsWith(`..${sep}`));
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* Parse a user-configured ComfyUI address into a canonical origin URL.
|
|
84
|
+
*
|
|
85
|
+
* Accepts `http(s)://host[:port]` or a bare `host[:port]` (http assumed).
|
|
86
|
+
* Credentials, extra path segments, queries, and hashes are rejected so the
|
|
87
|
+
* value is always a bare origin. A missing port defaults to ComfyUI's
|
|
88
|
+
* standard 8188 for http and 443 for https.
|
|
89
|
+
*
|
|
90
|
+
* @param {unknown} input - the configured address string.
|
|
91
|
+
* @returns {URL | null} canonical origin URL, or null when unparseable.
|
|
92
|
+
*/
|
|
93
|
+
export function normalizeComfyOrigin(input) {
|
|
94
|
+
if (typeof input !== "string") return null;
|
|
95
|
+
let raw = input.trim();
|
|
96
|
+
if (!raw) return null;
|
|
97
|
+
if (!/^[a-z][a-z0-9+.-]*:\/\//i.test(raw)) raw = `http://${raw}`;
|
|
98
|
+
let url;
|
|
99
|
+
try {
|
|
100
|
+
url = new URL(raw);
|
|
101
|
+
} catch {
|
|
102
|
+
return null;
|
|
103
|
+
}
|
|
104
|
+
if (url.protocol !== "http:" && url.protocol !== "https:") return null;
|
|
105
|
+
if (!url.hostname || url.username || url.password) return null;
|
|
106
|
+
const host = url.hostname;
|
|
107
|
+
if (!/^[a-z0-9.-]+$/i.test(host) && !/^\[[0-9a-f:.%]+\]$/i.test(host)) return null;
|
|
108
|
+
if (url.pathname !== "" && url.pathname !== "/") return null;
|
|
109
|
+
if (url.search || url.hash) return null;
|
|
110
|
+
const port = url.port || (url.protocol === "https:" ? "443" : "8188");
|
|
111
|
+
return new URL(`${url.protocol}//${url.hostname}:${port}`);
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
/**
|
|
115
|
+
* All source origins the proxy accepts for one canonical configured origin:
|
|
116
|
+
* the built-in loopback aliases plus the configured host:port itself.
|
|
117
|
+
*
|
|
118
|
+
* @param {URL} origin - canonical origin from {@link normalizeComfyOrigin}.
|
|
119
|
+
* @returns {Set<string>} accepted "host:port" keys.
|
|
120
|
+
*/
|
|
121
|
+
export function allowedComfyOrigins(origin) {
|
|
122
|
+
const origins = new Set();
|
|
123
|
+
for (const host of COMFY_HOSTS) {
|
|
124
|
+
for (const port of COMFY_PORTS) origins.add(`${host}:${port}`);
|
|
125
|
+
}
|
|
126
|
+
if (origin instanceof URL) {
|
|
127
|
+
const port = origin.port || (origin.protocol === "https:" ? "443" : "8188");
|
|
128
|
+
origins.add(`${origin.hostname}:${port}`);
|
|
129
|
+
}
|
|
130
|
+
return origins;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
/**
|
|
134
|
+
* Rewrite an allowed ComfyUI media URL onto the canonical configured origin.
|
|
135
|
+
*
|
|
136
|
+
* The fetch target is ALWAYS the configured origin (default
|
|
137
|
+
* `http://127.0.0.1:8188`) — never the source host — so chat content can only
|
|
138
|
+
* select a path/query on a server the user configured. Source origins are
|
|
139
|
+
* accepted when their host:port is a loopback alias or matches the configured
|
|
140
|
+
* origin.
|
|
141
|
+
*
|
|
142
|
+
* @param {string} source - absolute http(s) URL.
|
|
143
|
+
* @param {string | URL | null} [origin] - configured ComfyUI address
|
|
144
|
+
* (canonical or parseable string); invalid input falls back to the default.
|
|
145
|
+
* @returns {URL | null} the rewritten fetch URL, or null when not allowed.
|
|
146
|
+
*/
|
|
147
|
+
export function comfyUrl(source, origin = null) {
|
|
148
|
+
let url;
|
|
149
|
+
try {
|
|
150
|
+
url = new URL(source);
|
|
151
|
+
} catch {
|
|
152
|
+
return null;
|
|
153
|
+
}
|
|
154
|
+
if (url.protocol !== "http:" && url.protocol !== "https:") return null;
|
|
155
|
+
const port = url.port || (url.protocol === "https:" ? "443" : "80");
|
|
156
|
+
const canonical = typeof origin === "string" && origin.trim() !== ""
|
|
157
|
+
? normalizeComfyOrigin(origin) ?? normalizeComfyOrigin(COMFY_DEFAULT_ORIGIN)
|
|
158
|
+
: origin instanceof URL && origin.hostname
|
|
159
|
+
? origin
|
|
160
|
+
: normalizeComfyOrigin(COMFY_DEFAULT_ORIGIN);
|
|
161
|
+
if (!allowedComfyOrigins(canonical).has(`${url.hostname}:${port}`)) return null;
|
|
162
|
+
const target = new URL(canonical.href);
|
|
163
|
+
target.pathname = url.pathname;
|
|
164
|
+
target.search = url.search;
|
|
165
|
+
target.hash = "";
|
|
166
|
+
target.username = "";
|
|
167
|
+
target.password = "";
|
|
168
|
+
return target;
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
export const testing = Object.freeze({
|
|
172
|
+
allowedComfyOrigins,
|
|
173
|
+
comfyUrl,
|
|
174
|
+
extensionOf,
|
|
175
|
+
isInside,
|
|
176
|
+
mimeOf,
|
|
177
|
+
normalizeComfyOrigin,
|
|
178
|
+
});
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
{
|
|
1
|
+
{
|
|
2
2
|
"name": "@wisdoverse/dsh-inline-media-viewer",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.2",
|
|
4
4
|
"description": "Persistent inline image, video, and audio previews for DeepSeek Harness Web conversations, with workspace-confined local reads and a configurable ComfyUI proxy.",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -15,60 +15,60 @@
|
|
|
15
15
|
"dsh",
|
|
16
16
|
"dsh-plugin",
|
|
17
17
|
"web",
|
|
18
|
-
"plugin",
|
|
19
|
-
"media",
|
|
20
|
-
"image",
|
|
21
|
-
"video",
|
|
22
|
-
"audio",
|
|
23
|
-
"comfyui"
|
|
24
|
-
],
|
|
18
|
+
"plugin",
|
|
19
|
+
"media",
|
|
20
|
+
"image",
|
|
21
|
+
"video",
|
|
22
|
+
"audio",
|
|
23
|
+
"comfyui"
|
|
24
|
+
],
|
|
25
25
|
"license": "MIT",
|
|
26
26
|
"publishConfig": {
|
|
27
27
|
"access": "public",
|
|
28
28
|
"registry": "https://registry.npmjs.org"
|
|
29
29
|
},
|
|
30
30
|
"type": "module",
|
|
31
|
-
"main": "index.js",
|
|
32
|
-
"exports": {
|
|
33
|
-
".": "./index.js",
|
|
34
|
-
"./client": "./client/client.js",
|
|
35
|
-
"./cordis.patch.yml": "./cordis.patch.yml",
|
|
36
|
-
"./package.json": "./package.json",
|
|
37
|
-
"./lib.js": "./lib.js"
|
|
38
|
-
},
|
|
39
|
-
"files": [
|
|
40
|
-
"index.js",
|
|
41
|
-
"lib.js",
|
|
31
|
+
"main": "index.js",
|
|
32
|
+
"exports": {
|
|
33
|
+
".": "./index.js",
|
|
34
|
+
"./client": "./client/client.js",
|
|
35
|
+
"./cordis.patch.yml": "./cordis.patch.yml",
|
|
36
|
+
"./package.json": "./package.json",
|
|
37
|
+
"./lib.js": "./lib.js"
|
|
38
|
+
},
|
|
39
|
+
"files": [
|
|
40
|
+
"index.js",
|
|
41
|
+
"lib.js",
|
|
42
42
|
"client/",
|
|
43
43
|
"cordis.patch.yml",
|
|
44
44
|
"README.md",
|
|
45
45
|
"README.zh-CN.md",
|
|
46
46
|
"SECURITY.md",
|
|
47
|
-
"CHANGELOG.md",
|
|
48
|
-
"LICENSE"
|
|
49
|
-
],
|
|
50
|
-
"scripts": {
|
|
51
|
-
"test": "node test.mjs",
|
|
52
|
-
"lint": "node --check index.js && node --check lib.js && node --check test.mjs"
|
|
53
|
-
},
|
|
47
|
+
"CHANGELOG.md",
|
|
48
|
+
"LICENSE"
|
|
49
|
+
],
|
|
50
|
+
"scripts": {
|
|
51
|
+
"test": "node test.mjs",
|
|
52
|
+
"lint": "node --check index.js && node --check lib.js && node --check test.mjs"
|
|
53
|
+
},
|
|
54
54
|
"peerDependencies": {
|
|
55
55
|
"@deepseek-ai/cordis": "^4.0.1",
|
|
56
56
|
"@deepseek-ai/dsh-settings": "^0.1.1-rc.2",
|
|
57
57
|
"@deepseek-ai/schemastery": "^3.18.1"
|
|
58
58
|
},
|
|
59
|
-
"dsh": {
|
|
60
|
-
"bundle": {
|
|
61
|
-
"patch": "./cordis.patch.yml"
|
|
62
|
-
},
|
|
63
|
-
"client": {
|
|
64
|
-
"inject": [
|
|
65
|
-
"@deepseek-ai/dsh-client-connection",
|
|
66
|
-
"@deepseek-ai/dsh-client-runtime",
|
|
67
|
-
"@deepseek-ai/dsh-client-ui-conversation",
|
|
68
|
-
"@deepseek-ai/dsh-client-ui-settings",
|
|
69
|
-
"@deepseek-ai/dsh-client-locale"
|
|
70
|
-
],
|
|
71
|
-
"platform": "web"
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
}
|
|
59
|
+
"dsh": {
|
|
60
|
+
"bundle": {
|
|
61
|
+
"patch": "./cordis.patch.yml"
|
|
62
|
+
},
|
|
63
|
+
"client": {
|
|
64
|
+
"inject": [
|
|
65
|
+
"@deepseek-ai/dsh-client-connection",
|
|
66
|
+
"@deepseek-ai/dsh-client-runtime",
|
|
67
|
+
"@deepseek-ai/dsh-client-ui-conversation",
|
|
68
|
+
"@deepseek-ai/dsh-client-ui-settings",
|
|
69
|
+
"@deepseek-ai/dsh-client-locale"
|
|
70
|
+
],
|
|
71
|
+
"platform": "web"
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|