dsh-any-background 0.2.10 → 0.3.1
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 +48 -33
- package/README.zh.md +50 -34
- package/lib/client.js +1137 -63
- package/lib/client.js.map +1 -1
- package/lib/index.js +245 -10
- package/package.json +20 -10
package/lib/index.js
CHANGED
|
@@ -2,6 +2,225 @@ import { access, mkdir, readFile, rename, rm, stat, writeFile } from "node:fs/pr
|
|
|
2
2
|
import { createReadStream, createWriteStream } from "node:fs";
|
|
3
3
|
import { Readable } from "node:stream";
|
|
4
4
|
import { dshHomePath } from "@deepseek-ai/dsh-home-paths";
|
|
5
|
+
import { basename, dirname, join } from "node:path";
|
|
6
|
+
//#region src/host-compat/channel.ts
|
|
7
|
+
/** What this plugin supports, in upgrade order. One row = one build whose facts
|
|
8
|
+
* were checked; several rows may share a `channel` when a newer build was
|
|
9
|
+
* verified as needing no change to that folder's adapter (as `0.1.7-rc.1` was) —
|
|
10
|
+
* a row then reports `exact` instead of `line`, and no new folder appears.
|
|
11
|
+
* Adding an ADAPTER means adding a channel plus a folder in
|
|
12
|
+
* `client/host-compat/versions/`. */
|
|
13
|
+
const SUPPORTED_RELEASES = [
|
|
14
|
+
{
|
|
15
|
+
channel: "0.1.5-rc",
|
|
16
|
+
release: "0.1.5-rc.2"
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
channel: "0.1.6-alpha",
|
|
20
|
+
release: "0.1.6-alpha.2"
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
channel: "0.1.7-alpha",
|
|
24
|
+
release: "0.1.7-alpha.2"
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
channel: "0.1.7-alpha",
|
|
28
|
+
release: "0.1.7-rc.1"
|
|
29
|
+
}
|
|
30
|
+
];
|
|
31
|
+
const UNKNOWN_HOST_INFO = {
|
|
32
|
+
version: null,
|
|
33
|
+
channel: "unknown"
|
|
34
|
+
};
|
|
35
|
+
/** True when a string looks like a release version. A bare `~/.dsh` directory
|
|
36
|
+
* basename does not, which is why the disk probe sanity-checks before trusting
|
|
37
|
+
* a path segment. */
|
|
38
|
+
const VERSION_RE = /^\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?$/;
|
|
39
|
+
function looksLikeVersion(value) {
|
|
40
|
+
return VERSION_RE.test(value);
|
|
41
|
+
}
|
|
42
|
+
const PARSE_RE = /^(\d+)\.(\d+)\.(\d+)(?:-([0-9A-Za-z.-]+))?$/;
|
|
43
|
+
function parse(version) {
|
|
44
|
+
const m = PARSE_RE.exec(version);
|
|
45
|
+
if (m === null) return null;
|
|
46
|
+
const parts = m[4] === void 0 ? [] : m[4].split(".");
|
|
47
|
+
const build = parts.length > 1 ? Number(parts[1]) : NaN;
|
|
48
|
+
return {
|
|
49
|
+
core: [
|
|
50
|
+
Number(m[1]),
|
|
51
|
+
Number(m[2]),
|
|
52
|
+
Number(m[3])
|
|
53
|
+
],
|
|
54
|
+
channel: parts.length > 0 ? parts[0] : null,
|
|
55
|
+
build: Number.isFinite(build) ? build : null
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
/** The table, parsed once: every row is a literal this file controls. */
|
|
59
|
+
const TABLE = SUPPORTED_RELEASES.map((row) => ({
|
|
60
|
+
...row,
|
|
61
|
+
parsed: parse(row.release)
|
|
62
|
+
}));
|
|
63
|
+
function cmpCore(a, b) {
|
|
64
|
+
for (let i = 0; i < 3; i++) if (a[i] !== b[i]) return a[i] < b[i] ? -1 : 1;
|
|
65
|
+
return 0;
|
|
66
|
+
}
|
|
67
|
+
/** Total order over releases, following the semver rule that a prerelease sorts
|
|
68
|
+
* BELOW the release it precedes (`0.1.6-alpha.2 < 0.1.6`). */
|
|
69
|
+
function cmp(a, b) {
|
|
70
|
+
const core = cmpCore(a.core, b.core);
|
|
71
|
+
if (core !== 0) return core;
|
|
72
|
+
if (a.channel === null || b.channel === null) {
|
|
73
|
+
if (a.channel === b.channel) return 0;
|
|
74
|
+
return a.channel === null ? 1 : -1;
|
|
75
|
+
}
|
|
76
|
+
if (a.channel !== b.channel) return a.channel < b.channel ? -1 : 1;
|
|
77
|
+
const ab = a.build ?? 0;
|
|
78
|
+
const bb = b.build ?? 0;
|
|
79
|
+
return ab === bb ? 0 : ab < bb ? -1 : 1;
|
|
80
|
+
}
|
|
81
|
+
/** Pick the adapter for a release, clamping to the nearest verified line when the
|
|
82
|
+
* release is outside everything this plugin has seen.
|
|
83
|
+
*
|
|
84
|
+
* A release is matched by PATCH LINE before anything else: `0.1.6-alpha.4` and a
|
|
85
|
+
* future `0.1.6` stable both belong to the line verified at `0.1.6-alpha.2`, and
|
|
86
|
+
* handing them that adapter beats giving up — the DOM probes only cover panel
|
|
87
|
+
* mechanics, not the surface decisions the line is known for.
|
|
88
|
+
*
|
|
89
|
+
* Outside every verified line the answer is a guess, so it is the closest one and
|
|
90
|
+
* it says so (`nearest`): newer than the newest line → that newest adapter, older
|
|
91
|
+
* than the oldest → the oldest, strictly between two → the LOWER one, because an
|
|
92
|
+
* adapter may only claim what it was verified for. A release that will not parse
|
|
93
|
+
* at all is `unknown`, and the DOM arbitrates there. */
|
|
94
|
+
function classifyRelease(version) {
|
|
95
|
+
const host = version === null ? null : parse(version);
|
|
96
|
+
if (host === null) return {
|
|
97
|
+
channel: "unknown",
|
|
98
|
+
match: "unresolved"
|
|
99
|
+
};
|
|
100
|
+
const sameLine = TABLE.filter((row) => cmpCore(row.parsed.core, host.core) === 0);
|
|
101
|
+
if (sameLine.length > 0) {
|
|
102
|
+
const exact = sameLine.find((row) => row.release === version);
|
|
103
|
+
if (exact !== void 0) return {
|
|
104
|
+
channel: exact.channel,
|
|
105
|
+
match: "exact"
|
|
106
|
+
};
|
|
107
|
+
const atOrBelow = sameLine.filter((row) => cmp(row.parsed, host) <= 0);
|
|
108
|
+
return {
|
|
109
|
+
channel: (atOrBelow.length > 0 ? atOrBelow[atOrBelow.length - 1] : sameLine[0]).channel,
|
|
110
|
+
match: "line"
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
const older = TABLE.filter((row) => cmp(row.parsed, host) < 0);
|
|
114
|
+
if (older.length === 0) return {
|
|
115
|
+
channel: TABLE[0].channel,
|
|
116
|
+
match: "nearest"
|
|
117
|
+
};
|
|
118
|
+
if (TABLE.filter((row) => cmp(row.parsed, host) > 0).length === 0) return {
|
|
119
|
+
channel: TABLE[TABLE.length - 1].channel,
|
|
120
|
+
match: "nearest"
|
|
121
|
+
};
|
|
122
|
+
return {
|
|
123
|
+
channel: older[older.length - 1].channel,
|
|
124
|
+
match: "nearest"
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
//#endregion
|
|
128
|
+
//#region src/host-compat/detect.ts
|
|
129
|
+
/**
|
|
130
|
+
* The front door: resolve which DSH release this plugin is running under.
|
|
131
|
+
*
|
|
132
|
+
* WHY IT RUNS HERE (node) AND NOT IN THE BROWSER
|
|
133
|
+
* The client context exposes no host version — verified against the harness: no
|
|
134
|
+
* `hostVersion`/`dshVersion` field on `ctx`, and `window.__DSH_BOOT__.version` is
|
|
135
|
+
* the module-table format tag `'client'`, not a release. Capability probing alone
|
|
136
|
+
* is also not enough, because the obvious probes do not separate the release
|
|
137
|
+
* lines:
|
|
138
|
+
* `ctx.sidebarRightTabs` and the `[data-sidebar-right-panel]` marker both exist on
|
|
139
|
+
* 0.1.5-rc.2 already, so either one used as a "0.1.6+" test mis-classifies 0.1.5
|
|
140
|
+
* as newer. The install the process was composed FROM states the release directly,
|
|
141
|
+
* and only the node half can read it.
|
|
142
|
+
*
|
|
143
|
+
* Three hops, most authoritative first:
|
|
144
|
+
* 1. `ctx.profileContext.installAnchor` — the absolute path of the running
|
|
145
|
+
* app's own manifest (`<…>/node_modules/@deepseek-ai/dsh/package.json`; the
|
|
146
|
+
* host passes exactly that file, `new URL('../package.json', import.meta.url)`
|
|
147
|
+
* of its `dsh` package). Whatever process is serving this plugin is what that
|
|
148
|
+
* manifest versioned, so it needs no path guessing. Provided by
|
|
149
|
+
* `dsh-app-boot` only in a dsh-launched profile, hence optional.
|
|
150
|
+
* 2. The installed manifest next to the launcher home:
|
|
151
|
+
* `<root>/versions/<ver>/node_modules/@deepseek-ai/dsh/package.json`, reached
|
|
152
|
+
* from `$DSH_HOME`'s `homes/<ver>` layout. For a host that gives no
|
|
153
|
+
* `profileContext`.
|
|
154
|
+
* 3. `$DSH_HOME`'s basename, because launcher homes live in a folder named after
|
|
155
|
+
* the release (`.../homes/0.1.6-alpha.2`). A user may point DSH_HOME at a
|
|
156
|
+
* plain `~/.dsh` (no launcher layout at all), whose basename is not a
|
|
157
|
+
* version — hence `looksLikeVersion` gates it.
|
|
158
|
+
*
|
|
159
|
+
* A release that resolves but matches no verified patch line is clamped to the
|
|
160
|
+
* nearest adapter by `classifyRelease()`; only a release that will not parse at
|
|
161
|
+
* all degrades to `version: null` / `channel: 'unknown'`, where the client half
|
|
162
|
+
* falls back to DOM-shape probing. That fallback is not hypothetical: a plain
|
|
163
|
+
* `~/.dsh` install lands here, and a wrong guess would silently restyle the
|
|
164
|
+
* user's window.
|
|
165
|
+
*
|
|
166
|
+
* @module
|
|
167
|
+
*/
|
|
168
|
+
/** What "the verified lines" are, spelled out for the clamp log below. */
|
|
169
|
+
const SUPPORTED_HINT = SUPPORTED_RELEASES.map((row) => row.release).join(" ~ ");
|
|
170
|
+
/** Read the `version` field of a package manifest, or null when the file is
|
|
171
|
+
* missing, unreadable, not JSON or does not declare a release-looking version —
|
|
172
|
+
* every one of which just means "this hop has no answer". */
|
|
173
|
+
async function manifestVersion(file) {
|
|
174
|
+
try {
|
|
175
|
+
const raw = JSON.parse(await readFile(file, "utf8"));
|
|
176
|
+
if (typeof raw.version === "string" && looksLikeVersion(raw.version.trim())) return raw.version.trim();
|
|
177
|
+
} catch {}
|
|
178
|
+
return null;
|
|
179
|
+
}
|
|
180
|
+
/** Hop 1: the anchor the host itself hands us. A custom composition may point it
|
|
181
|
+
* at its own manifest, whose `version` is whatever that project calls itself —
|
|
182
|
+
* `looksLikeVersion` inside `manifestVersion` is what keeps a non-release out. */
|
|
183
|
+
async function versionFromAnchor(anchor) {
|
|
184
|
+
if (typeof anchor !== "string" || anchor === "") return null;
|
|
185
|
+
if (!/[/\\]package\.json$/.test(anchor)) return null;
|
|
186
|
+
return manifestVersion(anchor);
|
|
187
|
+
}
|
|
188
|
+
/** Hop 2: the installed manifest two levels up from a launcher home
|
|
189
|
+
* (`<root>/homes/<ver>` → `<root>/versions/<ver>`), or null when the layout does
|
|
190
|
+
* not apply (plain `~/.dsh`, non-launcher hosts). */
|
|
191
|
+
async function versionFromLauncher(homeDir) {
|
|
192
|
+
const root = dirname(dirname(homeDir));
|
|
193
|
+
const versionSeg = basename(homeDir);
|
|
194
|
+
if (!looksLikeVersion(versionSeg)) return null;
|
|
195
|
+
return manifestVersion(join(root, "versions", versionSeg, "node_modules", "@deepseek-ai", "dsh", "package.json"));
|
|
196
|
+
}
|
|
197
|
+
/** Cached verdict: the probe touches the filesystem, and the host release never
|
|
198
|
+
* changes within a process lifetime. */
|
|
199
|
+
let cache;
|
|
200
|
+
/** Resolve (and cache) the host release + channel. `installAnchor` is
|
|
201
|
+
* `ctx.profileContext?.installAnchor`, read at plugin mount time.
|
|
202
|
+
*
|
|
203
|
+
* A clamped verdict (`nearest`) is logged once: it means the plugin is styling a
|
|
204
|
+
* release it was never verified against, and that is the first thing to know when
|
|
205
|
+
* a new host build reports a broken surface. */
|
|
206
|
+
async function resolveHostInfo(installAnchor) {
|
|
207
|
+
if (cache !== void 0) return cache;
|
|
208
|
+
const homeDir = dshHomePath();
|
|
209
|
+
let version = await versionFromAnchor(installAnchor);
|
|
210
|
+
if (version === null) version = await versionFromLauncher(homeDir);
|
|
211
|
+
if (version === null) {
|
|
212
|
+
const seg = basename(homeDir);
|
|
213
|
+
if (looksLikeVersion(seg)) version = seg;
|
|
214
|
+
}
|
|
215
|
+
const verdict = classifyRelease(version);
|
|
216
|
+
if (verdict.match === "nearest") console.log(`dsh-any-background: host release ${version} is outside the verified lines, styling it as ${verdict.channel} (supports ${SUPPORTED_HINT})`);
|
|
217
|
+
cache = {
|
|
218
|
+
version,
|
|
219
|
+
channel: verdict.channel
|
|
220
|
+
};
|
|
221
|
+
return cache;
|
|
222
|
+
}
|
|
223
|
+
//#endregion
|
|
5
224
|
//#region src/index.ts
|
|
6
225
|
/**
|
|
7
226
|
* Node half of dsh-any-background: file-backed theme persistence.
|
|
@@ -86,13 +305,13 @@ function sniffFontMime(buf) {
|
|
|
86
305
|
const DEFAULT_CONFIG = {
|
|
87
306
|
color: null,
|
|
88
307
|
opacities: {
|
|
89
|
-
bg:
|
|
308
|
+
bg: 0,
|
|
90
309
|
sidebar: .5,
|
|
91
310
|
card: .5,
|
|
92
311
|
input: .5
|
|
93
312
|
},
|
|
94
313
|
blurs: {
|
|
95
|
-
bg:
|
|
314
|
+
bg: 0,
|
|
96
315
|
sidebar: 30,
|
|
97
316
|
card: 30,
|
|
98
317
|
settings: 30,
|
|
@@ -100,7 +319,8 @@ const DEFAULT_CONFIG = {
|
|
|
100
319
|
trajectory: 30,
|
|
101
320
|
input: 30,
|
|
102
321
|
panel: 30,
|
|
103
|
-
produced: 30
|
|
322
|
+
produced: 30,
|
|
323
|
+
header: 30
|
|
104
324
|
},
|
|
105
325
|
strokes: {
|
|
106
326
|
bg: {
|
|
@@ -147,11 +367,16 @@ const DEFAULT_CONFIG = {
|
|
|
147
367
|
width: 0,
|
|
148
368
|
color: "auto",
|
|
149
369
|
customColor: "#808080"
|
|
370
|
+
},
|
|
371
|
+
header: {
|
|
372
|
+
width: 0,
|
|
373
|
+
color: "auto",
|
|
374
|
+
customColor: "#808080"
|
|
150
375
|
}
|
|
151
376
|
},
|
|
152
377
|
settingsOpacity: .5,
|
|
153
378
|
wallpaperOpacity: 1,
|
|
154
|
-
blur:
|
|
379
|
+
blur: 0,
|
|
155
380
|
bgState: {
|
|
156
381
|
zoom: 1,
|
|
157
382
|
x: 0,
|
|
@@ -177,6 +402,7 @@ const DEFAULT_CONFIG = {
|
|
|
177
402
|
trajectoryOpacity: .5,
|
|
178
403
|
panelOpacity: .5,
|
|
179
404
|
producedOpacity: .5,
|
|
405
|
+
headerOpacity: .5,
|
|
180
406
|
profiles: [],
|
|
181
407
|
rotation: {
|
|
182
408
|
enabled: false,
|
|
@@ -297,7 +523,8 @@ const STROKE_GROUPS = [
|
|
|
297
523
|
"trajectory",
|
|
298
524
|
"input",
|
|
299
525
|
"panel",
|
|
300
|
-
"produced"
|
|
526
|
+
"produced",
|
|
527
|
+
"header"
|
|
301
528
|
];
|
|
302
529
|
const STROKE_COLOR_KEYS = [
|
|
303
530
|
"auto",
|
|
@@ -359,7 +586,8 @@ function normalizeConfig(raw) {
|
|
|
359
586
|
"trajectory",
|
|
360
587
|
"input",
|
|
361
588
|
"panel",
|
|
362
|
-
"produced"
|
|
589
|
+
"produced",
|
|
590
|
+
"header"
|
|
363
591
|
]) blurs[k] = clamp(bl[k], 0, 60, DEFAULT_CONFIG.blurs[k]);
|
|
364
592
|
return {
|
|
365
593
|
color,
|
|
@@ -387,6 +615,7 @@ function normalizeConfig(raw) {
|
|
|
387
615
|
trajectoryOpacity: clamp(r.trajectoryOpacity, 0, 1, DEFAULT_CONFIG.trajectoryOpacity),
|
|
388
616
|
panelOpacity: clamp(r.panelOpacity, 0, 1, DEFAULT_CONFIG.panelOpacity),
|
|
389
617
|
producedOpacity: clamp(r.producedOpacity, 0, 1, DEFAULT_CONFIG.producedOpacity),
|
|
618
|
+
headerOpacity: clamp(r.headerOpacity, 0, 1, DEFAULT_CONFIG.headerOpacity),
|
|
390
619
|
profiles: normalizeProfiles(r.profiles),
|
|
391
620
|
rotation: normalizeRotation(r.rotation),
|
|
392
621
|
schedule: normalizeSchedule(r.schedule),
|
|
@@ -471,7 +700,8 @@ function normalizeProfileAppearance(raw) {
|
|
|
471
700
|
chatTextOpacity: clamp(a.chatTextOpacity, 0, 1, DEFAULT_CONFIG.chatTextOpacity),
|
|
472
701
|
trajectoryOpacity: clamp(a.trajectoryOpacity, 0, 1, DEFAULT_CONFIG.trajectoryOpacity),
|
|
473
702
|
panelOpacity: clamp(a.panelOpacity, 0, 1, DEFAULT_CONFIG.panelOpacity),
|
|
474
|
-
producedOpacity: clamp(a.producedOpacity, 0, 1, DEFAULT_CONFIG.producedOpacity)
|
|
703
|
+
producedOpacity: clamp(a.producedOpacity, 0, 1, DEFAULT_CONFIG.producedOpacity),
|
|
704
|
+
headerOpacity: clamp(a.headerOpacity, 0, 1, DEFAULT_CONFIG.headerOpacity)
|
|
475
705
|
};
|
|
476
706
|
}
|
|
477
707
|
function normalizeProfiles(raw) {
|
|
@@ -1567,7 +1797,7 @@ async function advanceRotationIfDue() {
|
|
|
1567
1797
|
}
|
|
1568
1798
|
/** Dispatch one decoded RPC method to the matching persistence routine and
|
|
1569
1799
|
* return the wire `result` half of the server-response envelope. */
|
|
1570
|
-
async function handleRpcMethod(endpoint, payload) {
|
|
1800
|
+
async function handleRpcMethod(endpoint, payload, hostInfo) {
|
|
1571
1801
|
const method = endpoint.slice(`${NS}/`.length);
|
|
1572
1802
|
try {
|
|
1573
1803
|
switch (method) {
|
|
@@ -1584,7 +1814,8 @@ async function handleRpcMethod(endpoint, payload) {
|
|
|
1584
1814
|
videoUrl: await videoUrl(),
|
|
1585
1815
|
fontUrl: await fontUrl(),
|
|
1586
1816
|
rotated,
|
|
1587
|
-
firstRun
|
|
1817
|
+
firstRun,
|
|
1818
|
+
host: await hostInfo
|
|
1588
1819
|
}
|
|
1589
1820
|
};
|
|
1590
1821
|
}
|
|
@@ -1645,6 +1876,10 @@ async function handleRpcMethod(endpoint, payload) {
|
|
|
1645
1876
|
}
|
|
1646
1877
|
}
|
|
1647
1878
|
function apply(ctx) {
|
|
1879
|
+
const hostInfo = resolveHostInfo(ctx.profileContext?.installAnchor).catch((e) => {
|
|
1880
|
+
console.warn("dsh-any-background: host release detection failed, falling back to DOM probing", e);
|
|
1881
|
+
return UNKNOWN_HOST_INFO;
|
|
1882
|
+
});
|
|
1648
1883
|
ctx.inject(["connection", "webServer"], (webCtx) => {
|
|
1649
1884
|
webCtx.effect(() => webCtx.webServer.register({
|
|
1650
1885
|
kind: "prefix",
|
|
@@ -1747,7 +1982,7 @@ function apply(ctx) {
|
|
|
1747
1982
|
}));
|
|
1748
1983
|
return;
|
|
1749
1984
|
}
|
|
1750
|
-
const result = await handleRpcMethod(endpoint, env.payload);
|
|
1985
|
+
const result = await handleRpcMethod(endpoint, env.payload, hostInfo);
|
|
1751
1986
|
res.writeHead(200, { "Content-Type": "application/json" });
|
|
1752
1987
|
res.end(JSON.stringify({
|
|
1753
1988
|
type: "server-response",
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "dsh-any-background",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.1",
|
|
4
4
|
"description": "Appearance plugin for DeepSeek Harness: custom theme color (PS-style color wheel), background wallpaper with opacity/blur controls, and separate main/settings interface opacity.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"deepseek-harness",
|
|
@@ -23,7 +23,7 @@
|
|
|
23
23
|
"author": "Tkingxiao",
|
|
24
24
|
"type": "module",
|
|
25
25
|
"engines": {
|
|
26
|
-
"dsh": "
|
|
26
|
+
"dsh": "0.1.5-rc.2 || 0.1.5-rc.3 || 0.1.6-alpha.1 || 0.1.6-alpha.2 || 0.1.7-alpha.1 || 0.1.7-alpha.2 || 0.1.7-rc.1"
|
|
27
27
|
},
|
|
28
28
|
"exports": {
|
|
29
29
|
".": {
|
|
@@ -67,12 +67,13 @@
|
|
|
67
67
|
},
|
|
68
68
|
"peerDependencies": {
|
|
69
69
|
"@deepseek-ai/cordis": "^4.0.2",
|
|
70
|
-
"@deepseek-ai/dsh-client-locale": "
|
|
71
|
-
"@deepseek-ai/dsh-client-store": "
|
|
72
|
-
"@deepseek-ai/dsh-client-connection": "
|
|
73
|
-
"@deepseek-ai/dsh-client-ui-settings": "
|
|
74
|
-
"@deepseek-ai/dsh-client-ui-
|
|
75
|
-
"@deepseek-ai/dsh-
|
|
70
|
+
"@deepseek-ai/dsh-client-locale": "0.1.5-rc.2 || 0.1.5-rc.3 || 0.1.6-alpha.1 || 0.1.6-alpha.2 || 0.1.7-alpha.1 || 0.1.7-alpha.2 || 0.1.7-rc.1",
|
|
71
|
+
"@deepseek-ai/dsh-client-store": "0.1.5-rc.2 || 0.1.5-rc.3 || 0.1.6-alpha.1 || 0.1.6-alpha.2 || 0.1.7-alpha.1 || 0.1.7-alpha.2 || 0.1.7-rc.1",
|
|
72
|
+
"@deepseek-ai/dsh-client-connection": "0.1.5-rc.2 || 0.1.5-rc.3 || 0.1.6-alpha.1 || 0.1.6-alpha.2 || 0.1.7-alpha.1 || 0.1.7-alpha.2 || 0.1.7-rc.1",
|
|
73
|
+
"@deepseek-ai/dsh-client-ui-settings": "0.1.5-rc.2 || 0.1.5-rc.3 || 0.1.6-alpha.1 || 0.1.6-alpha.2 || 0.1.7-alpha.1 || 0.1.7-alpha.2 || 0.1.7-rc.1",
|
|
74
|
+
"@deepseek-ai/dsh-client-ui-sidebar-right": "0.1.5-rc.2 || 0.1.5-rc.3 || 0.1.6-alpha.1 || 0.1.6-alpha.2 || 0.1.7-alpha.1 || 0.1.7-alpha.2 || 0.1.7-rc.1",
|
|
75
|
+
"@deepseek-ai/dsh-client-ui-theme": "0.1.5-rc.2 || 0.1.5-rc.3 || 0.1.6-alpha.1 || 0.1.6-alpha.2 || 0.1.7-alpha.1 || 0.1.7-alpha.2 || 0.1.7-rc.1",
|
|
76
|
+
"@deepseek-ai/dsh-invariants": "0.1.5-rc.2 || 0.1.5-rc.3 || 0.1.6-alpha.1 || 0.1.6-alpha.2 || 0.1.7-alpha.1 || 0.1.7-alpha.2 || 0.1.7-rc.1",
|
|
76
77
|
"react": "^18.2.0",
|
|
77
78
|
"dsh-better-sidebar": ">=0.4.0"
|
|
78
79
|
},
|
|
@@ -80,6 +81,9 @@
|
|
|
80
81
|
"dsh-better-sidebar": {
|
|
81
82
|
"optional": true
|
|
82
83
|
},
|
|
84
|
+
"@deepseek-ai/dsh-client-ui-sidebar-right": {
|
|
85
|
+
"optional": true
|
|
86
|
+
},
|
|
83
87
|
"react": {
|
|
84
88
|
"optional": true
|
|
85
89
|
},
|
|
@@ -107,9 +111,15 @@
|
|
|
107
111
|
},
|
|
108
112
|
"dsh": {
|
|
109
113
|
"compatibility": {
|
|
110
|
-
"dsh": "0.1.5-rc.2",
|
|
114
|
+
"dsh": "0.1.5-rc.2 || 0.1.5-rc.3 || 0.1.6-alpha.1 || 0.1.6-alpha.2 || 0.1.7-alpha.1 || 0.1.7-alpha.2 || 0.1.7-rc.1",
|
|
111
115
|
"dshReleases": {
|
|
112
|
-
"0.1.5-rc.2": "compatible"
|
|
116
|
+
"0.1.5-rc.2": "compatible",
|
|
117
|
+
"0.1.5-rc.3": "compatible",
|
|
118
|
+
"0.1.6-alpha.1": "compatible",
|
|
119
|
+
"0.1.6-alpha.2": "compatible",
|
|
120
|
+
"0.1.7-alpha.1": "compatible",
|
|
121
|
+
"0.1.7-alpha.2": "compatible",
|
|
122
|
+
"0.1.7-rc.1": "compatible"
|
|
113
123
|
}
|
|
114
124
|
},
|
|
115
125
|
"bundle": {
|