@michengai/dsh-archive-manager 0.1.31 → 0.1.33
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/CHANGELOG.md +17 -1
- package/CHANGELOG.zh-CN.md +17 -1
- package/README.md +57 -63
- package/README.zh-CN.md +57 -63
- package/lib/workspace.js +75 -8
- package/package.json +43 -41
package/CHANGELOG.md
CHANGED
|
@@ -4,7 +4,23 @@
|
|
|
4
4
|
|
|
5
5
|
Published release notes are retained below; new versions are added without removing earlier entries.
|
|
6
6
|
|
|
7
|
-
##
|
|
7
|
+
## 0.1.33 - 2026-09-08
|
|
8
|
+
|
|
9
|
+
- Added real live-session deletion coverage for `0.1.3-alpha.2` with JSONL and Zstandard: verify pending event durability, write-handle closure before directory removal, completion notification, archive bookkeeping cleanup, and no resurrection after reopening storage or a later flush; no production deletion change was required.
|
|
10
|
+
|
|
11
|
+
- Validate isolated storage test entry points, dependency versions, and resolved paths before loading host modules to prevent false failures from local legacy links; add `test:latest`, build before the matrix, and assert a single completion event for legacy live deletion.
|
|
12
|
+
|
|
13
|
+
- Added an isolated full regression matrix for DSH `0.1.1-rc.2` / Cordis `4.0.1`, `0.1.2-rc.1` / `4.0.2`, and `0.1.3-alpha.2` / `4.0.2`, passing 134, 134, and 137 tests respectively; corrected legacy client/event test fixtures and explicitly accepted the `0.1.1-rc.2` prerelease peer range.
|
|
14
|
+
|
|
15
|
+
- Added compatibility with DeepSeek Harness `0.1.3-alpha.2` (official master `c389f96`), including persistence snapshot listings and read-only session handles while retaining legacy API paths.
|
|
16
|
+
- Fixed sessions remaining under Ungrouped after batch deletion on the newer host (#19): remove every log generation in the session directory, confirm persistence removal before committing bookkeeping and broadcasting completion, and include cold subagents in cascading deletion.
|
|
17
|
+
- Updated development dependencies and added isolated tests against real JSONL / Zstandard storage, covering queries and reopening storage after deletion, fork preservation, and archived projection reads.
|
|
18
|
+
|
|
19
|
+
## 0.1.32 - 2026-09-07
|
|
20
|
+
|
|
21
|
+
- Fixed leftover session directories after deletion (#16): remove the entire session-owned directory after validating the official JSONL layout, preserve shared/unknown-backend parent directories, and refuse deletion through directory links.
|
|
22
|
+
- Added regression coverage for directory and attachment cleanup, path encoding, shared-directory protection, and failed-deletion retries.
|
|
23
|
+
- Kept relative JSONL storage roots stable across host working-directory changes and added warnings when directory ownership cannot be verified.
|
|
8
24
|
|
|
9
25
|
## 0.1.31 - 2026-09-07
|
|
10
26
|
|
package/CHANGELOG.zh-CN.md
CHANGED
|
@@ -4,7 +4,23 @@
|
|
|
4
4
|
|
|
5
5
|
以下发布说明会持续保留;新增版本时不再删除较早记录。
|
|
6
6
|
|
|
7
|
-
##
|
|
7
|
+
## 0.1.33 - 2026-09-08
|
|
8
|
+
|
|
9
|
+
- 补齐 `0.1.3-alpha.2` 真实实时会话删除回归(JSONL / Zstandard):验证未手动 flush 的事件落盘、目录删除前写句柄关闭、完成事件、归档记账清理,以及重新打开存储和后续 flush 均不复活会话;无需修改产品删除逻辑。
|
|
10
|
+
|
|
11
|
+
- 存储回归在加载宿主前检查隔离入口、依赖版本及解析路径,避免本机旧依赖链接造成误报;新增 `test:latest` 入口,矩阵运行前自动构建,并补充旧版实时删除只发一次完成事件的断言。
|
|
12
|
+
|
|
13
|
+
- 增加隔离的新旧宿主全量回归矩阵:DSH `0.1.1-rc.2` / Cordis `4.0.1`、`0.1.2-rc.1` / `4.0.2`、`0.1.3-alpha.2` / `4.0.2`,分别通过 134、134、137 项;修正旧客户端与事件接口的测试夹具,并明确接纳 `0.1.1-rc.2` 的预发布依赖范围。
|
|
14
|
+
|
|
15
|
+
- 适配 DeepSeek Harness `0.1.3-alpha.2`(官方 master `c389f96`):支持持久化快照列表与只读会话句柄,保留旧版接口兼容路径。
|
|
16
|
+
- 修复新版宿主批量删除后会话残留在“未分组”的问题(#19):清理会话目录中的全部日志代际,确认持久化已移除后再提交记账并广播完成通知,同时修复冷子会话级联遗漏。
|
|
17
|
+
- 将开发依赖升级至新版基线,并新增隔离的真实 JSONL / Zstandard 存储回归,覆盖删除后查询和重新打开存储、fork 保留及归档投影读取。
|
|
18
|
+
|
|
19
|
+
## 0.1.32 - 2026-09-07
|
|
20
|
+
|
|
21
|
+
- 修复删除会话后遗留目录的问题(#16):校验官方 JSONL 存储布局后清理完整会话专属目录,保留共享目录和未知后端的父目录,并拒绝通过目录符号链接进行删除。
|
|
22
|
+
- 补充目录与附件清理、路径编码、共享目录保护及删除失败重试的回归测试。
|
|
23
|
+
- 修复宿主工作目录变化导致相对 JSONL 存储根路径失效的问题,并为无法验证目录归属的降级删除增加警告。
|
|
8
24
|
|
|
9
25
|
## 0.1.31 - 2026-09-07
|
|
10
26
|
|
package/README.md
CHANGED
|
@@ -21,16 +21,12 @@
|
|
|
21
21
|
|
|
22
22
|
## Features
|
|
23
23
|
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
-
|
|
27
|
-
-
|
|
28
|
-
-
|
|
29
|
-
-
|
|
30
|
-
- Permanently delete a confirmed session, its workspace association, archive marker, and projection cache.
|
|
31
|
-
- Delete all archived chats after confirmation, including child agents.
|
|
32
|
-
- Remove unloaded deleted sessions from connected sidebars immediately.
|
|
33
|
-
- Paste one sentence into DSH, Codex, or WorkBuddy and let that agent install the plugin locally.
|
|
24
|
+
Put inactive conversations away and find them again when needed. Search, restore, and clean up archives in one place while keeping everyday task lists tidy.
|
|
25
|
+
|
|
26
|
+
- **Put finished tasks away**: archive one conversation or all active chats in a workspace.
|
|
27
|
+
- **Find past work**: search titles, filter by project, and sort by time or title in **Settings → Archived sessions**.
|
|
28
|
+
- **Resume your work**: restore one conversation, a project group, or all archived chats.
|
|
29
|
+
- **Clean up records**: permanently delete individual chats or batches after confirmation. **Permanent deletion cannot be undone.**
|
|
34
30
|
|
|
35
31
|
## Screenshots
|
|
36
32
|
|
|
@@ -44,57 +40,56 @@ Search, sort, filter by project, unarchive, or permanently delete chats in **Set
|
|
|
44
40
|
|
|
45
41
|
## DSH product ecosystem
|
|
46
42
|
|
|
47
|
-
|
|
43
|
+
For a ready-to-use workbench, download [DSH Codex Desktop](https://github.com/MichengAI/dsh-codex-desktop/releases). If you already use [DeepSeek Harness](https://github.com/deepseek-ai/deepseek-harness), install any of these eight plugins individually. The desktop app includes all eight.
|
|
48
44
|
|
|
49
|
-
|
|
|
45
|
+
| Plugin | What you can do |
|
|
50
46
|
| --- | --- |
|
|
51
|
-
| [
|
|
52
|
-
| [
|
|
53
|
-
| [
|
|
54
|
-
|
|
|
47
|
+
| [Codex UI](https://github.com/MichengAI/dsh-codex-ui) | Organize projects and conversations, search tasks, and navigate chat turns |
|
|
48
|
+
| [IM Connect](https://github.com/MichengAI/dsh-im-connect) | Send tasks and receive replies through your usual messenger |
|
|
49
|
+
| [Automation](https://github.com/MichengAI/dsh-automation) | Schedule tasks and review each run |
|
|
50
|
+
| [Skills Manager](https://github.com/MichengAI/dsh-skills-manager) | Find, enable, create, and import local skills |
|
|
51
|
+
| [Archive Manager](https://github.com/MichengAI/dsh-archive-manager) | Search, restore, or clean up archived conversations |
|
|
52
|
+
| [Agency Agents](https://github.com/MichengAI/dsh-agency-agents) | Choose and summon specialists for your task |
|
|
53
|
+
| [BTW](https://github.com/MichengAI/dsh-btw) | Ask side questions without interrupting the main task |
|
|
54
|
+
| [Simplify](https://github.com/MichengAI/dsh-simplify) | Use /simplify to improve code within your Git changes |
|
|
55
55
|
|
|
56
56
|
## Prerequisites
|
|
57
57
|
|
|
58
|
+
- Plugin `0.1.33` and later support DeepSeek Harness `0.1.3-alpha.2` (official master `c389f96`) alongside the verified legacy hosts listed below. Later master commits require separate validation.
|
|
59
|
+
|
|
58
60
|
- A working DeepSeek Harness Web installation with `dsh` available in PowerShell.
|
|
59
61
|
- Examples use the `web` profile; replace it with the target profile.
|
|
60
62
|
- Source installation and development require Node.js 22+ and pnpm. npm installation does not require running `pnpm install` separately.
|
|
61
63
|
|
|
62
64
|
## Installation
|
|
63
65
|
|
|
64
|
-
`
|
|
66
|
+
Run `pnpm test:compat` to test the same plugin artifacts with isolated host dependencies. The following combinations have passed; this does not claim coverage of every intermediate release:
|
|
65
67
|
|
|
66
|
-
|
|
68
|
+
- `pnpm test`: build and run local tests, excluding `test/fixtures`; local host links may affect dependency resolution.
|
|
69
|
+
- `pnpm test:matrix`: build, then install three isolated host versions and run the full matrix.
|
|
70
|
+
- `pnpm test:latest`: build, then run the six real storage tests against the isolated latest baseline.
|
|
71
|
+
- `pnpm test:compat`: validate legacy cache migration and run the full matrix.
|
|
67
72
|
|
|
68
|
-
|
|
73
|
+
Do not run `test/fixtures/*.mjs` directly. Fixtures validate the isolated entry point, dependency versions, and resolved paths before loading the host. If local dependencies have drifted, run `pnpm install --frozen-lockfile` to restore declared development dependencies. This does not guarantee removal of undeclared packages or host links under `test/node_modules`; use the isolated commands for compatibility acceptance.
|
|
69
74
|
|
|
70
|
-
|
|
75
|
+
| DSH | Cordis | Automated regression |
|
|
76
|
+
| --- | --- | --- |
|
|
77
|
+
| `0.1.1-rc.2` | `4.0.1` | 134 passed, plus legacy cache migration validation |
|
|
78
|
+
| `0.1.2-rc.1` | `4.0.2` | 134 passed |
|
|
79
|
+
| `0.1.3-alpha.2` | `4.0.2` | 137 passed |
|
|
71
80
|
|
|
72
|
-
|
|
73
|
-
Install the latest DSH plugin @michengai/dsh-archive-manager into my local web profile using the official npm registry: dsh plugin --profile web add @michengai/dsh-archive-manager@latest --registry=https://registry.npmjs.org/. Then run dsh --profile web --dump-config, confirm archive-manager is mounted, and remind me to restart DSH Web and hard-refresh the browser.
|
|
74
|
-
```
|
|
81
|
+
Coverage includes client Remote integration, archive/restore, real JSONL/Zstandard deletion and subagent cascades, and queries/reopened storage after deletion. Tested on Windows / Node.js 24; a full DSH Web browser acceptance run has not been performed. The latest storage fixture isolates only the upstream POSIX `fs-ext` import that cannot load on Windows; file operations and native Windows locking still use the official implementation.
|
|
75
82
|
|
|
76
|
-
|
|
83
|
+
The installation commands below use the official npm registry.
|
|
77
84
|
|
|
78
|
-
|
|
79
|
-
Install the DSH plugin from source at https://github.com/MichengAI/dsh-archive-manager: clone it, run pnpm install --frozen-lockfile and pnpm build, then run dsh plugin --profile web add . from that directory. Do not copy lib by itself. Then run dsh --profile web --dump-config, confirm archive-manager is mounted, and remind me to restart DSH Web and hard-refresh the browser.
|
|
80
|
-
```
|
|
85
|
+
### Ask an agent to install it (recommended)
|
|
81
86
|
|
|
82
|
-
|
|
83
|
-
| --- | --- |
|
|
84
|
-
| DSH | Send one of the sentences above to the current session. |
|
|
85
|
-
| Codex | Send one of the sentences above to Codex and let it install locally. |
|
|
86
|
-
| WorkBuddy | Send one of the sentences above to WorkBuddy; for a source install you can also paste `https://github.com/MichengAI/dsh-archive-manager`. |
|
|
87
|
+
Send the prompt below to any agent that can run terminal commands on your computer. Replace `web` with your actual profile. Once installed, use the plugin in DSH.
|
|
87
88
|
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
You can also run the same npm command yourself:
|
|
91
|
-
|
|
92
|
-
```powershell
|
|
93
|
-
dsh plugin --profile web add @michengai/dsh-archive-manager@latest --registry=https://registry.npmjs.org/
|
|
89
|
+
```text
|
|
90
|
+
Install the DSH plugin @michengai/dsh-archive-manager into my local web profile by running: dsh plugin --profile web add @michengai/dsh-archive-manager@latest --registry=https://registry.npmjs.org/. Then run dsh --profile web --dump-config, confirm the configuration includes workspace-archive-manager, ui-workspace-archive-manager, and explain how to reload DSH and start using the plugin.
|
|
94
91
|
```
|
|
95
92
|
|
|
96
|
-
If `dsh` is not on PATH, replace the leading `dsh` with `npx --yes @deepseek-ai/dsh`.
|
|
97
|
-
|
|
98
93
|
### Install the latest package from the official npm registry
|
|
99
94
|
|
|
100
95
|
Run this from any PowerShell directory:
|
|
@@ -110,24 +105,6 @@ To pin a release, replace `@latest` with a specific version such as `@x.y.z`.
|
|
|
110
105
|
|
|
111
106
|
The configuration output should contain `workspace-archive-manager` and `ui-workspace-archive-manager`. Restart DSH Web and hard-refresh the browser. Do not copy client files manually: the Settings page and archive menu need the mounted plugin.
|
|
112
107
|
|
|
113
|
-
### Install from source
|
|
114
|
-
|
|
115
|
-
Use this for debugging or unpublished changes. The cloned directory becomes the plugin source path:
|
|
116
|
-
|
|
117
|
-
```powershell
|
|
118
|
-
[Console]::OutputEncoding = [System.Text.Encoding]::UTF8
|
|
119
|
-
$OutputEncoding = [System.Text.Encoding]::UTF8
|
|
120
|
-
Set-Location D:\Repository\deepseek-harness-plugin
|
|
121
|
-
git clone https://github.com/MichengAI/dsh-archive-manager.git
|
|
122
|
-
Set-Location .\dsh-archive-manager
|
|
123
|
-
pnpm install --frozen-lockfile
|
|
124
|
-
pnpm build
|
|
125
|
-
dsh plugin --profile web add .
|
|
126
|
-
dsh --profile web --dump-config
|
|
127
|
-
```
|
|
128
|
-
|
|
129
|
-
Restart DSH Web and hard-refresh the browser. `dsh plugin ... add .` reads the package metadata and `cordis.patch.yml`; do not install by copying `lib` directly.
|
|
130
|
-
|
|
131
108
|
## Updates
|
|
132
109
|
|
|
133
110
|
The settings title shows the installed version and a **Check for updates** button. When a newer release is available, **Update automatically** runs only when the DSH CLI or Desktop update service is available; otherwise, the dialog provides a profile-specific manual command to copy and run.
|
|
@@ -146,12 +123,33 @@ If the entry is missing after installation or upgrade, restart DSH Web and hard-
|
|
|
146
123
|
## Data handling limits
|
|
147
124
|
|
|
148
125
|
- Deletion always requires confirmation.
|
|
149
|
-
- It removes
|
|
126
|
+
- It removes workspace records, archive markers, and the projection cache. For the official JSONL backend, a validated layout also allows removal of the session-owned directory and its contents, including attachments. Other backends or unknown layouts only lose the located transcript artifact, never its parent directory.
|
|
127
|
+
- Project containers and storage roots are retained. Deletion refuses symbolic links or Windows junctions at the official layout's project/session directory levels and keeps the operation retryable.
|
|
128
|
+
- Layout validation uses the official backend's initialized absolute root, so a relative root remains stable across host working-directory changes. If that field is unavailable, only an absolute configured root is accepted. An unverified official JSONL layout emits a warning with the session ID and artifact path before falling back to artifact-only deletion.
|
|
129
|
+
- Directory validation is not a cross-process filesystem lock: do not concurrently move or replace storage directories or change directory links during deletion. Storage paths writable by untrusted processes are not a security isolation boundary.
|
|
150
130
|
- A live session finishes writing before cleanup to prevent data truncation.
|
|
151
131
|
- The plugin replaces DSH’s default workspace and projection services. Install through the DSH profile instead of manually composing the patch.
|
|
152
132
|
|
|
153
133
|
## Secondary development
|
|
154
134
|
|
|
135
|
+
### Install from source
|
|
136
|
+
|
|
137
|
+
Use this for debugging or unpublished changes. The cloned directory becomes the plugin source path:
|
|
138
|
+
|
|
139
|
+
```powershell
|
|
140
|
+
[Console]::OutputEncoding = [System.Text.Encoding]::UTF8
|
|
141
|
+
$OutputEncoding = [System.Text.Encoding]::UTF8
|
|
142
|
+
Set-Location D:\Repository\deepseek-harness-plugin
|
|
143
|
+
git clone https://github.com/MichengAI/dsh-archive-manager.git
|
|
144
|
+
Set-Location .\dsh-archive-manager
|
|
145
|
+
pnpm install --frozen-lockfile
|
|
146
|
+
pnpm build
|
|
147
|
+
dsh plugin --profile web add .
|
|
148
|
+
dsh --profile web --dump-config
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
Restart DSH Web and hard-refresh the browser. `dsh plugin ... add .` reads the package metadata and `cordis.patch.yml`; do not install by copying `lib` directly.
|
|
152
|
+
|
|
155
153
|
`src` is the sole maintained source directory. `pnpm build` uses esbuild to compile it into publishable `lib` output. Do not edit `lib` directly because the next build overwrites it.
|
|
156
154
|
|
|
157
155
|
- [src\index.js](src/index.js): host service entry point.
|
|
@@ -185,7 +183,3 @@ pnpm verify
|
|
|
185
183
|
## License
|
|
186
184
|
|
|
187
185
|
Licensed under [Apache License 2.0](LICENSE).
|
|
188
|
-
|
|
189
|
-
## Changelog
|
|
190
|
-
|
|
191
|
-
See [CHANGELOG.md](CHANGELOG.md) for retained release notes.
|
package/README.zh-CN.md
CHANGED
|
@@ -21,16 +21,12 @@
|
|
|
21
21
|
|
|
22
22
|
## 功能概览
|
|
23
23
|
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
-
|
|
27
|
-
-
|
|
28
|
-
-
|
|
29
|
-
-
|
|
30
|
-
- 经确认后永久删除会话、工作区归属、归档标记和投影缓存。
|
|
31
|
-
- 经确认后删除全部已归档聊天,包含子代理。
|
|
32
|
-
- 已删除的未加载归档会话会立即从已连接客户端的侧栏移除。
|
|
33
|
-
- 可把一句话复制到 DSH、Codex 或 WorkBuddy,让对方代装到本机 DSH。
|
|
24
|
+
把暂时不用的会话收起来,需要时再找回。集中搜索、恢复和清理归档记录,让日常任务列表更清爽。
|
|
25
|
+
|
|
26
|
+
- **收起已完成的任务**:归档单条聊天,也可归档整个工作区的未归档聊天。
|
|
27
|
+
- **快速找回历史**:在「设置 → 归档会话」搜索标题、按项目筛选,或按时间和标题排序。
|
|
28
|
+
- **恢复继续工作**:恢复单条会话、整个项目或全部归档会话。
|
|
29
|
+
- **按需清理记录**:支持单条或批量永久删除,执行前会要求确认。**永久删除无法撤销。**
|
|
34
30
|
|
|
35
31
|
## 界面预览
|
|
36
32
|
|
|
@@ -44,57 +40,56 @@
|
|
|
44
40
|
|
|
45
41
|
## DSH 产品生态
|
|
46
42
|
|
|
47
|
-
|
|
43
|
+
想直接使用完整工作台,可下载 [DSH Codex Desktop](https://github.com/MichengAI/dsh-codex-desktop/releases);已有 [DeepSeek Harness](https://github.com/deepseek-ai/deepseek-harness) 环境,可按需独立安装以下 8 个自研插件。桌面端已随附这些插件。
|
|
48
44
|
|
|
49
|
-
|
|
|
45
|
+
| 插件 | 你可以用它做什么 |
|
|
50
46
|
| --- | --- |
|
|
51
|
-
| [
|
|
52
|
-
| [
|
|
53
|
-
| [
|
|
54
|
-
|
|
|
47
|
+
| [Codex UI](https://github.com/MichengAI/dsh-codex-ui) | 整理项目与会话、搜索任务、跳转对话轮次 |
|
|
48
|
+
| [IM Connect](https://github.com/MichengAI/dsh-im-connect) | 从微信、飞书、钉钉等消息平台下任务、收回复 |
|
|
49
|
+
| [Automation](https://github.com/MichengAI/dsh-automation) | 按计划执行任务,查看每次运行的结果 |
|
|
50
|
+
| [Skills Manager](https://github.com/MichengAI/dsh-skills-manager) | 统一查找、启停、创建和导入本机技能 |
|
|
51
|
+
| [Archive Manager](https://github.com/MichengAI/dsh-archive-manager) | 搜索、恢复或清理已归档会话 |
|
|
52
|
+
| [Agency Agents](https://github.com/MichengAI/dsh-agency-agents) | 按任务选择并召唤专业角色 |
|
|
53
|
+
| [BTW](https://github.com/MichengAI/dsh-btw) | 在当前上下文中临时旁问,不打断主任务 |
|
|
54
|
+
| [Simplify](https://github.com/MichengAI/dsh-simplify) | 用 /simplify 整理 Git 改动范围内的代码 |
|
|
55
55
|
|
|
56
56
|
## 前置条件
|
|
57
57
|
|
|
58
|
+
- 从插件 `0.1.33` 起支持 DeepSeek Harness `0.1.3-alpha.2`(官方 master `c389f96`),同时兼容下表中已验证的旧版宿主。后续 master 提交需另行验证。
|
|
59
|
+
|
|
58
60
|
- 已可正常运行 DeepSeek Harness Web,且可在 PowerShell 中使用 `dsh`。
|
|
59
61
|
- 以下示例使用 `web` profile;请替换为实际目标 profile。
|
|
60
62
|
- 从源码安装或二次开发需要 Node.js 22+ 与 pnpm;仅从 npm 安装无需另外执行 `pnpm install`。
|
|
61
63
|
|
|
62
64
|
## 安装
|
|
63
65
|
|
|
64
|
-
|
|
66
|
+
源码回归使用 `pnpm test:compat`,在隔离依赖环境中运行同一份插件产物,已验证以下组合(不代表覆盖所有中间版本):
|
|
65
67
|
|
|
66
|
-
|
|
68
|
+
- `pnpm test`:构建并执行本地常规测试,不包含 `test/fixtures`;实际依赖可能受本机宿主链接影响。
|
|
69
|
+
- `pnpm test:matrix`:先构建,再隔离安装三个宿主版本,执行完整矩阵。
|
|
70
|
+
- `pnpm test:latest`:先构建,再隔离运行最新版的 6 项真实存储回归。
|
|
71
|
+
- `pnpm test:compat`:旧缓存迁移验证加完整矩阵。
|
|
67
72
|
|
|
68
|
-
|
|
73
|
+
不要直接执行 `test/fixtures/*.mjs`;夹具会在加载宿主前检查隔离入口、依赖版本及实际路径。若本机依赖脱节,可先执行 `pnpm install --frozen-lockfile` 恢复声明的开发依赖;它不保证清理未声明包或 `test/node_modules` 的宿主链接,兼容性验收以隔离命令为准。
|
|
69
74
|
|
|
70
|
-
|
|
75
|
+
| DSH | Cordis | 自动回归 |
|
|
76
|
+
| --- | --- | --- |
|
|
77
|
+
| `0.1.1-rc.2` | `4.0.1` | 134 项通过,另含旧缓存迁移验证 |
|
|
78
|
+
| `0.1.2-rc.1` | `4.0.2` | 134 项通过 |
|
|
79
|
+
| `0.1.3-alpha.2` | `4.0.2` | 137 项通过 |
|
|
71
80
|
|
|
72
|
-
|
|
73
|
-
请把 DSH 插件 @michengai/dsh-archive-manager 最新版装进本机 web profile,使用官方 npm 源执行:dsh plugin --profile web add @michengai/dsh-archive-manager@latest --registry=https://registry.npmjs.org/。装完执行 dsh --profile web --dump-config,确认已挂载 archive-manager,并提醒我重启 DSH Web 后硬刷新浏览器。
|
|
74
|
-
```
|
|
81
|
+
覆盖客户端 Remote、归档/恢复、真实 JSONL/Zstandard 删除与子会话级联、删除后重新查询及重新打开存储。验证环境为 Windows / Node.js 24;尚未执行完整 DSH Web 浏览器人工验收。新版存储夹具仅隔离上游无法在 Windows 加载的 POSIX `fs-ext` 导入,实际文件操作与 Windows 原生锁仍使用官方实现。
|
|
75
82
|
|
|
76
|
-
|
|
83
|
+
以下安装命令使用官方 npm 源。
|
|
77
84
|
|
|
78
|
-
|
|
79
|
-
请从源码安装 DSH 插件 https://github.com/MichengAI/dsh-archive-manager:克隆到本机后执行 pnpm install --frozen-lockfile 和 pnpm build,再用 dsh plugin --profile web add . 把当前目录装进 web profile。不要只复制 lib。装完执行 dsh --profile web --dump-config,确认已挂载 archive-manager,并提醒我重启 DSH Web 后硬刷新浏览器。
|
|
80
|
-
```
|
|
85
|
+
### 让 Agent 帮你安装(推荐)
|
|
81
86
|
|
|
82
|
-
|
|
83
|
-
| --- | --- |
|
|
84
|
-
| DSH | 把上面其中一句发给当前会话。 |
|
|
85
|
-
| Codex | 把上面其中一句发给 Codex,让它在本机执行安装。 |
|
|
86
|
-
| WorkBuddy | 把上面其中一句发给 WorkBuddy;源码安装也可同时粘贴仓库地址 `https://github.com/MichengAI/dsh-archive-manager`。 |
|
|
87
|
+
把下面这段话发给任意能够执行本机终端命令的 Agent。将 `web` 替换为实际使用的 profile;安装完成后,在 DSH 中使用本插件。
|
|
87
88
|
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
也可以自己执行同一条 npm 命令:
|
|
91
|
-
|
|
92
|
-
```powershell
|
|
93
|
-
dsh plugin --profile web add @michengai/dsh-archive-manager@latest --registry=https://registry.npmjs.org/
|
|
89
|
+
```text
|
|
90
|
+
请将 DSH 插件 @michengai/dsh-archive-manager 安装到本机 web profile,执行:dsh plugin --profile web add @michengai/dsh-archive-manager@latest --registry=https://registry.npmjs.org/。安装后执行 dsh --profile web --dump-config,确认配置包含 workspace-archive-manager, ui-workspace-archive-manager,并告诉我如何重新加载 DSH 和开始使用。
|
|
94
91
|
```
|
|
95
92
|
|
|
96
|
-
未把 `dsh` 装进 PATH 时,把开头的 `dsh` 换成 `npx --yes @deepseek-ai/dsh`。
|
|
97
|
-
|
|
98
93
|
### 从官方 npm 安装最新版
|
|
99
94
|
|
|
100
95
|
在任意 PowerShell 目录执行:
|
|
@@ -110,24 +105,6 @@ dsh --profile web --dump-config
|
|
|
110
105
|
|
|
111
106
|
配置输出中应包含 `workspace-archive-manager` 与 `ui-workspace-archive-manager`。安装后重启 DSH Web 并在浏览器硬刷新;请勿手工复制客户端文件,否则设置页和归档菜单不会被挂载。
|
|
112
107
|
|
|
113
|
-
### 从源码安装
|
|
114
|
-
|
|
115
|
-
适用于调试或使用未发布改动。克隆后的目录会直接作为插件安装路径:
|
|
116
|
-
|
|
117
|
-
```powershell
|
|
118
|
-
[Console]::OutputEncoding = [System.Text.Encoding]::UTF8
|
|
119
|
-
$OutputEncoding = [System.Text.Encoding]::UTF8
|
|
120
|
-
Set-Location D:\Repository\deepseek-harness-plugin
|
|
121
|
-
git clone https://github.com/MichengAI/dsh-archive-manager.git
|
|
122
|
-
Set-Location .\dsh-archive-manager
|
|
123
|
-
pnpm install --frozen-lockfile
|
|
124
|
-
pnpm build
|
|
125
|
-
dsh plugin --profile web add .
|
|
126
|
-
dsh --profile web --dump-config
|
|
127
|
-
```
|
|
128
|
-
|
|
129
|
-
完成后重启 DSH Web 并硬刷新浏览器。`dsh plugin ... add .` 会读取当前目录的包信息和 `cordis.patch.yml`;不要改为直接复制 `lib` 目录。
|
|
130
|
-
|
|
131
108
|
## 在线更新
|
|
132
109
|
|
|
133
110
|
设置标题会显示当前版本和“检查更新”按钮。发现新版后,只有检测到 DSH CLI 或 Desktop 更新服务时才可使用“自动更新”;其他环境会在弹窗中提供可复制、与当前 Profile 对应的手工更新命令。
|
|
@@ -146,12 +123,33 @@ dsh --profile web --dump-config
|
|
|
146
123
|
## 数据处理边界
|
|
147
124
|
|
|
148
125
|
- 删除操作始终需要确认。
|
|
149
|
-
-
|
|
126
|
+
- 删除会移除工作区记录、归档标记和投影缓存。官方 JSONL 后端在目录布局校验通过后,会一并删除会话专属目录及其中的附件等内容;其他后端或未知布局仅删除定位到的转录工件,不删除其父目录。
|
|
127
|
+
- 不清理项目分组目录或存储根目录。官方布局的项目/会话目录若为符号链接或 Windows junction,会拒绝删除并保留可重试状态。
|
|
128
|
+
- 布局校验优先使用官方后端初始化时确定的绝对根路径,相对路径配置不再受宿主工作目录变化影响;若无法取得该字段,则只接受绝对路径配置。官方 JSONL 布局校验失败时,会记录包含会话 ID 和工件路径的警告,再降级为仅删除工件。
|
|
129
|
+
- 目录校验不是跨进程文件锁:删除期间不要由其他进程迁移、替换存储目录或改写目录链接。插件不将可被不可信进程改写的存储路径视为安全隔离边界。
|
|
150
130
|
- 正在写入的会话会在完成写入后清理,避免截断数据。
|
|
151
131
|
- 本插件替换 DSH 默认的工作区和会话投影服务;请仅通过 DSH profile 安装,避免手工拼接补丁配置。
|
|
152
132
|
|
|
153
133
|
## 二次开发
|
|
154
134
|
|
|
135
|
+
### 从源码安装
|
|
136
|
+
|
|
137
|
+
适用于调试或使用未发布改动。克隆后的目录会直接作为插件安装路径:
|
|
138
|
+
|
|
139
|
+
```powershell
|
|
140
|
+
[Console]::OutputEncoding = [System.Text.Encoding]::UTF8
|
|
141
|
+
$OutputEncoding = [System.Text.Encoding]::UTF8
|
|
142
|
+
Set-Location D:\Repository\deepseek-harness-plugin
|
|
143
|
+
git clone https://github.com/MichengAI/dsh-archive-manager.git
|
|
144
|
+
Set-Location .\dsh-archive-manager
|
|
145
|
+
pnpm install --frozen-lockfile
|
|
146
|
+
pnpm build
|
|
147
|
+
dsh plugin --profile web add .
|
|
148
|
+
dsh --profile web --dump-config
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
完成后重启 DSH Web 并硬刷新浏览器。`dsh plugin ... add .` 会读取当前目录的包信息和 `cordis.patch.yml`;不要改为直接复制 `lib` 目录。
|
|
152
|
+
|
|
155
153
|
`src` 是唯一可维护源码目录,`pnpm build` 使用 esbuild 将其编译为可发布的 `lib`。请勿直接修改 `lib`,否则下次构建会覆盖改动:
|
|
156
154
|
|
|
157
155
|
- [src\index.js](src/index.js):客户端插件 Host 服务入口。
|
|
@@ -185,7 +183,3 @@ pnpm verify
|
|
|
185
183
|
## 许可证
|
|
186
184
|
|
|
187
185
|
本项目采用 [Apache License 2.0](LICENSE)。
|
|
188
|
-
|
|
189
|
-
## 更新日志
|
|
190
|
-
|
|
191
|
-
完整保留的发布说明见 [CHANGELOG.zh-CN.md](CHANGELOG.zh-CN.md)。
|
package/lib/workspace.js
CHANGED
|
@@ -1,10 +1,29 @@
|
|
|
1
|
-
import { rm } from "node:fs/promises";
|
|
1
|
+
import { lstat, rm } from "node:fs/promises";
|
|
2
|
+
import { basename, dirname, isAbsolute, join, resolve } from "node:path";
|
|
2
3
|
import {
|
|
3
4
|
WorkspaceRegistry
|
|
4
5
|
} from "@deepseek-ai/dsh-workspace";
|
|
5
6
|
import { bindTypertRemote, Remote } from "@deepseek-ai/dsh-typert-protocol";
|
|
6
7
|
import { sessionDir } from "@deepseek-ai/dsh-spill-local";
|
|
7
8
|
import { trackTombstone } from "./tombstone.js";
|
|
9
|
+
function jsonlSessionDirectory(persistence, header, location) {
|
|
10
|
+
if (persistence.name !== "session-persistence-jsonl" || location.kind !== "jsonl") return;
|
|
11
|
+
const root = persistence.root ?? persistence.config?.root;
|
|
12
|
+
if (typeof root !== "string" || !isAbsolute(root) || !isAbsolute(location.path)) return;
|
|
13
|
+
if (!/^session(?:\.v[1-9][0-9]*)?\.jsonl(?:\.zstd)?$/.test(basename(location.path))) return;
|
|
14
|
+
if (typeof header.id !== "string" || header.id.length === 0) return;
|
|
15
|
+
const encode = (text) => text.replace(/[^A-Za-z0-9._-]/g, (ch) => `~${ch.charCodeAt(0).toString(16).toUpperCase().padStart(4, "0")}`);
|
|
16
|
+
const segment = header.id === "." ? "~002E" : header.id === ".." ? "~002E~002E" : encode(header.id);
|
|
17
|
+
let project = "_no-cwd";
|
|
18
|
+
if (header.cwd !== void 0) {
|
|
19
|
+
if (typeof header.cwd !== "string" || header.cwd.length === 0) return;
|
|
20
|
+
const readable = encode(header.cwd.replace(/[\\/:]+/g, "-")).replace(/^-+/, "") || "root";
|
|
21
|
+
project = `--${readable.slice(0, 251)}--`;
|
|
22
|
+
}
|
|
23
|
+
const directory = join(resolve(root), project, segment);
|
|
24
|
+
if (location.path !== join(directory, basename(location.path))) return;
|
|
25
|
+
return directory;
|
|
26
|
+
}
|
|
8
27
|
function markRemoteMethod(instance, method) {
|
|
9
28
|
const context = {
|
|
10
29
|
private: false,
|
|
@@ -281,10 +300,10 @@ var ArchiveWorkspaceRegistry = class extends WorkspaceRegistry {
|
|
|
281
300
|
const persistence = this.ctx.get("sessionPersistence");
|
|
282
301
|
const projections = this.ctx.get("sessionProjections");
|
|
283
302
|
if (cache === void 0 || typeof cache.cachedSnapshot !== "function" || typeof cache.put !== "function") return false;
|
|
284
|
-
if (persistence === void 0 || typeof persistence.readFrom !== "function" || projections === void 0 || typeof projections.restore !== "function") return false;
|
|
303
|
+
if (persistence === void 0 || typeof persistence.readFrom !== "function" && typeof persistence.open !== "function" || projections === void 0 || typeof projections.restore !== "function") return false;
|
|
285
304
|
try {
|
|
286
305
|
if (!header.isSeeded && cache.cachedSnapshot(header, 0) !== void 0) return false;
|
|
287
|
-
const stored = await
|
|
306
|
+
const stored = await this.readStoredProjectionSource(persistence, header.id);
|
|
288
307
|
const meta = stored.meta ?? header;
|
|
289
308
|
if (meta.isSeeded === true && stored.inheritedEventCount === void 0) {
|
|
290
309
|
this.ctx.logger.warn(`archive-manager: projection repair for seeded archived session "${header.id}" skipped because its inherited event count is unavailable`);
|
|
@@ -310,6 +329,17 @@ var ArchiveWorkspaceRegistry = class extends WorkspaceRegistry {
|
|
|
310
329
|
return false;
|
|
311
330
|
}
|
|
312
331
|
}
|
|
332
|
+
/** 新版读句柄必须关闭;旧版仍沿用 readFrom,避免激活 Agent 或写入会话日志。 */
|
|
333
|
+
async readStoredProjectionSource(persistence, sessionId) {
|
|
334
|
+
if (typeof persistence.readFrom === "function") return persistence.readFrom(sessionId, 0);
|
|
335
|
+
const handle = await persistence.open(sessionId, "read");
|
|
336
|
+
try {
|
|
337
|
+
const { events } = await handle.read(0);
|
|
338
|
+
return { meta: handle.header, inheritedEventCount: handle.inheritedEventCount, events };
|
|
339
|
+
} finally {
|
|
340
|
+
await handle.close();
|
|
341
|
+
}
|
|
342
|
+
}
|
|
313
343
|
/**
|
|
314
344
|
* 把一个会话移出注册表全局归档集合,恢复其正常可见性(其记账位从未
|
|
315
345
|
* 移动,会话在原工作区位置重新出现)。幂等:未归档的已知会话直接返回
|
|
@@ -497,8 +527,17 @@ var ArchiveWorkspaceRegistry = class extends WorkspaceRegistry {
|
|
|
497
527
|
await this.removeFromWorkspaceAccounts(sessionId);
|
|
498
528
|
this.forgetIndexedSession(sessionId);
|
|
499
529
|
if (deletedHeader !== void 0) this.deletedIdentities.set(sessionId, headerIdentity(deletedHeader));
|
|
530
|
+
this.publishDeletedSession(sessionId);
|
|
500
531
|
return { deleted: true };
|
|
501
532
|
}
|
|
533
|
+
/** 删除完成后通知全部客户端;新版不再通过伪造冷会话生命周期触发通知。 */
|
|
534
|
+
publishDeletedSession(sessionId) {
|
|
535
|
+
try {
|
|
536
|
+
this.ctx.emit("api-session/removed", sessionId);
|
|
537
|
+
} catch (error) {
|
|
538
|
+
this.ctx.logger.warn(`archive-manager: session "${sessionId}" deleted but removal notification failed: ${String(error)}`);
|
|
539
|
+
}
|
|
540
|
+
}
|
|
502
541
|
/**
|
|
503
542
|
* 从父类内存索引中遗忘已删除会话,并阻止后续 indexHeaders 把它加回。
|
|
504
543
|
* 实时会话以同 id 重新出现时(自定义 id 复用)会撤掉墓碑。
|
|
@@ -540,7 +579,7 @@ var ArchiveWorkspaceRegistry = class extends WorkspaceRegistry {
|
|
|
540
579
|
if (persistence === void 0 || typeof persistence.list !== "function") return false;
|
|
541
580
|
let header;
|
|
542
581
|
try {
|
|
543
|
-
header = (await
|
|
582
|
+
header = (await this.listStoredHeaders()).find((item) => item.id === id);
|
|
544
583
|
} catch (error) {
|
|
545
584
|
this.ctx.logger.warn(`archive-manager: cold-reuse probe for "${id}" failed: ${String(error)}`);
|
|
546
585
|
return false;
|
|
@@ -560,6 +599,13 @@ var ArchiveWorkspaceRegistry = class extends WorkspaceRegistry {
|
|
|
560
599
|
if (this.deletedSessionIds.has(header.id)) return;
|
|
561
600
|
return super.indexHeader(header);
|
|
562
601
|
}
|
|
602
|
+
/** 统一旧版头部数组与 0.1.3 的持久化快照,供父类索引和本插件枚举共用。 */
|
|
603
|
+
async listStoredHeaders() {
|
|
604
|
+
return (await this.ctx.sessionPersistence.list()).map((item) => item.header ?? item);
|
|
605
|
+
}
|
|
606
|
+
async indexHeaders(items) {
|
|
607
|
+
for (const item of items) await this.indexHeader(item.header ?? item);
|
|
608
|
+
}
|
|
563
609
|
/** 为未处于实时状态的持久化会话发布相同的移除事件。 */
|
|
564
610
|
async publishColdSessionRemoval(sessionId, sessions) {
|
|
565
611
|
const persistence = this.ctx.get("sessionPersistence");
|
|
@@ -577,7 +623,7 @@ var ArchiveWorkspaceRegistry = class extends WorkspaceRegistry {
|
|
|
577
623
|
this.ctx.logger.warn(`archive-manager: could not publish removal for stored session "${sessionId}": ${String(error)}`);
|
|
578
624
|
}
|
|
579
625
|
}
|
|
580
|
-
/**
|
|
626
|
+
/** 官方 JSONL 已知布局清理会话专属目录;其他后端只删除定位到的工件。 */
|
|
581
627
|
async removeTranscriptDirectory(sessionId) {
|
|
582
628
|
const persistence = this.ctx.get("sessionPersistence");
|
|
583
629
|
if (persistence === void 0 || typeof persistence.locate !== "function") {
|
|
@@ -588,10 +634,31 @@ var ArchiveWorkspaceRegistry = class extends WorkspaceRegistry {
|
|
|
588
634
|
if (location === void 0 || typeof location.path !== "string") {
|
|
589
635
|
throw new Error(`cannot delete session "${sessionId}": the session persistence backend could not resolve its transcript artifact`);
|
|
590
636
|
}
|
|
637
|
+
let target = { path: location.path, kind: "transcript artifact" };
|
|
591
638
|
try {
|
|
592
|
-
|
|
639
|
+
const directory = jsonlSessionDirectory(persistence, header, location);
|
|
640
|
+
if (directory !== void 0) {
|
|
641
|
+
target = { path: directory, kind: "session directory" };
|
|
642
|
+
for (const path of [dirname(directory), directory]) {
|
|
643
|
+
let stat;
|
|
644
|
+
try {
|
|
645
|
+
stat = await lstat(path);
|
|
646
|
+
} catch (error) {
|
|
647
|
+
if (error?.code === "ENOENT") continue;
|
|
648
|
+
throw error;
|
|
649
|
+
}
|
|
650
|
+
if (stat.isSymbolicLink()) throw new Error(`refusing to delete through symbolic link "${path}"`);
|
|
651
|
+
if (!stat.isDirectory()) throw new Error(`expected session storage directory "${path}"`);
|
|
652
|
+
}
|
|
653
|
+
} else if (persistence.name === "session-persistence-jsonl") {
|
|
654
|
+
this.ctx.logger.warn(`archive-manager: session "${sessionId}": JSONL directory ownership could not be verified; falling back to artifact-only deletion at "${location.path}" (parent directory retained)`);
|
|
655
|
+
}
|
|
656
|
+
await rm(target.path, { recursive: true, force: true });
|
|
657
|
+
if (typeof persistence.stat === "function" && await persistence.stat(sessionId) !== void 0) {
|
|
658
|
+
throw new Error(`session "${sessionId}" is still present in persistence after artifact removal`);
|
|
659
|
+
}
|
|
593
660
|
} catch (error) {
|
|
594
|
-
const message = `cannot delete session "${sessionId}":
|
|
661
|
+
const message = `cannot delete session "${sessionId}": cleanup of ${target.kind} "${target.path}" failed; bookkeeping retained for retry`;
|
|
595
662
|
const detail = `${message}: ${String(error)}`;
|
|
596
663
|
this.ctx.logger.warn(`archive-manager: ${detail}`);
|
|
597
664
|
throw new Error(detail, { cause: error });
|
|
@@ -623,7 +690,7 @@ var ArchiveWorkspaceRegistry = class extends WorkspaceRegistry {
|
|
|
623
690
|
if (sessions !== void 0) for (const session of sessions.list()) {
|
|
624
691
|
if (session.header.parentSession === sessionId && session.header.origin === "subagent") descendants.push(session.id);
|
|
625
692
|
}
|
|
626
|
-
for (const header of await this.
|
|
693
|
+
for (const header of await this.listStoredHeaders()) {
|
|
627
694
|
if (header.parentSession === sessionId && header.origin === "subagent" && !descendants.includes(header.id)) descendants.push(header.id);
|
|
628
695
|
}
|
|
629
696
|
for (const childId of descendants) {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@michengai/dsh-archive-manager",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.33",
|
|
4
4
|
"description": "NPM-installable DSH Web plugin for managing archived sessions.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"packageManager": "pnpm@11.22.0",
|
|
@@ -28,29 +28,31 @@
|
|
|
28
28
|
"scripts": {
|
|
29
29
|
"build": "node scripts/build.mjs && node scripts/check-package.mjs",
|
|
30
30
|
"test": "pnpm build && node --test test/*.test.mjs",
|
|
31
|
-
"test:
|
|
31
|
+
"test:matrix": "pnpm build && node scripts/test-version-matrix.mjs",
|
|
32
|
+
"test:latest": "pnpm build && node scripts/test-latest-compatibility.mjs",
|
|
33
|
+
"test:compat": "node scripts/test-legacy-compatibility.mjs && pnpm test:matrix",
|
|
32
34
|
"pack:check": "pnpm pack --dry-run",
|
|
33
35
|
"verify": "pnpm test && pnpm test:compat && pnpm pack:check && node scripts/check-generated.mjs",
|
|
34
36
|
"prepublishOnly": "pnpm verify"
|
|
35
37
|
},
|
|
36
38
|
"peerDependencies": {
|
|
37
39
|
"@deepseek-ai/cordis": "^4.0.1",
|
|
38
|
-
"@deepseek-ai/dsh-client-connection": ">=0.1.0-rc.5 <0.2.0",
|
|
39
|
-
"@deepseek-ai/dsh-client-locale": ">=0.1.0-rc.5 <0.2.0",
|
|
40
|
-
"@deepseek-ai/dsh-client-runtime": ">=0.1.0-rc.5 <0.2.0",
|
|
41
|
-
"@deepseek-ai/dsh-client-store": ">=0.1.0-rc.5 <0.2.0",
|
|
42
|
-
"@deepseek-ai/dsh-client-ui-conversation": ">=0.1.0-rc.5 <0.2.0",
|
|
43
|
-
"@deepseek-ai/dsh-client-ui-primitives": ">=0.1.0-rc.5 <0.2.0",
|
|
44
|
-
"@deepseek-ai/dsh-client-ui-sidebar": ">=0.1.0-rc.5 <0.2.0",
|
|
45
|
-
"@deepseek-ai/dsh-client-ui-workspace": ">=0.1.0-rc.5 <0.2.0",
|
|
46
|
-
"@deepseek-ai/dsh-host-webserver": ">=0.1.0-rc.5 <0.2.0",
|
|
47
|
-
"@deepseek-ai/dsh-session": ">=0.1.0-rc.5 <0.2.0",
|
|
48
|
-
"@deepseek-ai/dsh-session-projection-cache": ">=0.1.0-rc.5 <0.2.0",
|
|
49
|
-
"@deepseek-ai/dsh-spill-local": ">=0.1.0-rc.5 <0.2.0",
|
|
50
|
-
"@deepseek-ai/dsh-storage-domain": ">=0.1.0-rc.5 <0.2.0",
|
|
51
|
-
"@deepseek-ai/dsh-typert-protocol": ">=0.1.0-rc.5 <0.2.0",
|
|
52
|
-
"@deepseek-ai/dsh-typert-registry": ">=0.1.0-rc.5 <0.2.0",
|
|
53
|
-
"@deepseek-ai/dsh-workspace": ">=0.1.0-rc.5 <0.2.0"
|
|
40
|
+
"@deepseek-ai/dsh-client-connection": ">=0.1.0-rc.5 <0.2.0 || >=0.1.1-rc.2 <0.1.2 || >=0.1.2-rc.1 <0.1.3 || >=0.1.3-alpha.2 <0.1.4",
|
|
41
|
+
"@deepseek-ai/dsh-client-locale": ">=0.1.0-rc.5 <0.2.0 || >=0.1.1-rc.2 <0.1.2 || >=0.1.2-rc.1 <0.1.3 || >=0.1.3-alpha.2 <0.1.4",
|
|
42
|
+
"@deepseek-ai/dsh-client-runtime": ">=0.1.0-rc.5 <0.2.0 || >=0.1.1-rc.2 <0.1.2 || >=0.1.2-rc.1 <0.1.3 || >=0.1.3-alpha.2 <0.1.4",
|
|
43
|
+
"@deepseek-ai/dsh-client-store": ">=0.1.0-rc.5 <0.2.0 || >=0.1.1-rc.2 <0.1.2 || >=0.1.2-rc.1 <0.1.3 || >=0.1.3-alpha.2 <0.1.4",
|
|
44
|
+
"@deepseek-ai/dsh-client-ui-conversation": ">=0.1.0-rc.5 <0.2.0 || >=0.1.1-rc.2 <0.1.2 || >=0.1.2-rc.1 <0.1.3 || >=0.1.3-alpha.2 <0.1.4",
|
|
45
|
+
"@deepseek-ai/dsh-client-ui-primitives": ">=0.1.0-rc.5 <0.2.0 || >=0.1.1-rc.2 <0.1.2 || >=0.1.2-rc.1 <0.1.3 || >=0.1.3-alpha.2 <0.1.4",
|
|
46
|
+
"@deepseek-ai/dsh-client-ui-sidebar": ">=0.1.0-rc.5 <0.2.0 || >=0.1.1-rc.2 <0.1.2 || >=0.1.2-rc.1 <0.1.3 || >=0.1.3-alpha.2 <0.1.4",
|
|
47
|
+
"@deepseek-ai/dsh-client-ui-workspace": ">=0.1.0-rc.5 <0.2.0 || >=0.1.1-rc.2 <0.1.2 || >=0.1.2-rc.1 <0.1.3 || >=0.1.3-alpha.2 <0.1.4",
|
|
48
|
+
"@deepseek-ai/dsh-host-webserver": ">=0.1.0-rc.5 <0.2.0 || >=0.1.1-rc.2 <0.1.2 || >=0.1.2-rc.1 <0.1.3 || >=0.1.3-alpha.2 <0.1.4",
|
|
49
|
+
"@deepseek-ai/dsh-session": ">=0.1.0-rc.5 <0.2.0 || >=0.1.1-rc.2 <0.1.2 || >=0.1.2-rc.1 <0.1.3 || >=0.1.3-alpha.2 <0.1.4",
|
|
50
|
+
"@deepseek-ai/dsh-session-projection-cache": ">=0.1.0-rc.5 <0.2.0 || >=0.1.1-rc.2 <0.1.2 || >=0.1.2-rc.1 <0.1.3 || >=0.1.3-alpha.2 <0.1.4",
|
|
51
|
+
"@deepseek-ai/dsh-spill-local": ">=0.1.0-rc.5 <0.2.0 || >=0.1.1-rc.2 <0.1.2 || >=0.1.2-rc.1 <0.1.3 || >=0.1.3-alpha.2 <0.1.4",
|
|
52
|
+
"@deepseek-ai/dsh-storage-domain": ">=0.1.0-rc.5 <0.2.0 || >=0.1.1-rc.2 <0.1.2 || >=0.1.2-rc.1 <0.1.3 || >=0.1.3-alpha.2 <0.1.4",
|
|
53
|
+
"@deepseek-ai/dsh-typert-protocol": ">=0.1.0-rc.5 <0.2.0 || >=0.1.1-rc.2 <0.1.2 || >=0.1.2-rc.1 <0.1.3 || >=0.1.3-alpha.2 <0.1.4",
|
|
54
|
+
"@deepseek-ai/dsh-typert-registry": ">=0.1.0-rc.5 <0.2.0 || >=0.1.1-rc.2 <0.1.2 || >=0.1.2-rc.1 <0.1.3 || >=0.1.3-alpha.2 <0.1.4",
|
|
55
|
+
"@deepseek-ai/dsh-workspace": ">=0.1.0-rc.5 <0.2.0 || >=0.1.1-rc.2 <0.1.2 || >=0.1.2-rc.1 <0.1.3 || >=0.1.3-alpha.2 <0.1.4"
|
|
54
56
|
},
|
|
55
57
|
"peerDependenciesMeta": {
|
|
56
58
|
"@deepseek-ai/dsh-client-runtime": {
|
|
@@ -62,29 +64,29 @@
|
|
|
62
64
|
},
|
|
63
65
|
"devDependencies": {
|
|
64
66
|
"@deepseek-ai/cordis": "4.0.2",
|
|
65
|
-
"@deepseek-ai/dsh-api-gateway": "0.1.
|
|
66
|
-
"@deepseek-ai/dsh-client-connection": "0.1.
|
|
67
|
-
"@deepseek-ai/dsh-client-locale": "0.1.
|
|
68
|
-
"@deepseek-ai/dsh-client-store": "0.1.
|
|
69
|
-
"@deepseek-ai/dsh-client-ui-conversation": "0.1.
|
|
70
|
-
"@deepseek-ai/dsh-client-ui-primitives": "0.1.
|
|
71
|
-
"@deepseek-ai/dsh-client-ui-sidebar": "0.1.
|
|
72
|
-
"@deepseek-ai/dsh-client-ui-slots": "0.1.
|
|
73
|
-
"@deepseek-ai/dsh-client-ui-workspace": "0.1.
|
|
74
|
-
"@deepseek-ai/dsh-host-webserver": "0.1.
|
|
75
|
-
"@deepseek-ai/dsh-invariants": "0.1.
|
|
76
|
-
"@deepseek-ai/dsh-scope": "0.1.
|
|
77
|
-
"@deepseek-ai/dsh-session": "0.1.
|
|
78
|
-
"@deepseek-ai/dsh-session-persistence": "0.1.
|
|
79
|
-
"@deepseek-ai/dsh-session-projection": "0.1.
|
|
80
|
-
"@deepseek-ai/dsh-session-projection-cache": "0.1.
|
|
81
|
-
"@deepseek-ai/dsh-spill": "0.1.
|
|
82
|
-
"@deepseek-ai/dsh-spill-local": "0.1.
|
|
83
|
-
"@deepseek-ai/dsh-storage": "0.1.
|
|
84
|
-
"@deepseek-ai/dsh-storage-domain": "0.1.
|
|
85
|
-
"@deepseek-ai/dsh-typert-protocol": "0.1.
|
|
86
|
-
"@deepseek-ai/dsh-typert-registry": "0.1.
|
|
87
|
-
"@deepseek-ai/dsh-workspace": "0.1.
|
|
67
|
+
"@deepseek-ai/dsh-api-gateway": "0.1.3-alpha.2",
|
|
68
|
+
"@deepseek-ai/dsh-client-connection": "0.1.3-alpha.2",
|
|
69
|
+
"@deepseek-ai/dsh-client-locale": "0.1.3-alpha.2",
|
|
70
|
+
"@deepseek-ai/dsh-client-store": "0.1.3-alpha.2",
|
|
71
|
+
"@deepseek-ai/dsh-client-ui-conversation": "0.1.3-alpha.2",
|
|
72
|
+
"@deepseek-ai/dsh-client-ui-primitives": "0.1.3-alpha.2",
|
|
73
|
+
"@deepseek-ai/dsh-client-ui-sidebar": "0.1.3-alpha.2",
|
|
74
|
+
"@deepseek-ai/dsh-client-ui-slots": "0.1.3-alpha.2",
|
|
75
|
+
"@deepseek-ai/dsh-client-ui-workspace": "0.1.3-alpha.2",
|
|
76
|
+
"@deepseek-ai/dsh-host-webserver": "0.1.3-alpha.2",
|
|
77
|
+
"@deepseek-ai/dsh-invariants": "0.1.3-alpha.2",
|
|
78
|
+
"@deepseek-ai/dsh-scope": "0.1.3-alpha.2",
|
|
79
|
+
"@deepseek-ai/dsh-session": "0.1.3-alpha.2",
|
|
80
|
+
"@deepseek-ai/dsh-session-persistence": "0.1.3-alpha.2",
|
|
81
|
+
"@deepseek-ai/dsh-session-projection": "0.1.3-alpha.2",
|
|
82
|
+
"@deepseek-ai/dsh-session-projection-cache": "0.1.3-alpha.2",
|
|
83
|
+
"@deepseek-ai/dsh-spill": "0.1.3-alpha.2",
|
|
84
|
+
"@deepseek-ai/dsh-spill-local": "0.1.3-alpha.2",
|
|
85
|
+
"@deepseek-ai/dsh-storage": "0.1.3-alpha.2",
|
|
86
|
+
"@deepseek-ai/dsh-storage-domain": "0.1.3-alpha.2",
|
|
87
|
+
"@deepseek-ai/dsh-typert-protocol": "0.1.3-alpha.2",
|
|
88
|
+
"@deepseek-ai/dsh-typert-registry": "0.1.3-alpha.2",
|
|
89
|
+
"@deepseek-ai/dsh-workspace": "0.1.3-alpha.2",
|
|
88
90
|
"react": "18.3.1",
|
|
89
91
|
"react-dom": "18.3.1",
|
|
90
92
|
"esbuild": "0.25.0"
|