@deepseek-ai/dsh-plugin-manager 0.2.1-alpha.2 → 0.2.1-alpha.4
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 +12 -12
- package/README.md +10 -9
- package/README.zh.md +11 -10
- package/lib/index.js +451 -279
- package/lib/typert.host.js +400 -242
- package/lib/typert.remote-client.d.ts +16 -2
- package/lib/typert.remote-client.js +387 -238
- package/lib/types/failure.d.ts +1 -1
- package/lib/types/failure.js +2 -2
- package/lib/types/index.d.ts +20 -0
- package/lib/types/index.js +121 -42
- package/lib/types/operations.d.ts +1 -0
- package/lib/types/operations.js +322 -257
- package/lib/types/patch.d.ts +12 -3
- package/lib/types/patch.js +47 -9
- package/lib/types/tools.js +69 -7
- package/lib/types/types.d.ts +14 -4
- package/locale/en.json +5 -0
- package/locale/tools/en.json +5 -0
- package/locale/tools/zh.json +5 -0
- package/locale/zh.json +6 -0
- package/package.json +39 -35
package/lib/types/patch.d.ts
CHANGED
|
@@ -1,9 +1,18 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
import type { EntryOptions } from '@deepseek-ai/cordis-plugin-loader';
|
|
2
|
+
import { type ProfileContext } from '@deepseek-ai/dsh-app-boot';
|
|
3
|
+
/** Flatten only the groups addressable by the profile's patch composer.
|
|
4
|
+
* @param rows Composed top-level entries.
|
|
5
|
+
* @returns Entries in depth-first order.
|
|
6
|
+
*/
|
|
7
|
+
export declare function flatten(rows: EntryOptions[]): EntryOptions[];
|
|
8
|
+
/** Replace the last matching override or append one after existing insertions. An override that holds only `id` and
|
|
9
|
+
* `disabled`, without anchors, is removed, or not appended, when the bundle layers and the remaining profile patches
|
|
10
|
+
* already give the entry the requested literal `disabled` value; home patches and launch overlays are not consulted.
|
|
11
|
+
* @param profile Profile whose patch file is edited and whose selected bundles supply the compared composition.
|
|
3
12
|
* @param id Unique composition entry id.
|
|
4
13
|
* @param name Module name used to match name-qualified overrides.
|
|
5
14
|
* @param enabled Desired entry enablement.
|
|
6
15
|
* @returns Whether the file changed.
|
|
7
16
|
*/
|
|
8
|
-
export declare function writePluginEnabled(
|
|
17
|
+
export declare function writePluginEnabled(profile: ProfileContext, id: string, name: string, enabled: boolean): Promise<boolean>;
|
|
9
18
|
//# sourceMappingURL=patch.d.ts.map
|
package/lib/types/patch.js
CHANGED
|
@@ -1,16 +1,26 @@
|
|
|
1
|
-
/** Comment-preserving profile plugin enablement edits. */
|
|
1
|
+
/** Comment-preserving profile plugin enablement edits and the entry flattening they compare against. */
|
|
2
2
|
import { readFile } from 'node:fs/promises';
|
|
3
|
-
import { isMap, isSeq, parseDocument } from 'yaml';
|
|
4
|
-
import { loadOptionalPatches } from '@deepseek-ai/dsh-app-boot';
|
|
3
|
+
import { isMap, isNode, isScalar, isSeq, parseDocument } from 'yaml';
|
|
4
|
+
import { composeEntries, loadOptionalPatches, readBundlePatches } from '@deepseek-ai/dsh-app-boot';
|
|
5
5
|
import { writeFileAtomic } from '@deepseek-ai/dsh-atomic-write';
|
|
6
|
-
/**
|
|
7
|
-
* @param
|
|
6
|
+
/** Flatten only the groups addressable by the profile's patch composer.
|
|
7
|
+
* @param rows Composed top-level entries.
|
|
8
|
+
* @returns Entries in depth-first order.
|
|
9
|
+
*/
|
|
10
|
+
export function flatten(rows) {
|
|
11
|
+
return rows.flatMap(row => [row, ...(row.group && Array.isArray(row.config) ? flatten(row.config) : [])]);
|
|
12
|
+
}
|
|
13
|
+
/** Replace the last matching override or append one after existing insertions. An override that holds only `id` and
|
|
14
|
+
* `disabled`, without anchors, is removed, or not appended, when the bundle layers and the remaining profile patches
|
|
15
|
+
* already give the entry the requested literal `disabled` value; home patches and launch overlays are not consulted.
|
|
16
|
+
* @param profile Profile whose patch file is edited and whose selected bundles supply the compared composition.
|
|
8
17
|
* @param id Unique composition entry id.
|
|
9
18
|
* @param name Module name used to match name-qualified overrides.
|
|
10
19
|
* @param enabled Desired entry enablement.
|
|
11
20
|
* @returns Whether the file changed.
|
|
12
21
|
*/
|
|
13
|
-
export async function writePluginEnabled(
|
|
22
|
+
export async function writePluginEnabled(profile, id, name, enabled) {
|
|
23
|
+
const filename = profile.patchPath;
|
|
14
24
|
let text;
|
|
15
25
|
try {
|
|
16
26
|
text = await readFile(filename, 'utf8');
|
|
@@ -28,7 +38,8 @@ export async function writePluginEnabled(filename, id, name, enabled) {
|
|
|
28
38
|
throw error;
|
|
29
39
|
if (!isSeq(document.contents))
|
|
30
40
|
throw new Error('Profile patch must be a YAML sequence');
|
|
31
|
-
loadOptionalPatches('dsh', filename);
|
|
41
|
+
const patches = loadOptionalPatches('dsh', filename) ?? [];
|
|
42
|
+
const bundlePatches = readBundlePatches('dsh', profile);
|
|
32
43
|
const items = document.contents.items;
|
|
33
44
|
const target = items.findLast((item, index) => {
|
|
34
45
|
if (!isMap(item) || document.getIn([index, 'id']) !== id || item.has('insert'))
|
|
@@ -36,12 +47,39 @@ export async function writePluginEnabled(filename, id, name, enabled) {
|
|
|
36
47
|
const expectedName = document.getIn([index, 'name']);
|
|
37
48
|
return !expectedName || expectedName === name;
|
|
38
49
|
});
|
|
50
|
+
// Compares the entry's own literal `disabled`; a `!!js` value never matches, so its override is kept.
|
|
51
|
+
const implied = (index) => {
|
|
52
|
+
const row = flatten(composeEntries([[...bundlePatches, ...patches.toSpliced(index, 1)]])).findLast(entry => entry.id === id);
|
|
53
|
+
return row !== undefined && (row.disabled ?? false) === !enabled;
|
|
54
|
+
};
|
|
39
55
|
if (isMap(target)) {
|
|
40
|
-
|
|
56
|
+
const index = items.indexOf(target);
|
|
57
|
+
// A removed anchor would leave later aliases unresolved.
|
|
58
|
+
const onlySwitch = target.anchor === undefined && target.items.every(pair => isScalar(pair.key) && isScalar(pair.value)
|
|
59
|
+
&& pair.key.anchor === undefined && pair.value.anchor === undefined && (pair.key.value === 'id' || pair.key.value === 'disabled'));
|
|
60
|
+
if (onlySwitch && implied(index)) {
|
|
61
|
+
document.deleteIn([index]);
|
|
62
|
+
// The comment above the removed override can be the file header, so it moves to the following item, above an
|
|
63
|
+
// emptied sequence, or after the remaining items.
|
|
64
|
+
const comment = target.commentBefore;
|
|
65
|
+
const next = items[index];
|
|
66
|
+
if (comment && isNode(next))
|
|
67
|
+
next.commentBefore = next.commentBefore ? `${comment}\n${next.commentBefore}` : comment;
|
|
68
|
+
else if (comment && items.length === 0)
|
|
69
|
+
document.contents.commentBefore = comment;
|
|
70
|
+
else if (comment)
|
|
71
|
+
document.comment = document.comment ? `${comment}\n${document.comment}` : comment;
|
|
72
|
+
}
|
|
73
|
+
else if (document.getIn([index, 'disabled']) === !enabled) {
|
|
41
74
|
return false;
|
|
42
|
-
|
|
75
|
+
}
|
|
76
|
+
else {
|
|
77
|
+
document.setIn([index, 'disabled'], !enabled);
|
|
78
|
+
}
|
|
43
79
|
}
|
|
44
80
|
else {
|
|
81
|
+
if (implied(items.length))
|
|
82
|
+
return false;
|
|
45
83
|
document.add({ id, disabled: !enabled });
|
|
46
84
|
}
|
|
47
85
|
await writeFileAtomic(filename, String(document), { mode: 0o600 });
|
package/lib/types/tools.js
CHANGED
|
@@ -3,6 +3,68 @@ import { assertNever } from '@deepseek-ai/dsh-util-values';
|
|
|
3
3
|
import { approveEscalation } from '@deepseek-ai/dsh-sandbox';
|
|
4
4
|
import { defineTool } from '@deepseek-ai/dsh-tools';
|
|
5
5
|
import { getDshRuntimeVersion } from '@deepseek-ai/dsh-app-boot';
|
|
6
|
+
/** What the model does next for each refusal the manager reports. */
|
|
7
|
+
const ERROR_STEPS = {
|
|
8
|
+
'management-required': 'This entry belongs to plugin management itself and cannot be changed.',
|
|
9
|
+
'unaddressable': 'This entry has no unique profile patch target; tell the user to edit the profile patch file directly.',
|
|
10
|
+
'unknown-plugin': 'Call list_plugins and retry with an exact entryId.',
|
|
11
|
+
'invalid-spec': 'Retry with an npm package name, a git URL, a tarball URL, or an absolute local directory.',
|
|
12
|
+
'already-installed': 'The package is already installed; to install another version, call remove_bundle first, then install_bundle again.',
|
|
13
|
+
'ambiguous-install': 'The dependency change named no single package; call list_bundles to see what was installed.',
|
|
14
|
+
'not-bundle': 'The package declares no dsh.bundle and cannot be managed as a plugin; install a DSH plugin bundle instead.',
|
|
15
|
+
'not-removable': 'Call list_bundles; only bundles marked removable can be removed.',
|
|
16
|
+
'stop-profile': 'This profile runs without HMR; tell the user to stop DSH and run `dsh plugin --profile <profile> remove <bundle>`.',
|
|
17
|
+
'bundle-in-use': 'Call list_plugins, disable the entries from other layers that still use this bundle, then retry.',
|
|
18
|
+
'stale-approval': 'Call install_bundle again without approvedBuilds to read the current pendingBuilds.',
|
|
19
|
+
'incompatible-version': 'Install a version compatible with the running DSH. A version exemption needs the user\'s explicit acceptance of crash and data-loss risk.',
|
|
20
|
+
'operation-error': 'Report the diagnostic to the user; retry only after its cause is addressed.',
|
|
21
|
+
};
|
|
22
|
+
/** What the model does next for each package-manager failure. */
|
|
23
|
+
const FAILURE_STEPS = {
|
|
24
|
+
'pnpm-missing': 'pnpm is not available to DSH; tell the user to install pnpm.',
|
|
25
|
+
'timeout': 'Retry, or retry with another registry.',
|
|
26
|
+
'not-found': 'Check the package name and version with the user, then retry.',
|
|
27
|
+
'no-matching-version': 'Retry with a published version.',
|
|
28
|
+
'network': 'Retry later or pass another registry.',
|
|
29
|
+
'disk-full': 'Tell the user to free disk space, then retry.',
|
|
30
|
+
'permission': 'Tell the user DSH cannot write the profile directory; retry after they fix its permissions.',
|
|
31
|
+
'build-blocked': 'Ask the user whether to allow the install scripts of the packages in pendingBuilds; if they approve, retry with approvedBuilds.',
|
|
32
|
+
};
|
|
33
|
+
/** Why a change waits for a restart, as the model tells the user. */
|
|
34
|
+
const RESTART_STEPS = {
|
|
35
|
+
'no-hmr': 'this profile applies changes only at startup',
|
|
36
|
+
'package-moved': 'an installed package now resolves to another directory, or the change replaces a package the DSH installation provides; remove a package before installing it from another location',
|
|
37
|
+
'host-module': 'the change reaches modules DSH itself loaded',
|
|
38
|
+
'unmanaged-plugin': 'the change reaches a plugin running outside the plugin list',
|
|
39
|
+
'module-comparison': 'DSH could not compare loaded plugins with their files',
|
|
40
|
+
};
|
|
41
|
+
/**
|
|
42
|
+
* The model-facing result of a change: the manager's result plus the next step its outcome calls for.
|
|
43
|
+
* @param result The manager's result.
|
|
44
|
+
* @returns The result with `nextStep` when it is not plainly applied.
|
|
45
|
+
*/
|
|
46
|
+
function withNextStep(result) {
|
|
47
|
+
switch (result.application) {
|
|
48
|
+
case 'applied':
|
|
49
|
+
return result;
|
|
50
|
+
case 'cancelled':
|
|
51
|
+
return { ...result, nextStep: 'The installation was cancelled and its files restored; nothing changed.' };
|
|
52
|
+
case 'overridden':
|
|
53
|
+
return { ...result, nextStep: 'Saved, but a higher-priority layer such as the agent preset overrides it; tell the user it is not in effect.' };
|
|
54
|
+
case 'restart-required': {
|
|
55
|
+
const reason = result.restartReason === undefined ? '' : `: ${RESTART_STEPS[result.restartReason]}`;
|
|
56
|
+
return { ...result, nextStep: `Tell the user to restart DSH to apply this change${reason}.` };
|
|
57
|
+
}
|
|
58
|
+
case 'failed': {
|
|
59
|
+
const code = result.error?.code ?? 'operation-error';
|
|
60
|
+
// A refusal code is more specific than the package manager's failure kind.
|
|
61
|
+
const kind = code === 'operation-error' ? result.packageResult?.kind : undefined;
|
|
62
|
+
return { ...result, nextStep: (kind === undefined ? undefined : FAILURE_STEPS[kind]) ?? ERROR_STEPS[code] };
|
|
63
|
+
}
|
|
64
|
+
/* v8 ignore next -- ChangeResult.application is a closed union */
|
|
65
|
+
default: return assertNever(result.application);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
6
68
|
/** Required services for the management tool. */
|
|
7
69
|
export const inject = ['tools', 'pluginManager', 'sandboxPolicy'];
|
|
8
70
|
/** Register one management tool for discovery and the four persistent actions.
|
|
@@ -11,7 +73,7 @@ export const inject = ['tools', 'pluginManager', 'sandboxPolicy'];
|
|
|
11
73
|
export function apply(ctx) {
|
|
12
74
|
ctx.tools.register(defineTool({
|
|
13
75
|
name: 'plugin_manager',
|
|
14
|
-
description: 'List plugins or bundles in the current profile, enable or disable them, install a bundle, or remove an installed bundle. Every action requires danger-full-access permission or approval for this call. Approval does not change the session permission mode. Changes affect every session in this profile. List first to obtain exact identifiers. Package installation can execute allowed build scripts. Live profiles apply changes immediately;
|
|
76
|
+
description: 'List plugins or bundles in the current profile, enable or disable them, install a bundle, or remove an installed bundle. Every action requires danger-full-access permission or approval for this call. Approval does not change the session permission mode. Changes affect every session in this profile. List first to obtain exact identifiers. Package installation can execute allowed build scripts. Live profiles apply changes immediately, including upgrades of installed packages; a change result that is not applied carries nextStep, which says what to do or tell the user. Unmet DSH version requirements (engines.dsh, else DSH peer dependencies) block installation and activation. Version exemptions risk crashes and data loss: warn the user and obtain explicit permission for the exact plugin and runtime versions before granting one.',
|
|
15
77
|
parameters: {
|
|
16
78
|
action: { type: 'string', required: true, enum: ['list_plugins', 'list_bundles', 'set_plugin', 'set_bundle', 'install_bundle', 'remove_bundle', 'list_version_exemptions', 'set_version_exemption'], description: 'Management operation.' },
|
|
17
79
|
target: { type: 'string', description: 'Plugin entry id, bundle package name, or installation spec, according to action. For an Official catalog entry, pass list_bundles installTarget.spec to install_bundle.' },
|
|
@@ -43,7 +105,7 @@ export function apply(ctx) {
|
|
|
43
105
|
if (args.target === undefined || args.runtimeVersion === undefined || args.enabled === undefined) {
|
|
44
106
|
throw new Error('target package-name@version, runtimeVersion, and enabled are required');
|
|
45
107
|
}
|
|
46
|
-
return JSON.stringify(await manager.setVersionExemption(args.target, args.runtimeVersion, args.enabled, args.acceptRisk));
|
|
108
|
+
return JSON.stringify(withNextStep(await manager.setVersionExemption(args.target, args.runtimeVersion, args.enabled, args.acceptRisk)));
|
|
47
109
|
case 'list_plugins':
|
|
48
110
|
case 'list_bundles': {
|
|
49
111
|
const offset = args.offset ?? 0;
|
|
@@ -62,22 +124,22 @@ export function apply(ctx) {
|
|
|
62
124
|
case 'set_bundle': {
|
|
63
125
|
if (args.target === undefined || args.enabled === undefined)
|
|
64
126
|
throw new Error('target and enabled are required');
|
|
65
|
-
return JSON.stringify(await (args.action === 'set_plugin'
|
|
127
|
+
return JSON.stringify(withNextStep(await (args.action === 'set_plugin'
|
|
66
128
|
? manager.setPluginEnabled(args.target, args.enabled)
|
|
67
|
-
: manager.setBundleEnabled(args.target, args.enabled)));
|
|
129
|
+
: manager.setBundleEnabled(args.target, args.enabled))));
|
|
68
130
|
}
|
|
69
131
|
case 'install_bundle':
|
|
70
132
|
if (args.target === undefined)
|
|
71
133
|
throw new Error('target package spec is required');
|
|
72
|
-
return JSON.stringify(await manager.installBundle(args.target, {
|
|
134
|
+
return JSON.stringify(withNextStep(await manager.installBundle(args.target, {
|
|
73
135
|
...args.enabled === undefined ? {} : { enabled: args.enabled },
|
|
74
136
|
...args.approvedBuilds === undefined ? {} : { approvedBuilds: args.approvedBuilds },
|
|
75
137
|
...args.registry === undefined ? {} : { registry: args.registry },
|
|
76
|
-
}));
|
|
138
|
+
})));
|
|
77
139
|
case 'remove_bundle':
|
|
78
140
|
if (args.target === undefined)
|
|
79
141
|
throw new Error('target bundle name is required');
|
|
80
|
-
return JSON.stringify(await manager.removeBundle(args.target));
|
|
142
|
+
return JSON.stringify(withNextStep(await manager.removeBundle(args.target)));
|
|
81
143
|
/* v8 ignore next -- tool JSON validation rejects actions outside the declared enum */
|
|
82
144
|
default: return assertNever(args.action);
|
|
83
145
|
}
|
package/lib/types/types.d.ts
CHANGED
|
@@ -6,21 +6,29 @@ export type { PluginEntryId } from '@deepseek-ai/dsh-host-plugin-inventory/types
|
|
|
6
6
|
import type { PluginEntryId } from '@deepseek-ai/dsh-host-plugin-inventory/types';
|
|
7
7
|
/** Reasons a profile control cannot modify its target. */
|
|
8
8
|
export type ReadOnlyReason = 'management-required' | 'unaddressable';
|
|
9
|
-
/** A package whose declared DSH
|
|
9
|
+
/** A package whose declared DSH requirements reject the running DSH version, without an exemption for the exact pair. */
|
|
10
10
|
export interface IncompatiblePlugin {
|
|
11
11
|
name: string;
|
|
12
12
|
version: string;
|
|
13
13
|
runtimeVersion: string;
|
|
14
|
-
/** Only the
|
|
15
|
-
|
|
14
|
+
/** Only the requirements the running version does not satisfy, keyed `engines.dsh` or by DSH peer package name. */
|
|
15
|
+
requirements: Record<string, string>;
|
|
16
16
|
}
|
|
17
17
|
/** Localizable management failure and optional external diagnostic. */
|
|
18
18
|
export interface ManagementError {
|
|
19
|
-
code: ReadOnlyReason | 'unknown-plugin' | 'invalid-spec' | 'ambiguous-install' | 'not-bundle' | 'not-removable' | 'stop-profile' | 'bundle-in-use' | 'stale-approval' | 'incompatible-version' | 'operation-error';
|
|
19
|
+
code: ReadOnlyReason | 'unknown-plugin' | 'invalid-spec' | 'already-installed' | 'ambiguous-install' | 'not-bundle' | 'not-removable' | 'stop-profile' | 'bundle-in-use' | 'stale-approval' | 'incompatible-version' | 'operation-error';
|
|
20
20
|
diagnostic?: string;
|
|
21
21
|
/** Present with `incompatible-version`: the packages the running DSH version rejects. */
|
|
22
22
|
incompatible?: IncompatiblePlugin[];
|
|
23
23
|
}
|
|
24
|
+
/**
|
|
25
|
+
* Why a change waits for the next start: `no-hmr` profiles apply changes only at startup; `package-moved` changes map an
|
|
26
|
+
* installed package to another directory without removing it first, or change or locally override a package the DSH
|
|
27
|
+
* installation provides; `host-module` changes reach
|
|
28
|
+
* modules the running process itself imports; `unmanaged-plugin` changes reach a plugin running outside a Loader entry;
|
|
29
|
+
* `module-comparison` means loaded modules could not be compared with disk.
|
|
30
|
+
*/
|
|
31
|
+
export type RestartReason = 'no-hmr' | 'package-moved' | 'host-module' | 'unmanaged-plugin' | 'module-comparison';
|
|
24
32
|
/** One running-profile entry and its persistent control availability. */
|
|
25
33
|
export type PluginInfo = PluginInventoryEntry & ({
|
|
26
34
|
patchId: string;
|
|
@@ -108,6 +116,8 @@ export interface ChangeResult {
|
|
|
108
116
|
changed: boolean;
|
|
109
117
|
/** `cancelled` is an installation the caller stopped, its files restored. */
|
|
110
118
|
application: 'applied' | 'restart-required' | 'overridden' | 'failed' | 'cancelled';
|
|
119
|
+
/** Present with `restart-required`: why the change takes effect only at the next start. */
|
|
120
|
+
restartReason?: RestartReason;
|
|
111
121
|
/** Last attempted step; successful installation can proceed to enablement. */
|
|
112
122
|
stage: 'install' | 'enable' | 'remove';
|
|
113
123
|
target: string;
|
package/locale/en.json
ADDED
package/locale/zh.json
ADDED
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@deepseek-ai/dsh-plugin-manager",
|
|
3
3
|
"description": "Current-profile plugin and bundle management shared by dsh CLI, Web and agent tools",
|
|
4
|
-
"version": "0.2.1-alpha.
|
|
4
|
+
"version": "0.2.1-alpha.4",
|
|
5
5
|
"publishConfig": {
|
|
6
6
|
"access": "public"
|
|
7
7
|
},
|
|
@@ -43,9 +43,13 @@
|
|
|
43
43
|
"./tools": {
|
|
44
44
|
"types": "./lib/types/tools.d.ts",
|
|
45
45
|
"default": "./lib/types/tools.js"
|
|
46
|
-
}
|
|
46
|
+
},
|
|
47
|
+
"./tools/locale/*.json": "./locale/tools/*.json",
|
|
48
|
+
"./locale/*.json": "./locale/*.json"
|
|
47
49
|
},
|
|
48
50
|
"files": [
|
|
51
|
+
"locale/*.json",
|
|
52
|
+
"locale/tools/*.json",
|
|
49
53
|
"lib/index.js",
|
|
50
54
|
"lib/types/**/*.js",
|
|
51
55
|
"lib/types/**/*.d.ts",
|
|
@@ -56,26 +60,26 @@
|
|
|
56
60
|
],
|
|
57
61
|
"license": "MIT",
|
|
58
62
|
"dependencies": {
|
|
59
|
-
"@deepseek-ai/dsh-app-boot": "0.2.1-alpha.
|
|
60
|
-
"@deepseek-ai/dsh-atomic-write": "0.2.1-alpha.
|
|
61
|
-
"@deepseek-ai/schemastery": "~3.18.5-alpha.
|
|
63
|
+
"@deepseek-ai/dsh-app-boot": "0.2.1-alpha.4",
|
|
64
|
+
"@deepseek-ai/dsh-atomic-write": "0.2.1-alpha.4",
|
|
65
|
+
"@deepseek-ai/schemastery": "~3.18.5-alpha.2",
|
|
62
66
|
"execa": "^10.0.1",
|
|
63
67
|
"yaml": "^2.9.0",
|
|
64
|
-
"zod": "
|
|
65
|
-
"@deepseek-ai/dsh-util-values": "0.2.1-alpha.
|
|
68
|
+
"zod": "4.4.3",
|
|
69
|
+
"@deepseek-ai/dsh-util-values": "0.2.1-alpha.4"
|
|
66
70
|
},
|
|
67
71
|
"peerDependencies": {
|
|
68
|
-
"@deepseek-ai/cordis": "~4.0.5-alpha.
|
|
69
|
-
"@deepseek-ai/cordis-plugin-loader": "~1.0.6-alpha.
|
|
70
|
-
"@deepseek-ai/dsh-host-plugin-inventory": "0.2.1-alpha.
|
|
71
|
-
"@deepseek-ai/dsh-subprocess": "0.2.1-alpha.
|
|
72
|
-
"@deepseek-ai/dsh-typert-protocol": "0.2.1-alpha.
|
|
73
|
-
"@deepseek-ai/dsh-tools": "0.2.1-alpha.
|
|
74
|
-
"@deepseek-ai/dsh-hmr": "0.2.1-alpha.
|
|
75
|
-
"@deepseek-ai/dsh-brand": "0.2.1-alpha.
|
|
76
|
-
"@deepseek-ai/dsh-sandbox-policy": "0.2.1-alpha.
|
|
77
|
-
"@deepseek-ai/dsh-sandbox": "0.2.1-alpha.
|
|
78
|
-
"@deepseek-ai/dsh-user-approval": "0.2.1-alpha.
|
|
72
|
+
"@deepseek-ai/cordis": "~4.0.5-alpha.2",
|
|
73
|
+
"@deepseek-ai/cordis-plugin-loader": "~1.0.6-alpha.2",
|
|
74
|
+
"@deepseek-ai/dsh-host-plugin-inventory": "0.2.1-alpha.4",
|
|
75
|
+
"@deepseek-ai/dsh-subprocess": "0.2.1-alpha.4",
|
|
76
|
+
"@deepseek-ai/dsh-typert-protocol": "0.2.1-alpha.4",
|
|
77
|
+
"@deepseek-ai/dsh-tools": "0.2.1-alpha.4",
|
|
78
|
+
"@deepseek-ai/dsh-hmr": "0.2.1-alpha.4",
|
|
79
|
+
"@deepseek-ai/dsh-brand": "0.2.1-alpha.4",
|
|
80
|
+
"@deepseek-ai/dsh-sandbox-policy": "0.2.1-alpha.4",
|
|
81
|
+
"@deepseek-ai/dsh-sandbox": "0.2.1-alpha.4",
|
|
82
|
+
"@deepseek-ai/dsh-user-approval": "0.2.1-alpha.4"
|
|
79
83
|
},
|
|
80
84
|
"peerDependenciesMeta": {
|
|
81
85
|
"@deepseek-ai/dsh-hmr": {
|
|
@@ -87,22 +91,22 @@
|
|
|
87
91
|
},
|
|
88
92
|
"devDependencies": {
|
|
89
93
|
"chokidar": "^4.0.3",
|
|
90
|
-
"@deepseek-ai/dsh-package-manifest": "0.2.1-alpha.
|
|
91
|
-
"@deepseek-ai/cordis": "~4.0.5-alpha.
|
|
92
|
-
"@deepseek-ai/cordis-plugin-loader": "~1.0.6-alpha.
|
|
93
|
-
"@deepseek-ai/dsh-host-plugin-inventory": "0.2.1-alpha.
|
|
94
|
-
"@deepseek-ai/dsh-subprocess": "0.2.1-alpha.
|
|
95
|
-
"@deepseek-ai/dsh-typert-protocol": "0.2.1-alpha.
|
|
96
|
-
"@deepseek-ai/dsh-tools": "0.2.1-alpha.
|
|
97
|
-
"@deepseek-ai/dsh-system-prompt": "0.2.1-alpha.
|
|
98
|
-
"@deepseek-ai/dsh-hmr": "0.2.1-alpha.
|
|
99
|
-
"@deepseek-ai/cordis-plugin-timer": "~1.1.7-alpha.
|
|
100
|
-
"@deepseek-ai/dsh-brand": "0.2.1-alpha.
|
|
101
|
-
"@deepseek-ai/dsh-sandbox-policy": "0.2.1-alpha.
|
|
102
|
-
"@deepseek-ai/dsh-agent": "0.2.1-alpha.
|
|
103
|
-
"@deepseek-ai/dsh-session": "0.2.1-alpha.
|
|
104
|
-
"@deepseek-ai/dsh-session-projection": "0.2.1-alpha.
|
|
105
|
-
"@deepseek-ai/dsh-sandbox": "0.2.1-alpha.
|
|
106
|
-
"@deepseek-ai/dsh-user-approval": "0.2.1-alpha.
|
|
94
|
+
"@deepseek-ai/dsh-package-manifest": "0.2.1-alpha.4",
|
|
95
|
+
"@deepseek-ai/cordis": "~4.0.5-alpha.2",
|
|
96
|
+
"@deepseek-ai/cordis-plugin-loader": "~1.0.6-alpha.2",
|
|
97
|
+
"@deepseek-ai/dsh-host-plugin-inventory": "0.2.1-alpha.4",
|
|
98
|
+
"@deepseek-ai/dsh-subprocess": "0.2.1-alpha.4",
|
|
99
|
+
"@deepseek-ai/dsh-typert-protocol": "0.2.1-alpha.4",
|
|
100
|
+
"@deepseek-ai/dsh-tools": "0.2.1-alpha.4",
|
|
101
|
+
"@deepseek-ai/dsh-system-prompt": "0.2.1-alpha.4",
|
|
102
|
+
"@deepseek-ai/dsh-hmr": "0.2.1-alpha.4",
|
|
103
|
+
"@deepseek-ai/cordis-plugin-timer": "~1.1.7-alpha.2",
|
|
104
|
+
"@deepseek-ai/dsh-brand": "0.2.1-alpha.4",
|
|
105
|
+
"@deepseek-ai/dsh-sandbox-policy": "0.2.1-alpha.4",
|
|
106
|
+
"@deepseek-ai/dsh-agent": "0.2.1-alpha.4",
|
|
107
|
+
"@deepseek-ai/dsh-session": "0.2.1-alpha.4",
|
|
108
|
+
"@deepseek-ai/dsh-session-projection": "0.2.1-alpha.4",
|
|
109
|
+
"@deepseek-ai/dsh-sandbox": "0.2.1-alpha.4",
|
|
110
|
+
"@deepseek-ai/dsh-user-approval": "0.2.1-alpha.4"
|
|
107
111
|
}
|
|
108
112
|
}
|