dsh-code 1.0.1 → 1.0.3

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 (44) hide show
  1. package/README.en.md +21 -13
  2. package/README.md +21 -13
  3. package/lib/index.mjs +1902 -1092
  4. package/lib/types/app.d.ts +4 -13
  5. package/lib/types/attachments.d.ts +1 -1
  6. package/lib/types/editor-keys.d.ts +105 -0
  7. package/lib/types/git-workflow.d.ts +6 -2
  8. package/lib/types/keyboard.d.ts +31 -0
  9. package/lib/types/mentions.d.ts +2 -0
  10. package/lib/types/model-capabilities.d.ts +82 -0
  11. package/lib/types/provider-settings.d.ts +7 -0
  12. package/lib/types/render/animations.d.ts +27 -11
  13. package/lib/types/render/editor.d.ts +32 -7
  14. package/lib/types/render/lines.d.ts +26 -1
  15. package/lib/types/render/markdown.d.ts +1 -1
  16. package/lib/types/render/projection.d.ts +15 -1
  17. package/lib/types/render/text.d.ts +15 -9
  18. package/lib/types/render/width.d.ts +29 -0
  19. package/lib/types/session-directory.d.ts +27 -0
  20. package/lib/types/settings-file.d.ts +33 -0
  21. package/lib/types/store.d.ts +10 -0
  22. package/lib/types/subagents.d.ts +13 -3
  23. package/package.json +159 -159
  24. package/src/app.ts +920 -764
  25. package/src/attachments.ts +7 -0
  26. package/src/editor-keys.ts +371 -0
  27. package/src/git-workflow.ts +10 -6
  28. package/src/index.ts +1637 -1523
  29. package/src/internals.ts +26 -9
  30. package/src/keyboard.ts +131 -7
  31. package/src/mentions.ts +6 -1
  32. package/src/model-capabilities.ts +318 -0
  33. package/src/provider-settings.ts +16 -0
  34. package/src/render/animations.ts +64 -17
  35. package/src/render/editor.ts +125 -25
  36. package/src/render/lines.ts +403 -342
  37. package/src/render/markdown.ts +4 -7
  38. package/src/render/projection.ts +63 -40
  39. package/src/render/text.ts +152 -150
  40. package/src/render/width.ts +189 -0
  41. package/src/session-directory.ts +56 -0
  42. package/src/settings-file.ts +56 -0
  43. package/src/store.ts +26 -7
  44. package/src/subagents.ts +39 -6
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Serialized, crash-atomic persistence for the small user-level JSON files
3
+ * under the DSH home (statusline.json, theme.json). Two guarantees the bare
4
+ * floating `writeFile` path could not give:
5
+ *
6
+ * 1. Every save is appended to ONE chain, so rapid consecutive edits land
7
+ * in submission order and the last snapshot is the one on disk (parallel
8
+ * floating writes let an older snapshot finish last and win).
9
+ * 2. Each write goes to a sibling temp file first and is renamed into
10
+ * place, so a crash mid-write can never leave a half-written JSON
11
+ * document behind.
12
+ *
13
+ * The chain itself never rejects: a failed write is reported to that
14
+ * save's caller while later saves keep their turn.
15
+ *
16
+ * @module @deepseek-ai/dsh-code/settings-file
17
+ */
18
+ /** The serialized persistence surface; flush() is handed to the quit sequence. */
19
+ export interface UserSettingsPersistence {
20
+ /**
21
+ * Queue one file snapshot. Resolves when the chain reaches (and renames)
22
+ * it; rejects only to THIS caller when its own write failed.
23
+ */
24
+ save(path: string, text: string): Promise<void>;
25
+ /** Wait for every queued write; safe to call repeatedly. */
26
+ flush(): Promise<void>;
27
+ }
28
+ /**
29
+ * Create the shared settings-write chain. One instance per process keeps
30
+ * every user-level JSON file mutually serialized.
31
+ * @returns the persistence handle.
32
+ */
33
+ export declare function createUserSettingsPersistence(): UserSettingsPersistence;
@@ -3,6 +3,16 @@
3
3
  * and notifies subscribers. The renderer subscribes through
4
4
  * `useSyncExternalStore`; the runner owns event feeding.
5
5
  *
6
+ * Folding runs on the same mutable replay accumulator the persisted-log
7
+ * path uses (`replayProjectEvent`: id-indexed row updates, in-place
8
+ * appends), so a live structural event costs O(1) entry work regardless of
9
+ * transcript length — the copy-on-write fold rebuilt the whole entries
10
+ * array per event, making a growing session quadratic. An immutable
11
+ * `TranscriptView` snapshot is materialized only when a changed view is
12
+ * READ (once per rendered frame under the notification throttle, never per
13
+ * event), and every snapshot copies its arrays, so a view already handed
14
+ * out never observes later folds.
15
+ *
6
16
  * Notification coalescing: the fold stays synchronous — `getView()` always
7
17
  * returns the latest state the moment `apply` returns — but listener
8
18
  * notification is frame-throttled (~16ms) and deduplicated. The zai/GLM
@@ -7,8 +7,13 @@
7
7
  *
8
8
  * This is NOT a second transcript: each child folds to ONE row (label,
9
9
  * running state, bounded last-activity text), capped at
10
- * {@link MAX_SUBAGENT_ROWS}. Rows are advisory display state, rebuilt from
11
- * live events; nothing here persists or replays. Notification is coalesced
10
+ * {@link MAX_SUBAGENT_ROWS}. The cap is a display budget, not a fan-out
11
+ * limit: a new running child evicts the OLDEST settled row when one
12
+ * exists, and while every row is busy the newcomer waits off-screen — but
13
+ * the observed-session total (getTotalSeen) keeps counting, so status
14
+ * totals never under-report the fan-out. Rows are advisory display
15
+ * state, rebuilt from live events; nothing here persists or replays.
16
+ * Notification is coalesced
12
17
  * by the same ~16ms frame throttle as the transcript store (per-burst
13
18
  * microtask notify chained SyncLane rerenders past React's nested update
14
19
  * limit; a bare macrotask merge repaints a whole turn's bursts at once).
@@ -16,7 +21,7 @@
16
21
  * @module @deepseek-ai/dsh-code/subagents
17
22
  */
18
23
  import type { SessionEvent } from '@deepseek-ai/dsh-session';
19
- /** Hard row cap: a fan-out larger than this stays summarized by the head. */
24
+ /** Hard row cap: overflow evicts the oldest settled row; a fully busy feed waits. */
20
25
  export declare const MAX_SUBAGENT_ROWS = 8;
21
26
  /** One live subagent row in the feed. */
22
27
  export interface SubagentRow {
@@ -37,6 +42,11 @@ export interface SubagentFeedView {
37
42
  subscribe(listener: () => void): () => void;
38
43
  /** Read the current rows (identity-stable between changes). */
39
44
  getSnapshot(): readonly SubagentRow[];
45
+ /**
46
+ * Distinct child sessions observed since the last reset. The row cap is
47
+ * a display budget, not a count of the fan-out; totals surface this.
48
+ */
49
+ getTotalSeen(): number;
40
50
  }
41
51
  /**
42
52
  * Fold one child-session event into its feed row (pure).
package/package.json CHANGED
@@ -1,159 +1,159 @@
1
- {
2
- "name": "dsh-code",
3
- "description": "DeepSeek Harness CLI core bundle: interactive coding terminal, durable sessions, and model management for dsh --profile cli",
4
- "version": "1.0.1",
5
- "type": "module",
6
- "bin": {
7
- "deepseek": "./bin/deepseek.mjs",
8
- "dsh-code": "./bin/deepseek.mjs"
9
- },
10
- "main": "lib/index.mjs",
11
- "types": "lib/types/index.d.ts",
12
- "exports": {
13
- ".": {
14
- "types": "./lib/types/index.d.ts",
15
- "default": "./lib/index.mjs"
16
- },
17
- "./startup": {
18
- "types": "./lib/types/startup.d.ts",
19
- "default": "./lib/startup.mjs"
20
- },
21
- "./invariant": {
22
- "types": "./lib/types/invariant.d.ts",
23
- "default": "./lib/invariant.mjs"
24
- },
25
- "./cordis.patch.yml": "./cordis.patch.yml",
26
- "./src/*": "./src/*",
27
- "./package.json": "./package.json"
28
- },
29
- "files": [
30
- "lib",
31
- "cordis.patch.yml",
32
- "src"
33
- ],
34
- "license": "MIT",
35
- "keywords": [
36
- "deepseek",
37
- "dsh",
38
- "deepseek-harness",
39
- "tui",
40
- "terminal",
41
- "claude-code",
42
- "agent",
43
- "ink"
44
- ],
45
- "repository": {
46
- "type": "git",
47
- "url": "git+https://github.com/unlinearity/dsh-code.git"
48
- },
49
- "dsh": {
50
- "bundle": {
51
- "patch": "./cordis.patch.yml"
52
- }
53
- },
54
- "scripts": {
55
- "build": "tsdown && tsc -p tsconfig.json",
56
- "test": "vitest run",
57
- "typecheck": "tsc -p tsconfig.json --noEmit",
58
- "gen:whale": "tsx scripts/gen-whale-glyph.ts",
59
- "prepare": "pnpm build",
60
- "prepublishOnly": "pnpm typecheck && pnpm test && pnpm build"
61
- },
62
- "engines": {
63
- "node": "^22.19 || >=24"
64
- },
65
- "dependencies": {
66
- "@deepseek-ai/dsh-authorization": "0.1.1-rc.2",
67
- "@deepseek-ai/dsh-web-fetch-http": "0.1.1-rc.2",
68
- "@deepseek-ai/schemastery": "^3.18.1",
69
- "chalk": "^5.6.2",
70
- "commander": "^15.0.0",
71
- "ink": "^5.2.1",
72
- "react": "^18.3.1"
73
- },
74
- "peerDependencies": {
75
- "@deepseek-ai/cordis": "^4.0.1",
76
- "@deepseek-ai/cordis-plugin-loader": "^1.0.2",
77
- "@deepseek-ai/dsh-attachment": "0.1.1-rc.2",
78
- "@deepseek-ai/dsh-agent": "0.1.1-rc.2",
79
- "@deepseek-ai/dsh-agent-default-model": "0.1.1-rc.2",
80
- "@deepseek-ai/dsh-agent-presets": "0.1.1-rc.2",
81
- "@deepseek-ai/dsh-cmdline": "0.1.1-rc.2",
82
- "@deepseek-ai/dsh-code-runtime-worker-thread": "0.1.1-rc.2",
83
- "@deepseek-ai/dsh-commands": "0.1.1-rc.2",
84
- "@deepseek-ai/dsh-compaction": "0.1.1-rc.2",
85
- "@deepseek-ai/dsh-cordis-host-runner": "0.1.1-rc.2",
86
- "@deepseek-ai/dsh-credentials": "0.1.1-rc.2",
87
- "@deepseek-ai/dsh-file-reference-local": "0.1.1-rc.2",
88
- "@deepseek-ai/dsh-goal": "0.1.1-rc.2",
89
- "@deepseek-ai/dsh-invariants": "0.1.1-rc.2",
90
- "@deepseek-ai/dsh-jobs": "0.1.1-rc.2",
91
- "@deepseek-ai/dsh-llm": "0.1.1-rc.2",
92
- "@deepseek-ai/dsh-llm-retry": "0.1.1-rc.2",
93
- "@deepseek-ai/dsh-permission-presets": "0.1.1-rc.2",
94
- "@deepseek-ai/dsh-plan-mode": "0.1.1-rc.2",
95
- "@deepseek-ai/dsh-sandbox-policy": "0.1.1-rc.2",
96
- "@deepseek-ai/dsh-session": "0.1.1-rc.2",
97
- "@deepseek-ai/dsh-session-persistence": "0.1.1-rc.2",
98
- "@deepseek-ai/dsh-session-reference": "0.1.1-rc.2",
99
- "@deepseek-ai/dsh-session-title": "0.1.1-rc.2",
100
- "@deepseek-ai/dsh-skill": "0.1.1-rc.2",
101
- "@deepseek-ai/dsh-user-approval": "0.1.1-rc.2",
102
- "@deepseek-ai/dsh-user-questions": "0.1.1-rc.2"
103
- },
104
- "peerDependenciesMeta": {
105
- "@deepseek-ai/cordis": { "optional": true },
106
- "@deepseek-ai/cordis-plugin-loader": { "optional": true },
107
- "@deepseek-ai/dsh-agent": { "optional": true },
108
- "@deepseek-ai/dsh-attachment": { "optional": true },
109
- "@deepseek-ai/dsh-agent-default-model": { "optional": true },
110
- "@deepseek-ai/dsh-agent-presets": { "optional": true },
111
- "@deepseek-ai/dsh-cmdline": { "optional": true },
112
- "@deepseek-ai/dsh-cordis-host-runner": { "optional": true },
113
- "@deepseek-ai/dsh-credentials": { "optional": true },
114
- "@deepseek-ai/dsh-file-reference-local": { "optional": true },
115
- "@deepseek-ai/dsh-code-runtime-worker-thread": { "optional": true },
116
- "@deepseek-ai/dsh-commands": { "optional": true },
117
- "@deepseek-ai/dsh-compaction": { "optional": true },
118
- "@deepseek-ai/dsh-goal": { "optional": true },
119
- "@deepseek-ai/dsh-invariants": { "optional": true },
120
- "@deepseek-ai/dsh-jobs": { "optional": true },
121
- "@deepseek-ai/dsh-llm": { "optional": true },
122
- "@deepseek-ai/dsh-llm-retry": { "optional": true },
123
- "@deepseek-ai/dsh-permission-presets": { "optional": true },
124
- "@deepseek-ai/dsh-plan-mode": { "optional": true },
125
- "@deepseek-ai/dsh-sandbox-policy": { "optional": true },
126
- "@deepseek-ai/dsh-session": { "optional": true },
127
- "@deepseek-ai/dsh-session-persistence": { "optional": true },
128
- "@deepseek-ai/dsh-session-reference": { "optional": true },
129
- "@deepseek-ai/dsh-session-title": { "optional": true },
130
- "@deepseek-ai/dsh-skill": { "optional": true },
131
- "@deepseek-ai/dsh-user-approval": { "optional": true },
132
- "@deepseek-ai/dsh-user-questions": { "optional": true }
133
- },
134
- "devDependencies": {
135
- "@deepseek-ai/dsh-agent-presets": "0.1.1-rc.2",
136
- "@deepseek-ai/dsh-attachment": "0.1.1-rc.2",
137
- "@deepseek-ai/dsh-compaction": "0.1.1-rc.2",
138
- "@deepseek-ai/dsh-commands": "0.1.1-rc.2",
139
- "@deepseek-ai/dsh-credentials": "0.1.1-rc.2",
140
- "@deepseek-ai/dsh-goal": "0.1.1-rc.2",
141
- "@deepseek-ai/dsh-jobs": "0.1.1-rc.2",
142
- "@deepseek-ai/dsh-llm-retry": "0.1.1-rc.2",
143
- "@deepseek-ai/dsh-permission-presets": "0.1.1-rc.2",
144
- "@deepseek-ai/dsh-plan-mode": "0.1.1-rc.2",
145
- "@deepseek-ai/dsh-sandbox-policy": "0.1.1-rc.2",
146
- "@deepseek-ai/dsh-session-persistence": "0.1.1-rc.2",
147
- "@deepseek-ai/dsh-session-reference": "0.1.1-rc.2",
148
- "@deepseek-ai/dsh-session-title": "0.1.1-rc.2",
149
- "@deepseek-ai/dsh-skill": "0.1.1-rc.2",
150
- "@deepseek-ai/dsh-user-approval": "0.1.1-rc.2",
151
- "@deepseek-ai/dsh-user-questions": "0.1.1-rc.2",
152
- "@types/node": "^24.0.0",
153
- "@types/react": "~18.3.1",
154
- "tsdown": "^0.22.2",
155
- "tsx": "^4.22.4",
156
- "typescript": "^5.9.0",
157
- "vitest": "^3.0.0"
158
- }
159
- }
1
+ {
2
+ "name": "dsh-code",
3
+ "description": "DeepSeek Harness CLI core bundle: interactive coding terminal, durable sessions, and model management for dsh --profile cli",
4
+ "version": "1.0.3",
5
+ "type": "module",
6
+ "bin": {
7
+ "deepseek": "./bin/deepseek.mjs",
8
+ "dsh-code": "./bin/deepseek.mjs"
9
+ },
10
+ "main": "lib/index.mjs",
11
+ "types": "lib/types/index.d.ts",
12
+ "exports": {
13
+ ".": {
14
+ "types": "./lib/types/index.d.ts",
15
+ "default": "./lib/index.mjs"
16
+ },
17
+ "./startup": {
18
+ "types": "./lib/types/startup.d.ts",
19
+ "default": "./lib/startup.mjs"
20
+ },
21
+ "./invariant": {
22
+ "types": "./lib/types/invariant.d.ts",
23
+ "default": "./lib/invariant.mjs"
24
+ },
25
+ "./cordis.patch.yml": "./cordis.patch.yml",
26
+ "./src/*": "./src/*",
27
+ "./package.json": "./package.json"
28
+ },
29
+ "files": [
30
+ "lib",
31
+ "cordis.patch.yml",
32
+ "src"
33
+ ],
34
+ "license": "MIT",
35
+ "keywords": [
36
+ "deepseek",
37
+ "dsh",
38
+ "deepseek-harness",
39
+ "tui",
40
+ "terminal",
41
+ "claude-code",
42
+ "agent",
43
+ "ink"
44
+ ],
45
+ "repository": {
46
+ "type": "git",
47
+ "url": "git+https://github.com/unlinearity/dsh-code.git"
48
+ },
49
+ "dsh": {
50
+ "bundle": {
51
+ "patch": "./cordis.patch.yml"
52
+ }
53
+ },
54
+ "scripts": {
55
+ "build": "tsdown && tsc -p tsconfig.json",
56
+ "test": "vitest run",
57
+ "typecheck": "tsc -p tsconfig.json --noEmit",
58
+ "gen:whale": "tsx scripts/gen-whale-glyph.ts",
59
+ "prepare": "pnpm build",
60
+ "prepublishOnly": "pnpm typecheck && pnpm test && pnpm build"
61
+ },
62
+ "engines": {
63
+ "node": "^22.19 || >=24"
64
+ },
65
+ "dependencies": {
66
+ "@deepseek-ai/dsh-authorization": "0.1.1-rc.2",
67
+ "@deepseek-ai/dsh-web-fetch-http": "0.1.1-rc.2",
68
+ "@deepseek-ai/schemastery": "^3.18.1",
69
+ "chalk": "^5.6.2",
70
+ "commander": "^15.0.0",
71
+ "ink": "^5.2.1",
72
+ "react": "^18.3.1"
73
+ },
74
+ "peerDependencies": {
75
+ "@deepseek-ai/cordis": "^4.0.1",
76
+ "@deepseek-ai/cordis-plugin-loader": "^1.0.2",
77
+ "@deepseek-ai/dsh-attachment": "0.1.1-rc.2",
78
+ "@deepseek-ai/dsh-agent": "0.1.1-rc.2",
79
+ "@deepseek-ai/dsh-agent-default-model": "0.1.1-rc.2",
80
+ "@deepseek-ai/dsh-agent-presets": "0.1.1-rc.2",
81
+ "@deepseek-ai/dsh-cmdline": "0.1.1-rc.2",
82
+ "@deepseek-ai/dsh-code-runtime-worker-thread": "0.1.1-rc.2",
83
+ "@deepseek-ai/dsh-commands": "0.1.1-rc.2",
84
+ "@deepseek-ai/dsh-compaction": "0.1.1-rc.2",
85
+ "@deepseek-ai/dsh-cordis-host-runner": "0.1.1-rc.2",
86
+ "@deepseek-ai/dsh-credentials": "0.1.1-rc.2",
87
+ "@deepseek-ai/dsh-file-reference-local": "0.1.1-rc.2",
88
+ "@deepseek-ai/dsh-goal": "0.1.1-rc.2",
89
+ "@deepseek-ai/dsh-invariants": "0.1.1-rc.2",
90
+ "@deepseek-ai/dsh-jobs": "0.1.1-rc.2",
91
+ "@deepseek-ai/dsh-llm": "0.1.1-rc.2",
92
+ "@deepseek-ai/dsh-llm-retry": "0.1.1-rc.2",
93
+ "@deepseek-ai/dsh-permission-presets": "0.1.1-rc.2",
94
+ "@deepseek-ai/dsh-plan-mode": "0.1.1-rc.2",
95
+ "@deepseek-ai/dsh-sandbox-policy": "0.1.1-rc.2",
96
+ "@deepseek-ai/dsh-session": "0.1.1-rc.2",
97
+ "@deepseek-ai/dsh-session-persistence": "0.1.1-rc.2",
98
+ "@deepseek-ai/dsh-session-reference": "0.1.1-rc.2",
99
+ "@deepseek-ai/dsh-session-title": "0.1.1-rc.2",
100
+ "@deepseek-ai/dsh-skill": "0.1.1-rc.2",
101
+ "@deepseek-ai/dsh-user-approval": "0.1.1-rc.2",
102
+ "@deepseek-ai/dsh-user-questions": "0.1.1-rc.2"
103
+ },
104
+ "peerDependenciesMeta": {
105
+ "@deepseek-ai/cordis": { "optional": true },
106
+ "@deepseek-ai/cordis-plugin-loader": { "optional": true },
107
+ "@deepseek-ai/dsh-agent": { "optional": true },
108
+ "@deepseek-ai/dsh-attachment": { "optional": true },
109
+ "@deepseek-ai/dsh-agent-default-model": { "optional": true },
110
+ "@deepseek-ai/dsh-agent-presets": { "optional": true },
111
+ "@deepseek-ai/dsh-cmdline": { "optional": true },
112
+ "@deepseek-ai/dsh-cordis-host-runner": { "optional": true },
113
+ "@deepseek-ai/dsh-credentials": { "optional": true },
114
+ "@deepseek-ai/dsh-file-reference-local": { "optional": true },
115
+ "@deepseek-ai/dsh-code-runtime-worker-thread": { "optional": true },
116
+ "@deepseek-ai/dsh-commands": { "optional": true },
117
+ "@deepseek-ai/dsh-compaction": { "optional": true },
118
+ "@deepseek-ai/dsh-goal": { "optional": true },
119
+ "@deepseek-ai/dsh-invariants": { "optional": true },
120
+ "@deepseek-ai/dsh-jobs": { "optional": true },
121
+ "@deepseek-ai/dsh-llm": { "optional": true },
122
+ "@deepseek-ai/dsh-llm-retry": { "optional": true },
123
+ "@deepseek-ai/dsh-permission-presets": { "optional": true },
124
+ "@deepseek-ai/dsh-plan-mode": { "optional": true },
125
+ "@deepseek-ai/dsh-sandbox-policy": { "optional": true },
126
+ "@deepseek-ai/dsh-session": { "optional": true },
127
+ "@deepseek-ai/dsh-session-persistence": { "optional": true },
128
+ "@deepseek-ai/dsh-session-reference": { "optional": true },
129
+ "@deepseek-ai/dsh-session-title": { "optional": true },
130
+ "@deepseek-ai/dsh-skill": { "optional": true },
131
+ "@deepseek-ai/dsh-user-approval": { "optional": true },
132
+ "@deepseek-ai/dsh-user-questions": { "optional": true }
133
+ },
134
+ "devDependencies": {
135
+ "@deepseek-ai/dsh-agent-presets": "0.1.1-rc.2",
136
+ "@deepseek-ai/dsh-attachment": "0.1.1-rc.2",
137
+ "@deepseek-ai/dsh-compaction": "0.1.1-rc.2",
138
+ "@deepseek-ai/dsh-commands": "0.1.1-rc.2",
139
+ "@deepseek-ai/dsh-credentials": "0.1.1-rc.2",
140
+ "@deepseek-ai/dsh-goal": "0.1.1-rc.2",
141
+ "@deepseek-ai/dsh-jobs": "0.1.1-rc.2",
142
+ "@deepseek-ai/dsh-llm-retry": "0.1.1-rc.2",
143
+ "@deepseek-ai/dsh-permission-presets": "0.1.1-rc.2",
144
+ "@deepseek-ai/dsh-plan-mode": "0.1.1-rc.2",
145
+ "@deepseek-ai/dsh-sandbox-policy": "0.1.1-rc.2",
146
+ "@deepseek-ai/dsh-session-persistence": "0.1.1-rc.2",
147
+ "@deepseek-ai/dsh-session-reference": "0.1.1-rc.2",
148
+ "@deepseek-ai/dsh-session-title": "0.1.1-rc.2",
149
+ "@deepseek-ai/dsh-skill": "0.1.1-rc.2",
150
+ "@deepseek-ai/dsh-user-approval": "0.1.1-rc.2",
151
+ "@deepseek-ai/dsh-user-questions": "0.1.1-rc.2",
152
+ "@types/node": "^24.0.0",
153
+ "@types/react": "~18.3.1",
154
+ "tsdown": "^0.22.2",
155
+ "tsx": "^4.22.4",
156
+ "typescript": "^5.9.0",
157
+ "vitest": "^3.0.0"
158
+ }
159
+ }