@deepseek-harness-tui/dsh-tui 0.7.2 → 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 (119) hide show
  1. package/README.md +3 -3
  2. package/bin/dsh-tui.js +24 -3
  3. package/cordis.patch.yml +24 -11
  4. package/cordis.yml +9 -1
  5. package/lib/types/commands.d.ts.map +1 -1
  6. package/lib/types/commands.js +2 -1
  7. package/lib/types/components/GoalTodoPanel.d.ts.map +1 -1
  8. package/lib/types/components/GoalTodoPanel.js +6 -1
  9. package/lib/types/components/HistorySearchDialog.d.ts.map +1 -1
  10. package/lib/types/components/HistorySearchDialog.js +5 -1
  11. package/lib/types/components/MessageList.d.ts +3 -1
  12. package/lib/types/components/MessageList.d.ts.map +1 -1
  13. package/lib/types/components/MessageList.js +9 -5
  14. package/lib/types/components/PluginSceneBoundary.d.ts +31 -0
  15. package/lib/types/components/PluginSceneBoundary.d.ts.map +1 -0
  16. package/lib/types/components/PluginSceneBoundary.js +29 -0
  17. package/lib/types/components/PromptInput.d.ts.map +1 -1
  18. package/lib/types/components/PromptInput.js +52 -74
  19. package/lib/types/components/SearchBox.d.ts +4 -0
  20. package/lib/types/components/SearchBox.d.ts.map +1 -1
  21. package/lib/types/components/SearchBox.js +101 -2
  22. package/lib/types/components/SkillsPicker.d.ts +18 -0
  23. package/lib/types/components/SkillsPicker.d.ts.map +1 -0
  24. package/lib/types/components/SkillsPicker.js +50 -0
  25. package/lib/types/components/Spinner/SpinnerAnimationRow.d.ts +4 -1
  26. package/lib/types/components/Spinner/SpinnerAnimationRow.d.ts.map +1 -1
  27. package/lib/types/components/Spinner/SpinnerAnimationRow.js +10 -5
  28. package/lib/types/components/SplitDiffView.d.ts +28 -0
  29. package/lib/types/components/SplitDiffView.d.ts.map +1 -0
  30. package/lib/types/components/SplitDiffView.js +417 -0
  31. package/lib/types/components/WorkingSpinner.d.ts +3 -1
  32. package/lib/types/components/WorkingSpinner.d.ts.map +1 -1
  33. package/lib/types/components/WorkingSpinner.js +2 -2
  34. package/lib/types/components/design-system/ThemedText.d.ts +7 -1
  35. package/lib/types/components/design-system/ThemedText.d.ts.map +1 -1
  36. package/lib/types/components/design-system/ThemedText.js +2 -2
  37. package/lib/types/components/messages/AssistantToolUseMessage.d.ts +3 -1
  38. package/lib/types/components/messages/AssistantToolUseMessage.d.ts.map +1 -1
  39. package/lib/types/components/messages/AssistantToolUseMessage.js +17 -7
  40. package/lib/types/components/questions/AskUserQuestionPanel.d.ts.map +1 -1
  41. package/lib/types/components/questions/AskUserQuestionPanel.js +52 -8
  42. package/lib/types/components/questions/PlanReviewPanel.d.ts.map +1 -1
  43. package/lib/types/components/questions/PlanReviewPanel.js +12 -3
  44. package/lib/types/dsh-adapter/channel.d.ts +78 -0
  45. package/lib/types/dsh-adapter/channel.d.ts.map +1 -1
  46. package/lib/types/dsh-adapter/channel.js +165 -14
  47. package/lib/types/dsh-adapter/contract.d.ts +1 -1
  48. package/lib/types/dsh-adapter/contract.d.ts.map +1 -1
  49. package/lib/types/dsh-adapter/contract.js +1 -0
  50. package/lib/types/dsh-adapter/index.d.ts +4 -0
  51. package/lib/types/dsh-adapter/index.d.ts.map +1 -1
  52. package/lib/types/dsh-adapter/index.js +1 -0
  53. package/lib/types/dsh-adapter/packaged-presets.d.ts.map +1 -1
  54. package/lib/types/dsh-adapter/packaged-presets.js +5 -2
  55. package/lib/types/dsh-adapter/plugin.d.ts.map +1 -1
  56. package/lib/types/dsh-adapter/plugin.js +66 -3
  57. package/lib/types/dsh-adapter/promptDebug.d.ts +10 -0
  58. package/lib/types/dsh-adapter/promptDebug.d.ts.map +1 -0
  59. package/lib/types/dsh-adapter/promptDebug.js +148 -0
  60. package/lib/types/dsh-adapter/providerWizard.d.ts.map +1 -1
  61. package/lib/types/dsh-adapter/providerWizard.js +3 -1
  62. package/lib/types/dsh-adapter/scenes.d.ts +75 -0
  63. package/lib/types/dsh-adapter/scenes.d.ts.map +1 -0
  64. package/lib/types/dsh-adapter/scenes.js +78 -0
  65. package/lib/types/dsh-adapter/settings-sections.d.ts +116 -0
  66. package/lib/types/dsh-adapter/settings-sections.d.ts.map +1 -0
  67. package/lib/types/dsh-adapter/settings-sections.js +63 -0
  68. package/lib/types/dsh-adapter/settingsEditor.d.ts +128 -0
  69. package/lib/types/dsh-adapter/settingsEditor.d.ts.map +1 -0
  70. package/lib/types/dsh-adapter/settingsEditor.js +244 -0
  71. package/lib/types/i18n.d.ts +169 -18
  72. package/lib/types/i18n.d.ts.map +1 -1
  73. package/lib/types/i18n.js +45 -6
  74. package/lib/types/ink/components/Text.d.ts +9 -1
  75. package/lib/types/ink/components/Text.d.ts.map +1 -1
  76. package/lib/types/ink/components/Text.js +7 -6
  77. package/lib/types/ink/ink.d.ts.map +1 -1
  78. package/lib/types/ink/ink.js +4 -2
  79. package/lib/types/ink/log-update.d.ts.map +1 -1
  80. package/lib/types/ink/log-update.js +76 -9
  81. package/lib/types/ink/parse-keypress.d.ts.map +1 -1
  82. package/lib/types/ink/parse-keypress.js +4 -1
  83. package/lib/types/ink/terminal.d.ts +40 -4
  84. package/lib/types/ink/terminal.d.ts.map +1 -1
  85. package/lib/types/ink/terminal.js +57 -5
  86. package/lib/types/ink/termio/tokenize.d.ts +6 -0
  87. package/lib/types/ink/termio/tokenize.d.ts.map +1 -1
  88. package/lib/types/ink/termio/tokenize.js +18 -4
  89. package/lib/types/jsx-runtime.d.ts +2 -0
  90. package/lib/types/jsx-runtime.d.ts.map +1 -0
  91. package/lib/types/jsx-runtime.js +13 -0
  92. package/lib/types/modelRoute.d.ts +10 -2
  93. package/lib/types/modelRoute.d.ts.map +1 -1
  94. package/lib/types/modelRoute.js +33 -4
  95. package/lib/types/scenes.d.ts +3 -0
  96. package/lib/types/scenes.d.ts.map +1 -0
  97. package/lib/types/scenes.js +4 -0
  98. package/lib/types/screens/Chat.d.ts.map +1 -1
  99. package/lib/types/screens/Chat.js +182 -26
  100. package/lib/types/screens/SessionBrowser.d.ts.map +1 -1
  101. package/lib/types/screens/SessionBrowser.js +30 -15
  102. package/lib/types/screens/Settings.d.ts +20 -0
  103. package/lib/types/screens/Settings.d.ts.map +1 -0
  104. package/lib/types/screens/Settings.js +333 -0
  105. package/lib/types/screens/StatusLine.js +1 -1
  106. package/lib/types/sessions/view.d.ts.map +1 -1
  107. package/lib/types/sessions/view.js +13 -1
  108. package/lib/types/settings-sections.d.ts +3 -0
  109. package/lib/types/settings-sections.d.ts.map +1 -0
  110. package/lib/types/settings-sections.js +4 -0
  111. package/lib/types/theme.d.ts +12 -0
  112. package/lib/types/theme.d.ts.map +1 -1
  113. package/lib/types/theme.js +36 -0
  114. package/lib/types/update.d.ts +21 -7
  115. package/lib/types/update.d.ts.map +1 -1
  116. package/lib/types/update.js +66 -16
  117. package/lib/types/utils/paths.d.ts.map +1 -1
  118. package/lib/types/utils/paths.js +4 -1
  119. package/package.json +49 -9
@@ -155,9 +155,17 @@ function runProcess(command, args, options = {}) {
155
155
  : [command, args];
156
156
  const child = spawn(runCommand, runArgs, {
157
157
  env: options.env,
158
- stdio: 'inherit',
158
+ stdio: options.onStderr === undefined ? 'inherit' : ['inherit', 'inherit', 'pipe'],
159
159
  shell: useShell,
160
160
  });
161
+ if (options.onStderr !== undefined && child.stderr !== null) {
162
+ const onStderr = options.onStderr;
163
+ child.stderr.on('data', (chunk) => {
164
+ const text = chunk.toString('utf8');
165
+ process.stderr.write(text);
166
+ onStderr(text);
167
+ });
168
+ }
161
169
  const finish = (code) => {
162
170
  if (settled)
163
171
  return;
@@ -171,35 +179,77 @@ function runProcess(command, args, options = {}) {
171
179
  child.once('close', code => finish(code ?? 1));
172
180
  });
173
181
  }
182
+ /** Build the profile-manager command, preferring a preflight-pinned version. */
183
+ export function tuiUpdatePluginArgs(profile, targetVersion) {
184
+ return targetVersion === undefined
185
+ ? ['plugin', '--profile', profile, 'update', '--latest', PACKAGE_NAME]
186
+ : ['plugin', '--profile', profile, 'update', `${PACKAGE_NAME}@${targetVersion}`];
187
+ }
188
+ /**
189
+ * The pnpm Windows tmp-rename race signature (issue #225): pnpm swaps a
190
+ * package directory via a `<name>_tmp_<pid>` staging dir, and a file lock or
191
+ * AV scan makes the scandir/rename fail with ENOENT/EPERM/EBUSY. The failure
192
+ * is transient — the identical command succeeds on retry — but the crashed
193
+ * run leaves a half-updated profile (manifest pins the old version while the
194
+ * lockfile already carries the new snapshot), which presents as "update did
195
+ * nothing" (#209). Genuine resolution errors never carry the `_tmp_<pid>`
196
+ * token, so matching both keeps the retry from masking real failures.
197
+ */
198
+ export function isTransientUpdateFailure(stderr) {
199
+ return /ENOENT|EPERM|EBUSY/i.test(stderr) && /_tmp_\d+/i.test(stderr);
200
+ }
174
201
  /**
175
202
  * Update the installed dsh-tui package and restart the same launcher while
176
203
  * preserving the active session. The TUI must already be unmounted before
177
204
  * this is called so pnpm output cannot corrupt the rendered terminal frame.
178
205
  *
179
- * `--latest` is required: `pnpm add` writes a caret range into the profile
180
- * manifest, and a plain `pnpm update` stays inside that range — with this
181
- * project's minor-per-release cadence the TUI would restart unchanged while
182
- * reporting success. The restart carries `DSH_TUI_UPDATED_FROM` so the new
183
- * process can warn when the version did not actually move (e.g. a mirror
184
- * registry still serving the old `latest`).
206
+ * When the preflight registry check resolved an exact target, pass that
207
+ * version to pnpm instead of resolving `latest` a second time. This avoids a
208
+ * stale mirror/dist-tag response between the check and install. If preflight
209
+ * failed, retain the `--latest` fallback: a plain `pnpm update` stays inside
210
+ * the manifest range and can restart unchanged across minor releases.
185
211
  *
186
212
  * @param sessionId - Session to resume in the replacement process.
187
213
  * @param profile - The dsh profile this TUI was launched with; updating any
188
214
  * other profile would leave the running install untouched.
215
+ * @param targetVersion - Exact version returned by the preflight registry
216
+ * check, or undefined when that check failed and pnpm should resolve latest.
189
217
  * @returns Exit codes for the update run and the replacement process.
190
218
  */
191
- export async function updateTuiAndRestart(sessionId, profile) {
219
+ export async function updateTuiAndRestart(sessionId, profile, targetVersion) {
192
220
  const dsh = process.platform === 'win32' ? 'dsh.cmd' : 'dsh';
193
- const updateCode = await runProcess(dsh, [
194
- 'plugin',
195
- '--profile',
196
- profile,
197
- 'update',
198
- '--latest',
199
- PACKAGE_NAME,
200
- ], { shell: true });
221
+ const updateArgs = tuiUpdatePluginArgs(profile, targetVersion);
222
+ let updateStderr = '';
223
+ const capture = (chunk) => { updateStderr += chunk; };
224
+ let updateCode = await runProcess(dsh, updateArgs, { shell: true, onStderr: capture });
225
+ // Transient Windows tmp-rename race (issue #225): retry the identical
226
+ // command once — it succeeds on a clean second run, and only the
227
+ // `_tmp_<pid>` race signature qualifies, never a real resolution error.
228
+ if (updateCode !== 0 && isTransientUpdateFailure(updateStderr)) {
229
+ process.stderr.write('dsh-tui: transient pnpm failure (Windows tmp-rename race) — retrying once…\n');
230
+ updateStderr = '';
231
+ updateCode = await runProcess(dsh, updateArgs, { shell: true, onStderr: capture });
232
+ }
201
233
  if (updateCode !== 0)
202
234
  return { updateCode, restartCode: updateCode };
235
+ // Post-update verification (issue #225): pnpm can report success yet leave
236
+ // the profile half-updated (manifest old / lockfile new). Verify against
237
+ // the preflight target; a full `install` reconciles lockfile →
238
+ // node_modules, and if the mismatch survives, stop before restarting into
239
+ // a mixed state and hand the user the exact repair command instead.
240
+ if (targetVersion !== undefined) {
241
+ let installed = installedTuiVersion();
242
+ if (installed !== targetVersion) {
243
+ await runProcess(dsh, ['plugin', '--profile', profile, 'install'], { shell: true });
244
+ installed = installedTuiVersion();
245
+ }
246
+ if (installed !== targetVersion) {
247
+ process.stderr.write(`dsh-tui: update completed but the profile still runs ${installed ?? 'an unreadable version'} ` +
248
+ `(expected ${targetVersion}) — the profile is half-updated. Repair manually with:\n` +
249
+ ` dsh plugin --profile ${profile} add ${PACKAGE_NAME}@${targetVersion}\n`);
250
+ return { updateCode: 1, restartCode: 1 };
251
+ }
252
+ }
203
253
  const restartCode = await runProcess(process.execPath, [...process.execArgv, ...process.argv.slice(1)], {
204
254
  env: {
205
255
  ...process.env,
@@ -1 +1 @@
1
- {"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../../../src/utils/paths.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAMH;;;;GAIG;AACH,wBAAgB,OAAO,IAAI,MAAM,CAEhC;AAED,qEAAqE;AACrE,eAAO,MAAM,QAAQ,QAA8B,CAAA;AAEnD,wEAAwE;AACxE,eAAO,MAAM,eAAe,QAA6B,CAAA;AAEzD;;;;;;;;GAQG;AACH,wBAAgB,oBAAoB,CAClC,MAAM,GAAE,MAAwB,EAChC,MAAM,GAAE,MAAiB,GACxB,OAAO,CAIT;AAED;;;;GAIG;AACH,eAAO,MAAM,WAAW,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAaxD,CAAA;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAC7B,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,MAAM,EAAE,CAEV"}
1
+ {"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../../../src/utils/paths.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAMH;;;;GAIG;AACH,wBAAgB,OAAO,IAAI,MAAM,CAEhC;AAED,qEAAqE;AACrE,eAAO,MAAM,QAAQ,QAA8B,CAAA;AAEnD,wEAAwE;AACxE,eAAO,MAAM,eAAe,QAA6B,CAAA;AAEzD;;;;;;;;GAQG;AACH,wBAAgB,oBAAoB,CAClC,MAAM,GAAE,MAAwB,EAChC,MAAM,GAAE,MAAiB,GACxB,OAAO,CAOT;AAED;;;;GAIG;AACH,eAAO,MAAM,WAAW,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAaxD,CAAA;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAC7B,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,MAAM,EAAE,CAEV"}
@@ -35,7 +35,10 @@ export const LEGACY_DATA_DIR = join(homeDir(), '.dsh-cc');
35
35
  export function migrateLegacyDataDir(legacy = LEGACY_DATA_DIR, target = DATA_DIR) {
36
36
  if (!existsSync(legacy) || existsSync(target))
37
37
  return false;
38
- cpSync(legacy, target, { recursive: true });
38
+ // `filter` forces the JS copy path: the native cpSync fast path fails with
39
+ // EIO (or crashes) on Windows when the destination lives under a home
40
+ // directory whose name contains non-ASCII characters (e.g. `C:\Users\米`).
41
+ cpSync(legacy, target, { recursive: true, filter: () => true });
39
42
  return true;
40
43
  }
41
44
  /**
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@deepseek-harness-tui/dsh-tui",
3
- "version": "0.7.2",
3
+ "version": "0.8.0",
4
4
  "description": "Claude Code style interactive TUI front door for DeepSeek Harness agents, built on the ported Ink core.",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -37,6 +37,18 @@
37
37
  "types": "./lib/types/command-trees.d.ts",
38
38
  "import": "./lib/types/command-trees.js"
39
39
  },
40
+ "./settings-sections": {
41
+ "types": "./lib/types/settings-sections.d.ts",
42
+ "import": "./lib/types/settings-sections.js"
43
+ },
44
+ "./scenes": {
45
+ "types": "./lib/types/scenes.d.ts",
46
+ "import": "./lib/types/scenes.js"
47
+ },
48
+ "./jsx-runtime": {
49
+ "types": "./lib/types/jsx-runtime.d.ts",
50
+ "import": "./lib/types/jsx-runtime.js"
51
+ },
40
52
  "./invariant": {
41
53
  "types": "./lib/types/dsh-adapter/invariant.d.ts",
42
54
  "default": "./lib/types/dsh-adapter/invariant.js"
@@ -57,16 +69,13 @@
57
69
  },
58
70
  "peerDependencies": {
59
71
  "@deepseek-ai/cordis": "^4.0.1",
60
- "@deepseek-ai/dsh-invariants": "^0.1.0-rc.6"
61
- },
62
- "dependencies": {
63
- "@alcalzone/ansi-tokenize": "^0.3.0",
64
72
  "@deepseek-ai/dsh-agent": "^0.1.0-rc.6",
65
73
  "@deepseek-ai/dsh-agent-instructions": "^0.1.0-rc.6",
66
74
  "@deepseek-ai/dsh-agent-presets": "^0.1.0-rc.6",
67
- "@deepseek-ai/dsh-agent-tool-presentation": "^0.1.0-rc.6",
75
+ "@deepseek-ai/dsh-atomic-write": "^0.1.0-rc.6",
68
76
  "@deepseek-ai/dsh-commands": "^0.1.0-rc.6",
69
77
  "@deepseek-ai/dsh-cordis-host-runner": "^0.1.0-rc.6",
78
+ "@deepseek-ai/dsh-invariants": "^0.1.0-rc.6",
70
79
  "@deepseek-ai/dsh-llm": "^0.1.0-rc.6",
71
80
  "@deepseek-ai/dsh-persona": "^0.1.0-rc.6",
72
81
  "@deepseek-ai/dsh-session": "^0.1.0-rc.6",
@@ -83,14 +92,18 @@
83
92
  "@deepseek-ai/dsh-user-approval": "^0.1.0-rc.6",
84
93
  "@deepseek-ai/dsh-user-questions": "^0.1.0-rc.6",
85
94
  "@deepseek-ai/dsh-workspace": "^0.1.0-rc.6",
86
- "@deepseek-ai/schemastery": "^3.18.1",
95
+ "@deepseek-ai/schemastery": "^3.18.1"
96
+ },
97
+ "dependencies": {
98
+ "@alcalzone/ansi-tokenize": "^0.3.0",
87
99
  "auto-bind": "^4.0.0 || ^5.0.0",
88
100
  "bidi-js": "^1.0.0",
89
101
  "chalk": "^5.0.0",
90
102
  "cli-boxes": "^3.0.0 || ^4.0.0",
91
103
  "cli-highlight": "^2.1.11",
92
104
  "code-excerpt": "^3.0.0 || ^4.0.0",
93
- "dsh-working-activity": "^0.2.4",
105
+ "diff": "^8.0.4",
106
+ "dsh-working-activity": "^0.2.6",
94
107
  "emoji-regex": "^10.0.0",
95
108
  "figures": "^6.1.0",
96
109
  "get-east-asian-width": "^1.0.0",
@@ -113,26 +126,47 @@
113
126
  "@deepseek-ai/cordis": "^4.0.1",
114
127
  "@deepseek-ai/cordis-plugin-include": "^1.0.6",
115
128
  "@deepseek-ai/cordis-plugin-loader": "^1.0.2",
129
+ "@deepseek-ai/dsh-agent": "^0.1.0-rc.6",
130
+ "@deepseek-ai/dsh-agent-instructions": "^0.1.0-rc.6",
131
+ "@deepseek-ai/dsh-agent-presets": "^0.1.0-rc.6",
116
132
  "@deepseek-ai/dsh-atomic-write": "^0.1.0-rc.6",
117
133
  "@deepseek-ai/dsh-attachment": "^0.1.0-rc.6",
118
134
  "@deepseek-ai/dsh-brand": "^0.1.0-rc.6",
119
135
  "@deepseek-ai/dsh-code-runtime": "^0.1.0-rc.6",
136
+ "@deepseek-ai/dsh-commands": "^0.1.0-rc.6",
137
+ "@deepseek-ai/dsh-cordis-host-runner": "^0.1.0-rc.6",
120
138
  "@deepseek-ai/dsh-fs": "^0.1.0-rc.6",
121
139
  "@deepseek-ai/dsh-home-paths": "^0.1.0-rc.6",
122
140
  "@deepseek-ai/dsh-invariants": "^0.1.0-rc.6",
141
+ "@deepseek-ai/dsh-llm": "^0.1.0-rc.6",
142
+ "@deepseek-ai/dsh-persona": "^0.1.0-rc.6",
123
143
  "@deepseek-ai/dsh-sandbox": "^0.1.0-rc.6",
124
144
  "@deepseek-ai/dsh-sandbox-policy": "^0.1.0-rc.6",
125
145
  "@deepseek-ai/dsh-scope": "^0.1.0-rc.6",
146
+ "@deepseek-ai/dsh-session": "^0.1.0-rc.6",
126
147
  "@deepseek-ai/dsh-session-persistence": "^0.1.0-rc.6",
127
148
  "@deepseek-ai/dsh-session-persistence-jsonl": "^0.1.0-rc.6",
128
149
  "@deepseek-ai/dsh-session-persistence-sqlite": "^0.1.0-rc.6",
129
150
  "@deepseek-ai/dsh-settings": "^0.1.0-rc.6",
151
+ "@deepseek-ai/dsh-skill": "^0.1.0-rc.6",
152
+ "@deepseek-ai/dsh-storage": "^0.1.0-rc.6",
153
+ "@deepseek-ai/dsh-storage-domain": "^0.1.0-rc.6",
154
+ "@deepseek-ai/dsh-storage-json": "^0.1.0-rc.6",
130
155
  "@deepseek-ai/dsh-subprocess": "^0.1.0-rc.6",
156
+ "@deepseek-ai/dsh-system-prompt": "^0.1.0-rc.6",
157
+ "@deepseek-ai/dsh-terminal": "^0.1.0-rc.6",
158
+ "@deepseek-ai/dsh-terminal-bash": "^0.1.0-rc.6",
131
159
  "@deepseek-ai/dsh-timeout": "^0.1.0-rc.6",
160
+ "@deepseek-ai/dsh-tool-ask-user": "^0.1.0-rc.6",
161
+ "@deepseek-ai/dsh-tool-bash-persistent": "^0.1.0-rc.6",
162
+ "@deepseek-ai/dsh-tool-cordis": "^0.1.0-rc.6",
132
163
  "@deepseek-ai/dsh-tools": "^0.1.0-rc.6",
133
164
  "@deepseek-ai/dsh-typert-protocol": "^0.1.0-rc.6",
134
165
  "@deepseek-ai/dsh-user-approval": "^0.1.0-rc.6",
166
+ "@deepseek-ai/dsh-user-questions": "^0.1.0-rc.6",
135
167
  "@deepseek-ai/dsh-web-app": "0.1.0-rc.6",
168
+ "@deepseek-ai/dsh-workspace": "^0.1.0-rc.6",
169
+ "@deepseek-ai/schemastery": "^3.18.1",
136
170
  "@types/lodash-es": "^4.17.0",
137
171
  "@types/node": "^22.0.0",
138
172
  "@types/react": "^19.0.0",
@@ -152,16 +186,22 @@
152
186
  "clean": "node scripts/clean-lib.mjs",
153
187
  "compile": "npm run clean && tsc -p tsconfig.json",
154
188
  "build": "npm run compile && npm run verify:build",
189
+ "dev": "node scripts/dev-test.mjs",
190
+ "dev:copy-config": "node scripts/dev-copy-config.mjs",
191
+ "dev:test": "node scripts/verify-dev-command.mjs && node scripts/dev-test.mjs --no-launch",
192
+ "prompt:debug": "node scripts/read-prompt-debug.mjs",
155
193
  "tui": "node --import tsx/esm scripts/run.ts",
156
194
  "smoke": "node --import tsx/esm scripts/smoke.tsx",
157
- "verify:build": "npm run verify:boundary && npm run verify:contract && npm run verify:patch-surface && npm run verify:packaged-presets && npm run verify:minimal-preset-tools && npm run verify:liangshen-bootstrap",
195
+ "verify:build": "npm run verify:boundary && npm run verify:contract && npm run verify:manifest-deps && npm run verify:patch-surface && npm run verify:packaged-presets && npm run verify:minimal-preset-tools && npm run verify:liangshen-bootstrap",
158
196
  "verify:boundary": "node --import tsx/esm scripts/verify-adapter-boundary.ts",
159
197
  "verify:contract": "node --import tsx/esm scripts/verify-upstream-contract.ts",
198
+ "verify:manifest-deps": "node --import tsx/esm scripts/verify-manifest-deps.ts",
160
199
  "verify:patch-surface": "node --import tsx/esm scripts/verify-patch-surface.ts",
161
200
  "verify:packaged-presets": "node scripts/verify-packaged-presets.mjs",
162
201
  "verify:minimal-preset-tools": "node scripts/verify-minimal-preset-tools.mjs",
163
202
  "verify:liangshen-bootstrap": "node scripts/verify-liangshen-bootstrap.mjs",
164
203
  "verify:package": "npm pack --dry-run --json --ignore-scripts | node scripts/verify-package.mjs",
204
+ "verify:prompt-debug": "npm run build && node scripts/verify-prompt-debug.mjs",
165
205
  "verify:clipboard-image": "node --import tsx/esm scripts/verify-clipboard-image.ts"
166
206
  }
167
207
  }