dsh-rewind-plugin 0.12.1 → 0.13.0-alpha.1

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
@@ -1,8 +1,5 @@
1
1
  # dsh-rewind
2
2
 
3
- > [!WARNING]
4
- > **Install a `v0.9.x` release on DSH `0.1.2-rc.1` as early as possible, and run `/dsh-rewind-fix` to update old sessions' rewind markers** ([update guide](docs/rewind-fix.md)).
5
-
6
3
  Conversation rewind for DeepSeek Harness: **rewind the conversation to any earlier user message in one click, in the same window** — no new branch, no window switch, with optional workspace-file restore (full Claude Code `/rewind` semantics).
7
4
 
8
5
  [![npm version](https://img.shields.io/npm/v/dsh-rewind-plugin.svg)](https://www.npmjs.com/package/dsh-rewind-plugin)
@@ -57,8 +54,8 @@ dsh plugin --profile web add dsh-rewind-plugin@<version>
57
54
 
58
55
  - Rewinds can be repeated — with no limit on stage or count.
59
56
  - A rewind itself **cannot be undone**, but the withdrawn content stays in the session log.
60
- - **Interruptions rewind too** — a `steering` interruption message the model hasn't read yet is also a valid rewind target.
61
- - **A rewind interrupts the running turn** — to ensure the rewind runs safely.
57
+ - **Interruptions rewind too** — a `steering` message the model hasn't read yet is also a valid rewind target, and withdrawing it does not interrupt the current run.
58
+ - **Rewinding a read message interrupts the running turn** — to ensure the rewind runs safely.
62
59
 
63
60
  </details>
64
61
 
package/README.md CHANGED
@@ -1,8 +1,5 @@
1
1
  # dsh-rewind
2
2
 
3
- > [!WARNING]
4
- > **请尽早在 DSH `0.1.2-rc.1` 安装 `v0.9.x` 版本,运行 `/dsh-rewind-fix` 更新旧会话的回退标记**([更新指南](docs/rewind-fix.zh.md))。
5
-
6
3
  DeepSeek Harness 插件:**一键就地回退对话到任意更早的用户消息**——同窗口内完成,不新建分支、不换窗口,可一并还原工作区文件(完整 Claude Code `/rewind` 语义)。
7
4
 
8
5
  [![npm version](https://img.shields.io/npm/v/dsh-rewind-plugin.svg)](https://www.npmjs.com/package/dsh-rewind-plugin)
@@ -56,8 +53,8 @@ dsh plugin --profile web add dsh-rewind-plugin@<版本>
56
53
 
57
54
  - 回退可以反复进行——没有阶段或次数限制。
58
55
  - 回退本身**无法撤销**,但被撤回的内容仍保留在会话日志中。
59
- - **插话也能回退**——模型尚未读取的 `steering` 插话消息,同样可作为回退目标。
60
- - **回退会打断当前正在运行的回合**——确保回退的安全执行。
56
+ - **插话也能回退**——模型尚未读取的 `steering` 插话消息,同样可作为回退目标,不会打断当前生成。
57
+ - **回退已读消息会打断当前正在运行的回合**——确保回退的安全执行。
61
58
 
62
59
  </details>
63
60
 
@@ -7,7 +7,7 @@
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.5-rc.1` (the range the peers and `dsh.engines.dsh` declare).
10
+ > Targeted version: npm `@deepseek-ai/*@0.1.6-alpha.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
@@ -25,8 +25,8 @@
25
25
  ### Single channel
26
26
 
27
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).
28
+ version's shape only (no `Session.events` / `<textarea>` / face-`chat`
29
+ legacy branch).
30
30
 
31
31
  | Seam | Implementation at the targeted version |
32
32
  | --- | --- |
@@ -62,6 +62,11 @@ version's shape only (no `Session.events` / `[data-time-hover-root]` /
62
62
  - **agent-loop cancellation**: `finally` guarantees step/turn closure; the rewind force-stop path leaves no dangling frame.
63
63
  - **settings-card registration**: the Snapshot cleanup card must be registered through a **nested** `ctx.inject(['settingsScope'], …)` — naming `settingsScope` in the module-level inject would keep the whole client plugin unmounted on a host without that service (card and rewind button would disappear). It reads `getSnapshot().value` + `set`, never the `mutate` write API.
64
64
 
65
+ - **`agent/created` lifecycle guard**: the session-format reconcile runs on the alpha line's `agent/created` (fire-and-forget); pin: `verify-host` 4e dispatches it.
66
+ - **marker vs `/compact`**: the checkpoint shape is unchanged on this line — a `user/message` replace (`surfaceOp {replace, startSeq, endSeq}` + `sourceEventSeqs`); `assistant/message` still cannot carry `sourceEventSeqs`.
67
+ - **`image/offload` projection**: the alpha line's first `SessionMessageProjection` changes derived content without touching surface node membership; candidate listing and target resolution tolerate it. Pin: `tests/image-offload-projection.test.ts`.
68
+ - **session-cwd**: the fs tools no longer canonicalize a parent-traversing cwd, so `src/session-cwd.ts` returns `header.cwd` verbatim. Pin: `tests/session-cwd.test.ts`.
69
+
65
70
  ## Known behavior boundaries (deterministic differences, non-crash, documented)
66
71
 
67
72
  - **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.
@@ -74,6 +79,8 @@ version's shape only (no `Session.events` / `[data-time-hover-root]` /
74
79
  - **Attachment files left after a message is shadowed**: attachment storage is not cleaned with the surface (`dsh-attachment-local` not installed, not automatically verified).
75
80
  - **Rewind leaves plan mode untouched**: `/plan text` is two independent actions (enter plan mode + steer the message). Rewinding the message undoes only the message — the log-only `plan/mode` state stays active, and the user leaves plan mode with `/plan off`, which still commits after a rewind (the marker creates no open turn). Pin: `verify-host` plan checks (`plan rewind leaves plan mode active`, `/plan off after rewind turns plan mode off`), `tests/hidden.test.ts` `messageTextAt`.
76
81
 
82
+ - **Synchronous Session history reads are deprecated** on this line (`snapshotEvents` / `eventAt` / `ownEvents`): existing calls may remain, new calls are prohibited. The plugin keeps its existing reads (turn anchor + candidate listing); the migration path is a `ctx.sessionProjections` projection unit or the async paged history read this line has not shipped yet — not a plugin-side index. Not migrated in this release.
83
+
77
84
  ## Upstream (harness) issues and the plugin's no-compensation stance
78
85
 
79
86
  The plugin treats these as harness-side defects it does not compensate for. Each entry records the harness issue, its current status, and the plugin's stance, so a future maintainer does not "fix the wrong direction."
@@ -99,10 +106,10 @@ The plugin treats these as harness-side defects it does not compensate for. Each
99
106
  post-locale description re-registration as a workaround, because the guarantee belongs to the
100
107
  harness (make the locale preference available before plugin registration, or support per-locale
101
108
  command descriptions). The plugin's `t()` design is retained; localized host output is treated
102
- as an upstream capability to be restored when the harness provides it. (Command descriptions
103
- are English for **every** host command system plugins also pass raw English `description`
104
- strings, e.g. `/goal` — so this behavior is consistent with the ecosystem, not a plugin
105
- deviation.)
109
+ as an upstream capability to be restored when the harness provides it. (This is still not a
110
+ plugin deviation: the client localizes only the six first-party descriptions in
111
+ `HOST_DESCRIPTION_KEYS`compact, export, feedback, goal, permission, plan while every
112
+ third-party description, this plugin's included, passes through verbatim.)
106
113
  - **Client-side command-description i18n is first-party-only**: DSH also localizes host command
107
114
  descriptions through the client `locale` binding (`ui-commands`), but the description keys come
108
115
  from a **closed allowlist** (`HOST_DESCRIPTION_KEYS`: compact, export, feedback, goal,
package/lib/client.js CHANGED
@@ -1323,13 +1323,22 @@ function composerText() {
1323
1323
  return surface.textContent ?? "";
1324
1324
  }
1325
1325
  async function retractPending(session, itemId, text, setComposerText) {
1326
- await session.cancel();
1327
1326
  const queue = session.getSnapshot().queue;
1328
1327
  const steering = queue.filter((item) => item.placement === "steering");
1328
+ let removedTarget = false;
1329
1329
  for (const id of retractSpan(steering, itemId)) {
1330
- await session.updateQueue(id, { kind: "remove" });
1330
+ let accepted = false;
1331
+ try {
1332
+ const result = await session.updateQueue(id, { kind: "remove" });
1333
+ accepted = result.ok;
1334
+ if (!result.ok) rewindLog.info("retract", `pending retract lost the race for ${id}`, result.error);
1335
+ } catch (error) {
1336
+ rewindLog.warn("retract", `pending retract remove threw for ${id}`, error);
1337
+ }
1338
+ if (!accepted) break;
1339
+ if (id === itemId) removedTarget = true;
1331
1340
  }
1332
- if (text !== null && text !== "" && composerText().trim() === "") {
1341
+ if (removedTarget && text !== null && text !== "" && composerText().trim() === "") {
1333
1342
  setComposerText(session.sessionId, text);
1334
1343
  }
1335
1344
  }
@@ -1370,8 +1379,8 @@ function createRewindBridge(deps) {
1370
1379
  }
1371
1380
 
1372
1381
  // src/client/build-info.ts
1373
- var PLUGIN_VERSION = true ? "0.12.1" : "dev";
1374
- var BUILD_HASH = true ? "248f750a" : "dev";
1382
+ var PLUGIN_VERSION = true ? "0.13.0-alpha.1" : "dev";
1383
+ var BUILD_HASH = true ? "c9f4bb5f" : "dev";
1375
1384
 
1376
1385
  // src/client/locales.ts
1377
1386
  var zh = {
@@ -1383,7 +1392,7 @@ var zh = {
1383
1392
  "popover.noText": "\uFF08\u65E0\u6587\u672C\uFF09",
1384
1393
  "popover.retract.title": "\u56DE\u9000\u5230\u8FD9\u6761\u63D2\u8BDD\u6D88\u606F",
1385
1394
  "popover.retract.target": "\u63D2\u8BDD\u4E2D \xB7 {preview}",
1386
- "popover.retract.hint": "\u5C06\u505C\u6B62\u5F53\u524D\u751F\u6210\uFF0C\u5E76\u56DE\u9000\u5230\u8BE5\u6D88\u606F\u4E4B\u524D",
1395
+ "popover.retract.hint": "\u64A4\u56DE\u8FD9\u6761\u53CA\u4E4B\u540E\u7684\u63D2\u8BDD\u6D88\u606F\uFF0C\u4E0D\u6253\u65AD\u5F53\u524D\u751F\u6210",
1387
1396
  "popover.retract.confirm": "\u786E\u8BA4\u56DE\u9000",
1388
1397
  "popover.chat": "\u4EC5\u56DE\u9000\u5BF9\u8BDD",
1389
1398
  "popover.chat.hint": "\u53EA\u56DE\u9000\u6A21\u578B\u4E0A\u4E0B\u6587\uFF0C\u4E0D\u52A8\u5DE5\u4F5C\u533A\u6587\u4EF6",
@@ -1426,7 +1435,7 @@ var en = {
1426
1435
  "popover.noText": "(no text)",
1427
1436
  "popover.retract.title": "Rewind to this pending message",
1428
1437
  "popover.retract.target": "Pending \xB7 {preview}",
1429
- "popover.retract.hint": "Stops the current run and rewinds to before this message",
1438
+ "popover.retract.hint": "Retracts this pending message and the ones after it, without interrupting the run",
1430
1439
  "popover.retract.confirm": "Confirm rewind",
1431
1440
  "popover.chat": "Rewind conversation only",
1432
1441
  "popover.chat.hint": "Cut the model context only; workspace files stay untouched",
package/lib/index.js CHANGED
@@ -208,14 +208,11 @@ function planRewind(events, surface, target) {
208
208
  }
209
209
 
210
210
  // src/session-cwd.ts
211
- import { canonicalPath } from "@deepseek-ai/dsh-sandbox";
212
- var PARENT_PATH_SEGMENT = /(?:^|[\\/])\.\.(?:[\\/]|$)/;
213
- function sessionCwd(cwd, requestedPath) {
214
- if (cwd === void 0 || !PARENT_PATH_SEGMENT.test(cwd) && !PARENT_PATH_SEGMENT.test(requestedPath)) return cwd;
215
- return canonicalPath(cwd);
211
+ function sessionCwd(cwd) {
212
+ return cwd;
216
213
  }
217
- function execSessionCwd(exec, requestedPath) {
218
- return sessionCwd(exec.agent?.session.header.cwd, requestedPath);
214
+ function execSessionCwd(exec) {
215
+ return sessionCwd(exec.agent?.session.header.cwd);
219
216
  }
220
217
 
221
218
  // src/snapshot.ts
@@ -668,7 +665,7 @@ var SnapshotStore = class _SnapshotStore {
668
665
  /**
669
666
  * Session-format version snapshots are anchored under, stamped into each
670
667
  * session's `format` marker when an entry is recorded. `null` until the host
671
- * sets it (from `agent/session-start`), so a session that never records is
668
+ * sets it (from `agent/created`), so a session that never records is
672
669
  * never materialized and a marker is only written where snapshots exist.
673
670
  */
674
671
  formatVersion = null;
@@ -2010,7 +2007,7 @@ var SnapshotStore = class _SnapshotStore {
2010
2007
  }
2011
2008
  /**
2012
2009
  * Set the session-format version the store stamps onto every snapshot it
2013
- * records. The host sets this once per process from `agent/session-start`
2010
+ * records. The host sets this once per process from `agent/created`
2014
2011
  * (`agent.session.header.version`), so a marker is only materialized for a
2015
2012
  * session that actually records a snapshot.
2016
2013
  */
@@ -2063,7 +2060,7 @@ var SnapshotStore = class _SnapshotStore {
2063
2060
  * Session-format-version guard: clear a session's snapshot dir when the
2064
2061
  * format its snapshots were anchored under differs from the current session
2065
2062
  * format, so seq-anchored references can never survive a format migration
2066
- * mis-mapped. Runs at `agent/session-start` — after DSH has migrated/loaded
2063
+ * mis-mapped. Runs at `agent/created` — after DSH has migrated/loaded
2067
2064
  * the session, so `sessionVersion` is the post-migration value.
2068
2065
  *
2069
2066
  * Conservative rule (per the "delete stale snapshots" policy): a session
@@ -2313,7 +2310,7 @@ async function captureBefore(fs, store, exec, pending) {
2313
2310
  if (session !== void 0 && isSubagentSession(session)) return;
2314
2311
  const path = mutationPathOf(exec);
2315
2312
  if (path === void 0) return;
2316
- const cwd = execSessionCwd(exec, path);
2313
+ const cwd = execSessionCwd(exec);
2317
2314
  const target = await resolveTarget(fs, path, cwd, exec.signal);
2318
2315
  if (target === void 0) return;
2319
2316
  const info = await fs.stat(target, exec.signal).catch((error) => {
@@ -2752,7 +2749,7 @@ function apply(ctx, config) {
2752
2749
  handler: (invocation) => handleSnapshotCleanup(store, invocation, dshHome, trackedBySession)
2753
2750
  });
2754
2751
  }, "dsh-rewind command");
2755
- ctx.on("agent/session-start", ({ agent }) => {
2752
+ ctx.on("agent/created", ({ agent }) => {
2756
2753
  const session = agent.session;
2757
2754
  if (isSubagentSession(session)) return;
2758
2755
  void (async () => {
@@ -212,6 +212,30 @@ export declare function RewindPortals({ sessionId, sessionOf, chatOf, currentSes
212
212
  * Empty when the composer is absent. Exported as a test seam (the
213
213
  * empty-composer guard in `retractPending`). */
214
214
  export declare function composerText(): string;
215
+ /**
216
+ * Withdraw one pre-sent (pending steering) message and every steering message
217
+ * after it (the rollback point's "future"), WITHOUT interrupting the run.
218
+ *
219
+ * The message is still in the agent's next-step inbox, so the loop has not
220
+ * claimed it into any request: removing it cannot change what the model is
221
+ * generating. Stopping the run first (the durable-rewind rule) would throw
222
+ * away in-flight work — a long tool call, a partial answer — for an edit the
223
+ * model can never observe (SiriLee/dsh-rewind#27). Only the durable rewind
224
+ * needs a stop, because it cuts the model-visible surface.
225
+ *
226
+ * 1. Remove the target and its future (steering only; queued stays) through
227
+ * the session's own `updateQueue` channel, oldest first.
228
+ * 2. Put the target's text back in the composer ONLY when the target was
229
+ * actually removed and the composer is empty (Claude Code's auto-restore
230
+ * guard, so a draft the user is typing is never clobbered).
231
+ *
232
+ * The realistic failure is `queue-item-not-found`: a step boundary claimed
233
+ * the whole next-step batch a moment ago, so the message is now durable and
234
+ * the durable row's regular rewind button takes over with no gap. Nothing is
235
+ * removed then, and the composer is NOT refilled — refilling would invite a
236
+ * duplicate send of a message the model has already received.
237
+ */
238
+ export declare function retractPending(session: SessionFace, itemId: string, text: string | null, setComposerText: (sessionId: string, text: string) => boolean): Promise<void>;
215
239
  /**
216
240
  * Build the slot-entry component for the plugin apply(): a tiny bridge that
217
241
  * injects the apply-time capabilities (session resolution, locale, rewind
@@ -4,26 +4,24 @@
4
4
  * resolve against the calling agent's session workspace
5
5
  * (`exec.agent.session.header.cwd`), not the server's launch dir.
6
6
  *
7
- * Pure functions: the only runtime dependency is `canonicalPath`, applied
8
- * when either the cwd or the requested path contains a parent traversal so a
9
- * symlinked cwd's filesystem identity stays observable identical to the
10
- * tool boundary behavior.
7
+ * Pure functions: the session cwd is returned verbatim. The fs tools no longer
8
+ * canonicalize a parent-traversing cwd (alpha line), so neither does the
9
+ * plugin snapshot tracking must resolve to the same base the tool wrote to.
11
10
  *
12
11
  * @module dsh-rewind/session-cwd
13
12
  */
14
13
  import type { ToolExecution } from '@deepseek-ai/dsh-tools';
15
14
  /**
16
- * The session workspace cwd to resolve `requestedPath` against, or undefined
15
+ * The session workspace cwd to resolve a requested path against, or undefined
17
16
  * when no session cwd applies (the filesystem backend then uses its own
18
17
  * default base).
19
18
  * @param cwd - the session's `header.cwd`, if any.
20
- * @param requestedPath - the path the provider will resolve.
21
- * @returns the cwd, canonicalized when traversal could expose a symlink.
19
+ * @returns the cwd unchanged.
22
20
  */
23
- export declare function sessionCwd(cwd: string | undefined, requestedPath: string): string | undefined;
21
+ export declare function sessionCwd(cwd: string | undefined): string | undefined;
24
22
  /**
25
23
  * Session cwd for one tool execution (same rule as the fs tools).
26
24
  * @param exec - the tool-execution context; only its optional `agent` is read.
27
- * @param requestedPath - the path the provider will resolve.
25
+ * @returns the calling agent's session cwd, or undefined for a non-agent caller.
28
26
  */
29
- export declare function execSessionCwd(exec: ToolExecution, requestedPath: string): string | undefined;
27
+ export declare function execSessionCwd(exec: ToolExecution): string | undefined;
@@ -481,7 +481,7 @@ export declare class SnapshotStore {
481
481
  /**
482
482
  * Session-format version snapshots are anchored under, stamped into each
483
483
  * session's `format` marker when an entry is recorded. `null` until the host
484
- * sets it (from `agent/session-start`), so a session that never records is
484
+ * sets it (from `agent/created`), so a session that never records is
485
485
  * never materialized and a marker is only written where snapshots exist.
486
486
  */
487
487
  private formatVersion;
@@ -941,7 +941,7 @@ export declare class SnapshotStore {
941
941
  markFormatVersion(sessionId: string, sessionVersion: number): Promise<void>;
942
942
  /**
943
943
  * Set the session-format version the store stamps onto every snapshot it
944
- * records. The host sets this once per process from `agent/session-start`
944
+ * records. The host sets this once per process from `agent/created`
945
945
  * (`agent.session.header.version`), so a marker is only materialized for a
946
946
  * session that actually records a snapshot.
947
947
  */
@@ -972,7 +972,7 @@ export declare class SnapshotStore {
972
972
  * Session-format-version guard: clear a session's snapshot dir when the
973
973
  * format its snapshots were anchored under differs from the current session
974
974
  * format, so seq-anchored references can never survive a format migration
975
- * mis-mapped. Runs at `agent/session-start` — after DSH has migrated/loaded
975
+ * mis-mapped. Runs at `agent/created` — after DSH has migrated/loaded
976
976
  * the session, so `sessionVersion` is the post-migration value.
977
977
  *
978
978
  * Conservative rule (per the "delete stale snapshots" policy): a session
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dsh-rewind-plugin",
3
- "version": "0.12.1",
3
+ "version": "0.13.0-alpha.1",
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-rc.1"
53
+ "dsh": ">=0.1.6-alpha.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-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"
79
+ "@deepseek-ai/dsh-client-locale": "^0.1.6-alpha.1",
80
+ "@deepseek-ai/dsh-client-ui-commands": "^0.1.6-alpha.1",
81
+ "@deepseek-ai/dsh-client-ui-settings": "^0.1.6-alpha.1",
82
+ "@deepseek-ai/dsh-client-ui-slots": "^0.1.6-alpha.1",
83
+ "@deepseek-ai/dsh-commands": "^0.1.6-alpha.1",
84
+ "@deepseek-ai/dsh-fs": "^0.1.6-alpha.1",
85
+ "@deepseek-ai/dsh-home-paths": "^0.1.6-alpha.1",
86
+ "@deepseek-ai/dsh-llm": "^0.1.6-alpha.1",
87
+ "@deepseek-ai/dsh-sandbox": "^0.1.6-alpha.1",
88
+ "@deepseek-ai/dsh-session": "^0.1.6-alpha.1",
89
+ "@deepseek-ai/dsh-settings": "^0.1.6-alpha.1",
90
+ "@deepseek-ai/dsh-tools": "^0.1.6-alpha.1"
91
91
  },
92
92
  "peerDependenciesMeta": {
93
93
  "@deepseek-ai/cordis": {
@@ -136,37 +136,38 @@
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-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",
139
+ "@deepseek-ai/dsh-agent": "^0.1.6-alpha.1",
140
+ "@deepseek-ai/dsh-attachment": "^0.1.6-alpha.1",
141
+ "@deepseek-ai/dsh-client-locale": "^0.1.6-alpha.1",
142
+ "@deepseek-ai/dsh-client-connection": "^0.1.6-alpha.1",
143
+ "@deepseek-ai/dsh-client-store": "^0.1.6-alpha.1",
144
+ "@deepseek-ai/dsh-client-ui-primitives": "^0.1.6-alpha.1",
145
+ "@deepseek-ai/dsh-api-session-controller": "^0.1.6-alpha.1",
146
+ "@deepseek-ai/dsh-client-ui-conversation": "^0.1.6-alpha.1",
147
+ "@deepseek-ai/dsh-scope": "^0.1.6-alpha.1",
148
+ "@deepseek-ai/dsh-typert-protocol": "^0.1.6-alpha.1",
149
+ "@deepseek-ai/dsh-user-questions": "^0.1.6-alpha.1",
150
+ "@deepseek-ai/dsh-client-ui-commands": "^0.1.6-alpha.1",
151
+ "@deepseek-ai/dsh-client-ui-input-trigger": "^0.1.6-alpha.1",
152
+ "@deepseek-ai/dsh-client-ui-slots": "^0.1.6-alpha.1",
153
+ "@deepseek-ai/dsh-command-compact": "^0.1.6-alpha.1",
154
+ "@deepseek-ai/dsh-commands": "^0.1.6-alpha.1",
155
+ "@deepseek-ai/dsh-compaction": "^0.1.6-alpha.1",
156
+ "@deepseek-ai/dsh-compaction-basic": "^0.1.6-alpha.1",
157
+ "@deepseek-ai/dsh-compaction-image-offload": "^0.1.6-alpha.1",
158
+ "@deepseek-ai/dsh-fs": "^0.1.6-alpha.1",
159
+ "@deepseek-ai/dsh-goal": "^0.1.6-alpha.1",
160
+ "@deepseek-ai/dsh-home-paths": "^0.1.6-alpha.1",
161
+ "@deepseek-ai/dsh-llm": "^0.1.6-alpha.1",
162
+ "@deepseek-ai/dsh-plan-mode": "^0.1.6-alpha.1",
163
+ "@deepseek-ai/dsh-sandbox": "^0.1.6-alpha.1",
164
+ "@deepseek-ai/dsh-session": "^0.1.6-alpha.1",
165
+ "@deepseek-ai/dsh-session-projection": "^0.1.6-alpha.1",
166
+ "@deepseek-ai/dsh-session-stats": "^0.1.6-alpha.1",
167
+ "@deepseek-ai/dsh-session-title": "^0.1.6-alpha.1",
168
+ "@deepseek-ai/dsh-settings": "^0.1.6-alpha.1",
169
+ "@deepseek-ai/dsh-token-meter": "^0.1.6-alpha.1",
170
+ "@deepseek-ai/dsh-tools": "^0.1.6-alpha.1",
170
171
  "@types/node": "^24.0.0",
171
172
  "@types/react": "^18.3.31",
172
173
  "@types/react-dom": "^18.3.7",