@sparkelf/dsh-plus 0.2.2-alpha.2.3 → 0.2.2-alpha.2.30

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.
@@ -9,9 +9,8 @@
9
9
  * bundle's own list.
10
10
  */
11
11
  import { spawnSync } from 'node:child_process';
12
- import { existsSync, mkdirSync, readdirSync, readFileSync, renameSync, rmSync, symlinkSync, writeFileSync } from 'node:fs';
12
+ import { existsSync, mkdirSync, readdirSync, readFileSync, renameSync, symlinkSync, writeFileSync } from 'node:fs';
13
13
  import { createRequire } from 'node:module';
14
- import { fileURLToPath } from 'node:url';
15
14
  import { homedir } from 'node:os';
16
15
  import { dirname, join, posix, resolve, win32 } from 'node:path';
17
16
  import { parseDocument } from 'yaml';
@@ -99,12 +98,6 @@ function requireStringArray(value, label) {
99
98
  throw new Error(label + ' must be a string array');
100
99
  return value;
101
100
  }
102
- /** Read one non-empty string field. */
103
- function requireString(value, label) {
104
- if (typeof value !== 'string' || value.trim() === '')
105
- throw new Error(label + ' must be a non-empty string');
106
- return value;
107
- }
108
101
  /** Resolve the DSH home, honouring the environment override the launcher itself reads. */
109
102
  export function resolveHome(env = process.env) {
110
103
  const configured = env.DSH_HOME;
@@ -143,15 +136,12 @@ export function isWithin(candidate, parent, platform = process.platform) {
143
136
  * @returns absolute path to the installed distribution.
144
137
  */
145
138
  export function resolveDistributionDirectory(anchor) {
146
- const ownDirectory = dirname(dirname(fileURLToPath(import.meta.url)));
147
139
  let resolved;
148
140
  try {
149
141
  resolved = dirname(createRequire(anchor).resolve('@sparkelf/dsh-plus/package.json'));
150
142
  }
151
143
  catch {
152
- // `npx @sparkelf/dsh-plus ...` runs the CLI from a temporary install, so the consumer
153
- // tree has no copy to resolve. The running module's own package is the distribution.
154
- return ownDirectory;
144
+ throw new Error('@sparkelf/dsh-plus is not installed in ' + dirname(anchor) + '; run this command from the directory that installed it');
155
145
  }
156
146
  // A resolution that leaves the consumer tree means the module answered from its own
157
147
  // installation, which reports health for a distribution the consumer never installed.
@@ -167,14 +157,21 @@ export function resolveDistributionDirectory(anchor) {
167
157
  break;
168
158
  current = parent;
169
159
  }
170
- return ownDirectory;
160
+ throw new Error('@sparkelf/dsh-plus resolved outside ' + resolve(dirname(anchor)) + ' (found ' + resolved + '); run this command from the directory that installed it');
171
161
  }
162
+ /** The reviewed bundle order and pins the installed distribution declares. */
172
163
  export function readDistributionProfile(distributionDirectory) {
173
164
  const manifest = requireRecord(JSON.parse(readFileSync(join(distributionDirectory, 'package.json'), 'utf8')), 'Plus distribution manifest');
174
165
  const plus = requireRecord(manifest.dshPlus, 'dshPlus');
175
166
  const profile = requireRecord(plus.profile, 'dshPlus.profile');
176
- const dependencies = requireDependencyMap(requireRecord(profile.dependencies, 'dshPlus.profile.dependencies'), 'dshPlus.profile.dependencies');
167
+ const rawDependencies = requireRecord(profile.dependencies, 'dshPlus.profile.dependencies');
177
168
  const rawAllowBuilds = requireRecord(profile.allowBuilds, 'dshPlus.profile.allowBuilds');
169
+ const dependencies = {};
170
+ for (const [name, spec] of Object.entries(rawDependencies)) {
171
+ if (typeof spec !== 'string' || spec === '')
172
+ throw new Error('dshPlus.profile.dependencies.' + name + ' must be a non-empty string');
173
+ dependencies[name] = spec;
174
+ }
178
175
  const allowBuilds = {};
179
176
  for (const [name, allowed] of Object.entries(rawAllowBuilds)) {
180
177
  if (typeof allowed !== 'boolean')
@@ -193,16 +190,6 @@ export function readDistributionProfile(distributionDirectory) {
193
190
  throw new Error('dshPlus.profile.overrides.' + name + ' must be a non-empty string');
194
191
  overrides[name] = spec;
195
192
  }
196
- const editions = {};
197
- const rawEditions = plus.editions === undefined ? {} : requireRecord(plus.editions, 'dshPlus.editions');
198
- for (const [id, value] of Object.entries(rawEditions)) {
199
- const edition = requireRecord(value, 'dshPlus.editions.' + id);
200
- editions[id] = {
201
- label: requireString(edition.label, 'dshPlus.editions.' + id + '.label'),
202
- bundles: requireStringArray(edition.bundles, 'dshPlus.editions.' + id + '.bundles'),
203
- packages: requireDependencyMap(requireRecord(edition.packages, 'dshPlus.editions.' + id + '.packages'), 'dshPlus.editions.' + id + '.packages'),
204
- };
205
- }
206
193
  const compatibility = requireRecord(plus.compatibility, 'dshPlus.compatibility');
207
194
  return {
208
195
  name: String(manifest.name),
@@ -210,21 +197,10 @@ export function readDistributionProfile(distributionDirectory) {
210
197
  dependencies,
211
198
  allowBuilds,
212
199
  overrides,
213
- editions,
214
200
  dshRange: String(compatibility.dsh),
215
201
  version: String(manifest.version),
216
202
  };
217
203
  }
218
- /** Read one package-name-to-spec map, rejecting empty entries. */
219
- function requireDependencyMap(value, label) {
220
- const dependencies = {};
221
- for (const [name, spec] of Object.entries(value)) {
222
- if (typeof spec !== 'string' || spec === '')
223
- throw new Error(label + '.' + name + ' must be a non-empty string');
224
- dependencies[name] = spec;
225
- }
226
- return dependencies;
227
- }
228
204
  /**
229
205
  * Give the profile its own installed tree, built from the distribution's declarations.
230
206
  *
@@ -246,12 +222,7 @@ function requireDependencyMap(value, label) {
246
222
  export function installProfilePackages(paths, consumerDirectory) {
247
223
  const consumerModules = join(consumerDirectory, 'node_modules');
248
224
  if (!existsSync(consumerModules)) {
249
- // `npx @sparkelf/dsh-plus` runs from a temporary package tree that has no launcher
250
- // beside it. The profile installs its own tree, so there is nothing to link from
251
- // the caller; only the profile's packages matter.
252
- installWithRegistryFallback(paths);
253
- alignReplacedPackageNames(join(paths.profileDirectory, 'node_modules'));
254
- return;
225
+ throw new Error('no node_modules in ' + consumerDirectory + '; run npm install there first');
255
226
  }
256
227
  const profileModules = join(paths.profileDirectory, 'node_modules');
257
228
  if (existsSync(profileModules)) {
@@ -276,18 +247,10 @@ export function installProfilePackages(paths, consumerDirectory) {
276
247
  function installWithRegistryFallback(paths) {
277
248
  const registries = registryOrder();
278
249
  for (const [index, registry] of registries.entries()) {
279
- // A lockfile written against the previous registry keeps its resolved URLs, so the
280
- // second attempt would fetch from the registry that just failed. Drop it and resolve
281
- // against the registry being tried.
282
- if (index > 0)
283
- rmSync(join(paths.profileDirectory, 'pnpm-lock.yaml'), { force: true });
284
250
  const result = spawnSync('pnpm', ['install', '--no-frozen-lockfile', '--registry', registry], {
285
251
  cwd: paths.profileDirectory,
286
252
  stdio: 'inherit',
287
253
  shell: process.platform === 'win32',
288
- // A registry that accepts the connection but never answers would otherwise hold the
289
- // first start for pnpm's full retry budget before the fallback got a chance.
290
- timeout: 5 * 60_000,
291
254
  });
292
255
  if (result.error !== undefined)
293
256
  throw result.error;
@@ -350,12 +313,8 @@ const MAINLAND_REGISTRY = 'https://registry.npmmirror.com';
350
313
  */
351
314
  export function registryOrder() {
352
315
  const configured = process.env.DSH_PLUS_INSTALL_REGISTRY;
353
- if (configured !== undefined && configured !== '') {
354
- // The fallback must be the other registry, not the configured one again: an override
355
- // set to the mirror used to fall back to the same mirror and fail twice.
356
- const fallback = configured === MAINLAND_REGISTRY ? OFFICIAL_REGISTRY : MAINLAND_REGISTRY;
357
- return [configured, fallback];
358
- }
316
+ if (configured !== undefined && configured !== '')
317
+ return [configured, MAINLAND_REGISTRY];
359
318
  // Intl reports the system locale on every platform. The POSIX variables are empty on
360
319
  // Windows, so reading them alone classified every Windows console as non-mainland and
361
320
  // reached the origin first — measured in a consumer's log, which showed npmjs failing
@@ -472,61 +431,12 @@ export function resolvePaths(anchor, env = process.env) {
472
431
  *
473
432
  * @param paths - resolved standalone paths.
474
433
  * @param consumerDirectory - directory whose `node_modules` holds the installed packages.
475
- * @param edition - edition id whose package list to install, or undefined for the default.
476
434
  * @returns whether this call created the manifest.
477
435
  */
478
- export function ensureProfile(paths, consumerDirectory, edition) {
436
+ export function ensureProfile(paths, consumerDirectory) {
479
437
  const manifestPath = join(paths.profileDirectory, 'package.json');
480
438
  const distribution = readDistributionProfile(paths.distributionDirectory);
481
- const composition = edition === undefined ? undefined : distribution.editions[edition];
482
- if (edition !== undefined && composition === undefined) {
483
- const offered = Object.keys(distribution.editions);
484
- throw new Error('unknown edition "' + edition + '"; this release offers '
485
- + (offered.length === 0 ? '(none)' : offered.join(', ')));
486
- }
487
- // An edition lists only third-party, fork, and self-developed plugins. The official
488
- // runtime is the CLI's responsibility and must not be duplicated in that list.
489
- for (const name of Object.keys(composition?.packages ?? {})) {
490
- if (name.startsWith('@deepseek-ai/')) {
491
- throw new Error('edition "' + String(edition) + '" lists the official package ' + name
492
- + '; editions contain only third-party or self-developed plugins');
493
- }
494
- }
495
- const runtime = distribution.dshRange.replace(/^>=?/u, '');
496
- const baseBundles = composition === undefined
497
- ? distribution.bundles
498
- : distribution.bundles.filter(bundle => bundle.startsWith('@deepseek-ai/') || bundle === '@sparkelf/dsh-plus');
499
- const basePackages = composition === undefined
500
- ? distribution.dependencies
501
- : {
502
- '@deepseek-ai/dsh': distribution.dshRange,
503
- '@sparkelf/dsh-plus': distribution.version,
504
- ...Object.fromEntries(baseBundles
505
- .filter(bundle => bundle.startsWith('@deepseek-ai/dsh-'))
506
- .map(bundle => [bundle, runtime])),
507
- };
508
- const compositionPackages = composition === undefined
509
- ? basePackages
510
- : { ...basePackages, ...composition.packages };
511
- const compositionBundles = composition === undefined
512
- ? baseBundles
513
- : [...baseBundles, ...composition.bundles];
514
439
  if (existsSync(manifestPath)) {
515
- // A selected edition is an explicit install choice, so its packages and bundle order
516
- // replace the profile's rather than being ignored. Other profile decisions stay.
517
- if (composition !== undefined) {
518
- const manifest = requireRecord(JSON.parse(readFileSync(manifestPath, 'utf8')), 'Plus profile manifest');
519
- manifest.dependencies = { ...manifest.dependencies, ...compositionPackages };
520
- manifest.dsh = {
521
- ...manifest.dsh,
522
- profile: {
523
- ...manifest.dsh?.profile,
524
- bundles: [...compositionBundles],
525
- ...(edition === undefined ? {} : { plusEdition: edition }),
526
- },
527
- };
528
- writeFileSync(manifestPath, JSON.stringify(manifest, null, 2) + '\n');
529
- }
530
440
  // The workspace carries decisions the distribution owns — overrides and the build
531
441
  // script allowlist — and a distribution release changes them. Rewriting on every
532
442
  // start is what lets an upgraded installation receive the new values; a profile
@@ -540,12 +450,18 @@ export function ensureProfile(paths, consumerDirectory, edition) {
540
450
  name: 'dsh-profile-' + STANDALONE_PROFILE,
541
451
  private: true,
542
452
  type: 'module',
543
- dependencies: compositionPackages,
453
+ dependencies: {
454
+ '@sparkelf/dsh-plus': distribution.version,
455
+ // The launcher's own tree supplies every service package the bundles mount. A
456
+ // profile that lists only the distribution's plugins installs a partial tree and
457
+ // fails at load with a module the launcher would have carried.
458
+ '@deepseek-ai/dsh': distribution.dshRange,
459
+ ...distribution.dependencies,
460
+ },
544
461
  dsh: {
545
462
  profile: {
546
- bundles: [...compositionBundles],
463
+ bundles: distribution.bundles,
547
464
  patchReload: 'live',
548
- ...(edition === undefined ? {} : { plusEdition: edition }),
549
465
  },
550
466
  },
551
467
  };
@@ -624,8 +540,6 @@ export function applyProfileNpmPatches(distributionDirectory, profileDirectory)
624
540
  const patchSet = readPatchSet(distributionDirectory, manifest);
625
541
  const applied = [];
626
542
  for (const entry of [...patchSet.entries, ...patchSet.thirdPartyPatches]) {
627
- // Only npm targets reach an installed package; a source target needs the
628
- // official checkout, which a standalone installation does not have.
629
543
  if (entry.target.kind !== 'npm')
630
544
  continue;
631
545
  const targetName = entry.target.name;
@@ -646,22 +560,7 @@ function resolveInstalledPackage(from, packageName) {
646
560
  manifestPath = requireFrom.resolve(packageName + '/package.json');
647
561
  }
648
562
  catch {
649
- // Some packages do not export `./package.json`; resolve the entry module instead and walk
650
- // up to the directory that holds the manifest.
651
- let directory;
652
- try {
653
- directory = dirname(requireFrom.resolve(packageName));
654
- }
655
- catch {
656
- throw new Error(packageName + ' is not installed under ' + from);
657
- }
658
- while (!existsSync(resolve(directory, 'package.json'))) {
659
- const parent = dirname(directory);
660
- if (parent === directory)
661
- throw new Error(packageName + ' has no resolvable package manifest under ' + from);
662
- directory = parent;
663
- }
664
- manifestPath = resolve(directory, 'package.json');
563
+ throw new Error(packageName + ' is not installed under ' + from);
665
564
  }
666
565
  const manifest = requireRecord(JSON.parse(readFileSync(manifestPath, 'utf8')), packageName + ' manifest');
667
566
  return { name: packageName, version: String(manifest.version), directory: dirname(manifestPath), manifest };
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@sparkelf/dsh-plus",
3
3
  "description": "DeepSeek Harness Plus official-base Web distribution profile and ranged compatibility patchset",
4
- "version": "0.2.2-alpha.2.3",
4
+ "version": "0.2.2-alpha.2.30",
5
5
  "publishConfig": {
6
6
  "access": "public"
7
7
  },
@@ -65,27 +65,41 @@
65
65
  "@sparkelf/dsh-api-client",
66
66
  "dsh-right-bg-anim",
67
67
  "@sparkelf/dsh-mobile-bridge",
68
- "@sparkelf/dsh-quant",
69
- "@sparkelf/dsh-client-ui-diagram-viewer"
68
+ "@sparkelf/dsh-quant"
70
69
  ],
71
70
  "dependencies": {
72
71
  "@sparkelf/dsh-mineru": "0.1.4",
73
72
  "@sparkelf/dsh-officecli": "0.1.4",
74
73
  "@sparkelf/dsh-plugin-supervisor": "0.1.9",
75
- "dsh-sql-workbench": "0.5.3",
74
+ "dsh-sql-workbench": "npm:@sparkelf/dsh-sql-workbench@0.5.4-sparkelf.1",
76
75
  "@sparkelf/dsh-workbench-vault": "0.1.2",
77
- "@sparkelf/dsh-ssh-manager": "0.7.4",
76
+ "@sparkelf/dsh-ssh-manager": "0.7.5",
78
77
  "@sparkelf/dsh-api-client": "0.5.3",
79
- "dsh-better-sidebar": "0.28.0",
80
- "@sparkelf/dsh-office-viewer-fonts": "0.1.5",
78
+ "dsh-better-sidebar": "npm:@sparkelf/dsh-better-sidebar@0.29.0-sparkelf.17",
79
+ "@sparkelf/dsh-office-viewer-fonts": "0.1.6",
81
80
  "dsh-video-preview": "0.1.4",
82
81
  "dsh-right-bg-anim": "1.1.0",
83
- "@deepseek-ai/dsh-experimental-agent-team-profile": ">=0.2.2-alpha.2",
82
+ "@deepseek-ai/dsh-experimental-agent-team-profile": "0.2.2-alpha.2",
84
83
  "@sparkelf/dsh-mobile-bridge": "0.2.18",
85
84
  "@sparkelf/dsh-quant": "0.91.0-sparkelf.13",
85
+ "@sparkelf/dsh-task-bus": "0.1.2",
86
86
  "@deepseek-ai/dsh-experimental-auto-review": "0.2.2-alpha.2",
87
- "@sparkelf/dsh-genui": "0.13.0-sparkelf.3",
88
- "@sparkelf/dsh-client-ui-diagram-viewer": "0.2.1-alpha.28"
87
+ "@sparkelf/dsh-genui": "0.15.0-sparkelf.1",
88
+ "@deepseek-ai/dsh-anonymous-user-id": "0.2.2-alpha.2",
89
+ "@deepseek-ai/dsh-attachment": "0.2.2-alpha.2",
90
+ "@deepseek-ai/dsh-compaction": "0.2.2-alpha.2",
91
+ "@deepseek-ai/dsh-deepseek-account": "0.2.2-alpha.2",
92
+ "@deepseek-ai/dsh-fs": "0.2.2-alpha.2",
93
+ "@deepseek-ai/dsh-jobs": "0.2.2-alpha.2",
94
+ "@deepseek-ai/dsh-llm-deepseek": "0.2.2-alpha.2",
95
+ "@deepseek-ai/dsh-ptc-runtime": "0.2.2-alpha.2",
96
+ "@deepseek-ai/dsh-sandbox": "0.2.2-alpha.2",
97
+ "@deepseek-ai/dsh-session-persistence": "0.2.2-alpha.2",
98
+ "@deepseek-ai/dsh-session-telemetry": "0.2.2-alpha.2",
99
+ "@deepseek-ai/dsh-session-title-llm": "0.2.2-alpha.2",
100
+ "@deepseek-ai/dsh-shell": "0.2.2-alpha.2",
101
+ "@deepseek-ai/dsh-spill": "0.2.2-alpha.2",
102
+ "@deepseek-ai/dsh-workflow": "0.2.2-alpha.2"
89
103
  },
90
104
  "allowBuilds": {
91
105
  "@deepseek-ai/dsh-subprocess-local": true,
@@ -132,7 +146,8 @@
132
146
  "@deepseek-ai/dsh-client-ui-schedule": "npm:@sparkelf/dsh-client-ui-schedule@0.2.2-alpha.2",
133
147
  "@deepseek-ai/dsh-client-ui-sidebar-right": "npm:@sparkelf/dsh-client-ui-sidebar-right@0.2.2-alpha.2",
134
148
  "@deepseek-ai/dsh-atomic-write": "npm:@sparkelf/dsh-atomic-write@0.2.2-alpha.2",
135
- "@deepseek-ai/dsh-tool-executor-ptc": "npm:@sparkelf/dsh-tool-executor-ptc@0.2.2-alpha.2"
149
+ "@deepseek-ai/dsh-tool-executor-ptc": "npm:@sparkelf/dsh-tool-executor-ptc@0.2.2-alpha.2",
150
+ "@deepseek-ai/dsh-client-ui-slots": "0.2.2-alpha.2"
136
151
  },
137
152
  "standaloneVariants": {
138
153
  "dataops": {
@@ -499,6 +514,21 @@
499
514
  "file": "./patches/ui-settings-compact-phone.patch",
500
515
  "retireWhen": "官方 ui-settings-general 为窄屏提供手机布局后退役"
501
516
  },
517
+ {
518
+ "id": "ui-schedule-plaza-tab",
519
+ "dsh": ">=0.2.2-alpha.2",
520
+ "target": {
521
+ "kind": "dsh-source",
522
+ "paths": [
523
+ "packages/client/ui-schedule/"
524
+ ],
525
+ "packages": [
526
+ "@deepseek-ai/dsh-client-ui-schedule"
527
+ ]
528
+ },
529
+ "file": "./patches/ui-schedule-plaza-tab.patch",
530
+ "retireWhen": "官方 ui-schedule 自动化任务页自行声明并渲染 schedule.manager.tabs 座位后退役"
531
+ },
502
532
  {
503
533
  "id": "web-runtime-compat",
504
534
  "dsh": ">=0.2.2-alpha.2",
@@ -566,8 +596,7 @@
566
596
  "@sparkelf/dsh-api-client",
567
597
  "dsh-right-bg-anim",
568
598
  "@sparkelf/dsh-mobile-bridge",
569
- "@sparkelf/dsh-quant",
570
- "@sparkelf/dsh-client-ui-diagram-viewer"
599
+ "@sparkelf/dsh-quant"
571
600
  ],
572
601
  "packages": {
573
602
  "@sparkelf/dsh-mineru": "0.1.4",
@@ -582,7 +611,6 @@
582
611
  "@sparkelf/dsh-mobile-bridge": "0.2.18",
583
612
  "@sparkelf/dsh-quant": "0.91.0-sparkelf.13",
584
613
  "@sparkelf/dsh-genui": "0.15.0-sparkelf.1",
585
- "@sparkelf/dsh-client-ui-diagram-viewer": "0.2.1-alpha.28",
586
614
  "@sparkelf/dsh-sql-workbench": "0.5.4-sparkelf.1",
587
615
  "@sparkelf/dsh-better-sidebar": "0.29.0-sparkelf.2"
588
616
  }
@@ -600,7 +628,6 @@
600
628
  "@sparkelf/dsh-ssh-manager",
601
629
  "@sparkelf/dsh-api-client",
602
630
  "dsh-right-bg-anim",
603
- "@sparkelf/dsh-client-ui-diagram-viewer",
604
631
  "@sparkelf/dsh-dataops-managed",
605
632
  "@sparkelf/dsh-query-result-analysis",
606
633
  "@sparkelf/dsh-better-sidebar",
@@ -610,14 +637,14 @@
610
637
  "@sparkelf/dsh-ocr",
611
638
  "@sparkelf/dsh-dataops-account",
612
639
  "@sparkelf/dsh-kb-citation",
613
- "@sparkelf/dsh-task-bus"
640
+ "@sparkelf/dsh-task-bus",
641
+ "dsh-video-preview"
614
642
  ],
615
643
  "packages": {
616
644
  "@sparkelf/dsh-api-client": "0.5.3",
617
- "@sparkelf/dsh-client-ui-diagram-viewer": "0.2.1-alpha.28",
618
- "@sparkelf/dsh-dataops-managed": "0.3.21",
645
+ "@sparkelf/dsh-dataops-managed": "0.3.22",
619
646
  "@sparkelf/dsh-genui": "0.15.0-sparkelf.1",
620
- "@sparkelf/dsh-knowledge-base": "0.1.21",
647
+ "@sparkelf/dsh-knowledge-base": "0.1.24",
621
648
  "@sparkelf/dsh-mineru": "0.1.4",
622
649
  "@sparkelf/dsh-office-viewer-fonts": "0.1.6",
623
650
  "@sparkelf/dsh-officecli": "0.1.4",
@@ -625,14 +652,14 @@
625
652
  "@sparkelf/dsh-ssh-manager": "0.7.5",
626
653
  "@sparkelf/dsh-workbench-vault": "0.1.2",
627
654
  "dsh-right-bg-anim": "1.1.0",
628
- "@sparkelf/dsh-task-bus": "0.1.0",
629
- "@sparkelf/dsh-credential-manager": "0.1.0",
655
+ "@sparkelf/dsh-task-bus": "0.1.2",
656
+ "@sparkelf/dsh-credential-manager": "0.1.3",
630
657
  "@sparkelf/dsh-dataops-account": "0.2.0",
631
658
  "@sparkelf/dsh-group-chat": "0.5.1",
632
659
  "@sparkelf/dsh-kb-citation": "0.1.3",
633
660
  "@sparkelf/dsh-ocr": "0.1.0",
634
661
  "@sparkelf/dsh-query-result-analysis": "0.1.4",
635
- "@sparkelf/dsh-better-sidebar": "0.29.0-sparkelf.2",
662
+ "@sparkelf/dsh-better-sidebar": "0.29.0-sparkelf.17",
636
663
  "dsh-video-preview": "0.1.4",
637
664
  "@sparkelf/dsh-sql-workbench": "0.5.4-sparkelf.1"
638
665
  }
@@ -640,14 +667,14 @@
640
667
  }
641
668
  },
642
669
  "dependencies": {
643
- "@deepseek-ai/dsh-computer-use": ">=0.2.2-alpha.2",
644
- "@deepseek-ai/dsh-experimental-computer-use-cua-driver-mcp": ">=0.2.2-alpha.2",
645
- "@deepseek-ai/dsh-tool-session-query": ">=0.2.2-alpha.2",
646
- "@deepseek-ai/dsh-web-search-exa": ">=0.1.6-alpha.1",
647
- "@sparkelf/dsh-client-ui-skill-center": ">=0.2.1-alpha.1",
670
+ "@deepseek-ai/dsh-computer-use": "workspace:>=0.2.2-alpha.2",
671
+ "@deepseek-ai/dsh-experimental-computer-use-cua-driver-mcp": "workspace:>=0.2.2-alpha.2",
672
+ "@deepseek-ai/dsh-tool-session-query": "workspace:>=0.2.2-alpha.2",
673
+ "@deepseek-ai/dsh-web-search-exa": "workspace:>=0.1.6-alpha.1",
674
+ "@sparkelf/dsh-client-ui-skill-center": "workspace:>=0.2.1-alpha.1",
648
675
  "@sparkelf/dsh-image-hoist": ">=0.1.3",
649
- "@sparkelf/dsh-plugin-backup": ">=0.2.1-alpha.1",
650
- "@sparkelf/dsh-plugin-mcp-credentials": ">=0.2.1-alpha.1",
676
+ "@sparkelf/dsh-plugin-backup": "workspace:>=0.2.1-alpha.1",
677
+ "@sparkelf/dsh-plugin-mcp-credentials": "workspace:>=0.2.1-alpha.1",
651
678
  "dshmarket": ">=1.66.7",
652
679
  "semver": ">=7.7.3",
653
680
  "yaml": ">=2.9.0"
@@ -657,8 +684,8 @@
657
684
  },
658
685
  "devDependencies": {
659
686
  "@changfenhuang/dsh-genui": "0.9.9",
660
- "@types/semver": ">=7.7.1",
661
- "@deepseek-ai/cordis": "^4.0.2"
687
+ "@deepseek-ai/cordis": "workspace:^",
688
+ "@types/semver": ">=7.7.1"
662
689
  },
663
690
  "bin": {
664
691
  "dsh-plus": "lib/bin.js"
@@ -666,6 +693,6 @@
666
693
  "optionalDependencies": {
667
694
  "@deepseek-ai/dsh-computer-use": ">=0.2.2-alpha.2",
668
695
  "@deepseek-ai/dsh-experimental-computer-use-cua-driver-mcp": ">=0.2.2-alpha.2",
669
- "@deepseek-ai/dsh-web-search-exa": ">=0.1.6-alpha.1"
696
+ "@deepseek-ai/dsh-web-search-exa": "workspace:>=0.1.6-alpha.1"
670
697
  }
671
- }
698
+ }