dsh-rewind-plugin 0.11.0-alpha.1 → 0.11.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.
package/README.en.md CHANGED
@@ -35,8 +35,11 @@ Every user message carries a **↶ rewind** button in its action row. Clicking i
35
35
 
36
36
  ## Install
37
37
 
38
+ Check your local DSH version, then find the matching plugin version in
39
+ [Releases](https://github.com/SiriLee/dsh-rewind/releases).
40
+
38
41
  ```sh
39
- dsh plugin --profile web add dsh-rewind-plugin
42
+ dsh plugin --profile web add dsh-rewind-plugin@<version>
40
43
  ```
41
44
 
42
45
  > ⚠️ The npm name `dsh-rewind` belongs to another author's package — install with `dsh-rewind-plugin`.
@@ -77,6 +80,20 @@ cleanup** panel (the auto-cleanup switch and the idle-day cutoff), or use the
77
80
 
78
81
  <img src="assets/screenshots/cleanup-setting.png" alt="Snapshot cleanup settings: auto-cleanup and idle days" width="600">
79
82
 
83
+ ## Uninstall
84
+
85
+ ```sh
86
+ # Uninstall the plugin
87
+ dsh plugin --profile web remove dsh-rewind-plugin
88
+
89
+ # To also delete local data
90
+ rm -rf <dsh home>/rewind-snapshots
91
+ rm <dsh home>/snapshot-cleanup-last-sweep.json
92
+ ```
93
+
94
+ The plugin's auto-cleanup settings live in the settings document
95
+ (`<dsh home>/settings.yaml`). To remove them completely, delete the key manually.
96
+
80
97
  ## Why it stands out
81
98
 
82
99
  Compared with the common approaches, here is the trade-off this plugin makes on "rewind":
package/README.md CHANGED
@@ -35,8 +35,10 @@ DeepSeek Harness 插件:**一键就地回退对话到任意更早的用户消
35
35
 
36
36
  ## 安装
37
37
 
38
+ 确认本机 DSH 版本后,在 [Release](https://github.com/SiriLee/dsh-rewind/releases) 找到适配的插件版本。
39
+
38
40
  ```sh
39
- dsh plugin --profile web add dsh-rewind-plugin
41
+ dsh plugin --profile web add dsh-rewind-plugin@<版本>
40
42
  ```
41
43
 
42
44
  > ⚠️ npm 上的 `dsh-rewind` 属于其他作者,请用 `dsh-rewind-plugin` 安装。
@@ -67,6 +69,19 @@ dsh plugin --profile web add dsh-rewind-plugin
67
69
 
68
70
  <img src="assets/screenshots/cleanup-setting.png" alt="快照清理设置:自动清理与失活天数" width="600">
69
71
 
72
+ ## 卸载
73
+
74
+ ```sh
75
+ # 卸载插件
76
+ dsh plugin --profile web remove dsh-rewind-plugin
77
+
78
+ # 如需同时删除本地数据
79
+ rm -rf <dsh home>/rewind-snapshots
80
+ rm <dsh home>/snapshot-cleanup-last-sweep.json
81
+ ```
82
+
83
+ 插件的自动清理设置保存在设置文档(`<dsh home>/settings.yaml`)中。如需彻底清理,可手动删除对应键。
84
+
70
85
  ## 本插件的优势
71
86
 
72
87
  和常见的几种做法相比,本插件在"回退"这件事上的取舍:
@@ -7,27 +7,28 @@
7
7
  > compatibility invariants. A probe failure is a finding; it enters the
8
8
  > fix/pin/record loop.
9
9
  >
10
- > Targeted version: npm `@deepseek-ai/*@0.1.2-rc.1` (matches `package-lock.json`).
10
+ > Targeted version: npm `@deepseek-ai/*@0.1.5-rc.1` (the range the peers and `dsh.engines.dsh` declare).
11
11
  > Source reference: the upstream [github.com/deepseek-ai/deepseek-harness](https://github.com/deepseek-ai/deepseek-harness).
12
12
  >
13
13
  > Version alignment: `peerDependencies` use one tuple per DSH line
14
14
  > (e.g. `^0.1.2-rc.1`). npm's prerelease matching rules require a candidate to
15
15
  > share the range comparator's `[major, minor, patch]` tuple, so a new DSH tuple
16
- > replaces the peer tuple (single-line model); any prerelease within the SAME
17
- > tuple is a no-op. Signal: `npm view @deepseek-ai/dsh version`;
16
+ > replaces the peer tuple (single-line model). The range is conservative — it
17
+ > declares only what was verified, so a release already inside it changes
18
+ > nothing. Signal: `npm view @deepseek-ai/dsh dist-tags`;
18
19
  > flow: `scripts/check-dsh-version.mjs` (it reads the `latest` dist-tag only; a
19
20
  > prerelease published under another tag is a manual pre-release check).
20
21
  >
21
- > The plugin targets a single DSH version line (`0.1.2-rc.1`); compatibility
22
- > with earlier lines is not kept.
22
+ > The plugin targets a single DSH version line; compatibility with earlier
23
+ > lines is not kept.
23
24
 
24
- ### Single channel (`0.1.2-rc.1`)
25
+ ### Single channel
25
26
 
26
- The plugin targets one DSH channel. Each seam below reads the 0.1.2-rc.1 shape
27
- only (no `Session.events` / `[data-time-hover-root]` / `<textarea>` / face-`chat`
28
- legacy branch).
27
+ The plugin targets one DSH channel. Each seam below reads the targeted
28
+ version's shape only (no `Session.events` / `[data-time-hover-root]` /
29
+ `<textarea>` / face-`chat` legacy branch).
29
30
 
30
- | Seam | 0.1.2-rc.1 implementation |
31
+ | Seam | Implementation at the targeted version |
31
32
  | --- | --- |
32
33
  | Host session log | `session.snapshotEvents()` |
33
34
  | Client chat snapshot | `uiConversation` `chat` view (`chatSnapshotOf`) |
@@ -66,7 +67,7 @@ legacy branch).
66
67
  - **session-stats / session-telemetry fold the full log**: post-rewind stats do **not** rewind — `turns`/`steps`/`llmMs` still include withdrawn content; the `user/message` marker is folded as a present user turn (it adds no step). This is the intended "fold the full log" semantics, pinned by probe.
67
68
  - **token-meter usage anchor stays stable** (G3): the `user/message` marker carries no usage, but because it is not an `assistant/message`, the baseline anchor does not drop to a heuristic estimate — it stays `usage` across a rewind. Pinned by `compat-gaps` G3.
68
69
  - **marker content is the constant `(empty message)` placeholder**: never empty, because the session log is immutable but the model serving a session may change later — a strict OpenAI-compatible gateway rejects an empty user message (HTTP 400, Issue #21). The marker is a small visible user turn in derived history. Pin: `verify-host` (`marker is a user/message with the dsh-rewind plugin source and the (empty message) placeholder`).
69
- - **marker shape (v3)**: the replace `surfaceOp` is `{ op: 'replace', startSeq, endSeq }` (renamed from `start`/`end` in session-format v3), and the dsh-rewind source now carries `targetSeq`; the `user/message` + `sourceEventSeqs` shape and the `(empty message)` content are unchanged.
70
+ - **marker shape (v3)**: the replace `surfaceOp` is `{ op: 'replace', startSeq, endSeq }` (renamed from `start`/`end` in session-format v3); the dsh-rewind source is the plain CLOSED third-party plugin shape `{ kind: 'plugin', plugin: 'dsh-rewind' }` (no private field — the released-format source validator rejects any member outside `kind`/`plugin` + the context-injection `form`/`sections`/`summary`, and a plugin extends the source map by adding a `kind`, not fields); the `user/message` + `sourceEventSeqs` shape and the `(empty message)` content are unchanged.
70
71
  - **Withdrawn content stays searchable/exportable**: session-query full-text and `/export` read the raw log; a rewind cuts only the surface, so withdrawn messages remain (declared in the README).
71
72
  - **Session title auto-regeneration**: the title derives from the surface, so an automatically-derived title may change after a rewind.
72
73
  - **Files written but uncommitted in a cancelled turn**: a `both` rewind cannot restore them (tool side-effect timing; same as Claude Code).
@@ -73,28 +73,28 @@ Each release is `git push <branch>` followed by `git push <branch> --tags`.
73
73
 
74
74
  DSH is still in rc; npm's prerelease matching rules require a peer range to
75
75
  share the host version's `[major, minor, patch]` tuple. So `peerDependencies`
76
- uses one peer tuple per DSH line (e.g. `^0.1.2-rc.1`), replaced (never
77
- appended) when DSH releases a new tuple.
78
-
79
- - **When to update**: only when DSH releases a new tuple (`0.1.2 → 0.1.3 →
80
- 0.2.x`); rc rolling within a tuple (`0.1.2-rc.1 rc.2`) needs nothing. All
81
- `@deepseek-ai/*` packages release together; `npm view @deepseek-ai/dsh version`
82
- is the authoritative signal.
76
+ uses one peer tuple per DSH line (e.g. `^0.1.2-rc.1`). The range is
77
+ conservative: it declares only what was verified, and guarantees nothing
78
+ outside it.
79
+
80
+ - **When to update**: when the verified range changes a new DSH tuple, or a
81
+ deliberate narrowing (e.g. dropping the internal `alpha` series); a release
82
+ already inside the range changes nothing. All `@deepseek-ai/*` packages
83
+ release together; `npm view @deepseek-ai/dsh dist-tags` is the signal.
83
84
  - **Published-tuple check (optional)**: `node scripts/check-dsh-version.mjs`
84
85
  compares the `latest` dist-tag version against the tuple the peers cover
85
86
  (exit 0 = nothing to do, exit 1 = update). It reads the `latest` tag only; a
86
87
  pre-release published under another tag or bundled without
87
88
  going to npm is a manual pre-release check — see the "Before bumping" step above.
88
- - **Update steps**: replace every `@deepseek-ai/dsh-*` peer's tuple with
89
- `^<latest>` bump devDependencies to the latest → `npm install` →
90
- `npm run check` → release.
89
+ - **Update steps**: point every `@deepseek-ai/dsh-*` peer and devDependency at
90
+ the verified range `npm install` → `npm run check` → release.
91
91
  - **After DSH goes final**: final releases are not bound by the prerelease
92
92
  tuple rule, so the peers can converge to a single stable range (e.g.
93
93
  `^0.1.x`); this section can then be deleted.
94
94
  - **Declared minimum (`dsh.engines.dsh`)**: alongside the peer tuple, each
95
95
  release declares the DSH runtime floor under `dsh.engines.dsh` (e.g.
96
96
  `>=0.1.2-rc.1`), consumed by the plugin-manager update guard. Bump it in
97
- the same release that raises the peer tuple; never leave code raised while
97
+ the same release that changes the peer range; never leave code raised while
98
98
  the declared floor stays behind. Only the `>=X.Y.Z[-pre]` form is
99
99
  supported (`^`/`~`/multi-range are treated as "cannot verify" and
100
100
  fail closed).
@@ -66,22 +66,22 @@ npm publish --access public
66
66
 
67
67
  DSH 仍在 rc 阶段,npm 的 prerelease 匹配规则要求 peer 范围与宿主版本
68
68
  **同 `[major, minor, patch]` 元组**才能匹配。因此 peerDependencies 采用
69
- **每一条 DSH 线一个 peer 元组**(如 `^0.1.2-rc.1`),DSH 发新元组时**替换**而非追加。
69
+ **每一条 DSH 线一个 peer 元组**(如 `^0.1.2-rc.1`);范围是保守的,只声明实际验证过的内容。
70
70
 
71
- - **何时需要更新**:仅当 DSH 发布新元组(`0.1.2 → 0.1.3 → 0.2.x`)时;
72
- 同元组内 rc 滚动(`0.1.2-rc.1 → rc.2`)无需动作。DSH 所有包同版本发布,
73
- `npm view @deepseek-ai/dsh version` 即权威信号。
71
+ - **何时需要更新**:**已验证范围**变化时——DSH 发新元组,或主动收窄(例如不再
72
+ 声明内测的 DSH `alpha` 系列);落在已声明范围内的发布不改变任何东西。DSH 所有包
73
+ 同版本发布;信号是 `npm view @deepseek-ai/dsh dist-tags`。
74
74
  - **已发布元组检查(可选)**:`node scripts/check-dsh-version.mjs` 用 npm `latest`
75
75
  dist-tag 版本对比 peer 覆盖的元组(exit 0 无需动作,exit 1 需要)。它**只读
76
76
  `latest` tag**;发布在其它 tag 的 pre-release 走**手动发布前检查**
77
77
  ——见上文"升版前手动确认"。
78
- - **更新步骤**:把每个 `@deepseek-ai/dsh-*` peer 的元组**替换**为 `^<最新版>`
79
- devDependencies 同步升到最新 → `npm install` → `npm run check` → 发版。
78
+ - **更新步骤**:把每个 `@deepseek-ai/dsh-*` peer devDependency 指向已验证
79
+ 范围 → `npm install` → `npm run check` → 发版。
80
80
  - **正式版后收敛**:DSH 发布 final 版本后,正式版不受 prerelease 元组规则
81
81
  限制,peer 可收敛为稳定的 `^0.1.x` 单范围,此节即可删除。
82
82
  - **声明的最低运行时(`dsh.engines.dsh`)**:与 peer 元组一起,每个发布在
83
83
  `dsh.engines.dsh` 声明 DSH 运行时下限(如 `>=0.1.2-rc.1`),供插件管理器
84
- 更新守卫读取。**与 peer 元组持平的同一发布里一并 bump**;不可只升代码、
84
+ 更新守卫读取。**与 peer 范围持平的同一发布里一并 bump**;不可只升代码、
85
85
  声明下限停留在旧值。仅支持 `>=X.Y.Z[-pre]` 形式(`^`/`~`/多范围会被视为
86
86
  「无法校验」而 fail-closed)。
87
87
 
package/lib/client.js CHANGED
@@ -1345,7 +1345,7 @@ function createRewindBridge(deps) {
1345
1345
  }
1346
1346
 
1347
1347
  // src/client/build-info.ts
1348
- var PLUGIN_VERSION = true ? "0.11.0-alpha.1" : "dev";
1348
+ var PLUGIN_VERSION = true ? "0.11.0" : "dev";
1349
1349
  var BUILD_HASH = true ? "d770983e" : "dev";
1350
1350
 
1351
1351
  // src/client/locales.ts
package/lib/index.js CHANGED
@@ -119,10 +119,7 @@ var RewindError = class extends Error {
119
119
  }
120
120
  code;
121
121
  };
122
- var REWIND_MARKER_BRAND = Object.freeze({ kind: "plugin", plugin: "dsh-rewind" });
123
- function rewindMarkerSource(targetSeq) {
124
- return Object.freeze({ ...REWIND_MARKER_BRAND, targetSeq });
125
- }
122
+ var REWIND_MARKER_SOURCE = Object.freeze({ kind: "plugin", plugin: "dsh-rewind" });
126
123
  var CANDIDATE_PREVIEW_CHARS = 80;
127
124
  var DEFAULT_CANDIDATE_LIMIT = 100;
128
125
  function isUserMessageEvent(event) {
@@ -1597,10 +1594,10 @@ async function commitEntry(store, pending, anchorCache, trackedBySession, exec,
1597
1594
  tracked.add(capture.path);
1598
1595
  }
1599
1596
  var REWIND_MARKER_CONTENT = [{ type: "text", text: "(empty message)" }];
1600
- function buildMarker(targetSeq) {
1597
+ function buildMarker() {
1601
1598
  return createUserMessage({
1602
1599
  content: REWIND_MARKER_CONTENT,
1603
- source: rewindMarkerSource(targetSeq)
1600
+ source: REWIND_MARKER_SOURCE
1604
1601
  });
1605
1602
  }
1606
1603
  function describeTarget(target) {
@@ -1712,7 +1709,7 @@ async function executeRewind(ctx, store, fs, invocation, rawTarget, mode, inflig
1712
1709
  } catch (error) {
1713
1710
  return rewindErrorResult(error);
1714
1711
  }
1715
- const marker = buildMarker(plan.targetSeq);
1712
+ const marker = buildMarker();
1716
1713
  let event;
1717
1714
  try {
1718
1715
  event = agent.session.append("user/message", marker, {
@@ -75,14 +75,17 @@ export interface RewindPlan {
75
75
  readonly surfaceEnd: number;
76
76
  }
77
77
  /**
78
- * Create rewind-marker provenance correlated with one rewind target.
79
- * @param targetSeq - absolute log seq of the user message rewound to.
80
- * @returns immutable rewind-marker source.
78
+ * The rewind-marker source: the backend-independent identity carried by every
79
+ * marker the plugin appends. It is the plain third-party plugin source shape
80
+ * `{ kind: 'plugin', plugin: 'dsh-rewind' }` — no extra fields, because a
81
+ * plugin source is a CLOSED shape in the harness (only `kind`/`plugin`, plus
82
+ * the context-injection `form`/`sections`/`summary`; see `MessageSourceMap` and
83
+ * the released-format source validator). A plugin extends the source map by
84
+ * adding a new `kind`, never by hanging private fields off `plugin`.
81
85
  */
82
- export declare function rewindMarkerSource(targetSeq: number): Readonly<{
83
- kind: 'plugin';
84
- plugin: 'dsh-rewind';
85
- targetSeq: number;
86
+ export declare const REWIND_MARKER_SOURCE: Readonly<{
87
+ readonly kind: 'plugin';
88
+ readonly plugin: 'dsh-rewind';
86
89
  }>;
87
90
  /**
88
91
  * Test whether a persisted message source identifies a rewind marker.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dsh-rewind-plugin",
3
- "version": "0.11.0-alpha.1",
3
+ "version": "0.11.0",
4
4
  "description": "DSH 插件:真正便捷无感的同窗口内对话回退,从不新建分支;自带轻量工作区备份,可一并还原文件(完整 Claude Code /rewind 语义)。 · DSH plugin: genuinely effortless in-window conversation rewind — never forking a new session; ships a lightweight workspace backup that restores files together with the rewind (full Claude Code /rewind semantics).",
5
5
  "keywords": [
6
6
  "deepseek-harness",
@@ -50,7 +50,7 @@
50
50
  "patch": "./cordis.patch.yml"
51
51
  },
52
52
  "engines": {
53
- "dsh": ">=0.1.5-alpha.1"
53
+ "dsh": ">=0.1.5-rc.1"
54
54
  },
55
55
  "client": {
56
56
  "inject": [
@@ -76,18 +76,18 @@
76
76
  "peerDependencies": {
77
77
  "@deepseek-ai/cordis": "^4.0.1",
78
78
  "@deepseek-ai/schemastery": "^3.18.1",
79
- "@deepseek-ai/dsh-client-locale": "^0.1.5-alpha.1",
80
- "@deepseek-ai/dsh-client-ui-commands": "^0.1.5-alpha.1",
81
- "@deepseek-ai/dsh-client-ui-settings": "^0.1.5-alpha.1",
82
- "@deepseek-ai/dsh-client-ui-slots": "^0.1.5-alpha.1",
83
- "@deepseek-ai/dsh-commands": "^0.1.5-alpha.1",
84
- "@deepseek-ai/dsh-fs": "^0.1.5-alpha.1",
85
- "@deepseek-ai/dsh-home-paths": "^0.1.5-alpha.1",
86
- "@deepseek-ai/dsh-llm": "^0.1.5-alpha.1",
87
- "@deepseek-ai/dsh-sandbox": "^0.1.5-alpha.1",
88
- "@deepseek-ai/dsh-session": "^0.1.5-alpha.1",
89
- "@deepseek-ai/dsh-settings": "^0.1.5-alpha.1",
90
- "@deepseek-ai/dsh-tools": "^0.1.5-alpha.1"
79
+ "@deepseek-ai/dsh-client-locale": "^0.1.5-rc.1",
80
+ "@deepseek-ai/dsh-client-ui-commands": "^0.1.5-rc.1",
81
+ "@deepseek-ai/dsh-client-ui-settings": "^0.1.5-rc.1",
82
+ "@deepseek-ai/dsh-client-ui-slots": "^0.1.5-rc.1",
83
+ "@deepseek-ai/dsh-commands": "^0.1.5-rc.1",
84
+ "@deepseek-ai/dsh-fs": "^0.1.5-rc.1",
85
+ "@deepseek-ai/dsh-home-paths": "^0.1.5-rc.1",
86
+ "@deepseek-ai/dsh-llm": "^0.1.5-rc.1",
87
+ "@deepseek-ai/dsh-sandbox": "^0.1.5-rc.1",
88
+ "@deepseek-ai/dsh-session": "^0.1.5-rc.1",
89
+ "@deepseek-ai/dsh-settings": "^0.1.5-rc.1",
90
+ "@deepseek-ai/dsh-tools": "^0.1.5-rc.1"
91
91
  },
92
92
  "peerDependenciesMeta": {
93
93
  "@deepseek-ai/cordis": {
@@ -136,37 +136,37 @@
136
136
  "devDependencies": {
137
137
  "@deepseek-ai/cordis": "^4.0.1",
138
138
  "@deepseek-ai/schemastery": "^3.18.1",
139
- "@deepseek-ai/dsh-agent": "^0.1.5-alpha.1",
140
- "@deepseek-ai/dsh-attachment": "^0.1.5-alpha.1",
141
- "@deepseek-ai/dsh-client-locale": "^0.1.5-alpha.1",
142
- "@deepseek-ai/dsh-client-connection": "^0.1.5-alpha.1",
143
- "@deepseek-ai/dsh-client-store": "^0.1.5-alpha.1",
144
- "@deepseek-ai/dsh-client-ui-primitives": "^0.1.5-alpha.1",
145
- "@deepseek-ai/dsh-api-session-controller": "^0.1.5-alpha.1",
146
- "@deepseek-ai/dsh-client-ui-conversation": "^0.1.5-alpha.1",
147
- "@deepseek-ai/dsh-scope": "^0.1.5-alpha.1",
148
- "@deepseek-ai/dsh-typert-protocol": "^0.1.5-alpha.1",
149
- "@deepseek-ai/dsh-user-questions": "^0.1.5-alpha.1",
150
- "@deepseek-ai/dsh-client-ui-commands": "^0.1.5-alpha.1",
151
- "@deepseek-ai/dsh-client-ui-input-trigger": "^0.1.5-alpha.1",
152
- "@deepseek-ai/dsh-client-ui-slots": "^0.1.5-alpha.1",
153
- "@deepseek-ai/dsh-command-compact": "^0.1.5-alpha.1",
154
- "@deepseek-ai/dsh-commands": "^0.1.5-alpha.1",
155
- "@deepseek-ai/dsh-compaction": "^0.1.5-alpha.1",
156
- "@deepseek-ai/dsh-compaction-basic": "^0.1.5-alpha.1",
157
- "@deepseek-ai/dsh-fs": "^0.1.5-alpha.1",
158
- "@deepseek-ai/dsh-goal": "^0.1.5-alpha.1",
159
- "@deepseek-ai/dsh-home-paths": "^0.1.5-alpha.1",
160
- "@deepseek-ai/dsh-llm": "^0.1.5-alpha.1",
161
- "@deepseek-ai/dsh-plan-mode": "^0.1.5-alpha.1",
162
- "@deepseek-ai/dsh-sandbox": "^0.1.5-alpha.1",
163
- "@deepseek-ai/dsh-session": "^0.1.5-alpha.1",
164
- "@deepseek-ai/dsh-session-projection": "^0.1.5-alpha.1",
165
- "@deepseek-ai/dsh-session-stats": "^0.1.5-alpha.1",
166
- "@deepseek-ai/dsh-session-title": "^0.1.5-alpha.1",
167
- "@deepseek-ai/dsh-settings": "^0.1.5-alpha.1",
168
- "@deepseek-ai/dsh-token-meter": "^0.1.5-alpha.1",
169
- "@deepseek-ai/dsh-tools": "^0.1.5-alpha.1",
139
+ "@deepseek-ai/dsh-agent": "^0.1.5-rc.1",
140
+ "@deepseek-ai/dsh-attachment": "^0.1.5-rc.1",
141
+ "@deepseek-ai/dsh-client-locale": "^0.1.5-rc.1",
142
+ "@deepseek-ai/dsh-client-connection": "^0.1.5-rc.1",
143
+ "@deepseek-ai/dsh-client-store": "^0.1.5-rc.1",
144
+ "@deepseek-ai/dsh-client-ui-primitives": "^0.1.5-rc.1",
145
+ "@deepseek-ai/dsh-api-session-controller": "^0.1.5-rc.1",
146
+ "@deepseek-ai/dsh-client-ui-conversation": "^0.1.5-rc.1",
147
+ "@deepseek-ai/dsh-scope": "^0.1.5-rc.1",
148
+ "@deepseek-ai/dsh-typert-protocol": "^0.1.5-rc.1",
149
+ "@deepseek-ai/dsh-user-questions": "^0.1.5-rc.1",
150
+ "@deepseek-ai/dsh-client-ui-commands": "^0.1.5-rc.1",
151
+ "@deepseek-ai/dsh-client-ui-input-trigger": "^0.1.5-rc.1",
152
+ "@deepseek-ai/dsh-client-ui-slots": "^0.1.5-rc.1",
153
+ "@deepseek-ai/dsh-command-compact": "^0.1.5-rc.1",
154
+ "@deepseek-ai/dsh-commands": "^0.1.5-rc.1",
155
+ "@deepseek-ai/dsh-compaction": "^0.1.5-rc.1",
156
+ "@deepseek-ai/dsh-compaction-basic": "^0.1.5-rc.1",
157
+ "@deepseek-ai/dsh-fs": "^0.1.5-rc.1",
158
+ "@deepseek-ai/dsh-goal": "^0.1.5-rc.1",
159
+ "@deepseek-ai/dsh-home-paths": "^0.1.5-rc.1",
160
+ "@deepseek-ai/dsh-llm": "^0.1.5-rc.1",
161
+ "@deepseek-ai/dsh-plan-mode": "^0.1.5-rc.1",
162
+ "@deepseek-ai/dsh-sandbox": "^0.1.5-rc.1",
163
+ "@deepseek-ai/dsh-session": "^0.1.5-rc.1",
164
+ "@deepseek-ai/dsh-session-projection": "^0.1.5-rc.1",
165
+ "@deepseek-ai/dsh-session-stats": "^0.1.5-rc.1",
166
+ "@deepseek-ai/dsh-session-title": "^0.1.5-rc.1",
167
+ "@deepseek-ai/dsh-settings": "^0.1.5-rc.1",
168
+ "@deepseek-ai/dsh-token-meter": "^0.1.5-rc.1",
169
+ "@deepseek-ai/dsh-tools": "^0.1.5-rc.1",
170
170
  "@types/node": "^24.0.0",
171
171
  "@types/react": "^18.3.31",
172
172
  "@types/react-dom": "^18.3.7",