@deepseek-ai/dsh-app-boot 0.1.7-rc.1 → 0.2.0-rc.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.i18n.yaml +72 -5
- package/README.md +2 -3
- package/README.zh.md +2 -3
- package/lib/index.js +50 -33
- package/lib/types/config-schema/index.d.ts +3 -4
- package/lib/types/index.d.ts +1 -1
- package/lib/types/profile.d.ts +22 -12
- package/lib/worker/profile-resolution-bootstrap.js +16 -6
- package/package.json +12 -12
package/README.i18n.yaml
CHANGED
|
@@ -1,6 +1,73 @@
|
|
|
1
|
-
# Bilingual-pair consistency record (docs/i18n/README.md):
|
|
2
|
-
#
|
|
3
|
-
#
|
|
1
|
+
# Bilingual-pair consistency record for README.md (docs/i18n/README.md): per heading
|
|
2
|
+
# section, a hash of its English and Chinese blocks outside code blocks and generated regions.
|
|
3
|
+
# After editing either side, bring the other along and re-record with:
|
|
4
4
|
# pnpm run verify-translation-pairing --write packages/boot/app-boot/README.md
|
|
5
|
-
|
|
6
|
-
|
|
5
|
+
/:
|
|
6
|
+
en: 822ef8977098c703
|
|
7
|
+
zh: c0673e854310840f
|
|
8
|
+
/deepseek-ai-dsh-app-boot:
|
|
9
|
+
en: fdb73259898590a5
|
|
10
|
+
zh: aee057cd436da2e2
|
|
11
|
+
/deepseek-ai-dsh-app-boot/summary:
|
|
12
|
+
en: e5db70f7cdcdbe9c
|
|
13
|
+
zh: 6852efb61109a349
|
|
14
|
+
/deepseek-ai-dsh-app-boot/table-of-contents:
|
|
15
|
+
en: d152484eb41ac6b4
|
|
16
|
+
zh: 09388d293f9be9cb
|
|
17
|
+
/deepseek-ai-dsh-app-boot/use-this-package:
|
|
18
|
+
en: f6fa378225009c8f
|
|
19
|
+
zh: 324c0e4640bb1358
|
|
20
|
+
/deepseek-ai-dsh-app-boot/use-this-package/when-to-use-it:
|
|
21
|
+
en: 2fdfe02f2ed4a258
|
|
22
|
+
zh: d748228ece579c4a
|
|
23
|
+
/deepseek-ai-dsh-app-boot/use-this-package/starting-the-app:
|
|
24
|
+
en: 1099528bde0e2aee
|
|
25
|
+
zh: b68772bdb9bb7856
|
|
26
|
+
/deepseek-ai-dsh-app-boot/use-this-package/profiles:
|
|
27
|
+
en: d50b0fdaf62353dd
|
|
28
|
+
zh: 0fccb6968602e5de
|
|
29
|
+
/deepseek-ai-dsh-app-boot/use-this-package/previewing-the-effective-configuration:
|
|
30
|
+
en: 646a0ccdd7881ad1
|
|
31
|
+
zh: e3696acb1573dd7b
|
|
32
|
+
/deepseek-ai-dsh-app-boot/use-this-package/inspecting-plugin-configuration-schemas:
|
|
33
|
+
en: c4a301652b851ce9
|
|
34
|
+
zh: 784871e19cd9db0a
|
|
35
|
+
/deepseek-ai-dsh-app-boot/use-this-package/reading-plugin-display-metadata:
|
|
36
|
+
en: 480ad3a4d96112f0
|
|
37
|
+
zh: 10a92f1013aa5ac4
|
|
38
|
+
/deepseek-ai-dsh-app-boot/use-this-package/startup-and-reload-failures:
|
|
39
|
+
en: 09890e218ab49c84
|
|
40
|
+
zh: e3d86597e7fb1adb
|
|
41
|
+
/deepseek-ai-dsh-app-boot/use-this-package/telling-the-agent-where-the-harness-lives:
|
|
42
|
+
en: 07c459f26f4f8517
|
|
43
|
+
zh: 210f1e4894731b1a
|
|
44
|
+
/deepseek-ai-dsh-app-boot/understand-the-implementation:
|
|
45
|
+
en: f4a2695cb4c8a570
|
|
46
|
+
zh: 89837235d2f376cf
|
|
47
|
+
/deepseek-ai-dsh-app-boot/understand-the-implementation/design-notes:
|
|
48
|
+
en: 4ac0c33806b5a5b2
|
|
49
|
+
zh: cdb56f3adfcb4364
|
|
50
|
+
/deepseek-ai-dsh-app-boot/understand-the-implementation/helper-behavior:
|
|
51
|
+
en: f7bc3a8dd4b00bdd
|
|
52
|
+
zh: 30098428aa769ad0
|
|
53
|
+
/deepseek-ai-dsh-app-boot/understand-the-implementation/source-map:
|
|
54
|
+
en: 25602fd8eb9b2907
|
|
55
|
+
zh: 870a33dd34a52c32
|
|
56
|
+
/deepseek-ai-dsh-app-boot/further-exploration:
|
|
57
|
+
en: ffd10e94443a10ca
|
|
58
|
+
zh: cd11495bae751bdd
|
|
59
|
+
/deepseek-ai-dsh-app-boot/model-experience:
|
|
60
|
+
en: 769777f1cb1a9408
|
|
61
|
+
zh: f02b2834179df50d
|
|
62
|
+
/deepseek-ai-dsh-app-boot/model-experience/kv-cache-effect:
|
|
63
|
+
en: c4d49630b68ae896
|
|
64
|
+
zh: 6f450ec6ba39bb81
|
|
65
|
+
/deepseek-ai-dsh-app-boot/known-limitations-and-deferred-work:
|
|
66
|
+
en: bf1a49013cad8e9c
|
|
67
|
+
zh: 41b2b010f8650ec3
|
|
68
|
+
/deepseek-ai-dsh-app-boot/known-limitations-and-deferred-work/dev-note:
|
|
69
|
+
en: d2f0d68fe29fb750
|
|
70
|
+
zh: 323d21ee73a9e3f6
|
|
71
|
+
/deepseek-ai-dsh-app-boot/known-limitations-and-deferred-work/dev-note/open-yaml-config-dump-stability:
|
|
72
|
+
en: 032f14ed5cd78efa
|
|
73
|
+
zh: ecc81f819f0bc39b
|
package/README.md
CHANGED
|
@@ -47,11 +47,11 @@ const ctx = await boot('dsh', resolveConfigPath(argv[2], process.env.DSH_SNAPSHO
|
|
|
47
47
|
|
|
48
48
|
Import profile and bundle declaration types from [`@deepseek-ai/dsh-package-manifest`](../../util/package-manifest/README.md). App-boot adapts `DshPackageManifest` to `ProfileManifest` with optional package identity because local profiles need no published version. App-boot owns profile loading, JSON validation, and resolved runtime data.
|
|
49
49
|
|
|
50
|
-
A profile is how one dsh installation ships different app surfaces: `web`, `headless`, `acp`, `sdk`, and `sdk-minimal` start distinct compositions from the same launcher. A profile lives at `$DSH_HOME/profiles/<name>` and combines installable bundles with its own `cordis.patch.yml`. A bundle's `dsh.bundle.patch` names one patch file or an ordered list of files; `bundlePatchFiles` validates the declaration and `bundlePatchPaths` resolves it to absolute paths; the layer concatenates their patch lists in that order. The YAML composition enables or disables HMR. The shipped `web` template uses live reload, while the other shipped templates apply patches only at startup. `sdk-minimal` names only its standalone bundle; the other templates retain base-plus-mode stacks. `dsh --profile <name> --from-default-profile <template>` creates a custom profile at a new non-shipped name from one shipped template, while `dsh plugin` initializes a base-backed profile and manages its installed bundles. Bundle resolution, manifest, and patch-loading failures
|
|
50
|
+
A profile is how one dsh installation ships different app surfaces: `web`, `headless`, `acp`, `sdk`, and `sdk-minimal` start distinct compositions from the same launcher. A profile lives at `$DSH_HOME/profiles/<name>` and combines installable bundles with its own `cordis.patch.yml`. A bundle's `dsh.bundle.patch` names one patch file or an ordered list of files; `bundlePatchFiles` validates the declaration and `bundlePatchPaths` resolves it to absolute paths; the layer concatenates their patch lists in that order. The YAML composition enables or disables HMR. The shipped `web` template uses live reload, while the other shipped templates apply patches only at startup. `sdk-minimal` names only its standalone bundle; the other templates retain base-plus-mode stacks. `dsh --profile <name> --from-default-profile <template>` creates a custom profile at a new non-shipped name from one shipped template, while `dsh plugin` initializes a base-backed profile and manages its installed bundles. Bundle resolution, manifest, and patch-loading failures skip that bundle without changing its selection; the loaded profile lists each skip in `skippedBundles`, and the launcher prints them once per start with `reportSkippedBundles`. Remaining bundles keep their order; profile and user-patch errors still fail startup. Skipping a bundle does not guarantee that the remaining composition can provide the required services. Application-owned npm projects, such as Electron's reserved Desktop profile, use `loadProfileDirectory` to load an already initialized directory without exposing it through CLI profile lookup.
|
|
51
51
|
|
|
52
52
|
Before a profile imports a plugin, DSH checks its `peerDependencies` on `@deepseek-ai/dsh` and `@deepseek-ai/dsh-*` against the single runtime version returned by `getDshRuntimeVersion()`. Every declared range must match; prereleases participate in range matching. Source-workspace `workspace:^`, `workspace:~`, and `workspace:*` refer to that same runtime. Missing DSH peers impose no constraint; invalid ranges are incompatible. These checks use peer declarations, not `engines.dsh`, and are not a sandbox against malicious package code.
|
|
53
53
|
|
|
54
|
-
Admission happens only at composition boundaries DSH owns, and a denied row is denied in the launcher's own copy of the composition: no profile patch layer, dependency manifest, or bundle list changes. `prepareProfilePatches` composes over the launcher's empty profile root and runs while the root Include is mounted and on every profile recomposition, so a denied plugin never imports its module. `prepareProfileEntries` does the same for a preset's rows. A denied ordinary row becomes a detached `disabled: true` row; a native group stays mounted and its denied children do not load; a native Include that reaches a denied plugin is omitted whole, because its file is never rewritten. A row denied by policy keeps its configured `disabled` value in the profile, and every refusal is reported with the package, versions, and risk. A bundle is not a row, so `loadProfileDirectory` checks each bundle's own DSH peers when it loads the profile's bundle layers, at startup and on every recomposition; an incompatible bundle without an exemption is skipped like an unreadable one
|
|
54
|
+
Admission happens only at composition boundaries DSH owns, and a denied row is denied in the launcher's own copy of the composition: no profile patch layer, dependency manifest, or bundle list changes. `prepareProfilePatches` composes over the launcher's empty profile root and runs while the root Include is mounted and on every profile recomposition, so a denied plugin never imports its module. `prepareProfileEntries` does the same for a preset's rows. A denied ordinary row becomes a detached `disabled: true` row; a native group stays mounted and its denied children do not load; a native Include that reaches a denied plugin is omitted whole, because its file is never rewritten. A row denied by policy keeps its configured `disabled` value in the profile, and every refusal is reported with the package, versions, and risk. A bundle is not a row, so `loadProfileDirectory` checks each bundle's own DSH peers when it loads the profile's bundle layers, at startup and on every recomposition; an incompatible bundle without an exemption is skipped like an unreadable one and listed in `skippedBundles`. These boundaries do not cover plugins another embedder mounts through its own `ctx.plugin` call. Two edits made directly to files during a session are judged only at the next recomposition or startup: a running plugin's own `package.json` peer declaration, and an entry-list file the Loader reads itself, such as the launcher's root config or a nested `cordis:include` file. `--dump-config` reports the configured composition, so a denied plugin row still appears there while a denied bundle contributes no rows, and `--dump-config-schema` imports each composed module to read its schema; run it only against a profile whose plugins you already trust.
|
|
55
55
|
|
|
56
56
|
Exact-version exemptions live in the profile's own `compatibility.json`, not in its `package.json`, so an exemption write never touches the dependency manifest, the bundle list, or Cordis patch files. It maps exact `package-name@version` keys to lists of exact DSH runtime versions; neither a plugin upgrade nor a DSH upgrade inherits permission. A missing file means no exemptions. A malformed one never stops the profile from starting: records the reader accepts still apply, each rejected record is reported on stderr beside the plugin denials, and the file is then treated as read-only, so a grant or revocation refuses and asks the user to repair it by hand instead of overwriting their content. [Plugin Manager](../plugin-manager/README.md#version-compatibility-and-exemptions) owns the grant, revocation, and risk confirmation each change requires.
|
|
57
57
|
|
|
@@ -194,7 +194,6 @@ Boot itself changes no request prefix. `addHarnessSourceSection` places its sour
|
|
|
194
194
|
|
|
195
195
|
<a id="known-limitations-and-deferred-work"></a>
|
|
196
196
|
|
|
197
|
-
|
|
198
197
|
These limits describe when this boot library is a poor fit or needs special care. They are current package constraints, not a task backlog.
|
|
199
198
|
|
|
200
199
|
- **Runtime resolution depends on Node internals** — supported Node versions require the native builtin-access addon and executable compatibility coverage. Only built Harness-owned Workers receive the runtime resolution bootstrap; third-party Workers and custom `vm` linkers keep native resolution.
|
package/README.zh.md
CHANGED
|
@@ -47,11 +47,11 @@ const ctx = await boot('dsh', resolveConfigPath(argv[2], process.env.DSH_SNAPSHO
|
|
|
47
47
|
|
|
48
48
|
Profile 与组合包的声明类型从 [`@deepseek-ai/dsh-package-manifest`](../../util/package-manifest/README.zh.md) 导入。App-boot 将 `DshPackageManifest` 适配为包身份可选的 `ProfileManifest`,因为本地 profile 无需发布版本。App-boot 负责 profile 加载、JSON 校验和解析后的运行时数据。
|
|
49
49
|
|
|
50
|
-
profile 是同一套 dsh 安装提供不同应用界面的方式:`web`、`headless`、`acp`、`sdk` 与 `sdk-minimal` 从同一 launcher 启动不同组合。profile 位于 `$DSH_HOME/profiles/<name>`,由可安装组合包和自身 `cordis.patch.yml` 组成。组合包的 `dsh.bundle.patch` 指定一个 patch 文件或一个有序的文件列表;`bundlePatchFiles` 校验该声明,`bundlePatchPaths` 把它解析为绝对路径;该层按此顺序拼接各文件的 patch 列表。YAML 组合决定是否启用 HMR。随产品交付的 `web` 模板实时重载,其他随附模板只在启动时应用 patch。`sdk-minimal` 只列出自身的独立组合包,其他模板保留 base 加模式的组合包栈。`dsh --profile <name> --from-default-profile <template>` 从一个随附模板,在新的非内置名称处创建自定义 profile;`dsh plugin` 则初始化以 base 为基础的 profile,并管理其中安装的组合包。组合包解析、manifest 读取或 patch
|
|
50
|
+
profile 是同一套 dsh 安装提供不同应用界面的方式:`web`、`headless`、`acp`、`sdk` 与 `sdk-minimal` 从同一 launcher 启动不同组合。profile 位于 `$DSH_HOME/profiles/<name>`,由可安装组合包和自身 `cordis.patch.yml` 组成。组合包的 `dsh.bundle.patch` 指定一个 patch 文件或一个有序的文件列表;`bundlePatchFiles` 校验该声明,`bundlePatchPaths` 把它解析为绝对路径;该层按此顺序拼接各文件的 patch 列表。YAML 组合决定是否启用 HMR。随产品交付的 `web` 模板实时重载,其他随附模板只在启动时应用 patch。`sdk-minimal` 只列出自身的独立组合包,其他模板保留 base 加模式的组合包栈。`dsh --profile <name> --from-default-profile <template>` 从一个随附模板,在新的非内置名称处创建自定义 profile;`dsh plugin` 则初始化以 base 为基础的 profile,并管理其中安装的组合包。组合包解析、manifest 读取或 patch 加载失败时会跳过该组合包,不改变其选择状态;加载结果在 `skippedBundles` 中列出每个被跳过的组合包,启动器每次启动时通过 `reportSkippedBundles` 输出一次。其余组合包保持原顺序;profile 和用户 patch 错误仍会导致启动失败。跳过组合包不保证剩余组合能够提供所需服务。由应用持有的 npm 项目(例如 Electron 保留的 Desktop profile)通过 `loadProfileDirectory` 加载已经初始化的目录,而不会将它暴露给 CLI profile 查找。
|
|
51
51
|
|
|
52
52
|
profile 导入插件前,DSH 会检查其 `peerDependencies` 中对 `@deepseek-ai/dsh` 和 `@deepseek-ai/dsh-*` 的依赖,与 `getDshRuntimeVersion()` 返回的唯一运行时版本比较。每个声明的版本范围都必须匹配;预发布版本参与范围匹配。源码工作区的 `workspace:^`、`workspace:~` 和 `workspace:*` 指向同一个运行时。未声明 DSH peer 时不施加版本约束;无效范围视为不兼容。这些检查使用 peer 声明,而不是 `engines.dsh`,也不是防范恶意包代码的沙箱。
|
|
53
53
|
|
|
54
|
-
检查只发生在 DSH 自己持有的组合入口,改写的是启动器自己的那份组合:profile 的 patch 层、依赖清单与组合包列表都不会改变。`prepareProfilePatches` 在启动器的空 profile 根之上组合,并在挂载根 Include 时以及每次 profile 重新组合时执行,因此被拒绝的插件永远不会导入其模块;`prepareProfileEntries` 对 preset 行做同样的事。被拒绝的普通行会变成游离的 `disabled: true` 行;原生 group 保持挂载,其被拒绝的子行不会加载;若某个原生 Include 会到达被拒绝的插件,则整体省略该 Include,因为它的文件不会被改写。被策略拒绝的行在 profile 中保留其配置的 `disabled` 值,每次拒绝都会报告包名、版本与风险。组合包本身不是行,因此 `loadProfileDirectory` 在启动和每次重新组合加载 profile 的组合包层时,检查每个组合包自己声明的 DSH peer
|
|
54
|
+
检查只发生在 DSH 自己持有的组合入口,改写的是启动器自己的那份组合:profile 的 patch 层、依赖清单与组合包列表都不会改变。`prepareProfilePatches` 在启动器的空 profile 根之上组合,并在挂载根 Include 时以及每次 profile 重新组合时执行,因此被拒绝的插件永远不会导入其模块;`prepareProfileEntries` 对 preset 行做同样的事。被拒绝的普通行会变成游离的 `disabled: true` 行;原生 group 保持挂载,其被拒绝的子行不会加载;若某个原生 Include 会到达被拒绝的插件,则整体省略该 Include,因为它的文件不会被改写。被策略拒绝的行在 profile 中保留其配置的 `disabled` 值,每次拒绝都会报告包名、版本与风险。组合包本身不是行,因此 `loadProfileDirectory` 在启动和每次重新组合加载 profile 的组合包层时,检查每个组合包自己声明的 DSH peer;没有豁免的不兼容组合包会像无法读取的组合包一样被跳过,并列入 `skippedBundles`。这些入口不覆盖其他嵌入方通过自己的 `ctx.plugin` 调用挂载的插件。会话中直接改文件的两类编辑只在下一次重新组合或启动时才被判定:正在运行的插件自己的 `package.json` peer 声明,以及 Loader 自己读取的入口清单文件(如启动器的根配置或嵌套的 `cordis:include` 文件)。`--dump-config` 报告的是配置出的组合,因此被拒绝的插件行仍会出现在其中,而被拒绝的组合包不提供任何行;`--dump-config-schema` 会导入每个组合模块以读取其 schema,请只对已经信任其插件的 profile 运行。
|
|
55
55
|
|
|
56
56
|
精确版本豁免保存在 profile 自己的 `compatibility.json` 中,而不是 `package.json`,因此写豁免不会触及依赖清单、组合包列表或 Cordis patch 文件。它把精确的 `package-name@version` 键映射到精确 DSH 运行时版本列表;插件升级和 DSH 升级都不继承授权。文件缺失表示没有豁免。文件损坏绝不会阻止 profile 启动:读取器接受的记录仍然生效,每条被拒绝的记录会与插件拒绝信息一起输出到 stderr,此后该文件被视为只读,因此授予或撤销会拒绝执行并要求用户手工修复,而不是覆盖用户的内容。[插件管理器](../plugin-manager/README.zh.md#version-compatibility-and-exemptions)负责每次变更所需的授权、撤销与风险确认。
|
|
57
57
|
|
|
@@ -194,7 +194,6 @@ Loader 结算后,app-boot 在仅 optional 条目未激活时输出警告。如
|
|
|
194
194
|
|
|
195
195
|
<a id="known-limitations-and-deferred-work"></a>
|
|
196
196
|
|
|
197
|
-
|
|
198
197
|
这些限制说明此启动库在何时不合适,或何时需要特别注意。它们是当前包约束,不是任务积压。
|
|
199
198
|
|
|
200
199
|
- **运行时解析依赖 Node 内部机制**——受支持的 Node 版本需要 native builtin access addon 和可执行兼容验证。只有构建后的 Harness 自有 Worker 接收 runtime resolution bootstrap;第三方 Worker 与自定义 `vm` linker 保持原生解析。
|
package/lib/index.js
CHANGED
|
@@ -508,6 +508,14 @@ function bundlePatchPaths(packageDir, bundle) {
|
|
|
508
508
|
return bundlePatchFiles(bundle).map((file) => join(packageDir, file));
|
|
509
509
|
}
|
|
510
510
|
/**
|
|
511
|
+
* Print each skipped bundle once; loading never prints, so launchers call this once per start.
|
|
512
|
+
* @param binName - the diagnostic prefix.
|
|
513
|
+
* @param profile - the loaded profile.
|
|
514
|
+
*/
|
|
515
|
+
function reportSkippedBundles(binName, profile) {
|
|
516
|
+
for (const { packageName, reason } of profile.skippedBundles) process.stderr.write(`${binName}: skipping profile bundle ${JSON.stringify(packageName)}: ${reason}\n`);
|
|
517
|
+
}
|
|
518
|
+
/**
|
|
511
519
|
* Resolve a profile's directory under the Harness home.
|
|
512
520
|
* @param name - the profile name (`dsh --profile <name>`).
|
|
513
521
|
* @param home - the Harness home; defaults to {@link resolveDshHome}.
|
|
@@ -536,10 +544,17 @@ const DEFAULT_PROFILE_BUNDLES = ["@deepseek-ai/dsh-base"];
|
|
|
536
544
|
/**
|
|
537
545
|
* The bundles the dsh installation ships for a person to switch on: each a
|
|
538
546
|
* runtime dependency of the installation that declares `dsh.bundle.patch`,
|
|
539
|
-
*
|
|
540
|
-
* manager
|
|
547
|
+
* an `icon`, and `./locale/*.json` display metadata, selected by no shipped
|
|
548
|
+
* template, and offered switched off by the plugin manager
|
|
549
|
+
* ([rationale](../../../../.agents/notes/implemented/process/2026-09-15-shipped-optional-bundles.md),
|
|
550
|
+
* [admission](../../../../.agents/notes/implemented/architecture/2026-09-21-experimental-capabilities-as-optional-bundles.md)).
|
|
541
551
|
*/
|
|
542
|
-
const OPTIONAL_BUNDLES = [
|
|
552
|
+
const OPTIONAL_BUNDLES = [
|
|
553
|
+
"@deepseek-ai/dsh-experimental-agent-team-profile",
|
|
554
|
+
"@deepseek-ai/dsh-experimental-voice-input-bundle",
|
|
555
|
+
"@deepseek-ai/dsh-experimental-auto-review",
|
|
556
|
+
"@deepseek-ai/dsh-experimental-schedule-bundle"
|
|
557
|
+
];
|
|
543
558
|
const PROFILE_PATCH_TEMPLATE = `# Your patch layer for this dsh profile, applied after every bundle layer:
|
|
544
559
|
# a top-level YAML array of loader patch entries (id-targeted config
|
|
545
560
|
# overrides, disables, and insert lists; \`!!js\` expressions allowed).
|
|
@@ -717,7 +732,7 @@ async function createRuntimeResolution(options) {
|
|
|
717
732
|
const { installAnchor, profile, home = resolveDshHome() } = options;
|
|
718
733
|
const profilesDir = join(home, PROFILES_DIR);
|
|
719
734
|
const manifest = readOptionalProfileManifest(profile);
|
|
720
|
-
const { packageNames, packageDirs, declarers, versions } = collectInstallationScopePackages(installAnchor,
|
|
735
|
+
const { packageNames, packageDirs, declarers, versions } = collectInstallationScopePackages(installAnchor, new Set(profile?.skippedBundles.map((skipped) => skipped.packageName)));
|
|
721
736
|
const profileDeclarers = /* @__PURE__ */ new Map();
|
|
722
737
|
const profileVersions = /* @__PURE__ */ new Map();
|
|
723
738
|
const localPackageNames = profile === void 0 ? [] : installedProfilePackageNames(profile, manifest);
|
|
@@ -753,17 +768,6 @@ function readOptionalProfileManifest(profile) {
|
|
|
753
768
|
throw error;
|
|
754
769
|
}
|
|
755
770
|
}
|
|
756
|
-
/**
|
|
757
|
-
* Identify selected bundles that did not produce a loaded layer.
|
|
758
|
-
* @param profile - loaded profile, when present.
|
|
759
|
-
* @param manifest - its parsed manifest, when present.
|
|
760
|
-
* @returns selected bundle names missing from the loaded layers, for resolution and diagnostics.
|
|
761
|
-
*/
|
|
762
|
-
function skippedProfileBundles(profile, manifest) {
|
|
763
|
-
const selected = manifest?.dsh?.profile?.bundles ?? [];
|
|
764
|
-
const loaded = new Set(profile?.layers.map((layer) => layer.packageName));
|
|
765
|
-
return new Set(selected.filter((name) => !loaded.has(name)));
|
|
766
|
-
}
|
|
767
771
|
/** Return installed direct dependencies that Node resolves before profile fallback. */
|
|
768
772
|
function installedProfilePackageNames(profile, manifest) {
|
|
769
773
|
if (manifest === void 0) return [];
|
|
@@ -905,8 +909,8 @@ function resolveBundleDir(binName, packageName, installAnchor, profileDir) {
|
|
|
905
909
|
* Load an already initialized profile directory without resolving it through
|
|
906
910
|
* the shared Harness home. This is used by application-owned profiles whose
|
|
907
911
|
* package project and lifecycle belong to that application.
|
|
908
|
-
* Unreadable bundles, and bundles whose own dsh peers the profile does not exempt, are
|
|
909
|
-
*
|
|
912
|
+
* Unreadable bundles, and bundles whose own dsh peers the profile does not exempt, are skipped
|
|
913
|
+
* without changing the manifest and listed in `skippedBundles`; nothing is printed.
|
|
910
914
|
* @param binName - the diagnostic prefix on thrown errors.
|
|
911
915
|
* @param dir - absolute profile package directory.
|
|
912
916
|
* @param installAnchor - absolute path of the owning dsh app's package.json.
|
|
@@ -916,6 +920,7 @@ function resolveBundleDir(binName, packageName, installAnchor, profileDir) {
|
|
|
916
920
|
function loadProfileDirectory(binName, dir, installAnchor, options = {}) {
|
|
917
921
|
const bundles = readProfileManifest(binName, dir).dsh?.profile?.bundles ?? [];
|
|
918
922
|
const layers = [];
|
|
923
|
+
const skippedBundles = [];
|
|
919
924
|
const exemptions = bundles.length === 0 ? {} : readProfileVersionExemptions(dir);
|
|
920
925
|
for (const packageName of bundles) try {
|
|
921
926
|
const packageDir = resolveBundleDir(binName, packageName, installAnchor, dir);
|
|
@@ -933,7 +938,10 @@ function loadProfileDirectory(binName, dir, installAnchor, options = {}) {
|
|
|
933
938
|
patches
|
|
934
939
|
});
|
|
935
940
|
} catch (error) {
|
|
936
|
-
|
|
941
|
+
skippedBundles.push({
|
|
942
|
+
packageName,
|
|
943
|
+
reason: String(error)
|
|
944
|
+
});
|
|
937
945
|
}
|
|
938
946
|
const patchPath = join(dir, PROFILE_PATCH_FILENAME);
|
|
939
947
|
const patches = options.userLayer !== false && existsSync(patchPath) ? loadOverlayPatches(binName, patchPath) : [];
|
|
@@ -942,13 +950,14 @@ function loadProfileDirectory(binName, dir, installAnchor, options = {}) {
|
|
|
942
950
|
dir,
|
|
943
951
|
layers,
|
|
944
952
|
patchPath,
|
|
945
|
-
patches
|
|
953
|
+
patches,
|
|
954
|
+
skippedBundles
|
|
946
955
|
};
|
|
947
956
|
}
|
|
948
957
|
/**
|
|
949
958
|
* Load a profile: resolve every `dsh.profile.bundles` entry to its patch
|
|
950
959
|
* layer and parse the profile's own patch file. Unreadable or incompatible bundles
|
|
951
|
-
* are
|
|
960
|
+
* are skipped and listed in `skippedBundles`; profile manifest and user patch errors still throw.
|
|
952
961
|
* @param binName - the diagnostic prefix on thrown errors.
|
|
953
962
|
* @param name - the profile name.
|
|
954
963
|
* @param installAnchor - absolute path of the dsh app's package.json (first resolution anchor).
|
|
@@ -1583,17 +1592,27 @@ function internalModules() {
|
|
|
1583
1592
|
modern
|
|
1584
1593
|
};
|
|
1585
1594
|
}
|
|
1595
|
+
/**
|
|
1596
|
+
* Replace a resolver error's message and the same text in its stack.
|
|
1597
|
+
* Node's module-hooks thread serializes errors and returns the stack accessor as a read-only configurable
|
|
1598
|
+
* data property, so a rejected stack assignment redefines the property value.
|
|
1599
|
+
* @param error - resolver error to update in place.
|
|
1600
|
+
* @param message - replacement message.
|
|
1601
|
+
*/
|
|
1602
|
+
function replaceErrorMessage(error, message) {
|
|
1603
|
+
const { message: originalMessage, stack } = error;
|
|
1604
|
+
error.message = message;
|
|
1605
|
+
/* v8 ignore next -- Node's resolver errors always carry a stack */
|
|
1606
|
+
if (stack === void 0) return;
|
|
1607
|
+
const replaced = stack.replace(originalMessage, message);
|
|
1608
|
+
if (!Reflect.set(error, "stack", replaced)) Object.defineProperty(error, "stack", { value: replaced });
|
|
1609
|
+
}
|
|
1586
1610
|
function throwWithImporter(error, routedParent, parent) {
|
|
1587
1611
|
const code = error.code;
|
|
1588
1612
|
if (error instanceof Error && (code === "ERR_MODULE_NOT_FOUND" || code === "ERR_PACKAGE_PATH_NOT_EXPORTED")) {
|
|
1589
1613
|
const routedPath = fileURLToPath(routedParent);
|
|
1590
1614
|
const parentPath = fileURLToPath(parent);
|
|
1591
|
-
|
|
1592
|
-
const message = originalMessage.replaceAll(routedParent, parent).replaceAll(routedPath, parentPath);
|
|
1593
|
-
const stack = error.stack;
|
|
1594
|
-
error.message = message;
|
|
1595
|
-
/* v8 ignore next -- Node's resolver errors always carry a stack */
|
|
1596
|
-
if (stack !== void 0) error.stack = stack.replace(originalMessage, message);
|
|
1615
|
+
replaceErrorMessage(error, error.message.replaceAll(routedParent, parent).replaceAll(routedPath, parentPath));
|
|
1597
1616
|
}
|
|
1598
1617
|
throw error;
|
|
1599
1618
|
}
|
|
@@ -3144,21 +3163,19 @@ async function collectConfigSchemas(profile, entries, resolution, diagnostics =
|
|
|
3144
3163
|
/** Profile schema generation: composition diagnostics, runtime resolution, and boot-free discovery. */
|
|
3145
3164
|
/**
|
|
3146
3165
|
* Generate JSON Schema for a prepared profile's ordered patch layers without mounting plugins or evaluating expressions.
|
|
3147
|
-
*
|
|
3166
|
+
* Imports, Config getters, and lazy builders execute trusted code. Native validators and
|
|
3148
3167
|
* transform callbacks are not executed. Calls must not overlap another profile-resolution interception; collection
|
|
3149
3168
|
* releases its interception on success or rejection, while Node retains imported modules. Supplied layers are not mutated.
|
|
3150
3169
|
* Profile preparation, layer selection, process streams, and exit policy belong to the caller.
|
|
3151
|
-
* @param binName - the diagnostic prefix on thrown manifest errors.
|
|
3152
3170
|
* @param profile - prepared on-disk profile whose directory anchors root module and include resolution.
|
|
3153
3171
|
* @param layers - already parsed patch lists in application order, including caller-selected home and argv overlays.
|
|
3154
3172
|
* @param installAnchor - package manifest anchoring the installation's runtime dependencies.
|
|
3155
3173
|
* @returns a JSON Schema document with declaration references, partial results, and diagnostics under `x-cordis`.
|
|
3156
|
-
* @throws when
|
|
3174
|
+
* @throws when composition or runtime resolution cannot be prepared.
|
|
3157
3175
|
*/
|
|
3158
|
-
async function generateConfigSchema(
|
|
3176
|
+
async function generateConfigSchema(profile, layers, installAnchor) {
|
|
3159
3177
|
const diagnostics = [];
|
|
3160
|
-
const
|
|
3161
|
-
for (const packageName of skippedProfileBundles(profile, manifest)) diagnostics.push({
|
|
3178
|
+
for (const { packageName } of profile.skippedBundles) diagnostics.push({
|
|
3162
3179
|
level: "error",
|
|
3163
3180
|
message: `Selected profile bundle ${JSON.stringify(packageName)} could not be loaded; repair or remove its bundle selection.`
|
|
3164
3181
|
});
|
|
@@ -4117,4 +4134,4 @@ function addHarnessSourceSection(ctx, sourceRoot) {
|
|
|
4117
4134
|
});
|
|
4118
4135
|
}
|
|
4119
4136
|
//#endregion
|
|
4120
|
-
export { DEFAULT_PROFILE_BUNDLES, FAIL_LOUD_RELEASE_TIMEOUT_MS, HARNESS_SOURCE_SECTION, LOADER_EXPRESSION_SCHEMA, OPTIONAL_BUNDLES, PROFILES_DIR, PROFILE_COMPATIBILITY_FILENAME, PROFILE_PATCH_FILENAME, PROFILE_TEMPLATES, PluginPackages, StartupError, addHarnessSourceSection, auditStartupEntries, boot, bundlePatchFiles, bundlePatchPaths, composeEntries, createConfigProjector, createRuntimeResolution, evaluatePluginCompatibility, generateConfigSchema, getDshRuntimeVersion, initProfile, installFailLoud, isNativeConfigSchema, loadEnv, loadLayeredEnv, loadOptionalPatches, loadOverlayPatches, loadProfile, loadProfileDirectory, mountRootInclude, pluginCompatibilityWarning, prepareProfileEntries, prepareProfilePatches, readPluginMeta, readProfileCompatibility, readProfileManifest, readProfilePatches, readProfilePlugins, readProfileVersionExemptions, reconcileProfilePatches, reconcileProfilePlugins, removeLinkProjections, renderConfigDump, resolveBundleDir, resolveConfigPath, resolveProfileDir, resolveTelemetryPatch, sanitizeProfile, setProfileVersionExemption, writeProfileBundles, writeProfileManifest };
|
|
4137
|
+
export { DEFAULT_PROFILE_BUNDLES, FAIL_LOUD_RELEASE_TIMEOUT_MS, HARNESS_SOURCE_SECTION, LOADER_EXPRESSION_SCHEMA, OPTIONAL_BUNDLES, PROFILES_DIR, PROFILE_COMPATIBILITY_FILENAME, PROFILE_PATCH_FILENAME, PROFILE_TEMPLATES, PluginPackages, StartupError, addHarnessSourceSection, auditStartupEntries, boot, bundlePatchFiles, bundlePatchPaths, composeEntries, createConfigProjector, createRuntimeResolution, evaluatePluginCompatibility, generateConfigSchema, getDshRuntimeVersion, initProfile, installFailLoud, isNativeConfigSchema, loadEnv, loadLayeredEnv, loadOptionalPatches, loadOverlayPatches, loadProfile, loadProfileDirectory, mountRootInclude, pluginCompatibilityWarning, prepareProfileEntries, prepareProfilePatches, readPluginMeta, readProfileCompatibility, readProfileManifest, readProfilePatches, readProfilePlugins, readProfileVersionExemptions, reconcileProfilePatches, reconcileProfilePlugins, removeLinkProjections, renderConfigDump, reportSkippedBundles, resolveBundleDir, resolveConfigPath, resolveProfileDir, resolveTelemetryPatch, sanitizeProfile, setProfileVersionExemption, writeProfileBundles, writeProfileManifest };
|
|
@@ -5,16 +5,15 @@ import type { ConfigSchemaDump } from './types.ts';
|
|
|
5
5
|
export type { ConfigSchemaDump, NativeConfigSchema } from './types.ts';
|
|
6
6
|
/**
|
|
7
7
|
* Generate JSON Schema for a prepared profile's ordered patch layers without mounting plugins or evaluating expressions.
|
|
8
|
-
*
|
|
8
|
+
* Imports, Config getters, and lazy builders execute trusted code. Native validators and
|
|
9
9
|
* transform callbacks are not executed. Calls must not overlap another profile-resolution interception; collection
|
|
10
10
|
* releases its interception on success or rejection, while Node retains imported modules. Supplied layers are not mutated.
|
|
11
11
|
* Profile preparation, layer selection, process streams, and exit policy belong to the caller.
|
|
12
|
-
* @param binName - the diagnostic prefix on thrown manifest errors.
|
|
13
12
|
* @param profile - prepared on-disk profile whose directory anchors root module and include resolution.
|
|
14
13
|
* @param layers - already parsed patch lists in application order, including caller-selected home and argv overlays.
|
|
15
14
|
* @param installAnchor - package manifest anchoring the installation's runtime dependencies.
|
|
16
15
|
* @returns a JSON Schema document with declaration references, partial results, and diagnostics under `x-cordis`.
|
|
17
|
-
* @throws when
|
|
16
|
+
* @throws when composition or runtime resolution cannot be prepared.
|
|
18
17
|
*/
|
|
19
|
-
export declare function generateConfigSchema(
|
|
18
|
+
export declare function generateConfigSchema(profile: Profile, layers: readonly PatchOptions[][], installAnchor: string): Promise<ConfigSchemaDump>;
|
|
20
19
|
//# sourceMappingURL=index.d.ts.map
|
package/lib/types/index.d.ts
CHANGED
|
@@ -34,7 +34,7 @@ declare module '@deepseek-ai/cordis' {
|
|
|
34
34
|
'app-boot/config-reload'(): void;
|
|
35
35
|
}
|
|
36
36
|
}
|
|
37
|
-
export { composeEntries, createRuntimeResolution, DEFAULT_PROFILE_BUNDLES, OPTIONAL_BUNDLES, bundlePatchFiles, bundlePatchPaths, initProfile, removeLinkProjections, loadProfile, loadProfileDirectory, PROFILE_PATCH_FILENAME, PROFILE_TEMPLATES, PROFILES_DIR, readProfileManifest, resolveBundleDir, resolveProfileDir, writeProfileManifest, type Profile, type ProfileLayer, type ProfileManifest, type LinkedRoot, type RuntimeResolutionOptions, type RuntimeResolutionEntry, type RuntimeResolution, type ProfileTemplate, } from './profile.ts';
|
|
37
|
+
export { composeEntries, createRuntimeResolution, DEFAULT_PROFILE_BUNDLES, OPTIONAL_BUNDLES, bundlePatchFiles, bundlePatchPaths, initProfile, removeLinkProjections, loadProfile, loadProfileDirectory, PROFILE_PATCH_FILENAME, PROFILE_TEMPLATES, PROFILES_DIR, readProfileManifest, reportSkippedBundles, resolveBundleDir, resolveProfileDir, writeProfileManifest, type Profile, type ProfileLayer, type SkippedBundle, type ProfileManifest, type LinkedRoot, type RuntimeResolutionOptions, type RuntimeResolutionEntry, type RuntimeResolution, type ProfileTemplate, } from './profile.ts';
|
|
38
38
|
export { PluginPackages, type PluginPackage, type PluginPackagesConfig, } from './profile-resolution/service.ts';
|
|
39
39
|
/**
|
|
40
40
|
* Resolve the config to boot. Replay swaps a `cordis.yml` basename for
|
package/lib/types/profile.d.ts
CHANGED
|
@@ -73,7 +73,22 @@ export interface Profile {
|
|
|
73
73
|
patchPath: string;
|
|
74
74
|
/** The profile's own patches; empty when the file is absent. */
|
|
75
75
|
patches: PatchOptions[];
|
|
76
|
+
/** Selected bundles that contributed no layer, in `dsh.profile.bundles` order, with why. */
|
|
77
|
+
skippedBundles: SkippedBundle[];
|
|
76
78
|
}
|
|
79
|
+
/** A selected bundle the profile could not load, or whose own DSH peers the profile does not exempt. */
|
|
80
|
+
export interface SkippedBundle {
|
|
81
|
+
/** The bundle's package name from `dsh.profile.bundles`. */
|
|
82
|
+
packageName: string;
|
|
83
|
+
/** The resolution, manifest, compatibility, or patch-loading failure. */
|
|
84
|
+
reason: string;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Print each skipped bundle once; loading never prints, so launchers call this once per start.
|
|
88
|
+
* @param binName - the diagnostic prefix.
|
|
89
|
+
* @param profile - the loaded profile.
|
|
90
|
+
*/
|
|
91
|
+
export declare function reportSkippedBundles(binName: string, profile: Pick<Profile, 'skippedBundles'>): void;
|
|
77
92
|
/** One package the runtime resolution supplies at the interception layer. */
|
|
78
93
|
export interface RuntimeResolutionEntry {
|
|
79
94
|
/** Bare package name. */
|
|
@@ -124,8 +139,10 @@ export declare const DEFAULT_PROFILE_BUNDLES: readonly string[];
|
|
|
124
139
|
/**
|
|
125
140
|
* The bundles the dsh installation ships for a person to switch on: each a
|
|
126
141
|
* runtime dependency of the installation that declares `dsh.bundle.patch`,
|
|
127
|
-
*
|
|
128
|
-
* manager
|
|
142
|
+
* an `icon`, and `./locale/*.json` display metadata, selected by no shipped
|
|
143
|
+
* template, and offered switched off by the plugin manager
|
|
144
|
+
* ([rationale](../../../../.agents/notes/implemented/process/2026-09-15-shipped-optional-bundles.md),
|
|
145
|
+
* [admission](../../../../.agents/notes/implemented/architecture/2026-09-21-experimental-capabilities-as-optional-bundles.md)).
|
|
129
146
|
*/
|
|
130
147
|
export declare const OPTIONAL_BUNDLES: readonly string[];
|
|
131
148
|
/**
|
|
@@ -159,13 +176,6 @@ export interface RuntimeResolutionOptions {
|
|
|
159
176
|
* @returns the complete immutable runtime resolution.
|
|
160
177
|
*/
|
|
161
178
|
export declare function createRuntimeResolution(options: RuntimeResolutionOptions): Promise<RuntimeResolution>;
|
|
162
|
-
/**
|
|
163
|
-
* Identify selected bundles that did not produce a loaded layer.
|
|
164
|
-
* @param profile - loaded profile, when present.
|
|
165
|
-
* @param manifest - its parsed manifest, when present.
|
|
166
|
-
* @returns selected bundle names missing from the loaded layers, for resolution and diagnostics.
|
|
167
|
-
*/
|
|
168
|
-
export declare function skippedProfileBundles(profile: Profile | undefined, manifest: ProfileManifest | undefined): ReadonlySet<string>;
|
|
169
179
|
/**
|
|
170
180
|
* Read a profile's manifest.
|
|
171
181
|
* @param binName - the diagnostic prefix on the thrown error.
|
|
@@ -196,8 +206,8 @@ export declare function resolveBundleDir(binName: string, packageName: string, i
|
|
|
196
206
|
* Load an already initialized profile directory without resolving it through
|
|
197
207
|
* the shared Harness home. This is used by application-owned profiles whose
|
|
198
208
|
* package project and lifecycle belong to that application.
|
|
199
|
-
* Unreadable bundles, and bundles whose own dsh peers the profile does not exempt, are
|
|
200
|
-
*
|
|
209
|
+
* Unreadable bundles, and bundles whose own dsh peers the profile does not exempt, are skipped
|
|
210
|
+
* without changing the manifest and listed in `skippedBundles`; nothing is printed.
|
|
201
211
|
* @param binName - the diagnostic prefix on thrown errors.
|
|
202
212
|
* @param dir - absolute profile package directory.
|
|
203
213
|
* @param installAnchor - absolute path of the owning dsh app's package.json.
|
|
@@ -210,7 +220,7 @@ export declare function loadProfileDirectory(binName: string, dir: string, insta
|
|
|
210
220
|
/**
|
|
211
221
|
* Load a profile: resolve every `dsh.profile.bundles` entry to its patch
|
|
212
222
|
* layer and parse the profile's own patch file. Unreadable or incompatible bundles
|
|
213
|
-
* are
|
|
223
|
+
* are skipped and listed in `skippedBundles`; profile manifest and user patch errors still throw.
|
|
214
224
|
* @param binName - the diagnostic prefix on thrown errors.
|
|
215
225
|
* @param name - the profile name.
|
|
216
226
|
* @param installAnchor - absolute path of the dsh app's package.json (first resolution anchor).
|
|
@@ -479,17 +479,27 @@ function internalModules() {
|
|
|
479
479
|
modern
|
|
480
480
|
};
|
|
481
481
|
}
|
|
482
|
+
/**
|
|
483
|
+
* Replace a resolver error's message and the same text in its stack.
|
|
484
|
+
* Node's module-hooks thread serializes errors and returns the stack accessor as a read-only configurable
|
|
485
|
+
* data property, so a rejected stack assignment redefines the property value.
|
|
486
|
+
* @param error - resolver error to update in place.
|
|
487
|
+
* @param message - replacement message.
|
|
488
|
+
*/
|
|
489
|
+
function replaceErrorMessage(error, message) {
|
|
490
|
+
const { message: originalMessage, stack } = error;
|
|
491
|
+
error.message = message;
|
|
492
|
+
/* v8 ignore next -- Node's resolver errors always carry a stack */
|
|
493
|
+
if (stack === void 0) return;
|
|
494
|
+
const replaced = stack.replace(originalMessage, message);
|
|
495
|
+
if (!Reflect.set(error, "stack", replaced)) Object.defineProperty(error, "stack", { value: replaced });
|
|
496
|
+
}
|
|
482
497
|
function throwWithImporter(error, routedParent, parent) {
|
|
483
498
|
const code = error.code;
|
|
484
499
|
if (error instanceof Error && (code === "ERR_MODULE_NOT_FOUND" || code === "ERR_PACKAGE_PATH_NOT_EXPORTED")) {
|
|
485
500
|
const routedPath = fileURLToPath(routedParent);
|
|
486
501
|
const parentPath = fileURLToPath(parent);
|
|
487
|
-
|
|
488
|
-
const message = originalMessage.replaceAll(routedParent, parent).replaceAll(routedPath, parentPath);
|
|
489
|
-
const stack = error.stack;
|
|
490
|
-
error.message = message;
|
|
491
|
-
/* v8 ignore next -- Node's resolver errors always carry a stack */
|
|
492
|
-
if (stack !== void 0) error.stack = stack.replace(originalMessage, message);
|
|
502
|
+
replaceErrorMessage(error, error.message.replaceAll(routedParent, parent).replaceAll(routedPath, parentPath));
|
|
493
503
|
}
|
|
494
504
|
throw error;
|
|
495
505
|
}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@deepseek-ai/dsh-app-boot",
|
|
3
3
|
"description": "Shared boot glue for the app bins: .env loading, fail-loud Loader guards, snapshot-aware config resolution, and the Loader boot sequence",
|
|
4
|
-
"version": "0.
|
|
4
|
+
"version": "0.2.0-rc.1",
|
|
5
5
|
"publishConfig": {
|
|
6
6
|
"access": "public"
|
|
7
7
|
},
|
|
@@ -38,29 +38,29 @@
|
|
|
38
38
|
"node-addon-require-builtin": "^0.1.6",
|
|
39
39
|
"resolve.exports": "^2.0.3",
|
|
40
40
|
"semver": "^7.8.5",
|
|
41
|
-
"@deepseek-ai/dsh-atomic-write": "0.
|
|
42
|
-
"@deepseek-ai/dsh-package-manifest": "0.
|
|
41
|
+
"@deepseek-ai/dsh-atomic-write": "0.2.0-rc.1",
|
|
42
|
+
"@deepseek-ai/dsh-package-manifest": "0.2.0-rc.1"
|
|
43
43
|
},
|
|
44
44
|
"peerDependencies": {
|
|
45
45
|
"@deepseek-ai/cordis-plugin-include": "~1.0.9",
|
|
46
|
+
"@deepseek-ai/cordis-plugin-group": "~1.0.4",
|
|
46
47
|
"@deepseek-ai/cordis-plugin-loader": "~1.0.5",
|
|
47
|
-
"@deepseek-ai/dsh-
|
|
48
|
-
"@deepseek-ai/dsh-
|
|
49
|
-
"@deepseek-ai/dsh-system-prompt": "0.1.7-rc.1",
|
|
48
|
+
"@deepseek-ai/dsh-home-paths": "0.2.0-rc.1",
|
|
49
|
+
"@deepseek-ai/dsh-system-prompt": "0.2.0-rc.1",
|
|
50
50
|
"@deepseek-ai/cordis": "~4.0.4",
|
|
51
|
-
"@deepseek-ai/
|
|
51
|
+
"@deepseek-ai/dsh-launch-environment": "0.2.0-rc.1"
|
|
52
52
|
},
|
|
53
53
|
"devDependencies": {
|
|
54
54
|
"@types/js-yaml": "^4.0.9",
|
|
55
55
|
"@types/semver": "^7.8.0",
|
|
56
56
|
"@deepseek-ai/schemastery": "~3.18.4",
|
|
57
57
|
"@deepseek-ai/cordis-plugin-group": "~1.0.4",
|
|
58
|
+
"@deepseek-ai/cordis-plugin-include": "~1.0.9",
|
|
58
59
|
"@deepseek-ai/cordis-plugin-loader": "~1.0.5",
|
|
59
60
|
"@deepseek-ai/cordis-plugin-timer": "~1.1.6",
|
|
60
|
-
"@deepseek-ai/dsh-launch-environment": "0.
|
|
61
|
-
"@deepseek-ai/
|
|
62
|
-
"@deepseek-ai/
|
|
63
|
-
"@deepseek-ai/dsh-system-prompt": "0.
|
|
64
|
-
"@deepseek-ai/cordis": "~4.0.4"
|
|
61
|
+
"@deepseek-ai/dsh-launch-environment": "0.2.0-rc.1",
|
|
62
|
+
"@deepseek-ai/dsh-home-paths": "0.2.0-rc.1",
|
|
63
|
+
"@deepseek-ai/cordis": "~4.0.4",
|
|
64
|
+
"@deepseek-ai/dsh-system-prompt": "0.2.0-rc.1"
|
|
65
65
|
}
|
|
66
66
|
}
|