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 +2 -5
- package/README.md +2 -5
- package/docs/compat/audit.md +14 -7
- package/lib/client.js +16 -7
- package/lib/index.js +9 -12
- package/lib/types/client/portals.d.ts +24 -0
- package/lib/types/session-cwd.d.ts +8 -10
- package/lib/types/snapshot.d.ts +3 -3
- package/package.json +46 -45
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
|
[](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`
|
|
61
|
-
- **
|
|
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
|
[](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
|
|
package/docs/compat/audit.md
CHANGED
|
@@ -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.
|
|
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` /
|
|
29
|
-
|
|
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. (
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
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
|
-
|
|
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.
|
|
1374
|
-
var BUILD_HASH = true ? "
|
|
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": "\
|
|
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": "
|
|
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
|
-
|
|
212
|
-
|
|
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
|
|
218
|
-
return sessionCwd(exec.agent?.session.header.cwd
|
|
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/
|
|
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/
|
|
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/
|
|
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
|
|
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/
|
|
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
|
|
8
|
-
*
|
|
9
|
-
*
|
|
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
|
|
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
|
-
* @
|
|
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
|
|
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
|
-
* @
|
|
25
|
+
* @returns the calling agent's session cwd, or undefined for a non-agent caller.
|
|
28
26
|
*/
|
|
29
|
-
export declare function execSessionCwd(exec: ToolExecution
|
|
27
|
+
export declare function execSessionCwd(exec: ToolExecution): string | undefined;
|
package/lib/types/snapshot.d.ts
CHANGED
|
@@ -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/
|
|
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/
|
|
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/
|
|
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.
|
|
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.
|
|
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.
|
|
80
|
-
"@deepseek-ai/dsh-client-ui-commands": "^0.1.
|
|
81
|
-
"@deepseek-ai/dsh-client-ui-settings": "^0.1.
|
|
82
|
-
"@deepseek-ai/dsh-client-ui-slots": "^0.1.
|
|
83
|
-
"@deepseek-ai/dsh-commands": "^0.1.
|
|
84
|
-
"@deepseek-ai/dsh-fs": "^0.1.
|
|
85
|
-
"@deepseek-ai/dsh-home-paths": "^0.1.
|
|
86
|
-
"@deepseek-ai/dsh-llm": "^0.1.
|
|
87
|
-
"@deepseek-ai/dsh-sandbox": "^0.1.
|
|
88
|
-
"@deepseek-ai/dsh-session": "^0.1.
|
|
89
|
-
"@deepseek-ai/dsh-settings": "^0.1.
|
|
90
|
-
"@deepseek-ai/dsh-tools": "^0.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.
|
|
140
|
-
"@deepseek-ai/dsh-attachment": "^0.1.
|
|
141
|
-
"@deepseek-ai/dsh-client-locale": "^0.1.
|
|
142
|
-
"@deepseek-ai/dsh-client-connection": "^0.1.
|
|
143
|
-
"@deepseek-ai/dsh-client-store": "^0.1.
|
|
144
|
-
"@deepseek-ai/dsh-client-ui-primitives": "^0.1.
|
|
145
|
-
"@deepseek-ai/dsh-api-session-controller": "^0.1.
|
|
146
|
-
"@deepseek-ai/dsh-client-ui-conversation": "^0.1.
|
|
147
|
-
"@deepseek-ai/dsh-scope": "^0.1.
|
|
148
|
-
"@deepseek-ai/dsh-typert-protocol": "^0.1.
|
|
149
|
-
"@deepseek-ai/dsh-user-questions": "^0.1.
|
|
150
|
-
"@deepseek-ai/dsh-client-ui-commands": "^0.1.
|
|
151
|
-
"@deepseek-ai/dsh-client-ui-input-trigger": "^0.1.
|
|
152
|
-
"@deepseek-ai/dsh-client-ui-slots": "^0.1.
|
|
153
|
-
"@deepseek-ai/dsh-command-compact": "^0.1.
|
|
154
|
-
"@deepseek-ai/dsh-commands": "^0.1.
|
|
155
|
-
"@deepseek-ai/dsh-compaction": "^0.1.
|
|
156
|
-
"@deepseek-ai/dsh-compaction-basic": "^0.1.
|
|
157
|
-
"@deepseek-ai/dsh-
|
|
158
|
-
"@deepseek-ai/dsh-
|
|
159
|
-
"@deepseek-ai/dsh-
|
|
160
|
-
"@deepseek-ai/dsh-
|
|
161
|
-
"@deepseek-ai/dsh-
|
|
162
|
-
"@deepseek-ai/dsh-
|
|
163
|
-
"@deepseek-ai/dsh-
|
|
164
|
-
"@deepseek-ai/dsh-session
|
|
165
|
-
"@deepseek-ai/dsh-session-
|
|
166
|
-
"@deepseek-ai/dsh-session-
|
|
167
|
-
"@deepseek-ai/dsh-
|
|
168
|
-
"@deepseek-ai/dsh-
|
|
169
|
-
"@deepseek-ai/dsh-
|
|
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",
|