dsh-ssh-tui 0.7.3 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (78) hide show
  1. package/README.en.md +101 -27
  2. package/README.md +83 -27
  3. package/docs/remote-ops.md +80 -1
  4. package/docs/terminals.md +17 -4
  5. package/docs/windows.md +128 -0
  6. package/lib/attach.js +14 -1
  7. package/lib/attach.js.map +1 -1
  8. package/lib/auth-failure.js +92 -0
  9. package/lib/auth-failure.js.map +1 -0
  10. package/lib/commands.js +2 -0
  11. package/lib/commands.js.map +1 -1
  12. package/lib/copy-text.js +2 -0
  13. package/lib/copy-text.js.map +1 -1
  14. package/lib/diag.js +3 -0
  15. package/lib/diag.js.map +1 -1
  16. package/lib/dialogs.js.map +1 -1
  17. package/lib/display-sock.js +313 -2
  18. package/lib/display-sock.js.map +1 -1
  19. package/lib/dsh-compat.js +46 -0
  20. package/lib/dsh-compat.js.map +1 -1
  21. package/lib/i18n/en.js +49 -14
  22. package/lib/i18n/en.js.map +1 -1
  23. package/lib/i18n/index.js +5 -0
  24. package/lib/i18n/index.js.map +1 -1
  25. package/lib/i18n/zh.js +49 -14
  26. package/lib/i18n/zh.js.map +1 -1
  27. package/lib/index.js +76 -15
  28. package/lib/index.js.map +1 -1
  29. package/lib/line-mode.js +4 -0
  30. package/lib/line-mode.js.map +1 -1
  31. package/lib/paint.js +32 -1
  32. package/lib/paint.js.map +1 -1
  33. package/lib/picker.js +104 -15
  34. package/lib/picker.js.map +1 -1
  35. package/lib/plan.js +8 -0
  36. package/lib/plan.js.map +1 -1
  37. package/lib/platform.js +81 -0
  38. package/lib/platform.js.map +1 -1
  39. package/lib/preset-rows.js +54 -24
  40. package/lib/preset-rows.js.map +1 -1
  41. package/lib/question-wait.js +418 -0
  42. package/lib/question-wait.js.map +1 -0
  43. package/lib/selection.js +26 -8
  44. package/lib/selection.js.map +1 -1
  45. package/lib/term-text.js +79 -8
  46. package/lib/term-text.js.map +1 -1
  47. package/lib/terminal-input.js +13 -0
  48. package/lib/terminal-input.js.map +1 -1
  49. package/lib/tui.js +713 -51
  50. package/lib/tui.js.map +1 -1
  51. package/lib/types/attach.d.ts +8 -0
  52. package/lib/types/auth-failure.d.ts +48 -0
  53. package/lib/types/commands.d.ts +6 -0
  54. package/lib/types/diag.d.ts +2 -0
  55. package/lib/types/dialogs.d.ts +16 -0
  56. package/lib/types/display-sock.d.ts +78 -2
  57. package/lib/types/dsh-compat.d.ts +44 -12
  58. package/lib/types/i18n/index.d.ts +13 -3
  59. package/lib/types/index.d.ts +7 -0
  60. package/lib/types/paint.d.ts +21 -0
  61. package/lib/types/picker.d.ts +22 -0
  62. package/lib/types/platform.d.ts +22 -0
  63. package/lib/types/preset-rows.d.ts +18 -10
  64. package/lib/types/question-wait.d.ts +221 -0
  65. package/lib/types/selection.d.ts +12 -4
  66. package/lib/types/settings-subagent.d.ts +3 -3
  67. package/lib/types/subagent-model.d.ts +3 -3
  68. package/lib/types/term-text.d.ts +14 -0
  69. package/lib/types/terminal-input.d.ts +10 -0
  70. package/lib/types/transcript-types.d.ts +22 -0
  71. package/lib/types/tui.d.ts +149 -3
  72. package/lib/types/update-check.d.ts +19 -4
  73. package/lib/types/workspace-changes.d.ts +135 -0
  74. package/lib/update-check.js +25 -8
  75. package/lib/update-check.js.map +1 -1
  76. package/lib/workspace-changes.js +120 -0
  77. package/lib/workspace-changes.js.map +1 -0
  78. package/package.json +104 -69
@@ -0,0 +1,135 @@
1
+ /**
2
+ * Per-turn workspace change cards, read from the Host's `workspaceChanges`
3
+ * service (`@deepseek-ai/dsh-workspace-changes`, shipped with dsh 0.1.7).
4
+ *
5
+ * The service is not a dependency of this plugin: 0.1.5 has neither the
6
+ * package nor the `workspace/changes` event, so everything here is reached by
7
+ * feature detection and the local types below are copied from the service's
8
+ * contract rather than imported. Importing the package would fail to compile
9
+ * on the 0.1.5 tree, where the module does not exist.
10
+ *
11
+ * What the service serves lives only as long as the Session does, in this Host
12
+ * process. After a restart a replayed event resolves to `undefined`, and the
13
+ * upstream decision — which this module honours — is to show no card at all
14
+ * rather than a card whose contents can no longer be opened.
15
+ * @module dsh-ssh-tui/workspace-changes
16
+ */
17
+ import type { DiffDisplayLine } from './transcript-types.js';
18
+ /** One file changed during a turn. Mirrors the service's `WorkspaceChangedFile`. */
19
+ export interface ChangesFile {
20
+ /** Path relative to the Session working directory, or absolute outside it. */
21
+ path: string;
22
+ /** Sort key and label, always slash-separated. */
23
+ display: string;
24
+ /** Lines added; zero when the file is binary or oversized. */
25
+ added: number;
26
+ /** Lines deleted; zero when the file is binary or oversized. */
27
+ deleted: number;
28
+ /** Git called it binary, or a captured side holds a NUL byte. */
29
+ binary?: true;
30
+ /** A captured side exceeded the plugin's byte cap; listed without counts. */
31
+ oversized?: true;
32
+ }
33
+ /** Files changed during one top-level turn. Mirrors `WorkspaceChangesSummary`. */
34
+ export interface ChangesSummary {
35
+ /** The turn this summary describes. */
36
+ turn: number;
37
+ /** Working directory the `path` values are relative to. */
38
+ cwd: string;
39
+ /** Changed files in `display` order, capped by the plugin's `maxFiles`. */
40
+ files: ChangesFile[];
41
+ /** Complete changed-file count, including files the cap omitted. */
42
+ total: number;
43
+ /** Lines added over every changed file, including omitted ones. */
44
+ added: number;
45
+ /** Lines deleted over every changed file, including omitted ones. */
46
+ deleted: number;
47
+ }
48
+ /** One unified-diff hunk; every line keeps its `+`, `-`, or space prefix. */
49
+ export interface ChangesHunk {
50
+ /** First line in the turn-start content, 1-based. */
51
+ oldStart: number;
52
+ /** Lines taken from the turn-start content. */
53
+ oldLines: number;
54
+ /** First line in the turn-end content, 1-based. */
55
+ newStart: number;
56
+ /** Lines taken from the turn-end content. */
57
+ newLines: number;
58
+ /** Hunk body in order, each line prefixed with `+`, `-`, or a space. */
59
+ lines: string[];
60
+ }
61
+ /**
62
+ * One listed file's comparison, computed when asked for. Mirrors
63
+ * `WorkspaceFileDiff`: a line diff, or a file that has no lines to show.
64
+ */
65
+ export type ChangesFileDiff = {
66
+ kind: 'text';
67
+ path: string;
68
+ display: string;
69
+ before: boolean;
70
+ after: boolean;
71
+ hunks: ChangesHunk[];
72
+ /** The comparison timed out and every line is shown as replaced. */
73
+ coarse: boolean;
74
+ } | {
75
+ kind: 'binary';
76
+ path: string;
77
+ display: string;
78
+ } | {
79
+ kind: 'oversized';
80
+ path: string;
81
+ display: string;
82
+ };
83
+ /**
84
+ * The Host service, as far as this plugin reads it. `seq` is the
85
+ * `workspace/changes` event's own sequence number, not the turn number.
86
+ */
87
+ export interface WorkspaceChangesSource {
88
+ summary(sessionId: string, seq: number): ChangesSummary | undefined;
89
+ diff(sessionId: string, seq: number, index: number, signal: AbortSignal): Promise<ChangesFileDiff | undefined>;
90
+ }
91
+ /**
92
+ * The `workspaceChanges` service, when this Host actually has one.
93
+ *
94
+ * Both methods have to be functions: a present-but-incomplete object (a stub,
95
+ * a future shape) must read as "not available" so the event is ignored instead
96
+ * of throwing when the card is built.
97
+ * @param ctx - the Host context.
98
+ * @returns the service, or undefined on a Host that never registered one.
99
+ */
100
+ export declare function workspaceChangesOf(ctx: {
101
+ get?(name: string): unknown;
102
+ }): WorkspaceChangesSource | undefined;
103
+ /** Whether a summary is worth a card. A turn that changed nothing is not. */
104
+ export declare function changesSummaryVisible(summary: ChangesSummary): boolean;
105
+ /** Collapsed-card header: `本轮改动 · 3 个文件 +42 -7`. */
106
+ export declare function changesHeader(summary: ChangesSummary): string;
107
+ /**
108
+ * One expanded-card file line.
109
+ *
110
+ * Binary and oversized files carry no counts upstream, so naming the file and
111
+ * then printing `+0 -0` would report a change that was not measured. They get
112
+ * a label instead.
113
+ * @param file - one entry of the summary.
114
+ * @returns the line, without the card's indent.
115
+ */
116
+ export declare function changesFileLine(file: ChangesFile): string;
117
+ /**
118
+ * Files the cap left out, when there are any.
119
+ * @param summary - the turn's summary.
120
+ * @returns the trailing line, or undefined when every file is listed.
121
+ */
122
+ export declare function changesRemainderLine(summary: ChangesSummary): string | undefined;
123
+ /**
124
+ * Render one file's comparison as overlay lines.
125
+ *
126
+ * The service already compared the two sides, so this only maps what it
127
+ * returned: recomputing the diff would be slower and could disagree with the
128
+ * counts the card already showed. A `+` line is an addition, a `-` line a
129
+ * removal, and a space-prefixed line is the unchanged context. Anything else
130
+ * (a hunk line the service did not prefix) is shown as context too — dropping
131
+ * it would hide part of the file.
132
+ * @param diff - the comparison `workspaceChanges.diff` returned.
133
+ * @returns the lines, or an empty list when there is nothing to show.
134
+ */
135
+ export declare function renderChangesDiff(diff: ChangesFileDiff | undefined): DiffDisplayLine[];
@@ -1,7 +1,10 @@
1
1
  /**
2
2
  * Best-effort npm latest check. Failures stay quiet. The TUI may offer to
3
- * run `dsh plugin --profile <name> add dsh-ssh-tui@latest` — pnpm otherwise
4
- * keeps the lockfile pin (e.g. 0.3.7) when the spec is a bare package name.
3
+ * install the version it just read, by number: `dsh plugin --profile <name>
4
+ * add dsh-ssh-tui@<version>`. A bare package name lets pnpm keep the lockfile
5
+ * pin (e.g. 0.3.7), and `@latest` is resolved a second time at install — under
6
+ * pnpm's `minimumReleaseAge` that second lookup can quietly land on yesterday's
7
+ * release while still exiting 0.
5
8
  */
6
9
  import { spawn } from 'node:child_process';
7
10
  import { existsSync } from 'node:fs';
@@ -32,11 +35,24 @@ export function resolvePluginProfileName(env = process.env) {
32
35
  return arg;
33
36
  return 'tui';
34
37
  }
35
- export function pluginUpgradeCommand(profile = resolvePluginProfileName()) {
36
- return `dsh plugin --profile ${profile} add ${PLUGIN_PACKAGE}@latest`;
38
+ /**
39
+ * The install command for one already-resolved version.
40
+ *
41
+ * The version is the number `checkForPluginUpdate` read from the registry, not
42
+ * the `latest` dist-tag: handing pnpm the tag makes it resolve the release a
43
+ * second time, and a release younger than `minimumReleaseAge` is then skipped
44
+ * without an error. A caller with no resolved version passes `@latest`, which
45
+ * is still better than a bare name.
46
+ * @param profile - the profile the plugin is installed into.
47
+ * @param version - the exact version to install.
48
+ * @returns the command, safe to show the user and to run.
49
+ */
50
+ export function pluginUpgradeCommand(profile = resolvePluginProfileName(), version = 'latest') {
51
+ const spec = version.trim() === '' ? 'latest' : version.trim();
52
+ return `dsh plugin --profile ${profile} add ${PLUGIN_PACKAGE}@${spec}`;
37
53
  }
38
54
  export function formatUpdateNotice(current, latest, profile = resolvePluginProfileName()) {
39
- return t('update.notice', { latest, current, command: pluginUpgradeCommand(profile) });
55
+ return t('update.notice', { latest, current, command: pluginUpgradeCommand(profile, latest) });
40
56
  }
41
57
  export async function fetchLatestNpmVersion(fetchImpl = fetch) {
42
58
  try {
@@ -67,7 +83,7 @@ export async function checkForPluginUpdate(current) {
67
83
  current,
68
84
  latest,
69
85
  profile,
70
- command: pluginUpgradeCommand(profile),
86
+ command: pluginUpgradeCommand(profile, latest),
71
87
  notice: formatUpdateNotice(current, latest, profile),
72
88
  };
73
89
  }
@@ -93,12 +109,13 @@ export function resolveDshInvocation(options = {}) {
93
109
  export function shellSafeProfile(profile) {
94
110
  return /\s/u.test(profile) ? `"${profile.replaceAll('"', '')}"` : profile;
95
111
  }
96
- export async function installPluginLatest(profile = resolvePluginProfileName(), deps = {}) {
112
+ export async function installPluginLatest(profile = resolvePluginProfileName(), version = 'latest', deps = {}) {
97
113
  const invocation = deps.invocation ?? resolveDshInvocation();
98
114
  const spawnFn = deps.spawnFn ?? spawn;
99
115
  const profileArg = invocation.shell ? shellSafeProfile(profile) : profile;
116
+ const spec = version.trim() === '' ? 'latest' : version.trim();
100
117
  return await new Promise(resolve => {
101
- const child = spawnFn(invocation.command, [...invocation.prefix, 'plugin', '--profile', profileArg, 'add', `${PLUGIN_PACKAGE}@latest`], {
118
+ const child = spawnFn(invocation.command, [...invocation.prefix, 'plugin', '--profile', profileArg, 'add', `${PLUGIN_PACKAGE}@${spec}`], {
102
119
  env: process.env,
103
120
  stdio: ['ignore', 'pipe', 'pipe'],
104
121
  shell: invocation.shell,
@@ -1 +1 @@
1
- {"version":3,"file":"update-check.js","sourceRoot":"","sources":["../src/update-check.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"update-check.js","sourceRoot":"","sources":["../src/update-check.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,120 @@
1
+ /**
2
+ * Per-turn workspace change cards, read from the Host's `workspaceChanges`
3
+ * service (`@deepseek-ai/dsh-workspace-changes`, shipped with dsh 0.1.7).
4
+ *
5
+ * The service is not a dependency of this plugin: 0.1.5 has neither the
6
+ * package nor the `workspace/changes` event, so everything here is reached by
7
+ * feature detection and the local types below are copied from the service's
8
+ * contract rather than imported. Importing the package would fail to compile
9
+ * on the 0.1.5 tree, where the module does not exist.
10
+ *
11
+ * What the service serves lives only as long as the Session does, in this Host
12
+ * process. After a restart a replayed event resolves to `undefined`, and the
13
+ * upstream decision — which this module honours — is to show no card at all
14
+ * rather than a card whose contents can no longer be opened.
15
+ * @module dsh-ssh-tui/workspace-changes
16
+ */
17
+ import { t } from './i18n/index.js';
18
+ /**
19
+ * The `workspaceChanges` service, when this Host actually has one.
20
+ *
21
+ * Both methods have to be functions: a present-but-incomplete object (a stub,
22
+ * a future shape) must read as "not available" so the event is ignored instead
23
+ * of throwing when the card is built.
24
+ * @param ctx - the Host context.
25
+ * @returns the service, or undefined on a Host that never registered one.
26
+ */
27
+ export function workspaceChangesOf(ctx) {
28
+ const get = ctx.get;
29
+ if (typeof get !== 'function')
30
+ return undefined;
31
+ const service = get.call(ctx, 'workspaceChanges');
32
+ if (typeof service !== 'object' || service === null)
33
+ return undefined;
34
+ const candidate = service;
35
+ if (typeof candidate.summary !== 'function' || typeof candidate.diff !== 'function')
36
+ return undefined;
37
+ return service;
38
+ }
39
+ /** Whether a summary is worth a card. A turn that changed nothing is not. */
40
+ export function changesSummaryVisible(summary) {
41
+ return summary.total > 0 && summary.files.length > 0;
42
+ }
43
+ /** Collapsed-card header: `本轮改动 · 3 个文件 +42 -7`. */
44
+ export function changesHeader(summary) {
45
+ return t('changes.header', {
46
+ count: summary.total,
47
+ added: summary.added,
48
+ deleted: summary.deleted,
49
+ });
50
+ }
51
+ /**
52
+ * One expanded-card file line.
53
+ *
54
+ * Binary and oversized files carry no counts upstream, so naming the file and
55
+ * then printing `+0 -0` would report a change that was not measured. They get
56
+ * a label instead.
57
+ * @param file - one entry of the summary.
58
+ * @returns the line, without the card's indent.
59
+ */
60
+ export function changesFileLine(file) {
61
+ const label = file.display === '' ? file.path : file.display;
62
+ if (file.binary === true)
63
+ return `${label} ${t('changes.binary')}`;
64
+ if (file.oversized === true)
65
+ return `${label} ${t('changes.oversized')}`;
66
+ return `${label} +${file.added} -${file.deleted}`;
67
+ }
68
+ /**
69
+ * Files the cap left out, when there are any.
70
+ * @param summary - the turn's summary.
71
+ * @returns the trailing line, or undefined when every file is listed.
72
+ */
73
+ export function changesRemainderLine(summary) {
74
+ const omitted = summary.total - summary.files.length;
75
+ if (omitted <= 0)
76
+ return undefined;
77
+ return t('changes.more', { count: omitted });
78
+ }
79
+ /** `@@ -12,3 +12,4 @@`, the range a hunk covers on each side. */
80
+ function hunkRange(start, lines) {
81
+ return lines === 1 ? String(start) : `${start},${lines}`;
82
+ }
83
+ /**
84
+ * Render one file's comparison as overlay lines.
85
+ *
86
+ * The service already compared the two sides, so this only maps what it
87
+ * returned: recomputing the diff would be slower and could disagree with the
88
+ * counts the card already showed. A `+` line is an addition, a `-` line a
89
+ * removal, and a space-prefixed line is the unchanged context. Anything else
90
+ * (a hunk line the service did not prefix) is shown as context too — dropping
91
+ * it would hide part of the file.
92
+ * @param diff - the comparison `workspaceChanges.diff` returned.
93
+ * @returns the lines, or an empty list when there is nothing to show.
94
+ */
95
+ export function renderChangesDiff(diff) {
96
+ if (diff === undefined)
97
+ return [];
98
+ if (diff.kind === 'binary')
99
+ return [{ kind: 'tool-result', text: t('changes.binaryFile') }];
100
+ if (diff.kind === 'oversized')
101
+ return [{ kind: 'tool-result', text: t('changes.oversizedFile') }];
102
+ const lines = [];
103
+ if (diff.coarse)
104
+ lines.push({ kind: 'tool-result', text: t('changes.coarse') });
105
+ for (const hunk of diff.hunks) {
106
+ lines.push({
107
+ kind: 'diff-path',
108
+ text: `@@ -${hunkRange(hunk.oldStart, hunk.oldLines)} +${hunkRange(hunk.newStart, hunk.newLines)} @@`,
109
+ });
110
+ for (const raw of hunk.lines) {
111
+ const prefix = raw.charAt(0);
112
+ lines.push({
113
+ kind: prefix === '+' ? 'diff-add' : prefix === '-' ? 'diff-del' : 'tool-result',
114
+ text: raw,
115
+ });
116
+ }
117
+ }
118
+ return lines;
119
+ }
120
+ //# sourceMappingURL=workspace-changes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspace-changes.js","sourceRoot":"","sources":["../src/workspace-changes.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dsh-ssh-tui",
3
- "version": "0.7.3",
3
+ "version": "0.8.0",
4
4
  "description": "SSH-friendly interactive terminal TUI plugin for DeepSeek Harness",
5
5
  "keywords": [
6
6
  "deepseek-harness",
@@ -59,7 +59,8 @@
59
59
  "docs/screenshots/workspace.png",
60
60
  "docs/screenshots/slow-link.gif",
61
61
  "LICENSE",
62
- "docs/terminals.md"
62
+ "docs/terminals.md",
63
+ "docs/windows.md"
63
64
  ],
64
65
  "license": "MIT",
65
66
  "dsh": {
@@ -67,17 +68,19 @@
67
68
  "patch": "./cordis.patch.yml"
68
69
  },
69
70
  "compatibility": {
70
- "dsh": ">=0.1.3-alpha.2 <0.1.6 || >=0.1.5-alpha.1 <0.1.6 || >=0.1.7-rc.1 <0.1.8",
71
+ "dsh": ">=0.1.7-rc.1 <0.1.8 || >=0.2.0-rc.1 <0.2.1",
71
72
  "dshReleases": {
72
73
  "0.1.2-rc.1": "incompatible",
73
- "0.1.3-alpha.1": "unknown",
74
- "0.1.3-alpha.2": "compatible",
75
- "0.1.5-alpha.1": "compatible",
76
- "0.1.5-alpha.2": "compatible",
77
- "0.1.5-rc.1": "compatible",
78
- "0.1.5-rc.2": "compatible",
79
- "0.1.5-rc.3": "compatible",
80
- "0.1.7-rc.1": "compatible"
74
+ "0.1.3-alpha.1": "incompatible",
75
+ "0.1.3-alpha.2": "incompatible",
76
+ "0.1.5-alpha.1": "incompatible",
77
+ "0.1.5-alpha.2": "incompatible",
78
+ "0.1.5-rc.1": "incompatible",
79
+ "0.1.5-rc.2": "incompatible",
80
+ "0.1.5-rc.3": "incompatible",
81
+ "0.1.7-rc.1": "compatible",
82
+ "0.1.7-rc.2": "compatible",
83
+ "0.2.0-rc.1": "compatible"
81
84
  },
82
85
  "profiles": [
83
86
  "tui"
@@ -92,10 +95,10 @@
92
95
  "prepare": "npm run build",
93
96
  "prepack": "npm run build",
94
97
  "prepublishOnly": "npm run typecheck",
95
- "install:dsh": "bash scripts/install.sh",
96
- "install:npm": "bash scripts/install-npm.sh",
97
- "uninstall:dsh": "bash scripts/uninstall.sh",
98
- "verify:dsh": "bash scripts/verify.sh",
98
+ "install:dsh": "node scripts/install.mjs",
99
+ "install:npm": "node scripts/install-npm.mjs",
100
+ "uninstall:dsh": "node scripts/uninstall.mjs",
101
+ "verify:dsh": "node scripts/verify.mjs",
99
102
  "probe:home": "node scripts/probe-home.mjs --probe",
100
103
  "probe:home:drop": "node scripts/probe-home.mjs --probe --script tui-drop-probe.mjs",
101
104
  "screenshots": "npm run build && node scripts/capture-readme-frames.mjs",
@@ -110,22 +113,21 @@
110
113
  },
111
114
  "peerDependencies": {
112
115
  "@deepseek-ai/cordis": "^4.0.1",
113
- "@deepseek-ai/dsh-agent": ">=0.1.3-alpha.2 <0.1.6 || >=0.1.5-alpha.1 <0.1.6 || >=0.1.7-rc.1 <0.1.8",
114
- "@deepseek-ai/dsh-agent-default-model": ">=0.1.3-alpha.2 <0.1.6 || >=0.1.5-alpha.1 <0.1.6 || >=0.1.7-rc.1 <0.1.8",
115
- "@deepseek-ai/dsh-agent-loop": ">=0.1.3-alpha.2 <0.1.6 || >=0.1.5-alpha.1 <0.1.6 || >=0.1.7-rc.1 <0.1.8",
116
- "@deepseek-ai/dsh-agent-preset": ">=0.1.7-rc.1 <0.1.8",
117
- "@deepseek-ai/dsh-agent-preset-registry": ">=0.1.7-rc.1 <0.1.8",
118
- "@deepseek-ai/dsh-agent-presets": ">=0.1.3-alpha.2 <0.1.6 || >=0.1.5-alpha.1 <0.1.6 || >=0.1.7-rc.1 <0.1.8",
119
- "@deepseek-ai/dsh-cmdline": ">=0.1.3-alpha.2 <0.1.6 || >=0.1.5-alpha.1 <0.1.6 || >=0.1.7-rc.1 <0.1.8",
120
- "@deepseek-ai/dsh-commands": ">=0.1.3-alpha.2 <0.1.6 || >=0.1.5-alpha.1 <0.1.6 || >=0.1.7-rc.1 <0.1.8",
121
- "@deepseek-ai/dsh-credentials": ">=0.1.3-alpha.2 <0.1.6 || >=0.1.5-alpha.1 <0.1.6 || >=0.1.7-rc.1 <0.1.8",
122
- "@deepseek-ai/dsh-llm": ">=0.1.3-alpha.2 <0.1.6 || >=0.1.5-alpha.1 <0.1.6 || >=0.1.7-rc.1 <0.1.8",
123
- "@deepseek-ai/dsh-session": ">=0.1.3-alpha.2 <0.1.6 || >=0.1.5-alpha.1 <0.1.6 || >=0.1.7-rc.1 <0.1.8",
124
- "@deepseek-ai/dsh-session-persistence": ">=0.1.3-alpha.2 <0.1.6 || >=0.1.5-alpha.1 <0.1.6 || >=0.1.7-rc.1 <0.1.8",
125
- "@deepseek-ai/dsh-settings": ">=0.1.3-alpha.2 <0.1.6 || >=0.1.5-alpha.1 <0.1.6 || >=0.1.7-rc.1 <0.1.8",
126
- "@deepseek-ai/dsh-subagent": ">=0.1.3-alpha.2 <0.1.6 || >=0.1.5-alpha.1 <0.1.6 || >=0.1.7-rc.1 <0.1.8",
127
- "@deepseek-ai/dsh-user-approval": ">=0.1.3-alpha.2 <0.1.6 || >=0.1.5-alpha.1 <0.1.6 || >=0.1.7-rc.1 <0.1.8",
128
- "@deepseek-ai/dsh-user-questions": ">=0.1.3-alpha.2 <0.1.6 || >=0.1.5-alpha.1 <0.1.6 || >=0.1.7-rc.1 <0.1.8"
116
+ "@deepseek-ai/dsh-agent": ">=0.1.7-rc.1 <0.1.8 || >=0.2.0-rc.1 <0.2.1",
117
+ "@deepseek-ai/dsh-agent-default-model": ">=0.1.7-rc.1 <0.1.8 || >=0.2.0-rc.1 <0.2.1",
118
+ "@deepseek-ai/dsh-agent-loop": ">=0.1.7-rc.1 <0.1.8 || >=0.2.0-rc.1 <0.2.1",
119
+ "@deepseek-ai/dsh-agent-preset": ">=0.1.7-rc.1 <0.1.8 || >=0.2.0-rc.1 <0.2.1",
120
+ "@deepseek-ai/dsh-agent-preset-registry": ">=0.1.7-rc.1 <0.1.8 || >=0.2.0-rc.1 <0.2.1",
121
+ "@deepseek-ai/dsh-cmdline": ">=0.1.7-rc.1 <0.1.8 || >=0.2.0-rc.1 <0.2.1",
122
+ "@deepseek-ai/dsh-commands": ">=0.1.7-rc.1 <0.1.8 || >=0.2.0-rc.1 <0.2.1",
123
+ "@deepseek-ai/dsh-credentials": ">=0.1.7-rc.1 <0.1.8 || >=0.2.0-rc.1 <0.2.1",
124
+ "@deepseek-ai/dsh-llm": ">=0.1.7-rc.1 <0.1.8 || >=0.2.0-rc.1 <0.2.1",
125
+ "@deepseek-ai/dsh-session": ">=0.1.7-rc.1 <0.1.8 || >=0.2.0-rc.1 <0.2.1",
126
+ "@deepseek-ai/dsh-session-persistence": ">=0.1.7-rc.1 <0.1.8 || >=0.2.0-rc.1 <0.2.1",
127
+ "@deepseek-ai/dsh-settings": ">=0.1.7-rc.1 <0.1.8 || >=0.2.0-rc.1 <0.2.1",
128
+ "@deepseek-ai/dsh-subagent": ">=0.1.7-rc.1 <0.1.8 || >=0.2.0-rc.1 <0.2.1",
129
+ "@deepseek-ai/dsh-user-approval": ">=0.1.7-rc.1 <0.1.8 || >=0.2.0-rc.1 <0.2.1",
130
+ "@deepseek-ai/dsh-user-questions": ">=0.1.7-rc.1 <0.1.8 || >=0.2.0-rc.1 <0.2.1"
129
131
  },
130
132
  "peerDependenciesMeta": {
131
133
  "@deepseek-ai/dsh-agent-preset": {
@@ -134,9 +136,6 @@
134
136
  "@deepseek-ai/dsh-agent-preset-registry": {
135
137
  "optional": true
136
138
  },
137
- "@deepseek-ai/dsh-agent-presets": {
138
- "optional": true
139
- },
140
139
  "@deepseek-ai/dsh-credentials": {
141
140
  "optional": true
142
141
  },
@@ -151,45 +150,81 @@
151
150
  }
152
151
  },
153
152
  "devDependencies": {
154
- "@deepseek-ai/cordis": "4.0.2",
153
+ "@deepseek-ai/cordis": "4.0.4",
154
+ "@deepseek-ai/cordis-plugin-group": "1.0.4",
155
155
  "@deepseek-ai/cordis-plugin-hmr": "1.0.17",
156
- "@deepseek-ai/cordis-plugin-include": "1.0.7",
157
- "@deepseek-ai/cordis-plugin-loader": "1.0.3",
158
- "@deepseek-ai/cordis-plugin-timer": "1.1.4",
159
- "@deepseek-ai/dsh": "0.1.5-rc.3",
160
- "@deepseek-ai/dsh-agent": "0.1.5-rc.3",
161
- "@deepseek-ai/dsh-agent-default-model": "0.1.5-rc.3",
162
- "@deepseek-ai/dsh-agent-loop": "0.1.5-rc.3",
163
- "@deepseek-ai/dsh-agent-presets": "0.1.5-rc.3",
164
- "@deepseek-ai/dsh-atomic-write": "0.1.5-rc.3",
165
- "@deepseek-ai/dsh-attachment": "0.1.5-rc.3",
166
- "@deepseek-ai/dsh-brand": "0.1.5-rc.3",
167
- "@deepseek-ai/dsh-cmdline": "0.1.5-rc.3",
168
- "@deepseek-ai/dsh-commands": "0.1.5-rc.3",
169
- "@deepseek-ai/dsh-credentials": "0.1.5-rc.3",
170
- "@deepseek-ai/dsh-home-paths": "0.1.5-rc.3",
171
- "@deepseek-ai/dsh-invariants": "0.1.5-rc.3",
172
- "@deepseek-ai/dsh-jobs": "0.1.5-rc.3",
173
- "@deepseek-ai/dsh-llm": "0.1.5-rc.3",
174
- "@deepseek-ai/dsh-llm-mock-server": "0.1.5-rc.3",
175
- "@deepseek-ai/dsh-sandbox": "0.1.5-rc.3",
176
- "@deepseek-ai/dsh-sandbox-policy": "0.1.5-rc.3",
177
- "@deepseek-ai/dsh-scope": "0.1.5-rc.3",
178
- "@deepseek-ai/dsh-session": "0.1.5-rc.3",
179
- "@deepseek-ai/dsh-session-persistence": "0.1.5-rc.3",
180
- "@deepseek-ai/dsh-session-projection": "0.1.5-rc.3",
181
- "@deepseek-ai/dsh-session-projection-cache": "0.1.5-rc.3",
182
- "@deepseek-ai/dsh-settings": "0.1.5-rc.3",
183
- "@deepseek-ai/dsh-subagent": "0.1.5-rc.3",
184
- "@deepseek-ai/dsh-system-prompt": "0.1.5-rc.3",
185
- "@deepseek-ai/dsh-timeout": "0.1.5-rc.3",
186
- "@deepseek-ai/dsh-tools": "0.1.5-rc.3",
187
- "@deepseek-ai/dsh-typert-protocol": "0.1.5-rc.3",
188
- "@deepseek-ai/dsh-user-approval": "0.1.5-rc.3",
189
- "@deepseek-ai/dsh-user-questions": "0.1.5-rc.3",
156
+ "@deepseek-ai/cordis-plugin-include": "1.0.9",
157
+ "@deepseek-ai/cordis-plugin-loader": "1.0.5",
158
+ "@deepseek-ai/cordis-plugin-timer": "1.1.6",
159
+ "@deepseek-ai/dsh": "0.2.0-rc.1",
160
+ "@deepseek-ai/dsh-agent": "0.2.0-rc.1",
161
+ "@deepseek-ai/dsh-agent-default-model": "0.2.0-rc.1",
162
+ "@deepseek-ai/dsh-agent-loop": "0.2.0-rc.1",
163
+ "@deepseek-ai/dsh-agent-preset": "0.2.0-rc.1",
164
+ "@deepseek-ai/dsh-agent-preset-registry": "0.2.0-rc.1",
165
+ "@deepseek-ai/dsh-atomic-write": "0.2.0-rc.1",
166
+ "@deepseek-ai/dsh-attachment": "0.2.0-rc.1",
167
+ "@deepseek-ai/dsh-brand": "0.2.0-rc.1",
168
+ "@deepseek-ai/dsh-cmdline": "0.2.0-rc.1",
169
+ "@deepseek-ai/dsh-commands": "0.2.0-rc.1",
170
+ "@deepseek-ai/dsh-credentials": "0.2.0-rc.1",
171
+ "@deepseek-ai/dsh-home-paths": "0.2.0-rc.1",
172
+ "@deepseek-ai/dsh-invariants": "0.2.0-rc.1",
173
+ "@deepseek-ai/dsh-jobs": "0.2.0-rc.1",
174
+ "@deepseek-ai/dsh-llm": "0.2.0-rc.1",
175
+ "@deepseek-ai/dsh-llm-mock-server": "0.2.0-rc.1",
176
+ "@deepseek-ai/dsh-sandbox": "0.2.0-rc.1",
177
+ "@deepseek-ai/dsh-sandbox-policy": "0.2.0-rc.1",
178
+ "@deepseek-ai/dsh-scope": "0.2.0-rc.1",
179
+ "@deepseek-ai/dsh-session": "0.2.0-rc.1",
180
+ "@deepseek-ai/dsh-session-persistence": "0.2.0-rc.1",
181
+ "@deepseek-ai/dsh-session-projection": "0.2.0-rc.1",
182
+ "@deepseek-ai/dsh-session-projection-cache": "0.2.0-rc.1",
183
+ "@deepseek-ai/dsh-settings": "0.2.0-rc.1",
184
+ "@deepseek-ai/dsh-subagent": "0.2.0-rc.1",
185
+ "@deepseek-ai/dsh-system-prompt": "0.2.0-rc.1",
186
+ "@deepseek-ai/dsh-timeout": "0.2.0-rc.1",
187
+ "@deepseek-ai/dsh-tools": "0.2.0-rc.1",
188
+ "@deepseek-ai/dsh-typert-protocol": "0.2.0-rc.1",
189
+ "@deepseek-ai/dsh-user-approval": "0.2.0-rc.1",
190
+ "@deepseek-ai/dsh-user-questions": "0.2.0-rc.1",
190
191
  "@types/node": "^24.0.0",
191
192
  "@xterm/headless": "^6.0.0",
192
193
  "semver": "^7.8.5",
193
194
  "typescript": "^5.9.0"
195
+ },
196
+ "overrides": {
197
+ "@deepseek-ai/dsh": "0.2.0-rc.1",
198
+ "@deepseek-ai/dsh-agent": "0.2.0-rc.1",
199
+ "@deepseek-ai/dsh-agent-default-model": "0.2.0-rc.1",
200
+ "@deepseek-ai/dsh-agent-loop": "0.2.0-rc.1",
201
+ "@deepseek-ai/dsh-agent-preset": "0.2.0-rc.1",
202
+ "@deepseek-ai/dsh-agent-preset-registry": "0.2.0-rc.1",
203
+ "@deepseek-ai/dsh-atomic-write": "0.2.0-rc.1",
204
+ "@deepseek-ai/dsh-attachment": "0.2.0-rc.1",
205
+ "@deepseek-ai/dsh-brand": "0.2.0-rc.1",
206
+ "@deepseek-ai/dsh-cmdline": "0.2.0-rc.1",
207
+ "@deepseek-ai/dsh-commands": "0.2.0-rc.1",
208
+ "@deepseek-ai/dsh-credentials": "0.2.0-rc.1",
209
+ "@deepseek-ai/dsh-home-paths": "0.2.0-rc.1",
210
+ "@deepseek-ai/dsh-invariants": "0.2.0-rc.1",
211
+ "@deepseek-ai/dsh-jobs": "0.2.0-rc.1",
212
+ "@deepseek-ai/dsh-llm": "0.2.0-rc.1",
213
+ "@deepseek-ai/dsh-llm-mock-server": "0.2.0-rc.1",
214
+ "@deepseek-ai/dsh-sandbox": "0.2.0-rc.1",
215
+ "@deepseek-ai/dsh-sandbox-policy": "0.2.0-rc.1",
216
+ "@deepseek-ai/dsh-scope": "0.2.0-rc.1",
217
+ "@deepseek-ai/dsh-session": "0.2.0-rc.1",
218
+ "@deepseek-ai/dsh-session-persistence": "0.2.0-rc.1",
219
+ "@deepseek-ai/dsh-session-projection": "0.2.0-rc.1",
220
+ "@deepseek-ai/dsh-session-projection-cache": "0.2.0-rc.1",
221
+ "@deepseek-ai/dsh-settings": "0.2.0-rc.1",
222
+ "@deepseek-ai/dsh-subagent": "0.2.0-rc.1",
223
+ "@deepseek-ai/dsh-system-prompt": "0.2.0-rc.1",
224
+ "@deepseek-ai/dsh-timeout": "0.2.0-rc.1",
225
+ "@deepseek-ai/dsh-tools": "0.2.0-rc.1",
226
+ "@deepseek-ai/dsh-typert-protocol": "0.2.0-rc.1",
227
+ "@deepseek-ai/dsh-user-approval": "0.2.0-rc.1",
228
+ "@deepseek-ai/dsh-user-questions": "0.2.0-rc.1"
194
229
  }
195
230
  }