dsh-crate-web 0.1.1 → 0.1.2-preview.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.
Files changed (34) hide show
  1. package/README.md +11 -290
  2. package/README.zh-CN.md +2 -303
  3. package/THIRD-PARTY-LICENSE.txt +21 -0
  4. package/cordis.patch.yml +1 -6
  5. package/core/dsh_pack/_version.py +1 -0
  6. package/core/dsh_pack/bundle.py +74 -0
  7. package/core/dsh_pack/cli.py +81 -18
  8. package/core/dsh_pack/desktop_verify.py +304 -0
  9. package/core/dsh_pack/diagnostics.py +1170 -0
  10. package/core/dsh_pack/errors.py +16 -1
  11. package/core/dsh_pack/export.py +86 -103
  12. package/core/dsh_pack/export_plan.py +96 -0
  13. package/core/dsh_pack/identity.py +25 -0
  14. package/core/dsh_pack/importer.py +468 -217
  15. package/core/dsh_pack/network.py +5 -4
  16. package/core/dsh_pack/pack.py +14 -2
  17. package/core/dsh_pack/portability.py +392 -0
  18. package/core/dsh_pack/preflight.py +63 -16
  19. package/core/dsh_pack/troubleshooting.py +94 -0
  20. package/core/dsh_pack/user_cli.py +16 -0
  21. package/core/dsh_pack/validation.py +64 -4
  22. package/core/dsh_pack/verify.py +343 -194
  23. package/core/dsh_pack/windows_verify.py +177 -0
  24. package/desktop-patch-helper.mjs +140 -0
  25. package/lib/client.js +292 -102
  26. package/lib/index.d.ts +7 -1
  27. package/lib/index.js +1121 -229
  28. package/package.json +14 -7
  29. package/skills/dsh-crate-troubleshooting/SKILL.md +172 -0
  30. package/skills/dsh-crate-troubleshooting/compatibility.json +11 -0
  31. package/skills/dsh-crate-troubleshooting/reference/diagnostics.generated.md +96 -0
  32. package/skills/dsh-crate-troubleshooting/reference/repair-boundaries.md +60 -0
  33. package/skills/dsh-crate-troubleshooting/reference/stages.generated.md +22 -0
  34. package/verify-desktop.mjs +314 -0
package/lib/index.js CHANGED
@@ -1,10 +1,800 @@
1
- import { randomUUID } from "node:crypto";
2
- import { createReadStream } from "node:fs";
3
- import { access, cp, mkdir, readFile, readdir, rename, stat, unlink, writeFile } from "node:fs/promises";
1
+ import { createHash, randomUUID } from "node:crypto";
2
+ import { access, lstat, mkdir, readFile, readdir, realpath, rename, rm, stat, unlink, writeFile } from "node:fs/promises";
3
+ import { dirname, isAbsolute, join, relative, resolve } from "node:path";
4
+ import { createReadStream, readFileSync } from "node:fs";
4
5
  import { platform } from "node:os";
5
- import { dirname, join, relative, resolve } from "node:path";
6
6
  import { spawn } from "node:child_process";
7
7
  import { fileURLToPath } from "node:url";
8
+ //#region src/desktop.ts
9
+ /** Read the official Desktop's bundled sources without changing its installation. */
10
+ function desktopRuntimeRoot(argv = process.argv) {
11
+ return (argv[1] ?? "").replaceAll("\\", "/").includes("/@deepseek-ai/dsh-desktop-host/") && argv[2] ? resolve(argv[2]) : void 0;
12
+ }
13
+ function desktopRuntimeVersion() {
14
+ const root = desktopRuntimeRoot();
15
+ if (!root) return void 0;
16
+ try {
17
+ const pkg = JSON.parse(readFileSync(join(root, "node_modules", "@deepseek-ai", "dsh", "package.json"), "utf8"));
18
+ return typeof pkg.version === "string" ? pkg.version : void 0;
19
+ } catch {
20
+ return;
21
+ }
22
+ }
23
+ function rejectRequest(connection, req, res) {
24
+ const status = connection?.requestRejection(req) ?? (connection ? void 0 : 503);
25
+ if (status === void 0) return false;
26
+ res.writeHead(status);
27
+ res.end();
28
+ return true;
29
+ }
30
+ async function copyPackage(source, target) {
31
+ await mkdir(target, { recursive: true });
32
+ for (const entry of await readdir(source, { withFileTypes: true })) {
33
+ if ([
34
+ "node_modules",
35
+ ".git",
36
+ "cache",
37
+ "logs"
38
+ ].includes(entry.name)) continue;
39
+ const input = join(source, entry.name);
40
+ const output = join(target, entry.name);
41
+ if (entry.isDirectory()) await copyPackage(input, output);
42
+ else if (entry.isFile()) await writeFile(output, await readFile(input));
43
+ else throw new Error(`Unsupported link in Desktop package: ${entry.name}`);
44
+ }
45
+ }
46
+ /** Public evidence for dependencies already supplied by this exact host. */
47
+ async function writeDesktopHostBundles(home, runtime = desktopRuntimeRoot()) {
48
+ if (!runtime) return void 0;
49
+ const modules = join(runtime, "node_modules");
50
+ const bundles = {};
51
+ const hashFiles = async (root, prefix = "") => {
52
+ const result = {};
53
+ for (const entry of await readdir(join(root, prefix), { withFileTypes: true })) {
54
+ if ([
55
+ "node_modules",
56
+ ".git",
57
+ "cache",
58
+ "logs"
59
+ ].includes(entry.name)) continue;
60
+ const relative = prefix ? `${prefix}/${entry.name}` : entry.name;
61
+ if (entry.isDirectory()) Object.assign(result, await hashFiles(root, relative));
62
+ else if (entry.isFile()) result[relative] = createHash("sha256").update(await readFile(join(root, relative))).digest("hex");
63
+ else throw new Error("Unsupported link in official host Bundle evidence");
64
+ }
65
+ return result;
66
+ };
67
+ for (const entry of await readdir(join(modules, "@deepseek-ai"), { withFileTypes: true })) {
68
+ if (!entry.isDirectory()) continue;
69
+ const root = join(modules, "@deepseek-ai", entry.name);
70
+ let manifest;
71
+ try {
72
+ manifest = JSON.parse(await readFile(join(root, "package.json"), "utf8"));
73
+ } catch {
74
+ continue;
75
+ }
76
+ if (!manifest.dsh?.bundle?.patch) continue;
77
+ const dependencies = {};
78
+ for (const name of Object.keys({
79
+ ...manifest.dependencies,
80
+ ...manifest.optionalDependencies
81
+ })) try {
82
+ const dependency = JSON.parse(await readFile(join(modules, ...name.split("/"), "package.json"), "utf8"));
83
+ if (typeof dependency.version === "string") dependencies[name] = dependency.version;
84
+ } catch {}
85
+ bundles[`@deepseek-ai/${entry.name}`] = {
86
+ manifest,
87
+ dependencies,
88
+ files: await hashFiles(root)
89
+ };
90
+ }
91
+ const content = JSON.stringify({
92
+ schemaVersion: 1,
93
+ runtime,
94
+ bundles
95
+ });
96
+ const destination = join(home, ".dsh-pack", "runtime-sources", `${createHash("sha256").update(content).digest("hex")}-host-bundles.json`);
97
+ await mkdir(dirname(destination), { recursive: true });
98
+ try {
99
+ if (await readFile(destination, "utf8") === content) return destination;
100
+ } catch {}
101
+ const staging = `${destination}.${randomUUID()}.tmp`;
102
+ await writeFile(staging, content, { flag: "wx" });
103
+ try {
104
+ await rename(staging, destination);
105
+ } catch (error) {
106
+ if (await readFile(destination, "utf8").catch(() => "") !== content) throw error;
107
+ } finally {
108
+ await rm(staging, { force: true });
109
+ }
110
+ return destination;
111
+ }
112
+ /** Electron can read ASAR; Python/npm cannot. Materialize only public package files. */
113
+ let materializing = Promise.resolve();
114
+ async function materializeDesktopModules(home, selectedNames = []) {
115
+ const pending = materializing.then(() => materializeDesktopModulesOnce(home, selectedNames));
116
+ materializing = pending.catch(() => void 0);
117
+ return pending;
118
+ }
119
+ async function materializeDesktopModulesOnce(home, selectedNames) {
120
+ const runtime = desktopRuntimeRoot();
121
+ if (!runtime) return void 0;
122
+ const modules = join(runtime, "node_modules");
123
+ const version = await readFile(join(modules, "@deepseek-ai", "dsh", "package.json"), "utf8");
124
+ const destination = join(home, ".dsh-pack", "runtime-sources", createHash("sha256").update(runtime).update(version).digest("hex").slice(0, 20), "node_modules");
125
+ const names = new Set(selectedNames.filter((name) => /^@deepseek-ai\/[A-Za-z0-9._-]+$/.test(name)));
126
+ const profiles = join(home, "profiles");
127
+ for (const entry of await readdir(profiles, { withFileTypes: true })) {
128
+ if (!entry.isDirectory() || entry.name === "node_modules" || entry.name.startsWith(".")) continue;
129
+ try {
130
+ const pkg = JSON.parse(await readFile(join(profiles, entry.name, "package.json"), "utf8"));
131
+ for (const name of [...Object.keys(pkg.dependencies ?? {}), ...pkg.dsh?.profile?.bundles ?? []]) if (typeof name === "string" && /^@deepseek-ai\/[A-Za-z0-9._-]+$/.test(name)) names.add(name);
132
+ } catch {
133
+ continue;
134
+ }
135
+ }
136
+ for (const name of names) {
137
+ const source = join(modules, ...name.split("/"));
138
+ let manifest;
139
+ try {
140
+ manifest = await readFile(join(source, "package.json"), "utf8");
141
+ } catch (error) {
142
+ if (error.code === "ENOENT") continue;
143
+ throw error;
144
+ }
145
+ const target = join(destination, ...name.split("/"));
146
+ try {
147
+ if (await readFile(join(target, "package.json"), "utf8") === manifest) continue;
148
+ } catch {}
149
+ const staging = `${target}.staging-${process.pid}`;
150
+ await rm(staging, {
151
+ recursive: true,
152
+ force: true
153
+ });
154
+ try {
155
+ await copyPackage(source, staging);
156
+ await mkdir(dirname(target), { recursive: true });
157
+ await rm(target, {
158
+ recursive: true,
159
+ force: true
160
+ });
161
+ for (let attempt = 0;; attempt += 1) try {
162
+ await rename(staging, target);
163
+ break;
164
+ } catch (error) {
165
+ if (attempt >= 4 || ![
166
+ "EPERM",
167
+ "EACCES",
168
+ "EBUSY"
169
+ ].includes(error.code ?? "")) throw error;
170
+ await new Promise((done) => setTimeout(done, 100 * (attempt + 1)));
171
+ }
172
+ } finally {
173
+ await rm(staging, {
174
+ recursive: true,
175
+ force: true
176
+ });
177
+ }
178
+ }
179
+ return destination;
180
+ }
181
+ //#endregion
182
+ //#region src/windows-runner-identity.ts
183
+ const windowsRunnerIdentity = {
184
+ "version": "0.2.1-rc.3",
185
+ "platform": "win32",
186
+ "arch": "x64",
187
+ "nodeSha256": "ba4e6d110e8c1592a1ecd390f6b05f3da124b13871a5be62b341a07a853c6c32",
188
+ "providerSha256": "be6e1107871cf8d94c040090b13c405bc833822e2f51ed5280e93eececf762be",
189
+ "files": {
190
+ "node_modules/@deepseek-ai/cordis-plugin-loader/LICENSE": "034fb52b1d57360ecbae6cb1632a88f86fd7c3d3f5631a5f082710203dda0be7",
191
+ "node_modules/@deepseek-ai/cordis-plugin-loader/README.md": "b73481e6c8503534d36197b64bdc604be126c466ea8ee9692812e6663ba218c4",
192
+ "node_modules/@deepseek-ai/cordis-plugin-loader/lib/index.js": "638b9ad360e01236120772323f80a65570c4f3f42f4cfc6243330241025b6d72",
193
+ "node_modules/@deepseek-ai/cordis-plugin-loader/package.json": "270d8d1ee5751e4173e7c4f9953bc19a1d370306d254c0ffaf21c37bc6deb78a",
194
+ "node_modules/@deepseek-ai/cordis-plugin-loader/src/config/diff.ts": "6025a6b9798a0a16af017bb7d8d6394bbe345685b2ace56b15975add5843edb3",
195
+ "node_modules/@deepseek-ai/cordis-plugin-loader/src/config/entry.ts": "6a061f1d3c2cdaac19409bf8ec6956ec5a0a457c4f1689be658d50af7c9ee294",
196
+ "node_modules/@deepseek-ai/cordis-plugin-loader/src/config/group.ts": "5e138e8a8fad22e21d031859345797c445efbc380559fc32d35b03c835e60ccc",
197
+ "node_modules/@deepseek-ai/cordis-plugin-loader/src/config/isolate.ts": "dfc9e961f61fe5f7701b5593f98902aa971884fb242e208fc0d5207794117094",
198
+ "node_modules/@deepseek-ai/cordis-plugin-loader/src/config/tree.ts": "761889adfb6b8a164fb12a0cec49a6ef439598b9267e85073000cfa9b7d682c8",
199
+ "node_modules/@deepseek-ai/cordis-plugin-loader/src/config/utils.ts": "d85b8ac1693af4667e9c0395cd1d6b15ec28387073a81f0d00bd38d909a05f8e",
200
+ "node_modules/@deepseek-ai/cordis-plugin-loader/src/index.ts": "a135e2189a0feb0af08ff79de761698fb8ce7b41c96fefda1d4a299e5982fef3",
201
+ "node_modules/@deepseek-ai/cordis-plugin-loader/src/internal.ts": "35a50d597fed58656a11e3c5294fdf99524ed8c106739b4fab522a288eefa877",
202
+ "node_modules/@deepseek-ai/cordis/LICENSE": "034fb52b1d57360ecbae6cb1632a88f86fd7c3d3f5631a5f082710203dda0be7",
203
+ "node_modules/@deepseek-ai/cordis/README.md": "4ed860307750b172e1176e476302174acacae2b0bb2b46479b4b9f6b336ecdcf",
204
+ "node_modules/@deepseek-ai/cordis/bin.js": "cf84978c7e4165bf090b0d50c34c1986d06577f2ada27c902660783a142c3f81",
205
+ "node_modules/@deepseek-ai/cordis/lib/index.js": "6a9394c0877ff45218818c6e815edd038f8057e1a1deb390a8d43ec81c57691e",
206
+ "node_modules/@deepseek-ai/cordis/package.json": "b73831b926b16cbd684aa1b277461e7800a2b35e2dd351ad3c2c8c0db158589d",
207
+ "node_modules/@deepseek-ai/cordis/src/context.ts": "96b388162d6013c1898de61e35f28917abb93809de24174980f2a1a348d0b115",
208
+ "node_modules/@deepseek-ai/cordis/src/events.ts": "9aff93dcfcad98aebb692c19c36d3bf034a96f9085bc66900a997cda3f79e6fe",
209
+ "node_modules/@deepseek-ai/cordis/src/fiber.ts": "b7661d6c19be76cef6b97d88719a8112c0f8b5abe65bd9e7d5947773fd4b96d4",
210
+ "node_modules/@deepseek-ai/cordis/src/index.ts": "071fb226e9a21556625e4391b28e6641b9b34b1cd402155246e0437993d8b740",
211
+ "node_modules/@deepseek-ai/cordis/src/logger.ts": "05cb6be3e4cf8d078185b5d10c87e536c7d2b2b3ad43c270a0dbafaa28f41fef",
212
+ "node_modules/@deepseek-ai/cordis/src/reflect.ts": "6847b9781044023d65aebb5896a873b9f0a3d777eaf7fa0dd2a7a408eb6b74a6",
213
+ "node_modules/@deepseek-ai/cordis/src/registry.ts": "34bbd60ae502b4f85201c204afb52a9acabde6878d9278493478c1b2183debd3",
214
+ "node_modules/@deepseek-ai/cordis/src/service.ts": "614205c6ce7cf1a057b8b352e96aa4fcd734c967a3d2283a126c9c61f268e3be",
215
+ "node_modules/@deepseek-ai/cordis/src/utils.ts": "8fe273424583d21267ef13f248840e97454d09d836a0ac08323a9482c2069263",
216
+ "node_modules/@deepseek-ai/cosmokit/LICENSE": "034fb52b1d57360ecbae6cb1632a88f86fd7c3d3f5631a5f082710203dda0be7",
217
+ "node_modules/@deepseek-ai/cosmokit/README.md": "fa0a17f50f83cda52ce623c9d42afb4eec1b33689285a0b9d2f655acbca13286",
218
+ "node_modules/@deepseek-ai/cosmokit/lib/index.js": "ba44c0871656e4c7cac2c3c8a2ff644e0d2eb9d6bda7f6355866d686d513268e",
219
+ "node_modules/@deepseek-ai/cosmokit/package.json": "70ef4acbb6f4186b9fd24d1e7f32457112179767cf42de849bf00ef7f63b0467",
220
+ "node_modules/@deepseek-ai/cosmokit/src/array.ts": "cf4de899ecffd66a90d8cef6f4c7d127d31f77f776d8e173d41c30d2d7632cf7",
221
+ "node_modules/@deepseek-ai/cosmokit/src/index.ts": "1087da74b9c461984e547d524ee766eebcf329a78e4720bff5b60a004ccf6e8c",
222
+ "node_modules/@deepseek-ai/cosmokit/src/misc.ts": "117617943074ea57c15f216905dacd2f6d1c4c2ff16586f97a7a7a87dbf2141f",
223
+ "node_modules/@deepseek-ai/cosmokit/src/string.ts": "5564272b3e15e49235cbe3a8b453f27306baf282d23a893982841670f65d3c04",
224
+ "node_modules/@deepseek-ai/cosmokit/src/time.ts": "49957c4608465a1fbd738186a92c47fffcd1fc4ba59dbf89524f8a773fe16fe2",
225
+ "node_modules/@deepseek-ai/cosmokit/src/types.ts": "cc49c12e4a637f7b0754ff78a8299e9c42fa40ee8c678550af0c538a80146a92",
226
+ "node_modules/@deepseek-ai/cosmokit/src/volatile.ts": "937433215595f89da249ec7cabb89e331ff4135a40c6686a95666d2095315e55",
227
+ "node_modules/@deepseek-ai/dsh-http-proxy/LICENSE": "ebb4f09972aee8608be255debaf78451a68e95c290f55c240dec2ecfa16ea6be",
228
+ "node_modules/@deepseek-ai/dsh-http-proxy/README.i18n.yaml": "6411089157f986ec1f702f44bf2b713e167b81b2f59b68a1fd4bf279c8e86a51",
229
+ "node_modules/@deepseek-ai/dsh-http-proxy/README.md": "0cc2ab58e8de7093ed6b9fe0a36f0a912950543c76c96a30cd8e8b510b9e18e4",
230
+ "node_modules/@deepseek-ai/dsh-http-proxy/README.zh.md": "6ac5b9221f68f6c11fd2553caddc44eaa62366c8939ca8878ff469989cd8a15d",
231
+ "node_modules/@deepseek-ai/dsh-http-proxy/lib/index.js": "5310861bc89788ea24be82a3b323e34cbd42b9e6214e2a179b2e6f92a8758cd5",
232
+ "node_modules/@deepseek-ai/dsh-http-proxy/package.json": "e260d9e6c6dfbd0048d96e8b699909140ba54265db828a8c4b03cc68b2d85b30",
233
+ "node_modules/@deepseek-ai/dsh-lazy-require/LICENSE": "ebb4f09972aee8608be255debaf78451a68e95c290f55c240dec2ecfa16ea6be",
234
+ "node_modules/@deepseek-ai/dsh-lazy-require/README.i18n.yaml": "11345190fd51679a4bf9ae1e474b6e43152583732bcf249d5c8df537fd07a8e4",
235
+ "node_modules/@deepseek-ai/dsh-lazy-require/README.md": "aacff96e3fa4502ad46fdceb12ca042833eb0356f918e099bf8be92b784f6ffd",
236
+ "node_modules/@deepseek-ai/dsh-lazy-require/README.zh.md": "4a29f487e1a4531c98a6afd9711f92cebd9b870480cbba10588f230074dd0871",
237
+ "node_modules/@deepseek-ai/dsh-lazy-require/lib/index.js": "eab2f914e4b5f54b2a1af5998eecd52f1b737146db44881ef51fb5e501e1faeb",
238
+ "node_modules/@deepseek-ai/dsh-lazy-require/package.json": "7f1f25f58d4f2a6a493deec87fbbd9c3f5866ccf82ece9d06fa68b7b0639c002",
239
+ "node_modules/@deepseek-ai/dsh-sandbox-windows-acl/LICENSE": "ebb4f09972aee8608be255debaf78451a68e95c290f55c240dec2ecfa16ea6be",
240
+ "node_modules/@deepseek-ai/dsh-sandbox-windows-acl/README.i18n.yaml": "81c5f53c0a493dea7bfac547b8e85b568df678eb5d4f0924a287141f2ecf6d76",
241
+ "node_modules/@deepseek-ai/dsh-sandbox-windows-acl/README.md": "346a18ad34ec0342dcbaf69cd473b62d5496907e7b6a4495a52a29bec702ee8f",
242
+ "node_modules/@deepseek-ai/dsh-sandbox-windows-acl/README.zh.md": "d9c8d3e371162c10fdcf9595457944ef053db225875ae0a995ecfdb0620cc05c",
243
+ "node_modules/@deepseek-ai/dsh-sandbox-windows-acl/assets/diagnose-windows-sandbox-acl/SKILL.md": "9c616c78892daeaea864a9b2d6baaea91ff133cf83cde0b725c6caee2d4933cb",
244
+ "node_modules/@deepseek-ai/dsh-sandbox-windows-acl/assets/diagnose-windows-sandbox-acl/scripts/diagnose-windows-sandbox-acl.ps1": "adba89f3b10692302723d231d003cdf365311effaff996d32416f9531e3b63d9",
245
+ "node_modules/@deepseek-ai/dsh-sandbox-windows-acl/lib/index.js": "83379e9c6e8bb725d0ed48ad086fc666bfe151c8c1a345e29e3da5b998aa4fd8",
246
+ "node_modules/@deepseek-ai/dsh-sandbox-windows-acl/lib/runner.js": "9159aaa995d417e5948dd1cc3d8cd40616270e320048e577c58a1c65be3f3a2d",
247
+ "node_modules/@deepseek-ai/dsh-sandbox-windows-acl/lib/types-Cl_DXjhk.js": "0bb3a34508785bdc34626542f9358d398fd9f60fdaf4b48201dfdff2122f25fc",
248
+ "node_modules/@deepseek-ai/dsh-sandbox-windows-acl/package.json": "9f7060f0a08a1ffe5b92936eecda134867c126e2b976921ed9b02eedfd639a3f",
249
+ "node_modules/@deepseek-ai/dsh-scope/LICENSE": "ebb4f09972aee8608be255debaf78451a68e95c290f55c240dec2ecfa16ea6be",
250
+ "node_modules/@deepseek-ai/dsh-scope/README.i18n.yaml": "7d4492b76760378adf6b0c6e609ceca12a8ff6a074588c3c045cd33dd27b88fd",
251
+ "node_modules/@deepseek-ai/dsh-scope/README.md": "a78f5ea99004e168a32e096b06d45c661736828c414123eba7f6104b55d64280",
252
+ "node_modules/@deepseek-ai/dsh-scope/README.zh.md": "78012222db4f96c7b5b7446964d31745d5dcd32ab844c9af3a832cb8db9a0288",
253
+ "node_modules/@deepseek-ai/dsh-scope/lib/index.js": "2829df71d76e08941457d4dd173eac60783e55354921137c8b75e8b5c0d2ecca",
254
+ "node_modules/@deepseek-ai/dsh-scope/package.json": "560c62665b447f7bea0dc941231bbbe1408b095e9e86ce74062331f53a4895ac",
255
+ "node_modules/@deepseek-ai/dsh-skill/LICENSE": "ebb4f09972aee8608be255debaf78451a68e95c290f55c240dec2ecfa16ea6be",
256
+ "node_modules/@deepseek-ai/dsh-skill/README.i18n.yaml": "bbb855d83fff1eb3ecb5fdde7fde20e37c7af6e70c9a2952a30eefec83072144",
257
+ "node_modules/@deepseek-ai/dsh-skill/README.md": "6717d6df2c778e4a1ba07afee30206f3a0f3c414e5f49725d755ab7ced9995bb",
258
+ "node_modules/@deepseek-ai/dsh-skill/README.zh.md": "535cb17423807ad24fb1086aa0fa14374b196b9ebc48ab208475d0f52fc67a52",
259
+ "node_modules/@deepseek-ai/dsh-skill/lib/index.js": "4b88621be4e7ff09b05c175fc6dcb67e77a22e5c5570e3aa603338b2937ea791",
260
+ "node_modules/@deepseek-ai/dsh-skill/locale/en.json": "e1c7c827b300c0e91fa8ddb515854793261d4a100ac94b9558600008355cb4dc",
261
+ "node_modules/@deepseek-ai/dsh-skill/locale/zh.json": "6b5a886c8434e2263d2b3166079df0120a465c11073eaa2824cf1e039dc65cf4",
262
+ "node_modules/@deepseek-ai/dsh-skill/package.json": "74eef3a872ad31f83117f0562d940c59f67494b38a067079024e2bf70f0553f6",
263
+ "node_modules/@deepseek-ai/dsh-subprocess/LICENSE": "ebb4f09972aee8608be255debaf78451a68e95c290f55c240dec2ecfa16ea6be",
264
+ "node_modules/@deepseek-ai/dsh-subprocess/README.i18n.yaml": "bb932b67899e1f59d10e9138b606885faae7f4a9cb8c3d8d09172be6f3a662d4",
265
+ "node_modules/@deepseek-ai/dsh-subprocess/README.md": "c25fd60d16fc4101855afe6d9b1c7ba39d07e21171987f02e82f5995c2dcf344",
266
+ "node_modules/@deepseek-ai/dsh-subprocess/README.zh.md": "8841479aef5119a9776772eea7151b35dcbcc622aa7e39dcac332e3994691b8c",
267
+ "node_modules/@deepseek-ai/dsh-subprocess/lib/control.js": "4afd0f7d7a7054b6fc8d727ea3f76731a78c9a972ddb6d5d2eef81cac4ffee3a",
268
+ "node_modules/@deepseek-ai/dsh-subprocess/lib/index.js": "0ea9e95a73639f9e69b48aa48f373f34881adffa2ee2ac2acd4702728da9592b",
269
+ "node_modules/@deepseek-ai/dsh-subprocess/package.json": "0a0ec0c96f8619681939bdd3cca22d5971d80a5594634e397f04678296936c9a",
270
+ "node_modules/@deepseek-ai/dsh-util-values/LICENSE": "ebb4f09972aee8608be255debaf78451a68e95c290f55c240dec2ecfa16ea6be",
271
+ "node_modules/@deepseek-ai/dsh-util-values/README.i18n.yaml": "930f4c21c65c91db734255d91a68fe2c22ef5509dd1f529e81f51f99af8dff03",
272
+ "node_modules/@deepseek-ai/dsh-util-values/README.md": "724407eaec88db29a1d65ba411202f2545f57f08964a0f23eb191c6d260abbfe",
273
+ "node_modules/@deepseek-ai/dsh-util-values/README.zh.md": "13cead4cc0a76a098c45d7a17d7825f75f1513a1ed453f0b9e260a9934ed2b33",
274
+ "node_modules/@deepseek-ai/dsh-util-values/lib/index.js": "4322a2aacdfe38476d2bbc62338120beea1e1660346d7db5b6c1e1f927a26b7c",
275
+ "node_modules/@deepseek-ai/dsh-util-values/package.json": "9d3fc5d25c5f5449a6188067204fef7e23c94326681ef4480377dfcdb832cfa8",
276
+ "node_modules/@deepseek-ai/dsh-win32-process/LICENSE": "ebb4f09972aee8608be255debaf78451a68e95c290f55c240dec2ecfa16ea6be",
277
+ "node_modules/@deepseek-ai/dsh-win32-process/README.i18n.yaml": "495793106a799f896540069cef7ca2b309f2d768c394ffc056fe7b3de80b516e",
278
+ "node_modules/@deepseek-ai/dsh-win32-process/README.md": "52a5a71f80fc3468c38b4114df112d0f4e9044db5094dcb6f0262e41dbf220dd",
279
+ "node_modules/@deepseek-ai/dsh-win32-process/README.zh.md": "7236ec5165c345c1e55abeea5a795dd93d067c14bdd6e97a4450a4b9ade99c63",
280
+ "node_modules/@deepseek-ai/dsh-win32-process/lib/index.js": "622bc3a9e97c46e784fe41c9a0a8535da2808019e4ac3f66d17cdad70c9ac0c9",
281
+ "node_modules/@deepseek-ai/dsh-win32-process/package.json": "44fc05024aa240124c8f2cf46c8fd8bbdcdce4120394ea510292586aaa8f050f",
282
+ "node_modules/@deepseek-ai/schemastery/LICENSE": "034fb52b1d57360ecbae6cb1632a88f86fd7c3d3f5631a5f082710203dda0be7",
283
+ "node_modules/@deepseek-ai/schemastery/README.md": "cdd54eece79b14c3672dfe94abb38b8d01c6ced57fb9975c4147fa17f81512d4",
284
+ "node_modules/@deepseek-ai/schemastery/lib/index.cjs": "aca1c1a47c7b6034feee01501aefca3e6dd97a0bac4fe334fd30647ae5a9e480",
285
+ "node_modules/@deepseek-ai/schemastery/lib/index.mjs": "cfcbe46c7416bdb35ce891c252152bbf519e08199bede5930dd7cb880c65f1ef",
286
+ "node_modules/@deepseek-ai/schemastery/package.json": "3e7deee09015c7f7aa17ae6cecfb928985520baec66aa676dc3f4ed67d4231f0",
287
+ "node_modules/@deepseek-ai/schemastery/src/index.ts": "a6647b515659cf439b701fa9f9574c9c310ce3872d26a13a81e9fa4d02ba10ad",
288
+ "node_modules/@koromix/koffi-win32-x64/README.md": "4fc87635ba2ce995d9f91401e96c68dd0600ca3db25dae419a9abc4e8e11fcd0",
289
+ "node_modules/@koromix/koffi-win32-x64/index.js": "632ab5a01dfc1b519b06275f490d6790100a2f8d71d8f56957091d0fcc5b3e0b",
290
+ "node_modules/@koromix/koffi-win32-x64/package.json": "b38fcff8641d493656ef4153a37fd7389806ae621bb916aca536fd3bbc158690",
291
+ "node_modules/@koromix/koffi-win32-x64/win32_x64/koffi.node": "b52ef88cf5e5926a09e5ed32e02a00f039b34d42501fc00e4344e84d93f994af",
292
+ "node_modules/koffi/CHANGELOG.md": "a306af803dde65098fa651c713450c18bbaf5fbff3e09811d1e16d86a569e487",
293
+ "node_modules/koffi/LICENSE.txt": "22bcbbbacd739b026a8dc484f62a31484ce4c4e31f3408b60b29b4e41d62b290",
294
+ "node_modules/koffi/README.md": "f6ca5fa22abb0a8740fc40789ec161d46373eab1867a7e4d72fbe34f0d709b80",
295
+ "node_modules/koffi/cnoke.cjs": "d0547e34c211e4c01914418b514bba0f141359324fe1369734660bd75f7ffafc",
296
+ "node_modules/koffi/doc/benchmarks.md": "05f1b7b394380125a3d66b7bc05101f21980d8d78cf5c554d6e2c7f29120f5d8",
297
+ "node_modules/koffi/doc/callbacks.md": "f1e3f14a1d84a5b6d6d7d6d3015a9859043f4d3773b932d361bc49f08a240284",
298
+ "node_modules/koffi/doc/composites.md": "7160ecf9e4796d172de3e62cadf7759a299ec94515b3e6993a494ca50b70f389",
299
+ "node_modules/koffi/doc/contribute.md": "72cecf31345e1d4e46d564bc4aa5020c5a445968cc2a818b337bf3a1019a4cbe",
300
+ "node_modules/koffi/doc/index.md": "c996303cff3c3665b85f88f1f2ffdb67390077c14546eabf9d78ed3cf443e412",
301
+ "node_modules/koffi/doc/load.md": "7b9d19a90f00c1cc47537ac65742e577fad22ec2fd18d400d4485fe4e00022c4",
302
+ "node_modules/koffi/doc/migration.md": "b5b4d49ed4658000c6d406b6975c5a7eacce42f1ad3f94e936e1339890381bd3",
303
+ "node_modules/koffi/doc/misc.md": "df10e522dd8c9512c949073d243cb9cff4dceaea69139c98c773ababb067f4c3",
304
+ "node_modules/koffi/doc/output.md": "78a692be2e23954ad024345806b2d4937a45113be6c48cfc2fdd53dc49c32580",
305
+ "node_modules/koffi/doc/pointers.md": "628890dec2cbe8304e006effaaead83e36d5e6b3695f3b7bf7e8add1d26f513c",
306
+ "node_modules/koffi/doc/primitives.md": "3b4cab3721ecd6cad4ccc0ba251f9edae24e3b03bb94ac22234b5c8718a7f346",
307
+ "node_modules/koffi/doc/start.md": "95c57729bd5b4477e39a8950fd4f1e6c8121cf5fba58907d16f2c8d5bdf92b8d",
308
+ "node_modules/koffi/doc/types.md": "d8a1acfcc5f416038f05b6f53a93445e80cba70755592d6ceaf5b9df9b3c5440",
309
+ "node_modules/koffi/doc/unions.md": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
310
+ "node_modules/koffi/doc/values.md": "f712dc80674c1711b76edc64b1a55c06e5003e17b542afe071bc20cdfed161ba",
311
+ "node_modules/koffi/index.cjs": "a200e15ec168d00cb3155794808a98243051c61dd7f6989c23c57ee220c918b9",
312
+ "node_modules/koffi/index.js": "34508972d2e18b79fd4a289943568a68bbaf18badd2e82a25c8deb1af27f6225",
313
+ "node_modules/koffi/indirect.cjs": "f36c7fd3caa9c43da3db45e1ee272892087b4001b6f575fffb76dd80574829b1",
314
+ "node_modules/koffi/indirect.js": "5c5045c5b5ec2083535efdfdbd95f5212545ce29a4b7f33a683504a35e5b6a02",
315
+ "node_modules/koffi/lib/native/base/base.cc": "b0fde2f2e68158cc496392a63ae3b84d88eac798ac0713f8acd1f897d936791f",
316
+ "node_modules/koffi/lib/native/base/base.hh": "4da7737d98bdc8a0e85127d2b7b20c709b60aaf62975bada7c2b01e514c3ff33",
317
+ "node_modules/koffi/lib/native/base/unicode.inc": "a337b5e53a6c72534fcf093c58d7fbf12f7b1075f068ea83a09c91e34373b5a4",
318
+ "node_modules/koffi/package.json": "40285e315bc5b9b1d62aaaf9d6d76fb26456d12a75f3f136b9d230cfd36dad73",
319
+ "node_modules/koffi/src/koffi/CMakeLists.txt": "99270ec05125659937f582c8bd4c2fc095fcc1a02b69bcbbebd7c6608a983749",
320
+ "node_modules/koffi/src/koffi/index.cjs": "cfd8708a7016740afb0e9f0a1c669485ccf8be98e3f2ef0fd6a4be76f4986f03",
321
+ "node_modules/koffi/src/koffi/index.js": "9c5a1590ca8ee32166477477b2639a55e91273674fa6d86da259d383918cd087",
322
+ "node_modules/koffi/src/koffi/indirect.cjs": "379433ba1c4e79a90e6e599cf8d6ebe9f9a85fc272a635356f2cca62a93cc96c",
323
+ "node_modules/koffi/src/koffi/indirect.js": "8d0f04482f762b6b460ec0f89f72dde9eff932a773ce71d43df0551c36fd2c80",
324
+ "node_modules/koffi/src/koffi/src/abi/arm64.cc": "7c017aa1dbf8cfe1d89062a2244966cafab9ec2c2c832877966af6f5bdc5fa0a",
325
+ "node_modules/koffi/src/koffi/src/abi/arm64_asm.S": "9ef4d4095faddda9e5807137cbfbf40908ec2b373e6f0e2e3ee70e7b919d37b4",
326
+ "node_modules/koffi/src/koffi/src/abi/arm64_asm.asm": "58053bbdc192f2191fceaba048798d9862f2fffbca992cd09ad1bbed8c61d4d2",
327
+ "node_modules/koffi/src/koffi/src/abi/loong64.cc": "dc53190f98c24d8f909358f23a20ce861d58124a232e87e8e2aeb3566ae02088",
328
+ "node_modules/koffi/src/koffi/src/abi/loong64_asm.S": "5df3967e737eadd1509812e76b6ce4dcbfd8672797158a3fc37ac5f3755d14de",
329
+ "node_modules/koffi/src/koffi/src/abi/riscv64.cc": "11a039d84a5f160fa7ebfeda4411904dcf36ce416aa0f0da79a0e5ef593408a7",
330
+ "node_modules/koffi/src/koffi/src/abi/riscv64_asm.S": "46f910cc423ca39305b19a38db13a1480061735258f189ee631237ea13fd2ba7",
331
+ "node_modules/koffi/src/koffi/src/abi/x64sysv.cc": "9b0d0128b739f9fc6761b8d00ddc075be385f8542bb24bfaddc67152b8642251",
332
+ "node_modules/koffi/src/koffi/src/abi/x64sysv_asm.S": "822fc8d707b9e7ffd4fb4899d9d7bad2b2ee732f9e3203b9fcd367e750e2a08f",
333
+ "node_modules/koffi/src/koffi/src/abi/x64win.cc": "f92cbee859064c255be527ee826457d8e29cc5b47a3269f213cf73ecd28b4ff6",
334
+ "node_modules/koffi/src/koffi/src/abi/x64win_asm.S": "dcfd393d8605f97064e69fa31f2d533e2f62f1e0d378a85be7251952c679f9fe",
335
+ "node_modules/koffi/src/koffi/src/abi/x64win_asm.asm": "227e656e5099b48550cee7f16efa9a2dfe2c58f3c46ae71e2f1ab9d80146ead0",
336
+ "node_modules/koffi/src/koffi/src/abi/x86.cc": "9cb692230e073c56857b16f05b2237854b35df5b66897d7066475324fb710d48",
337
+ "node_modules/koffi/src/koffi/src/abi/x86_asm.S": "d073e326858e5475575b66088a67f495b6fe26011e027b8ee86e4377872be25d",
338
+ "node_modules/koffi/src/koffi/src/abi/x86_asm.asm": "3e59a94cb4ee78165f0545a68ce6c397103a106516fb7fe0c2f1e46471315767",
339
+ "node_modules/koffi/src/koffi/src/call.cc": "e6eb347b2c2444f932daa4f00624421722edea94ac0cb9c1119c5daae12d373c",
340
+ "node_modules/koffi/src/koffi/src/call.hh": "b202e8daad46c6734f9b566394179e53aded86983a4f0fe31ac0d8797f7ac1dd",
341
+ "node_modules/koffi/src/koffi/src/errno.inc": "f2fea4a329fbf7aa7e5a6c52daacc480d70d782344e37fd7e62019f6b914201a",
342
+ "node_modules/koffi/src/koffi/src/ffi.cc": "7da0f340eaa0aad0a09e67fe054a65c8ee05bacdcf6d9d015bfed5289013fd99",
343
+ "node_modules/koffi/src/koffi/src/ffi.hh": "3ca1bb69f226dca6a992c434581ca7b4684635cb5c9d42a6345dbbc2e5d43879",
344
+ "node_modules/koffi/src/koffi/src/parser.cc": "fdb030e06ffd83d3e5e0a1c037ad669c2e7d2fde8a831da1f35cd53df623adb1",
345
+ "node_modules/koffi/src/koffi/src/parser.hh": "cfd9e374884cdc0f60716de41bbe110d361bc10d0a8539942e37d34c86b525ae",
346
+ "node_modules/koffi/src/koffi/src/primitives.inc": "34f524982a6e921a63c6766619b337b6d15f0a5cdefbf252481dda4b4369afda",
347
+ "node_modules/koffi/src/koffi/src/static.cjs": "25dff303c876cfdb531e2d9590ecbbb4928c8e60453c484faad66b2a3abd1556",
348
+ "node_modules/koffi/src/koffi/src/static.js": "3f2b291e2129181c2984e6508b51efa5be30775afbdbafe6c0f4ed076d80d9d1",
349
+ "node_modules/koffi/src/koffi/src/trampolines.cjs": "82895e2a78b911b297e7497d9d6033ab87a0afe64f4904615dacfa318d83adfa",
350
+ "node_modules/koffi/src/koffi/src/type.cc": "b6ff93584362e61a73314b81fe468eb35985d28587461ff4a7ba19fdd8ab6f34",
351
+ "node_modules/koffi/src/koffi/src/type.hh": "691479b990ddf7364c5f316d0a653d32f13181c1f5f68ad55d1db3ccb58f9b24",
352
+ "node_modules/koffi/src/koffi/src/util.cc": "ab92522bf324140f3fe9e3032c3cb6770412d743b06746675afe7fe49716ba50",
353
+ "node_modules/koffi/src/koffi/src/util.hh": "4aab905947a127652107e20016880d2d34ae46e3290705d8a485e01abd864360",
354
+ "node_modules/koffi/src/koffi/src/uv.cc": "1da9e82cef92232daa4090415c66fba6c3584ee901550cc83978e363dcdd5c7c",
355
+ "node_modules/koffi/src/koffi/src/uv.def": "4a40dc700dc66214fc1c464db8c4b78b82845e3b7b4e6103418ac519346ca4d2",
356
+ "node_modules/koffi/src/koffi/src/uv.hh": "6ad3aeceec4070cbf5fe1f9e54a75b58dc57c2686174c654b341ff9215d70aca",
357
+ "node_modules/koffi/src/koffi/src/win32.cc": "3bfa4a499afd5b1933882d09004f6168bb3ccf25ac0e42ce321d12dae67d8d6f",
358
+ "node_modules/koffi/src/koffi/src/win32.hh": "eeec401597da546109b9729113ccb635c61db325f2d394f883c2293955f119a5",
359
+ "node_modules/koffi/vendor/node-addon-api/LICENSE.md": "89024017b88a9f2b763f79b941a4f2db3b4428edfcacdc0b23866b2da633ad0c",
360
+ "node_modules/koffi/vendor/node-addon-api/README.md": "fa7f9a510c5dc46161e8216dae94e3857e466d7552059baed3b6fb36874a14ad",
361
+ "node_modules/koffi/vendor/node-addon-api/napi-inl.deprecated.h": "b66ed1e565e735bbfabcc2f72d466ab7c5414d3ef8851d1af440b81be7f2375c",
362
+ "node_modules/koffi/vendor/node-addon-api/napi-inl.h": "384d2f7934e898e324560443a0cb76f6c1cfa086f0f6fdfdc643396177025bd1",
363
+ "node_modules/koffi/vendor/node-addon-api/napi.h": "5b41d4d85e183e5c69b0e5dab5801dc1fb00fb72579f9b278bb7f70d412d8d38",
364
+ "node_modules/koffi/vendor/node-api-headers/LICENSE": "a553508f516031c91f3af1148d44970cb81bbae6c4f091be6835d39cc252238c",
365
+ "node_modules/koffi/vendor/node-api-headers/README.md": "63a4e81d19f02b164d51c4721ff3e88c81d410640de7e1d3520a2c406f0a7d83",
366
+ "node_modules/koffi/vendor/node-api-headers/def/js_native_api.def": "77653a554fbb27f6c5666f4ba05f87d26f0de72bc3d0439961ac030030c2be66",
367
+ "node_modules/koffi/vendor/node-api-headers/def/node_api.def": "e0d5e3da0520a42e26b563f6321291081bd15bdd20821d46818e5f47900f77d6",
368
+ "node_modules/koffi/vendor/node-api-headers/include/js_native_api.h": "0953395662ea63697cd7a77a9320d94aa2829f9c9569abf3a74272b7a2923ce8",
369
+ "node_modules/koffi/vendor/node-api-headers/include/js_native_api_types.h": "21eebde05d2ee59d315ac27d4aa82434ca88508a0b2cf5819802a00ca523831d",
370
+ "node_modules/koffi/vendor/node-api-headers/include/node_api.h": "2d4560831e525b47b060ec8a0864ab73993df9e20215ce9f0fe7b24cd31af32a",
371
+ "node_modules/koffi/vendor/node-api-headers/include/node_api_types.h": "a25356630d3058f0a0c8937d9f297e9471e037fda58c2696d8a505c2bd99cb00",
372
+ "node_modules/node-addon-native-custom-loader/LICENSE": "75bd0a6d6b9f9f0a6c792ca89832360b19749ebe16af0222e34387f262baa95e",
373
+ "node_modules/node-addon-native-custom-loader/README.md": "b825cee1efe6c18d38e434b9f72e5300ac29770d172eac1a5ce437358a96ba7f",
374
+ "node_modules/node-addon-native-custom-loader/lib/index.js": "6d83f4e5426895d40820acf507146226a893c5aefba00a08bf0884446160049e",
375
+ "node_modules/node-addon-native-custom-loader/package.json": "9ea26b5a9f3bc05fd4b0cdac638c152c30a3e5022696aa52020379f4eec6a398",
376
+ "node_modules/node-addon-require-builtin/LICENSE": "75bd0a6d6b9f9f0a6c792ca89832360b19749ebe16af0222e34387f262baa95e",
377
+ "node_modules/node-addon-require-builtin/README.md": "f4df420fb3ff53efab2b5ee3ab093d8a4344ff34063688eb306d611ad9a5e07a",
378
+ "node_modules/node-addon-require-builtin/lib/index.js": "73966bb0f824b021f77b03f02e00905a532554aad3c6c5a14c2a743aeb4a34a9",
379
+ "node_modules/node-addon-require-builtin/package.json": "a86eb361a884a2a0df00b81c4b21aec35ecfc5ccc43d0e9d289f6f44d7e9df2c",
380
+ "node_modules/undici/LICENSE": "a6db8096b2707bc0102d256917d4d33f298ba36d8c3f25de067a2b5bb379db27",
381
+ "node_modules/undici/README.md": "8d5fe4e7eecd5ea257ee637c131f228400649d3a8d2024555291237f46009872",
382
+ "node_modules/undici/docs/docs/api/Agent.md": "d7528c0c1d3382e00599b22c53d63602299721ea6b0215767e5af4e03a4498b0",
383
+ "node_modules/undici/docs/docs/api/BalancedPool.md": "639f6db33b169e444cde10f62a616e6b12cf68e94c4b3c5fedaa20aba095278a",
384
+ "node_modules/undici/docs/docs/api/CacheStorage.md": "785b0a4fc5bf3f45c6289082f7bd2ed48d0e12212387ff67842c73ad7eff0633",
385
+ "node_modules/undici/docs/docs/api/CacheStore.md": "df9e089c6ad493faf5bc9428fcd6302a8e5a644987b7b269ace5c299a98d1488",
386
+ "node_modules/undici/docs/docs/api/Client.md": "65804161e424ed7b1506ab70a84e23331db8223001250f3059536ae13f17f2ec",
387
+ "node_modules/undici/docs/docs/api/ClientStats.md": "643275cb1cf0414421fec969f797f8bcd2fb59d999e6657d265eab20f346ecfd",
388
+ "node_modules/undici/docs/docs/api/Connector.md": "dbabff331d240ca9d674a720b86c044c90eef723a55fc3428f06cdc4b5452bff",
389
+ "node_modules/undici/docs/docs/api/ContentType.md": "cbec09f61555173549ac806f6db263862c27e6530243fba7560b22e7747f9cde",
390
+ "node_modules/undici/docs/docs/api/Cookies.md": "79462fdcc010075e5cd65a733aeec6225abbad4dd80469af26512f86acacd01f",
391
+ "node_modules/undici/docs/docs/api/Debug.md": "4763197faf32b45265ca8f89b7686549410988aff2565d35057d379f62598255",
392
+ "node_modules/undici/docs/docs/api/DiagnosticsChannel.md": "1f0468622e31bf79cdf20bcb8b2aa0771fd984eaaff710080b3ccf3093983483",
393
+ "node_modules/undici/docs/docs/api/Dispatcher.md": "b341a990e4637689d2ab3affdafcdb4e66dcfccd2b82ec17ea39d934360fc30c",
394
+ "node_modules/undici/docs/docs/api/EnvHttpProxyAgent.md": "44a69d50d50489dd1dc91c27446eac34b3dedbaed239dd8c49ccea00f1a402a3",
395
+ "node_modules/undici/docs/docs/api/Errors.md": "0421b5c6ddbf89f14130966ed7f146320de7d4daf3e6df57d0fc45d601ed7fd3",
396
+ "node_modules/undici/docs/docs/api/EventSource.md": "e4e9a1dffdc615332b5d25ca06e9f47e0e37f8313e640195440e81fd96117eb4",
397
+ "node_modules/undici/docs/docs/api/Fetch.md": "3d0bddce408e3e30cd2b457d0728c2cb2929c9789aa81387eaae23f485f1a66d",
398
+ "node_modules/undici/docs/docs/api/GlobalInstallation.md": "e38431026afde90f00c0d1492352bad46146b1b77f1d0dddf63c911039cae0b5",
399
+ "node_modules/undici/docs/docs/api/H2CClient.md": "4c60bd41d43b7a298f5fac6d201a329d905bfaa639ed907ec800f1a47cb2713e",
400
+ "node_modules/undici/docs/docs/api/Interceptors.md": "424f203619268944f6b94d3f4024f7067374a9fd0d7d69f32a2959bd0daabcbc",
401
+ "node_modules/undici/docs/docs/api/MockAgent.md": "1a7000a273d8acddda3259ea0f926d77b709b7fc22075b764f89925c80e13963",
402
+ "node_modules/undici/docs/docs/api/MockCallHistory.md": "be3a960e9146fbeb2319e913704f3161f3fcbe93e69ec6df0f597326f4505eef",
403
+ "node_modules/undici/docs/docs/api/MockCallHistoryLog.md": "2a3ee870f741a0cfde4e18d14e6f9b4778ce72c3d79ab3dbbc2e55586a27e3ce",
404
+ "node_modules/undici/docs/docs/api/MockClient.md": "a6dbb502a5a8bcdb359bc28509c8f001829fe40fd8419a5bf83cc5f2cf2c8646",
405
+ "node_modules/undici/docs/docs/api/MockErrors.md": "7fb801dce6663e87fd87aa603af76ae3b4301bebcbfc607309742747908485d0",
406
+ "node_modules/undici/docs/docs/api/MockPool.md": "6f5052224d7eacf0e24bae965f70df2138ba296551471891c4120b1850e9f0fb",
407
+ "node_modules/undici/docs/docs/api/Pool.md": "1fe65246bf6716bead816a18cb04cb750ed5041d667324dc763d078b02d5b942",
408
+ "node_modules/undici/docs/docs/api/PoolStats.md": "a656458a5940be068c66501d4f1dcc57b04063ac54c6d040a37dd6f3140d9e87",
409
+ "node_modules/undici/docs/docs/api/ProxyAgent.md": "69db88244d7ac5bc01702b4196b1f908ec2215c41700671b4ae894a70817179b",
410
+ "node_modules/undici/docs/docs/api/RedirectHandler.md": "63ca7a1a77f4c053715f5cc9860ff8a22cb65584d2479366b37f9aadee269c26",
411
+ "node_modules/undici/docs/docs/api/RetryAgent.md": "783fad6b66a83b1cb31705772d389f97ed206a9c50d51cf03c57f707ca44ee13",
412
+ "node_modules/undici/docs/docs/api/RetryHandler.md": "4f5a873ff4d4d5c48fe15092032a8e2aa45c86709871403de2afb534ab3943b5",
413
+ "node_modules/undici/docs/docs/api/RoundRobinPool.md": "cc3c17338c746b7906b005160ed2abac7467c8b111956df4b3e213a560ae55ff",
414
+ "node_modules/undici/docs/docs/api/SnapshotAgent.md": "0f2e8d6dbacca62b21d17fa3cf7d77afd6405ebdb5c25775c3e354029db07bc8",
415
+ "node_modules/undici/docs/docs/api/Socks5ProxyAgent.md": "c9518591d0df4f741e0509383941f6bc3d8f53afda2e16eca64cb8eb3aac2b21",
416
+ "node_modules/undici/docs/docs/api/Util.md": "eec121fd18ea3fed31a29eb2fb63efe75d0fcd7cefb4b620b787a2fd06fd4d67",
417
+ "node_modules/undici/docs/docs/api/WebSocket.md": "932247f397b249201d7681c3965d28ce4bc80c15c3db8ede7423036b6256bbb7",
418
+ "node_modules/undici/docs/docs/api/api-lifecycle.md": "d76f8c11596a813b595aaec24b07a7fc78c25b8e4322ea2db8695ffdcdc1673c",
419
+ "node_modules/undici/docs/docs/best-practices/client-certificate.md": "3ded48c955cf868c99713f8a91a2cdf29192a85861ea372d4bfd7451b26d17e8",
420
+ "node_modules/undici/docs/docs/best-practices/crawling.md": "6f569b129afcf3bcddd45b6e1a2b4179b310c0b103a9ab98fa07dcbd7161b8b6",
421
+ "node_modules/undici/docs/docs/best-practices/migrating-from-v7-to-v8.md": "93b875fc847ee4dacdc7d7a36a8e1048ebb781e862098e7b9f31293155baa65e",
422
+ "node_modules/undici/docs/docs/best-practices/mocking-request.md": "e3d94539e9c27fe2bd7bae15e93a429ee6b1d7467f921145f51730f3f6205b98",
423
+ "node_modules/undici/docs/docs/best-practices/proxy.md": "256883541f6a7c784d4e87b8b5c5694ce47144612aed44c08627d0e1c17c2467",
424
+ "node_modules/undici/docs/docs/best-practices/undici-vs-builtin-fetch.md": "86a1b8931d91f560ba4f9a2b55c5a3b931a6b5db2f2a51f4be42b17bb466028d",
425
+ "node_modules/undici/docs/docs/best-practices/writing-tests.md": "1ff22158dfce7ebb5266eee14ddebec402287762c15e0a568ff7bbade4881c57",
426
+ "node_modules/undici/docs/docs/getting-started.md": "5b68a83303f9c5315a40f007d8bf9536673826efd1047bc9aad95c1b27fcbcad",
427
+ "node_modules/undici/docs/docs/index.md": "97f659475af39ff4666e3ca719fc173b595ee11302cb9385c38b1f331d3fd6b2",
428
+ "node_modules/undici/docs/docs/site.json": "23b8d0999e92ec9480878c9aae6850f99bde88a546bf8d6054a952dde1fe18b4",
429
+ "node_modules/undici/docs/docs/type-map.json": "6977d0239d1d7fad8186261ae277ebec62e2e9d7e46c56eb1a211772dd0adc7a",
430
+ "node_modules/undici/index-fetch.js": "155df504376841f714239ffbb43c7fbbfe3532c44aafe19ca7fd1615a18d5f1d",
431
+ "node_modules/undici/index.js": "93fc85c00a59b58f410c901e5477d56770de3816bfbe183e751624aeb4a5e6a5",
432
+ "node_modules/undici/lib/api/abort-signal.js": "46ac3527affb69036384c8baec5bf34ba567adb336921c7a62e8f471bb827f37",
433
+ "node_modules/undici/lib/api/api-connect.js": "4209dffaed12c9f000aa2bc554c70cc0cc5ea984869152422370a61bfbb1badc",
434
+ "node_modules/undici/lib/api/api-pipeline.js": "5ad0c146a9d88c5087802df087901aa08a98e28d1ad600c33ee5601f699fbbcd",
435
+ "node_modules/undici/lib/api/api-request.js": "f655a12aab11d2463cd947eff9b483fdaa22992a607b3c733479535c4ce6e662",
436
+ "node_modules/undici/lib/api/api-stream.js": "1fe980698a643db9f228137c46fe07751bdd021bc5a1feafae88c51cc107d356",
437
+ "node_modules/undici/lib/api/api-upgrade.js": "0c51297099a626e47163a7fbc56f01f1a895dc7914e8d91ea0885a9c7634a09a",
438
+ "node_modules/undici/lib/api/index.js": "a7b4b74ea6b81b2401f8659c138df54fd3f2c45450741682c026abb4cf133096",
439
+ "node_modules/undici/lib/api/readable.js": "35b6fc8cd20796a0b21944d68c09a86b209ffa7db9e3613626d28867c9166d45",
440
+ "node_modules/undici/lib/cache/memory-cache-store.js": "b87fafa563690bb4ab6a7a50a5a040d3c6ef8a99ea65ea1ed16a544b1a6caf72",
441
+ "node_modules/undici/lib/cache/sqlite-cache-store.js": "389b37a214dce9353079be0e0d7c7925ce981888f3646b1dc48bfe0c31d7e64d",
442
+ "node_modules/undici/lib/core/connect.js": "4bf7ce84d6d31ffacebb0130164d50e619645b79cf6c4221ac374ab5ada677e3",
443
+ "node_modules/undici/lib/core/constants.js": "a9c9c59d69a6db90fd3fdf46ebce943cbdc5da6e2acd143a00ed3282a8c65ca0",
444
+ "node_modules/undici/lib/core/diagnostics.js": "907ce2d66cede91b860a1c1318ebdf0d9577c0f747a3b35510162c63489f28bc",
445
+ "node_modules/undici/lib/core/errors.js": "47c1e438402a802f5132da4a2084e1294ad3fd1496f8f7b47117292165c17fd9",
446
+ "node_modules/undici/lib/core/request.js": "ef5b4b9d34dde2ac2df21249228cd4d75f19f6c301307a84fda36fbd4bdee724",
447
+ "node_modules/undici/lib/core/socks5-client.js": "5ee3d782919a74b4c0fc0aac0da1d39abd759f7c017f7b3d4b932ccafddd1be7",
448
+ "node_modules/undici/lib/core/socks5-utils.js": "830467b148e86786f41c356667625721dfd9bef27fd85ada0fb498bda9a19016",
449
+ "node_modules/undici/lib/core/symbols.js": "2fbebeafbc65374261b6cc10146a3cdc0083342a125b7e957afe2ecb4a4c41d0",
450
+ "node_modules/undici/lib/core/tree.js": "c9fc9938718f33d77a6ed1abac5e564531ac9f9436cde2867243d50cd6c0b4e8",
451
+ "node_modules/undici/lib/core/util.js": "cb110920638fb3e418a8e4ffc55b5e18a220e6bc08e2a0f6d8174029292cd8a2",
452
+ "node_modules/undici/lib/dispatcher/agent.js": "b54f75ea0978a432484110017bb2eb4768c61d4bc68b3726d6f7f2399eb14649",
453
+ "node_modules/undici/lib/dispatcher/balanced-pool.js": "0cb69083f49eb392baf0ce5e88dec9b610cfca47d03e12d5ca66ecf90d4cc5b0",
454
+ "node_modules/undici/lib/dispatcher/client-h1.js": "e8eb930546e7f7755471c75069878e3584b50f2c9ec8468fc8f2a1d236dab9a4",
455
+ "node_modules/undici/lib/dispatcher/client-h2.js": "2f848e5316242e9babf3f9fa81657e0b2b3f58b081b6c41585b19f536c3a9435",
456
+ "node_modules/undici/lib/dispatcher/client.js": "05061b7d9f484d7db7894f9b5b1f9585f40af6a7eb26694a2b762084ffe2b461",
457
+ "node_modules/undici/lib/dispatcher/dispatcher-base.js": "2796a3361c387a89abaf621b6666c1ea2b9ac808abff664fc5eb70539d19c989",
458
+ "node_modules/undici/lib/dispatcher/dispatcher.js": "032235d0e70df874f87ea4df892b7404b0dbffd65a08b0720b99eed71c79635c",
459
+ "node_modules/undici/lib/dispatcher/dispatcher1-wrapper.js": "9c4d64198b782a38f98fd8054eabc150694c791038a52e454da4cc1780d7d8e0",
460
+ "node_modules/undici/lib/dispatcher/env-http-proxy-agent.js": "8d8eb0e7a71c9cd15498034188cd953887f85123d4c41041b077dd0b3941a6bb",
461
+ "node_modules/undici/lib/dispatcher/fixed-queue.js": "5d72c9de20e74d2437afc97f9f9e8e202d79983a77d2a598ac9ab1e0a8d0052d",
462
+ "node_modules/undici/lib/dispatcher/h2c-client.js": "898ffa9f31dc54f563192ef8f0d9dbdd28e8834034b5d034cafee3775af2b894",
463
+ "node_modules/undici/lib/dispatcher/pool-base.js": "23792e58781239dee97bae8a849d14b1181836a6415c41fb9235ee23bd61dc44",
464
+ "node_modules/undici/lib/dispatcher/pool.js": "a92d0f6144cc553357b1a18f47ffb6f6c850e43622dddda71dcad71cf0430393",
465
+ "node_modules/undici/lib/dispatcher/proxy-agent.js": "63920d0209b6f69a874cabfa383084c2db537e88f1932b7c593132cacf0cd9bf",
466
+ "node_modules/undici/lib/dispatcher/retry-agent.js": "1c3100b5bf5c808631710f7168650e4895fcacca8a8a8bf55803480f172a3bc2",
467
+ "node_modules/undici/lib/dispatcher/round-robin-pool.js": "77c5c15e9c68a274f6c00847a1bbe54b71476e0aa8618aac5ed629194e54685c",
468
+ "node_modules/undici/lib/dispatcher/socks5-proxy-agent.js": "fa8a243c5b9eb4b5de4e73ddbefe63426afc8a02743830a4f1e2142767817578",
469
+ "node_modules/undici/lib/encoding/index.js": "7ea8fe81ff3c9d054f3ef8bb67bfe260b2e930c51d5d5563ca2ef19a218a5909",
470
+ "node_modules/undici/lib/global.js": "ad78c73866021cae34d47f7896561c56294e5c1f15915d6ef1780f763a816b9d",
471
+ "node_modules/undici/lib/handler/cache-handler.js": "7de20ca8ef41db87c4d5d452def61e0546082b3285c178c61dafb11f2a3ceaaf",
472
+ "node_modules/undici/lib/handler/cache-revalidation-handler.js": "4610b09696d9a8b0927d7b98980cb64d7b2140095c115daeed51a57a92a5fea3",
473
+ "node_modules/undici/lib/handler/decorator-handler.js": "0958e75d0310651e5db468bd67e6351d97183403181be669625ca67c55862f54",
474
+ "node_modules/undici/lib/handler/deduplication-handler.js": "9f8f7081af3f5e01ff03254dab41c531ecafc9e222284dad57fbf971a9f05ae6",
475
+ "node_modules/undici/lib/handler/redirect-handler.js": "383d7755878d4009b1df8962c32e08c805f9c04a8c7d0f639ba9ca1673fb62a5",
476
+ "node_modules/undici/lib/handler/retry-handler.js": "23ac4cde79d4063ff74fd159d2c9d4f454dc1f14bd7b3dfbd3489f547c9a7e7e",
477
+ "node_modules/undici/lib/interceptor/cache.js": "1c4bf1b8e9c5dae9b3bfc6949a880ab3fb03f51ea49997fb6645a35140872170",
478
+ "node_modules/undici/lib/interceptor/decompress.js": "b5a5a621f7c9f7a73ba87aa3e8c86cff83267d06587f0ea8fa472d39a1b99e59",
479
+ "node_modules/undici/lib/interceptor/deduplicate.js": "852211f635105d819b63e1e5b1f6abdc9d5356a1c1b2ec6444c54a8f888163ce",
480
+ "node_modules/undici/lib/interceptor/dns.js": "c5397eac5d7813c863e7a6af87a24bd9eda0d7244f84c3e044ac0322913aa557",
481
+ "node_modules/undici/lib/interceptor/dump.js": "30d035bae71552ef4cd19b264728482abb9a7b5f82af47ffb9ad81e2541ea4bc",
482
+ "node_modules/undici/lib/interceptor/redirect.js": "b0d5f6f590ac86bf7d5b20a93af0303aab1680c1b7796ff9c487550dc542a3b4",
483
+ "node_modules/undici/lib/interceptor/response-error.js": "9cb06334d1c1f791784005789cc5afb9daea396c7f5e0c962af90538b4843e10",
484
+ "node_modules/undici/lib/interceptor/retry.js": "488cf270ae143cc13a6ecf82ba523314fdbb17fd9ee08677c4488d4410f047c3",
485
+ "node_modules/undici/lib/llhttp/constants.js": "90c4858736745781548d464e51224ce9353162cd87bc8142be803bc2937184ba",
486
+ "node_modules/undici/lib/llhttp/llhttp-wasm.js": "5d8313d6fe8145d832e6af9959b2810523c9a6993d5b93cee09bd7e5f1f2c085",
487
+ "node_modules/undici/lib/llhttp/llhttp_simd-wasm.js": "a3f30f3307ab3c191720cb636d570febb3610c420bc7077f2e225dacfcad3295",
488
+ "node_modules/undici/lib/llhttp/utils.js": "e21afcaf44b0fec37acfff86945e4526541e990ac0efd2f1efa2ea9f2b259b6b",
489
+ "node_modules/undici/lib/mock/mock-agent.js": "0554f474e0d717d578412f512eb4ae5d270540104b6942c1a86e0dfba4ae5ce4",
490
+ "node_modules/undici/lib/mock/mock-call-history.js": "6ad1c52ab1e5fd692a161d7f91bac080d24a0e05f34cd0460cb5a6668105fa6e",
491
+ "node_modules/undici/lib/mock/mock-client.js": "108d91ef5f916d094a78d92a4d81f2cd4bfe20708ae6307d8197de81d826ce5c",
492
+ "node_modules/undici/lib/mock/mock-errors.js": "b5bd959401de99d8129ba272dddfdb62708247f684a8186aa4d858e2780d64ee",
493
+ "node_modules/undici/lib/mock/mock-interceptor.js": "59f75321c62504d83f84e2702b8dfcd7dfda3d994b62d9d62273653ab790bad2",
494
+ "node_modules/undici/lib/mock/mock-pool.js": "763d77ce68f6315f384b5e897b87ea2e2034b69d29e2d6d2da37ae8a0679197c",
495
+ "node_modules/undici/lib/mock/mock-symbols.js": "b90b7dc21d5a18c2e5255b0916bf75e880eef32ca45ab312a581547041638e20",
496
+ "node_modules/undici/lib/mock/mock-utils.js": "36c267a79b3d035cb2f50b6da508c850f131deb2ef1a99bfb26d1801faf5db58",
497
+ "node_modules/undici/lib/mock/pending-interceptors-formatter.js": "9d3737f40ba601fd7a9c6dd28a328e6797686ff08da712dcd0a0f011d5639f8d",
498
+ "node_modules/undici/lib/mock/snapshot-agent.js": "85acfaa63be0ebd8bf8c12b927ee1adffa585c5753a53cb6fa21f06413eb5cb0",
499
+ "node_modules/undici/lib/mock/snapshot-recorder.js": "ec7ea35855aad0fd471fc7c7f03075bb7586613dd6b9ecd9de181882ccd33c54",
500
+ "node_modules/undici/lib/mock/snapshot-utils.js": "0971c847787d90abcb0bf4e1d76161a2f82651169cc8e637b26875fecab666f8",
501
+ "node_modules/undici/lib/util/cache.js": "0818df2477bcab9b9c05ce4d89eb08e821af54904bb753695ce266ef17db36ee",
502
+ "node_modules/undici/lib/util/date.js": "153ad641cbdb4cc5acacc8b50b79684166e29b838192bf98b2d32e2871ff7522",
503
+ "node_modules/undici/lib/util/runtime-features.js": "d2161d6b59141370f3bb92bd9d950ef8caad083f6bfea4566c44a157996957de",
504
+ "node_modules/undici/lib/util/stats.js": "d62ae00eaf72f33cc990a3a835d70b9c7d2f10d47acffa0e631ea82145b7c34e",
505
+ "node_modules/undici/lib/util/timers.js": "4e5ef13ce9e1ca6de8a656b95e2425602bacbd6010af1da3ce573f8d8f573119",
506
+ "node_modules/undici/lib/web/cache/cache.js": "495792112d34bac4c6288592e4c30f8f4e4f22fed27939fcceb0c9c1f5d2b252",
507
+ "node_modules/undici/lib/web/cache/cachestorage.js": "be102dc4454e52aa65403e9c94220b61e0edc1008ee7eea14f1267e1e13a14af",
508
+ "node_modules/undici/lib/web/cache/util.js": "638d5c2424a730e6d2400ac518765b3fc9b50e2b3816b65fb7b46f93c66a5930",
509
+ "node_modules/undici/lib/web/cookies/constants.js": "85a24ae49eb5954e15363049bbc68967f01aae7260246daa3f49ad375429acb4",
510
+ "node_modules/undici/lib/web/cookies/index.js": "17957b8b7a7302cd084140595486f58ef5c6fb346a61d8872c432dcbbe3f8901",
511
+ "node_modules/undici/lib/web/cookies/parse.js": "bf045e5cd5dcc90dd7a6c80ec351ddce1555acc223b0e8cc49e90f006f3ea21b",
512
+ "node_modules/undici/lib/web/cookies/util.js": "7ff71ceb2e25c6f06055c120eb09be938b2bef7af8a65703baf25bac6b74477c",
513
+ "node_modules/undici/lib/web/eventsource/eventsource-stream.js": "098a79aa4af46a8ddfd8583be35510b6824b8fc513023c5b2295b5f3be474fe2",
514
+ "node_modules/undici/lib/web/eventsource/eventsource.js": "64c11485baf8e397e379b9f0b336eabdfd57d124a692b75bf0bd903561f98442",
515
+ "node_modules/undici/lib/web/eventsource/util.js": "b1c5b993196a38edd99da36075db58a280486a77a3ce8dfd289358b3de85905c",
516
+ "node_modules/undici/lib/web/fetch/LICENSE": "a21d6c8d3fc631198b97e57584697f7f9c37805c71c6cf9a12e4442b40394b88",
517
+ "node_modules/undici/lib/web/fetch/body.js": "19c019e31d5b472fcbc2feb6944a4c585965f28ba1e82b981a23c3403a917f22",
518
+ "node_modules/undici/lib/web/fetch/constants.js": "2e0f11d1ba87ce83219dff50325be48704931af5cd03a749fe710590bfd5bfb5",
519
+ "node_modules/undici/lib/web/fetch/data-url.js": "9f820a24256840c477d8f0630f9fae813f826e7644355933bb8ab66a59058a34",
520
+ "node_modules/undici/lib/web/fetch/formdata-parser.js": "d5d048201a040865a4376e423fd78b102ad164cb51ad7b0ade56897c7318bd6b",
521
+ "node_modules/undici/lib/web/fetch/formdata.js": "f1bc0c3e92ac8639f632d2b79e5502165cdfb273725dba197ea692aedd8a44fa",
522
+ "node_modules/undici/lib/web/fetch/global.js": "6b38813b82ec8d5002009640515d35f83ab96d4f8e0066d71fae89324079a289",
523
+ "node_modules/undici/lib/web/fetch/headers.js": "1fc876d1484319421fc2c840d616c5a0fffbf12cb66e66ee44b8383356dbebbb",
524
+ "node_modules/undici/lib/web/fetch/index.js": "8269824463f434e3e15c5aad090e03f19aefe9d27b40efad9d8ef7ed308d1d27",
525
+ "node_modules/undici/lib/web/fetch/request.js": "63fb5c976978e2b0f23b1064888c4775f9889a28e2422e0b2e1daa123c4420ac",
526
+ "node_modules/undici/lib/web/fetch/response.js": "851520e91226ecfc8421037b6c5a894c3b7a91013e9988d74a32f08cb3ae94ad",
527
+ "node_modules/undici/lib/web/fetch/util.js": "54b66da9dcf0e52fe761700bc5008b4bd2cb7ffe4490f6634c59ce7208505b44",
528
+ "node_modules/undici/lib/web/infra/index.js": "ea89dc494e2c8cce88882ec7e9514d8df2883dca71e54f42f9ca45ad8db12d52",
529
+ "node_modules/undici/lib/web/subresource-integrity/Readme.md": "0d3da607c6e6d7420679c47e869bdc926266cc94d39fb243d9cd3f9a217986f8",
530
+ "node_modules/undici/lib/web/subresource-integrity/subresource-integrity.js": "65997037f348e22746f0852037998ba64fb83e6428485c6e200d42da8a154a75",
531
+ "node_modules/undici/lib/web/webidl/index.js": "a6aa001f3a56d521cbee0a925e3a9d057079b76f5d9ea527a977605edcb2f811",
532
+ "node_modules/undici/lib/web/websocket/connection.js": "4000792883e7b2f301b2418e32599d47cd1e74df2677909dc1f8d32d583f4055",
533
+ "node_modules/undici/lib/web/websocket/constants.js": "e7b6d0550a367ba9edfb68b14bd3fbe44fd3042faf76901567b8c3ffc2ccfa84",
534
+ "node_modules/undici/lib/web/websocket/events.js": "53f342e0641488a92835546c0d006d128cb5931fa358e72c9f80c5532c225fb2",
535
+ "node_modules/undici/lib/web/websocket/frame.js": "883d40c52b86f43619074911d81830d80f29cb605a4e01a128b196e2ab666d63",
536
+ "node_modules/undici/lib/web/websocket/permessage-deflate.js": "da8d8dc29515bce2ba4def5c3f811f8644eeb5d4819bc521d5811fbbdda4afb7",
537
+ "node_modules/undici/lib/web/websocket/receiver.js": "94c44a1f59b99fd935f7fbbd95b02fc134f6b6afb9b8748259db2d4025f3177b",
538
+ "node_modules/undici/lib/web/websocket/sender.js": "5c5e162f1252d9c91d5cd30ae59c722f1e1cd7df86f03bf45fe085915c2d72e9",
539
+ "node_modules/undici/lib/web/websocket/stream/websocketerror.js": "3743ab3450453a754cdfaa49436314778d38a906a75508f701ca711daf05b43a",
540
+ "node_modules/undici/lib/web/websocket/stream/websocketstream.js": "1e0f2b94400959221c16b6e6ea07a82dca3fbcde2be706b7287fb7d86f2e9d97",
541
+ "node_modules/undici/lib/web/websocket/util.js": "bb4a7bd7f2bf57e45245e41e05cc8d0bdb55feabfd16bbaff7a381863ba5907f",
542
+ "node_modules/undici/lib/web/websocket/websocket.js": "06f52bdada0d2f85f3fc8446639a9d472e88fa928e34d66c20450c951f9e03fe",
543
+ "node_modules/undici/package.json": "da4165f30eff2268f693a567ffe9ab683e60109338deaeb1df91683fa353efa5",
544
+ "node_modules/undici/scripts/strip-comments.js": "72257817367403f268d17f35d61030ec57698063c14e15b7133ac28850d9c7b5",
545
+ "node_modules/undici/types/README.md": "c8cced6ec588c55b07e35733258cb7d6b63e3426ee7490aa9267aab4bda0fb20",
546
+ "node_modules/yaml/LICENSE": "5bba27375d93e9119f76c1015f7672cf9ad5f70952296e0842fb2243d6376869",
547
+ "node_modules/yaml/README.md": "c8aa393826fb1c55ae195399864e7f454a2c66c4d9491459545b26cac4b958e6",
548
+ "node_modules/yaml/bin.mjs": "faebbf70669988b5be13130907adf7b788145960448eab08e92e66189e72f448",
549
+ "node_modules/yaml/browser/dist/compose/compose-collection.js": "7fa2b7a37902d99bf924c3e4db7b003202837597a7815d9917736dbd1861b7f6",
550
+ "node_modules/yaml/browser/dist/compose/compose-doc.js": "0ec9140185c6d965783c4d3e9ae427fb4a377935dd20d8872eb35b56ec461579",
551
+ "node_modules/yaml/browser/dist/compose/compose-node.js": "c6ddd844d89a2086cc1c4cc643cae6361e7fae0728dc0f71066ded02bb7b5d12",
552
+ "node_modules/yaml/browser/dist/compose/compose-scalar.js": "3b7d0f5876dd7c33b8f2bf896178008283be8e4a82495070dc638a922e202e07",
553
+ "node_modules/yaml/browser/dist/compose/composer.js": "214e221c39346468e4b7713d775bfa9dca87695463ac795399e66b91a06540cc",
554
+ "node_modules/yaml/browser/dist/compose/resolve-block-map.js": "ffa61d87f9f0e58a5e05c54073f67c34c4575234f357bcaba6fb164e36996b97",
555
+ "node_modules/yaml/browser/dist/compose/resolve-block-scalar.js": "2a89c2b128e143a98f61751b9ab7dd08d140105c185ece6a687015ea8e0be036",
556
+ "node_modules/yaml/browser/dist/compose/resolve-block-seq.js": "7905b607f90dc9078463fd40e3fbb22537e45e0ef2514fc6c662526b4cdc2ec6",
557
+ "node_modules/yaml/browser/dist/compose/resolve-end.js": "e0a32e1b8c5649ea14152b0c0d45fbd64d46dbfa299a7328b71421e49ee48db2",
558
+ "node_modules/yaml/browser/dist/compose/resolve-flow-collection.js": "957722ee22cb72b48e9d78ed6dabdca97fcbff188cad1f362864a959b184925f",
559
+ "node_modules/yaml/browser/dist/compose/resolve-flow-scalar.js": "5516b92d61fedb6dbfb4523a7aa6c44c12b627e18da5178eafa28324aef4ff7d",
560
+ "node_modules/yaml/browser/dist/compose/resolve-props.js": "4b6c34fe620ddaf31e06c44a1acbbbe8e49a617ae805bb8dca70a278812c16cb",
561
+ "node_modules/yaml/browser/dist/compose/util-contains-newline.js": "4810ffba0d74ebb913731e1369ea17f6fef20df2feb2ef0bd8553e439f4a6b78",
562
+ "node_modules/yaml/browser/dist/compose/util-empty-scalar-position.js": "571d615e24fd379998df23e29df09f127349f4757fc4cbad176aecbfe77b7d82",
563
+ "node_modules/yaml/browser/dist/compose/util-flow-indent-check.js": "ebab50fc461c9eaffe07c807dde4aff4f8c5976f5aa4e8f02608ed57ef52a690",
564
+ "node_modules/yaml/browser/dist/compose/util-map-includes.js": "584a79bdaf93b530fee951c888daf844a6a329f672ffb57450b39f72b0bdfb95",
565
+ "node_modules/yaml/browser/dist/doc/Document.js": "6b9c9187a04d13331c07d7193baf29b0547fd20de042e1fd57289f13d61ad196",
566
+ "node_modules/yaml/browser/dist/doc/anchors.js": "0d5c8fd9bf01e2f4eb0cf08771705e0c0efbd05d9835714fc94850d943003cc6",
567
+ "node_modules/yaml/browser/dist/doc/applyReviver.js": "b653aa07fcd8619637c1dbf6151d9de5e22efcb3becfd4dff86cdcf4bb2f1a97",
568
+ "node_modules/yaml/browser/dist/doc/createNode.js": "80a8212199fa1591e0836c0b19e05f9734dd5e6a7dcd54d6da1e4f2a20f2450c",
569
+ "node_modules/yaml/browser/dist/doc/directives.js": "688805b988a34cf7c2f6e5b6c3f1e6a798b22b4eaa450286df095d6b741fedf0",
570
+ "node_modules/yaml/browser/dist/errors.js": "410bb3397beb0d3a8c649d048b6e087bddf1f7114832eaf94be0fcbb4a8af29b",
571
+ "node_modules/yaml/browser/dist/index.js": "c7d10350202ee8cb14febfce6b559c93760405cc4738a89c10abcb3c44fd6990",
572
+ "node_modules/yaml/browser/dist/log.js": "2e7d7edee783c901f36a8f986d126f15f33ac504fe17d4655e6846869d07b9e4",
573
+ "node_modules/yaml/browser/dist/nodes/Alias.js": "0aaa9956d9f965e29f391c268baca1e7f9c50649b900128a9e5e669450d76411",
574
+ "node_modules/yaml/browser/dist/nodes/Collection.js": "f18de1edc4f5a3ae163a6ca894e2b4debd3a8c480338f580ac6cdffebbfc4bc9",
575
+ "node_modules/yaml/browser/dist/nodes/Node.js": "aaf0e1042d4b11f4760f7de032ec99ac49dda1742e55911f5a4df182cbd5471f",
576
+ "node_modules/yaml/browser/dist/nodes/Pair.js": "a9f0acf0f06eab7852a99418a07628fd0e26476895c90af3ae66bab8704e9b11",
577
+ "node_modules/yaml/browser/dist/nodes/Scalar.js": "80a4961d380ec00c5eb9a47f29dfb378437d055910e163a9ebd9accf032b6e03",
578
+ "node_modules/yaml/browser/dist/nodes/YAMLMap.js": "42b884f36dfb23248e9f2200bce5e7a6007f90e0adfd228de8079346e9627737",
579
+ "node_modules/yaml/browser/dist/nodes/YAMLSeq.js": "75d12e1a5edbf1e3d04d6310ffdaf553a3a1ff7d12643cfa428330ca7189604d",
580
+ "node_modules/yaml/browser/dist/nodes/addPairToJSMap.js": "67cc22455591363a78723876f73640c5712161bb840423e705820666cb0d3ada",
581
+ "node_modules/yaml/browser/dist/nodes/identity.js": "da71af70da393500ab6e3cdbceba9c66965bc89c3401388c9ad422c91abf467f",
582
+ "node_modules/yaml/browser/dist/nodes/toJS.js": "80f2431eaef0c531ab93b1a8883206394ae3fac75732cc683cdabfdcc00dd724",
583
+ "node_modules/yaml/browser/dist/parse/cst-scalar.js": "e30a85b8b613badfb50039938fbb5bbbafbd5f9f95f3a630300ad3dec5fb3dc8",
584
+ "node_modules/yaml/browser/dist/parse/cst-stringify.js": "275b500e3f1a0067d5d8671af5c536963a46d4921e49cf156547f796067b8810",
585
+ "node_modules/yaml/browser/dist/parse/cst-visit.js": "0baadd57686b26163ba71e7323a9208fcba81978e9ecebbad80afaa8baa61788",
586
+ "node_modules/yaml/browser/dist/parse/cst.js": "8bf6c87dc02b9375750d550a9099cb1cd1cd71ca9da68f1a0798844a0f76bf8f",
587
+ "node_modules/yaml/browser/dist/parse/lexer.js": "14d3a6e0f1bf7945a92dfa0366f61bcd122aa3c62addb6fbfdaadd796c634036",
588
+ "node_modules/yaml/browser/dist/parse/line-counter.js": "2428d1b9a18ad7d8dabc7e12276e0fd90446c9e3433f1501e6bb43e111ad63c0",
589
+ "node_modules/yaml/browser/dist/parse/parser.js": "761580b1ad5b36b6fd5e2ffb411798cb5603f8fc46ff11ad8e68ca2ba32a405f",
590
+ "node_modules/yaml/browser/dist/public-api.js": "1635da91bae6389b88d38bc99c57fa6ed71c017b026cb80be9cead10bbafa499",
591
+ "node_modules/yaml/browser/dist/schema/Schema.js": "515d6576e94a5cc96c999cd9da230f7ef79d8fbea1f4c6c6939631ef122fb50e",
592
+ "node_modules/yaml/browser/dist/schema/common/map.js": "6094c4919ff0051a663866cf75df489be51987d808f0862b9b9e36d4090182a7",
593
+ "node_modules/yaml/browser/dist/schema/common/null.js": "6666e819b0dd4c9eac1498e8520e23943abf2c9d92cee72b9c5607557800eb14",
594
+ "node_modules/yaml/browser/dist/schema/common/seq.js": "446dc09d297b2b9823d981f3c44e595f8d87c2ce97e2435e1ecc01bc6c31f4b9",
595
+ "node_modules/yaml/browser/dist/schema/common/string.js": "830740273a4f0a39b94549377cb12183ab8ce558dfb12818f7b295fe261fc08e",
596
+ "node_modules/yaml/browser/dist/schema/core/bool.js": "9d4b1fe540d36d8e09cf5799b8abed53e4ee620425d3d6712e8a50c927752615",
597
+ "node_modules/yaml/browser/dist/schema/core/float.js": "b24b968b6b714be9650480e07f10d039f145e88e4299ce2268eed57de02673a8",
598
+ "node_modules/yaml/browser/dist/schema/core/int.js": "dc7ae60f465273fd7e5dfd6b7f686ac47887fa02db3fe9ec603290003cc9baff",
599
+ "node_modules/yaml/browser/dist/schema/core/schema.js": "92e75125989595b02d9b9f8d6788076d4c1ec173bfa4b0f04eabaaff86153dd9",
600
+ "node_modules/yaml/browser/dist/schema/json/schema.js": "a33036dc6f8916682f9494431ad7ffb1116af7616aa83439b1a956b628e44068",
601
+ "node_modules/yaml/browser/dist/schema/tags.js": "c8085f537d22c3f7f17ea2906ddc11fc69b0106d5447aac2953eec19c025f136",
602
+ "node_modules/yaml/browser/dist/schema/yaml-1.1/binary.js": "ad5b0407d199dda7bc4fbacaee90d2a2a99540c8ced44c13bdf6974cb6dc3ef1",
603
+ "node_modules/yaml/browser/dist/schema/yaml-1.1/bool.js": "1d605f63430047574323f352893ba3c52fc73fbd1b52e47fa6dec2eb375301a5",
604
+ "node_modules/yaml/browser/dist/schema/yaml-1.1/float.js": "40e68189590e6924d063f2b88c7b2415dcb2f796fbd6e9af18e9b119eed3ce23",
605
+ "node_modules/yaml/browser/dist/schema/yaml-1.1/int.js": "6c83bf34c4ecfa722eff2c252c8bdf95661777738c9971c4ccda3a5413218d80",
606
+ "node_modules/yaml/browser/dist/schema/yaml-1.1/merge.js": "f3ac8d7fb4701053e97d5399bdacde15cdc662420cd7e85de349eb20330dab5e",
607
+ "node_modules/yaml/browser/dist/schema/yaml-1.1/omap.js": "fb3d04682a48ec1e0ad26c1afc8a85d1e6c814942ca6eba8bfb94a6571d3e9a6",
608
+ "node_modules/yaml/browser/dist/schema/yaml-1.1/pairs.js": "3c37806050903fd81b51e597bfe7acfff972e788e9a1b3c0148f17b32da3f568",
609
+ "node_modules/yaml/browser/dist/schema/yaml-1.1/schema.js": "1e684cad435d9e9601aa56dd4d55243369a010e75edba21ff31d7be84c8600eb",
610
+ "node_modules/yaml/browser/dist/schema/yaml-1.1/set.js": "0cdce6c41328c116fc17f5660a79f8995af8d0227e424e89177a30894138b687",
611
+ "node_modules/yaml/browser/dist/schema/yaml-1.1/timestamp.js": "18fb9beee49f0f3452601ba01b46ae1d6e49bf4a63b499e9eff28366e3dfcb5d",
612
+ "node_modules/yaml/browser/dist/stringify/foldFlowLines.js": "1a6360496e3cb52767d4c346655307c978cb2c94853229152f97017c4209745a",
613
+ "node_modules/yaml/browser/dist/stringify/stringify.js": "af3ccd112cba318ff9b4686ed9afd0b33fc238da51954fd431dc4c7a9db0b455",
614
+ "node_modules/yaml/browser/dist/stringify/stringifyCollection.js": "0d2babd8428322fe6a9f5cd10fde361a1d8dedae662fd4245c6d151e4a5ae013",
615
+ "node_modules/yaml/browser/dist/stringify/stringifyComment.js": "20d3dc6bebda3efc2394ca162455ce9e4691b6c60995b5b4418b30659e09e03e",
616
+ "node_modules/yaml/browser/dist/stringify/stringifyDocument.js": "3ca3818dc9e81ee7e45f0e26792065f47fccee99b6150e76a94fcbb3d0306421",
617
+ "node_modules/yaml/browser/dist/stringify/stringifyNumber.js": "e0d02220e66fedc267b435e5d13d2383e24c8460562d815f670a169dadc2859f",
618
+ "node_modules/yaml/browser/dist/stringify/stringifyPair.js": "4074dc125fdad4ef2ec8bab4fbf7ece4b399ecd2fbd1813c4a316e88243f1179",
619
+ "node_modules/yaml/browser/dist/stringify/stringifyString.js": "0fd2e43243792cfa0a1d8cea13ba8e05ddaf6fb1296a4fde497b956454bfa44c",
620
+ "node_modules/yaml/browser/dist/util.js": "e6b73d7297c4253e5299d4f97dc2c05e6e30d69ace66962412f6ab9690d4d412",
621
+ "node_modules/yaml/browser/dist/visit.js": "d9daffd11ec68755a7238684ae3f9c64f59dc86338d0e7cbe521a8fc1d45bd19",
622
+ "node_modules/yaml/browser/index.js": "5ae196b7abe55bed1d4d11f7eeba63aeda0c49fb73eb3c7359e3d6b9a080696b",
623
+ "node_modules/yaml/browser/package.json": "3ca9d4afd21425087cf31893b8f9f63c81b0b8408db5e343ca76e5f8aa26ab9a",
624
+ "node_modules/yaml/dist/cli.mjs": "0ad1d42d88c0648fb6fbd158b21dcc2b4daa2e34e4d4df7aa949d6978d343d4d",
625
+ "node_modules/yaml/dist/compose/compose-collection.js": "a7db11a1a7987d6412df8adbbb85ccd4370171f82265703b2b6af2d13c45d646",
626
+ "node_modules/yaml/dist/compose/compose-doc.js": "0f388537747b5c1a241639413f17fc2b5f831451b5017d6902e46db6842a5fe4",
627
+ "node_modules/yaml/dist/compose/compose-node.js": "86562c85e4e5737d28b24aae2030b97bc9b672e1f2de5da9e4d25c4571e4345c",
628
+ "node_modules/yaml/dist/compose/compose-scalar.js": "37920472755bdaa76399b6d33872f0015ae1fd9ba7faa031c03d501aa8c3e903",
629
+ "node_modules/yaml/dist/compose/composer.js": "509c0bdb4cef641cc784c130b6cc2b350752f6841798daa1a13cbcaf4fc74c46",
630
+ "node_modules/yaml/dist/compose/resolve-block-map.js": "dcfada448c8fc532ebba96d6788a4b41bb015fc5e697a9544ff429b9c4e4c70a",
631
+ "node_modules/yaml/dist/compose/resolve-block-scalar.js": "af562e2e3cd7ee7b3cb9342984177f6b5c77de73121e87695db3ff635e12d152",
632
+ "node_modules/yaml/dist/compose/resolve-block-seq.js": "18f54a39d73b600ebbd74a343e6671d0d08423f125bd86963b72dc24d6261911",
633
+ "node_modules/yaml/dist/compose/resolve-end.js": "532bf56299183e75bb7c20db75321367c28393b66ecb8ffd540faedd9817f116",
634
+ "node_modules/yaml/dist/compose/resolve-flow-collection.js": "242470b54c0deba1507babba2e879f3005ed2ee3bd53a36affb6ecf82fddd375",
635
+ "node_modules/yaml/dist/compose/resolve-flow-scalar.js": "13bcd9d37afd4ffec4b1b3bc9ae1ecc2cff97e7f7c91b5f58b71c99ddd526b05",
636
+ "node_modules/yaml/dist/compose/resolve-props.js": "0b49c6af0145c309883dbf24d1a00260c0c090412be10aaa301de126dad15983",
637
+ "node_modules/yaml/dist/compose/util-contains-newline.js": "60182618fc9fa669e74ab74f4231c15b5d24bc52ab0a419684bb827a00d69be6",
638
+ "node_modules/yaml/dist/compose/util-empty-scalar-position.js": "460516395ef7e961d5248e047ee6d52084f279b76e8af9f3c2bac92da1c7d656",
639
+ "node_modules/yaml/dist/compose/util-flow-indent-check.js": "c7c0c9837a1f828de19eb3ee0947dff39c4f69222c762aed9fa2fe14fc46ee3e",
640
+ "node_modules/yaml/dist/compose/util-map-includes.js": "0330dc34072cb499493176b293228631ca8ebaaaddcdc0e63b02bf24f6a25c2d",
641
+ "node_modules/yaml/dist/doc/Document.js": "9bc1c9a56de3902d554e77193125b6aadcfaec743073b3417b22c95a8f7d7923",
642
+ "node_modules/yaml/dist/doc/anchors.js": "ea9a479b1e98d88235ffa6736d0405e2119e9dde7b5249b72185488ab2527261",
643
+ "node_modules/yaml/dist/doc/applyReviver.js": "7271668f41f264e4b9aeb184629cfd11c510b401c5a797fa7194d17a9652976e",
644
+ "node_modules/yaml/dist/doc/createNode.js": "a39d14026d4cc6ff8d76d90db30c41facc26a146ebed30783bcf28e40b5caa65",
645
+ "node_modules/yaml/dist/doc/directives.js": "8f02c3c03571e377e33680b68027d4336234d7a6da3d8c6a8b7f1183c1c428ff",
646
+ "node_modules/yaml/dist/errors.js": "c389d9c448193ce1bcb9641f5eda62cbe56467b2104357d2fc8dd86df88cb07b",
647
+ "node_modules/yaml/dist/index.js": "2d58984e0ae80de4acbd8f009fab332f5ce77d9e1a5f138a3058a0ada6567fb9",
648
+ "node_modules/yaml/dist/log.js": "f6ccc3593357801851aa1023b202f842733043ac3b25773048d836f89de8108d",
649
+ "node_modules/yaml/dist/nodes/Alias.js": "139f5fbb3e7727a9cea89e16b2518f9ffe2e3a37cfb46717e60d23da7d6e739e",
650
+ "node_modules/yaml/dist/nodes/Collection.js": "e2d3ffdc9a997774602e72b296fba641558bc7355c9f12a3ee0502fb1e541306",
651
+ "node_modules/yaml/dist/nodes/Node.js": "b57b42071f7ebab633626858656ec5187617f2290c272e87edc57467ef591215",
652
+ "node_modules/yaml/dist/nodes/Pair.js": "d5dad67916ba0e864a892da63265a062c45c15a191349ef50a540f2ddbae93e5",
653
+ "node_modules/yaml/dist/nodes/Scalar.js": "616ac0f6a0a5a6565307a4bb4443691b0dd019c03d6bb8777353750bd3459487",
654
+ "node_modules/yaml/dist/nodes/YAMLMap.js": "d140cfc5aa8d28737bd3c993d977d5a10ab81efe221e36708ac45b3cf18f5dce",
655
+ "node_modules/yaml/dist/nodes/YAMLSeq.js": "9f89417f3cba5f22a4436f67a9ff9dce627344b5874d2ed7957ff9acffb030e4",
656
+ "node_modules/yaml/dist/nodes/addPairToJSMap.js": "e4977864d75c1fdbf7fc78c9f4329406e153deccfff090fd812dae2b27e6c2c2",
657
+ "node_modules/yaml/dist/nodes/identity.js": "1a7cb042ae725ff68d05dc503efbbecbe65281f18b23dfc23f12d1749a440cfe",
658
+ "node_modules/yaml/dist/nodes/toJS.js": "34de93bb4e16abbf317210a7bd1b062ed20acb028cd8395b69b591f433e277b6",
659
+ "node_modules/yaml/dist/parse/cst-scalar.js": "2f72b634348b04b395408ac427fb4f8ee67432244c327561d4b755a28a783b34",
660
+ "node_modules/yaml/dist/parse/cst-stringify.js": "4d14a7a286cff9c1a578ab15839388ea76f77ae79293db25b235394bcc377b51",
661
+ "node_modules/yaml/dist/parse/cst-visit.js": "525535fc05841407420be6505804c74d873eb3aaa9319679896f7a24a474ca01",
662
+ "node_modules/yaml/dist/parse/cst.js": "acc25760d010068844f36f4aefc7fe6f5f6048fd7f8fcc29d4290e154819d1a4",
663
+ "node_modules/yaml/dist/parse/lexer.js": "cb30a2c4628e270ee810530217f3f7bb0f2730ab89f8fbaf1f8a73ccd1883cf5",
664
+ "node_modules/yaml/dist/parse/line-counter.js": "ddfd11ca2cdd42d36bc6c3090a31c21e6bbcc90bf3498bf6aacfbb30c5d79436",
665
+ "node_modules/yaml/dist/parse/parser.js": "0adc5ffa51ffa4c0ceed1f80efa8b188d10f58c7b9389a6d46bc861e6bff34e1",
666
+ "node_modules/yaml/dist/public-api.js": "9b318ac7b3a3751127c74f59dd1dd209230a70ca116000348b82faae189f72f0",
667
+ "node_modules/yaml/dist/schema/Schema.js": "d3b1bc956a766e2489c36114366f3b3f89762a257ae05ff6271ee3fc8c2a9bf5",
668
+ "node_modules/yaml/dist/schema/common/map.js": "769207eaa56e34c113da10cdc22da845f92b4080ff2b921a72847a38d3ac03d8",
669
+ "node_modules/yaml/dist/schema/common/null.js": "f5d5f694ea3a42ef136e0fbcc674dfd7aa0a3da2b8d62183fb750166a12e52bb",
670
+ "node_modules/yaml/dist/schema/common/seq.js": "51fc0e8bfc63d1d9c7c66b0370a069bb33e0dad865080ff76802803597b9909a",
671
+ "node_modules/yaml/dist/schema/common/string.js": "51d0b3aafab2ffa4ad9d86656a3b92c4b4824d0a8806423882ea5f92a1bf8d11",
672
+ "node_modules/yaml/dist/schema/core/bool.js": "9fa696b1efc38cf8c73a398f30d9f9841658aa5afd0b7a6b0822947c3991ba7a",
673
+ "node_modules/yaml/dist/schema/core/float.js": "139e3964f0e626ad3741500faf51d855ff98eafa2d9e7523cac06260e4515382",
674
+ "node_modules/yaml/dist/schema/core/int.js": "f0e474254f6877d5dd23bb57017980931ab333a7eaa3d33872247a80d11f754d",
675
+ "node_modules/yaml/dist/schema/core/schema.js": "481d7c64817b40090d519fb65bd83730dadd4c6baec1440b9bf85d29e52c046e",
676
+ "node_modules/yaml/dist/schema/json/schema.js": "9efdd848455f6e0621feb13f3eb762453cb02b09d5e04b6501163cfb26af27ed",
677
+ "node_modules/yaml/dist/schema/tags.js": "dba2f42d4dbe8cc8b13f662fd97d253da2da5567e71c47115305efede5a888f2",
678
+ "node_modules/yaml/dist/schema/yaml-1.1/binary.js": "15d7b0b8516c8190b191ec9a0adaab16808d09751ef534d7829512944072011f",
679
+ "node_modules/yaml/dist/schema/yaml-1.1/bool.js": "80a0046224dac3437f22e3b27b0180e1aad82277ab2fee4769094c6d12d67b6f",
680
+ "node_modules/yaml/dist/schema/yaml-1.1/float.js": "a90c44db83152e4d902d46f667737dac90aa86b401abdefe89371ac3bd03abfe",
681
+ "node_modules/yaml/dist/schema/yaml-1.1/int.js": "5ff72b08fecc3a924d4a76658a304859db5edb4fadf8893ee837aa06bba60a52",
682
+ "node_modules/yaml/dist/schema/yaml-1.1/merge.js": "9c85b5e026e4369a96f3f7b5bc6c05da102dfa2968950b17986201cfe0be542c",
683
+ "node_modules/yaml/dist/schema/yaml-1.1/omap.js": "3174270cd59c0f0e3ffd73b3b44c4de679efd5c681325b7aac8e0935d547bee8",
684
+ "node_modules/yaml/dist/schema/yaml-1.1/pairs.js": "46ba76da72ad65a6202358c486c6a3084ab7c48a8eb5be60d241d9e198c5a9b5",
685
+ "node_modules/yaml/dist/schema/yaml-1.1/schema.js": "a7320808484dc6d04817b33b2d09b65ead7ffc1c672ab54e068a80972b17702e",
686
+ "node_modules/yaml/dist/schema/yaml-1.1/set.js": "e4553b0cbde79090884908f44bb3b4afd04935fc23656a1b87ec1af87f24427a",
687
+ "node_modules/yaml/dist/schema/yaml-1.1/timestamp.js": "b157c946dc1b8854aadc4e7994b268ec8afe6d916721cb3580e0752c7d15a5f7",
688
+ "node_modules/yaml/dist/stringify/foldFlowLines.js": "7819679e80222b80c564ea4a9cf3145fa4d5e28a6cfbac248283ac55b0249761",
689
+ "node_modules/yaml/dist/stringify/stringify.js": "38efb5bc5553e98fee58c825a88131c59184368d8689e3e6f43c652a06e9c167",
690
+ "node_modules/yaml/dist/stringify/stringifyCollection.js": "b55fd3b6e3f1346bbcd1fcdc48a59c089b7a4b0e6fac2b46846f7828f9488600",
691
+ "node_modules/yaml/dist/stringify/stringifyComment.js": "490bff57104b7cfdb1893f14528610bb4d0a63c29b314e122233cf308cf96662",
692
+ "node_modules/yaml/dist/stringify/stringifyDocument.js": "dd5ba1813a16b62955c466bce8d1c16254e90b36d688f863c508dc8fe38f2afe",
693
+ "node_modules/yaml/dist/stringify/stringifyNumber.js": "26a1980d34a21a80704d356d475a0187a24ebcbeb37a2e3b149d4d791bb65598",
694
+ "node_modules/yaml/dist/stringify/stringifyPair.js": "bc03ae533d85bf9122e87c0a256c841ae7fbf063499bc3034d49fd9f7b200659",
695
+ "node_modules/yaml/dist/stringify/stringifyString.js": "4113b71a9c4c087a197f71452794a6acb9929111f569c973ff4efe7caee8f777",
696
+ "node_modules/yaml/dist/test-events.js": "5ff5e7f170702d75d4bfd5ef24a35fc95dc2871680c0ae4d714137d4c2cde571",
697
+ "node_modules/yaml/dist/util.js": "193b1d92fb7641d78f17a8f560cbe44dd7cdede2eb8935bacd4ca30df2f1a17a",
698
+ "node_modules/yaml/dist/visit.js": "a757e3b924af184b25e2386d1678b1fe341805a516ebf9bccee219b47aebd5e7",
699
+ "node_modules/yaml/package.json": "31244b3da44f3ddf3313e74b4e9f493621859997cc5dba2f96d92b7887b4b3f4",
700
+ "node_modules/yaml/util.js": "2f1db26f6cc426ef698210b592f40cec49be1b6c4b34e7f2d61904786242bd85"
701
+ }
702
+ };
703
+ //#endregion
704
+ //#region src/windows-terminal.ts
705
+ /** 可选的 Windows 官方 runner 宿主适配;不改变沙箱策略或 runner 实现。 */
706
+ const digest = (data) => createHash("sha256").update(data).digest("hex");
707
+ const failure = (reason) => /* @__PURE__ */ new Error(`CRATE_WINDOWS_TERMINAL: ${reason}`);
708
+ /** 拒绝重解析链接;不允许缓存写入通过已有路径逃出 Home。 */
709
+ async function directory(path) {
710
+ const parent = dirname(path);
711
+ if (parent !== path) await directory(parent);
712
+ let info;
713
+ try {
714
+ info = await lstat(path);
715
+ } catch (error) {
716
+ if (error.code !== "ENOENT") throw error;
717
+ await mkdir(path);
718
+ info = await lstat(path);
719
+ }
720
+ if (!info.isDirectory() || info.isSymbolicLink()) throw failure(`目录不是普通目录: ${path}`);
721
+ }
722
+ /** 完整校验和完成标记之前不安装钩子;已有缓存每次逐字节复核。 */
723
+ async function prepareWindowsRunner(home, runtime) {
724
+ if (!isAbsolute(home)) throw failure("DSH_HOME 必须是显式绝对路径");
725
+ const pkg = JSON.parse(await readFile(join(runtime, "node_modules/@deepseek-ai/dsh/package.json"), "utf8"));
726
+ if (pkg.version !== windowsRunnerIdentity.version) throw failure(`不支持 DSH ${String(pkg.version)}`);
727
+ if (digest(await readFile(join(runtime, "node_modules/@deepseek-ai/dsh-sandbox-local/lib/index.js"))) !== windowsRunnerIdentity.providerSha256) throw failure("官方 sandbox provider 字节不匹配");
728
+ const node = resolve(runtime, "..", "..", "runtime/primary-runtime/dependencies/node/bin/node.exe");
729
+ const nodeInfo = await lstat(node);
730
+ if (!nodeInfo.isFile() || nodeInfo.isSymbolicLink() || digest(await readFile(node)) !== windowsRunnerIdentity.nodeSha256) throw failure("应用随附控制台 Node 字节不匹配");
731
+ const cache = join(home, ".dsh-pack", "runtime-sources", "windows-terminal-rc3-" + digest(JSON.stringify(windowsRunnerIdentity)).slice(0, 20));
732
+ await directory(dirname(cache));
733
+ let exists = false;
734
+ try {
735
+ const info = await lstat(cache);
736
+ if (!info.isDirectory() || info.isSymbolicLink()) throw failure("runner 缓存不是普通目录");
737
+ exists = true;
738
+ } catch (error) {
739
+ if (error.code !== "ENOENT") throw error;
740
+ }
741
+ const target = cache;
742
+ const receipt = digest(JSON.stringify(windowsRunnerIdentity));
743
+ if (!exists) await mkdir(target);
744
+ if (exists) {
745
+ const marker = join(target, "complete.sha256");
746
+ const markerInfo = await lstat(marker);
747
+ if (!markerInfo.isFile() || markerInfo.isSymbolicLink() || await readFile(marker, "utf8") !== receipt) throw failure("runner 缓存未完整准备,保留现场且不自动修复");
748
+ const inspect = async (prefix = "") => {
749
+ for (const entry of await readdir(join(target, prefix), { withFileTypes: true })) {
750
+ const name = prefix ? `${prefix}/${entry.name}` : entry.name;
751
+ if (entry.isSymbolicLink()) throw failure(`runner 缓存含链接: ${name}`);
752
+ if (entry.isDirectory()) await inspect(name);
753
+ else if (!entry.isFile() || name !== "complete.sha256" && !Object.hasOwn(windowsRunnerIdentity.files, name)) throw failure(`runner 缓存含额外文件: ${name}`);
754
+ }
755
+ };
756
+ await inspect();
757
+ }
758
+ for (const [name, expected] of Object.entries(windowsRunnerIdentity.files)) {
759
+ const source = await readFile(join(runtime, name));
760
+ if (digest(source) !== expected) throw failure(`官方 runner 依赖字节不匹配: ${name}`);
761
+ const destination = join(target, name);
762
+ if (!exists) {
763
+ await directory(dirname(destination));
764
+ await writeFile(destination, source, { flag: "wx" });
765
+ }
766
+ const info = await lstat(destination);
767
+ if (!info.isFile() || info.isSymbolicLink() || digest(await readFile(destination)) !== expected) throw failure(`runner 缓存字节不匹配: ${name}`);
768
+ }
769
+ if (!exists) await writeFile(join(target, "complete.sha256"), receipt, { flag: "wx" });
770
+ return [node, join(cache, "node_modules/@deepseek-ai/dsh-sandbox-windows-acl/lib/runner.js")];
771
+ }
772
+ /** 只拥有自己写入的数组;其他插件后来修改时不得把它覆盖回去。 */
773
+ function installWindowsRunnerHook(sandbox, args) {
774
+ if (sandbox?.constructor?.name !== "LocalSandboxProvider" || !sandbox.internals || typeof sandbox.windowsAclRunnerInvocation !== "function" || sandbox.runnerCommand?.length || sandbox.internals.windowsAclRunnerArgs !== void 0 || sandbox.internals.windowsAclRunnerEntry !== void 0) throw failure("sandbox 服务不受支持或已有 runner 覆盖");
775
+ const internals = sandbox.internals;
776
+ const hadOwn = Object.hasOwn(internals, "windowsAclRunnerArgs");
777
+ const original = internals.windowsAclRunnerArgs;
778
+ const owned = [...args];
779
+ internals.windowsAclRunnerArgs = owned;
780
+ let disposed = false;
781
+ return () => {
782
+ if (disposed) return;
783
+ disposed = true;
784
+ if (internals.windowsAclRunnerArgs !== owned) return;
785
+ if (hadOwn) internals.windowsAclRunnerArgs = original;
786
+ else delete internals.windowsAclRunnerArgs;
787
+ };
788
+ }
789
+ function windowsTerminalRuntime(config) {
790
+ if (config.windowsTerminalCompatibility === void 0 || config.windowsTerminalCompatibility === false) return void 0;
791
+ if (config.windowsTerminalCompatibility !== true) throw failure("windowsTerminalCompatibility 必须为布尔值");
792
+ if (process.platform !== windowsRunnerIdentity.platform || process.arch !== windowsRunnerIdentity.arch) throw failure("仅支持 Windows x64");
793
+ const runtime = desktopRuntimeRoot();
794
+ if (!runtime || !process.env.DSH_HOME || !isAbsolute(process.env.DSH_HOME)) throw failure("仅支持显式隔离 Home 的官方桌面宿主");
795
+ return runtime;
796
+ }
797
+ //#endregion
8
798
  //#region src/history.ts
9
799
  const historyLocks = /* @__PURE__ */ new Map();
10
800
  async function withHistoryLock(path, operation) {
@@ -54,11 +844,108 @@ async function record(path, item) {
54
844
  });
55
845
  }
56
846
  //#endregion
847
+ //#region src/verify.ts
848
+ /** Default Web Verify arguments; execution and status decisions remain in Core. */
849
+ const KNOWN_SMOKES = {
850
+ "@deepseek-ai/dsh-base": ["newSessionPersistsAcrossRestart"],
851
+ "@deepseek-ai/dsh-web-app": ["workspaceRendered"],
852
+ "@deepseek-ai/dsh-experimental-terminal-bundle": ["coreCapability"],
853
+ "@deepseek-ai/dsh-experimental-session-search": ["coreCapability"],
854
+ "@deepseek-ai/dsh-experimental-inspector-profile": ["cordisDomQuery"],
855
+ "dsh-crate-web": ["preflightDownloadedPack"]
856
+ };
857
+ function object(value) {
858
+ return value !== null && typeof value === "object" && !Array.isArray(value);
859
+ }
860
+ async function configuredRunner(path) {
861
+ if (!isAbsolute(path)) throw new Error("DSH_PACK_VERIFY_RUNNER_CONFIG must be an absolute JSON file path");
862
+ const info = await lstat(path);
863
+ if (!info.isFile() || info.isSymbolicLink()) throw new Error("Verify runner config must be a regular JSON file");
864
+ if (info.size > 1024 * 1024) throw new Error("Verify runner config exceeds the 1 MiB size limit");
865
+ let value;
866
+ try {
867
+ value = JSON.parse(await readFile(path, "utf8"));
868
+ } catch {
869
+ throw new Error("Verify runner config must contain valid JSON");
870
+ }
871
+ if (!object(value)) throw new Error("Verify runner config must be a JSON object");
872
+ return value;
873
+ }
874
+ async function installedNames(profilePath) {
875
+ let manifest;
876
+ try {
877
+ manifest = JSON.parse(await readFile(join(profilePath, "package.json"), "utf8"));
878
+ } catch {
879
+ return /* @__PURE__ */ new Set();
880
+ }
881
+ if (!object(manifest)) return /* @__PURE__ */ new Set();
882
+ const names = new Set(object(manifest.dependencies) ? Object.keys(manifest.dependencies) : []);
883
+ const dsh = object(manifest.dsh) ? manifest.dsh : {};
884
+ const profile = object(dsh.profile) ? dsh.profile : {};
885
+ if (Array.isArray(profile.bundles)) {
886
+ for (const name of profile.bundles) if (typeof name === "string") names.add(name);
887
+ }
888
+ return names;
889
+ }
890
+ async function prepareVerifyArgs(base, options) {
891
+ let runner;
892
+ let source = "unconfigured";
893
+ if (options.requestConfig !== void 0) {
894
+ if (!object(options.requestConfig)) throw new Error("runnerConfig must be a JSON object");
895
+ runner = options.requestConfig;
896
+ source = "request";
897
+ } else if (options.configuredPath) {
898
+ runner = await configuredRunner(options.configuredPath);
899
+ source = "host-environment";
900
+ } else if (options.defaultConfig) {
901
+ runner = options.defaultConfig;
902
+ source = "bundled-desktop";
903
+ }
904
+ if (runner?.mode !== void 0 && runner.mode !== options.mode) throw new Error("Verify runner mode must match the requested Verify mode");
905
+ const names = await installedNames(options.profilePath);
906
+ const configured = object(runner?.pluginTests) ? runner.pluginTests : {};
907
+ const contracts = [];
908
+ for (const plugin of names) {
909
+ const probes = object(configured[plugin]) ? Object.keys(configured[plugin]).filter((name) => name.trim()) : [];
910
+ const tests = probes.length ? probes : KNOWN_SMOKES[plugin];
911
+ if (tests?.length) contracts.push({
912
+ plugin,
913
+ required: false,
914
+ tests: [...tests]
915
+ });
916
+ }
917
+ const args = [...base];
918
+ if (runner || contracts.length) await mkdir(options.workDirectory, { recursive: true });
919
+ const operation = randomUUID();
920
+ if (runner) {
921
+ const path = join(options.workDirectory, `verify-${operation}.json`);
922
+ await writeFile(path, JSON.stringify(runner, null, 2) + "\n", {
923
+ encoding: "utf8",
924
+ flag: "wx",
925
+ mode: 384
926
+ });
927
+ args.push("--runner-config", path);
928
+ }
929
+ if (contracts.length) {
930
+ const path = join(options.workDirectory, `verify-${operation}-contracts.json`);
931
+ await writeFile(path, JSON.stringify(contracts, null, 2) + "\n", {
932
+ encoding: "utf8",
933
+ flag: "wx",
934
+ mode: 384
935
+ });
936
+ args.push("--plugin-contract", path);
937
+ }
938
+ return {
939
+ args,
940
+ source
941
+ };
942
+ }
943
+ //#endregion
57
944
  //#region src/index.ts
58
945
  /** Host half: a small local HTTP bridge to the installed dsh-crate Core CLI. */
59
946
  const API_PATH = "/dsh-crate/api";
60
947
  const DOWNLOAD_PATH = "/dsh-crate/download";
61
- const MAX_BODY_BYTES = 67108864;
948
+ const MAX_BODY_BYTES = 64 * 1024 * 1024;
62
949
  const SAFE_NAME = /^[A-Za-z0-9._-]+$/;
63
950
  const SAFE_PLUGIN_NAME = /^@?[A-Za-z0-9._-]+(?:\/[A-Za-z0-9._-]+)?$/;
64
951
  const SAFE_OPERATION_ID = /^[0-9a-f-]{36}$/i;
@@ -145,8 +1032,7 @@ async function ensureWorkspace(home) {
145
1032
  };
146
1033
  }
147
1034
  async function bundledCorePath() {
148
- const packageRoot = dirname(dirname(fileURLToPath(import.meta.url)));
149
- const core = join(packageRoot, "core");
1035
+ const core = join(dirname(dirname(fileURLToPath(import.meta.url))), "core");
150
1036
  try {
151
1037
  await access(join(core, "dsh_pack", "__main__.py"));
152
1038
  return core;
@@ -155,8 +1041,7 @@ async function bundledCorePath() {
155
1041
  }
156
1042
  }
157
1043
  async function bundledRuntimeCommand() {
158
- const packageRoot = dirname(dirname(fileURLToPath(import.meta.url)));
159
- const command = join(packageRoot, "runtime", "python", "python.exe");
1044
+ const command = join(dirname(dirname(fileURLToPath(import.meta.url))), "runtime", "python", "python.exe");
160
1045
  try {
161
1046
  await access(command);
162
1047
  return {
@@ -188,6 +1073,28 @@ function isCommandNotFound(error) {
188
1073
  return isObject(error) && error.code === "ENOENT";
189
1074
  }
190
1075
  async function spawnCore(home, command, args) {
1076
+ const runtimeModules = await materializeDesktopModules(home, args.flatMap((arg, index) => (arg === "--embed" || arg === "--reference-only") && typeof args[index + 1] === "string" ? [args[index + 1]] : []));
1077
+ const hostBundlesFile = await writeDesktopHostBundles(home);
1078
+ const desktopRoot = desktopRuntimeRoot();
1079
+ let pnpmCommand;
1080
+ let patchAdapterCommand;
1081
+ if (desktopRoot) {
1082
+ const entry = resolve(desktopRoot, "..", "..", "runtime", "primary-runtime", "dependencies", "pnpm", "bin", "pnpm.cjs");
1083
+ await access(entry);
1084
+ pnpmCommand = JSON.stringify([
1085
+ process.execPath,
1086
+ "--expose-internals",
1087
+ entry
1088
+ ]);
1089
+ const helper = join(dirname(dirname(fileURLToPath(import.meta.url))), "desktop-patch-helper.mjs");
1090
+ await access(helper);
1091
+ patchAdapterCommand = JSON.stringify([
1092
+ process.execPath,
1093
+ "--expose-internals",
1094
+ helper,
1095
+ desktopRoot
1096
+ ]);
1097
+ }
191
1098
  return await new Promise((resolveRun, reject) => {
192
1099
  const child = spawn(command.command, [...command.prefix, ...args], {
193
1100
  cwd: home,
@@ -196,7 +1103,11 @@ async function spawnCore(home, command, args) {
196
1103
  ...command.env,
197
1104
  DSH_HOME: home,
198
1105
  DSH_PACK_CORE_MODE: "1",
199
- PYTHONDONTWRITEBYTECODE: "1"
1106
+ PYTHONDONTWRITEBYTECODE: "1",
1107
+ ...runtimeModules ? { DSH_PACK_RUNTIME_MODULES: runtimeModules } : {},
1108
+ ...pnpmCommand ? { DSH_PACK_PNPM_COMMAND: pnpmCommand } : {},
1109
+ ...hostBundlesFile ? { DSH_PACK_HOST_BUNDLES_FILE: hostBundlesFile } : {},
1110
+ ...patchAdapterCommand ? { DSH_PACK_PATCH_ADAPTER_COMMAND: patchAdapterCommand } : {}
200
1111
  },
201
1112
  shell: false,
202
1113
  windowsHide: true
@@ -279,7 +1190,8 @@ function runtimeCoreArgs() {
279
1190
  "--os-name",
280
1191
  platform() === "win32" ? "windows" : platform()
281
1192
  ];
282
- if (process.env.DSH_VERSION) args.push("--dsh-version", process.env.DSH_VERSION);
1193
+ const version = desktopRuntimeVersion() ?? process.env.DSH_VERSION;
1194
+ if (version) args.push("--dsh-version", version);
283
1195
  return args;
284
1196
  }
285
1197
  function argumentValue(args, flag) {
@@ -298,11 +1210,12 @@ function currentRuntime(home) {
298
1210
  const portValue = argumentValue(args, "--port") ?? process.env.DSH_PACK_PORT;
299
1211
  const port = portValue !== void 0 && /^\d+$/.test(portValue) ? Number(portValue) : void 0;
300
1212
  return {
301
- currentProfile: argumentValue(args, "--profile") ?? process.env.DSH_PACK_ACTIVE_PROFILE ?? null,
1213
+ currentProfile: argumentValue(args, "--profile") ?? process.env.DSH_PACK_ACTIVE_PROFILE ?? process.env.DSH_PROFILE ?? (desktopRuntimeRoot() ? "desktop" : null),
302
1214
  pid: process.pid,
303
1215
  dshHome: home,
304
1216
  port: port ?? null,
305
- restartConfigured: typeof process.argv[1] === "string" && port !== void 0
1217
+ restartConfigured: !desktopRuntimeRoot() && typeof process.argv[1] === "string" && port !== void 0,
1218
+ launcher: desktopRuntimeRoot() ? "official-desktop" : "cli"
306
1219
  };
307
1220
  }
308
1221
  function operationDiagnostic(code, stage, item, message, impact, suggestedNextStep) {
@@ -342,7 +1255,8 @@ async function readInstalledBundle(packagePath, location) {
342
1255
  const bundle = dsh !== null && typeof dsh === "object" && !Array.isArray(dsh) ? dsh.bundle : void 0;
343
1256
  if (bundle === null || typeof bundle !== "object" || Array.isArray(bundle)) return void 0;
344
1257
  const patch = bundle.patch;
345
- if (typeof packageJson.name !== "string" || typeof packageJson.version !== "string" || typeof patch !== "string" || patch.trim() === "") return void 0;
1258
+ const validPatch = typeof patch === "string" ? patch.trim() !== "" : Array.isArray(patch) && patch.length > 0 && patch.every((value) => typeof value === "string" && value.trim() !== "");
1259
+ if (typeof packageJson.name !== "string" || typeof packageJson.version !== "string" || !validPatch) return void 0;
346
1260
  return {
347
1261
  name: packageJson.name,
348
1262
  version: packageJson.version,
@@ -353,94 +1267,6 @@ async function readInstalledBundle(packagePath, location) {
353
1267
  return;
354
1268
  }
355
1269
  }
356
- let profileInvariantPromise;
357
- async function ensureCrateBundleInAllProfilesOnce(home) {
358
- const profilesRoot = join(home, "profiles");
359
- let entries;
360
- try {
361
- entries = await readdir(profilesRoot, { withFileTypes: true });
362
- } catch (error) {
363
- if (error.code === "ENOENT") return;
364
- throw error;
365
- }
366
- const packageRoot = dirname(dirname(fileURLToPath(import.meta.url)));
367
- const sourceManifest = JSON.parse(await readFile(join(packageRoot, "package.json"), "utf8"));
368
- const sourceVersion = typeof sourceManifest.version === "string" ? sourceManifest.version : void 0;
369
- if (sourceVersion === void 0) throw new Error("DSH Crate package version is missing");
370
- const anchorPackage = join(profilesRoot, "node_modules", ...CRATE_PACKAGE_NAME.split("/"));
371
- let anchorManifest;
372
- try {
373
- const value = JSON.parse(await readFile(join(anchorPackage, "package.json"), "utf8"));
374
- if (isObject(value)) anchorManifest = value;
375
- } catch (error) {
376
- if (error.code !== "ENOENT") throw error;
377
- }
378
- if (anchorManifest === void 0 && resolve(packageRoot) !== resolve(anchorPackage)) {
379
- try {
380
- await stat(anchorPackage);
381
- throw new Error(`DSH Crate installation anchor exists but has no valid package.json: ${anchorPackage}`);
382
- } catch (error) {
383
- if (error.code !== "ENOENT") throw error;
384
- }
385
- await mkdir(dirname(anchorPackage), { recursive: true });
386
- await cp(packageRoot, anchorPackage, { recursive: true });
387
- const value = JSON.parse(await readFile(join(anchorPackage, "package.json"), "utf8"));
388
- if (isObject(value)) anchorManifest = value;
389
- }
390
- const crateVersion = typeof anchorManifest?.version === "string" ? anchorManifest.version : sourceVersion;
391
- for (const entry of entries) {
392
- if (!entry.isDirectory() || !SAFE_NAME.test(entry.name)) continue;
393
- const manifestPath = join(profilesRoot, entry.name, "package.json");
394
- let manifest;
395
- try {
396
- const value = JSON.parse(await readFile(manifestPath, "utf8"));
397
- if (!isObject(value)) continue;
398
- manifest = value;
399
- } catch {
400
- continue;
401
- }
402
- const dependenciesValue = manifest.dependencies;
403
- if (dependenciesValue !== void 0 && !isObject(dependenciesValue)) continue;
404
- const dependencies = isObject(dependenciesValue) ? dependenciesValue : {};
405
- const dshValue = manifest.dsh;
406
- if (dshValue !== void 0 && !isObject(dshValue)) continue;
407
- const dsh = isObject(dshValue) ? dshValue : {};
408
- const profileValue = dsh.profile;
409
- if (profileValue !== void 0 && !isObject(profileValue)) continue;
410
- const profile = isObject(profileValue) ? profileValue : {};
411
- const bundlesValue = profile.bundles;
412
- if (bundlesValue !== void 0 && (!Array.isArray(bundlesValue) || bundlesValue.some((item) => typeof item !== "string"))) continue;
413
- const bundles = Array.isArray(bundlesValue) ? [...bundlesValue] : [];
414
- let changed = false;
415
- if (typeof dependencies[CRATE_PACKAGE_NAME] !== "string") {
416
- dependencies[CRATE_PACKAGE_NAME] = crateVersion;
417
- changed = true;
418
- }
419
- if (!bundles.includes(CRATE_PACKAGE_NAME)) {
420
- bundles.push(CRATE_PACKAGE_NAME);
421
- changed = true;
422
- }
423
- if (!changed) continue;
424
- manifest.dependencies = dependencies;
425
- manifest.dsh = {
426
- ...dsh,
427
- profile: {
428
- ...profile,
429
- bundles
430
- }
431
- };
432
- await writeFile(manifestPath, `${JSON.stringify(manifest, null, 2)}\n`, "utf8");
433
- }
434
- }
435
- async function ensureCrateBundleInAllProfiles(home) {
436
- if (profileInvariantPromise !== void 0) return profileInvariantPromise;
437
- profileInvariantPromise = ensureCrateBundleInAllProfilesOnce(home);
438
- try {
439
- await profileInvariantPromise;
440
- } finally {
441
- profileInvariantPromise = void 0;
442
- }
443
- }
444
1270
  async function listInstalledBundles(profileModules, anchorModules) {
445
1271
  const bundles = /* @__PURE__ */ new Map();
446
1272
  const addBundle = (bundle) => {
@@ -477,6 +1303,8 @@ async function listInstalledBundles(profileModules, anchorModules) {
477
1303
  }
478
1304
  }
479
1305
  };
1306
+ const desktop = desktopRuntimeRoot();
1307
+ if (desktop) await scanRoot(join(desktop, "node_modules"), "installation-anchor");
480
1308
  await scanRoot(profileModules, "profile");
481
1309
  await scanRoot(anchorModules, "installation-anchor");
482
1310
  return [...bundles.values()].sort((left, right) => String(left.name).localeCompare(String(right.name)));
@@ -485,22 +1313,18 @@ async function listInstalledBundles(profileModules, anchorModules) {
485
1313
  * Packages published by the DSH project are treated as official built-ins.
486
1314
  * This is the single source of truth for the official/user split used by the
487
1315
  * plugin inventory UI: a runtime loader row is official only when the package
488
- * itself is an official bundle, or when an official bundle's patch inserts it
489
- * as a built-in loader row (for example the official web-app bundle composes
490
- * `dsh-better-sidebar` under its own package name). Loader row ids are
491
- * deliberately NOT used, because a user plugin may register a row id that
492
- * collides with an official built-in (for example a custom sidebar) and must
493
- * stay in the user group.
1316
+ * itself is an official bundle. Loader row ids are deliberately NOT used,
1317
+ * because a user plugin may register a row id that collides with an official
1318
+ * built-in (for example a custom sidebar) and must stay in the user group.
494
1319
  */
495
1320
  function isOfficialPackage(name) {
496
1321
  return name.startsWith("@deepseek-ai/");
497
1322
  }
498
- /** Loader row identities (`id`/`name`) registered by an ``insert`` block. */
499
- function insertedLoaderRows(patchText) {
500
- const rows = [];
1323
+ /** Collect loader row ids registered via top-level ``insert`` blocks. */
1324
+ function insertedLoaderIds(patchText) {
1325
+ const ids = [];
501
1326
  let inInsert = false;
502
1327
  let insertIndent;
503
- let fieldIndent;
504
1328
  for (const raw of patchText.split(/\r?\n/)) {
505
1329
  const line = raw.replace(/\s+$/, "");
506
1330
  const stripped = line.trim();
@@ -509,79 +1333,38 @@ function insertedLoaderRows(patchText) {
509
1333
  if (indent === 0 && stripped.startsWith("- ")) {
510
1334
  inInsert = stripped.slice(2).trim() === "insert:";
511
1335
  insertIndent = void 0;
512
- fieldIndent = void 0;
513
1336
  continue;
514
1337
  }
515
1338
  if (!inInsert) continue;
516
- if (stripped.startsWith("- ")) {
517
- if (insertIndent === void 0) insertIndent = indent;
518
- if (indent !== insertIndent) continue;
519
- fieldIndent = indent + 2;
520
- const row = stripped.slice(2).trim();
521
- const match = /^([a-zA-Z][a-zA-Z0-9_-]*):\s*(.*)$/.exec(row);
522
- if (match === null) continue;
523
- const value = match[2].trim().replace(/^["']|["']$/g, "");
524
- if (value === "") continue;
525
- if (match[1] === "id") rows.push({ id: value });
526
- if (match[1] === "name") rows.push({ name: value });
527
- continue;
1339
+ if (!stripped.startsWith("- ")) continue;
1340
+ if (insertIndent === void 0) insertIndent = indent;
1341
+ if (indent !== insertIndent) continue;
1342
+ const row = stripped.slice(2).trim();
1343
+ if (row.startsWith("id:")) {
1344
+ const value = row.slice(3).trim().replace(/^["']|["']$/g, "");
1345
+ if (value) ids.push(value);
528
1346
  }
529
- if (fieldIndent === void 0 || indent !== fieldIndent) continue;
530
- const field = /^([a-zA-Z][a-zA-Z0-9_-]*):\s*(.*)$/.exec(stripped);
531
- if (field === null) continue;
532
- const value = field[2].trim().replace(/^["']|["']$/g, "");
533
- if (value === "") continue;
534
- if (field[1] === "id") rows.push({ id: value });
535
- if (field[1] === "name") rows.push({ name: value });
536
1347
  }
537
- return rows;
538
- }
539
- /** Loader row ids registered via top-level ``insert`` blocks. */
540
- function insertedLoaderIds(patchText) {
541
- return insertedLoaderRows(patchText).filter((row) => row.id !== void 0).map((row) => row.id);
542
- }
543
- /** Loader row package names registered via top-level ``insert`` blocks. */
544
- function insertedLoaderNames(patchText) {
545
- return insertedLoaderRows(patchText).filter((row) => row.name !== void 0).map((row) => row.name);
546
- }
547
- /** Read one installed Bundle's patch text from either resolution root. */
548
- async function readInstalledBundlePatch(home, profileName, bundleName, patch) {
549
- const segments = bundleName.split("/");
550
- const candidates = [join(home, "profiles", profileName, "node_modules", ...segments), join(home, "profiles", "node_modules", ...segments)];
551
- for (const candidate of candidates) try {
552
- return await readFile(join(candidate, patch), "utf8");
553
- } catch {}
1348
+ return ids;
554
1349
  }
555
1350
  /** Loader row ids registered by one installed Bundle patch. */
556
1351
  async function installedBundlePatchIds(home, profileName, bundleName, patch) {
557
1352
  const ids = /* @__PURE__ */ new Set();
558
- const patchText = await readInstalledBundlePatch(home, profileName, bundleName, patch);
559
- if (patchText === void 0) return ids;
560
- for (const id of insertedLoaderIds(patchText)) ids.add(id);
1353
+ const segments = bundleName.split("/");
1354
+ const candidates = [
1355
+ ...desktopRuntimeRoot() ? [join(desktopRuntimeRoot(), "node_modules", ...segments)] : [],
1356
+ join(home, "profiles", profileName, "node_modules", ...segments),
1357
+ join(home, "profiles", "node_modules", ...segments)
1358
+ ];
1359
+ for (const candidate of candidates) try {
1360
+ for (const file of Array.isArray(patch) ? patch : [patch]) {
1361
+ const patchText = await readFile(join(candidate, file), "utf8");
1362
+ for (const id of insertedLoaderIds(patchText)) ids.add(id);
1363
+ }
1364
+ break;
1365
+ } catch {}
561
1366
  return ids;
562
1367
  }
563
- /**
564
- * The set of package names treated as official built-ins for a Profile:
565
- * every @deepseek-ai/* bundle plus every loader row name its patches insert.
566
- */
567
- async function officialBundleNames(home, profileName, bundles) {
568
- const official = /* @__PURE__ */ new Set();
569
- const pending = [];
570
- for (const bundle of bundles) {
571
- if (typeof bundle.name !== "string" || !bundle.name.startsWith("@deepseek-ai/")) continue;
572
- official.add(bundle.name);
573
- if (typeof bundle.patch === "string" && bundle.patch.trim() !== "") pending.push({
574
- name: bundle.name,
575
- patch: bundle.patch
576
- });
577
- }
578
- for (const item of pending) {
579
- const patchText = await readInstalledBundlePatch(home, profileName, item.name, item.patch);
580
- if (patchText === void 0) continue;
581
- for (const name of insertedLoaderNames(patchText)) official.add(name);
582
- }
583
- return official;
584
- }
585
1368
  async function listProfiles(home) {
586
1369
  const root = join(home, "profiles");
587
1370
  try {
@@ -600,17 +1383,15 @@ async function listProfiles(home) {
600
1383
  const dependencyNames = dependencies !== null && typeof dependencies === "object" && !Array.isArray(dependencies) ? Object.keys(dependencies) : [];
601
1384
  const composedBundles = Array.isArray(bundles) ? bundles.filter((name) => typeof name === "string") : [];
602
1385
  const activePlugins = new Set(composedBundles);
603
- const scannedBundles = await listInstalledBundles(join(root, entry.name, "node_modules"), join(root, "node_modules"));
604
- const officialNames = await officialBundleNames(home, entry.name, scannedBundles);
605
- const installedBundles = scannedBundles.map((bundle) => ({
1386
+ const installedBundles = (await listInstalledBundles(join(root, entry.name, "node_modules"), join(root, "node_modules"))).map((bundle) => ({
606
1387
  ...bundle,
607
1388
  active: activePlugins.has(String(bundle.name)),
608
- official: officialNames.has(String(bundle.name))
1389
+ official: isOfficialPackage(String(bundle.name))
609
1390
  })).filter((bundle) => bundle.active === true || dependencyNames.includes(String(bundle.name)));
610
1391
  const activeRowIds = /* @__PURE__ */ new Set();
611
1392
  const installedRowIds = /* @__PURE__ */ new Map();
612
1393
  for (const bundle of installedBundles) {
613
- if (typeof bundle.patch !== "string") continue;
1394
+ if (typeof bundle.patch !== "string" && !Array.isArray(bundle.patch)) continue;
614
1395
  const rowIds = await installedBundlePatchIds(home, entry.name, String(bundle.name), bundle.patch);
615
1396
  installedRowIds.set(String(bundle.name), rowIds);
616
1397
  if (bundle.active === true) for (const id of rowIds) activeRowIds.add(id);
@@ -680,16 +1461,25 @@ async function createProfile(home, body, workspace) {
680
1461
  const profileRelative = relative(profilesRoot, resolve(profileDir));
681
1462
  if (!profileRelative || profileRelative.startsWith("..") || profileRelative.includes("\\")) throw new Error("profileName escaped DSH_HOME");
682
1463
  try {
683
- await access(join(profileDir, "package.json"));
1464
+ await lstat(profileDir);
684
1465
  return {
685
1466
  status: "failed",
686
1467
  command: "create-profile",
687
1468
  exitCode: 2,
688
1469
  error: operationDiagnostic("PROFILE_EXISTS", "planning", profileName, `Profile already exists: ${profileName}`, "No Profile was created or modified.", "Choose a different Profile name, or delete the existing Profile first.")
689
1470
  };
690
- } catch {}
691
- const officialBase = await readInstalledVersion(join(profilesRoot, "node_modules", "@deepseek-ai", "dsh-base"));
692
- const officialWeb = await readInstalledVersion(join(profilesRoot, "node_modules", "@deepseek-ai", "dsh-web-app"));
1471
+ } catch (error) {
1472
+ if (!isCommandNotFound(error)) throw error;
1473
+ }
1474
+ if (!desktopRuntimeRoot() && !process.env.DSH_PACK_PNPM_COMMAND) return {
1475
+ status: "failed",
1476
+ command: "create-profile",
1477
+ exitCode: 2,
1478
+ error: operationDiagnostic("PACKAGE_MANAGER_REQUIRED", "planning", profileName, "A trusted pnpm command is required to create a managed Profile.", "The requested Profile was not created.", "Use the official Desktop runtime or configure DSH_PACK_PNPM_COMMAND explicitly.")
1479
+ };
1480
+ const officialModules = desktopRuntimeRoot() ? join(desktopRuntimeRoot(), "node_modules") : join(profilesRoot, "node_modules");
1481
+ const officialBase = await readInstalledVersion(join(officialModules, "@deepseek-ai", "dsh-base"));
1482
+ const officialWeb = await readInstalledVersion(join(officialModules, "@deepseek-ai", "dsh-web-app"));
693
1483
  if (officialBase === void 0 || officialWeb === void 0) return {
694
1484
  status: "failed",
695
1485
  command: "create-profile",
@@ -705,7 +1495,6 @@ async function createProfile(home, body, workspace) {
705
1495
  exitCode: 2,
706
1496
  error: operationDiagnostic("CRATE_VERSION_MISSING", "planning", profileName, "DSH Crate package version is missing", "The requested Profile was not created.", "Repair the DSH Crate installation and retry.")
707
1497
  };
708
- await mkdir(profileDir, { recursive: true });
709
1498
  const manifest = {
710
1499
  name: `dsh-profile-${profileName}`,
711
1500
  private: true,
@@ -716,10 +1505,77 @@ async function createProfile(home, body, workspace) {
716
1505
  },
717
1506
  dsh: { profile: { bundles: [...DEFAULT_CREATE_BUNDLES] } }
718
1507
  };
719
- await writeFile(join(profileDir, "package.json"), `${JSON.stringify(manifest, null, 2)}\n`, "utf8");
720
- await writeFile(join(profileDir, "cordis.patch.yml"), PROFILE_PATCH_TEMPLATE, "utf8");
721
- await writeFile(join(profileDir, "pnpm-workspace.yaml"), PROFILE_PNPM_WORKSPACE, "utf8");
722
- await ensureCrateBundleInAllProfiles(home);
1508
+ const seedRoot = join(workspace.work, `create-${randomUUID()}`);
1509
+ await mkdir(seedRoot);
1510
+ try {
1511
+ const seedProfile = join(seedRoot, "profiles", profileName);
1512
+ await mkdir(seedProfile, { recursive: true });
1513
+ await writeFile(join(seedProfile, "package.json"), `${JSON.stringify(manifest, null, 2)}\n`, "utf8");
1514
+ await writeFile(join(seedProfile, "cordis.yml"), "[]\n", "utf8");
1515
+ await writeFile(join(seedProfile, "cordis.patch.yml"), PROFILE_PATCH_TEMPLATE, "utf8");
1516
+ await writeFile(join(seedProfile, "pnpm-workspace.yaml"), PROFILE_PNPM_WORKSPACE, "utf8");
1517
+ await copyPackage(packageRoot, join(seedProfile, "node_modules", ...CRATE_PACKAGE_NAME.split("/")));
1518
+ const pack = join(seedRoot, "new-profile.dshcrate");
1519
+ const exported = await runCore(home, [
1520
+ "export",
1521
+ "--profile",
1522
+ seedProfile,
1523
+ "--output",
1524
+ pack,
1525
+ "--preset",
1526
+ "freeze",
1527
+ ...DEFAULT_CREATE_BUNDLES.flatMap((name) => ["--embed", name]),
1528
+ "--json",
1529
+ ...runtimeCoreArgs()
1530
+ ]);
1531
+ const exportResult = parseCore(exported.stdout);
1532
+ if (exported.code !== 0) return {
1533
+ status: "failed",
1534
+ command: "create-profile",
1535
+ exitCode: exported.code,
1536
+ stage: "export",
1537
+ error: coreDiagnostic(exportResult, "Could not prepare the empty Profile seed.")
1538
+ };
1539
+ const imported = await runCore(home, [
1540
+ "import",
1541
+ pack,
1542
+ "--dsh-home",
1543
+ home,
1544
+ "--target-profile",
1545
+ profileName,
1546
+ "--offline",
1547
+ "--json",
1548
+ ...runtimeCoreArgs()
1549
+ ]);
1550
+ const importResult = parseCore(imported.stdout);
1551
+ if (imported.code !== 0 || !isObject(importResult) || importResult.status !== "prepared") return {
1552
+ status: "failed",
1553
+ command: "create-profile",
1554
+ exitCode: imported.code || 2,
1555
+ stage: "import",
1556
+ error: coreDiagnostic(importResult, "The new managed Profile could not be prepared.")
1557
+ };
1558
+ } finally {
1559
+ try {
1560
+ const actual = await realpath(seedRoot);
1561
+ const leaf = relative(await realpath(workspace.work), actual);
1562
+ const homeRelative = relative(await realpath(home), actual);
1563
+ if (!leaf || isAbsolute(leaf) || leaf.startsWith("..") || isAbsolute(homeRelative) || homeRelative.startsWith("..") || (await lstat(seedRoot)).isSymbolicLink()) throw new Error("Unsafe Profile seed cleanup path");
1564
+ await rm(seedRoot, {
1565
+ recursive: true,
1566
+ force: true
1567
+ });
1568
+ } catch {
1569
+ await record(workspace.history, {
1570
+ time: (/* @__PURE__ */ new Date()).toISOString(),
1571
+ action: "create-profile-cleanup",
1572
+ status: "FAIL",
1573
+ profile: profileName,
1574
+ message: "Temporary seed cleanup failed; committed targets were not removed.",
1575
+ seedRoot
1576
+ });
1577
+ }
1578
+ }
723
1579
  const item = await record(workspace.history, {
724
1580
  time: (/* @__PURE__ */ new Date()).toISOString(),
725
1581
  action: "create-profile",
@@ -741,27 +1597,17 @@ async function createProfile(home, body, workspace) {
741
1597
  async function handleApi(home, body, runtimePlugins = []) {
742
1598
  const action = body.action;
743
1599
  const workspace = await ensureWorkspace(home);
744
- await ensureCrateBundleInAllProfiles(home);
745
1600
  if (action === "profiles") {
746
1601
  const runtime = currentRuntime(home);
747
- const profiles = await listProfiles(home);
748
- const runtimeOfficialNames = /* @__PURE__ */ new Set();
749
- const runtimeRow = typeof runtime.currentProfile === "string" ? profiles.find((candidate) => candidate.name === runtime.currentProfile) : void 0;
750
- if (runtimeRow !== void 0 && Array.isArray(runtimeRow.installedBundles)) {
751
- const names = await officialBundleNames(home, String(runtimeRow.name), runtimeRow.installedBundles);
752
- for (const name of names) runtimeOfficialNames.add(name);
753
- }
754
- const isOfficialRow = (row) => {
755
- const name = typeof row.name === "string" ? row.name : "";
756
- return isOfficialPackage(name) || runtimeOfficialNames.has(name);
757
- };
1602
+ const isOfficialRow = (row) => typeof row.name === "string" && isOfficialPackage(row.name);
1603
+ const classifiedPlugins = runtimePlugins.map((row) => ({
1604
+ ...row,
1605
+ official: isOfficialRow(row)
1606
+ }));
758
1607
  return {
759
1608
  status: "ok",
760
- profiles,
761
- runtimePlugins: runtimePlugins.map((row) => ({
762
- ...row,
763
- official: isOfficialRow(row)
764
- })),
1609
+ profiles: await listProfiles(home),
1610
+ runtimePlugins: classifiedPlugins,
765
1611
  runtime
766
1612
  };
767
1613
  }
@@ -783,6 +1629,7 @@ async function handleApi(home, body, runtimePlugins = []) {
783
1629
  const result = parseCore(run.stdout);
784
1630
  let targetProfile;
785
1631
  let requestedProfileName;
1632
+ let planFailure;
786
1633
  try {
787
1634
  const planArgs = [
788
1635
  "import",
@@ -802,12 +1649,21 @@ async function handleApi(home, body, runtimePlugins = []) {
802
1649
  if (typeof planned.plan.profileName === "string") targetProfile = planned.plan.profileName;
803
1650
  if (typeof planned.plan.requestedProfileName === "string") requestedProfileName = planned.plan.requestedProfileName;
804
1651
  }
1652
+ } else {
1653
+ const diagnostic = coreDiagnostic(parseCore(planRun.stdout), planRun.stderr || "Import planning failed");
1654
+ if (!(diagnostic.code === "PROFILE_EXISTS" && body.targetProfile === void 0 && body.overwrite !== true)) planFailure = diagnostic;
805
1655
  }
806
- } catch {}
1656
+ } catch (error) {
1657
+ planFailure = coreDiagnostic(void 0, failMessage(error));
1658
+ }
807
1659
  const enriched = isObject(result) ? {
808
1660
  ...result,
809
1661
  ...targetProfile ? { targetProfile } : {},
810
- ...requestedProfileName ? { requestedProfileName } : {}
1662
+ ...requestedProfileName ? { requestedProfileName } : {},
1663
+ ...planFailure ? {
1664
+ canContinue: false,
1665
+ error: planFailure
1666
+ } : {}
811
1667
  } : result;
812
1668
  return {
813
1669
  status: "ok",
@@ -824,7 +1680,7 @@ async function handleApi(home, body, runtimePlugins = []) {
824
1680
  };
825
1681
  }
826
1682
  }
827
- if (action === "export") {
1683
+ if (action === "export" || action === "export-plan") {
828
1684
  const profileName = safeName(body.profileName, "profileName");
829
1685
  const profile = join(home, "profiles", profileName);
830
1686
  const profileRelative = relative(join(home, "profiles"), resolve(profile));
@@ -839,20 +1695,45 @@ async function handleApi(home, body, runtimePlugins = []) {
839
1695
  "--json",
840
1696
  ...runtimeCoreArgs()
841
1697
  ];
1698
+ if (action === "export-plan") args.push("--plan-only");
1699
+ if (typeof body.preset === "string") args.push("--preset", body.preset);
842
1700
  if (body.includeInstalledBundles === true) args.push("--include-installed-bundles");
843
1701
  const embed = Array.isArray(body.embed) ? body.embed : [];
844
1702
  const referenceOnly = Array.isArray(body.referenceOnly) ? body.referenceOnly : [];
845
1703
  for (const name of embed) args.push("--embed", safePluginName(name, "embed plugin"));
846
1704
  for (const name of referenceOnly) args.push("--reference-only", safePluginName(name, "reference-only plugin"));
1705
+ if (body.requiredSecrets !== void 0 && !Array.isArray(body.requiredSecrets)) throw new Error("requiredSecrets must be an array of environment variable names");
847
1706
  const requiredSecrets = Array.isArray(body.requiredSecrets) ? body.requiredSecrets : [];
848
- for (const name of requiredSecrets) args.push("--required-secret", safeName(name, "required Secret"));
849
- const run = await runCore(home, args);
1707
+ for (const name of requiredSecrets) {
1708
+ if (typeof name !== "string" || !/^[A-Za-z_][A-Za-z0-9_]*$/.test(name)) throw new Error("requiredSecrets accepts environment variable names only; never supply Secret values");
1709
+ args.push("--required-secret", name);
1710
+ }
1711
+ let selectionPath;
1712
+ if (body.dataSelection !== void 0) {
1713
+ if (!Array.isArray(body.dataSelection)) throw new Error("dataSelection must be an array");
1714
+ selectionPath = join(workspace.work, "selection-" + randomUUID() + ".json");
1715
+ await writeFile(selectionPath, JSON.stringify(body.dataSelection), {
1716
+ encoding: "utf8",
1717
+ flag: "wx"
1718
+ });
1719
+ args.push("--data-selection-json", selectionPath);
1720
+ }
1721
+ const run = await runCore(home, args).finally(async () => {
1722
+ if (selectionPath) await rm(selectionPath, { force: true });
1723
+ });
850
1724
  let result;
851
1725
  try {
852
1726
  result = parseCore(run.stdout);
853
1727
  } catch {
854
1728
  result = void 0;
855
1729
  }
1730
+ if (action === "export-plan") return {
1731
+ status: run.code === 0 ? "ok" : "failed",
1732
+ command: action,
1733
+ exitCode: run.code,
1734
+ result,
1735
+ ...run.code === 0 ? {} : { error: coreDiagnostic(result, run.stderr || "Export preview failed") }
1736
+ };
856
1737
  if (run.code !== 0 || result === void 0) {
857
1738
  const failure = {
858
1739
  status: "failed",
@@ -926,7 +1807,6 @@ async function handleApi(home, body, runtimePlugins = []) {
926
1807
  });
927
1808
  return failure;
928
1809
  }
929
- await ensureCrateBundleInAllProfiles(home);
930
1810
  const plan = result.plan;
931
1811
  const profileName = plan !== null && typeof plan === "object" && !Array.isArray(plan) && typeof plan.profileName === "string" ? plan.profileName : void 0;
932
1812
  const item = await record(workspace.history, {
@@ -1152,7 +2032,7 @@ async function handleApi(home, body, runtimePlugins = []) {
1152
2032
  const profileName = safeName(body.profileName, "profileName");
1153
2033
  const mode = body.mode === void 0 ? "web" : body.mode;
1154
2034
  if (mode !== "web" && mode !== "headless") throw new Error("mode must be web or headless");
1155
- const args = [
2035
+ const run = await runCore(home, (await prepareVerifyArgs([
1156
2036
  "verify",
1157
2037
  "--dsh-home",
1158
2038
  home,
@@ -1162,20 +2042,23 @@ async function handleApi(home, body, runtimePlugins = []) {
1162
2042
  mode,
1163
2043
  "--json",
1164
2044
  ...runtimeCoreArgs()
1165
- ];
1166
- let runnerConfigPath;
1167
- if (body.runnerConfig !== void 0) {
1168
- if (!isObject(body.runnerConfig)) throw new Error("runnerConfig must be a JSON object");
1169
- const verifyDir = join(workspace.work, "verify");
1170
- await mkdir(verifyDir, { recursive: true });
1171
- runnerConfigPath = join(verifyDir, "verify-" + randomUUID() + ".json");
1172
- await writeFile(runnerConfigPath, JSON.stringify(body.runnerConfig, null, 2) + "\n", {
1173
- encoding: "utf8",
1174
- flag: "wx"
1175
- });
1176
- args.push("--runner-config", runnerConfigPath);
1177
- }
1178
- const run = await runCore(home, args);
2045
+ ], {
2046
+ mode,
2047
+ profilePath: join(home, "profiles", profileName),
2048
+ workDirectory: join(workspace.work, "verify"),
2049
+ requestConfig: body.runnerConfig,
2050
+ configuredPath: process.env.DSH_PACK_VERIFY_RUNNER_CONFIG,
2051
+ defaultConfig: process.platform === "win32" && mode === "web" && desktopRuntimeRoot() ? {
2052
+ kind: "desktop",
2053
+ mode: "web",
2054
+ desktopExecutable: process.execPath,
2055
+ runtimeRoot: desktopRuntimeRoot(),
2056
+ controllerScript: join(dirname(dirname(fileURLToPath(import.meta.url))), "verify-desktop.mjs"),
2057
+ maximumBoots: 1,
2058
+ modelRequests: 0,
2059
+ automaticRetries: 0
2060
+ } : void 0
2061
+ })).args);
1179
2062
  let result;
1180
2063
  try {
1181
2064
  result = parseCore(run.stdout);
@@ -1231,15 +2114,23 @@ async function handleDownload(home, req, res) {
1231
2114
  createReadStream(path).pipe(res);
1232
2115
  }
1233
2116
  /** Register the host bridge. The Core executable is intentionally external. */
1234
- const inject = ["webServer"];
1235
- function apply(ctx) {
2117
+ const inject = ["webServer", "connection"];
2118
+ function apply(ctx, config = {}) {
1236
2119
  const home = resolve(process.env.DSH_HOME || process.cwd());
1237
- ensureCrateBundleInAllProfiles(home).catch((error) => console.error(`dsh-crate-web: failed to ensure Profile invariant: ${failMessage(error)}`));
2120
+ const terminalRuntime = windowsTerminalRuntime(config);
2121
+ if (terminalRuntime) ctx.inject(["sandbox"], (scoped) => {
2122
+ scoped.effect(async () => {
2123
+ const args = await prepareWindowsRunner(home, terminalRuntime);
2124
+ return installWindowsRunnerHook(scoped.sandbox, args);
2125
+ }, "dsh-crate-web: optional Windows terminal host");
2126
+ });
2127
+ const connection = ctx.connection;
1238
2128
  ctx.effect(() => {
1239
2129
  const disposeApi = ctx.webServer.register({
1240
2130
  kind: "exact",
1241
2131
  path: API_PATH,
1242
2132
  handler: async (req, res) => {
2133
+ if (rejectRequest(connection, req, res)) return;
1243
2134
  if (req.method !== "POST") {
1244
2135
  res.writeHead(405);
1245
2136
  res.end();
@@ -1259,6 +2150,7 @@ function apply(ctx) {
1259
2150
  kind: "exact",
1260
2151
  path: DOWNLOAD_PATH,
1261
2152
  handler: (req, res) => {
2153
+ if (rejectRequest(connection, req, res)) return;
1262
2154
  handleDownload(home, req, res).catch((error) => json(res, 404, {
1263
2155
  status: "failed",
1264
2156
  error: { message: failMessage(error) }