dsh-rewind-plugin 0.7.2 → 0.7.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.
- package/README.en.md +3 -0
- package/README.md +1 -2
- package/docs/README.md +1 -1
- package/docs/compat/diagnostics.md +55 -52
- package/docs/compat/diagnostics.zh.md +31 -34
- package/lib/client.js +6 -22
- package/lib/types/client/build-info.d.ts +19 -0
- package/package.json +1 -1
package/README.en.md
CHANGED
|
@@ -158,6 +158,9 @@ withdrew should consume the stable, locale-independent helpers exported from
|
|
|
158
158
|
4. **Rewinds from `≤ v0.3.3`** — compaction (`/compact`) is unavailable for those sessions. Newer versions are compatible; for affected old sessions, start a new session.
|
|
159
159
|
5. **The turn-rail shows rewound turns** — the right-side rail added in DSH `v0.1.2-alpha.1` keeps ticks for withdrawn messages: clicking does not jump and hovering shows the withdrawn text. Only a display difference; no functional impact.
|
|
160
160
|
|
|
161
|
+
> [!NOTE]
|
|
162
|
+
> Browser diagnostics are available; see [Browser diagnostics](docs/compat/diagnostics.md).
|
|
163
|
+
|
|
161
164
|
## Security
|
|
162
165
|
|
|
163
166
|
This plugin only appends rewind-marker events to the session log; it never deletes or rewrites logged history. Workspace files are written only when you choose "conversation and code"; backups are stored under `<dsh home>/rewind-snapshots/`; restores draw only from those backups. It never touches your git repository, makes no network requests, and accesses no credentials. Delete `~/.dsh/rewind-snapshots/` to wipe file backups only (chat rewinds are unaffected); the plugin rebuilds automatically. For sessions you've left inactive for a long time, a global auto-cleanup (off by default) can remove their snapshot directory in whole, leaving the active session and the chat log untouched. Full security model: [SECURITY.md](SECURITY.md).
|
package/README.md
CHANGED
|
@@ -146,8 +146,7 @@ dsh plugin --profile web add dsh-rewind-plugin
|
|
|
146
146
|
5. **导轨显示已回退轮次**——DSH `v0.1.2-alpha.1` 新增的右侧导轨,会为已撤回消息保留刻度:点击不跳转、悬浮显示已撤回正文。仅显示差异,无功能影响。
|
|
147
147
|
|
|
148
148
|
> [!NOTE]
|
|
149
|
-
>
|
|
150
|
-
> [浏览器诊断与详细输出开关](docs/compat/diagnostics.zh.md)。
|
|
149
|
+
> 本插件提供浏览器端诊断输出;详见 [浏览器诊断](docs/compat/diagnostics.zh.md)。
|
|
151
150
|
|
|
152
151
|
## 安全
|
|
153
152
|
|
package/docs/README.md
CHANGED
|
@@ -15,7 +15,7 @@ index/navigation entry point.
|
|
|
15
15
|
| `contract/client-contract.md` | Rewind visibility contract for third-party DOM plugins (`.zh` mirror) | integrators |
|
|
16
16
|
| `compat/audit.md` | Compatibility audit: verified surfaces, recorded findings, probe matrix | maintainers |
|
|
17
17
|
| `compat/troubleshooting.md` | Known issues & repair steps (`.zh` mirror) | users / maintainers |
|
|
18
|
-
| `compat/diagnostics.md` | Browser diagnostics
|
|
18
|
+
| `compat/diagnostics.md` | Browser diagnostics (anomaly alerts; verbose switch gates the startup identity line) (`.zh` mirror) | users / maintainers |
|
|
19
19
|
| `release/release.md` | Release workflow & DSH peer-version alignment (`.zh` mirror) | maintainers |
|
|
20
20
|
|
|
21
21
|
Repo-root docs outside `docs/`: `SECURITY.md` (security model) and
|
|
@@ -1,54 +1,57 @@
|
|
|
1
|
-
# Browser diagnostics
|
|
1
|
+
# Browser diagnostics
|
|
2
2
|
|
|
3
3
|
[简体中文](diagnostics.zh.md)
|
|
4
4
|
|
|
5
|
-
Every browser-side diagnostic this plugin emits
|
|
6
|
-
channel, so
|
|
7
|
-
|
|
5
|
+
Every browser-side diagnostic this plugin emits is routed through one small,
|
|
6
|
+
level-filtered channel, so an anomaly surfaces under a single console filter.
|
|
7
|
+
The channel is deliberately narrow: it records only genuine internal anomalies
|
|
8
|
+
the plugin itself detects as off-contract — **not** the normal-path facts the
|
|
9
|
+
user already sees on screen, which carry no attribution.
|
|
8
10
|
|
|
9
|
-
##
|
|
11
|
+
## Always-on anomaly alerts
|
|
10
12
|
|
|
11
|
-
|
|
12
|
-
|
|
13
|
+
`error` and `warn` are always printed (no switch, no configuration) so a fault
|
|
14
|
+
surfaces even for a user who never configured anything:
|
|
13
15
|
|
|
14
|
-
|
|
|
16
|
+
| Level | Meaning |
|
|
15
17
|
| --- | --- |
|
|
16
|
-
| `
|
|
17
|
-
| `
|
|
18
|
-
| `portals` | Per-message button mount issues (e.g. no session binding) |
|
|
19
|
-
| `settings` | The snapshot-cleanup settings card |
|
|
18
|
+
| `error` | Unexpected/breaking failure (e.g. the settings card fails to register) |
|
|
19
|
+
| `warn` | Recoverable anomaly guard (e.g. a rewind command/refill throws, a waited-on outcome never settles, an unmet session binding) |
|
|
20
20
|
|
|
21
|
-
|
|
21
|
+
These cases are rare, cheap, and off-contract. Normal-path detail (which
|
|
22
|
+
branch a refill took, whether a write matched, which rows a rewind cut) is
|
|
23
|
+
deliberately **not** logged: it re-states what the user already sees and adds
|
|
24
|
+
nothing to attribution.
|
|
22
25
|
|
|
23
|
-
|
|
24
|
-
| --- | --- | --- |
|
|
25
|
-
| `error` | on | Unexpected/breaking; always printed |
|
|
26
|
-
| `warn` | on | Recoverable anomaly guard (`rewind not hidden`, `refill skipped/refused/threw`); always printed |
|
|
27
|
-
| `info` | off | Event-level lifecycle (one line per rewind / refill) |
|
|
28
|
-
| `debug` | off | Additional event-level detail behind the switch (the hide-set line, one per rewind) |
|
|
26
|
+
## Scopes
|
|
29
27
|
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
refill), never per streaming frame — so a rewound session does not flood the
|
|
34
|
-
console even with verbose output switched on.
|
|
28
|
+
Diagnostics are printed as `[dsh-rewind:<scope>] ...`. The scope names the
|
|
29
|
+
subsystem an anomaly belongs to, so a report can be captured with a single
|
|
30
|
+
console filter:
|
|
35
31
|
|
|
36
|
-
|
|
32
|
+
| Scope | What an anomaly here means |
|
|
33
|
+
| --- | --- |
|
|
34
|
+
| `boot` | Startup identity — `loaded v<version> (build <hash>)`, gated by the verbose switch (see below). Confirms the running bundle matches a fix. |
|
|
35
|
+
| `refill` | The composer refill after a rewind (command/wait/refill throws, an outcome that never settles) |
|
|
36
|
+
| `portals` | Per-message button mount issues (e.g. no session binding) |
|
|
37
|
+
| `settings` | The snapshot-cleanup settings card |
|
|
38
|
+
| `hiding` | **Reserved** — no active alert at present. If a future row-hiding diagnostic is added, it belongs in this region. |
|
|
37
39
|
|
|
38
|
-
|
|
39
|
-
key, so it can never enable another plugin/feature and nothing else can wake
|
|
40
|
-
this one. Set it, reload the page, reproduce, then filter the console for
|
|
41
|
-
`[dsh-rewind]`:
|
|
40
|
+
## Verbose switch
|
|
42
41
|
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
42
|
+
The `info`/`debug` levels are gated by `localStorage['dsh-rewind.debug']`, read
|
|
43
|
+
once per call and filtered by namespace. After the withdrawal of the restating
|
|
44
|
+
verbose detail, exactly **one** verbose line remains: the `boot` scope's startup
|
|
45
|
+
identity line. It is deliberately **off** by default (a normal user's console
|
|
46
|
+
stays clean, and it is not an anomaly), so a reporter enables the scope to see
|
|
47
|
+
it:
|
|
46
48
|
|
|
47
|
-
|
|
48
|
-
|
|
49
|
+
```js
|
|
50
|
+
// Just the startup identity line.
|
|
51
|
+
localStorage['dsh-rewind.debug'] = 'dsh-rewind:boot'
|
|
49
52
|
|
|
50
|
-
//
|
|
51
|
-
localStorage['dsh-rewind.debug'] = 'dsh-rewind
|
|
53
|
+
// Or everything (avoids needing an exact scope).
|
|
54
|
+
localStorage['dsh-rewind.debug'] = 'dsh-rewind*'
|
|
52
55
|
```
|
|
53
56
|
|
|
54
57
|
Reload (`F5`) after setting it. To switch it off:
|
|
@@ -57,26 +60,26 @@ Reload (`F5`) after setting it. To switch it off:
|
|
|
57
60
|
delete localStorage['dsh-rewind.debug']
|
|
58
61
|
```
|
|
59
62
|
|
|
63
|
+
The `error`/`warn` anomaly alerts are **not** gated by this switch — they are
|
|
64
|
+
always printed. The other verbose detail (used write channel, an empty
|
|
65
|
+
hide-set, per-rewind lifecycle lines) has been withdrawn: it re-stated behavior
|
|
66
|
+
the user already sees and carried no attribution.
|
|
67
|
+
|
|
60
68
|
## Capturing a report
|
|
61
69
|
|
|
62
|
-
1.
|
|
63
|
-
|
|
64
|
-
2. Reproduce once.
|
|
65
|
-
3. In DevTools, filter the Console for `[dsh-rewind]` and copy the output
|
|
70
|
+
1. Reproduce once on the affected page.
|
|
71
|
+
2. In DevTools, filter the Console for `[dsh-rewind]` and copy the output
|
|
66
72
|
(with the plugin version and the DSH/kernel version).
|
|
67
73
|
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
render desync.
|
|
74
|
+
The `error`/`warn` anomaly alerts require no setup — they always print. To also
|
|
75
|
+
capture the startup identity line (`boot`) — useful for ruling out a stale
|
|
76
|
+
bundle / un-restarted host — enable the verbose switch first (see above), then
|
|
77
|
+
reload.
|
|
73
78
|
|
|
74
79
|
## Notes
|
|
75
80
|
|
|
76
|
-
-
|
|
77
|
-
stable public interface; its exact keys and output may change
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
Related: [audit.md](audit.md) for the verified-compatibility matrix and
|
|
82
|
-
[troubleshooting.md](troubleshooting.md) for the legacy repair steps.
|
|
81
|
+
- This diagnostic surface is an aid for maintainers and cooperating reporters,
|
|
82
|
+
**not** a stable public interface; its exact keys and output may change
|
|
83
|
+
without notice.
|
|
84
|
+
- It is scoped to one browser origin and one browser; capture where the problem
|
|
85
|
+
actually occurs.
|
|
@@ -1,44 +1,42 @@
|
|
|
1
|
-
#
|
|
1
|
+
# 浏览器诊断
|
|
2
2
|
|
|
3
3
|
[English](diagnostics.md)
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
本插件在浏览器端输出的所有诊断信息都经由同一条分级通道,因此异常可在单个控制台过滤器下浮现。该通道**刻意收窄**:只记录插件自身检测到的、偏离预期契约的真实内部异常——**不记录**用户早已在屏幕上看到、且无归因价值的普通路径事实。
|
|
6
6
|
|
|
7
|
-
##
|
|
7
|
+
## 常开的异常告警
|
|
8
8
|
|
|
9
|
-
|
|
9
|
+
`error` 与 `warn` **总是打印**(无需开关、无需配置),即使从未配置的用户也能看到故障:
|
|
10
10
|
|
|
11
|
-
|
|
|
11
|
+
| 级别 | 含义 |
|
|
12
12
|
| --- | --- |
|
|
13
|
-
| `
|
|
14
|
-
| `
|
|
15
|
-
| `portals` | 每条消息按钮的挂载问题(如无会话绑定) |
|
|
16
|
-
| `settings` | 快照清理设置卡片 |
|
|
13
|
+
| `error` | 意外/破坏性故障(如设置卡片注册失败) |
|
|
14
|
+
| `warn` | 可恢复的异常护栏(如回退命令/回填抛出异常、等待的结果始终未落定、会话绑定缺失) |
|
|
17
15
|
|
|
18
|
-
|
|
16
|
+
这些情形少见、廉价、且偏离契约。普通路径的细节(回填走了哪个分支、写入是否匹配、回退切断哪些行)则**刻意不记录**:它们重复用户已经看到的现象,对归因毫无增量。
|
|
19
17
|
|
|
20
|
-
|
|
21
|
-
| --- | --- | --- |
|
|
22
|
-
| `error` | 开 | 意外/破坏性;总是打印 |
|
|
23
|
-
| `warn` | 开 | 可恢复的异常护栏(`rewind not hidden`、`refill skipped/refused/threw`);总是打印 |
|
|
24
|
-
| `info` | 关 | 事件级生命周期(每次回退/回填一行) |
|
|
25
|
-
| `debug` | 关 | 开关控制下的追加事件级细节(隐藏集一行,每次回退一行) |
|
|
18
|
+
## 作用域
|
|
26
19
|
|
|
27
|
-
`
|
|
20
|
+
诊断以 `[dsh-rewind:<scope>] ...` 形式打印。`scope` 标明异常所属子系统,因此可用单个控制台过滤器抓取报告:
|
|
28
21
|
|
|
29
|
-
|
|
22
|
+
| scope | 这里的异常含义 |
|
|
23
|
+
| --- | --- |
|
|
24
|
+
| `boot` | 启动身份行——`loaded v<version> (build <hash>)`,由详细输出开关控制(见下)。用于确认运行中的 bundle 是否匹配某个修复。 |
|
|
25
|
+
| `refill` | 回退后的输入框回填(命令/等待/回填抛出异常、等待的结果始终未落定) |
|
|
26
|
+
| `portals` | 每条消息按钮的挂载问题(如无会话绑定) |
|
|
27
|
+
| `settings` | 快照清理设置卡片 |
|
|
28
|
+
| `hiding` | **保留区**——当前无活跃告警。若未来新增行隐藏诊断,应归属此区域。 |
|
|
30
29
|
|
|
31
|
-
|
|
30
|
+
## 详细输出开关
|
|
32
31
|
|
|
33
|
-
|
|
34
|
-
// 全部 dsh-rewind 命名空间。
|
|
35
|
-
localStorage['dsh-rewind.debug'] = 'dsh-rewind*'
|
|
32
|
+
`info`/`debug` 级别受 `localStorage['dsh-rewind.debug']` 控制,每次调用读取并按命名空间过滤。在撤下那些复述现象的详细输出后,**恰好剩一条** verbose 行:`boot` 作用域的启动身份行。它**默认关闭**(普通用户控制台保持干净,且它不是异常),排查者需先开启该作用域才能看到:
|
|
36
33
|
|
|
37
|
-
|
|
38
|
-
|
|
34
|
+
```js
|
|
35
|
+
// 仅启动身份行。
|
|
36
|
+
localStorage['dsh-rewind.debug'] = 'dsh-rewind:boot'
|
|
39
37
|
|
|
40
|
-
//
|
|
41
|
-
localStorage['dsh-rewind.debug'] = 'dsh-rewind
|
|
38
|
+
// 或全部开启(省去精确 scope)。
|
|
39
|
+
localStorage['dsh-rewind.debug'] = 'dsh-rewind*'
|
|
42
40
|
```
|
|
43
41
|
|
|
44
42
|
设置后刷新(`F5`)。关闭:
|
|
@@ -47,17 +45,16 @@ localStorage['dsh-rewind.debug'] = 'dsh-rewind:refill,dsh-rewind:hiding'
|
|
|
47
45
|
delete localStorage['dsh-rewind.debug']
|
|
48
46
|
```
|
|
49
47
|
|
|
48
|
+
`error`/`warn` 异常告警**不受**该开关控制——它们总是打印。其余详细输出(所用写入通道、空的隐藏集、每次回退的生命周期行)已撤下:它们重复用户已经看到的现象、无归因增量。
|
|
49
|
+
|
|
50
50
|
## 采集一段报告
|
|
51
51
|
|
|
52
|
-
1.
|
|
53
|
-
2.
|
|
54
|
-
3. 在 DevTools 里把 Console 按 `[dsh-rewind]` 过滤,复制输出(连同插件版本、DSH/内核版本)。
|
|
52
|
+
1. 在出问题的页面上复现一次。
|
|
53
|
+
2. 在 DevTools 里把 Console 按 `[dsh-rewind]` 过滤,复制输出(连同插件版本、DSH/内核版本)。
|
|
55
54
|
|
|
56
|
-
|
|
55
|
+
`error`/`warn` 异常告警无需任何设置——它们总是打印。若要同时采集启动身份行(`boot`,用于排除「旧 bundle / 宿主未重启」),请先开启详细输出开关(见上),再刷新。
|
|
57
56
|
|
|
58
57
|
## 备注
|
|
59
58
|
|
|
60
|
-
-
|
|
61
|
-
- 它受单个浏览器 origin
|
|
62
|
-
|
|
63
|
-
相关:[audit.md](audit.md) 为已验证兼容矩阵,[troubleshooting.md](troubleshooting.md) 为历史修复步骤。
|
|
59
|
+
- 该诊断表面是维护者与配合排查者使用的工具,**不是**稳定公开接口;其具体键与输出可能不经通知而改变。
|
|
60
|
+
- 它受单个浏览器 origin、单个浏览器限定;请在实际出问题的地方采集。
|
package/lib/client.js
CHANGED
|
@@ -1035,7 +1035,6 @@ async function runRewindAndFill(session, seq, mode, currentSessionId, chatOf, se
|
|
|
1035
1035
|
return;
|
|
1036
1036
|
}
|
|
1037
1037
|
if (!result.ok || result.value?.matched !== true) {
|
|
1038
|
-
rewindLog.info("refill", `rewind @${seq} not matched, no refill`);
|
|
1039
1038
|
return;
|
|
1040
1039
|
}
|
|
1041
1040
|
let outcome;
|
|
@@ -1050,25 +1049,10 @@ async function runRewindAndFill(session, seq, mode, currentSessionId, chatOf, se
|
|
|
1050
1049
|
return;
|
|
1051
1050
|
}
|
|
1052
1051
|
if (outcome.kind !== "success") {
|
|
1053
|
-
rewindLog.warn("refill", `rewind @${seq} refused`, outcome.text);
|
|
1054
1052
|
showHint(outcome.text ?? "rewind failed");
|
|
1055
1053
|
return;
|
|
1056
1054
|
}
|
|
1057
|
-
const hidSeqs = (() => {
|
|
1058
|
-
const chat = chatOf(session);
|
|
1059
|
-
return chat === void 0 ? /* @__PURE__ */ new Set() : hiddenSeqsOf(chat);
|
|
1060
|
-
})();
|
|
1061
|
-
if (hidSeqs.size === 0) {
|
|
1062
|
-
rewindLog.warn("hiding", `rewind not hidden (target @${seq})`, { target: seq });
|
|
1063
|
-
} else {
|
|
1064
|
-
rewindLog.debug(
|
|
1065
|
-
"hiding",
|
|
1066
|
-
`rewind hides seqs [${[...hidSeqs].slice(0, 20).join(", ")}${hidSeqs.size > 20 ? "\u2026" : ""}]`,
|
|
1067
|
-
{ target: seq }
|
|
1068
|
-
);
|
|
1069
|
-
}
|
|
1070
1055
|
if (currentSessionId() !== session.sessionId) {
|
|
1071
|
-
rewindLog.info("refill", `skipped refill @${seq}: session switched during rewind`);
|
|
1072
1056
|
return;
|
|
1073
1057
|
}
|
|
1074
1058
|
let text;
|
|
@@ -1079,21 +1063,17 @@ async function runRewindAndFill(session, seq, mode, currentSessionId, chatOf, se
|
|
|
1079
1063
|
return;
|
|
1080
1064
|
}
|
|
1081
1065
|
if (text === void 0 || text === "") {
|
|
1082
|
-
rewindLog.info("refill", `skipped refill @${seq}: no editable text`);
|
|
1083
1066
|
return;
|
|
1084
1067
|
}
|
|
1085
1068
|
if (composerText().trim() !== "") {
|
|
1086
|
-
rewindLog.info("refill", `skipped refill @${seq}: composer already has a draft`);
|
|
1087
1069
|
return;
|
|
1088
1070
|
}
|
|
1089
|
-
let ok = false;
|
|
1090
1071
|
try {
|
|
1091
|
-
|
|
1072
|
+
setComposerText(session.sessionId, text);
|
|
1092
1073
|
} catch (error) {
|
|
1093
1074
|
rewindLog.warn("refill", `composer refill @${seq} threw`, error);
|
|
1094
1075
|
return;
|
|
1095
1076
|
}
|
|
1096
|
-
rewindLog.info("refill", `rewound to @${seq} (${mode})`, { ok, text: text.slice(0, 80) });
|
|
1097
1077
|
}
|
|
1098
1078
|
function composerSurface() {
|
|
1099
1079
|
return document.querySelector(COMPOSER_TEXTAREA_SELECTOR) ?? document.querySelector(COMPOSER_EDITABLE_SELECTOR);
|
|
@@ -1358,6 +1338,10 @@ function createRewindBridge(deps) {
|
|
|
1358
1338
|
};
|
|
1359
1339
|
}
|
|
1360
1340
|
|
|
1341
|
+
// src/client/build-info.ts
|
|
1342
|
+
var PLUGIN_VERSION = true ? "0.7.3" : "dev";
|
|
1343
|
+
var BUILD_HASH = true ? "0752e2ff" : "dev";
|
|
1344
|
+
|
|
1361
1345
|
// src/client/locales.ts
|
|
1362
1346
|
var zh = {
|
|
1363
1347
|
"button.aria": "\u56DE\u9000\u5230\u6B64\u6D88\u606F",
|
|
@@ -1617,6 +1601,7 @@ var HEADER_ACTIONS_SLOT = "conversation.session.header.actions";
|
|
|
1617
1601
|
var COMPOSER_TEXTAREA_SELECTOR2 = "[data-input-scroll] textarea, textarea[data-phase]";
|
|
1618
1602
|
var COMPOSER_EDITABLE_SELECTOR2 = "[data-composer-input]";
|
|
1619
1603
|
function apply(ctx) {
|
|
1604
|
+
rewindLog.info("boot", `loaded v${PLUGIN_VERSION} (build ${BUILD_HASH})`);
|
|
1620
1605
|
ctx.effect(function* () {
|
|
1621
1606
|
yield ctx.locale.register(NS2, { zh, en });
|
|
1622
1607
|
const t = ctx.locale.bind(NS2);
|
|
@@ -1650,7 +1635,6 @@ function apply(ctx) {
|
|
|
1650
1635
|
input.for(scope).setDraft(draft);
|
|
1651
1636
|
} } : void 0
|
|
1652
1637
|
);
|
|
1653
|
-
rewindLog.info("refill", "composer write", { channel: facade ? "facade" : "dom", ok });
|
|
1654
1638
|
return ok;
|
|
1655
1639
|
} catch (error) {
|
|
1656
1640
|
rewindLog.warn("refill", "composer write threw", error);
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* dsh-rewind client build identity.
|
|
3
|
+
*
|
|
4
|
+
* Two constants are injected by `scripts/build.mjs` at esbuild time (see the
|
|
5
|
+
* `define` block there) and are NOT present in the source. They answer the
|
|
6
|
+
* "am I even running the fixed bundle?" question — the most common, cheapest
|
|
7
|
+
* root cause to rule in/out when a report lands:
|
|
8
|
+
* - `__DSH_REWIND_VERSION__` — the plugin version from `package.json`.
|
|
9
|
+
* - `__DSH_REWIND_BUILD__` — a short content hash of the client source.
|
|
10
|
+
*
|
|
11
|
+
* They are read once at module load and surfaced (behind the existing
|
|
12
|
+
* `dsh-rewind.debug` switch, never a new key) by `apply` in `index.ts`.
|
|
13
|
+
*
|
|
14
|
+
* @module dsh-rewind/client/build-info
|
|
15
|
+
*/
|
|
16
|
+
/** Plugin version baked in at build time (from `package.json`). */
|
|
17
|
+
export declare const PLUGIN_VERSION: string;
|
|
18
|
+
/** Short content hash of the client source, for stale-bundle detection. */
|
|
19
|
+
export declare const BUILD_HASH: string;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "dsh-rewind-plugin",
|
|
3
|
-
"version": "0.7.
|
|
3
|
+
"version": "0.7.3",
|
|
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",
|