@sparkelf/dsh-plus 0.1.0-rc.35 → 0.1.0-rc.36

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/lib/bin.js CHANGED
@@ -307,7 +307,8 @@ function resolveDistributionDirectory(anchor) {
307
307
  /** The reviewed bundle order and pins the installed distribution declares. */
308
308
  function readDistributionProfile(distributionDirectory) {
309
309
  const manifest = requireRecord(JSON.parse(readFileSync(join(distributionDirectory, "package.json"), "utf8")), "Plus distribution manifest");
310
- const profile = requireRecord(requireRecord(manifest.dshPlus, "dshPlus").profile, "dshPlus.profile");
310
+ const plus = requireRecord(manifest.dshPlus, "dshPlus");
311
+ const profile = requireRecord(plus.profile, "dshPlus.profile");
311
312
  const rawDependencies = requireRecord(profile.dependencies, "dshPlus.profile.dependencies");
312
313
  const rawAllowBuilds = requireRecord(profile.allowBuilds, "dshPlus.profile.allowBuilds");
313
314
  const dependencies = {};
@@ -326,37 +327,53 @@ function readDistributionProfile(distributionDirectory) {
326
327
  if (typeof spec !== "string" || spec === "") throw new Error("dshPlus.profile.overrides." + name + " must be a non-empty string");
327
328
  overrides[name] = spec;
328
329
  }
330
+ const compatibility = requireRecord(plus.compatibility, "dshPlus.compatibility");
329
331
  return {
330
332
  name: String(manifest.name),
331
333
  bundles: requireStringArray(profile.bundles, "dshPlus.profile.bundles"),
332
334
  dependencies,
333
335
  allowBuilds,
334
336
  overrides,
337
+ dshRange: String(compatibility.dsh),
335
338
  version: String(manifest.version)
336
339
  };
337
340
  }
338
341
  /**
339
- * Point the profile at the consumer's installed packages.
342
+ * Give the profile its own installed tree, built from the distribution's declarations.
340
343
  *
341
- * The launcher resolves a bundle from the profile directory, so a profile with no
342
- * `node_modules` cannot see packages the consumer installed beside it. One link to
343
- * the consumer's directory keeps a single installed copy as the only authority.
344
+ * The launcher resolves a bundle from the profile directory, so the profile needs its
345
+ * own `node_modules`. Pointing it at the consumer's tree was cheaper, but it made the
346
+ * profile inherit whatever npm had already installed including the official packages
347
+ * the distribution's `overrides` exist to replace. npm applies `overrides` only from a
348
+ * project's own root, so a profile without its own tree cannot receive them at all, and
349
+ * a patch delivered that way silently never arrives.
344
350
  *
345
- * npm hoists what it can and nests the rest, so a bundle can sit at the consumer's
346
- * top level or inside the package that depends on it. The profile reaches the first
347
- * through one link and the second through the distribution's own `node_modules`, and
348
- * a bundle found in neither is one the installation does not carry at all.
351
+ * Installing here makes the profile that root: pnpm reads `overrides` from the
352
+ * profile's own `pnpm-workspace.yaml`, which `writeProfileOverrides` writes before this
353
+ * runs. The install is skipped once the tree exists so a start does not pay for it
354
+ * twice; `dsh-plus apply` remains the command that reinstalls after a change.
349
355
  *
350
356
  * @param paths - resolved standalone paths.
351
- * @param consumerDirectory - directory whose `node_modules` holds the packages.
357
+ * @param consumerDirectory - directory whose `node_modules` holds the installation.
352
358
  */
353
- function linkConsumerPackages(paths, consumerDirectory) {
354
- const target = join(consumerDirectory, "node_modules");
355
- if (!existsSync(target)) throw new Error("no node_modules in " + consumerDirectory + "; run npm install there first");
356
- mkdirSync(paths.profileDirectory, { recursive: true });
357
- const link = join(paths.profileDirectory, "node_modules");
358
- if (!existsSync(link)) symlinkSync(target, link, "junction");
359
- linkNestedBundles(paths, target);
359
+ function installProfilePackages(paths, consumerDirectory) {
360
+ if (!existsSync(join(consumerDirectory, "node_modules"))) throw new Error("no node_modules in " + consumerDirectory + "; run npm install there first");
361
+ const profileModules = join(paths.profileDirectory, "node_modules");
362
+ if (existsSync(profileModules)) {
363
+ linkNestedBundles(paths, profileModules);
364
+ return;
365
+ }
366
+ runPnpm(paths.profileDirectory, ["install", "--no-frozen-lockfile"], "pnpm install in the plus profile");
367
+ linkNestedBundles(paths, profileModules);
368
+ }
369
+ /** Run pnpm in one directory, inheriting its output. */
370
+ function runPnpm(cwd, args, label) {
371
+ const result = spawnSync(process.platform === "win32" ? "pnpm.cmd" : "pnpm", [...args], {
372
+ cwd,
373
+ stdio: "inherit"
374
+ });
375
+ if (result.error !== void 0) throw result.error;
376
+ if (result.status !== 0) throw new Error(label + " failed with exit code " + String(result.status));
360
377
  }
361
378
  /**
362
379
  * Expose the distribution's nested packages at the top level the profile searches.
@@ -413,10 +430,13 @@ function resolvePaths(anchor, env = process.env) {
413
430
  * @returns whether this call created the manifest.
414
431
  */
415
432
  function ensureProfile(paths, consumerDirectory) {
416
- linkConsumerPackages(paths, consumerDirectory);
417
433
  const manifestPath = join(paths.profileDirectory, "package.json");
418
- if (existsSync(manifestPath)) return false;
419
434
  const distribution = readDistributionProfile(paths.distributionDirectory);
435
+ if (existsSync(manifestPath)) {
436
+ writeProfileOverrides(paths.profileDirectory, distribution.overrides, distribution.allowBuilds);
437
+ installProfilePackages(paths, consumerDirectory);
438
+ return false;
439
+ }
420
440
  mkdirSync(paths.profileDirectory, { recursive: true });
421
441
  const manifest = {
422
442
  name: "dsh-profile-plus",
@@ -424,6 +444,7 @@ function ensureProfile(paths, consumerDirectory) {
424
444
  type: "module",
425
445
  dependencies: {
426
446
  "@sparkelf/dsh-plus": distribution.version,
447
+ "@deepseek-ai/dsh": distribution.dshRange,
427
448
  ...distribution.dependencies
428
449
  },
429
450
  dsh: { profile: {
@@ -432,7 +453,8 @@ function ensureProfile(paths, consumerDirectory) {
432
453
  } }
433
454
  };
434
455
  writeFileSync(manifestPath, JSON.stringify(manifest, null, 2) + "\n");
435
- writeProfileOverrides(paths.profileDirectory, distribution.overrides);
456
+ writeProfileOverrides(paths.profileDirectory, distribution.overrides, distribution.allowBuilds);
457
+ installProfilePackages(paths, consumerDirectory);
436
458
  return true;
437
459
  }
438
460
  /**
@@ -445,13 +467,14 @@ function ensureProfile(paths, consumerDirectory) {
445
467
  * @param profileDirectory - the standalone profile directory.
446
468
  * @param overrides - official package name to published replacement spec.
447
469
  */
448
- function writeProfileOverrides(profileDirectory, overrides) {
470
+ function writeProfileOverrides(profileDirectory, overrides, allowBuilds) {
449
471
  const workspacePath = join(profileDirectory, "pnpm-workspace.yaml");
450
472
  const document = parseDocument(existsSync(workspacePath) ? readFileSync(workspacePath, "utf8") : "");
451
473
  const [documentError] = document.errors;
452
474
  if (documentError !== void 0) throw new Error("Plus profile workspace is not valid YAML", { cause: documentError });
453
475
  if (document.get("packages") === void 0) document.set("packages", ["."]);
454
476
  for (const [name, spec] of Object.entries(overrides)) document.setIn(["overrides", name], spec);
477
+ for (const [name, allowed] of Object.entries(allowBuilds)) document.setIn(["allowBuilds", name], allowed);
455
478
  if (document.get("nodeLinker") === void 0) document.set("nodeLinker", "hoisted");
456
479
  if (document.get("autoInstallPeers") === void 0) document.set("autoInstallPeers", false);
457
480
  writeFileSync(workspacePath, String(document));
@@ -55,24 +55,28 @@ export declare function readDistributionProfile(distributionDirectory: string):
55
55
  readonly dependencies: Readonly<Record<string, string>>;
56
56
  readonly allowBuilds: Readonly<Record<string, boolean>>;
57
57
  readonly overrides: Readonly<Record<string, string>>;
58
+ readonly dshRange: string;
58
59
  readonly version: string;
59
60
  };
60
61
  /**
61
- * Point the profile at the consumer's installed packages.
62
+ * Give the profile its own installed tree, built from the distribution's declarations.
62
63
  *
63
- * The launcher resolves a bundle from the profile directory, so a profile with no
64
- * `node_modules` cannot see packages the consumer installed beside it. One link to
65
- * the consumer's directory keeps a single installed copy as the only authority.
64
+ * The launcher resolves a bundle from the profile directory, so the profile needs its
65
+ * own `node_modules`. Pointing it at the consumer's tree was cheaper, but it made the
66
+ * profile inherit whatever npm had already installed including the official packages
67
+ * the distribution's `overrides` exist to replace. npm applies `overrides` only from a
68
+ * project's own root, so a profile without its own tree cannot receive them at all, and
69
+ * a patch delivered that way silently never arrives.
66
70
  *
67
- * npm hoists what it can and nests the rest, so a bundle can sit at the consumer's
68
- * top level or inside the package that depends on it. The profile reaches the first
69
- * through one link and the second through the distribution's own `node_modules`, and
70
- * a bundle found in neither is one the installation does not carry at all.
71
+ * Installing here makes the profile that root: pnpm reads `overrides` from the
72
+ * profile's own `pnpm-workspace.yaml`, which `writeProfileOverrides` writes before this
73
+ * runs. The install is skipped once the tree exists so a start does not pay for it
74
+ * twice; `dsh-plus apply` remains the command that reinstalls after a change.
71
75
  *
72
76
  * @param paths - resolved standalone paths.
73
- * @param consumerDirectory - directory whose `node_modules` holds the packages.
77
+ * @param consumerDirectory - directory whose `node_modules` holds the installation.
74
78
  */
75
- export declare function linkConsumerPackages(paths: StandalonePaths, consumerDirectory: string): void;
79
+ export declare function installProfilePackages(paths: StandalonePaths, consumerDirectory: string): void;
76
80
  /** Resolve every path a command needs, without creating anything. */
77
81
  export declare function resolvePaths(anchor: string, env?: NodeJS.ProcessEnv): StandalonePaths;
78
82
  /**
@@ -118,42 +118,58 @@ export function readDistributionProfile(distributionDirectory) {
118
118
  throw new Error('dshPlus.profile.overrides.' + name + ' must be a non-empty string');
119
119
  overrides[name] = spec;
120
120
  }
121
+ const compatibility = requireRecord(plus.compatibility, 'dshPlus.compatibility');
121
122
  return {
122
123
  name: String(manifest.name),
123
124
  bundles: requireStringArray(profile.bundles, 'dshPlus.profile.bundles'),
124
125
  dependencies,
125
126
  allowBuilds,
126
127
  overrides,
128
+ dshRange: String(compatibility.dsh),
127
129
  version: String(manifest.version),
128
130
  };
129
131
  }
130
132
  /**
131
- * Point the profile at the consumer's installed packages.
133
+ * Give the profile its own installed tree, built from the distribution's declarations.
132
134
  *
133
- * The launcher resolves a bundle from the profile directory, so a profile with no
134
- * `node_modules` cannot see packages the consumer installed beside it. One link to
135
- * the consumer's directory keeps a single installed copy as the only authority.
135
+ * The launcher resolves a bundle from the profile directory, so the profile needs its
136
+ * own `node_modules`. Pointing it at the consumer's tree was cheaper, but it made the
137
+ * profile inherit whatever npm had already installed including the official packages
138
+ * the distribution's `overrides` exist to replace. npm applies `overrides` only from a
139
+ * project's own root, so a profile without its own tree cannot receive them at all, and
140
+ * a patch delivered that way silently never arrives.
136
141
  *
137
- * npm hoists what it can and nests the rest, so a bundle can sit at the consumer's
138
- * top level or inside the package that depends on it. The profile reaches the first
139
- * through one link and the second through the distribution's own `node_modules`, and
140
- * a bundle found in neither is one the installation does not carry at all.
142
+ * Installing here makes the profile that root: pnpm reads `overrides` from the
143
+ * profile's own `pnpm-workspace.yaml`, which `writeProfileOverrides` writes before this
144
+ * runs. The install is skipped once the tree exists so a start does not pay for it
145
+ * twice; `dsh-plus apply` remains the command that reinstalls after a change.
141
146
  *
142
147
  * @param paths - resolved standalone paths.
143
- * @param consumerDirectory - directory whose `node_modules` holds the packages.
148
+ * @param consumerDirectory - directory whose `node_modules` holds the installation.
144
149
  */
145
- export function linkConsumerPackages(paths, consumerDirectory) {
146
- const target = join(consumerDirectory, 'node_modules');
147
- if (!existsSync(target)) {
150
+ export function installProfilePackages(paths, consumerDirectory) {
151
+ const consumerModules = join(consumerDirectory, 'node_modules');
152
+ if (!existsSync(consumerModules)) {
148
153
  throw new Error('no node_modules in ' + consumerDirectory + '; run npm install there first');
149
154
  }
150
- mkdirSync(paths.profileDirectory, { recursive: true });
151
- const link = join(paths.profileDirectory, 'node_modules');
152
- if (!existsSync(link))
153
- symlinkSync(target, link, 'junction');
154
- // A profile created before the installation changed must still reach what npm nested
155
- // afterwards, so this runs on every start rather than only when the profile is new.
156
- linkNestedBundles(paths, target);
155
+ const profileModules = join(paths.profileDirectory, 'node_modules');
156
+ if (existsSync(profileModules)) {
157
+ // A profile installed before the distribution declared overrides still needs the
158
+ // packages it reaches from the consumer tree, which npm nested rather than hoisted.
159
+ linkNestedBundles(paths, profileModules);
160
+ return;
161
+ }
162
+ runPnpm(paths.profileDirectory, ['install', '--no-frozen-lockfile'], 'pnpm install in the plus profile');
163
+ linkNestedBundles(paths, profileModules);
164
+ }
165
+ /** Run pnpm in one directory, inheriting its output. */
166
+ function runPnpm(cwd, args, label) {
167
+ const command = process.platform === 'win32' ? 'pnpm.cmd' : 'pnpm';
168
+ const result = spawnSync(command, [...args], { cwd, stdio: 'inherit' });
169
+ if (result.error !== undefined)
170
+ throw result.error;
171
+ if (result.status !== 0)
172
+ throw new Error(label + ' failed with exit code ' + String(result.status));
157
173
  }
158
174
  /**
159
175
  * Expose the distribution's nested packages at the top level the profile searches.
@@ -217,17 +233,30 @@ export function resolvePaths(anchor, env = process.env) {
217
233
  * @returns whether this call created the manifest.
218
234
  */
219
235
  export function ensureProfile(paths, consumerDirectory) {
220
- linkConsumerPackages(paths, consumerDirectory);
221
236
  const manifestPath = join(paths.profileDirectory, 'package.json');
222
- if (existsSync(manifestPath))
223
- return false;
224
237
  const distribution = readDistributionProfile(paths.distributionDirectory);
238
+ if (existsSync(manifestPath)) {
239
+ // The workspace carries decisions the distribution owns — overrides and the build
240
+ // script allowlist — and a distribution release changes them. Rewriting on every
241
+ // start is what lets an upgraded installation receive the new values; a profile
242
+ // written once keeps whatever its own release decided and can never be corrected.
243
+ writeProfileOverrides(paths.profileDirectory, distribution.overrides, distribution.allowBuilds);
244
+ installProfilePackages(paths, consumerDirectory);
245
+ return false;
246
+ }
225
247
  mkdirSync(paths.profileDirectory, { recursive: true });
226
248
  const manifest = {
227
249
  name: 'dsh-profile-' + STANDALONE_PROFILE,
228
250
  private: true,
229
251
  type: 'module',
230
- dependencies: { '@sparkelf/dsh-plus': distribution.version, ...distribution.dependencies },
252
+ dependencies: {
253
+ '@sparkelf/dsh-plus': distribution.version,
254
+ // The launcher's own tree supplies every service package the bundles mount. A
255
+ // profile that lists only the distribution's plugins installs a partial tree and
256
+ // fails at load with a module the launcher would have carried.
257
+ '@deepseek-ai/dsh': distribution.dshRange,
258
+ ...distribution.dependencies,
259
+ },
231
260
  dsh: {
232
261
  profile: {
233
262
  bundles: distribution.bundles,
@@ -236,7 +265,9 @@ export function ensureProfile(paths, consumerDirectory) {
236
265
  },
237
266
  };
238
267
  writeFileSync(manifestPath, JSON.stringify(manifest, null, 2) + '\n');
239
- writeProfileOverrides(paths.profileDirectory, distribution.overrides);
268
+ // The overrides must reach the workspace before the install that reads them.
269
+ writeProfileOverrides(paths.profileDirectory, distribution.overrides, distribution.allowBuilds);
270
+ installProfilePackages(paths, consumerDirectory);
240
271
  return true;
241
272
  }
242
273
  /**
@@ -249,7 +280,7 @@ export function ensureProfile(paths, consumerDirectory) {
249
280
  * @param profileDirectory - the standalone profile directory.
250
281
  * @param overrides - official package name to published replacement spec.
251
282
  */
252
- function writeProfileOverrides(profileDirectory, overrides) {
283
+ function writeProfileOverrides(profileDirectory, overrides, allowBuilds) {
253
284
  const workspacePath = join(profileDirectory, 'pnpm-workspace.yaml');
254
285
  const document = parseDocument(existsSync(workspacePath) ? readFileSync(workspacePath, 'utf8') : '');
255
286
  const [documentError] = document.errors;
@@ -259,6 +290,11 @@ function writeProfileOverrides(profileDirectory, overrides) {
259
290
  document.set('packages', ['.']);
260
291
  for (const [name, spec] of Object.entries(overrides))
261
292
  document.setIn(['overrides', name], spec);
293
+ // pnpm refuses an install whose packages want to run build scripts until each is
294
+ // decided, so the distribution's reviewed decisions travel with the install rather
295
+ // than waiting for an interactive approval no start can offer.
296
+ for (const [name, allowed] of Object.entries(allowBuilds))
297
+ document.setIn(['allowBuilds', name], allowed);
262
298
  // The profile resolves bundles from this directory, so peers the official tree would
263
299
  // supply have to come from what the consumer installed.
264
300
  if (document.get('nodeLinker') === undefined)
package/package.json CHANGED
@@ -58,12 +58,16 @@
58
58
  ],
59
59
  "profile": {
60
60
  "allowBuilds": {
61
- "@officecli/officecli": true,
62
- "cpu-features": false,
63
- "node-pty": true,
64
- "oracledb": true,
65
- "protobufjs": false,
66
- "ssh2": true
61
+ "@deepseek-ai/dsh-subprocess-local@0.1.5-rc.2": true,
62
+ "@google/genai@1.52.0": false,
63
+ "@officecli/officecli@1.0.147": true,
64
+ "cpu-features@0.0.10": false,
65
+ "koffi@3.3.0": true,
66
+ "node-pty@1.1.0": true,
67
+ "node-pty@1.2.0-beta.15": true,
68
+ "oracledb@7.0.1": true,
69
+ "protobufjs@7.6.6": false,
70
+ "ssh2@1.17.0": true
67
71
  },
68
72
  "bundles": [
69
73
  "@deepseek-ai/dsh-base",
@@ -100,26 +104,26 @@
100
104
  "dsh-video-preview": "0.1.4"
101
105
  },
102
106
  "overrides": {
103
- "@deepseek-ai/dsh-agent-presets": "npm:@sparkelf/dsh-agent-presets@0.1.5-rc.2",
104
- "@deepseek-ai/dsh-api-gateway": "npm:@sparkelf/dsh-api-gateway@0.1.5-rc.2",
105
- "@deepseek-ai/dsh-api-session-controller": "npm:@sparkelf/dsh-api-session-controller@0.1.5-rc.2",
106
- "@deepseek-ai/dsh-client-connection": "npm:@sparkelf/dsh-client-connection@0.1.5-rc.2",
107
- "@deepseek-ai/dsh-client-ui-agent-preset": "npm:@sparkelf/dsh-client-ui-agent-preset@0.1.5-rc.2",
108
- "@deepseek-ai/dsh-client-ui-conversation": "npm:@sparkelf/dsh-client-ui-conversation@0.1.5-rc.2",
109
- "@deepseek-ai/dsh-client-ui-deliverables": "npm:@sparkelf/dsh-client-ui-deliverables@0.1.5-rc.2",
110
- "@deepseek-ai/dsh-client-ui-layout": "npm:@sparkelf/dsh-client-ui-layout@0.1.5-rc.2",
111
- "@deepseek-ai/dsh-client-ui-model-selection": "npm:@sparkelf/dsh-client-ui-model-selection@0.1.5-rc.2",
112
- "@deepseek-ai/dsh-client-ui-primitives": "npm:@sparkelf/dsh-client-ui-primitives@0.1.5-rc.2",
113
- "@deepseek-ai/dsh-client-ui-settings-models": "npm:@sparkelf/dsh-client-ui-settings-models@0.1.5-rc.2",
114
- "@deepseek-ai/dsh-client-ui-trajectory": "npm:@sparkelf/dsh-client-ui-trajectory@0.1.5-rc.2",
115
- "@deepseek-ai/dsh-host-frontend-static": "npm:@sparkelf/dsh-host-frontend-static@0.1.5-rc.2",
116
- "@deepseek-ai/dsh-host-webserver": "npm:@sparkelf/dsh-host-webserver@0.1.5-rc.2",
117
- "@deepseek-ai/dsh-llm-pi-ai": "npm:@sparkelf/dsh-llm-pi-ai@0.1.5-rc.2",
118
- "@deepseek-ai/dsh-session-log-export": "npm:@sparkelf/dsh-session-log-export@0.1.5-rc.2",
119
- "@deepseek-ai/dsh-tools": "npm:@sparkelf/dsh-tools@0.1.5-rc.2",
120
- "@deepseek-ai/dsh-web-app": "npm:@sparkelf/dsh-web-app@0.1.5-rc.2",
121
- "@deepseek-ai/dsh-web-frontend": "npm:@sparkelf/dsh-web-frontend@0.1.5-rc.2",
122
- "@deepseek-ai/dsh-workspace": "npm:@sparkelf/dsh-workspace@0.1.5-rc.2"
107
+ "@deepseek-ai/dsh-agent-presets": "npm:@sparkelf/dsh-agent-presets@0.1.5-rc.6",
108
+ "@deepseek-ai/dsh-api-gateway": "npm:@sparkelf/dsh-api-gateway@0.1.5-rc.6",
109
+ "@deepseek-ai/dsh-api-session-controller": "npm:@sparkelf/dsh-api-session-controller@0.1.5-rc.6",
110
+ "@deepseek-ai/dsh-client-connection": "npm:@sparkelf/dsh-client-connection@0.1.5-rc.6",
111
+ "@deepseek-ai/dsh-client-ui-agent-preset": "npm:@sparkelf/dsh-client-ui-agent-preset@0.1.5-rc.6",
112
+ "@deepseek-ai/dsh-client-ui-conversation": "npm:@sparkelf/dsh-client-ui-conversation@0.1.5-rc.6",
113
+ "@deepseek-ai/dsh-client-ui-deliverables": "npm:@sparkelf/dsh-client-ui-deliverables@0.1.5-rc.6",
114
+ "@deepseek-ai/dsh-client-ui-layout": "npm:@sparkelf/dsh-client-ui-layout@0.1.5-rc.6",
115
+ "@deepseek-ai/dsh-client-ui-model-selection": "npm:@sparkelf/dsh-client-ui-model-selection@0.1.5-rc.6",
116
+ "@deepseek-ai/dsh-client-ui-primitives": "npm:@sparkelf/dsh-client-ui-primitives@0.1.5-rc.6",
117
+ "@deepseek-ai/dsh-client-ui-settings-models": "npm:@sparkelf/dsh-client-ui-settings-models@0.1.5-rc.6",
118
+ "@deepseek-ai/dsh-client-ui-trajectory": "npm:@sparkelf/dsh-client-ui-trajectory@0.1.5-rc.6",
119
+ "@deepseek-ai/dsh-host-frontend-static": "npm:@sparkelf/dsh-host-frontend-static@0.1.5-rc.6",
120
+ "@deepseek-ai/dsh-host-webserver": "npm:@sparkelf/dsh-host-webserver@0.1.5-rc.6",
121
+ "@deepseek-ai/dsh-llm-pi-ai": "npm:@sparkelf/dsh-llm-pi-ai@0.1.5-rc.6",
122
+ "@deepseek-ai/dsh-session-log-export": "npm:@sparkelf/dsh-session-log-export@0.1.5-rc.6",
123
+ "@deepseek-ai/dsh-tools": "npm:@sparkelf/dsh-tools@0.1.5-rc.6",
124
+ "@deepseek-ai/dsh-web-app": "npm:@sparkelf/dsh-web-app@0.1.5-rc.6",
125
+ "@deepseek-ai/dsh-web-frontend": "npm:@sparkelf/dsh-web-frontend@0.1.5-rc.6",
126
+ "@deepseek-ai/dsh-workspace": "npm:@sparkelf/dsh-workspace@0.1.5-rc.6"
123
127
  }
124
128
  },
125
129
  "sourceBase": {
@@ -162,5 +166,5 @@
162
166
  },
163
167
  "type": "module",
164
168
  "types": "lib/types/index.d.ts",
165
- "version": "0.1.0-rc.35"
169
+ "version": "0.1.0-rc.36"
166
170
  }